Merge vk-gl-cts/vulkan-cts-1.1.5 into vk-gl-cts/vulkan-cts-1.2.0
Change-Id: Iab64c9ee8090eadf98c8383996d53ff8c9f488f1
diff --git a/AndroidGen.mk b/AndroidGen.mk
index a271204..24f4769 100644
--- a/AndroidGen.mk
+++ b/AndroidGen.mk
@@ -36,6 +36,7 @@
external/vulkancts/framework/vulkan/vkDebugReportUtil.cpp \
external/vulkancts/framework/vulkan/vkDefs.cpp \
external/vulkancts/framework/vulkan/vkDeviceFeatures.cpp \
+ external/vulkancts/framework/vulkan/vkDeviceProperties.cpp \
external/vulkancts/framework/vulkan/vkDeviceUtil.cpp \
external/vulkancts/framework/vulkan/vkImageUtil.cpp \
external/vulkancts/framework/vulkan/vkImageWithMemory.cpp \
@@ -241,6 +242,7 @@
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemWsiSwapchainTests.cpp \
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemYCbCrConversionTests.cpp \
external/vulkancts/modules/vulkan/query_pool/vktQueryPoolOcclusionTests.cpp \
+ external/vulkancts/modules/vulkan/query_pool/vktQueryPoolPerformanceTests.cpp \
external/vulkancts/modules/vulkan/query_pool/vktQueryPoolStatisticsTests.cpp \
external/vulkancts/modules/vulkan/query_pool/vktQueryPoolTests.cpp \
external/vulkancts/modules/vulkan/rasterization/vktRasterizationTests.cpp \
@@ -307,6 +309,7 @@
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.cpp \
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmConditionalBranchTests.cpp \
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmCrossStageInterfaceTests.cpp \
+ external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmFloatControlsExtensionlessTests.cpp \
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmFloatControlsTests.cpp \
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.cpp \
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmImageSamplerTests.cpp \
@@ -317,6 +320,7 @@
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmPointerParameterTests.cpp \
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmPtrAccessChainTests.cpp \
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmSignedIntCompareTests.cpp \
+ external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmSpirvVersion1p4Tests.cpp \
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmSpirvVersionTests.cpp \
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmTests.cpp \
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmTypeTests.cpp \
@@ -330,6 +334,7 @@
external/vulkancts/modules/vulkan/ssbo/vktSSBOLayoutTests.cpp \
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsArithmeticTests.cpp \
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotBroadcastTests.cpp \
+ external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotMasksTests.cpp \
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotOtherTests.cpp \
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotTests.cpp \
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBasicTests.cpp \
@@ -393,6 +398,7 @@
external/vulkancts/modules/vulkan/ubo/vktUniformBlockTests.cpp \
external/vulkancts/modules/vulkan/util/vktDrawUtil.cpp \
external/vulkancts/modules/vulkan/util/vktExternalMemoryUtil.cpp \
+ external/vulkancts/modules/vulkan/vktCustomInstancesDevices.cpp \
external/vulkancts/modules/vulkan/vktInfoTests.cpp \
external/vulkancts/modules/vulkan/vktShaderLibrary.cpp \
external/vulkancts/modules/vulkan/vktTestCase.cpp \
diff --git a/android/cts/master/egl-master.txt b/android/cts/master/egl-master.txt
index bf6ee6b..27a04bd 100644
--- a/android/cts/master/egl-master.txt
+++ b/android/cts/master/egl-master.txt
@@ -2489,6 +2489,7 @@
dEQP-EGL.functional.get_proc_address.extension.gl_qcom_extended_get
dEQP-EGL.functional.get_proc_address.extension.gl_qcom_extended_get2
dEQP-EGL.functional.get_proc_address.extension.gl_qcom_tiled_rendering
+dEQP-EGL.functional.get_proc_address.extension.gl_amd_framebuffer_multisample_advanced
dEQP-EGL.functional.get_proc_address.extension.gl_amd_performance_monitor
dEQP-EGL.functional.get_proc_address.extension.gl_angle_framebuffer_blit
dEQP-EGL.functional.get_proc_address.extension.gl_angle_framebuffer_multisample
@@ -2559,11 +2560,15 @@
dEQP-EGL.functional.get_proc_address.extension.gl_nv_gpu_shader5
dEQP-EGL.functional.get_proc_address.extension.gl_nv_instanced_arrays
dEQP-EGL.functional.get_proc_address.extension.gl_nv_internalformat_sample_query
+dEQP-EGL.functional.get_proc_address.extension.gl_nv_memory_attachment
+dEQP-EGL.functional.get_proc_address.extension.gl_nv_mesh_shader
dEQP-EGL.functional.get_proc_address.extension.gl_nv_non_square_matrices
dEQP-EGL.functional.get_proc_address.extension.gl_nv_path_rendering
dEQP-EGL.functional.get_proc_address.extension.gl_nv_polygon_mode
dEQP-EGL.functional.get_proc_address.extension.gl_nv_read_buffer
dEQP-EGL.functional.get_proc_address.extension.gl_nv_sample_locations
+dEQP-EGL.functional.get_proc_address.extension.gl_nv_scissor_exclusive
+dEQP-EGL.functional.get_proc_address.extension.gl_nv_shading_rate_image
dEQP-EGL.functional.get_proc_address.extension.gl_nv_viewport_array
dEQP-EGL.functional.get_proc_address.extension.gl_nv_viewport_swizzle
dEQP-EGL.functional.get_proc_address.extension.gl_oes_copy_image
diff --git a/android/cts/master/vk-master.txt b/android/cts/master/vk-master.txt
index 2b2de69..d5080cb 100644
--- a/android/cts/master/vk-master.txt
+++ b/android/cts/master/vk-master.txt
Binary files differ
diff --git a/external/amber/CMakeLists.txt b/external/amber/CMakeLists.txt
index 866bc5a..74930f4 100644
--- a/external/amber/CMakeLists.txt
+++ b/external/amber/CMakeLists.txt
@@ -1,5 +1,6 @@
# cmake file for amber
+set(AMBER_ENABLE_SHARED_CRT TRUE)
set(AMBER_SKIP_TESTS TRUE)
set(AMBER_SKIP_SPIRV_TOOLS TRUE)
set(AMBER_SKIP_SHADERC TRUE)
diff --git a/external/fetch_kc_cts.py b/external/fetch_kc_cts.py
index 0dccc71..8f8b3fc 100644
--- a/external/fetch_kc_cts.py
+++ b/external/fetch_kc_cts.py
@@ -32,7 +32,7 @@
from build.common import *
EXTERNAL_DIR = os.path.realpath(os.path.normpath(os.path.dirname(__file__)))
-SHA1 = "fbac64a4b2acdd4c41e47efa0b7db9a023ee108e"
+SHA1 = "0f89d064412a69e9d39be6c2d5ec83ed27ee99a9"
PACKAGES = [
GitRepo(
diff --git a/external/fetch_sources.py b/external/fetch_sources.py
index e40e096..441156c 100644
--- a/external/fetch_sources.py
+++ b/external/fetch_sources.py
@@ -238,7 +238,7 @@
def detectProtocol(self, cmdProtocol = None):
# reuse parent repo protocol
- proc = subprocess.Popen(['git', 'ls-remote', '--get-url', 'origin'], stdout=subprocess.PIPE)
+ proc = subprocess.Popen(['git', 'ls-remote', '--get-url', 'origin'], stdout=subprocess.PIPE, universal_newlines=True)
(stdout, stderr) = proc.communicate()
if proc.returncode != 0:
@@ -316,18 +316,18 @@
GitRepo(
"https://github.com/KhronosGroup/SPIRV-Tools.git",
None,
- "2c0111e6eba779cf30e8c7f5a733ea0762895ba0",
+ "34be23373b9e73694c3b214ba857283bad65aedb",
"spirv-tools"),
GitRepo(
"https://github.com/KhronosGroup/glslang.git",
None,
- "1ff0c181bb37b06371e2ffa2810d473c5e01c9b7",
+ "b5f003d7a3ece37db45578a8a3140b370036fc64",
"glslang",
removeTags = ["master-tot"]),
GitRepo(
"https://github.com/KhronosGroup/SPIRV-Headers.git",
None,
- "842ec90674627ed2ffef609e3cd79d1562eded01",
+ "f8bf11a0253a32375c32cad92c841237b96696c0",
"spirv-headers"),
GitRepo(
"https://github.com/google/amber.git",
diff --git a/external/glslang/CMakeLists.txt b/external/glslang/CMakeLists.txt
index 8f86d5c..8066b61 100644
--- a/external/glslang/CMakeLists.txt
+++ b/external/glslang/CMakeLists.txt
@@ -19,7 +19,7 @@
endif ()
if (EXISTS ${GLSLANG_ABS_PATH}/glslang/GenericCodeGen/CodeGen.cpp)
- message(STATUS "glslang found; building with DEQP_HAVE_GLSLANG")
+ message(STATUS "glslang found")
# Disable glslang install as part of cmake install.
set(SKIP_GLSLANG_INSTALL OFF CACHE BOOL "" FORCE)
@@ -37,11 +37,6 @@
set(GLSLANG_INCLUDE_PATH ${GLSLANG_ABS_PATH} PARENT_SCOPE)
set(GLSLANG_LIBRARIES glslang SPIRV SPVRemapper PARENT_SCOPE)
- set(DEQP_HAVE_GLSLANG ON PARENT_SCOPE)
-
else ()
- message(STATUS "glslang not found; GLSL to SPIR-V compilation not available")
-
- set(DEQP_HAVE_GLSLANG OFF PARENT_SCOPE)
-
+ message(FATAL_ERROR "glslang not found")
endif ()
diff --git a/external/openglcts/README.md b/external/openglcts/README.md
index f9994db..b5fb689 100644
--- a/external/openglcts/README.md
+++ b/external/openglcts/README.md
@@ -642,6 +642,10 @@
Run tests that exhaust memory on purpose
default: 'disable'
+ --deqp-case-fraction=<value>,<value>
+ Run a fraction of the test cases (e.g. N,M means run group%M==N)
+ default: ''
+
--deqp-egl-config-id=<value>
Legacy name for --deqp-gl-config-id
default: '-1'
diff --git a/external/openglcts/data/mustpass/egl/aosp_mustpass/3.2.5.x/egl-master.txt b/external/openglcts/data/mustpass/egl/aosp_mustpass/3.2.5.x/egl-master.txt
index 743d5b2..837891c 100644
--- a/external/openglcts/data/mustpass/egl/aosp_mustpass/3.2.5.x/egl-master.txt
+++ b/external/openglcts/data/mustpass/egl/aosp_mustpass/3.2.5.x/egl-master.txt
@@ -2490,6 +2490,7 @@
dEQP-EGL.functional.get_proc_address.extension.gl_qcom_extended_get
dEQP-EGL.functional.get_proc_address.extension.gl_qcom_extended_get2
dEQP-EGL.functional.get_proc_address.extension.gl_qcom_tiled_rendering
+dEQP-EGL.functional.get_proc_address.extension.gl_amd_framebuffer_multisample_advanced
dEQP-EGL.functional.get_proc_address.extension.gl_amd_performance_monitor
dEQP-EGL.functional.get_proc_address.extension.gl_angle_framebuffer_blit
dEQP-EGL.functional.get_proc_address.extension.gl_angle_framebuffer_multisample
@@ -2560,11 +2561,15 @@
dEQP-EGL.functional.get_proc_address.extension.gl_nv_gpu_shader5
dEQP-EGL.functional.get_proc_address.extension.gl_nv_instanced_arrays
dEQP-EGL.functional.get_proc_address.extension.gl_nv_internalformat_sample_query
+dEQP-EGL.functional.get_proc_address.extension.gl_nv_memory_attachment
+dEQP-EGL.functional.get_proc_address.extension.gl_nv_mesh_shader
dEQP-EGL.functional.get_proc_address.extension.gl_nv_non_square_matrices
dEQP-EGL.functional.get_proc_address.extension.gl_nv_path_rendering
dEQP-EGL.functional.get_proc_address.extension.gl_nv_polygon_mode
dEQP-EGL.functional.get_proc_address.extension.gl_nv_read_buffer
dEQP-EGL.functional.get_proc_address.extension.gl_nv_sample_locations
+dEQP-EGL.functional.get_proc_address.extension.gl_nv_scissor_exclusive
+dEQP-EGL.functional.get_proc_address.extension.gl_nv_shading_rate_image
dEQP-EGL.functional.get_proc_address.extension.gl_nv_viewport_array
dEQP-EGL.functional.get_proc_address.extension.gl_nv_viewport_swizzle
dEQP-EGL.functional.get_proc_address.extension.gl_oes_copy_image
diff --git a/external/openglcts/data/mustpass/egl/aosp_mustpass/master/egl-master.txt b/external/openglcts/data/mustpass/egl/aosp_mustpass/master/egl-master.txt
index 608425c..6d0c0a1 100644
--- a/external/openglcts/data/mustpass/egl/aosp_mustpass/master/egl-master.txt
+++ b/external/openglcts/data/mustpass/egl/aosp_mustpass/master/egl-master.txt
@@ -2490,6 +2490,7 @@
dEQP-EGL.functional.get_proc_address.extension.gl_qcom_extended_get
dEQP-EGL.functional.get_proc_address.extension.gl_qcom_extended_get2
dEQP-EGL.functional.get_proc_address.extension.gl_qcom_tiled_rendering
+dEQP-EGL.functional.get_proc_address.extension.gl_amd_framebuffer_multisample_advanced
dEQP-EGL.functional.get_proc_address.extension.gl_amd_performance_monitor
dEQP-EGL.functional.get_proc_address.extension.gl_angle_framebuffer_blit
dEQP-EGL.functional.get_proc_address.extension.gl_angle_framebuffer_multisample
@@ -2560,11 +2561,15 @@
dEQP-EGL.functional.get_proc_address.extension.gl_nv_gpu_shader5
dEQP-EGL.functional.get_proc_address.extension.gl_nv_instanced_arrays
dEQP-EGL.functional.get_proc_address.extension.gl_nv_internalformat_sample_query
+dEQP-EGL.functional.get_proc_address.extension.gl_nv_memory_attachment
+dEQP-EGL.functional.get_proc_address.extension.gl_nv_mesh_shader
dEQP-EGL.functional.get_proc_address.extension.gl_nv_non_square_matrices
dEQP-EGL.functional.get_proc_address.extension.gl_nv_path_rendering
dEQP-EGL.functional.get_proc_address.extension.gl_nv_polygon_mode
dEQP-EGL.functional.get_proc_address.extension.gl_nv_read_buffer
dEQP-EGL.functional.get_proc_address.extension.gl_nv_sample_locations
+dEQP-EGL.functional.get_proc_address.extension.gl_nv_scissor_exclusive
+dEQP-EGL.functional.get_proc_address.extension.gl_nv_shading_rate_image
dEQP-EGL.functional.get_proc_address.extension.gl_nv_viewport_array
dEQP-EGL.functional.get_proc_address.extension.gl_nv_viewport_swizzle
dEQP-EGL.functional.get_proc_address.extension.gl_oes_copy_image
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass_single/4.6.1.x/gl45-khr-single.txt b/external/openglcts/data/mustpass/gl/khronos_mustpass_single/4.6.1.x/gl45-khr-single.txt
new file mode 100644
index 0000000..4b944c3
--- /dev/null
+++ b/external/openglcts/data/mustpass/gl/khronos_mustpass_single/4.6.1.x/gl45-khr-single.txt
@@ -0,0 +1,6053 @@
+KHR-Single-GL45.subgroups.builtin_var.graphics.subgroupsize
+KHR-Single-GL45.subgroups.builtin_var.graphics.subgroupinvocationid
+KHR-Single-GL45.subgroups.builtin_var.compute.subgroupsize_compute
+KHR-Single-GL45.subgroups.builtin_var.compute.subgroupinvocationid_compute
+KHR-Single-GL45.subgroups.builtin_var.compute.numsubgroups
+KHR-Single-GL45.subgroups.builtin_var.compute.subgroupid
+KHR-Single-GL45.subgroups.builtin_var.framebuffer.subgroupsize_vertex
+KHR-Single-GL45.subgroups.builtin_var.framebuffer.subgroupsize_tess_eval
+KHR-Single-GL45.subgroups.builtin_var.framebuffer.subgroupsize_tess_control
+KHR-Single-GL45.subgroups.builtin_var.framebuffer.subgroupsize_geometry
+KHR-Single-GL45.subgroups.builtin_var.framebuffer.subgroupinvocationid_vertex
+KHR-Single-GL45.subgroups.builtin_var.framebuffer.subgroupinvocationid_tess_eval
+KHR-Single-GL45.subgroups.builtin_var.framebuffer.subgroupinvocationid_tess_control
+KHR-Single-GL45.subgroups.builtin_var.framebuffer.subgroupinvocationid_geometry
+KHR-Single-GL45.subgroups.builtin_mask_var.graphics.subgroupeqmask
+KHR-Single-GL45.subgroups.builtin_mask_var.graphics.subgroupgemask
+KHR-Single-GL45.subgroups.builtin_mask_var.graphics.subgroupgtmask
+KHR-Single-GL45.subgroups.builtin_mask_var.graphics.subgrouplemask
+KHR-Single-GL45.subgroups.builtin_mask_var.graphics.subgroupltmask
+KHR-Single-GL45.subgroups.builtin_mask_var.compute.subgroupeqmask
+KHR-Single-GL45.subgroups.builtin_mask_var.compute.subgroupgemask
+KHR-Single-GL45.subgroups.builtin_mask_var.compute.subgroupgtmask
+KHR-Single-GL45.subgroups.builtin_mask_var.compute.subgrouplemask
+KHR-Single-GL45.subgroups.builtin_mask_var.compute.subgroupltmask
+KHR-Single-GL45.subgroups.builtin_mask_var.framebuffer.subgroupeqmask_vertex
+KHR-Single-GL45.subgroups.builtin_mask_var.framebuffer.subgroupeqmask_tess_eval
+KHR-Single-GL45.subgroups.builtin_mask_var.framebuffer.subgroupeqmask_tess_control
+KHR-Single-GL45.subgroups.builtin_mask_var.framebuffer.subgroupeqmask_geometry
+KHR-Single-GL45.subgroups.builtin_mask_var.framebuffer.subgroupgemask_vertex
+KHR-Single-GL45.subgroups.builtin_mask_var.framebuffer.subgroupgemask_tess_eval
+KHR-Single-GL45.subgroups.builtin_mask_var.framebuffer.subgroupgemask_tess_control
+KHR-Single-GL45.subgroups.builtin_mask_var.framebuffer.subgroupgemask_geometry
+KHR-Single-GL45.subgroups.builtin_mask_var.framebuffer.subgroupgtmask_vertex
+KHR-Single-GL45.subgroups.builtin_mask_var.framebuffer.subgroupgtmask_tess_eval
+KHR-Single-GL45.subgroups.builtin_mask_var.framebuffer.subgroupgtmask_tess_control
+KHR-Single-GL45.subgroups.builtin_mask_var.framebuffer.subgroupgtmask_geometry
+KHR-Single-GL45.subgroups.builtin_mask_var.framebuffer.subgrouplemask_vertex
+KHR-Single-GL45.subgroups.builtin_mask_var.framebuffer.subgrouplemask_tess_eval
+KHR-Single-GL45.subgroups.builtin_mask_var.framebuffer.subgrouplemask_tess_control
+KHR-Single-GL45.subgroups.builtin_mask_var.framebuffer.subgrouplemask_geometry
+KHR-Single-GL45.subgroups.builtin_mask_var.framebuffer.subgroupltmask_vertex
+KHR-Single-GL45.subgroups.builtin_mask_var.framebuffer.subgroupltmask_tess_eval
+KHR-Single-GL45.subgroups.builtin_mask_var.framebuffer.subgroupltmask_tess_control
+KHR-Single-GL45.subgroups.builtin_mask_var.framebuffer.subgroupltmask_geometry
+KHR-Single-GL45.subgroups.basic.graphics.subgroupelect
+KHR-Single-GL45.subgroups.basic.graphics.subgroupbarrier
+KHR-Single-GL45.subgroups.basic.graphics.subgroupmemorybarrier
+KHR-Single-GL45.subgroups.basic.graphics.subgroupmemorybarrierbuffer
+KHR-Single-GL45.subgroups.basic.graphics.subgroupmemorybarrierimage
+KHR-Single-GL45.subgroups.basic.compute.subgroupelect
+KHR-Single-GL45.subgroups.basic.compute.subgroupbarrier
+KHR-Single-GL45.subgroups.basic.compute.subgroupmemorybarrier
+KHR-Single-GL45.subgroups.basic.compute.subgroupmemorybarrierbuffer
+KHR-Single-GL45.subgroups.basic.compute.subgroupmemorybarriershared
+KHR-Single-GL45.subgroups.basic.compute.subgroupmemorybarrierimage
+KHR-Single-GL45.subgroups.basic.framebuffer.subgroupelect_vertex
+KHR-Single-GL45.subgroups.basic.framebuffer.subgroupelect_tess_eval
+KHR-Single-GL45.subgroups.basic.framebuffer.subgroupelect_tess_control
+KHR-Single-GL45.subgroups.basic.framebuffer.subgroupelect_geometry
+KHR-Single-GL45.subgroups.basic.framebuffer.subgroupbarrier_fragment
+KHR-Single-GL45.subgroups.basic.framebuffer.subgroupbarrier_vertex
+KHR-Single-GL45.subgroups.basic.framebuffer.subgroupbarrier_tess_eval
+KHR-Single-GL45.subgroups.basic.framebuffer.subgroupbarrier_tess_control
+KHR-Single-GL45.subgroups.basic.framebuffer.subgroupbarrier_geometry
+KHR-Single-GL45.subgroups.basic.framebuffer.subgroupmemorybarrier_fragment
+KHR-Single-GL45.subgroups.basic.framebuffer.subgroupmemorybarrier_vertex
+KHR-Single-GL45.subgroups.basic.framebuffer.subgroupmemorybarrier_tess_eval
+KHR-Single-GL45.subgroups.basic.framebuffer.subgroupmemorybarrier_tess_control
+KHR-Single-GL45.subgroups.basic.framebuffer.subgroupmemorybarrier_geometry
+KHR-Single-GL45.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_fragment
+KHR-Single-GL45.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_vertex
+KHR-Single-GL45.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_tess_eval
+KHR-Single-GL45.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_tess_control
+KHR-Single-GL45.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_geometry
+KHR-Single-GL45.subgroups.basic.framebuffer.subgroupmemorybarrierimage_fragment
+KHR-Single-GL45.subgroups.basic.framebuffer.subgroupmemorybarrierimage_vertex
+KHR-Single-GL45.subgroups.basic.framebuffer.subgroupmemorybarrierimage_tess_eval
+KHR-Single-GL45.subgroups.basic.framebuffer.subgroupmemorybarrierimage_tess_control
+KHR-Single-GL45.subgroups.basic.framebuffer.subgroupmemorybarrierimage_geometry
+KHR-Single-GL45.subgroups.vote.graphics.subgroupallequal_int
+KHR-Single-GL45.subgroups.vote.graphics.subgroupallequal_ivec2
+KHR-Single-GL45.subgroups.vote.graphics.subgroupallequal_ivec3
+KHR-Single-GL45.subgroups.vote.graphics.subgroupallequal_ivec4
+KHR-Single-GL45.subgroups.vote.graphics.subgroupall_uint
+KHR-Single-GL45.subgroups.vote.graphics.subgroupany_uint
+KHR-Single-GL45.subgroups.vote.graphics.subgroupallequal_uint
+KHR-Single-GL45.subgroups.vote.graphics.subgroupallequal_uvec2
+KHR-Single-GL45.subgroups.vote.graphics.subgroupallequal_uvec3
+KHR-Single-GL45.subgroups.vote.graphics.subgroupallequal_uvec4
+KHR-Single-GL45.subgroups.vote.graphics.subgroupallequal_float
+KHR-Single-GL45.subgroups.vote.graphics.subgroupallequal_vec2
+KHR-Single-GL45.subgroups.vote.graphics.subgroupallequal_vec3
+KHR-Single-GL45.subgroups.vote.graphics.subgroupallequal_vec4
+KHR-Single-GL45.subgroups.vote.graphics.subgroupallequal_double
+KHR-Single-GL45.subgroups.vote.graphics.subgroupallequal_dvec2
+KHR-Single-GL45.subgroups.vote.graphics.subgroupallequal_dvec3
+KHR-Single-GL45.subgroups.vote.graphics.subgroupallequal_dvec4
+KHR-Single-GL45.subgroups.vote.graphics.subgroupallequal_bool
+KHR-Single-GL45.subgroups.vote.graphics.subgroupallequal_bvec2
+KHR-Single-GL45.subgroups.vote.graphics.subgroupallequal_bvec3
+KHR-Single-GL45.subgroups.vote.graphics.subgroupallequal_bvec4
+KHR-Single-GL45.subgroups.vote.compute.subgroupallequal_int
+KHR-Single-GL45.subgroups.vote.compute.subgroupallequal_ivec2
+KHR-Single-GL45.subgroups.vote.compute.subgroupallequal_ivec3
+KHR-Single-GL45.subgroups.vote.compute.subgroupallequal_ivec4
+KHR-Single-GL45.subgroups.vote.compute.subgroupall_uint
+KHR-Single-GL45.subgroups.vote.compute.subgroupany_uint
+KHR-Single-GL45.subgroups.vote.compute.subgroupallequal_uint
+KHR-Single-GL45.subgroups.vote.compute.subgroupallequal_uvec2
+KHR-Single-GL45.subgroups.vote.compute.subgroupallequal_uvec3
+KHR-Single-GL45.subgroups.vote.compute.subgroupallequal_uvec4
+KHR-Single-GL45.subgroups.vote.compute.subgroupallequal_float
+KHR-Single-GL45.subgroups.vote.compute.subgroupallequal_vec2
+KHR-Single-GL45.subgroups.vote.compute.subgroupallequal_vec3
+KHR-Single-GL45.subgroups.vote.compute.subgroupallequal_vec4
+KHR-Single-GL45.subgroups.vote.compute.subgroupallequal_double
+KHR-Single-GL45.subgroups.vote.compute.subgroupallequal_dvec2
+KHR-Single-GL45.subgroups.vote.compute.subgroupallequal_dvec3
+KHR-Single-GL45.subgroups.vote.compute.subgroupallequal_dvec4
+KHR-Single-GL45.subgroups.vote.compute.subgroupallequal_bool
+KHR-Single-GL45.subgroups.vote.compute.subgroupallequal_bvec2
+KHR-Single-GL45.subgroups.vote.compute.subgroupallequal_bvec3
+KHR-Single-GL45.subgroups.vote.compute.subgroupallequal_bvec4
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_int_vertex
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_int_tess_eval
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_int_tess_control
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_int_geometry
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_ivec2_vertex
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_ivec2_tess_eval
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_ivec2_tess_control
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_ivec2_geometry
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_ivec3_vertex
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_ivec3_tess_eval
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_ivec3_tess_control
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_ivec3_geometry
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_ivec4_vertex
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_ivec4_tess_eval
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_ivec4_tess_control
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_ivec4_geometry
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupall_uint_vertex
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupall_uint_tess_eval
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupall_uint_tess_control
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupall_uint_geometry
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupany_uint_vertex
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupany_uint_tess_eval
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupany_uint_tess_control
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupany_uint_geometry
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_uint_vertex
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_uint_tess_eval
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_uint_tess_control
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_uint_geometry
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_uvec2_vertex
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_uvec2_tess_eval
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_uvec2_tess_control
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_uvec2_geometry
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_uvec3_vertex
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_uvec3_tess_eval
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_uvec3_tess_control
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_uvec3_geometry
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_uvec4_vertex
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_uvec4_tess_eval
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_uvec4_tess_control
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_uvec4_geometry
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_float_vertex
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_float_tess_eval
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_float_tess_control
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_float_geometry
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_vec2_vertex
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_vec2_tess_eval
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_vec2_tess_control
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_vec2_geometry
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_vec3_vertex
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_vec3_tess_eval
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_vec3_tess_control
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_vec3_geometry
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_vec4_vertex
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_vec4_tess_eval
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_vec4_tess_control
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_vec4_geometry
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_double_vertex
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_double_tess_eval
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_double_tess_control
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_double_geometry
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_dvec2_vertex
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_dvec2_tess_eval
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_dvec2_tess_control
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_dvec2_geometry
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_dvec3_vertex
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_dvec3_tess_eval
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_dvec3_tess_control
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_dvec3_geometry
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_dvec4_vertex
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_dvec4_tess_eval
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_dvec4_tess_control
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_dvec4_geometry
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_bool_vertex
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_bool_tess_eval
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_bool_tess_control
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_bool_geometry
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_bvec2_vertex
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_bvec2_tess_eval
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_bvec2_tess_control
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_bvec2_geometry
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_bvec3_vertex
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_bvec3_tess_eval
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_bvec3_tess_control
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_bvec3_geometry
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_bvec4_vertex
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_bvec4_tess_eval
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_bvec4_tess_control
+KHR-Single-GL45.subgroups.vote.framebuffer.subgroupallequal_bvec4_geometry
+KHR-Single-GL45.subgroups.vote.frag_helper.subgroupallequal_int_fragment
+KHR-Single-GL45.subgroups.vote.frag_helper.subgroupallequal_ivec2_fragment
+KHR-Single-GL45.subgroups.vote.frag_helper.subgroupallequal_ivec3_fragment
+KHR-Single-GL45.subgroups.vote.frag_helper.subgroupallequal_ivec4_fragment
+KHR-Single-GL45.subgroups.vote.frag_helper.subgroupall_uint_fragment
+KHR-Single-GL45.subgroups.vote.frag_helper.subgroupany_uint_fragment
+KHR-Single-GL45.subgroups.vote.frag_helper.subgroupallequal_uint_fragment
+KHR-Single-GL45.subgroups.vote.frag_helper.subgroupallequal_uvec2_fragment
+KHR-Single-GL45.subgroups.vote.frag_helper.subgroupallequal_uvec3_fragment
+KHR-Single-GL45.subgroups.vote.frag_helper.subgroupallequal_uvec4_fragment
+KHR-Single-GL45.subgroups.vote.frag_helper.subgroupallequal_float_fragment
+KHR-Single-GL45.subgroups.vote.frag_helper.subgroupallequal_vec2_fragment
+KHR-Single-GL45.subgroups.vote.frag_helper.subgroupallequal_vec3_fragment
+KHR-Single-GL45.subgroups.vote.frag_helper.subgroupallequal_vec4_fragment
+KHR-Single-GL45.subgroups.vote.frag_helper.subgroupallequal_double_fragment
+KHR-Single-GL45.subgroups.vote.frag_helper.subgroupallequal_dvec2_fragment
+KHR-Single-GL45.subgroups.vote.frag_helper.subgroupallequal_dvec3_fragment
+KHR-Single-GL45.subgroups.vote.frag_helper.subgroupallequal_dvec4_fragment
+KHR-Single-GL45.subgroups.vote.frag_helper.subgroupallequal_bool_fragment
+KHR-Single-GL45.subgroups.vote.frag_helper.subgroupallequal_bvec2_fragment
+KHR-Single-GL45.subgroups.vote.frag_helper.subgroupallequal_bvec3_fragment
+KHR-Single-GL45.subgroups.vote.frag_helper.subgroupallequal_bvec4_fragment
+KHR-Single-GL45.subgroups.ballot.graphics.graphic
+KHR-Single-GL45.subgroups.ballot.compute.compute
+KHR-Single-GL45.subgroups.ballot.framebuffer.tess_eval
+KHR-Single-GL45.subgroups.ballot.framebuffer.tess_control
+KHR-Single-GL45.subgroups.ballot.framebuffer.geometry
+KHR-Single-GL45.subgroups.ballot.framebuffer.vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_int
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_int
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_ivec2
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_ivec2
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_ivec3
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_ivec3
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_ivec4
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_ivec4
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_uint
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_uint
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_uvec2
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_uvec2
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_uvec3
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_uvec3
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_uvec4
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_uvec4
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_float
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_float
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_vec2
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_vec2
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_vec3
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_vec3
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_vec4
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_vec4
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_double
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_double
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_dvec2
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_dvec2
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_dvec3
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_dvec3
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_dvec4
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_dvec4
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_bool
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_bool
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_bvec2
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_bvec2
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_bvec3
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_bvec3
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_bvec4
+KHR-Single-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_bvec4
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_int
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_int
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_ivec2
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_ivec2
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_ivec3
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_ivec3
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_ivec4
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_ivec4
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_uint
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_uint
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_uvec2
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_uvec2
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_uvec3
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_uvec3
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_uvec4
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_uvec4
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_float
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_float
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_vec2
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_vec2
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_vec3
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_vec3
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_vec4
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_vec4
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_double
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_double
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_dvec2
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_dvec2
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_dvec3
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_dvec3
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_dvec4
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_dvec4
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_bool
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_bool
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_bvec2
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_bvec2
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_bvec3
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_bvec3
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_bvec4
+KHR-Single-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_bvec4
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_intvertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_inttess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_inttess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_intgeometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_intvertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_inttess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_inttess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_intgeometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec2vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec2tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec2tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec2geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec2vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec2tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec2tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec2geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec3vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec3tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec3tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec3geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec3vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec3tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec3tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec3geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec4vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec4tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec4tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec4geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec4vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec4tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec4tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec4geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uintvertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uinttess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uinttess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uintgeometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uintvertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uinttess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uinttess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uintgeometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec2vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec2tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec2tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec2geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec2vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec2tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec2tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec2geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec3vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec3tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec3tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec3geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec3vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec3tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec3tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec3geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec4vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec4tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec4tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec4geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec4vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec4tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec4tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec4geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_floatvertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_floattess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_floattess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_floatgeometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_floatvertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_floattess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_floattess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_floatgeometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec2vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec2tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec2tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec2geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec2vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec2tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec2tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec2geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec3vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec3tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec3tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec3geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec3vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec3tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec3tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec3geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec4vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec4tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec4tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec4geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec4vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec4tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec4tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec4geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_doublevertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_doubletess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_doubletess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_doublegeometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_doublevertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_doubletess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_doubletess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_doublegeometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec2vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec2tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec2tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec2geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec2vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec2tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec2tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec2geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec3vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec3tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec3tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec3geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec3vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec3tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec3tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec3geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec4vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec4tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec4tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec4geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec4vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec4tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec4tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec4geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_boolvertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_booltess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_booltess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_boolgeometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_boolvertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_booltess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_booltess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_boolgeometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec2vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec2tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec2tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec2geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec2vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec2tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec2tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec2geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec3vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec3tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec3tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec3geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec3vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec3tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec3tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec3geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec4vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec4tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec4tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec4geometry
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec4vertex
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec4tess_eval
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec4tess_control
+KHR-Single-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec4geometry
+KHR-Single-GL45.subgroups.ballot_other.graphics.subgroupinverseballot
+KHR-Single-GL45.subgroups.ballot_other.graphics.subgroupballotbitextract
+KHR-Single-GL45.subgroups.ballot_other.graphics.subgroupballotbitcount
+KHR-Single-GL45.subgroups.ballot_other.graphics.subgroupballotinclusivebitcount
+KHR-Single-GL45.subgroups.ballot_other.graphics.subgroupballotexclusivebitcount
+KHR-Single-GL45.subgroups.ballot_other.graphics.subgroupballotfindlsb
+KHR-Single-GL45.subgroups.ballot_other.graphics.subgroupballotfindmsb
+KHR-Single-GL45.subgroups.ballot_other.compute.subgroupinverseballot
+KHR-Single-GL45.subgroups.ballot_other.compute.subgroupballotbitextract
+KHR-Single-GL45.subgroups.ballot_other.compute.subgroupballotbitcount
+KHR-Single-GL45.subgroups.ballot_other.compute.subgroupballotinclusivebitcount
+KHR-Single-GL45.subgroups.ballot_other.compute.subgroupballotexclusivebitcount
+KHR-Single-GL45.subgroups.ballot_other.compute.subgroupballotfindlsb
+KHR-Single-GL45.subgroups.ballot_other.compute.subgroupballotfindmsb
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupinverseballot_vertex
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupinverseballot_tess_eval
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupinverseballot_tess_control
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupinverseballot_geometry
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupballotbitextract_vertex
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupballotbitextract_tess_eval
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupballotbitextract_tess_control
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupballotbitextract_geometry
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupballotbitcount_vertex
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupballotbitcount_tess_eval
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupballotbitcount_tess_control
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupballotbitcount_geometry
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupballotinclusivebitcount_vertex
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupballotinclusivebitcount_tess_eval
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupballotinclusivebitcount_tess_control
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupballotinclusivebitcount_geometry
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupballotexclusivebitcount_vertex
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupballotexclusivebitcount_tess_eval
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupballotexclusivebitcount_tess_control
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupballotexclusivebitcount_geometry
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupballotfindlsb_vertex
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupballotfindlsb_tess_eval
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupballotfindlsb_tess_control
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupballotfindlsb_geometry
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupballotfindmsb_vertex
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupballotfindmsb_tess_eval
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupballotfindmsb_tess_control
+KHR-Single-GL45.subgroups.ballot_other.framebuffer.subgroupballotfindmsb_geometry
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupadd_int
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmul_int
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmin_int
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmax_int
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupand_int
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupor_int
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupxor_int
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_int
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_int
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_int
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_int
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveand_int
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveor_int
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivexor_int
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_int
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_int
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_int
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_int
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveand_int
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveor_int
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivexor_int
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupadd_ivec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmul_ivec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmin_ivec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmax_ivec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupand_ivec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupor_ivec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupxor_ivec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_ivec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_ivec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_ivec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_ivec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveand_ivec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveor_ivec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivexor_ivec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_ivec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_ivec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_ivec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_ivec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveand_ivec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveor_ivec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivexor_ivec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupadd_ivec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmul_ivec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmin_ivec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmax_ivec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupand_ivec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupor_ivec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupxor_ivec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_ivec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_ivec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_ivec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_ivec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveand_ivec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveor_ivec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivexor_ivec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_ivec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_ivec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_ivec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_ivec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveand_ivec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveor_ivec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivexor_ivec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupadd_ivec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmul_ivec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmin_ivec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmax_ivec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupand_ivec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupor_ivec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupxor_ivec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_ivec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_ivec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_ivec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_ivec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveand_ivec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveor_ivec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivexor_ivec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_ivec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_ivec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_ivec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_ivec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveand_ivec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveor_ivec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivexor_ivec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupadd_uint
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmul_uint
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmin_uint
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmax_uint
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupand_uint
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupor_uint
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupxor_uint
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_uint
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_uint
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_uint
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_uint
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveand_uint
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveor_uint
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivexor_uint
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_uint
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_uint
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_uint
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_uint
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveand_uint
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveor_uint
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivexor_uint
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupadd_uvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmul_uvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmin_uvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmax_uvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupand_uvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupor_uvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupxor_uvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_uvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_uvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_uvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_uvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveand_uvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveor_uvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivexor_uvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_uvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_uvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_uvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_uvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveand_uvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveor_uvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivexor_uvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupadd_uvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmul_uvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmin_uvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmax_uvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupand_uvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupor_uvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupxor_uvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_uvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_uvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_uvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_uvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveand_uvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveor_uvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivexor_uvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_uvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_uvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_uvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_uvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveand_uvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveor_uvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivexor_uvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupadd_uvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmul_uvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmin_uvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmax_uvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupand_uvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupor_uvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupxor_uvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_uvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_uvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_uvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_uvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveand_uvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveor_uvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivexor_uvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_uvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_uvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_uvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_uvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveand_uvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveor_uvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivexor_uvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupadd_float
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmul_float
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmin_float
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmax_float
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_float
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_float
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_float
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_float
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_float
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_float
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_float
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_float
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupadd_vec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmul_vec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmin_vec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmax_vec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_vec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_vec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_vec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_vec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_vec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_vec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_vec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_vec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupadd_vec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmul_vec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmin_vec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmax_vec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_vec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_vec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_vec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_vec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_vec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_vec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_vec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_vec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupadd_vec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmul_vec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmin_vec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmax_vec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_vec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_vec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_vec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_vec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_vec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_vec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_vec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_vec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupadd_double
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmul_double
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmin_double
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmax_double
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_double
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_double
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_double
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_double
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_double
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_double
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_double
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_double
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupadd_dvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmul_dvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmin_dvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmax_dvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_dvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_dvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_dvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_dvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_dvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_dvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_dvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_dvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupadd_dvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmul_dvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmin_dvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmax_dvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_dvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_dvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_dvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_dvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_dvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_dvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_dvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_dvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupadd_dvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmul_dvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmin_dvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupmax_dvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_dvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_dvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_dvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_dvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_dvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_dvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_dvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_dvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupand_bool
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupor_bool
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupxor_bool
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveand_bool
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveor_bool
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivexor_bool
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveand_bool
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveor_bool
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivexor_bool
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupand_bvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupor_bvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupxor_bvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveand_bvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveor_bvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivexor_bvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveand_bvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveor_bvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivexor_bvec2
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupand_bvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupor_bvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupxor_bvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveand_bvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveor_bvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivexor_bvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveand_bvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveor_bvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivexor_bvec3
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupand_bvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupor_bvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupxor_bvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveand_bvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusiveor_bvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupinclusivexor_bvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveand_bvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusiveor_bvec4
+KHR-Single-GL45.subgroups.arithmetic.graphics.subgroupexclusivexor_bvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupadd_int
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmul_int
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmin_int
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmax_int
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupand_int
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupor_int
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupxor_int
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_int
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_int
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_int
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_int
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveand_int
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveor_int
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivexor_int
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_int
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_int
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_int
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_int
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveand_int
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveor_int
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivexor_int
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupadd_ivec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmul_ivec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmin_ivec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmax_ivec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupand_ivec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupor_ivec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupxor_ivec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_ivec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_ivec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_ivec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_ivec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveand_ivec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveor_ivec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivexor_ivec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_ivec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_ivec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_ivec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_ivec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveand_ivec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveor_ivec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivexor_ivec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupadd_ivec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmul_ivec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmin_ivec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmax_ivec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupand_ivec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupor_ivec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupxor_ivec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_ivec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_ivec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_ivec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_ivec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveand_ivec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveor_ivec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivexor_ivec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_ivec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_ivec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_ivec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_ivec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveand_ivec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveor_ivec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivexor_ivec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupadd_ivec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmul_ivec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmin_ivec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmax_ivec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupand_ivec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupor_ivec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupxor_ivec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_ivec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_ivec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_ivec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_ivec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveand_ivec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveor_ivec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivexor_ivec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_ivec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_ivec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_ivec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_ivec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveand_ivec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveor_ivec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivexor_ivec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupadd_uint
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmul_uint
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmin_uint
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmax_uint
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupand_uint
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupor_uint
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupxor_uint
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_uint
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_uint
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_uint
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_uint
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveand_uint
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveor_uint
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivexor_uint
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_uint
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_uint
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_uint
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_uint
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveand_uint
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveor_uint
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivexor_uint
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupadd_uvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmul_uvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmin_uvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmax_uvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupand_uvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupor_uvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupxor_uvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_uvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_uvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_uvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_uvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveand_uvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveor_uvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivexor_uvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_uvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_uvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_uvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_uvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveand_uvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveor_uvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivexor_uvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupadd_uvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmul_uvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmin_uvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmax_uvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupand_uvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupor_uvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupxor_uvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_uvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_uvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_uvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_uvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveand_uvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveor_uvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivexor_uvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_uvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_uvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_uvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_uvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveand_uvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveor_uvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivexor_uvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupadd_uvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmul_uvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmin_uvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmax_uvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupand_uvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupor_uvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupxor_uvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_uvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_uvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_uvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_uvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveand_uvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveor_uvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivexor_uvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_uvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_uvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_uvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_uvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveand_uvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveor_uvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivexor_uvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupadd_float
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmul_float
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmin_float
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmax_float
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_float
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_float
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_float
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_float
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_float
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_float
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_float
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_float
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupadd_vec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmul_vec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmin_vec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmax_vec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_vec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_vec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_vec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_vec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_vec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_vec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_vec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_vec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupadd_vec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmul_vec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmin_vec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmax_vec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_vec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_vec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_vec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_vec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_vec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_vec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_vec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_vec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupadd_vec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmul_vec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmin_vec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmax_vec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_vec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_vec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_vec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_vec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_vec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_vec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_vec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_vec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupadd_double
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmul_double
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmin_double
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmax_double
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_double
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_double
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_double
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_double
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_double
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_double
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_double
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_double
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupadd_dvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmul_dvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmin_dvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmax_dvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_dvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_dvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_dvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_dvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_dvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_dvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_dvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_dvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupadd_dvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmul_dvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmin_dvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmax_dvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_dvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_dvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_dvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_dvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_dvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_dvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_dvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_dvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupadd_dvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmul_dvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmin_dvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupmax_dvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_dvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_dvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_dvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_dvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_dvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_dvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_dvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_dvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupand_bool
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupor_bool
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupxor_bool
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveand_bool
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveor_bool
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivexor_bool
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveand_bool
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveor_bool
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivexor_bool
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupand_bvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupor_bvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupxor_bvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveand_bvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveor_bvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivexor_bvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveand_bvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveor_bvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivexor_bvec2
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupand_bvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupor_bvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupxor_bvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveand_bvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveor_bvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivexor_bvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveand_bvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveor_bvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivexor_bvec3
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupand_bvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupor_bvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupxor_bvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveand_bvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusiveor_bvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupinclusivexor_bvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveand_bvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusiveor_bvec4
+KHR-Single-GL45.subgroups.arithmetic.compute.subgroupexclusivexor_bvec4
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_int_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_int_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_int_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_int_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_int_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_int_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_int_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_int_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_int_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_int_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_int_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_int_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_int_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_int_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_int_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_int_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_int_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_int_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_int_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_int_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_int_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_int_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_int_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_int_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_int_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_int_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_int_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_int_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_int_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_int_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_int_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_int_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_int_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_int_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_int_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_int_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_int_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_int_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_int_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_int_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_int_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_int_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_int_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_int_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_int_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_int_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_int_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_int_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_int_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_int_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_int_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_int_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_int_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_int_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_int_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_int_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_int_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_int_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_int_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_int_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_int_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_int_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_int_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_int_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_int_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_int_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_int_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_int_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_int_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_int_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_int_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_int_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_int_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_int_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_int_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_int_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_int_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_int_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_int_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_int_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_int_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_int_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_int_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_int_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_ivec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_ivec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_ivec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_ivec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_ivec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_ivec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_ivec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_ivec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_ivec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_ivec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_ivec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_ivec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_ivec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_ivec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_ivec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_ivec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_ivec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_ivec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_ivec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_ivec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_ivec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_ivec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_ivec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_ivec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_ivec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_ivec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_ivec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_ivec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_ivec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_ivec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_ivec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_ivec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_ivec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_ivec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_ivec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_ivec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_ivec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_ivec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_ivec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_ivec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_ivec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_ivec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_ivec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_ivec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_ivec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_ivec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_ivec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_ivec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_ivec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_ivec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_ivec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_ivec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_ivec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_ivec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_ivec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_ivec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_ivec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_ivec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_ivec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_ivec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_ivec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_ivec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_ivec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_ivec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_ivec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_ivec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_ivec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_ivec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_ivec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_ivec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_ivec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_ivec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_ivec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_ivec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_ivec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_ivec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_ivec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_ivec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_ivec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_ivec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_ivec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_ivec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_ivec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_ivec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uint_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uint_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uint_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uint_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uint_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uint_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uint_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uint_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uint_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uint_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uint_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uint_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uint_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uint_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uint_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uint_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_uint_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_uint_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_uint_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_uint_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_uint_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_uint_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_uint_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_uint_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uint_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uint_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uint_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uint_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uint_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uint_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uint_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uint_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uint_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uint_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uint_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uint_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uint_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uint_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uint_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uint_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uint_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uint_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uint_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uint_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uint_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uint_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uint_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uint_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uint_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uint_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uint_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uint_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uint_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uint_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uint_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uint_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uint_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uint_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uint_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uint_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uint_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uint_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uint_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uint_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uint_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uint_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uint_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uint_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uint_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uint_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uint_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uint_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uint_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uint_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uint_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uint_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uint_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uint_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uint_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uint_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uint_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uint_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uint_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uint_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_uvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_uvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_uvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_uvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_uvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_uvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_uvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_uvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_uvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_uvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_uvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_uvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_uvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_uvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_uvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_uvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_uvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_uvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_uvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_uvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_uvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_uvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_uvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_uvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_float_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_float_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_float_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_float_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_float_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_float_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_float_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_float_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_float_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_float_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_float_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_float_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_float_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_float_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_float_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_float_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_float_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_float_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_float_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_float_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_float_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_float_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_float_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_float_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_float_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_float_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_float_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_float_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_float_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_float_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_float_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_float_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_float_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_float_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_float_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_float_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_float_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_float_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_float_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_float_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_float_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_float_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_float_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_float_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_float_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_float_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_float_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_float_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_vec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_vec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_vec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_vec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_vec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_vec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_vec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_vec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_vec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_vec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_vec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_vec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_vec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_vec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_vec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_vec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_vec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_vec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_vec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_vec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_vec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_vec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_vec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_vec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_vec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_vec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_vec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_vec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_vec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_vec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_vec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_vec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_vec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_vec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_vec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_vec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_vec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_vec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_vec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_vec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_vec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_vec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_vec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_vec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_vec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_vec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_vec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_vec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_double_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_double_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_double_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_double_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_double_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_double_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_double_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_double_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_double_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_double_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_double_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_double_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_double_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_double_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_double_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_double_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_double_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_double_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_double_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_double_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_double_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_double_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_double_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_double_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_double_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_double_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_double_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_double_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_double_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_double_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_double_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_double_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_double_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_double_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_double_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_double_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_double_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_double_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_double_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_double_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_double_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_double_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_double_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_double_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_double_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_double_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_double_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_double_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_dvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_dvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_dvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_dvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_dvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_dvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_dvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_dvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_dvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_dvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_dvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_dvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_dvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_dvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_dvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_dvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_dvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_dvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_dvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_dvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_dvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_dvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_dvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_dvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_dvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_dvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_dvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_dvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_dvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_dvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_dvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_dvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_dvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_dvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_dvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupadd_dvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_dvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_dvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_dvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmul_dvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_dvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_dvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_dvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmin_dvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_dvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_dvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_dvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupmax_dvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_bool_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_bool_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_bool_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_bool_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_bool_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_bool_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_bool_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_bool_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bool_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bool_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bool_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bool_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bool_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bool_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bool_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bool_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bool_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bool_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bool_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bool_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bool_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bool_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bool_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bool_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bool_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bool_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bool_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bool_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bool_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bool_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bool_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bool_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bool_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bool_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bool_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bool_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_bvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_bvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_bvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_bvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_bvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_bvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_bvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_bvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec2_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec2_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec2_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec2_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_bvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_bvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_bvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_bvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_bvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_bvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_bvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_bvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec3_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec3_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec3_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec3_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_bvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_bvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_bvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupand_bvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_bvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_bvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_bvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupor_bvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec4_geometry
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec4_vertex
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec4_tess_eval
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec4_tess_control
+KHR-Single-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec4_geometry
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredadd_int
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmul_int
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmin_int
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmax_int
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredand_int
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredor_int
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredxor_int
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredadd_ivec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmul_ivec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmin_ivec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmax_ivec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredand_ivec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredor_ivec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredxor_ivec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredadd_ivec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmul_ivec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmin_ivec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmax_ivec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredand_ivec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredor_ivec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredxor_ivec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredadd_ivec4
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmul_ivec4
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmin_ivec4
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmax_ivec4
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredand_ivec4
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredor_ivec4
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredxor_ivec4
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredadd_uint
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmul_uint
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmin_uint
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmax_uint
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredand_uint
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredor_uint
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredxor_uint
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredadd_uvec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmul_uvec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmin_uvec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmax_uvec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredand_uvec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredor_uvec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredxor_uvec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredadd_uvec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmul_uvec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmin_uvec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmax_uvec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredand_uvec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredor_uvec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredxor_uvec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredadd_uvec4
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmul_uvec4
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmin_uvec4
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmax_uvec4
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredand_uvec4
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredor_uvec4
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredxor_uvec4
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredadd_float
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmul_float
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmin_float
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmax_float
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredadd_vec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmul_vec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmin_vec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmax_vec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredadd_vec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmul_vec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmin_vec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmax_vec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredadd_vec4
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmul_vec4
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmin_vec4
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmax_vec4
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredadd_double
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmul_double
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmin_double
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmax_double
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredadd_dvec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmul_dvec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmin_dvec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmax_dvec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredadd_dvec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmul_dvec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmin_dvec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmax_dvec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredadd_dvec4
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmul_dvec4
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmin_dvec4
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredmax_dvec4
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredand_bool
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredor_bool
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredxor_bool
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredand_bvec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredor_bvec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredxor_bvec2
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredand_bvec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredor_bvec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredxor_bvec3
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredand_bvec4
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredor_bvec4
+KHR-Single-GL45.subgroups.clustered.graphics.subgroupclusteredxor_bvec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredadd_int
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmul_int
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmin_int
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmax_int
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredand_int
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredor_int
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredxor_int
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredadd_ivec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmul_ivec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmin_ivec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmax_ivec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredand_ivec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredor_ivec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredxor_ivec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredadd_ivec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmul_ivec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmin_ivec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmax_ivec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredand_ivec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredor_ivec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredxor_ivec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredadd_ivec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmul_ivec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmin_ivec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmax_ivec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredand_ivec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredor_ivec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredxor_ivec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredadd_uint
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmul_uint
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmin_uint
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmax_uint
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredand_uint
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredor_uint
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredxor_uint
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredadd_uvec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmul_uvec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmin_uvec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmax_uvec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredand_uvec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredor_uvec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredxor_uvec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredadd_uvec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmul_uvec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmin_uvec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmax_uvec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredand_uvec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredor_uvec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredxor_uvec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredadd_uvec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmul_uvec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmin_uvec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmax_uvec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredand_uvec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredor_uvec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredxor_uvec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredadd_float
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmul_float
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmin_float
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmax_float
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredadd_vec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmul_vec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmin_vec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmax_vec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredadd_vec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmul_vec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmin_vec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmax_vec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredadd_vec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmul_vec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmin_vec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmax_vec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredadd_double
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmul_double
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmin_double
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmax_double
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredadd_dvec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmul_dvec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmin_dvec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmax_dvec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredadd_dvec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmul_dvec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmin_dvec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmax_dvec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredadd_dvec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmul_dvec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmin_dvec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredmax_dvec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredand_bool
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredor_bool
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredxor_bool
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredand_bvec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredor_bvec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredxor_bvec2
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredand_bvec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredor_bvec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredxor_bvec3
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredand_bvec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredor_bvec4
+KHR-Single-GL45.subgroups.clustered.compute.subgroupclusteredxor_bvec4
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_int_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_int_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_int_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_int_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_int_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_int_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_int_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_int_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_int_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_int_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_int_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_int_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_int_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_int_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_int_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_int_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_int_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_int_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_int_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_int_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_int_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_int_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_int_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_int_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_int_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_int_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_int_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_int_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_ivec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_ivec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_ivec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_ivec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_ivec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_ivec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_ivec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_ivec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_ivec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_ivec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_ivec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_ivec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_ivec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_ivec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_ivec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_ivec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec4_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec4_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec4_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec4_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_ivec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_ivec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_ivec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_ivec4_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_ivec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_ivec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_ivec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_ivec4_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec4_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uint_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uint_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uint_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uint_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uint_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uint_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uint_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uint_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uint_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uint_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uint_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uint_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uint_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uint_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uint_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uint_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uint_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uint_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uint_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uint_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uint_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uint_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uint_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uint_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uint_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uint_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uint_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uint_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uvec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uvec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uvec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uvec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uvec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uvec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uvec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uvec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uvec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uvec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uvec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uvec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uvec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uvec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uvec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uvec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec4_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec4_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec4_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec4_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uvec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uvec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uvec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uvec4_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uvec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uvec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uvec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uvec4_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec4_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_float_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_float_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_float_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_float_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_float_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_float_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_float_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_float_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_float_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_float_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_float_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_float_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_float_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_float_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_float_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_float_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_vec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_vec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_vec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_vec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_vec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_vec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_vec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_vec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_vec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_vec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_vec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_vec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_vec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_vec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_vec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_vec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_vec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_vec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_vec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_vec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_vec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_vec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_vec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_vec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_vec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_vec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_vec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_vec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_vec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_vec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_vec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_vec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_vec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_vec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_vec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_vec4_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_vec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_vec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_vec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_vec4_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_vec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_vec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_vec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_vec4_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_vec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_vec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_vec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_vec4_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_double_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_double_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_double_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_double_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_double_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_double_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_double_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_double_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_double_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_double_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_double_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_double_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_double_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_double_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_double_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_double_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec4_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec4_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec4_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec4_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bool_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bool_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bool_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bool_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bool_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bool_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bool_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bool_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bool_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bool_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bool_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bool_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bvec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bvec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bvec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bvec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bvec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bvec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bvec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bvec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec2_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec2_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec2_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec2_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bvec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bvec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bvec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bvec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bvec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bvec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bvec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bvec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec3_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec3_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec3_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec3_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bvec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bvec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bvec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bvec4_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bvec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bvec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bvec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bvec4_geometry
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec4_vertex
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec4_tess_eval
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec4_tess_control
+KHR-Single-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupadd_int
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmul_int
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmin_int
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmax_int
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupand_int
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupor_int
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupxor_int
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_int
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_int
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_int
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_int
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveand_int
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveor_int
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivexor_int
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_int
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_int
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_int
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_int
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveand_int
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveor_int
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivexor_int
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupadd_ivec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmul_ivec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmin_ivec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmax_ivec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupand_ivec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupor_ivec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupxor_ivec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_ivec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_ivec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_ivec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_ivec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveand_ivec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveor_ivec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivexor_ivec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_ivec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_ivec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_ivec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_ivec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveand_ivec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveor_ivec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivexor_ivec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupadd_ivec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmul_ivec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmin_ivec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmax_ivec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupand_ivec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupor_ivec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupxor_ivec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_ivec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_ivec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_ivec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_ivec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveand_ivec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveor_ivec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivexor_ivec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_ivec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_ivec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_ivec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_ivec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveand_ivec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveor_ivec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivexor_ivec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupadd_ivec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmul_ivec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmin_ivec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmax_ivec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupand_ivec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupor_ivec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupxor_ivec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_ivec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_ivec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_ivec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_ivec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveand_ivec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveor_ivec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivexor_ivec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_ivec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_ivec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_ivec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_ivec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveand_ivec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveor_ivec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivexor_ivec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupadd_uint
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmul_uint
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmin_uint
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmax_uint
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupand_uint
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupor_uint
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupxor_uint
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_uint
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_uint
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_uint
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_uint
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveand_uint
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveor_uint
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivexor_uint
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_uint
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_uint
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_uint
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_uint
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveand_uint
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveor_uint
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivexor_uint
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupadd_uvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmul_uvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmin_uvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmax_uvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupand_uvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupor_uvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupxor_uvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_uvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_uvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_uvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_uvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveand_uvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveor_uvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivexor_uvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_uvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_uvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_uvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_uvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveand_uvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveor_uvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivexor_uvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupadd_uvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmul_uvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmin_uvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmax_uvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupand_uvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupor_uvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupxor_uvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_uvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_uvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_uvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_uvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveand_uvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveor_uvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivexor_uvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_uvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_uvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_uvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_uvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveand_uvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveor_uvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivexor_uvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupadd_uvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmul_uvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmin_uvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmax_uvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupand_uvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupor_uvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupxor_uvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_uvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_uvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_uvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_uvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveand_uvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveor_uvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivexor_uvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_uvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_uvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_uvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_uvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveand_uvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveor_uvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivexor_uvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupadd_float
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmul_float
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmin_float
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmax_float
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_float
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_float
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_float
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_float
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_float
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_float
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_float
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_float
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupadd_vec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmul_vec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmin_vec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmax_vec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_vec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_vec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_vec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_vec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_vec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_vec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_vec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_vec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupadd_vec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmul_vec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmin_vec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmax_vec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_vec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_vec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_vec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_vec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_vec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_vec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_vec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_vec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupadd_vec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmul_vec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmin_vec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmax_vec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_vec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_vec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_vec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_vec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_vec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_vec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_vec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_vec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupadd_double
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmul_double
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmin_double
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmax_double
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_double
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_double
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_double
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_double
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_double
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_double
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_double
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_double
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupadd_dvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmul_dvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmin_dvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmax_dvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_dvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_dvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_dvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_dvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_dvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_dvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_dvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_dvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupadd_dvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmul_dvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmin_dvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmax_dvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_dvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_dvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_dvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_dvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_dvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_dvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_dvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_dvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupadd_dvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmul_dvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmin_dvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupmax_dvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_dvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_dvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_dvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_dvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_dvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_dvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_dvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_dvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupand_bool
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupor_bool
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupxor_bool
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveand_bool
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveor_bool
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivexor_bool
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveand_bool
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveor_bool
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivexor_bool
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupand_bvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupor_bvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupxor_bvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveand_bvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveor_bvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivexor_bvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveand_bvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveor_bvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivexor_bvec2
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupand_bvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupor_bvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupxor_bvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveand_bvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveor_bvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivexor_bvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveand_bvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveor_bvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivexor_bvec3
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupand_bvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupor_bvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupxor_bvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveand_bvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusiveor_bvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupinclusivexor_bvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveand_bvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusiveor_bvec4
+KHR-Single-GL45.subgroups.partitioned.graphics.subgroupexclusivexor_bvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupadd_int
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmul_int
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmin_int
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmax_int
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupand_int
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupor_int
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupxor_int
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_int
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemul_int
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemin_int
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemax_int
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveand_int
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveor_int
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivexor_int
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_int
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemul_int
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemin_int
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemax_int
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveand_int
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveor_int
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivexor_int
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupadd_ivec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmul_ivec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmin_ivec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmax_ivec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupand_ivec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupor_ivec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupxor_ivec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_ivec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemul_ivec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemin_ivec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemax_ivec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveand_ivec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveor_ivec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivexor_ivec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_ivec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemul_ivec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemin_ivec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemax_ivec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveand_ivec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveor_ivec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivexor_ivec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupadd_ivec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmul_ivec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmin_ivec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmax_ivec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupand_ivec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupor_ivec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupxor_ivec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_ivec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemul_ivec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemin_ivec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemax_ivec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveand_ivec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveor_ivec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivexor_ivec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_ivec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemul_ivec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemin_ivec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemax_ivec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveand_ivec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveor_ivec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivexor_ivec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupadd_ivec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmul_ivec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmin_ivec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmax_ivec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupand_ivec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupor_ivec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupxor_ivec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_ivec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemul_ivec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemin_ivec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemax_ivec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveand_ivec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveor_ivec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivexor_ivec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_ivec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemul_ivec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemin_ivec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemax_ivec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveand_ivec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveor_ivec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivexor_ivec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupadd_uint
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmul_uint
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmin_uint
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmax_uint
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupand_uint
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupor_uint
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupxor_uint
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_uint
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemul_uint
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemin_uint
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemax_uint
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveand_uint
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveor_uint
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivexor_uint
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_uint
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemul_uint
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemin_uint
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemax_uint
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveand_uint
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveor_uint
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivexor_uint
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupadd_uvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmul_uvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmin_uvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmax_uvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupand_uvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupor_uvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupxor_uvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_uvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemul_uvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemin_uvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemax_uvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveand_uvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveor_uvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivexor_uvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_uvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemul_uvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemin_uvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemax_uvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveand_uvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveor_uvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivexor_uvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupadd_uvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmul_uvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmin_uvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmax_uvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupand_uvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupor_uvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupxor_uvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_uvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemul_uvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemin_uvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemax_uvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveand_uvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveor_uvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivexor_uvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_uvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemul_uvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemin_uvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemax_uvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveand_uvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveor_uvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivexor_uvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupadd_uvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmul_uvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmin_uvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmax_uvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupand_uvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupor_uvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupxor_uvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_uvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemul_uvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemin_uvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemax_uvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveand_uvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveor_uvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivexor_uvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_uvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemul_uvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemin_uvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemax_uvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveand_uvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveor_uvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivexor_uvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupadd_float
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmul_float
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmin_float
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmax_float
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_float
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemul_float
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemin_float
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemax_float
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_float
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemul_float
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemin_float
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemax_float
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupadd_vec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmul_vec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmin_vec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmax_vec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_vec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemul_vec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemin_vec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemax_vec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_vec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemul_vec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemin_vec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemax_vec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupadd_vec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmul_vec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmin_vec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmax_vec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_vec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemul_vec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemin_vec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemax_vec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_vec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemul_vec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemin_vec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemax_vec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupadd_vec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmul_vec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmin_vec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmax_vec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_vec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemul_vec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemin_vec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemax_vec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_vec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemul_vec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemin_vec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemax_vec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupadd_double
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmul_double
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmin_double
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmax_double
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_double
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemul_double
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemin_double
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemax_double
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_double
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemul_double
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemin_double
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemax_double
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupadd_dvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmul_dvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmin_dvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmax_dvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_dvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemul_dvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemin_dvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemax_dvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_dvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemul_dvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemin_dvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemax_dvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupadd_dvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmul_dvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmin_dvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmax_dvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_dvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemul_dvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemin_dvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemax_dvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_dvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemul_dvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemin_dvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemax_dvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupadd_dvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmul_dvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmin_dvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupmax_dvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_dvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemul_dvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemin_dvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivemax_dvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_dvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemul_dvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemin_dvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivemax_dvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupand_bool
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupor_bool
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupxor_bool
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveand_bool
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveor_bool
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivexor_bool
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveand_bool
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveor_bool
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivexor_bool
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupand_bvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupor_bvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupxor_bvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveand_bvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveor_bvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivexor_bvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveand_bvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveor_bvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivexor_bvec2
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupand_bvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupor_bvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupxor_bvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveand_bvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveor_bvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivexor_bvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveand_bvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveor_bvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivexor_bvec3
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupand_bvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupor_bvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupxor_bvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveand_bvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusiveor_bvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupinclusivexor_bvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveand_bvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusiveor_bvec4
+KHR-Single-GL45.subgroups.partitioned.compute.subgroupexclusivexor_bvec4
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_int_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_int_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_int_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_int_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_int_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_int_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_int_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_int_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_int_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_int_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_int_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_int_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_int_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_int_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_int_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_int_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_int_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_int_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_int_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_int_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_int_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_int_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_int_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_int_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_int_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_int_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_int_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_int_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_int_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_int_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_int_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_int_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_int_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_int_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_int_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_int_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_int_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_int_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_int_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_int_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_int_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_int_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_int_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_int_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_int_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_int_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_int_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_int_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_int_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_int_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_int_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_int_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_int_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_int_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_int_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_int_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_int_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_int_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_int_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_int_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_int_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_int_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_int_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_int_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_int_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_int_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_int_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_int_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_int_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_int_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_int_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_int_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_int_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_int_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_int_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_int_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_int_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_int_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_int_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_int_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_int_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_int_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_int_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_int_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_ivec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_ivec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_ivec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_ivec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_ivec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_ivec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_ivec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_ivec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_ivec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_ivec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_ivec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_ivec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_ivec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_ivec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_ivec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_ivec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_ivec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_ivec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_ivec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_ivec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_ivec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_ivec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_ivec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_ivec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_ivec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_ivec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_ivec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_ivec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_ivec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_ivec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_ivec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_ivec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_ivec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_ivec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_ivec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_ivec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_ivec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_ivec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_ivec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_ivec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_ivec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_ivec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_ivec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_ivec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_ivec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_ivec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_ivec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_ivec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_ivec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_ivec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_ivec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_ivec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_ivec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_ivec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_ivec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_ivec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_ivec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_ivec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_ivec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_ivec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_ivec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_ivec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_ivec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_ivec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_ivec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_ivec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_ivec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_ivec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_ivec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_ivec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_ivec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_ivec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_ivec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_ivec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_ivec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_ivec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_ivec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_ivec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_ivec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_ivec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_ivec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_ivec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_ivec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_ivec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_uint_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_uint_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_uint_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_uint_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_uint_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_uint_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_uint_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_uint_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_uint_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_uint_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_uint_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_uint_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_uint_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_uint_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_uint_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_uint_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_uint_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_uint_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_uint_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_uint_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_uint_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_uint_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_uint_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_uint_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_uint_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_uint_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_uint_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_uint_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uint_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uint_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uint_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uint_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uint_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uint_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uint_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uint_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uint_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uint_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uint_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uint_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uint_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uint_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uint_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uint_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uint_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uint_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uint_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uint_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uint_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uint_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uint_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uint_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uint_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uint_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uint_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uint_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uint_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uint_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uint_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uint_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uint_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uint_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uint_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uint_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uint_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uint_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uint_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uint_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uint_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uint_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uint_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uint_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uint_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uint_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uint_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uint_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uint_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uint_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uint_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uint_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uint_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uint_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uint_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uint_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_uvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_uvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_uvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_uvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_uvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_uvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_uvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_uvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_uvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_uvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_uvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_uvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_uvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_uvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_uvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_uvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_uvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_uvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_uvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_uvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_uvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_uvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_uvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_uvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_uvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_uvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_uvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_uvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_uvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_uvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_uvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_uvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_uvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_uvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_uvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_uvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_uvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_uvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_uvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_uvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_uvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_uvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_uvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_uvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_uvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_uvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_uvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_uvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_uvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_uvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_uvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_uvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_uvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_uvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_uvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_uvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_uvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_uvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_uvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_uvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_uvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_uvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_uvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_uvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_uvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_uvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_uvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_uvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_uvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_uvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_uvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_uvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_uvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_uvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_uvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_uvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_uvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_uvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_uvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_uvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_uvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_uvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_uvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_uvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_float_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_float_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_float_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_float_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_float_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_float_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_float_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_float_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_float_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_float_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_float_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_float_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_float_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_float_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_float_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_float_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_float_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_float_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_float_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_float_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_float_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_float_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_float_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_float_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_float_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_float_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_float_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_float_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_float_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_float_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_float_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_float_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_float_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_float_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_float_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_float_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_float_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_float_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_float_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_float_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_float_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_float_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_float_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_float_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_float_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_float_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_float_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_float_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_vec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_vec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_vec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_vec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_vec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_vec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_vec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_vec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_vec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_vec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_vec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_vec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_vec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_vec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_vec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_vec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_vec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_vec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_vec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_vec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_vec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_vec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_vec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_vec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_vec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_vec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_vec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_vec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_vec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_vec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_vec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_vec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_vec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_vec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_vec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_vec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_vec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_vec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_vec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_vec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_vec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_vec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_vec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_vec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_vec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_vec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_vec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_vec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_double_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_double_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_double_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_double_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_double_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_double_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_double_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_double_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_double_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_double_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_double_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_double_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_double_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_double_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_double_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_double_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_double_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_double_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_double_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_double_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_double_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_double_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_double_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_double_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_double_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_double_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_double_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_double_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_double_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_double_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_double_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_double_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_double_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_double_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_double_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_double_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_double_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_double_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_double_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_double_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_double_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_double_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_double_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_double_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_double_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_double_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_double_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_double_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_dvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_dvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_dvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_dvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_dvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_dvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_dvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_dvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_dvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_dvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_dvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_dvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_dvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_dvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_dvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_dvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_dvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_dvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_dvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_dvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_dvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_dvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_dvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_dvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_dvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_dvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_dvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_dvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_dvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_dvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_dvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_dvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_dvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_dvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_dvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupadd_dvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_dvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_dvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_dvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmul_dvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_dvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_dvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_dvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmin_dvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_dvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_dvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_dvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupmax_dvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_bool_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_bool_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_bool_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_bool_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_bool_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_bool_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_bool_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_bool_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_bool_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_bool_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_bool_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_bool_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bool_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bool_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bool_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bool_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bool_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bool_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bool_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bool_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bool_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bool_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bool_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bool_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bool_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bool_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bool_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bool_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bool_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bool_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bool_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bool_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bool_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bool_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bool_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bool_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_bvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_bvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_bvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_bvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_bvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_bvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_bvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_bvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_bvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_bvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_bvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_bvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec2_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec2_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec2_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec2_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_bvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_bvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_bvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_bvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_bvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_bvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_bvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_bvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_bvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_bvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_bvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_bvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec3_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec3_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec3_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec3_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_bvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_bvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_bvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupand_bvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_bvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_bvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_bvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupor_bvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_bvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_bvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_bvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupxor_bvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec4_geometry
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec4_vertex
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec4_tess_eval
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec4_tess_control
+KHR-Single-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec4_geometry
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffle_int
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshufflexor_int
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffleup_int
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffledown_int
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffle_ivec2
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshufflexor_ivec2
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffleup_ivec2
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffledown_ivec2
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffle_ivec3
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshufflexor_ivec3
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffleup_ivec3
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffledown_ivec3
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffle_ivec4
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshufflexor_ivec4
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffleup_ivec4
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffledown_ivec4
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffle_uint
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshufflexor_uint
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffleup_uint
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffledown_uint
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffle_uvec2
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshufflexor_uvec2
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffleup_uvec2
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffledown_uvec2
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffle_uvec3
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshufflexor_uvec3
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffleup_uvec3
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffledown_uvec3
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffle_uvec4
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshufflexor_uvec4
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffleup_uvec4
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffledown_uvec4
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffle_float
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshufflexor_float
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffleup_float
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffledown_float
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffle_vec2
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshufflexor_vec2
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffleup_vec2
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffledown_vec2
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffle_vec3
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshufflexor_vec3
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffleup_vec3
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffledown_vec3
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffle_vec4
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshufflexor_vec4
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffleup_vec4
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffledown_vec4
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffle_double
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshufflexor_double
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffleup_double
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffledown_double
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffle_dvec2
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshufflexor_dvec2
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffleup_dvec2
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffledown_dvec2
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffle_dvec3
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshufflexor_dvec3
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffleup_dvec3
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffledown_dvec3
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffle_dvec4
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshufflexor_dvec4
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffleup_dvec4
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffledown_dvec4
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffle_bool
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshufflexor_bool
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffleup_bool
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffledown_bool
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffle_bvec2
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshufflexor_bvec2
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffleup_bvec2
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffledown_bvec2
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffle_bvec3
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshufflexor_bvec3
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffleup_bvec3
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffledown_bvec3
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffle_bvec4
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshufflexor_bvec4
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffleup_bvec4
+KHR-Single-GL45.subgroups.shuffle.graphics.subgroupshuffledown_bvec4
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffle_int
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshufflexor_int
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffleup_int
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffledown_int
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffle_ivec2
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshufflexor_ivec2
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffleup_ivec2
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffledown_ivec2
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffle_ivec3
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshufflexor_ivec3
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffleup_ivec3
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffledown_ivec3
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffle_ivec4
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshufflexor_ivec4
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffleup_ivec4
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffledown_ivec4
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffle_uint
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshufflexor_uint
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffleup_uint
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffledown_uint
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffle_uvec2
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshufflexor_uvec2
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffleup_uvec2
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffledown_uvec2
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffle_uvec3
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshufflexor_uvec3
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffleup_uvec3
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffledown_uvec3
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffle_uvec4
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshufflexor_uvec4
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffleup_uvec4
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffledown_uvec4
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffle_float
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshufflexor_float
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffleup_float
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffledown_float
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffle_vec2
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshufflexor_vec2
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffleup_vec2
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffledown_vec2
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffle_vec3
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshufflexor_vec3
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffleup_vec3
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffledown_vec3
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffle_vec4
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshufflexor_vec4
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffleup_vec4
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffledown_vec4
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffle_double
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshufflexor_double
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffleup_double
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffledown_double
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffle_dvec2
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshufflexor_dvec2
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffleup_dvec2
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffledown_dvec2
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffle_dvec3
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshufflexor_dvec3
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffleup_dvec3
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffledown_dvec3
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffle_dvec4
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshufflexor_dvec4
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffleup_dvec4
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffledown_dvec4
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffle_bool
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshufflexor_bool
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffleup_bool
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffledown_bool
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffle_bvec2
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshufflexor_bvec2
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffleup_bvec2
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffledown_bvec2
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffle_bvec3
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshufflexor_bvec3
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffleup_bvec3
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffledown_bvec3
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffle_bvec4
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshufflexor_bvec4
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffleup_bvec4
+KHR-Single-GL45.subgroups.shuffle.compute.subgroupshuffledown_bvec4
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_int_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_int_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_int_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_int_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_int_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_int_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_int_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_int_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_int_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_int_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_int_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_int_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_int_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_int_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_int_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_int_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_ivec2_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_ivec2_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_ivec2_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_ivec2_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec2_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec2_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec2_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec2_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec2_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec2_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec2_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec2_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec2_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec2_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec2_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec2_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_ivec3_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_ivec3_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_ivec3_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_ivec3_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec3_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec3_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec3_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec3_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec3_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec3_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec3_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec3_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec3_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec3_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec3_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec3_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_ivec4_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_ivec4_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_ivec4_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_ivec4_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec4_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec4_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec4_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec4_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec4_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec4_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec4_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec4_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec4_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec4_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec4_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec4_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uint_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uint_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uint_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uint_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uint_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uint_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uint_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uint_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uint_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uint_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uint_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uint_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uint_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uint_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uint_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uint_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uvec2_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uvec2_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uvec2_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uvec2_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec2_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec2_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec2_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec2_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec2_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec2_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec2_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec2_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec2_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec2_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec2_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec2_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uvec3_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uvec3_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uvec3_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uvec3_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec3_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec3_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec3_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec3_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec3_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec3_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec3_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec3_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec3_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec3_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec3_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec3_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uvec4_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uvec4_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uvec4_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uvec4_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec4_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec4_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec4_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec4_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec4_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec4_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec4_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec4_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec4_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec4_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec4_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec4_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_float_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_float_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_float_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_float_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_float_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_float_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_float_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_float_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_float_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_float_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_float_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_float_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_float_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_float_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_float_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_float_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_vec2_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_vec2_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_vec2_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_vec2_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_vec2_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_vec2_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_vec2_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_vec2_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_vec2_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_vec2_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_vec2_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_vec2_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_vec2_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_vec2_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_vec2_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_vec2_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_vec3_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_vec3_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_vec3_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_vec3_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_vec3_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_vec3_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_vec3_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_vec3_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_vec3_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_vec3_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_vec3_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_vec3_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_vec3_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_vec3_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_vec3_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_vec3_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_vec4_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_vec4_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_vec4_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_vec4_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_vec4_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_vec4_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_vec4_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_vec4_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_vec4_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_vec4_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_vec4_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_vec4_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_vec4_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_vec4_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_vec4_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_vec4_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_double_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_double_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_double_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_double_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_double_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_double_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_double_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_double_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_double_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_double_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_double_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_double_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_double_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_double_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_double_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_double_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_dvec2_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_dvec2_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_dvec2_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_dvec2_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec2_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec2_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec2_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec2_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec2_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec2_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec2_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec2_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec2_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec2_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec2_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec2_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_dvec3_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_dvec3_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_dvec3_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_dvec3_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec3_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec3_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec3_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec3_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec3_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec3_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec3_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec3_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec3_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec3_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec3_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec3_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_dvec4_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_dvec4_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_dvec4_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_dvec4_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec4_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec4_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec4_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec4_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec4_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec4_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec4_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec4_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec4_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec4_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec4_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec4_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bool_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bool_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bool_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bool_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bool_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bool_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bool_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bool_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bool_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bool_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bool_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bool_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bool_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bool_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bool_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bool_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bvec2_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bvec2_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bvec2_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bvec2_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec2_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec2_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec2_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec2_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec2_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec2_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec2_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec2_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec2_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec2_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec2_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec2_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bvec3_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bvec3_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bvec3_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bvec3_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec3_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec3_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec3_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec3_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec3_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec3_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec3_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec3_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec3_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec3_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec3_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec3_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bvec4_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bvec4_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bvec4_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bvec4_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec4_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec4_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec4_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec4_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec4_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec4_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec4_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec4_geometry
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec4_vertex
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec4_tess_eval
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec4_tess_control
+KHR-Single-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec4_geometry
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_int
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_int
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapvertical_int
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_int
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_ivec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_ivec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapvertical_ivec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_ivec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_ivec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_ivec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapvertical_ivec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_ivec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_ivec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_ivec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapvertical_ivec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_ivec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_uint
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_uint
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapvertical_uint
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_uint
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_uvec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_uvec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapvertical_uvec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_uvec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_uvec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_uvec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapvertical_uvec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_uvec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_uvec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_uvec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapvertical_uvec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_uvec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_float
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_float
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapvertical_float
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_float
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_vec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_vec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapvertical_vec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_vec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_vec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_vec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapvertical_vec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_vec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_vec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_vec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapvertical_vec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_vec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_double
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_double
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapvertical_double
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_double
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_dvec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_dvec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapvertical_dvec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_dvec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_dvec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_dvec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapvertical_dvec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_dvec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_dvec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_dvec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapvertical_dvec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_dvec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_bool
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_bool
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapvertical_bool
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_bool
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_bvec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_bvec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapvertical_bvec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_bvec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_bvec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_bvec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapvertical_bvec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_bvec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_bvec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_bvec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapvertical_bvec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_bvec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_int
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_ivec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_ivec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_ivec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_uint
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_uvec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_uvec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_uvec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_float
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_vec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_vec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_vec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_double
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_dvec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_dvec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_dvec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_bool
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_bvec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_bvec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_bvec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_int
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_ivec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_ivec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_ivec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_uint
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_uvec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_uvec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_uvec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_float
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_vec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_vec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_vec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_double
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_dvec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_dvec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_dvec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_bool
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_bvec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_bvec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_bvec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_int
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_ivec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_ivec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_ivec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_uint
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_uvec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_uvec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_uvec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_float
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_vec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_vec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_vec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_double
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_dvec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_dvec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_dvec4
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_bool
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_bvec2
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_bvec3
+KHR-Single-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_bvec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_int
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_int
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapvertical_int
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_int
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_ivec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_ivec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapvertical_ivec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_ivec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_ivec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_ivec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapvertical_ivec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_ivec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_ivec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_ivec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapvertical_ivec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_ivec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_uint
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_uint
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapvertical_uint
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_uint
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_uvec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_uvec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapvertical_uvec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_uvec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_uvec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_uvec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapvertical_uvec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_uvec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_uvec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_uvec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapvertical_uvec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_uvec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_float
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_float
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapvertical_float
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_float
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_vec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_vec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapvertical_vec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_vec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_vec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_vec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapvertical_vec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_vec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_vec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_vec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapvertical_vec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_vec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_double
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_double
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapvertical_double
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_double
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_dvec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_dvec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapvertical_dvec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_dvec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_dvec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_dvec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapvertical_dvec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_dvec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_dvec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_dvec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapvertical_dvec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_dvec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_bool
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_bool
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapvertical_bool
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_bool
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_bvec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_bvec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapvertical_bvec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_bvec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_bvec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_bvec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapvertical_bvec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_bvec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_bvec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_bvec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapvertical_bvec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_bvec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_int
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_ivec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_ivec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_ivec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_uint
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_uvec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_uvec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_uvec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_float
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_vec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_vec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_vec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_double
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_dvec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_dvec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_dvec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_bool
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_bvec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_bvec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_bvec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_int
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_ivec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_ivec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_ivec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_uint
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_uvec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_uvec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_uvec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_float
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_vec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_vec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_vec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_double
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_dvec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_dvec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_dvec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_bool
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_bvec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_bvec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_bvec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_int
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_ivec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_ivec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_ivec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_uint
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_uvec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_uvec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_uvec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_float
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_vec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_vec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_vec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_double
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_dvec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_dvec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_dvec4
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_bool
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_bvec2
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_bvec3
+KHR-Single-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_bvec4
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_int_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_int_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_int_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_int_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_int_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_int_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_int_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_int_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_int_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_int_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_int_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_int_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_int_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_int_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_int_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_int_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uint_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uint_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uint_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uint_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uint_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uint_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uint_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uint_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uint_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uint_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uint_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uint_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uint_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uint_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uint_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uint_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_float_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_float_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_float_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_float_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_float_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_float_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_float_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_float_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_float_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_float_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_float_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_float_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_float_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_float_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_float_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_float_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_vec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_vec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_vec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_vec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_vec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_vec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_vec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_vec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_vec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_vec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_vec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_vec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_double_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_double_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_double_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_double_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_double_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_double_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_double_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_double_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_double_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_double_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_double_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_double_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_double_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_double_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_double_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_double_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bool_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bool_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bool_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bool_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bool_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bool_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bool_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bool_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bool_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bool_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bool_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bool_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bool_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bool_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bool_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bool_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_int_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_int_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_int_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_int_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uint_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uint_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uint_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uint_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_float_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_float_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_float_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_float_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_double_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_double_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_double_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_double_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bool_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bool_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bool_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bool_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_int_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_int_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_int_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_int_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uint_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uint_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uint_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uint_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_float_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_float_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_float_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_float_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_double_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_double_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_double_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_double_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bool_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bool_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bool_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bool_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_int_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_int_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_int_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_int_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uint_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uint_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uint_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uint_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_float_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_float_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_float_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_float_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_double_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_double_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_double_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_double_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec4_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bool_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bool_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bool_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bool_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec2_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec2_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec2_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec2_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec3_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec3_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec3_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec3_geometry
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec4_vertex
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec4_tess_eval
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec4_tess_control
+KHR-Single-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec4_geometry
+KHR-Single-GL45.subgroups.shape.graphics.clustered
+KHR-Single-GL45.subgroups.shape.graphics.quad
+KHR-Single-GL45.subgroups.shape.compute.clustered
+KHR-Single-GL45.subgroups.shape.compute.quad
+KHR-Single-GL45.subgroups.shape.framebuffer.clustered_vertex
+KHR-Single-GL45.subgroups.shape.framebuffer.clustered_tess_eval
+KHR-Single-GL45.subgroups.shape.framebuffer.clustered_tess_control
+KHR-Single-GL45.subgroups.shape.framebuffer.clustered_geometry
+KHR-Single-GL45.subgroups.shape.framebuffer.quad_vertex
+KHR-Single-GL45.subgroups.shape.framebuffer.quad_tess_eval
+KHR-Single-GL45.subgroups.shape.framebuffer.quad_tess_control
+KHR-Single-GL45.subgroups.shape.framebuffer.quad_geometry
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass_single/4.6.1.x/gl46-khr-single.txt b/external/openglcts/data/mustpass/gl/khronos_mustpass_single/4.6.1.x/gl46-khr-single.txt
new file mode 100644
index 0000000..a0a128a
--- /dev/null
+++ b/external/openglcts/data/mustpass/gl/khronos_mustpass_single/4.6.1.x/gl46-khr-single.txt
@@ -0,0 +1,6053 @@
+KHR-Single-GL46.subgroups.builtin_var.graphics.subgroupsize
+KHR-Single-GL46.subgroups.builtin_var.graphics.subgroupinvocationid
+KHR-Single-GL46.subgroups.builtin_var.compute.subgroupsize_compute
+KHR-Single-GL46.subgroups.builtin_var.compute.subgroupinvocationid_compute
+KHR-Single-GL46.subgroups.builtin_var.compute.numsubgroups
+KHR-Single-GL46.subgroups.builtin_var.compute.subgroupid
+KHR-Single-GL46.subgroups.builtin_var.framebuffer.subgroupsize_vertex
+KHR-Single-GL46.subgroups.builtin_var.framebuffer.subgroupsize_tess_eval
+KHR-Single-GL46.subgroups.builtin_var.framebuffer.subgroupsize_tess_control
+KHR-Single-GL46.subgroups.builtin_var.framebuffer.subgroupsize_geometry
+KHR-Single-GL46.subgroups.builtin_var.framebuffer.subgroupinvocationid_vertex
+KHR-Single-GL46.subgroups.builtin_var.framebuffer.subgroupinvocationid_tess_eval
+KHR-Single-GL46.subgroups.builtin_var.framebuffer.subgroupinvocationid_tess_control
+KHR-Single-GL46.subgroups.builtin_var.framebuffer.subgroupinvocationid_geometry
+KHR-Single-GL46.subgroups.builtin_mask_var.graphics.subgroupeqmask
+KHR-Single-GL46.subgroups.builtin_mask_var.graphics.subgroupgemask
+KHR-Single-GL46.subgroups.builtin_mask_var.graphics.subgroupgtmask
+KHR-Single-GL46.subgroups.builtin_mask_var.graphics.subgrouplemask
+KHR-Single-GL46.subgroups.builtin_mask_var.graphics.subgroupltmask
+KHR-Single-GL46.subgroups.builtin_mask_var.compute.subgroupeqmask
+KHR-Single-GL46.subgroups.builtin_mask_var.compute.subgroupgemask
+KHR-Single-GL46.subgroups.builtin_mask_var.compute.subgroupgtmask
+KHR-Single-GL46.subgroups.builtin_mask_var.compute.subgrouplemask
+KHR-Single-GL46.subgroups.builtin_mask_var.compute.subgroupltmask
+KHR-Single-GL46.subgroups.builtin_mask_var.framebuffer.subgroupeqmask_vertex
+KHR-Single-GL46.subgroups.builtin_mask_var.framebuffer.subgroupeqmask_tess_eval
+KHR-Single-GL46.subgroups.builtin_mask_var.framebuffer.subgroupeqmask_tess_control
+KHR-Single-GL46.subgroups.builtin_mask_var.framebuffer.subgroupeqmask_geometry
+KHR-Single-GL46.subgroups.builtin_mask_var.framebuffer.subgroupgemask_vertex
+KHR-Single-GL46.subgroups.builtin_mask_var.framebuffer.subgroupgemask_tess_eval
+KHR-Single-GL46.subgroups.builtin_mask_var.framebuffer.subgroupgemask_tess_control
+KHR-Single-GL46.subgroups.builtin_mask_var.framebuffer.subgroupgemask_geometry
+KHR-Single-GL46.subgroups.builtin_mask_var.framebuffer.subgroupgtmask_vertex
+KHR-Single-GL46.subgroups.builtin_mask_var.framebuffer.subgroupgtmask_tess_eval
+KHR-Single-GL46.subgroups.builtin_mask_var.framebuffer.subgroupgtmask_tess_control
+KHR-Single-GL46.subgroups.builtin_mask_var.framebuffer.subgroupgtmask_geometry
+KHR-Single-GL46.subgroups.builtin_mask_var.framebuffer.subgrouplemask_vertex
+KHR-Single-GL46.subgroups.builtin_mask_var.framebuffer.subgrouplemask_tess_eval
+KHR-Single-GL46.subgroups.builtin_mask_var.framebuffer.subgrouplemask_tess_control
+KHR-Single-GL46.subgroups.builtin_mask_var.framebuffer.subgrouplemask_geometry
+KHR-Single-GL46.subgroups.builtin_mask_var.framebuffer.subgroupltmask_vertex
+KHR-Single-GL46.subgroups.builtin_mask_var.framebuffer.subgroupltmask_tess_eval
+KHR-Single-GL46.subgroups.builtin_mask_var.framebuffer.subgroupltmask_tess_control
+KHR-Single-GL46.subgroups.builtin_mask_var.framebuffer.subgroupltmask_geometry
+KHR-Single-GL46.subgroups.basic.graphics.subgroupelect
+KHR-Single-GL46.subgroups.basic.graphics.subgroupbarrier
+KHR-Single-GL46.subgroups.basic.graphics.subgroupmemorybarrier
+KHR-Single-GL46.subgroups.basic.graphics.subgroupmemorybarrierbuffer
+KHR-Single-GL46.subgroups.basic.graphics.subgroupmemorybarrierimage
+KHR-Single-GL46.subgroups.basic.compute.subgroupelect
+KHR-Single-GL46.subgroups.basic.compute.subgroupbarrier
+KHR-Single-GL46.subgroups.basic.compute.subgroupmemorybarrier
+KHR-Single-GL46.subgroups.basic.compute.subgroupmemorybarrierbuffer
+KHR-Single-GL46.subgroups.basic.compute.subgroupmemorybarriershared
+KHR-Single-GL46.subgroups.basic.compute.subgroupmemorybarrierimage
+KHR-Single-GL46.subgroups.basic.framebuffer.subgroupelect_vertex
+KHR-Single-GL46.subgroups.basic.framebuffer.subgroupelect_tess_eval
+KHR-Single-GL46.subgroups.basic.framebuffer.subgroupelect_tess_control
+KHR-Single-GL46.subgroups.basic.framebuffer.subgroupelect_geometry
+KHR-Single-GL46.subgroups.basic.framebuffer.subgroupbarrier_fragment
+KHR-Single-GL46.subgroups.basic.framebuffer.subgroupbarrier_vertex
+KHR-Single-GL46.subgroups.basic.framebuffer.subgroupbarrier_tess_eval
+KHR-Single-GL46.subgroups.basic.framebuffer.subgroupbarrier_tess_control
+KHR-Single-GL46.subgroups.basic.framebuffer.subgroupbarrier_geometry
+KHR-Single-GL46.subgroups.basic.framebuffer.subgroupmemorybarrier_fragment
+KHR-Single-GL46.subgroups.basic.framebuffer.subgroupmemorybarrier_vertex
+KHR-Single-GL46.subgroups.basic.framebuffer.subgroupmemorybarrier_tess_eval
+KHR-Single-GL46.subgroups.basic.framebuffer.subgroupmemorybarrier_tess_control
+KHR-Single-GL46.subgroups.basic.framebuffer.subgroupmemorybarrier_geometry
+KHR-Single-GL46.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_fragment
+KHR-Single-GL46.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_vertex
+KHR-Single-GL46.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_tess_eval
+KHR-Single-GL46.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_tess_control
+KHR-Single-GL46.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_geometry
+KHR-Single-GL46.subgroups.basic.framebuffer.subgroupmemorybarrierimage_fragment
+KHR-Single-GL46.subgroups.basic.framebuffer.subgroupmemorybarrierimage_vertex
+KHR-Single-GL46.subgroups.basic.framebuffer.subgroupmemorybarrierimage_tess_eval
+KHR-Single-GL46.subgroups.basic.framebuffer.subgroupmemorybarrierimage_tess_control
+KHR-Single-GL46.subgroups.basic.framebuffer.subgroupmemorybarrierimage_geometry
+KHR-Single-GL46.subgroups.vote.graphics.subgroupallequal_int
+KHR-Single-GL46.subgroups.vote.graphics.subgroupallequal_ivec2
+KHR-Single-GL46.subgroups.vote.graphics.subgroupallequal_ivec3
+KHR-Single-GL46.subgroups.vote.graphics.subgroupallequal_ivec4
+KHR-Single-GL46.subgroups.vote.graphics.subgroupall_uint
+KHR-Single-GL46.subgroups.vote.graphics.subgroupany_uint
+KHR-Single-GL46.subgroups.vote.graphics.subgroupallequal_uint
+KHR-Single-GL46.subgroups.vote.graphics.subgroupallequal_uvec2
+KHR-Single-GL46.subgroups.vote.graphics.subgroupallequal_uvec3
+KHR-Single-GL46.subgroups.vote.graphics.subgroupallequal_uvec4
+KHR-Single-GL46.subgroups.vote.graphics.subgroupallequal_float
+KHR-Single-GL46.subgroups.vote.graphics.subgroupallequal_vec2
+KHR-Single-GL46.subgroups.vote.graphics.subgroupallequal_vec3
+KHR-Single-GL46.subgroups.vote.graphics.subgroupallequal_vec4
+KHR-Single-GL46.subgroups.vote.graphics.subgroupallequal_double
+KHR-Single-GL46.subgroups.vote.graphics.subgroupallequal_dvec2
+KHR-Single-GL46.subgroups.vote.graphics.subgroupallequal_dvec3
+KHR-Single-GL46.subgroups.vote.graphics.subgroupallequal_dvec4
+KHR-Single-GL46.subgroups.vote.graphics.subgroupallequal_bool
+KHR-Single-GL46.subgroups.vote.graphics.subgroupallequal_bvec2
+KHR-Single-GL46.subgroups.vote.graphics.subgroupallequal_bvec3
+KHR-Single-GL46.subgroups.vote.graphics.subgroupallequal_bvec4
+KHR-Single-GL46.subgroups.vote.compute.subgroupallequal_int
+KHR-Single-GL46.subgroups.vote.compute.subgroupallequal_ivec2
+KHR-Single-GL46.subgroups.vote.compute.subgroupallequal_ivec3
+KHR-Single-GL46.subgroups.vote.compute.subgroupallequal_ivec4
+KHR-Single-GL46.subgroups.vote.compute.subgroupall_uint
+KHR-Single-GL46.subgroups.vote.compute.subgroupany_uint
+KHR-Single-GL46.subgroups.vote.compute.subgroupallequal_uint
+KHR-Single-GL46.subgroups.vote.compute.subgroupallequal_uvec2
+KHR-Single-GL46.subgroups.vote.compute.subgroupallequal_uvec3
+KHR-Single-GL46.subgroups.vote.compute.subgroupallequal_uvec4
+KHR-Single-GL46.subgroups.vote.compute.subgroupallequal_float
+KHR-Single-GL46.subgroups.vote.compute.subgroupallequal_vec2
+KHR-Single-GL46.subgroups.vote.compute.subgroupallequal_vec3
+KHR-Single-GL46.subgroups.vote.compute.subgroupallequal_vec4
+KHR-Single-GL46.subgroups.vote.compute.subgroupallequal_double
+KHR-Single-GL46.subgroups.vote.compute.subgroupallequal_dvec2
+KHR-Single-GL46.subgroups.vote.compute.subgroupallequal_dvec3
+KHR-Single-GL46.subgroups.vote.compute.subgroupallequal_dvec4
+KHR-Single-GL46.subgroups.vote.compute.subgroupallequal_bool
+KHR-Single-GL46.subgroups.vote.compute.subgroupallequal_bvec2
+KHR-Single-GL46.subgroups.vote.compute.subgroupallequal_bvec3
+KHR-Single-GL46.subgroups.vote.compute.subgroupallequal_bvec4
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_int_vertex
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_int_tess_eval
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_int_tess_control
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_int_geometry
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_ivec2_vertex
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_ivec2_tess_eval
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_ivec2_tess_control
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_ivec2_geometry
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_ivec3_vertex
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_ivec3_tess_eval
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_ivec3_tess_control
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_ivec3_geometry
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_ivec4_vertex
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_ivec4_tess_eval
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_ivec4_tess_control
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_ivec4_geometry
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupall_uint_vertex
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupall_uint_tess_eval
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupall_uint_tess_control
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupall_uint_geometry
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupany_uint_vertex
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupany_uint_tess_eval
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupany_uint_tess_control
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupany_uint_geometry
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_uint_vertex
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_uint_tess_eval
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_uint_tess_control
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_uint_geometry
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_uvec2_vertex
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_uvec2_tess_eval
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_uvec2_tess_control
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_uvec2_geometry
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_uvec3_vertex
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_uvec3_tess_eval
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_uvec3_tess_control
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_uvec3_geometry
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_uvec4_vertex
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_uvec4_tess_eval
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_uvec4_tess_control
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_uvec4_geometry
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_float_vertex
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_float_tess_eval
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_float_tess_control
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_float_geometry
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_vec2_vertex
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_vec2_tess_eval
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_vec2_tess_control
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_vec2_geometry
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_vec3_vertex
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_vec3_tess_eval
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_vec3_tess_control
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_vec3_geometry
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_vec4_vertex
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_vec4_tess_eval
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_vec4_tess_control
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_vec4_geometry
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_double_vertex
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_double_tess_eval
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_double_tess_control
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_double_geometry
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_dvec2_vertex
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_dvec2_tess_eval
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_dvec2_tess_control
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_dvec2_geometry
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_dvec3_vertex
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_dvec3_tess_eval
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_dvec3_tess_control
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_dvec3_geometry
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_dvec4_vertex
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_dvec4_tess_eval
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_dvec4_tess_control
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_dvec4_geometry
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_bool_vertex
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_bool_tess_eval
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_bool_tess_control
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_bool_geometry
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_bvec2_vertex
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_bvec2_tess_eval
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_bvec2_tess_control
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_bvec2_geometry
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_bvec3_vertex
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_bvec3_tess_eval
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_bvec3_tess_control
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_bvec3_geometry
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_bvec4_vertex
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_bvec4_tess_eval
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_bvec4_tess_control
+KHR-Single-GL46.subgroups.vote.framebuffer.subgroupallequal_bvec4_geometry
+KHR-Single-GL46.subgroups.vote.frag_helper.subgroupallequal_int_fragment
+KHR-Single-GL46.subgroups.vote.frag_helper.subgroupallequal_ivec2_fragment
+KHR-Single-GL46.subgroups.vote.frag_helper.subgroupallequal_ivec3_fragment
+KHR-Single-GL46.subgroups.vote.frag_helper.subgroupallequal_ivec4_fragment
+KHR-Single-GL46.subgroups.vote.frag_helper.subgroupall_uint_fragment
+KHR-Single-GL46.subgroups.vote.frag_helper.subgroupany_uint_fragment
+KHR-Single-GL46.subgroups.vote.frag_helper.subgroupallequal_uint_fragment
+KHR-Single-GL46.subgroups.vote.frag_helper.subgroupallequal_uvec2_fragment
+KHR-Single-GL46.subgroups.vote.frag_helper.subgroupallequal_uvec3_fragment
+KHR-Single-GL46.subgroups.vote.frag_helper.subgroupallequal_uvec4_fragment
+KHR-Single-GL46.subgroups.vote.frag_helper.subgroupallequal_float_fragment
+KHR-Single-GL46.subgroups.vote.frag_helper.subgroupallequal_vec2_fragment
+KHR-Single-GL46.subgroups.vote.frag_helper.subgroupallequal_vec3_fragment
+KHR-Single-GL46.subgroups.vote.frag_helper.subgroupallequal_vec4_fragment
+KHR-Single-GL46.subgroups.vote.frag_helper.subgroupallequal_double_fragment
+KHR-Single-GL46.subgroups.vote.frag_helper.subgroupallequal_dvec2_fragment
+KHR-Single-GL46.subgroups.vote.frag_helper.subgroupallequal_dvec3_fragment
+KHR-Single-GL46.subgroups.vote.frag_helper.subgroupallequal_dvec4_fragment
+KHR-Single-GL46.subgroups.vote.frag_helper.subgroupallequal_bool_fragment
+KHR-Single-GL46.subgroups.vote.frag_helper.subgroupallequal_bvec2_fragment
+KHR-Single-GL46.subgroups.vote.frag_helper.subgroupallequal_bvec3_fragment
+KHR-Single-GL46.subgroups.vote.frag_helper.subgroupallequal_bvec4_fragment
+KHR-Single-GL46.subgroups.ballot.graphics.graphic
+KHR-Single-GL46.subgroups.ballot.compute.compute
+KHR-Single-GL46.subgroups.ballot.framebuffer.tess_eval
+KHR-Single-GL46.subgroups.ballot.framebuffer.tess_control
+KHR-Single-GL46.subgroups.ballot.framebuffer.geometry
+KHR-Single-GL46.subgroups.ballot.framebuffer.vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_int
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_int
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_ivec2
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_ivec2
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_ivec3
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_ivec3
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_ivec4
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_ivec4
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_uint
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_uint
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_uvec2
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_uvec2
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_uvec3
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_uvec3
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_uvec4
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_uvec4
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_float
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_float
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_vec2
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_vec2
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_vec3
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_vec3
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_vec4
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_vec4
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_double
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_double
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_dvec2
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_dvec2
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_dvec3
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_dvec3
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_dvec4
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_dvec4
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_bool
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_bool
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_bvec2
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_bvec2
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_bvec3
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_bvec3
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_bvec4
+KHR-Single-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_bvec4
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_int
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_int
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_ivec2
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_ivec2
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_ivec3
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_ivec3
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_ivec4
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_ivec4
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_uint
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_uint
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_uvec2
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_uvec2
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_uvec3
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_uvec3
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_uvec4
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_uvec4
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_float
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_float
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_vec2
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_vec2
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_vec3
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_vec3
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_vec4
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_vec4
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_double
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_double
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_dvec2
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_dvec2
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_dvec3
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_dvec3
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_dvec4
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_dvec4
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_bool
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_bool
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_bvec2
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_bvec2
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_bvec3
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_bvec3
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_bvec4
+KHR-Single-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_bvec4
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_intvertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_inttess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_inttess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_intgeometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_intvertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_inttess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_inttess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_intgeometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec2vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec2tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec2tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec2geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec2vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec2tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec2tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec2geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec3vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec3tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec3tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec3geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec3vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec3tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec3tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec3geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec4vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec4tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec4tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec4geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec4vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec4tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec4tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec4geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uintvertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uinttess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uinttess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uintgeometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uintvertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uinttess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uinttess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uintgeometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec2vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec2tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec2tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec2geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec2vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec2tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec2tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec2geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec3vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec3tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec3tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec3geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec3vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec3tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec3tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec3geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec4vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec4tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec4tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec4geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec4vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec4tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec4tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec4geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_floatvertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_floattess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_floattess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_floatgeometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_floatvertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_floattess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_floattess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_floatgeometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec2vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec2tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec2tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec2geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec2vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec2tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec2tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec2geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec3vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec3tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec3tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec3geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec3vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec3tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec3tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec3geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec4vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec4tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec4tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec4geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec4vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec4tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec4tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec4geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_doublevertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_doubletess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_doubletess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_doublegeometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_doublevertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_doubletess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_doubletess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_doublegeometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec2vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec2tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec2tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec2geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec2vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec2tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec2tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec2geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec3vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec3tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec3tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec3geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec3vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec3tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec3tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec3geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec4vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec4tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec4tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec4geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec4vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec4tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec4tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec4geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_boolvertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_booltess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_booltess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_boolgeometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_boolvertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_booltess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_booltess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_boolgeometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec2vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec2tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec2tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec2geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec2vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec2tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec2tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec2geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec3vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec3tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec3tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec3geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec3vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec3tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec3tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec3geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec4vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec4tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec4tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec4geometry
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec4vertex
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec4tess_eval
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec4tess_control
+KHR-Single-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec4geometry
+KHR-Single-GL46.subgroups.ballot_other.graphics.subgroupinverseballot
+KHR-Single-GL46.subgroups.ballot_other.graphics.subgroupballotbitextract
+KHR-Single-GL46.subgroups.ballot_other.graphics.subgroupballotbitcount
+KHR-Single-GL46.subgroups.ballot_other.graphics.subgroupballotinclusivebitcount
+KHR-Single-GL46.subgroups.ballot_other.graphics.subgroupballotexclusivebitcount
+KHR-Single-GL46.subgroups.ballot_other.graphics.subgroupballotfindlsb
+KHR-Single-GL46.subgroups.ballot_other.graphics.subgroupballotfindmsb
+KHR-Single-GL46.subgroups.ballot_other.compute.subgroupinverseballot
+KHR-Single-GL46.subgroups.ballot_other.compute.subgroupballotbitextract
+KHR-Single-GL46.subgroups.ballot_other.compute.subgroupballotbitcount
+KHR-Single-GL46.subgroups.ballot_other.compute.subgroupballotinclusivebitcount
+KHR-Single-GL46.subgroups.ballot_other.compute.subgroupballotexclusivebitcount
+KHR-Single-GL46.subgroups.ballot_other.compute.subgroupballotfindlsb
+KHR-Single-GL46.subgroups.ballot_other.compute.subgroupballotfindmsb
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupinverseballot_vertex
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupinverseballot_tess_eval
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupinverseballot_tess_control
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupinverseballot_geometry
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupballotbitextract_vertex
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupballotbitextract_tess_eval
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupballotbitextract_tess_control
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupballotbitextract_geometry
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupballotbitcount_vertex
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupballotbitcount_tess_eval
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupballotbitcount_tess_control
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupballotbitcount_geometry
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupballotinclusivebitcount_vertex
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupballotinclusivebitcount_tess_eval
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupballotinclusivebitcount_tess_control
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupballotinclusivebitcount_geometry
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupballotexclusivebitcount_vertex
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupballotexclusivebitcount_tess_eval
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupballotexclusivebitcount_tess_control
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupballotexclusivebitcount_geometry
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupballotfindlsb_vertex
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupballotfindlsb_tess_eval
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupballotfindlsb_tess_control
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupballotfindlsb_geometry
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupballotfindmsb_vertex
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupballotfindmsb_tess_eval
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupballotfindmsb_tess_control
+KHR-Single-GL46.subgroups.ballot_other.framebuffer.subgroupballotfindmsb_geometry
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupadd_int
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmul_int
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmin_int
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmax_int
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupand_int
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupor_int
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupxor_int
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_int
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_int
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_int
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_int
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveand_int
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveor_int
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivexor_int
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_int
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_int
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_int
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_int
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveand_int
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveor_int
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivexor_int
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupadd_ivec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmul_ivec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmin_ivec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmax_ivec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupand_ivec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupor_ivec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupxor_ivec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_ivec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_ivec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_ivec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_ivec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveand_ivec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveor_ivec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivexor_ivec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_ivec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_ivec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_ivec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_ivec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveand_ivec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveor_ivec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivexor_ivec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupadd_ivec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmul_ivec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmin_ivec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmax_ivec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupand_ivec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupor_ivec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupxor_ivec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_ivec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_ivec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_ivec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_ivec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveand_ivec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveor_ivec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivexor_ivec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_ivec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_ivec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_ivec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_ivec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveand_ivec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveor_ivec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivexor_ivec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupadd_ivec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmul_ivec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmin_ivec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmax_ivec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupand_ivec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupor_ivec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupxor_ivec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_ivec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_ivec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_ivec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_ivec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveand_ivec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveor_ivec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivexor_ivec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_ivec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_ivec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_ivec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_ivec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveand_ivec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveor_ivec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivexor_ivec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupadd_uint
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmul_uint
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmin_uint
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmax_uint
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupand_uint
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupor_uint
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupxor_uint
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_uint
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_uint
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_uint
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_uint
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveand_uint
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveor_uint
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivexor_uint
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_uint
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_uint
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_uint
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_uint
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveand_uint
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveor_uint
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivexor_uint
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupadd_uvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmul_uvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmin_uvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmax_uvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupand_uvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupor_uvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupxor_uvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_uvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_uvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_uvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_uvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveand_uvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveor_uvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivexor_uvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_uvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_uvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_uvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_uvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveand_uvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveor_uvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivexor_uvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupadd_uvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmul_uvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmin_uvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmax_uvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupand_uvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupor_uvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupxor_uvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_uvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_uvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_uvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_uvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveand_uvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveor_uvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivexor_uvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_uvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_uvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_uvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_uvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveand_uvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveor_uvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivexor_uvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupadd_uvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmul_uvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmin_uvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmax_uvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupand_uvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupor_uvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupxor_uvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_uvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_uvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_uvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_uvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveand_uvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveor_uvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivexor_uvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_uvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_uvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_uvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_uvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveand_uvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveor_uvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivexor_uvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupadd_float
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmul_float
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmin_float
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmax_float
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_float
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_float
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_float
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_float
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_float
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_float
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_float
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_float
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupadd_vec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmul_vec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmin_vec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmax_vec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_vec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_vec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_vec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_vec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_vec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_vec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_vec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_vec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupadd_vec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmul_vec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmin_vec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmax_vec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_vec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_vec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_vec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_vec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_vec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_vec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_vec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_vec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupadd_vec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmul_vec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmin_vec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmax_vec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_vec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_vec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_vec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_vec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_vec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_vec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_vec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_vec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupadd_double
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmul_double
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmin_double
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmax_double
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_double
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_double
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_double
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_double
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_double
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_double
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_double
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_double
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupadd_dvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmul_dvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmin_dvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmax_dvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_dvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_dvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_dvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_dvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_dvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_dvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_dvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_dvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupadd_dvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmul_dvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmin_dvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmax_dvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_dvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_dvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_dvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_dvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_dvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_dvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_dvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_dvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupadd_dvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmul_dvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmin_dvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupmax_dvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_dvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_dvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_dvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_dvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_dvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_dvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_dvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_dvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupand_bool
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupor_bool
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupxor_bool
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveand_bool
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveor_bool
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivexor_bool
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveand_bool
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveor_bool
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivexor_bool
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupand_bvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupor_bvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupxor_bvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveand_bvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveor_bvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivexor_bvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveand_bvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveor_bvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivexor_bvec2
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupand_bvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupor_bvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupxor_bvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveand_bvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveor_bvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivexor_bvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveand_bvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveor_bvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivexor_bvec3
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupand_bvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupor_bvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupxor_bvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveand_bvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusiveor_bvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupinclusivexor_bvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveand_bvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusiveor_bvec4
+KHR-Single-GL46.subgroups.arithmetic.graphics.subgroupexclusivexor_bvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupadd_int
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmul_int
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmin_int
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmax_int
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupand_int
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupor_int
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupxor_int
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_int
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_int
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_int
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_int
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveand_int
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveor_int
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivexor_int
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_int
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_int
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_int
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_int
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveand_int
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveor_int
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivexor_int
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupadd_ivec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmul_ivec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmin_ivec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmax_ivec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupand_ivec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupor_ivec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupxor_ivec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_ivec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_ivec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_ivec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_ivec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveand_ivec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveor_ivec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivexor_ivec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_ivec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_ivec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_ivec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_ivec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveand_ivec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveor_ivec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivexor_ivec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupadd_ivec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmul_ivec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmin_ivec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmax_ivec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupand_ivec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupor_ivec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupxor_ivec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_ivec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_ivec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_ivec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_ivec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveand_ivec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveor_ivec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivexor_ivec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_ivec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_ivec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_ivec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_ivec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveand_ivec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveor_ivec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivexor_ivec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupadd_ivec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmul_ivec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmin_ivec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmax_ivec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupand_ivec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupor_ivec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupxor_ivec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_ivec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_ivec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_ivec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_ivec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveand_ivec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveor_ivec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivexor_ivec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_ivec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_ivec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_ivec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_ivec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveand_ivec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveor_ivec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivexor_ivec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupadd_uint
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmul_uint
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmin_uint
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmax_uint
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupand_uint
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupor_uint
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupxor_uint
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_uint
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_uint
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_uint
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_uint
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveand_uint
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveor_uint
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivexor_uint
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_uint
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_uint
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_uint
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_uint
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveand_uint
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveor_uint
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivexor_uint
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupadd_uvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmul_uvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmin_uvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmax_uvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupand_uvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupor_uvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupxor_uvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_uvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_uvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_uvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_uvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveand_uvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveor_uvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivexor_uvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_uvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_uvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_uvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_uvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveand_uvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveor_uvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivexor_uvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupadd_uvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmul_uvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmin_uvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmax_uvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupand_uvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupor_uvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupxor_uvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_uvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_uvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_uvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_uvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveand_uvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveor_uvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivexor_uvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_uvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_uvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_uvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_uvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveand_uvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveor_uvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivexor_uvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupadd_uvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmul_uvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmin_uvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmax_uvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupand_uvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupor_uvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupxor_uvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_uvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_uvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_uvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_uvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveand_uvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveor_uvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivexor_uvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_uvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_uvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_uvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_uvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveand_uvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveor_uvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivexor_uvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupadd_float
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmul_float
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmin_float
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmax_float
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_float
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_float
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_float
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_float
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_float
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_float
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_float
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_float
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupadd_vec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmul_vec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmin_vec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmax_vec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_vec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_vec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_vec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_vec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_vec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_vec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_vec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_vec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupadd_vec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmul_vec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmin_vec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmax_vec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_vec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_vec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_vec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_vec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_vec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_vec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_vec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_vec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupadd_vec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmul_vec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmin_vec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmax_vec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_vec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_vec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_vec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_vec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_vec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_vec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_vec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_vec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupadd_double
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmul_double
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmin_double
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmax_double
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_double
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_double
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_double
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_double
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_double
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_double
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_double
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_double
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupadd_dvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmul_dvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmin_dvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmax_dvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_dvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_dvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_dvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_dvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_dvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_dvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_dvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_dvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupadd_dvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmul_dvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmin_dvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmax_dvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_dvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_dvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_dvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_dvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_dvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_dvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_dvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_dvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupadd_dvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmul_dvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmin_dvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupmax_dvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_dvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_dvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_dvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_dvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_dvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_dvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_dvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_dvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupand_bool
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupor_bool
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupxor_bool
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveand_bool
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveor_bool
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivexor_bool
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveand_bool
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveor_bool
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivexor_bool
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupand_bvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupor_bvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupxor_bvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveand_bvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveor_bvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivexor_bvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveand_bvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveor_bvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivexor_bvec2
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupand_bvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupor_bvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupxor_bvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveand_bvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveor_bvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivexor_bvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveand_bvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveor_bvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivexor_bvec3
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupand_bvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupor_bvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupxor_bvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveand_bvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusiveor_bvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupinclusivexor_bvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveand_bvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusiveor_bvec4
+KHR-Single-GL46.subgroups.arithmetic.compute.subgroupexclusivexor_bvec4
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_int_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_int_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_int_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_int_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_int_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_int_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_int_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_int_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_int_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_int_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_int_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_int_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_int_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_int_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_int_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_int_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_int_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_int_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_int_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_int_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_int_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_int_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_int_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_int_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_int_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_int_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_int_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_int_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_int_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_int_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_int_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_int_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_int_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_int_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_int_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_int_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_int_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_int_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_int_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_int_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_int_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_int_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_int_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_int_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_int_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_int_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_int_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_int_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_int_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_int_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_int_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_int_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_int_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_int_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_int_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_int_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_int_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_int_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_int_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_int_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_int_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_int_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_int_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_int_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_int_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_int_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_int_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_int_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_int_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_int_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_int_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_int_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_int_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_int_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_int_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_int_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_int_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_int_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_int_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_int_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_int_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_int_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_int_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_int_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_ivec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_ivec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_ivec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_ivec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_ivec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_ivec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_ivec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_ivec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_ivec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_ivec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_ivec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_ivec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_ivec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_ivec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_ivec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_ivec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_ivec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_ivec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_ivec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_ivec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_ivec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_ivec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_ivec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_ivec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_ivec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_ivec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_ivec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_ivec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_ivec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_ivec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_ivec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_ivec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_ivec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_ivec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_ivec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_ivec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_ivec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_ivec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_ivec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_ivec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_ivec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_ivec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_ivec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_ivec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_ivec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_ivec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_ivec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_ivec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_ivec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_ivec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_ivec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_ivec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_ivec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_ivec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_ivec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_ivec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_ivec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_ivec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_ivec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_ivec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_ivec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_ivec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_ivec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_ivec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_ivec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_ivec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_ivec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_ivec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_ivec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_ivec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_ivec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_ivec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_ivec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_ivec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_ivec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_ivec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_ivec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_ivec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_ivec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_ivec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_ivec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_ivec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_ivec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_ivec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uint_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uint_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uint_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uint_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uint_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uint_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uint_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uint_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uint_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uint_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uint_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uint_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uint_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uint_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uint_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uint_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_uint_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_uint_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_uint_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_uint_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_uint_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_uint_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_uint_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_uint_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uint_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uint_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uint_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uint_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uint_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uint_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uint_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uint_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uint_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uint_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uint_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uint_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uint_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uint_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uint_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uint_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uint_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uint_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uint_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uint_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uint_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uint_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uint_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uint_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uint_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uint_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uint_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uint_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uint_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uint_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uint_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uint_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uint_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uint_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uint_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uint_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uint_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uint_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uint_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uint_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uint_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uint_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uint_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uint_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uint_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uint_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uint_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uint_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uint_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uint_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uint_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uint_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uint_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uint_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uint_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uint_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uint_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uint_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uint_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uint_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_uvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_uvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_uvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_uvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_uvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_uvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_uvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_uvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_uvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_uvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_uvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_uvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_uvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_uvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_uvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_uvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_uvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_uvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_uvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_uvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_uvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_uvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_uvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_uvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_float_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_float_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_float_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_float_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_float_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_float_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_float_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_float_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_float_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_float_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_float_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_float_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_float_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_float_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_float_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_float_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_float_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_float_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_float_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_float_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_float_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_float_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_float_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_float_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_float_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_float_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_float_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_float_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_float_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_float_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_float_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_float_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_float_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_float_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_float_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_float_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_float_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_float_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_float_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_float_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_float_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_float_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_float_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_float_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_float_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_float_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_float_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_float_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_vec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_vec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_vec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_vec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_vec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_vec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_vec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_vec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_vec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_vec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_vec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_vec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_vec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_vec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_vec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_vec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_vec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_vec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_vec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_vec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_vec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_vec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_vec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_vec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_vec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_vec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_vec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_vec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_vec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_vec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_vec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_vec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_vec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_vec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_vec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_vec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_vec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_vec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_vec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_vec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_vec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_vec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_vec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_vec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_vec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_vec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_vec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_vec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_double_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_double_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_double_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_double_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_double_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_double_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_double_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_double_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_double_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_double_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_double_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_double_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_double_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_double_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_double_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_double_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_double_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_double_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_double_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_double_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_double_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_double_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_double_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_double_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_double_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_double_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_double_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_double_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_double_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_double_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_double_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_double_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_double_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_double_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_double_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_double_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_double_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_double_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_double_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_double_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_double_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_double_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_double_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_double_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_double_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_double_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_double_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_double_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_dvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_dvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_dvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_dvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_dvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_dvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_dvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_dvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_dvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_dvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_dvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_dvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_dvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_dvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_dvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_dvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_dvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_dvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_dvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_dvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_dvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_dvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_dvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_dvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_dvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_dvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_dvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_dvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_dvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_dvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_dvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_dvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_dvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_dvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_dvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupadd_dvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_dvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_dvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_dvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmul_dvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_dvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_dvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_dvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmin_dvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_dvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_dvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_dvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupmax_dvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_bool_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_bool_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_bool_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_bool_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_bool_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_bool_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_bool_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_bool_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bool_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bool_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bool_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bool_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bool_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bool_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bool_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bool_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bool_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bool_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bool_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bool_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bool_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bool_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bool_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bool_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bool_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bool_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bool_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bool_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bool_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bool_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bool_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bool_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bool_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bool_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bool_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bool_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_bvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_bvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_bvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_bvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_bvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_bvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_bvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_bvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec2_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec2_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec2_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec2_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_bvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_bvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_bvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_bvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_bvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_bvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_bvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_bvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec3_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec3_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec3_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec3_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_bvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_bvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_bvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupand_bvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_bvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_bvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_bvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupor_bvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec4_geometry
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec4_vertex
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec4_tess_eval
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec4_tess_control
+KHR-Single-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec4_geometry
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredadd_int
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmul_int
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmin_int
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmax_int
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredand_int
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredor_int
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredxor_int
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredadd_ivec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmul_ivec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmin_ivec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmax_ivec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredand_ivec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredor_ivec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredxor_ivec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredadd_ivec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmul_ivec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmin_ivec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmax_ivec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredand_ivec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredor_ivec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredxor_ivec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredadd_ivec4
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmul_ivec4
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmin_ivec4
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmax_ivec4
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredand_ivec4
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredor_ivec4
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredxor_ivec4
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredadd_uint
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmul_uint
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmin_uint
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmax_uint
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredand_uint
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredor_uint
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredxor_uint
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredadd_uvec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmul_uvec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmin_uvec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmax_uvec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredand_uvec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredor_uvec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredxor_uvec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredadd_uvec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmul_uvec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmin_uvec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmax_uvec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredand_uvec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredor_uvec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredxor_uvec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredadd_uvec4
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmul_uvec4
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmin_uvec4
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmax_uvec4
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredand_uvec4
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredor_uvec4
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredxor_uvec4
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredadd_float
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmul_float
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmin_float
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmax_float
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredadd_vec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmul_vec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmin_vec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmax_vec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredadd_vec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmul_vec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmin_vec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmax_vec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredadd_vec4
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmul_vec4
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmin_vec4
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmax_vec4
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredadd_double
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmul_double
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmin_double
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmax_double
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredadd_dvec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmul_dvec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmin_dvec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmax_dvec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredadd_dvec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmul_dvec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmin_dvec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmax_dvec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredadd_dvec4
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmul_dvec4
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmin_dvec4
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredmax_dvec4
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredand_bool
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredor_bool
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredxor_bool
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredand_bvec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredor_bvec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredxor_bvec2
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredand_bvec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredor_bvec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredxor_bvec3
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredand_bvec4
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredor_bvec4
+KHR-Single-GL46.subgroups.clustered.graphics.subgroupclusteredxor_bvec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredadd_int
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmul_int
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmin_int
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmax_int
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredand_int
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredor_int
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredxor_int
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredadd_ivec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmul_ivec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmin_ivec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmax_ivec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredand_ivec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredor_ivec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredxor_ivec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredadd_ivec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmul_ivec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmin_ivec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmax_ivec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredand_ivec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredor_ivec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredxor_ivec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredadd_ivec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmul_ivec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmin_ivec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmax_ivec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredand_ivec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredor_ivec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredxor_ivec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredadd_uint
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmul_uint
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmin_uint
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmax_uint
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredand_uint
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredor_uint
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredxor_uint
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredadd_uvec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmul_uvec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmin_uvec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmax_uvec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredand_uvec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredor_uvec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredxor_uvec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredadd_uvec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmul_uvec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmin_uvec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmax_uvec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredand_uvec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredor_uvec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredxor_uvec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredadd_uvec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmul_uvec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmin_uvec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmax_uvec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredand_uvec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredor_uvec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredxor_uvec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredadd_float
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmul_float
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmin_float
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmax_float
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredadd_vec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmul_vec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmin_vec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmax_vec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredadd_vec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmul_vec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmin_vec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmax_vec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredadd_vec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmul_vec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmin_vec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmax_vec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredadd_double
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmul_double
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmin_double
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmax_double
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredadd_dvec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmul_dvec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmin_dvec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmax_dvec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredadd_dvec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmul_dvec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmin_dvec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmax_dvec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredadd_dvec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmul_dvec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmin_dvec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredmax_dvec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredand_bool
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredor_bool
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredxor_bool
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredand_bvec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredor_bvec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredxor_bvec2
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredand_bvec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredor_bvec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredxor_bvec3
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredand_bvec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredor_bvec4
+KHR-Single-GL46.subgroups.clustered.compute.subgroupclusteredxor_bvec4
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_int_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_int_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_int_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_int_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_int_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_int_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_int_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_int_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_int_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_int_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_int_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_int_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_int_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_int_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_int_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_int_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_int_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_int_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_int_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_int_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_int_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_int_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_int_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_int_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_int_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_int_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_int_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_int_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_ivec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_ivec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_ivec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_ivec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_ivec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_ivec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_ivec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_ivec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_ivec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_ivec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_ivec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_ivec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_ivec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_ivec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_ivec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_ivec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec4_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec4_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec4_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec4_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_ivec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_ivec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_ivec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_ivec4_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_ivec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_ivec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_ivec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_ivec4_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec4_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uint_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uint_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uint_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uint_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uint_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uint_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uint_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uint_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uint_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uint_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uint_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uint_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uint_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uint_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uint_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uint_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uint_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uint_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uint_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uint_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uint_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uint_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uint_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uint_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uint_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uint_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uint_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uint_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uvec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uvec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uvec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uvec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uvec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uvec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uvec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uvec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uvec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uvec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uvec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uvec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uvec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uvec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uvec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uvec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec4_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec4_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec4_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec4_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uvec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uvec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uvec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uvec4_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uvec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uvec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uvec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uvec4_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec4_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_float_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_float_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_float_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_float_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_float_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_float_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_float_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_float_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_float_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_float_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_float_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_float_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_float_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_float_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_float_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_float_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_vec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_vec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_vec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_vec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_vec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_vec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_vec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_vec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_vec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_vec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_vec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_vec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_vec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_vec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_vec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_vec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_vec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_vec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_vec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_vec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_vec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_vec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_vec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_vec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_vec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_vec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_vec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_vec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_vec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_vec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_vec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_vec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_vec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_vec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_vec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_vec4_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_vec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_vec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_vec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_vec4_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_vec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_vec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_vec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_vec4_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_vec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_vec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_vec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_vec4_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_double_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_double_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_double_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_double_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_double_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_double_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_double_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_double_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_double_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_double_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_double_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_double_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_double_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_double_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_double_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_double_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec4_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec4_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec4_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec4_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bool_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bool_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bool_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bool_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bool_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bool_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bool_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bool_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bool_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bool_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bool_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bool_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bvec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bvec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bvec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bvec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bvec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bvec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bvec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bvec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec2_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec2_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec2_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec2_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bvec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bvec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bvec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bvec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bvec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bvec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bvec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bvec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec3_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec3_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec3_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec3_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bvec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bvec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bvec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bvec4_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bvec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bvec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bvec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bvec4_geometry
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec4_vertex
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec4_tess_eval
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec4_tess_control
+KHR-Single-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupadd_int
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmul_int
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmin_int
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmax_int
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupand_int
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupor_int
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupxor_int
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_int
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_int
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_int
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_int
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveand_int
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveor_int
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivexor_int
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_int
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_int
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_int
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_int
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveand_int
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveor_int
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivexor_int
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupadd_ivec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmul_ivec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmin_ivec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmax_ivec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupand_ivec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupor_ivec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupxor_ivec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_ivec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_ivec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_ivec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_ivec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveand_ivec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveor_ivec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivexor_ivec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_ivec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_ivec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_ivec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_ivec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveand_ivec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveor_ivec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivexor_ivec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupadd_ivec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmul_ivec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmin_ivec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmax_ivec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupand_ivec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupor_ivec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupxor_ivec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_ivec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_ivec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_ivec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_ivec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveand_ivec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveor_ivec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivexor_ivec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_ivec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_ivec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_ivec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_ivec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveand_ivec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveor_ivec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivexor_ivec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupadd_ivec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmul_ivec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmin_ivec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmax_ivec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupand_ivec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupor_ivec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupxor_ivec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_ivec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_ivec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_ivec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_ivec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveand_ivec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveor_ivec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivexor_ivec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_ivec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_ivec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_ivec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_ivec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveand_ivec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveor_ivec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivexor_ivec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupadd_uint
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmul_uint
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmin_uint
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmax_uint
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupand_uint
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupor_uint
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupxor_uint
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_uint
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_uint
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_uint
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_uint
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveand_uint
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveor_uint
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivexor_uint
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_uint
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_uint
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_uint
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_uint
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveand_uint
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveor_uint
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivexor_uint
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupadd_uvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmul_uvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmin_uvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmax_uvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupand_uvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupor_uvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupxor_uvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_uvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_uvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_uvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_uvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveand_uvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveor_uvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivexor_uvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_uvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_uvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_uvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_uvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveand_uvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveor_uvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivexor_uvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupadd_uvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmul_uvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmin_uvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmax_uvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupand_uvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupor_uvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupxor_uvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_uvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_uvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_uvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_uvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveand_uvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveor_uvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivexor_uvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_uvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_uvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_uvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_uvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveand_uvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveor_uvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivexor_uvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupadd_uvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmul_uvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmin_uvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmax_uvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupand_uvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupor_uvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupxor_uvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_uvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_uvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_uvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_uvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveand_uvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveor_uvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivexor_uvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_uvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_uvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_uvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_uvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveand_uvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveor_uvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivexor_uvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupadd_float
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmul_float
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmin_float
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmax_float
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_float
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_float
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_float
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_float
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_float
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_float
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_float
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_float
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupadd_vec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmul_vec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmin_vec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmax_vec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_vec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_vec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_vec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_vec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_vec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_vec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_vec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_vec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupadd_vec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmul_vec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmin_vec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmax_vec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_vec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_vec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_vec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_vec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_vec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_vec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_vec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_vec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupadd_vec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmul_vec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmin_vec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmax_vec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_vec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_vec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_vec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_vec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_vec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_vec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_vec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_vec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupadd_double
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmul_double
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmin_double
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmax_double
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_double
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_double
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_double
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_double
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_double
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_double
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_double
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_double
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupadd_dvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmul_dvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmin_dvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmax_dvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_dvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_dvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_dvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_dvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_dvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_dvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_dvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_dvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupadd_dvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmul_dvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmin_dvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmax_dvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_dvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_dvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_dvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_dvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_dvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_dvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_dvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_dvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupadd_dvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmul_dvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmin_dvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupmax_dvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_dvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_dvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_dvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_dvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_dvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_dvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_dvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_dvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupand_bool
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupor_bool
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupxor_bool
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveand_bool
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveor_bool
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivexor_bool
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveand_bool
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveor_bool
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivexor_bool
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupand_bvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupor_bvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupxor_bvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveand_bvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveor_bvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivexor_bvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveand_bvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveor_bvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivexor_bvec2
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupand_bvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupor_bvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupxor_bvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveand_bvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveor_bvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivexor_bvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveand_bvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveor_bvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivexor_bvec3
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupand_bvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupor_bvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupxor_bvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveand_bvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusiveor_bvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupinclusivexor_bvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveand_bvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusiveor_bvec4
+KHR-Single-GL46.subgroups.partitioned.graphics.subgroupexclusivexor_bvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupadd_int
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmul_int
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmin_int
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmax_int
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupand_int
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupor_int
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupxor_int
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_int
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemul_int
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemin_int
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemax_int
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveand_int
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveor_int
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivexor_int
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_int
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemul_int
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemin_int
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemax_int
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveand_int
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveor_int
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivexor_int
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupadd_ivec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmul_ivec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmin_ivec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmax_ivec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupand_ivec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupor_ivec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupxor_ivec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_ivec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemul_ivec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemin_ivec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemax_ivec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveand_ivec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveor_ivec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivexor_ivec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_ivec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemul_ivec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemin_ivec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemax_ivec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveand_ivec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveor_ivec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivexor_ivec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupadd_ivec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmul_ivec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmin_ivec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmax_ivec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupand_ivec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupor_ivec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupxor_ivec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_ivec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemul_ivec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemin_ivec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemax_ivec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveand_ivec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveor_ivec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivexor_ivec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_ivec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemul_ivec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemin_ivec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemax_ivec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveand_ivec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveor_ivec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivexor_ivec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupadd_ivec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmul_ivec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmin_ivec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmax_ivec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupand_ivec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupor_ivec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupxor_ivec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_ivec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemul_ivec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemin_ivec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemax_ivec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveand_ivec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveor_ivec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivexor_ivec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_ivec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemul_ivec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemin_ivec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemax_ivec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveand_ivec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveor_ivec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivexor_ivec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupadd_uint
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmul_uint
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmin_uint
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmax_uint
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupand_uint
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupor_uint
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupxor_uint
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_uint
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemul_uint
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemin_uint
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemax_uint
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveand_uint
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveor_uint
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivexor_uint
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_uint
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemul_uint
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemin_uint
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemax_uint
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveand_uint
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveor_uint
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivexor_uint
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupadd_uvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmul_uvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmin_uvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmax_uvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupand_uvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupor_uvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupxor_uvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_uvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemul_uvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemin_uvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemax_uvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveand_uvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveor_uvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivexor_uvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_uvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemul_uvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemin_uvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemax_uvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveand_uvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveor_uvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivexor_uvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupadd_uvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmul_uvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmin_uvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmax_uvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupand_uvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupor_uvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupxor_uvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_uvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemul_uvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemin_uvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemax_uvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveand_uvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveor_uvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivexor_uvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_uvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemul_uvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemin_uvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemax_uvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveand_uvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveor_uvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivexor_uvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupadd_uvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmul_uvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmin_uvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmax_uvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupand_uvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupor_uvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupxor_uvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_uvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemul_uvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemin_uvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemax_uvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveand_uvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveor_uvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivexor_uvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_uvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemul_uvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemin_uvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemax_uvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveand_uvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveor_uvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivexor_uvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupadd_float
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmul_float
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmin_float
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmax_float
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_float
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemul_float
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemin_float
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemax_float
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_float
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemul_float
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemin_float
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemax_float
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupadd_vec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmul_vec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmin_vec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmax_vec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_vec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemul_vec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemin_vec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemax_vec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_vec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemul_vec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemin_vec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemax_vec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupadd_vec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmul_vec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmin_vec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmax_vec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_vec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemul_vec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemin_vec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemax_vec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_vec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemul_vec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemin_vec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemax_vec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupadd_vec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmul_vec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmin_vec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmax_vec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_vec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemul_vec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemin_vec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemax_vec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_vec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemul_vec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemin_vec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemax_vec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupadd_double
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmul_double
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmin_double
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmax_double
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_double
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemul_double
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemin_double
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemax_double
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_double
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemul_double
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemin_double
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemax_double
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupadd_dvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmul_dvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmin_dvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmax_dvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_dvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemul_dvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemin_dvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemax_dvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_dvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemul_dvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemin_dvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemax_dvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupadd_dvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmul_dvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmin_dvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmax_dvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_dvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemul_dvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemin_dvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemax_dvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_dvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemul_dvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemin_dvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemax_dvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupadd_dvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmul_dvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmin_dvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupmax_dvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_dvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemul_dvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemin_dvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivemax_dvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_dvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemul_dvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemin_dvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivemax_dvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupand_bool
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupor_bool
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupxor_bool
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveand_bool
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveor_bool
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivexor_bool
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveand_bool
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveor_bool
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivexor_bool
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupand_bvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupor_bvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupxor_bvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveand_bvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveor_bvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivexor_bvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveand_bvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveor_bvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivexor_bvec2
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupand_bvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupor_bvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupxor_bvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveand_bvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveor_bvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivexor_bvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveand_bvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveor_bvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivexor_bvec3
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupand_bvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupor_bvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupxor_bvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveand_bvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusiveor_bvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupinclusivexor_bvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveand_bvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusiveor_bvec4
+KHR-Single-GL46.subgroups.partitioned.compute.subgroupexclusivexor_bvec4
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_int_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_int_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_int_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_int_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_int_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_int_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_int_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_int_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_int_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_int_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_int_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_int_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_int_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_int_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_int_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_int_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_int_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_int_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_int_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_int_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_int_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_int_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_int_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_int_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_int_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_int_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_int_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_int_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_int_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_int_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_int_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_int_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_int_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_int_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_int_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_int_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_int_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_int_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_int_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_int_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_int_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_int_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_int_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_int_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_int_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_int_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_int_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_int_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_int_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_int_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_int_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_int_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_int_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_int_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_int_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_int_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_int_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_int_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_int_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_int_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_int_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_int_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_int_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_int_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_int_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_int_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_int_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_int_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_int_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_int_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_int_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_int_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_int_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_int_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_int_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_int_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_int_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_int_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_int_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_int_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_int_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_int_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_int_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_int_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_ivec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_ivec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_ivec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_ivec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_ivec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_ivec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_ivec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_ivec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_ivec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_ivec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_ivec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_ivec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_ivec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_ivec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_ivec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_ivec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_ivec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_ivec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_ivec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_ivec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_ivec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_ivec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_ivec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_ivec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_ivec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_ivec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_ivec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_ivec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_ivec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_ivec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_ivec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_ivec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_ivec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_ivec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_ivec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_ivec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_ivec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_ivec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_ivec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_ivec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_ivec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_ivec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_ivec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_ivec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_ivec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_ivec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_ivec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_ivec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_ivec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_ivec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_ivec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_ivec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_ivec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_ivec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_ivec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_ivec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_ivec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_ivec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_ivec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_ivec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_ivec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_ivec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_ivec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_ivec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_ivec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_ivec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_ivec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_ivec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_ivec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_ivec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_ivec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_ivec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_ivec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_ivec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_ivec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_ivec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_ivec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_ivec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_ivec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_ivec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_ivec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_ivec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_ivec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_ivec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_uint_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_uint_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_uint_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_uint_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_uint_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_uint_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_uint_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_uint_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_uint_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_uint_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_uint_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_uint_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_uint_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_uint_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_uint_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_uint_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_uint_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_uint_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_uint_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_uint_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_uint_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_uint_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_uint_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_uint_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_uint_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_uint_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_uint_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_uint_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uint_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uint_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uint_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uint_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uint_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uint_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uint_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uint_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uint_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uint_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uint_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uint_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uint_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uint_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uint_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uint_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uint_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uint_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uint_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uint_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uint_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uint_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uint_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uint_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uint_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uint_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uint_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uint_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uint_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uint_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uint_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uint_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uint_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uint_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uint_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uint_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uint_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uint_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uint_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uint_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uint_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uint_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uint_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uint_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uint_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uint_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uint_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uint_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uint_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uint_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uint_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uint_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uint_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uint_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uint_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uint_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_uvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_uvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_uvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_uvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_uvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_uvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_uvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_uvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_uvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_uvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_uvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_uvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_uvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_uvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_uvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_uvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_uvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_uvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_uvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_uvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_uvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_uvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_uvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_uvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_uvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_uvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_uvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_uvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_uvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_uvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_uvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_uvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_uvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_uvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_uvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_uvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_uvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_uvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_uvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_uvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_uvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_uvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_uvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_uvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_uvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_uvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_uvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_uvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_uvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_uvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_uvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_uvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_uvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_uvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_uvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_uvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_uvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_uvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_uvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_uvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_uvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_uvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_uvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_uvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_uvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_uvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_uvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_uvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_uvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_uvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_uvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_uvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_uvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_uvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_uvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_uvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_uvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_uvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_uvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_uvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_uvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_uvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_uvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_uvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_float_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_float_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_float_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_float_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_float_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_float_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_float_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_float_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_float_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_float_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_float_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_float_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_float_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_float_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_float_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_float_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_float_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_float_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_float_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_float_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_float_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_float_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_float_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_float_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_float_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_float_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_float_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_float_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_float_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_float_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_float_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_float_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_float_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_float_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_float_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_float_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_float_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_float_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_float_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_float_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_float_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_float_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_float_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_float_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_float_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_float_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_float_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_float_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_vec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_vec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_vec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_vec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_vec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_vec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_vec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_vec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_vec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_vec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_vec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_vec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_vec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_vec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_vec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_vec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_vec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_vec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_vec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_vec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_vec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_vec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_vec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_vec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_vec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_vec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_vec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_vec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_vec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_vec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_vec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_vec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_vec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_vec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_vec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_vec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_vec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_vec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_vec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_vec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_vec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_vec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_vec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_vec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_vec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_vec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_vec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_vec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_double_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_double_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_double_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_double_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_double_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_double_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_double_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_double_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_double_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_double_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_double_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_double_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_double_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_double_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_double_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_double_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_double_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_double_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_double_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_double_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_double_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_double_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_double_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_double_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_double_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_double_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_double_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_double_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_double_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_double_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_double_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_double_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_double_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_double_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_double_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_double_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_double_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_double_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_double_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_double_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_double_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_double_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_double_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_double_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_double_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_double_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_double_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_double_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_dvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_dvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_dvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_dvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_dvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_dvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_dvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_dvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_dvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_dvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_dvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_dvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_dvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_dvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_dvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_dvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_dvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_dvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_dvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_dvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_dvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_dvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_dvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_dvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_dvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_dvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_dvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_dvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_dvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_dvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_dvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_dvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_dvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_dvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_dvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupadd_dvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_dvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_dvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_dvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmul_dvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_dvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_dvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_dvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmin_dvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_dvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_dvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_dvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupmax_dvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_bool_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_bool_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_bool_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_bool_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_bool_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_bool_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_bool_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_bool_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_bool_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_bool_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_bool_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_bool_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bool_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bool_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bool_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bool_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bool_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bool_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bool_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bool_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bool_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bool_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bool_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bool_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bool_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bool_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bool_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bool_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bool_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bool_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bool_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bool_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bool_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bool_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bool_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bool_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_bvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_bvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_bvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_bvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_bvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_bvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_bvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_bvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_bvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_bvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_bvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_bvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec2_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec2_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec2_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec2_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_bvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_bvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_bvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_bvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_bvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_bvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_bvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_bvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_bvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_bvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_bvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_bvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec3_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec3_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec3_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec3_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_bvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_bvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_bvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupand_bvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_bvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_bvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_bvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupor_bvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_bvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_bvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_bvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupxor_bvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec4_geometry
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec4_vertex
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec4_tess_eval
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec4_tess_control
+KHR-Single-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec4_geometry
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffle_int
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshufflexor_int
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffleup_int
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffledown_int
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffle_ivec2
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshufflexor_ivec2
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffleup_ivec2
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffledown_ivec2
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffle_ivec3
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshufflexor_ivec3
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffleup_ivec3
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffledown_ivec3
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffle_ivec4
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshufflexor_ivec4
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffleup_ivec4
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffledown_ivec4
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffle_uint
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshufflexor_uint
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffleup_uint
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffledown_uint
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffle_uvec2
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshufflexor_uvec2
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffleup_uvec2
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffledown_uvec2
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffle_uvec3
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshufflexor_uvec3
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffleup_uvec3
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffledown_uvec3
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffle_uvec4
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshufflexor_uvec4
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffleup_uvec4
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffledown_uvec4
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffle_float
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshufflexor_float
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffleup_float
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffledown_float
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffle_vec2
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshufflexor_vec2
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffleup_vec2
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffledown_vec2
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffle_vec3
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshufflexor_vec3
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffleup_vec3
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffledown_vec3
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffle_vec4
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshufflexor_vec4
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffleup_vec4
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffledown_vec4
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffle_double
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshufflexor_double
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffleup_double
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffledown_double
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffle_dvec2
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshufflexor_dvec2
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffleup_dvec2
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffledown_dvec2
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffle_dvec3
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshufflexor_dvec3
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffleup_dvec3
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffledown_dvec3
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffle_dvec4
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshufflexor_dvec4
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffleup_dvec4
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffledown_dvec4
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffle_bool
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshufflexor_bool
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffleup_bool
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffledown_bool
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffle_bvec2
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshufflexor_bvec2
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffleup_bvec2
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffledown_bvec2
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffle_bvec3
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshufflexor_bvec3
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffleup_bvec3
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffledown_bvec3
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffle_bvec4
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshufflexor_bvec4
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffleup_bvec4
+KHR-Single-GL46.subgroups.shuffle.graphics.subgroupshuffledown_bvec4
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffle_int
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshufflexor_int
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffleup_int
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffledown_int
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffle_ivec2
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshufflexor_ivec2
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffleup_ivec2
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffledown_ivec2
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffle_ivec3
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshufflexor_ivec3
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffleup_ivec3
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffledown_ivec3
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffle_ivec4
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshufflexor_ivec4
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffleup_ivec4
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffledown_ivec4
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffle_uint
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshufflexor_uint
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffleup_uint
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffledown_uint
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffle_uvec2
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshufflexor_uvec2
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffleup_uvec2
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffledown_uvec2
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffle_uvec3
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshufflexor_uvec3
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffleup_uvec3
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffledown_uvec3
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffle_uvec4
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshufflexor_uvec4
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffleup_uvec4
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffledown_uvec4
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffle_float
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshufflexor_float
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffleup_float
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffledown_float
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffle_vec2
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshufflexor_vec2
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffleup_vec2
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffledown_vec2
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffle_vec3
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshufflexor_vec3
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffleup_vec3
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffledown_vec3
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffle_vec4
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshufflexor_vec4
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffleup_vec4
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffledown_vec4
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffle_double
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshufflexor_double
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffleup_double
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffledown_double
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffle_dvec2
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshufflexor_dvec2
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffleup_dvec2
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffledown_dvec2
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffle_dvec3
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshufflexor_dvec3
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffleup_dvec3
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffledown_dvec3
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffle_dvec4
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshufflexor_dvec4
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffleup_dvec4
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffledown_dvec4
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffle_bool
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshufflexor_bool
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffleup_bool
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffledown_bool
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffle_bvec2
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshufflexor_bvec2
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffleup_bvec2
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffledown_bvec2
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffle_bvec3
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshufflexor_bvec3
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffleup_bvec3
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffledown_bvec3
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffle_bvec4
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshufflexor_bvec4
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffleup_bvec4
+KHR-Single-GL46.subgroups.shuffle.compute.subgroupshuffledown_bvec4
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_int_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_int_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_int_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_int_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_int_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_int_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_int_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_int_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_int_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_int_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_int_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_int_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_int_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_int_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_int_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_int_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_ivec2_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_ivec2_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_ivec2_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_ivec2_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec2_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec2_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec2_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec2_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec2_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec2_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec2_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec2_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec2_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec2_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec2_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec2_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_ivec3_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_ivec3_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_ivec3_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_ivec3_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec3_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec3_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec3_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec3_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec3_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec3_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec3_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec3_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec3_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec3_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec3_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec3_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_ivec4_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_ivec4_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_ivec4_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_ivec4_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec4_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec4_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec4_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec4_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec4_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec4_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec4_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec4_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec4_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec4_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec4_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec4_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uint_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uint_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uint_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uint_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uint_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uint_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uint_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uint_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uint_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uint_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uint_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uint_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uint_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uint_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uint_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uint_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uvec2_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uvec2_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uvec2_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uvec2_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec2_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec2_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec2_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec2_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec2_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec2_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec2_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec2_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec2_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec2_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec2_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec2_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uvec3_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uvec3_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uvec3_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uvec3_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec3_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec3_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec3_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec3_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec3_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec3_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec3_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec3_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec3_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec3_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec3_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec3_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uvec4_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uvec4_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uvec4_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uvec4_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec4_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec4_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec4_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec4_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec4_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec4_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec4_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec4_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec4_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec4_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec4_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec4_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_float_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_float_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_float_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_float_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_float_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_float_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_float_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_float_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_float_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_float_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_float_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_float_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_float_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_float_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_float_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_float_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_vec2_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_vec2_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_vec2_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_vec2_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_vec2_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_vec2_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_vec2_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_vec2_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_vec2_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_vec2_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_vec2_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_vec2_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_vec2_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_vec2_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_vec2_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_vec2_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_vec3_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_vec3_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_vec3_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_vec3_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_vec3_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_vec3_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_vec3_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_vec3_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_vec3_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_vec3_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_vec3_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_vec3_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_vec3_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_vec3_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_vec3_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_vec3_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_vec4_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_vec4_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_vec4_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_vec4_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_vec4_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_vec4_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_vec4_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_vec4_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_vec4_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_vec4_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_vec4_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_vec4_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_vec4_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_vec4_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_vec4_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_vec4_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_double_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_double_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_double_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_double_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_double_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_double_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_double_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_double_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_double_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_double_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_double_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_double_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_double_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_double_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_double_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_double_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_dvec2_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_dvec2_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_dvec2_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_dvec2_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec2_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec2_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec2_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec2_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec2_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec2_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec2_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec2_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec2_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec2_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec2_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec2_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_dvec3_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_dvec3_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_dvec3_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_dvec3_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec3_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec3_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec3_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec3_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec3_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec3_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec3_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec3_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec3_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec3_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec3_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec3_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_dvec4_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_dvec4_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_dvec4_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_dvec4_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec4_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec4_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec4_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec4_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec4_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec4_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec4_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec4_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec4_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec4_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec4_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec4_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bool_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bool_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bool_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bool_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bool_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bool_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bool_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bool_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bool_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bool_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bool_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bool_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bool_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bool_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bool_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bool_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bvec2_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bvec2_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bvec2_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bvec2_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec2_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec2_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec2_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec2_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec2_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec2_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec2_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec2_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec2_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec2_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec2_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec2_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bvec3_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bvec3_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bvec3_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bvec3_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec3_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec3_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec3_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec3_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec3_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec3_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec3_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec3_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec3_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec3_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec3_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec3_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bvec4_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bvec4_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bvec4_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bvec4_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec4_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec4_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec4_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec4_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec4_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec4_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec4_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec4_geometry
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec4_vertex
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec4_tess_eval
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec4_tess_control
+KHR-Single-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec4_geometry
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_int
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_int
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapvertical_int
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_int
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_ivec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_ivec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapvertical_ivec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_ivec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_ivec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_ivec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapvertical_ivec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_ivec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_ivec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_ivec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapvertical_ivec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_ivec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_uint
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_uint
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapvertical_uint
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_uint
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_uvec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_uvec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapvertical_uvec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_uvec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_uvec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_uvec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapvertical_uvec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_uvec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_uvec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_uvec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapvertical_uvec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_uvec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_float
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_float
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapvertical_float
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_float
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_vec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_vec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapvertical_vec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_vec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_vec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_vec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapvertical_vec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_vec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_vec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_vec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapvertical_vec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_vec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_double
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_double
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapvertical_double
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_double
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_dvec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_dvec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapvertical_dvec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_dvec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_dvec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_dvec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapvertical_dvec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_dvec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_dvec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_dvec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapvertical_dvec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_dvec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_bool
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_bool
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapvertical_bool
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_bool
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_bvec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_bvec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapvertical_bvec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_bvec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_bvec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_bvec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapvertical_bvec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_bvec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_bvec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_bvec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapvertical_bvec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_bvec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_int
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_ivec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_ivec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_ivec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_uint
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_uvec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_uvec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_uvec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_float
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_vec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_vec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_vec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_double
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_dvec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_dvec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_dvec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_bool
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_bvec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_bvec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_bvec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_int
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_ivec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_ivec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_ivec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_uint
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_uvec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_uvec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_uvec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_float
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_vec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_vec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_vec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_double
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_dvec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_dvec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_dvec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_bool
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_bvec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_bvec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_bvec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_int
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_ivec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_ivec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_ivec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_uint
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_uvec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_uvec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_uvec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_float
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_vec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_vec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_vec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_double
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_dvec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_dvec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_dvec4
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_bool
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_bvec2
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_bvec3
+KHR-Single-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_bvec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_int
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_int
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapvertical_int
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_int
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_ivec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_ivec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapvertical_ivec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_ivec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_ivec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_ivec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapvertical_ivec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_ivec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_ivec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_ivec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapvertical_ivec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_ivec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_uint
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_uint
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapvertical_uint
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_uint
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_uvec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_uvec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapvertical_uvec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_uvec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_uvec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_uvec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapvertical_uvec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_uvec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_uvec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_uvec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapvertical_uvec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_uvec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_float
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_float
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapvertical_float
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_float
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_vec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_vec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapvertical_vec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_vec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_vec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_vec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapvertical_vec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_vec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_vec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_vec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapvertical_vec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_vec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_double
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_double
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapvertical_double
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_double
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_dvec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_dvec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapvertical_dvec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_dvec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_dvec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_dvec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapvertical_dvec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_dvec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_dvec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_dvec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapvertical_dvec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_dvec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_bool
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_bool
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapvertical_bool
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_bool
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_bvec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_bvec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapvertical_bvec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_bvec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_bvec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_bvec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapvertical_bvec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_bvec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_bvec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_bvec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapvertical_bvec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_bvec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_int
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_ivec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_ivec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_ivec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_uint
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_uvec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_uvec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_uvec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_float
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_vec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_vec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_vec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_double
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_dvec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_dvec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_dvec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_bool
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_bvec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_bvec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_bvec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_int
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_ivec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_ivec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_ivec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_uint
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_uvec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_uvec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_uvec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_float
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_vec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_vec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_vec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_double
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_dvec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_dvec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_dvec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_bool
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_bvec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_bvec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_bvec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_int
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_ivec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_ivec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_ivec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_uint
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_uvec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_uvec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_uvec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_float
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_vec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_vec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_vec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_double
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_dvec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_dvec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_dvec4
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_bool
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_bvec2
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_bvec3
+KHR-Single-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_bvec4
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_int_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_int_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_int_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_int_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_int_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_int_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_int_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_int_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_int_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_int_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_int_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_int_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_int_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_int_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_int_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_int_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uint_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uint_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uint_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uint_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uint_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uint_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uint_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uint_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uint_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uint_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uint_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uint_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uint_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uint_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uint_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uint_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_float_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_float_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_float_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_float_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_float_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_float_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_float_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_float_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_float_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_float_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_float_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_float_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_float_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_float_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_float_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_float_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_vec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_vec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_vec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_vec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_vec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_vec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_vec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_vec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_vec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_vec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_vec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_vec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_double_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_double_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_double_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_double_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_double_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_double_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_double_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_double_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_double_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_double_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_double_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_double_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_double_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_double_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_double_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_double_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bool_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bool_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bool_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bool_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bool_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bool_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bool_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bool_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bool_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bool_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bool_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bool_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bool_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bool_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bool_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bool_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_int_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_int_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_int_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_int_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uint_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uint_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uint_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uint_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_float_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_float_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_float_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_float_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_double_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_double_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_double_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_double_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bool_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bool_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bool_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bool_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_int_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_int_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_int_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_int_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uint_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uint_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uint_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uint_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_float_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_float_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_float_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_float_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_double_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_double_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_double_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_double_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bool_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bool_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bool_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bool_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_int_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_int_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_int_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_int_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uint_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uint_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uint_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uint_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_float_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_float_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_float_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_float_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_double_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_double_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_double_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_double_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec4_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bool_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bool_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bool_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bool_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec2_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec2_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec2_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec2_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec3_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec3_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec3_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec3_geometry
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec4_vertex
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec4_tess_eval
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec4_tess_control
+KHR-Single-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec4_geometry
+KHR-Single-GL46.subgroups.shape.graphics.clustered
+KHR-Single-GL46.subgroups.shape.graphics.quad
+KHR-Single-GL46.subgroups.shape.compute.clustered
+KHR-Single-GL46.subgroups.shape.compute.quad
+KHR-Single-GL46.subgroups.shape.framebuffer.clustered_vertex
+KHR-Single-GL46.subgroups.shape.framebuffer.clustered_tess_eval
+KHR-Single-GL46.subgroups.shape.framebuffer.clustered_tess_control
+KHR-Single-GL46.subgroups.shape.framebuffer.clustered_geometry
+KHR-Single-GL46.subgroups.shape.framebuffer.quad_vertex
+KHR-Single-GL46.subgroups.shape.framebuffer.quad_tess_eval
+KHR-Single-GL46.subgroups.shape.framebuffer.quad_tess_control
+KHR-Single-GL46.subgroups.shape.framebuffer.quad_geometry
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass_single/4.6.1.x/mustpass.xml b/external/openglcts/data/mustpass/gl/khronos_mustpass_single/4.6.1.x/mustpass.xml
new file mode 100644
index 0000000..59886db
--- /dev/null
+++ b/external/openglcts/data/mustpass/gl/khronos_mustpass_single/4.6.1.x/mustpass.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Mustpass version="4.6.1.x">
+ <!--/* Copyright (C) 2016-2017 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.
+*/-->
+ <!--/* WARNING: This is auto-generated file. Do not modify, since changes will
+ * be lost! Modify the generating script instead.
+ */-->
+ <TestPackage name="Khronos Mustpass GL Single Config">
+ <Configuration caseListFile="gl45-khr-single.txt" commandLine="--deqp-screen-rotation=unspecified --deqp-surface-width=64 --deqp-surface-height=64 --deqp-base-seed=1 --deqp-watchdog=disable" name="khr-single" os="any" useForFirstEGLConfig="True"/>
+ <Configuration caseListFile="gl46-khr-single.txt" commandLine="--deqp-screen-rotation=unspecified --deqp-surface-width=64 --deqp-surface-height=64 --deqp-base-seed=1 --deqp-watchdog=disable" name="khr-single" os="any" useForFirstEGLConfig="True"/>
+ </TestPackage>
+</Mustpass>
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass_single/4.6.1.x/src/gl45-khr-single.txt b/external/openglcts/data/mustpass/gl/khronos_mustpass_single/4.6.1.x/src/gl45-khr-single.txt
new file mode 100644
index 0000000..c208c3b
--- /dev/null
+++ b/external/openglcts/data/mustpass/gl/khronos_mustpass_single/4.6.1.x/src/gl45-khr-single.txt
@@ -0,0 +1 @@
+KHR-Single-GL45.*
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass_single/4.6.1.x/src/gl46-khr-single.txt b/external/openglcts/data/mustpass/gl/khronos_mustpass_single/4.6.1.x/src/gl46-khr-single.txt
new file mode 100644
index 0000000..75601c9
--- /dev/null
+++ b/external/openglcts/data/mustpass/gl/khronos_mustpass_single/4.6.1.x/src/gl46-khr-single.txt
@@ -0,0 +1 @@
+KHR-Single-GL46.*
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass_single/master/gles32-khr-single.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass_single/master/gles32-khr-single.txt
new file mode 100644
index 0000000..8234d56
--- /dev/null
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass_single/master/gles32-khr-single.txt
@@ -0,0 +1,6053 @@
+KHR-Single-GLES32.subgroups.builtin_var.graphics.subgroupsize
+KHR-Single-GLES32.subgroups.builtin_var.graphics.subgroupinvocationid
+KHR-Single-GLES32.subgroups.builtin_var.compute.subgroupsize_compute
+KHR-Single-GLES32.subgroups.builtin_var.compute.subgroupinvocationid_compute
+KHR-Single-GLES32.subgroups.builtin_var.compute.numsubgroups
+KHR-Single-GLES32.subgroups.builtin_var.compute.subgroupid
+KHR-Single-GLES32.subgroups.builtin_var.framebuffer.subgroupsize_vertex
+KHR-Single-GLES32.subgroups.builtin_var.framebuffer.subgroupsize_tess_eval
+KHR-Single-GLES32.subgroups.builtin_var.framebuffer.subgroupsize_tess_control
+KHR-Single-GLES32.subgroups.builtin_var.framebuffer.subgroupsize_geometry
+KHR-Single-GLES32.subgroups.builtin_var.framebuffer.subgroupinvocationid_vertex
+KHR-Single-GLES32.subgroups.builtin_var.framebuffer.subgroupinvocationid_tess_eval
+KHR-Single-GLES32.subgroups.builtin_var.framebuffer.subgroupinvocationid_tess_control
+KHR-Single-GLES32.subgroups.builtin_var.framebuffer.subgroupinvocationid_geometry
+KHR-Single-GLES32.subgroups.builtin_mask_var.graphics.subgroupeqmask
+KHR-Single-GLES32.subgroups.builtin_mask_var.graphics.subgroupgemask
+KHR-Single-GLES32.subgroups.builtin_mask_var.graphics.subgroupgtmask
+KHR-Single-GLES32.subgroups.builtin_mask_var.graphics.subgrouplemask
+KHR-Single-GLES32.subgroups.builtin_mask_var.graphics.subgroupltmask
+KHR-Single-GLES32.subgroups.builtin_mask_var.compute.subgroupeqmask
+KHR-Single-GLES32.subgroups.builtin_mask_var.compute.subgroupgemask
+KHR-Single-GLES32.subgroups.builtin_mask_var.compute.subgroupgtmask
+KHR-Single-GLES32.subgroups.builtin_mask_var.compute.subgrouplemask
+KHR-Single-GLES32.subgroups.builtin_mask_var.compute.subgroupltmask
+KHR-Single-GLES32.subgroups.builtin_mask_var.framebuffer.subgroupeqmask_vertex
+KHR-Single-GLES32.subgroups.builtin_mask_var.framebuffer.subgroupeqmask_tess_eval
+KHR-Single-GLES32.subgroups.builtin_mask_var.framebuffer.subgroupeqmask_tess_control
+KHR-Single-GLES32.subgroups.builtin_mask_var.framebuffer.subgroupeqmask_geometry
+KHR-Single-GLES32.subgroups.builtin_mask_var.framebuffer.subgroupgemask_vertex
+KHR-Single-GLES32.subgroups.builtin_mask_var.framebuffer.subgroupgemask_tess_eval
+KHR-Single-GLES32.subgroups.builtin_mask_var.framebuffer.subgroupgemask_tess_control
+KHR-Single-GLES32.subgroups.builtin_mask_var.framebuffer.subgroupgemask_geometry
+KHR-Single-GLES32.subgroups.builtin_mask_var.framebuffer.subgroupgtmask_vertex
+KHR-Single-GLES32.subgroups.builtin_mask_var.framebuffer.subgroupgtmask_tess_eval
+KHR-Single-GLES32.subgroups.builtin_mask_var.framebuffer.subgroupgtmask_tess_control
+KHR-Single-GLES32.subgroups.builtin_mask_var.framebuffer.subgroupgtmask_geometry
+KHR-Single-GLES32.subgroups.builtin_mask_var.framebuffer.subgrouplemask_vertex
+KHR-Single-GLES32.subgroups.builtin_mask_var.framebuffer.subgrouplemask_tess_eval
+KHR-Single-GLES32.subgroups.builtin_mask_var.framebuffer.subgrouplemask_tess_control
+KHR-Single-GLES32.subgroups.builtin_mask_var.framebuffer.subgrouplemask_geometry
+KHR-Single-GLES32.subgroups.builtin_mask_var.framebuffer.subgroupltmask_vertex
+KHR-Single-GLES32.subgroups.builtin_mask_var.framebuffer.subgroupltmask_tess_eval
+KHR-Single-GLES32.subgroups.builtin_mask_var.framebuffer.subgroupltmask_tess_control
+KHR-Single-GLES32.subgroups.builtin_mask_var.framebuffer.subgroupltmask_geometry
+KHR-Single-GLES32.subgroups.basic.graphics.subgroupelect
+KHR-Single-GLES32.subgroups.basic.graphics.subgroupbarrier
+KHR-Single-GLES32.subgroups.basic.graphics.subgroupmemorybarrier
+KHR-Single-GLES32.subgroups.basic.graphics.subgroupmemorybarrierbuffer
+KHR-Single-GLES32.subgroups.basic.graphics.subgroupmemorybarrierimage
+KHR-Single-GLES32.subgroups.basic.compute.subgroupelect
+KHR-Single-GLES32.subgroups.basic.compute.subgroupbarrier
+KHR-Single-GLES32.subgroups.basic.compute.subgroupmemorybarrier
+KHR-Single-GLES32.subgroups.basic.compute.subgroupmemorybarrierbuffer
+KHR-Single-GLES32.subgroups.basic.compute.subgroupmemorybarriershared
+KHR-Single-GLES32.subgroups.basic.compute.subgroupmemorybarrierimage
+KHR-Single-GLES32.subgroups.basic.framebuffer.subgroupelect_vertex
+KHR-Single-GLES32.subgroups.basic.framebuffer.subgroupelect_tess_eval
+KHR-Single-GLES32.subgroups.basic.framebuffer.subgroupelect_tess_control
+KHR-Single-GLES32.subgroups.basic.framebuffer.subgroupelect_geometry
+KHR-Single-GLES32.subgroups.basic.framebuffer.subgroupbarrier_fragment
+KHR-Single-GLES32.subgroups.basic.framebuffer.subgroupbarrier_vertex
+KHR-Single-GLES32.subgroups.basic.framebuffer.subgroupbarrier_tess_eval
+KHR-Single-GLES32.subgroups.basic.framebuffer.subgroupbarrier_tess_control
+KHR-Single-GLES32.subgroups.basic.framebuffer.subgroupbarrier_geometry
+KHR-Single-GLES32.subgroups.basic.framebuffer.subgroupmemorybarrier_fragment
+KHR-Single-GLES32.subgroups.basic.framebuffer.subgroupmemorybarrier_vertex
+KHR-Single-GLES32.subgroups.basic.framebuffer.subgroupmemorybarrier_tess_eval
+KHR-Single-GLES32.subgroups.basic.framebuffer.subgroupmemorybarrier_tess_control
+KHR-Single-GLES32.subgroups.basic.framebuffer.subgroupmemorybarrier_geometry
+KHR-Single-GLES32.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_fragment
+KHR-Single-GLES32.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_vertex
+KHR-Single-GLES32.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_tess_eval
+KHR-Single-GLES32.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_tess_control
+KHR-Single-GLES32.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_geometry
+KHR-Single-GLES32.subgroups.basic.framebuffer.subgroupmemorybarrierimage_fragment
+KHR-Single-GLES32.subgroups.basic.framebuffer.subgroupmemorybarrierimage_vertex
+KHR-Single-GLES32.subgroups.basic.framebuffer.subgroupmemorybarrierimage_tess_eval
+KHR-Single-GLES32.subgroups.basic.framebuffer.subgroupmemorybarrierimage_tess_control
+KHR-Single-GLES32.subgroups.basic.framebuffer.subgroupmemorybarrierimage_geometry
+KHR-Single-GLES32.subgroups.vote.graphics.subgroupallequal_int
+KHR-Single-GLES32.subgroups.vote.graphics.subgroupallequal_ivec2
+KHR-Single-GLES32.subgroups.vote.graphics.subgroupallequal_ivec3
+KHR-Single-GLES32.subgroups.vote.graphics.subgroupallequal_ivec4
+KHR-Single-GLES32.subgroups.vote.graphics.subgroupall_uint
+KHR-Single-GLES32.subgroups.vote.graphics.subgroupany_uint
+KHR-Single-GLES32.subgroups.vote.graphics.subgroupallequal_uint
+KHR-Single-GLES32.subgroups.vote.graphics.subgroupallequal_uvec2
+KHR-Single-GLES32.subgroups.vote.graphics.subgroupallequal_uvec3
+KHR-Single-GLES32.subgroups.vote.graphics.subgroupallequal_uvec4
+KHR-Single-GLES32.subgroups.vote.graphics.subgroupallequal_float
+KHR-Single-GLES32.subgroups.vote.graphics.subgroupallequal_vec2
+KHR-Single-GLES32.subgroups.vote.graphics.subgroupallequal_vec3
+KHR-Single-GLES32.subgroups.vote.graphics.subgroupallequal_vec4
+KHR-Single-GLES32.subgroups.vote.graphics.subgroupallequal_double
+KHR-Single-GLES32.subgroups.vote.graphics.subgroupallequal_dvec2
+KHR-Single-GLES32.subgroups.vote.graphics.subgroupallequal_dvec3
+KHR-Single-GLES32.subgroups.vote.graphics.subgroupallequal_dvec4
+KHR-Single-GLES32.subgroups.vote.graphics.subgroupallequal_bool
+KHR-Single-GLES32.subgroups.vote.graphics.subgroupallequal_bvec2
+KHR-Single-GLES32.subgroups.vote.graphics.subgroupallequal_bvec3
+KHR-Single-GLES32.subgroups.vote.graphics.subgroupallequal_bvec4
+KHR-Single-GLES32.subgroups.vote.compute.subgroupallequal_int
+KHR-Single-GLES32.subgroups.vote.compute.subgroupallequal_ivec2
+KHR-Single-GLES32.subgroups.vote.compute.subgroupallequal_ivec3
+KHR-Single-GLES32.subgroups.vote.compute.subgroupallequal_ivec4
+KHR-Single-GLES32.subgroups.vote.compute.subgroupall_uint
+KHR-Single-GLES32.subgroups.vote.compute.subgroupany_uint
+KHR-Single-GLES32.subgroups.vote.compute.subgroupallequal_uint
+KHR-Single-GLES32.subgroups.vote.compute.subgroupallequal_uvec2
+KHR-Single-GLES32.subgroups.vote.compute.subgroupallequal_uvec3
+KHR-Single-GLES32.subgroups.vote.compute.subgroupallequal_uvec4
+KHR-Single-GLES32.subgroups.vote.compute.subgroupallequal_float
+KHR-Single-GLES32.subgroups.vote.compute.subgroupallequal_vec2
+KHR-Single-GLES32.subgroups.vote.compute.subgroupallequal_vec3
+KHR-Single-GLES32.subgroups.vote.compute.subgroupallequal_vec4
+KHR-Single-GLES32.subgroups.vote.compute.subgroupallequal_double
+KHR-Single-GLES32.subgroups.vote.compute.subgroupallequal_dvec2
+KHR-Single-GLES32.subgroups.vote.compute.subgroupallequal_dvec3
+KHR-Single-GLES32.subgroups.vote.compute.subgroupallequal_dvec4
+KHR-Single-GLES32.subgroups.vote.compute.subgroupallequal_bool
+KHR-Single-GLES32.subgroups.vote.compute.subgroupallequal_bvec2
+KHR-Single-GLES32.subgroups.vote.compute.subgroupallequal_bvec3
+KHR-Single-GLES32.subgroups.vote.compute.subgroupallequal_bvec4
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_int_vertex
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_int_tess_eval
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_int_tess_control
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_int_geometry
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_ivec2_vertex
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_ivec2_tess_control
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_ivec2_geometry
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_ivec3_vertex
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_ivec3_tess_control
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_ivec3_geometry
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_ivec4_vertex
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_ivec4_tess_control
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_ivec4_geometry
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupall_uint_vertex
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupall_uint_tess_eval
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupall_uint_tess_control
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupall_uint_geometry
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupany_uint_vertex
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupany_uint_tess_eval
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupany_uint_tess_control
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupany_uint_geometry
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_uint_vertex
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_uint_tess_eval
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_uint_tess_control
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_uint_geometry
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_uvec2_vertex
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_uvec2_tess_control
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_uvec2_geometry
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_uvec3_vertex
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_uvec3_tess_control
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_uvec3_geometry
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_uvec4_vertex
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_uvec4_tess_control
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_uvec4_geometry
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_float_vertex
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_float_tess_eval
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_float_tess_control
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_float_geometry
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_vec2_vertex
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_vec2_tess_eval
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_vec2_tess_control
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_vec2_geometry
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_vec3_vertex
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_vec3_tess_eval
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_vec3_tess_control
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_vec3_geometry
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_vec4_vertex
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_vec4_tess_eval
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_vec4_tess_control
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_vec4_geometry
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_double_vertex
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_double_tess_eval
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_double_tess_control
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_double_geometry
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_dvec2_vertex
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_dvec2_tess_control
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_dvec2_geometry
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_dvec3_vertex
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_dvec3_tess_control
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_dvec3_geometry
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_dvec4_vertex
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_dvec4_tess_control
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_dvec4_geometry
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_bool_vertex
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_bool_tess_eval
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_bool_tess_control
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_bool_geometry
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_bvec2_vertex
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_bvec2_tess_control
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_bvec2_geometry
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_bvec3_vertex
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_bvec3_tess_control
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_bvec3_geometry
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_bvec4_vertex
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_bvec4_tess_control
+KHR-Single-GLES32.subgroups.vote.framebuffer.subgroupallequal_bvec4_geometry
+KHR-Single-GLES32.subgroups.vote.frag_helper.subgroupallequal_int_fragment
+KHR-Single-GLES32.subgroups.vote.frag_helper.subgroupallequal_ivec2_fragment
+KHR-Single-GLES32.subgroups.vote.frag_helper.subgroupallequal_ivec3_fragment
+KHR-Single-GLES32.subgroups.vote.frag_helper.subgroupallequal_ivec4_fragment
+KHR-Single-GLES32.subgroups.vote.frag_helper.subgroupall_uint_fragment
+KHR-Single-GLES32.subgroups.vote.frag_helper.subgroupany_uint_fragment
+KHR-Single-GLES32.subgroups.vote.frag_helper.subgroupallequal_uint_fragment
+KHR-Single-GLES32.subgroups.vote.frag_helper.subgroupallequal_uvec2_fragment
+KHR-Single-GLES32.subgroups.vote.frag_helper.subgroupallequal_uvec3_fragment
+KHR-Single-GLES32.subgroups.vote.frag_helper.subgroupallequal_uvec4_fragment
+KHR-Single-GLES32.subgroups.vote.frag_helper.subgroupallequal_float_fragment
+KHR-Single-GLES32.subgroups.vote.frag_helper.subgroupallequal_vec2_fragment
+KHR-Single-GLES32.subgroups.vote.frag_helper.subgroupallequal_vec3_fragment
+KHR-Single-GLES32.subgroups.vote.frag_helper.subgroupallequal_vec4_fragment
+KHR-Single-GLES32.subgroups.vote.frag_helper.subgroupallequal_double_fragment
+KHR-Single-GLES32.subgroups.vote.frag_helper.subgroupallequal_dvec2_fragment
+KHR-Single-GLES32.subgroups.vote.frag_helper.subgroupallequal_dvec3_fragment
+KHR-Single-GLES32.subgroups.vote.frag_helper.subgroupallequal_dvec4_fragment
+KHR-Single-GLES32.subgroups.vote.frag_helper.subgroupallequal_bool_fragment
+KHR-Single-GLES32.subgroups.vote.frag_helper.subgroupallequal_bvec2_fragment
+KHR-Single-GLES32.subgroups.vote.frag_helper.subgroupallequal_bvec3_fragment
+KHR-Single-GLES32.subgroups.vote.frag_helper.subgroupallequal_bvec4_fragment
+KHR-Single-GLES32.subgroups.ballot.graphics.graphic
+KHR-Single-GLES32.subgroups.ballot.compute.compute
+KHR-Single-GLES32.subgroups.ballot.framebuffer.tess_eval
+KHR-Single-GLES32.subgroups.ballot.framebuffer.tess_control
+KHR-Single-GLES32.subgroups.ballot.framebuffer.geometry
+KHR-Single-GLES32.subgroups.ballot.framebuffer.vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcast_int
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_int
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcast_ivec2
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_ivec2
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcast_ivec3
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_ivec3
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcast_ivec4
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_ivec4
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcast_uint
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_uint
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcast_uvec2
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_uvec2
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcast_uvec3
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_uvec3
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcast_uvec4
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_uvec4
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcast_float
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_float
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcast_vec2
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_vec2
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcast_vec3
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_vec3
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcast_vec4
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_vec4
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcast_double
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_double
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcast_dvec2
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_dvec2
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcast_dvec3
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_dvec3
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcast_dvec4
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_dvec4
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcast_bool
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_bool
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcast_bvec2
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_bvec2
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcast_bvec3
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_bvec3
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcast_bvec4
+KHR-Single-GLES32.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_bvec4
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcast_int
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_int
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcast_ivec2
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_ivec2
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcast_ivec3
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_ivec3
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcast_ivec4
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_ivec4
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcast_uint
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_uint
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcast_uvec2
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_uvec2
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcast_uvec3
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_uvec3
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcast_uvec4
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_uvec4
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcast_float
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_float
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcast_vec2
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_vec2
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcast_vec3
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_vec3
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcast_vec4
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_vec4
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcast_double
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_double
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcast_dvec2
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_dvec2
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcast_dvec3
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_dvec3
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcast_dvec4
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_dvec4
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcast_bool
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_bool
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcast_bvec2
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_bvec2
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcast_bvec3
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_bvec3
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcast_bvec4
+KHR-Single-GLES32.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_bvec4
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_intvertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_inttess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_inttess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_intgeometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_intvertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_inttess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_inttess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_intgeometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec2vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec2tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec2tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec2geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec2vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec2tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec2tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec2geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec3vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec3tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec3tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec3geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec3vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec3tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec3tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec3geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec4vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec4tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec4tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec4geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec4vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec4tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec4tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec4geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uintvertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uinttess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uinttess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uintgeometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uintvertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uinttess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uinttess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uintgeometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec2vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec2tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec2tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec2geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec2vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec2tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec2tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec2geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec3vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec3tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec3tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec3geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec3vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec3tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec3tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec3geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec4vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec4tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec4tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec4geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec4vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec4tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec4tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec4geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_floatvertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_floattess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_floattess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_floatgeometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_floatvertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_floattess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_floattess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_floatgeometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec2vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec2tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec2tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec2geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec2vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec2tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec2tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec2geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec3vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec3tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec3tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec3geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec3vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec3tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec3tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec3geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec4vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec4tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec4tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec4geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec4vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec4tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec4tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec4geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_doublevertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_doubletess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_doubletess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_doublegeometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_doublevertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_doubletess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_doubletess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_doublegeometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec2vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec2tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec2tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec2geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec2vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec2tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec2tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec2geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec3vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec3tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec3tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec3geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec3vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec3tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec3tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec3geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec4vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec4tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec4tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec4geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec4vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec4tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec4tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec4geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_boolvertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_booltess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_booltess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_boolgeometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_boolvertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_booltess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_booltess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_boolgeometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec2vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec2tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec2tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec2geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec2vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec2tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec2tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec2geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec3vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec3tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec3tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec3geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec3vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec3tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec3tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec3geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec4vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec4tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec4tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec4geometry
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec4vertex
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec4tess_eval
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec4tess_control
+KHR-Single-GLES32.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec4geometry
+KHR-Single-GLES32.subgroups.ballot_other.graphics.subgroupinverseballot
+KHR-Single-GLES32.subgroups.ballot_other.graphics.subgroupballotbitextract
+KHR-Single-GLES32.subgroups.ballot_other.graphics.subgroupballotbitcount
+KHR-Single-GLES32.subgroups.ballot_other.graphics.subgroupballotinclusivebitcount
+KHR-Single-GLES32.subgroups.ballot_other.graphics.subgroupballotexclusivebitcount
+KHR-Single-GLES32.subgroups.ballot_other.graphics.subgroupballotfindlsb
+KHR-Single-GLES32.subgroups.ballot_other.graphics.subgroupballotfindmsb
+KHR-Single-GLES32.subgroups.ballot_other.compute.subgroupinverseballot
+KHR-Single-GLES32.subgroups.ballot_other.compute.subgroupballotbitextract
+KHR-Single-GLES32.subgroups.ballot_other.compute.subgroupballotbitcount
+KHR-Single-GLES32.subgroups.ballot_other.compute.subgroupballotinclusivebitcount
+KHR-Single-GLES32.subgroups.ballot_other.compute.subgroupballotexclusivebitcount
+KHR-Single-GLES32.subgroups.ballot_other.compute.subgroupballotfindlsb
+KHR-Single-GLES32.subgroups.ballot_other.compute.subgroupballotfindmsb
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupinverseballot_vertex
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupinverseballot_tess_eval
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupinverseballot_tess_control
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupinverseballot_geometry
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupballotbitextract_vertex
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupballotbitextract_tess_eval
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupballotbitextract_tess_control
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupballotbitextract_geometry
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupballotbitcount_vertex
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupballotbitcount_tess_eval
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupballotbitcount_tess_control
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupballotbitcount_geometry
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupballotinclusivebitcount_vertex
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupballotinclusivebitcount_tess_eval
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupballotinclusivebitcount_tess_control
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupballotinclusivebitcount_geometry
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupballotexclusivebitcount_vertex
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupballotexclusivebitcount_tess_eval
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupballotexclusivebitcount_tess_control
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupballotexclusivebitcount_geometry
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupballotfindlsb_vertex
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupballotfindlsb_tess_eval
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupballotfindlsb_tess_control
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupballotfindlsb_geometry
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupballotfindmsb_vertex
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupballotfindmsb_tess_eval
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupballotfindmsb_tess_control
+KHR-Single-GLES32.subgroups.ballot_other.framebuffer.subgroupballotfindmsb_geometry
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupadd_int
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmul_int
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmin_int
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmax_int
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupand_int
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupor_int
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupxor_int
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveadd_int
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemul_int
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemin_int
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemax_int
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveand_int
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveor_int
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivexor_int
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveadd_int
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemul_int
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemin_int
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemax_int
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveand_int
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveor_int
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivexor_int
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupadd_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmul_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmin_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmax_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupand_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupor_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupxor_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveadd_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemul_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemin_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemax_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveand_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveor_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivexor_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveadd_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemul_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemin_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemax_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveand_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveor_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivexor_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupadd_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmul_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmin_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmax_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupand_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupor_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupxor_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveadd_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemul_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemin_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemax_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveand_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveor_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivexor_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveadd_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemul_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemin_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemax_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveand_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveor_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivexor_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupadd_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmul_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmin_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmax_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupand_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupor_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupxor_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveadd_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemul_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemin_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemax_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveand_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveor_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivexor_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveadd_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemul_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemin_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemax_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveand_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveor_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivexor_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupadd_uint
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmul_uint
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmin_uint
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmax_uint
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupand_uint
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupor_uint
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupxor_uint
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveadd_uint
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemul_uint
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemin_uint
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemax_uint
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveand_uint
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveor_uint
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivexor_uint
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveadd_uint
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemul_uint
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemin_uint
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemax_uint
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveand_uint
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveor_uint
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivexor_uint
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupadd_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmul_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmin_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmax_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupand_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupor_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupxor_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveadd_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemul_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemin_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemax_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveand_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveor_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivexor_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveadd_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemul_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemin_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemax_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveand_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveor_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivexor_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupadd_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmul_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmin_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmax_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupand_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupor_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupxor_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveadd_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemul_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemin_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemax_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveand_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveor_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivexor_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveadd_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemul_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemin_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemax_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveand_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveor_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivexor_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupadd_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmul_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmin_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmax_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupand_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupor_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupxor_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveadd_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemul_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemin_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemax_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveand_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveor_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivexor_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveadd_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemul_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemin_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemax_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveand_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveor_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivexor_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupadd_float
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmul_float
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmin_float
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmax_float
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveadd_float
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemul_float
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemin_float
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemax_float
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveadd_float
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemul_float
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemin_float
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemax_float
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupadd_vec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmul_vec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmin_vec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmax_vec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveadd_vec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemul_vec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemin_vec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemax_vec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveadd_vec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemul_vec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemin_vec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemax_vec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupadd_vec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmul_vec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmin_vec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmax_vec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveadd_vec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemul_vec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemin_vec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemax_vec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveadd_vec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemul_vec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemin_vec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemax_vec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupadd_vec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmul_vec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmin_vec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmax_vec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveadd_vec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemul_vec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemin_vec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemax_vec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveadd_vec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemul_vec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemin_vec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemax_vec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupadd_double
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmul_double
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmin_double
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmax_double
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveadd_double
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemul_double
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemin_double
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemax_double
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveadd_double
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemul_double
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemin_double
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemax_double
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupadd_dvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmul_dvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmin_dvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmax_dvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveadd_dvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemul_dvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemin_dvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemax_dvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveadd_dvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemul_dvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemin_dvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemax_dvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupadd_dvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmul_dvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmin_dvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmax_dvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveadd_dvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemul_dvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemin_dvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemax_dvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveadd_dvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemul_dvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemin_dvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemax_dvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupadd_dvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmul_dvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmin_dvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupmax_dvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveadd_dvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemul_dvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemin_dvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivemax_dvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveadd_dvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemul_dvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemin_dvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivemax_dvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupand_bool
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupor_bool
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupxor_bool
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveand_bool
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveor_bool
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivexor_bool
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveand_bool
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveor_bool
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivexor_bool
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupand_bvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupor_bvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupxor_bvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveand_bvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveor_bvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivexor_bvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveand_bvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveor_bvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivexor_bvec2
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupand_bvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupor_bvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupxor_bvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveand_bvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveor_bvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivexor_bvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveand_bvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveor_bvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivexor_bvec3
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupand_bvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupor_bvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupxor_bvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveand_bvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusiveor_bvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupinclusivexor_bvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveand_bvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusiveor_bvec4
+KHR-Single-GLES32.subgroups.arithmetic.graphics.subgroupexclusivexor_bvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupadd_int
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmul_int
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmin_int
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmax_int
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupand_int
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupor_int
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupxor_int
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveadd_int
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemul_int
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemin_int
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemax_int
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveand_int
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveor_int
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivexor_int
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveadd_int
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemul_int
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemin_int
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemax_int
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveand_int
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveor_int
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivexor_int
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupadd_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmul_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmin_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmax_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupand_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupor_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupxor_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveadd_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemul_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemin_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemax_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveand_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveor_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivexor_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveadd_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemul_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemin_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemax_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveand_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveor_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivexor_ivec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupadd_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmul_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmin_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmax_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupand_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupor_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupxor_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveadd_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemul_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemin_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemax_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveand_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveor_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivexor_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveadd_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemul_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemin_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemax_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveand_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveor_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivexor_ivec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupadd_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmul_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmin_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmax_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupand_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupor_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupxor_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveadd_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemul_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemin_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemax_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveand_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveor_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivexor_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveadd_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemul_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemin_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemax_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveand_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveor_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivexor_ivec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupadd_uint
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmul_uint
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmin_uint
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmax_uint
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupand_uint
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupor_uint
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupxor_uint
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveadd_uint
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemul_uint
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemin_uint
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemax_uint
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveand_uint
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveor_uint
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivexor_uint
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveadd_uint
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemul_uint
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemin_uint
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemax_uint
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveand_uint
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveor_uint
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivexor_uint
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupadd_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmul_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmin_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmax_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupand_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupor_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupxor_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveadd_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemul_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemin_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemax_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveand_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveor_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivexor_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveadd_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemul_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemin_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemax_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveand_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveor_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivexor_uvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupadd_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmul_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmin_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmax_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupand_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupor_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupxor_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveadd_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemul_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemin_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemax_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveand_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveor_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivexor_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveadd_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemul_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemin_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemax_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveand_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveor_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivexor_uvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupadd_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmul_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmin_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmax_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupand_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupor_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupxor_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveadd_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemul_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemin_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemax_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveand_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveor_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivexor_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveadd_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemul_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemin_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemax_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveand_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveor_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivexor_uvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupadd_float
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmul_float
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmin_float
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmax_float
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveadd_float
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemul_float
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemin_float
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemax_float
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveadd_float
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemul_float
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemin_float
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemax_float
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupadd_vec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmul_vec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmin_vec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmax_vec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveadd_vec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemul_vec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemin_vec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemax_vec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveadd_vec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemul_vec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemin_vec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemax_vec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupadd_vec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmul_vec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmin_vec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmax_vec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveadd_vec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemul_vec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemin_vec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemax_vec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveadd_vec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemul_vec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemin_vec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemax_vec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupadd_vec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmul_vec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmin_vec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmax_vec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveadd_vec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemul_vec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemin_vec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemax_vec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveadd_vec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemul_vec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemin_vec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemax_vec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupadd_double
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmul_double
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmin_double
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmax_double
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveadd_double
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemul_double
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemin_double
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemax_double
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveadd_double
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemul_double
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemin_double
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemax_double
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupadd_dvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmul_dvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmin_dvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmax_dvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveadd_dvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemul_dvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemin_dvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemax_dvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveadd_dvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemul_dvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemin_dvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemax_dvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupadd_dvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmul_dvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmin_dvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmax_dvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveadd_dvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemul_dvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemin_dvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemax_dvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveadd_dvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemul_dvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemin_dvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemax_dvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupadd_dvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmul_dvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmin_dvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupmax_dvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveadd_dvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemul_dvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemin_dvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivemax_dvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveadd_dvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemul_dvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemin_dvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivemax_dvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupand_bool
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupor_bool
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupxor_bool
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveand_bool
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveor_bool
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivexor_bool
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveand_bool
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveor_bool
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivexor_bool
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupand_bvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupor_bvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupxor_bvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveand_bvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveor_bvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivexor_bvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveand_bvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveor_bvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivexor_bvec2
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupand_bvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupor_bvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupxor_bvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveand_bvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveor_bvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivexor_bvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveand_bvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveor_bvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivexor_bvec3
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupand_bvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupor_bvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupxor_bvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveand_bvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusiveor_bvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupinclusivexor_bvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveand_bvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusiveor_bvec4
+KHR-Single-GLES32.subgroups.arithmetic.compute.subgroupexclusivexor_bvec4
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_int_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_int_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_int_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_int_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_int_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_int_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_int_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_int_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_int_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_int_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_int_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_int_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_int_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_int_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_int_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_int_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_int_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_int_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_int_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_int_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_int_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_int_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_int_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_int_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_int_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_int_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_int_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_int_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_int_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_int_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_int_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_int_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_int_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_int_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_int_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_int_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_int_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_int_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_int_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_int_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_int_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_int_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_int_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_int_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_int_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_int_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_int_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_int_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_int_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_int_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_int_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_int_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_int_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_int_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_int_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_int_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_int_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_int_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_int_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_int_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_int_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_int_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_int_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_int_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_int_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_int_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_int_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_int_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_int_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_int_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_int_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_int_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_int_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_int_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_int_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_int_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_int_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_int_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_int_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_int_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_int_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_int_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_int_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_int_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_ivec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_ivec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_ivec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_ivec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_ivec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_ivec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_ivec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_ivec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_ivec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_ivec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_ivec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_ivec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_ivec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_ivec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_ivec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_ivec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_ivec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_ivec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_ivec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_ivec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_ivec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_ivec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_ivec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_ivec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_ivec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_ivec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_ivec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_ivec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_ivec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_ivec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_ivec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_ivec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_ivec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_ivec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_ivec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_ivec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_ivec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_ivec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_ivec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_ivec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_ivec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_ivec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_ivec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_ivec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_ivec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_ivec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_ivec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_ivec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_ivec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_ivec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_ivec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_ivec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_ivec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_ivec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_ivec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_ivec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_ivec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_ivec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_ivec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_ivec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_ivec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_ivec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_ivec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_uint_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_uint_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_uint_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_uint_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_uint_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_uint_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_uint_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_uint_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_uint_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_uint_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_uint_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_uint_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_uint_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_uint_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_uint_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_uint_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_uint_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_uint_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_uint_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_uint_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_uint_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_uint_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_uint_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_uint_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_uint_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_uint_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_uint_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_uint_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uint_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uint_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uint_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uint_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uint_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uint_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uint_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uint_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uint_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uint_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uint_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uint_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uint_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uint_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uint_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uint_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uint_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uint_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uint_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uint_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uint_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uint_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uint_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uint_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uint_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uint_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uint_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uint_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uint_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uint_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uint_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uint_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uint_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uint_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uint_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uint_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uint_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uint_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uint_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uint_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uint_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uint_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uint_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uint_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uint_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uint_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uint_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uint_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uint_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uint_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uint_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uint_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uint_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uint_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uint_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uint_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_uvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_uvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_uvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_uvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_uvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_uvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_uvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_uvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_uvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_uvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_uvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_uvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_uvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_uvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_uvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_uvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_uvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_uvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_uvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_uvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_uvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_uvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_uvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_uvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_uvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_uvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_uvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_uvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_uvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_uvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_uvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_uvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_uvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_uvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_uvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_uvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_uvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_uvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_uvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_uvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_uvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_uvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_uvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_uvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_uvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_uvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_uvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_uvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_uvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_uvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_uvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_uvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_uvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_uvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_uvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_uvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_uvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_uvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_uvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_uvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_uvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_uvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_uvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_float_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_float_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_float_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_float_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_float_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_float_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_float_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_float_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_float_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_float_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_float_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_float_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_float_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_float_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_float_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_float_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_float_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_float_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_float_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_float_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_float_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_float_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_float_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_float_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_float_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_float_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_float_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_float_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_float_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_float_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_float_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_float_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_float_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_float_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_float_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_float_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_float_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_float_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_float_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_float_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_float_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_float_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_float_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_float_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_float_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_float_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_float_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_float_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_vec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_vec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_vec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_vec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_vec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_vec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_vec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_vec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_vec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_vec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_vec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_vec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_vec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_vec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_vec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_vec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_vec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_vec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_vec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_vec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_vec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_vec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_vec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_vec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_vec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_vec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_vec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_vec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_vec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_vec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_vec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_vec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_vec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_vec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_vec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_vec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_vec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_vec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_vec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_vec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_vec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_vec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_vec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_vec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_vec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_vec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_vec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_vec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_double_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_double_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_double_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_double_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_double_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_double_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_double_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_double_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_double_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_double_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_double_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_double_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_double_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_double_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_double_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_double_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_double_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_double_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_double_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_double_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_double_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_double_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_double_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_double_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_double_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_double_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_double_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_double_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_double_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_double_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_double_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_double_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_double_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_double_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_double_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_double_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_double_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_double_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_double_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_double_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_double_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_double_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_double_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_double_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_double_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_double_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_double_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_double_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_dvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_dvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_dvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_dvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_dvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_dvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_dvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_dvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_dvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_dvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_dvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_dvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_dvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_dvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_dvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_dvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_dvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_dvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_dvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_dvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_dvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_dvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_dvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_dvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_dvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_dvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupadd_dvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_dvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_dvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmul_dvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_dvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_dvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmin_dvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_dvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_dvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupmax_dvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_bool_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_bool_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_bool_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_bool_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_bool_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_bool_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_bool_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_bool_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_bool_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_bool_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_bool_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_bool_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bool_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bool_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bool_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bool_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bool_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bool_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bool_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bool_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bool_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bool_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bool_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bool_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bool_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bool_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bool_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bool_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bool_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bool_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bool_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bool_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bool_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bool_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bool_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bool_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_bvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_bvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_bvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_bvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_bvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_bvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_bvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_bvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_bvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec2_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec2_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec2_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_bvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_bvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_bvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_bvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_bvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_bvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_bvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_bvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_bvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec3_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec3_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec3_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_bvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_bvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupand_bvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_bvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_bvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupor_bvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_bvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_bvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupxor_bvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec4_geometry
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec4_vertex
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec4_tess_control
+KHR-Single-GLES32.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec4_geometry
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredadd_int
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmul_int
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmin_int
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmax_int
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredand_int
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredor_int
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredxor_int
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredadd_ivec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmul_ivec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmin_ivec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmax_ivec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredand_ivec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredor_ivec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredxor_ivec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredadd_ivec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmul_ivec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmin_ivec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmax_ivec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredand_ivec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredor_ivec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredxor_ivec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredadd_ivec4
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmul_ivec4
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmin_ivec4
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmax_ivec4
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredand_ivec4
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredor_ivec4
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredxor_ivec4
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredadd_uint
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmul_uint
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmin_uint
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmax_uint
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredand_uint
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredor_uint
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredxor_uint
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredadd_uvec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmul_uvec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmin_uvec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmax_uvec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredand_uvec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredor_uvec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredxor_uvec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredadd_uvec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmul_uvec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmin_uvec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmax_uvec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredand_uvec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredor_uvec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredxor_uvec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredadd_uvec4
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmul_uvec4
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmin_uvec4
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmax_uvec4
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredand_uvec4
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredor_uvec4
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredxor_uvec4
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredadd_float
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmul_float
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmin_float
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmax_float
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredadd_vec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmul_vec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmin_vec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmax_vec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredadd_vec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmul_vec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmin_vec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmax_vec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredadd_vec4
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmul_vec4
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmin_vec4
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmax_vec4
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredadd_double
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmul_double
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmin_double
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmax_double
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredadd_dvec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmul_dvec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmin_dvec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmax_dvec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredadd_dvec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmul_dvec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmin_dvec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmax_dvec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredadd_dvec4
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmul_dvec4
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmin_dvec4
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredmax_dvec4
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredand_bool
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredor_bool
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredxor_bool
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredand_bvec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredor_bvec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredxor_bvec2
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredand_bvec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredor_bvec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredxor_bvec3
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredand_bvec4
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredor_bvec4
+KHR-Single-GLES32.subgroups.clustered.graphics.subgroupclusteredxor_bvec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredadd_int
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmul_int
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmin_int
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmax_int
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredand_int
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredor_int
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredxor_int
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredadd_ivec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmul_ivec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmin_ivec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmax_ivec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredand_ivec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredor_ivec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredxor_ivec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredadd_ivec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmul_ivec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmin_ivec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmax_ivec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredand_ivec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredor_ivec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredxor_ivec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredadd_ivec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmul_ivec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmin_ivec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmax_ivec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredand_ivec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredor_ivec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredxor_ivec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredadd_uint
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmul_uint
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmin_uint
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmax_uint
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredand_uint
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredor_uint
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredxor_uint
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredadd_uvec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmul_uvec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmin_uvec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmax_uvec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredand_uvec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredor_uvec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredxor_uvec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredadd_uvec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmul_uvec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmin_uvec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmax_uvec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredand_uvec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredor_uvec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredxor_uvec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredadd_uvec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmul_uvec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmin_uvec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmax_uvec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredand_uvec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredor_uvec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredxor_uvec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredadd_float
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmul_float
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmin_float
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmax_float
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredadd_vec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmul_vec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmin_vec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmax_vec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredadd_vec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmul_vec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmin_vec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmax_vec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredadd_vec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmul_vec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmin_vec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmax_vec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredadd_double
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmul_double
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmin_double
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmax_double
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredadd_dvec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmul_dvec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmin_dvec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmax_dvec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredadd_dvec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmul_dvec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmin_dvec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmax_dvec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredadd_dvec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmul_dvec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmin_dvec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredmax_dvec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredand_bool
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredor_bool
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredxor_bool
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredand_bvec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredor_bvec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredxor_bvec2
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredand_bvec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredor_bvec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredxor_bvec3
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredand_bvec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredor_bvec4
+KHR-Single-GLES32.subgroups.clustered.compute.subgroupclusteredxor_bvec4
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_int_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_int_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_int_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_int_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_int_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_int_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_int_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_int_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_int_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_int_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_int_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_int_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_int_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_int_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_int_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_int_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_int_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_int_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_int_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_int_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_int_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_int_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_int_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_int_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_int_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_int_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_int_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_int_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_ivec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_ivec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_ivec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_ivec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_ivec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_ivec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_ivec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_ivec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_ivec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_ivec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_ivec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_ivec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec4_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec4_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec4_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec4_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_ivec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_ivec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_ivec4_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_ivec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_ivec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_ivec4_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec4_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_uint_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_uint_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_uint_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_uint_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_uint_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_uint_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_uint_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_uint_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_uint_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_uint_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_uint_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_uint_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_uint_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_uint_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_uint_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_uint_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_uint_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_uint_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_uint_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_uint_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_uint_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_uint_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_uint_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_uint_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_uint_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_uint_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_uint_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_uint_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_uvec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_uvec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_uvec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_uvec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_uvec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_uvec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_uvec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_uvec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_uvec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_uvec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_uvec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_uvec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec4_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec4_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec4_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec4_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_uvec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_uvec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_uvec4_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_uvec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_uvec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_uvec4_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec4_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_float_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_float_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_float_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_float_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_float_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_float_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_float_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_float_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_float_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_float_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_float_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_float_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_float_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_float_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_float_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_float_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_vec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_vec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_vec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_vec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_vec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_vec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_vec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_vec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_vec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_vec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_vec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_vec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_vec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_vec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_vec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_vec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_vec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_vec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_vec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_vec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_vec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_vec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_vec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_vec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_vec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_vec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_vec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_vec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_vec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_vec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_vec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_vec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_vec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_vec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_vec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_vec4_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_vec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_vec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_vec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_vec4_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_vec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_vec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_vec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_vec4_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_vec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_vec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_vec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_vec4_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_double_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_double_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_double_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_double_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_double_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_double_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_double_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_double_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_double_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_double_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_double_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_double_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_double_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_double_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_double_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_double_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec4_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec4_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec4_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec4_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_bool_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_bool_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_bool_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_bool_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_bool_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_bool_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_bool_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_bool_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_bool_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_bool_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_bool_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_bool_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_bvec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_bvec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_bvec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_bvec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_bvec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_bvec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec2_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec2_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec2_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_bvec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_bvec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_bvec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_bvec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_bvec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_bvec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec3_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec3_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec3_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_bvec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_bvec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredand_bvec4_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_bvec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_bvec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredor_bvec4_geometry
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec4_vertex
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec4_tess_control
+KHR-Single-GLES32.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupadd_int
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmul_int
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmin_int
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmax_int
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupand_int
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupor_int
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupxor_int
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveadd_int
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemul_int
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemin_int
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemax_int
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveand_int
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveor_int
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivexor_int
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveadd_int
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemul_int
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemin_int
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemax_int
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveand_int
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveor_int
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivexor_int
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupadd_ivec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmul_ivec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmin_ivec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmax_ivec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupand_ivec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupor_ivec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupxor_ivec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveadd_ivec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemul_ivec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemin_ivec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemax_ivec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveand_ivec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveor_ivec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivexor_ivec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveadd_ivec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemul_ivec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemin_ivec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemax_ivec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveand_ivec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveor_ivec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivexor_ivec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupadd_ivec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmul_ivec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmin_ivec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmax_ivec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupand_ivec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupor_ivec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupxor_ivec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveadd_ivec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemul_ivec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemin_ivec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemax_ivec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveand_ivec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveor_ivec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivexor_ivec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveadd_ivec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemul_ivec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemin_ivec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemax_ivec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveand_ivec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveor_ivec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivexor_ivec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupadd_ivec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmul_ivec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmin_ivec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmax_ivec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupand_ivec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupor_ivec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupxor_ivec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveadd_ivec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemul_ivec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemin_ivec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemax_ivec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveand_ivec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveor_ivec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivexor_ivec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveadd_ivec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemul_ivec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemin_ivec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemax_ivec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveand_ivec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveor_ivec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivexor_ivec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupadd_uint
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmul_uint
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmin_uint
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmax_uint
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupand_uint
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupor_uint
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupxor_uint
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveadd_uint
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemul_uint
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemin_uint
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemax_uint
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveand_uint
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveor_uint
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivexor_uint
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveadd_uint
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemul_uint
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemin_uint
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemax_uint
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveand_uint
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveor_uint
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivexor_uint
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupadd_uvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmul_uvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmin_uvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmax_uvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupand_uvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupor_uvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupxor_uvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveadd_uvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemul_uvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemin_uvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemax_uvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveand_uvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveor_uvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivexor_uvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveadd_uvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemul_uvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemin_uvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemax_uvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveand_uvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveor_uvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivexor_uvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupadd_uvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmul_uvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmin_uvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmax_uvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupand_uvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupor_uvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupxor_uvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveadd_uvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemul_uvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemin_uvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemax_uvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveand_uvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveor_uvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivexor_uvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveadd_uvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemul_uvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemin_uvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemax_uvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveand_uvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveor_uvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivexor_uvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupadd_uvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmul_uvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmin_uvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmax_uvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupand_uvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupor_uvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupxor_uvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveadd_uvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemul_uvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemin_uvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemax_uvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveand_uvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveor_uvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivexor_uvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveadd_uvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemul_uvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemin_uvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemax_uvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveand_uvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveor_uvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivexor_uvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupadd_float
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmul_float
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmin_float
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmax_float
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveadd_float
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemul_float
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemin_float
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemax_float
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveadd_float
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemul_float
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemin_float
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemax_float
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupadd_vec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmul_vec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmin_vec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmax_vec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveadd_vec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemul_vec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemin_vec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemax_vec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveadd_vec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemul_vec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemin_vec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemax_vec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupadd_vec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmul_vec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmin_vec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmax_vec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveadd_vec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemul_vec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemin_vec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemax_vec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveadd_vec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemul_vec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemin_vec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemax_vec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupadd_vec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmul_vec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmin_vec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmax_vec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveadd_vec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemul_vec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemin_vec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemax_vec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveadd_vec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemul_vec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemin_vec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemax_vec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupadd_double
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmul_double
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmin_double
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmax_double
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveadd_double
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemul_double
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemin_double
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemax_double
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveadd_double
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemul_double
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemin_double
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemax_double
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupadd_dvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmul_dvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmin_dvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmax_dvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveadd_dvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemul_dvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemin_dvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemax_dvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveadd_dvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemul_dvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemin_dvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemax_dvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupadd_dvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmul_dvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmin_dvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmax_dvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveadd_dvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemul_dvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemin_dvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemax_dvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveadd_dvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemul_dvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemin_dvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemax_dvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupadd_dvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmul_dvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmin_dvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupmax_dvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveadd_dvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemul_dvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemin_dvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivemax_dvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveadd_dvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemul_dvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemin_dvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivemax_dvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupand_bool
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupor_bool
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupxor_bool
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveand_bool
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveor_bool
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivexor_bool
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveand_bool
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveor_bool
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivexor_bool
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupand_bvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupor_bvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupxor_bvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveand_bvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveor_bvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivexor_bvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveand_bvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveor_bvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivexor_bvec2
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupand_bvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupor_bvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupxor_bvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveand_bvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveor_bvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivexor_bvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveand_bvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveor_bvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivexor_bvec3
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupand_bvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupor_bvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupxor_bvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveand_bvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusiveor_bvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupinclusivexor_bvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveand_bvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusiveor_bvec4
+KHR-Single-GLES32.subgroups.partitioned.graphics.subgroupexclusivexor_bvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupadd_int
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmul_int
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmin_int
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmax_int
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupand_int
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupor_int
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupxor_int
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveadd_int
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemul_int
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemin_int
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemax_int
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveand_int
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveor_int
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivexor_int
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveadd_int
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemul_int
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemin_int
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemax_int
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveand_int
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveor_int
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivexor_int
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupadd_ivec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmul_ivec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmin_ivec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmax_ivec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupand_ivec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupor_ivec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupxor_ivec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveadd_ivec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemul_ivec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemin_ivec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemax_ivec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveand_ivec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveor_ivec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivexor_ivec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveadd_ivec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemul_ivec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemin_ivec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemax_ivec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveand_ivec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveor_ivec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivexor_ivec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupadd_ivec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmul_ivec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmin_ivec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmax_ivec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupand_ivec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupor_ivec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupxor_ivec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveadd_ivec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemul_ivec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemin_ivec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemax_ivec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveand_ivec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveor_ivec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivexor_ivec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveadd_ivec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemul_ivec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemin_ivec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemax_ivec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveand_ivec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveor_ivec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivexor_ivec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupadd_ivec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmul_ivec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmin_ivec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmax_ivec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupand_ivec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupor_ivec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupxor_ivec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveadd_ivec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemul_ivec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemin_ivec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemax_ivec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveand_ivec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveor_ivec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivexor_ivec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveadd_ivec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemul_ivec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemin_ivec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemax_ivec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveand_ivec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveor_ivec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivexor_ivec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupadd_uint
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmul_uint
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmin_uint
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmax_uint
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupand_uint
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupor_uint
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupxor_uint
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveadd_uint
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemul_uint
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemin_uint
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemax_uint
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveand_uint
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveor_uint
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivexor_uint
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveadd_uint
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemul_uint
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemin_uint
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemax_uint
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveand_uint
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveor_uint
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivexor_uint
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupadd_uvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmul_uvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmin_uvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmax_uvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupand_uvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupor_uvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupxor_uvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveadd_uvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemul_uvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemin_uvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemax_uvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveand_uvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveor_uvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivexor_uvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveadd_uvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemul_uvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemin_uvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemax_uvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveand_uvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveor_uvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivexor_uvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupadd_uvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmul_uvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmin_uvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmax_uvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupand_uvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupor_uvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupxor_uvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveadd_uvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemul_uvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemin_uvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemax_uvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveand_uvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveor_uvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivexor_uvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveadd_uvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemul_uvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemin_uvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemax_uvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveand_uvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveor_uvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivexor_uvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupadd_uvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmul_uvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmin_uvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmax_uvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupand_uvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupor_uvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupxor_uvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveadd_uvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemul_uvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemin_uvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemax_uvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveand_uvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveor_uvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivexor_uvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveadd_uvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemul_uvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemin_uvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemax_uvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveand_uvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveor_uvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivexor_uvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupadd_float
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmul_float
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmin_float
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmax_float
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveadd_float
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemul_float
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemin_float
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemax_float
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveadd_float
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemul_float
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemin_float
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemax_float
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupadd_vec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmul_vec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmin_vec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmax_vec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveadd_vec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemul_vec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemin_vec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemax_vec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveadd_vec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemul_vec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemin_vec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemax_vec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupadd_vec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmul_vec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmin_vec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmax_vec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveadd_vec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemul_vec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemin_vec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemax_vec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveadd_vec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemul_vec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemin_vec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemax_vec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupadd_vec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmul_vec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmin_vec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmax_vec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveadd_vec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemul_vec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemin_vec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemax_vec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveadd_vec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemul_vec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemin_vec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemax_vec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupadd_double
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmul_double
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmin_double
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmax_double
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveadd_double
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemul_double
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemin_double
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemax_double
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveadd_double
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemul_double
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemin_double
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemax_double
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupadd_dvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmul_dvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmin_dvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmax_dvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveadd_dvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemul_dvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemin_dvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemax_dvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveadd_dvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemul_dvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemin_dvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemax_dvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupadd_dvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmul_dvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmin_dvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmax_dvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveadd_dvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemul_dvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemin_dvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemax_dvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveadd_dvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemul_dvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemin_dvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemax_dvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupadd_dvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmul_dvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmin_dvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupmax_dvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveadd_dvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemul_dvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemin_dvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivemax_dvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveadd_dvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemul_dvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemin_dvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivemax_dvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupand_bool
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupor_bool
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupxor_bool
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveand_bool
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveor_bool
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivexor_bool
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveand_bool
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveor_bool
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivexor_bool
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupand_bvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupor_bvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupxor_bvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveand_bvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveor_bvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivexor_bvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveand_bvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveor_bvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivexor_bvec2
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupand_bvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupor_bvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupxor_bvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveand_bvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveor_bvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivexor_bvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveand_bvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveor_bvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivexor_bvec3
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupand_bvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupor_bvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupxor_bvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveand_bvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusiveor_bvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupinclusivexor_bvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveand_bvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusiveor_bvec4
+KHR-Single-GLES32.subgroups.partitioned.compute.subgroupexclusivexor_bvec4
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_int_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_int_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_int_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_int_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_int_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_int_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_int_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_int_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_int_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_int_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_int_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_int_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_int_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_int_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_int_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_int_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_int_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_int_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_int_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_int_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_int_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_int_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_int_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_int_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_int_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_int_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_int_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_int_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_int_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_int_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_int_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_int_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_int_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_int_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_int_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_int_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_int_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_int_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_int_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_int_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_int_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_int_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_int_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_int_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_int_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_int_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_int_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_int_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_int_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_int_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_int_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_int_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_int_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_int_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_int_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_int_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_int_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_int_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_int_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_int_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_int_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_int_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_int_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_int_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_int_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_int_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_int_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_int_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_int_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_int_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_int_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_int_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_int_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_int_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_int_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_int_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_int_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_int_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_int_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_int_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_int_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_int_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_int_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_int_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_ivec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_ivec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_ivec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_ivec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_ivec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_ivec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_ivec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_ivec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_ivec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_ivec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_ivec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_ivec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_ivec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_ivec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_ivec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_ivec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_ivec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_ivec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_ivec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_ivec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_ivec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_ivec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_ivec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_ivec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_ivec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_ivec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_ivec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_ivec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_ivec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_ivec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_ivec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_ivec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_ivec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_ivec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_ivec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_ivec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_ivec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_ivec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_ivec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_ivec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_ivec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_ivec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_ivec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_ivec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_ivec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_ivec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_ivec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_ivec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_ivec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_ivec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_ivec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_ivec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_ivec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_ivec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_ivec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_ivec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_ivec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_ivec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_ivec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_ivec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_ivec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_ivec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_ivec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_uint_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_uint_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_uint_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_uint_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_uint_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_uint_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_uint_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_uint_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_uint_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_uint_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_uint_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_uint_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_uint_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_uint_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_uint_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_uint_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_uint_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_uint_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_uint_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_uint_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_uint_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_uint_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_uint_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_uint_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_uint_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_uint_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_uint_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_uint_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uint_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uint_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uint_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uint_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_uint_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_uint_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_uint_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_uint_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_uint_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_uint_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_uint_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_uint_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_uint_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_uint_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_uint_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_uint_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_uint_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_uint_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_uint_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_uint_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_uint_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_uint_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_uint_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_uint_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_uint_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_uint_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_uint_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_uint_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uint_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uint_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uint_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uint_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_uint_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_uint_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_uint_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_uint_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_uint_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_uint_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_uint_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_uint_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_uint_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_uint_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_uint_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_uint_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_uint_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_uint_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_uint_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_uint_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_uint_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_uint_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_uint_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_uint_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_uint_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_uint_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_uint_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_uint_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_uvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_uvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_uvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_uvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_uvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_uvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_uvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_uvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_uvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_uvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_uvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_uvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_uvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_uvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_uvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_uvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_uvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_uvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_uvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_uvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_uvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_uvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_uvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_uvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_uvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_uvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_uvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_uvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_uvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_uvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_uvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_uvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_uvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_uvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_uvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_uvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_uvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_uvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_uvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_uvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_uvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_uvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_uvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_uvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_uvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_uvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_uvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_uvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_uvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_uvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_uvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_uvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_uvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_uvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_uvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_uvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_uvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_uvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_uvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_uvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_uvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_uvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_uvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_float_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_float_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_float_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_float_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_float_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_float_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_float_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_float_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_float_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_float_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_float_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_float_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_float_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_float_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_float_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_float_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_float_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_float_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_float_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_float_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_float_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_float_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_float_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_float_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_float_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_float_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_float_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_float_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_float_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_float_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_float_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_float_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_float_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_float_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_float_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_float_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_float_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_float_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_float_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_float_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_float_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_float_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_float_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_float_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_float_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_float_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_float_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_float_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_vec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_vec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_vec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_vec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_vec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_vec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_vec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_vec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_vec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_vec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_vec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_vec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_vec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_vec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_vec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_vec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_vec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_vec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_vec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_vec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_vec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_vec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_vec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_vec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_vec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_vec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_vec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_vec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_vec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_vec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_vec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_vec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_vec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_vec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_vec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_vec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_vec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_vec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_vec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_vec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_vec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_vec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_vec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_vec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_vec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_vec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_vec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_vec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_double_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_double_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_double_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_double_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_double_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_double_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_double_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_double_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_double_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_double_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_double_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_double_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_double_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_double_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_double_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_double_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_double_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_double_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_double_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_double_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_double_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_double_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_double_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_double_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_double_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_double_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_double_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_double_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_double_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_double_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_double_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_double_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_double_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_double_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_double_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_double_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_double_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_double_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_double_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_double_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_double_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_double_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_double_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_double_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_double_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_double_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_double_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_double_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_dvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_dvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_dvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_dvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_dvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_dvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_dvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_dvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_dvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_dvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_dvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_dvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_dvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_dvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_dvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_dvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_dvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_dvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_dvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_dvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_dvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_dvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_dvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_dvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_dvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_dvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupadd_dvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_dvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_dvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmul_dvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_dvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_dvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmin_dvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_dvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_dvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupmax_dvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_bool_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_bool_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_bool_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_bool_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_bool_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_bool_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_bool_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_bool_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_bool_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_bool_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_bool_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_bool_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_bool_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_bool_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_bool_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_bool_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_bool_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_bool_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_bool_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_bool_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_bool_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_bool_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_bool_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_bool_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_bool_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_bool_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_bool_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_bool_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_bool_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_bool_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_bool_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_bool_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_bool_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_bool_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_bool_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_bool_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_bvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_bvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_bvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_bvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_bvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_bvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_bvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_bvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_bvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec2_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec2_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec2_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_bvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_bvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_bvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_bvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_bvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_bvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_bvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_bvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_bvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec3_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec3_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec3_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_bvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_bvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupand_bvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_bvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_bvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupor_bvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_bvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_bvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupxor_bvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec4_geometry
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec4_vertex
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec4_tess_control
+KHR-Single-GLES32.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec4_geometry
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffle_int
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshufflexor_int
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffleup_int
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffledown_int
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffle_ivec2
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshufflexor_ivec2
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffleup_ivec2
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffledown_ivec2
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffle_ivec3
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshufflexor_ivec3
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffleup_ivec3
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffledown_ivec3
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffle_ivec4
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshufflexor_ivec4
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffleup_ivec4
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffledown_ivec4
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffle_uint
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshufflexor_uint
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffleup_uint
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffledown_uint
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffle_uvec2
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshufflexor_uvec2
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffleup_uvec2
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffledown_uvec2
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffle_uvec3
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshufflexor_uvec3
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffleup_uvec3
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffledown_uvec3
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffle_uvec4
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshufflexor_uvec4
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffleup_uvec4
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffledown_uvec4
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffle_float
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshufflexor_float
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffleup_float
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffledown_float
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffle_vec2
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshufflexor_vec2
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffleup_vec2
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffledown_vec2
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffle_vec3
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshufflexor_vec3
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffleup_vec3
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffledown_vec3
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffle_vec4
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshufflexor_vec4
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffleup_vec4
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffledown_vec4
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffle_double
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshufflexor_double
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffleup_double
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffledown_double
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffle_dvec2
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshufflexor_dvec2
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffleup_dvec2
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffledown_dvec2
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffle_dvec3
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshufflexor_dvec3
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffleup_dvec3
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffledown_dvec3
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffle_dvec4
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshufflexor_dvec4
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffleup_dvec4
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffledown_dvec4
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffle_bool
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshufflexor_bool
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffleup_bool
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffledown_bool
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffle_bvec2
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshufflexor_bvec2
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffleup_bvec2
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffledown_bvec2
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffle_bvec3
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshufflexor_bvec3
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffleup_bvec3
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffledown_bvec3
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffle_bvec4
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshufflexor_bvec4
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffleup_bvec4
+KHR-Single-GLES32.subgroups.shuffle.graphics.subgroupshuffledown_bvec4
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffle_int
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshufflexor_int
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffleup_int
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffledown_int
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffle_ivec2
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshufflexor_ivec2
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffleup_ivec2
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffledown_ivec2
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffle_ivec3
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshufflexor_ivec3
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffleup_ivec3
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffledown_ivec3
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffle_ivec4
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshufflexor_ivec4
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffleup_ivec4
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffledown_ivec4
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffle_uint
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshufflexor_uint
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffleup_uint
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffledown_uint
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffle_uvec2
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshufflexor_uvec2
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffleup_uvec2
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffledown_uvec2
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffle_uvec3
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshufflexor_uvec3
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffleup_uvec3
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffledown_uvec3
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffle_uvec4
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshufflexor_uvec4
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffleup_uvec4
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffledown_uvec4
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffle_float
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshufflexor_float
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffleup_float
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffledown_float
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffle_vec2
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshufflexor_vec2
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffleup_vec2
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffledown_vec2
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffle_vec3
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshufflexor_vec3
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffleup_vec3
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffledown_vec3
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffle_vec4
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshufflexor_vec4
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffleup_vec4
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffledown_vec4
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffle_double
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshufflexor_double
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffleup_double
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffledown_double
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffle_dvec2
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshufflexor_dvec2
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffleup_dvec2
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffledown_dvec2
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffle_dvec3
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshufflexor_dvec3
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffleup_dvec3
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffledown_dvec3
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffle_dvec4
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshufflexor_dvec4
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffleup_dvec4
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffledown_dvec4
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffle_bool
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshufflexor_bool
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffleup_bool
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffledown_bool
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffle_bvec2
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshufflexor_bvec2
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffleup_bvec2
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffledown_bvec2
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffle_bvec3
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshufflexor_bvec3
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffleup_bvec3
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffledown_bvec3
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffle_bvec4
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshufflexor_bvec4
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffleup_bvec4
+KHR-Single-GLES32.subgroups.shuffle.compute.subgroupshuffledown_bvec4
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_int_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_int_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_int_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_int_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_int_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_int_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_int_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_int_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_int_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_int_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_int_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_int_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_int_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_int_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_int_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_int_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_ivec2_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_ivec2_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_ivec2_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec2_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec2_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec2_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec2_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec2_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec2_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec2_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec2_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec2_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_ivec3_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_ivec3_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_ivec3_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec3_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec3_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec3_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec3_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec3_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec3_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec3_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec3_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec3_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_ivec4_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_ivec4_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_ivec4_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec4_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec4_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec4_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec4_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec4_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec4_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec4_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec4_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec4_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_uint_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_uint_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_uint_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_uint_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_uint_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_uint_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_uint_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_uint_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_uint_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_uint_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_uint_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_uint_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_uint_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_uint_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_uint_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_uint_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_uvec2_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_uvec2_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_uvec2_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec2_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec2_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec2_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec2_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec2_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec2_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec2_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec2_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec2_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_uvec3_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_uvec3_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_uvec3_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec3_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec3_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec3_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec3_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec3_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec3_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec3_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec3_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec3_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_uvec4_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_uvec4_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_uvec4_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec4_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec4_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec4_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec4_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec4_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec4_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec4_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec4_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec4_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_float_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_float_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_float_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_float_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_float_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_float_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_float_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_float_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_float_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_float_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_float_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_float_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_float_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_float_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_float_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_float_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_vec2_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_vec2_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_vec2_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_vec2_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_vec2_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_vec2_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_vec2_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_vec2_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_vec2_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_vec2_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_vec2_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_vec2_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_vec2_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_vec2_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_vec2_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_vec2_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_vec3_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_vec3_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_vec3_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_vec3_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_vec3_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_vec3_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_vec3_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_vec3_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_vec3_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_vec3_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_vec3_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_vec3_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_vec3_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_vec3_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_vec3_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_vec3_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_vec4_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_vec4_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_vec4_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_vec4_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_vec4_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_vec4_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_vec4_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_vec4_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_vec4_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_vec4_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_vec4_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_vec4_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_vec4_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_vec4_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_vec4_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_vec4_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_double_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_double_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_double_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_double_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_double_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_double_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_double_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_double_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_double_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_double_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_double_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_double_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_double_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_double_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_double_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_double_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_dvec2_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_dvec2_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_dvec2_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec2_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec2_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec2_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec2_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec2_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec2_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec2_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec2_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec2_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_dvec3_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_dvec3_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_dvec3_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec3_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec3_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec3_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec3_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec3_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec3_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec3_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec3_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec3_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_dvec4_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_dvec4_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_dvec4_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec4_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec4_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec4_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec4_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec4_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec4_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec4_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec4_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec4_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_bool_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_bool_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_bool_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_bool_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_bool_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_bool_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_bool_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_bool_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_bool_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_bool_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_bool_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_bool_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_bool_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_bool_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_bool_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_bool_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_bvec2_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_bvec2_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_bvec2_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec2_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec2_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec2_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec2_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec2_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec2_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec2_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec2_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec2_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_bvec3_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_bvec3_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_bvec3_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec3_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec3_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec3_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec3_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec3_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec3_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec3_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec3_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec3_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_bvec4_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_bvec4_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffle_bvec4_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec4_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec4_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec4_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec4_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec4_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec4_geometry
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec4_vertex
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec4_tess_control
+KHR-Single-GLES32.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec4_geometry
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_0_int
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswaphorizontal_int
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapvertical_int
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapdiagonal_int
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_0_ivec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswaphorizontal_ivec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapvertical_ivec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapdiagonal_ivec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_0_ivec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswaphorizontal_ivec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapvertical_ivec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapdiagonal_ivec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_0_ivec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswaphorizontal_ivec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapvertical_ivec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapdiagonal_ivec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_0_uint
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswaphorizontal_uint
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapvertical_uint
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapdiagonal_uint
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_0_uvec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswaphorizontal_uvec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapvertical_uvec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapdiagonal_uvec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_0_uvec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswaphorizontal_uvec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapvertical_uvec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapdiagonal_uvec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_0_uvec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswaphorizontal_uvec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapvertical_uvec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapdiagonal_uvec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_0_float
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswaphorizontal_float
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapvertical_float
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapdiagonal_float
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_0_vec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswaphorizontal_vec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapvertical_vec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapdiagonal_vec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_0_vec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswaphorizontal_vec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapvertical_vec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapdiagonal_vec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_0_vec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswaphorizontal_vec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapvertical_vec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapdiagonal_vec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_0_double
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswaphorizontal_double
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapvertical_double
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapdiagonal_double
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_0_dvec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswaphorizontal_dvec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapvertical_dvec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapdiagonal_dvec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_0_dvec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswaphorizontal_dvec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapvertical_dvec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapdiagonal_dvec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_0_dvec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswaphorizontal_dvec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapvertical_dvec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapdiagonal_dvec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_0_bool
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswaphorizontal_bool
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapvertical_bool
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapdiagonal_bool
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_0_bvec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswaphorizontal_bvec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapvertical_bvec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapdiagonal_bvec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_0_bvec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswaphorizontal_bvec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapvertical_bvec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapdiagonal_bvec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_0_bvec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswaphorizontal_bvec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapvertical_bvec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadswapdiagonal_bvec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_1_int
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_1_ivec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_1_ivec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_1_ivec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_1_uint
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_1_uvec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_1_uvec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_1_uvec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_1_float
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_1_vec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_1_vec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_1_vec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_1_double
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_1_dvec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_1_dvec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_1_dvec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_1_bool
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_1_bvec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_1_bvec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_1_bvec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_2_int
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_2_ivec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_2_ivec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_2_ivec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_2_uint
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_2_uvec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_2_uvec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_2_uvec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_2_float
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_2_vec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_2_vec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_2_vec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_2_double
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_2_dvec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_2_dvec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_2_dvec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_2_bool
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_2_bvec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_2_bvec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_2_bvec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_3_int
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_3_ivec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_3_ivec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_3_ivec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_3_uint
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_3_uvec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_3_uvec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_3_uvec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_3_float
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_3_vec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_3_vec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_3_vec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_3_double
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_3_dvec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_3_dvec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_3_dvec4
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_3_bool
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_3_bvec2
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_3_bvec3
+KHR-Single-GLES32.subgroups.quad.graphics.subgroupquadbroadcast_3_bvec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_0_int
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswaphorizontal_int
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapvertical_int
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapdiagonal_int
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_0_ivec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswaphorizontal_ivec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapvertical_ivec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapdiagonal_ivec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_0_ivec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswaphorizontal_ivec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapvertical_ivec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapdiagonal_ivec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_0_ivec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswaphorizontal_ivec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapvertical_ivec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapdiagonal_ivec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_0_uint
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswaphorizontal_uint
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapvertical_uint
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapdiagonal_uint
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_0_uvec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswaphorizontal_uvec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapvertical_uvec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapdiagonal_uvec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_0_uvec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswaphorizontal_uvec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapvertical_uvec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapdiagonal_uvec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_0_uvec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswaphorizontal_uvec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapvertical_uvec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapdiagonal_uvec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_0_float
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswaphorizontal_float
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapvertical_float
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapdiagonal_float
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_0_vec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswaphorizontal_vec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapvertical_vec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapdiagonal_vec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_0_vec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswaphorizontal_vec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapvertical_vec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapdiagonal_vec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_0_vec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswaphorizontal_vec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapvertical_vec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapdiagonal_vec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_0_double
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswaphorizontal_double
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapvertical_double
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapdiagonal_double
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_0_dvec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswaphorizontal_dvec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapvertical_dvec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapdiagonal_dvec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_0_dvec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswaphorizontal_dvec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapvertical_dvec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapdiagonal_dvec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_0_dvec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswaphorizontal_dvec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapvertical_dvec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapdiagonal_dvec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_0_bool
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswaphorizontal_bool
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapvertical_bool
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapdiagonal_bool
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_0_bvec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswaphorizontal_bvec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapvertical_bvec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapdiagonal_bvec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_0_bvec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswaphorizontal_bvec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapvertical_bvec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapdiagonal_bvec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_0_bvec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswaphorizontal_bvec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapvertical_bvec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadswapdiagonal_bvec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_1_int
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_1_ivec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_1_ivec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_1_ivec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_1_uint
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_1_uvec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_1_uvec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_1_uvec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_1_float
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_1_vec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_1_vec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_1_vec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_1_double
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_1_dvec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_1_dvec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_1_dvec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_1_bool
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_1_bvec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_1_bvec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_1_bvec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_2_int
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_2_ivec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_2_ivec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_2_ivec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_2_uint
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_2_uvec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_2_uvec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_2_uvec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_2_float
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_2_vec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_2_vec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_2_vec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_2_double
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_2_dvec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_2_dvec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_2_dvec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_2_bool
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_2_bvec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_2_bvec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_2_bvec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_3_int
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_3_ivec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_3_ivec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_3_ivec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_3_uint
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_3_uvec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_3_uvec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_3_uvec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_3_float
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_3_vec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_3_vec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_3_vec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_3_double
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_3_dvec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_3_dvec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_3_dvec4
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_3_bool
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_3_bvec2
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_3_bvec3
+KHR-Single-GLES32.subgroups.quad.compute.subgroupquadbroadcast_3_bvec4
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_int_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_int_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_int_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_int_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_int_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_int_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_int_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_int_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_int_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_int_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_int_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_int_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_int_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_int_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_int_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_int_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uint_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uint_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uint_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uint_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uint_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uint_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uint_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uint_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_uint_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_uint_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_uint_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_uint_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uint_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uint_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uint_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uint_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_float_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_float_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_float_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_float_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_float_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_float_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_float_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_float_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_float_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_float_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_float_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_float_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_float_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_float_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_float_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_float_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_vec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_vec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_vec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_vec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_vec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_vec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_vec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_vec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_vec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_vec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_vec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_vec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_double_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_double_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_double_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_double_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_double_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_double_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_double_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_double_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_double_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_double_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_double_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_double_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_double_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_double_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_double_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_double_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bool_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bool_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bool_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bool_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bool_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bool_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bool_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bool_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_bool_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_bool_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_bool_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_bool_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bool_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bool_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bool_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bool_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_int_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_int_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_int_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_int_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uint_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uint_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uint_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uint_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_float_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_float_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_float_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_float_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_double_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_double_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_double_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_double_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bool_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bool_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bool_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bool_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_int_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_int_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_int_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_int_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uint_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uint_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uint_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uint_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_float_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_float_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_float_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_float_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_double_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_double_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_double_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_double_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bool_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bool_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bool_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bool_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_int_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_int_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_int_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_int_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uint_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uint_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uint_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uint_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_float_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_float_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_float_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_float_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_double_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_double_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_double_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_double_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec4_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bool_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bool_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bool_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bool_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec2_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec2_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec2_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec2_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec3_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec3_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec3_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec3_geometry
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec4_vertex
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec4_tess_eval
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec4_tess_control
+KHR-Single-GLES32.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec4_geometry
+KHR-Single-GLES32.subgroups.shape.graphics.clustered
+KHR-Single-GLES32.subgroups.shape.graphics.quad
+KHR-Single-GLES32.subgroups.shape.compute.clustered
+KHR-Single-GLES32.subgroups.shape.compute.quad
+KHR-Single-GLES32.subgroups.shape.framebuffer.clustered_vertex
+KHR-Single-GLES32.subgroups.shape.framebuffer.clustered_tess_eval
+KHR-Single-GLES32.subgroups.shape.framebuffer.clustered_tess_control
+KHR-Single-GLES32.subgroups.shape.framebuffer.clustered_geometry
+KHR-Single-GLES32.subgroups.shape.framebuffer.quad_vertex
+KHR-Single-GLES32.subgroups.shape.framebuffer.quad_tess_eval
+KHR-Single-GLES32.subgroups.shape.framebuffer.quad_tess_control
+KHR-Single-GLES32.subgroups.shape.framebuffer.quad_geometry
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass_single/master/mustpass.xml b/external/openglcts/data/mustpass/gles/khronos_mustpass_single/master/mustpass.xml
new file mode 100644
index 0000000..2cf1f8c
--- /dev/null
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass_single/master/mustpass.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Mustpass version="master">
+ <!--/* Copyright (C) 2016-2017 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.
+*/-->
+ <!--/* WARNING: This is auto-generated file. Do not modify, since changes will
+ * be lost! Modify the generating script instead.
+ */-->
+ <TestPackage name="Khronos Mustpass ES Single Config">
+ <Configuration caseListFile="gles32-khr-single.txt" commandLine="--deqp-screen-rotation=unspecified --deqp-surface-width=64 --deqp-surface-height=64 --deqp-base-seed=1 --deqp-watchdog=disable" name="khr-single" os="any" useForFirstEGLConfig="True"/>
+ </TestPackage>
+</Mustpass>
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass_single/master/src/gles32-khr-single.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass_single/master/src/gles32-khr-single.txt
new file mode 100644
index 0000000..0c46400
--- /dev/null
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass_single/master/src/gles32-khr-single.txt
@@ -0,0 +1 @@
+KHR-Single-GLES32.*
diff --git a/external/openglcts/modules/common/CMakeLists.txt b/external/openglcts/modules/common/CMakeLists.txt
index 1ffe400..fa919fc 100644
--- a/external/openglcts/modules/common/CMakeLists.txt
+++ b/external/openglcts/modules/common/CMakeLists.txt
@@ -5,6 +5,8 @@
add_definitions(-DGLCTS_SUPPORT_WGL=1)
endif ()
+add_subdirectory(subgroups)
+
set(GLCTS_COMMON_SRCS
glcAggressiveShaderOptimizationsTests.cpp
glcAggressiveShaderOptimizationsTests.hpp
@@ -115,32 +117,27 @@
glutil
tcutil
eglutil
+ deqp-gl-subgroups
)
# Add glslang
-if (DEQP_HAVE_GLSLANG)
- include_directories(${GLSLANG_INCLUDE_PATH})
- add_definitions(-DDEQP_HAVE_GLSLANG=1)
+include_directories(${GLSLANG_INCLUDE_PATH})
- # \note Code interfacing with glslang needs to include third-party headers
- # that cause all sorts of warnings to appear.
- if (DE_COMPILER_IS_GCC OR DE_COMPILER_IS_CLANG)
- set_source_files_properties(
- FILES glcSpirvUtils.cpp
- PROPERTIES COMPILE_FLAGS "${DE_3RD_PARTY_CXX_FLAGS}")
- endif ()
-
- set(GLCTS_COMMON_LIBS ${GLCTS_COMMON_LIBS} ${GLSLANG_LIBRARIES})
+# \note Code interfacing with glslang needs to include third-party headers
+# that cause all sorts of warnings to appear.
+if (DE_COMPILER_IS_GCC OR DE_COMPILER_IS_CLANG)
+ set_source_files_properties(
+ FILES glcSpirvUtils.cpp
+ PROPERTIES COMPILE_FLAGS "${DE_3RD_PARTY_CXX_FLAGS}")
endif ()
-# Add spirv-tools
-if(DEQP_HAVE_SPIRV_TOOLS)
- include_directories(${spirv-tools_SOURCE_DIR}/include)
- include_directories(${spirv-tools_SOURCE_DIR}/external/include)
+set(GLCTS_COMMON_LIBS ${GLCTS_COMMON_LIBS} ${GLSLANG_LIBRARIES})
- add_definitions(-DDEQP_HAVE_SPIRV_TOOLS=1)
- set(GLCTS_COMMON_LIBS ${GLCTS_COMMON_LIBS} SPIRV-Tools)
-endif()
+# Add spirv-tools
+include_directories(${spirv-tools_SOURCE_DIR}/include)
+include_directories(${spirv-tools_SOURCE_DIR}/external/include)
+
+set(GLCTS_COMMON_LIBS ${GLCTS_COMMON_LIBS} SPIRV-Tools)
PCH(GLCTS_COMMON_SRCS ../pch.cpp)
@@ -149,6 +146,8 @@
target_link_libraries(glcts-common ${GLCTS_COMMON_LIBS})
set(GLCTS_COMMON_NOCONTEXTPACKAGE_SRCS
+ glcSingleConfigTestPackage.cpp
+ glcSingleConfigTestPackage.hpp
glcNoDefaultContextPackage.cpp
glcNoDefaultContextPackage.hpp
)
diff --git a/external/openglcts/modules/common/glcSingleConfigTestPackage.cpp b/external/openglcts/modules/common/glcSingleConfigTestPackage.cpp
new file mode 100644
index 0000000..b677311
--- /dev/null
+++ b/external/openglcts/modules/common/glcSingleConfigTestPackage.cpp
@@ -0,0 +1,140 @@
+/*-------------------------------------------------------------------------
+ * OpenGL Conformance Test Suite
+ * -----------------------------
+ *
+ * Copyright (c) 2016 Google Inc.
+ * Copyright (c) 2016-2019 The Khronos Group Inc.
+ * Copyright (c) 2019 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 OpenGL/OpenGL ES Test Package that only gets run in a single config
+ */ /*-------------------------------------------------------------------*/
+
+#include "glcSingleConfigTestPackage.hpp"
+#include "gluStateReset.hpp"
+#include "glwEnums.hpp"
+#include "glwFunctions.hpp"
+#include "tcuTestLog.hpp"
+
+#include "subgroups/glcSubgroupsTests.hpp"
+
+namespace glcts
+{
+
+class TestCaseWrapper : public tcu::TestCaseExecutor
+{
+public:
+ TestCaseWrapper(SingleConfigTestPackage& package);
+ ~TestCaseWrapper(void);
+
+ void init(tcu::TestCase* testCase, const std::string& path);
+ void deinit(tcu::TestCase* testCase);
+ tcu::TestNode::IterateResult iterate(tcu::TestCase* testCase);
+
+private:
+ SingleConfigTestPackage& m_testPackage;
+};
+
+TestCaseWrapper::TestCaseWrapper(SingleConfigTestPackage& package) : m_testPackage(package)
+{
+}
+
+TestCaseWrapper::~TestCaseWrapper(void)
+{
+}
+
+void TestCaseWrapper::init(tcu::TestCase* testCase, const std::string&)
+{
+ testCase->init();
+}
+
+void TestCaseWrapper::deinit(tcu::TestCase* testCase)
+{
+ testCase->deinit();
+
+ 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();
+ glu::RenderContext& renderCtx = m_testPackage.getContext().getRenderContext();
+ tcu::TestCase::IterateResult result;
+
+ // Clear to surrender-blue
+ {
+ const glw::Functions& gl = renderCtx.getFunctions();
+ gl.clearColor(0.0f, 0.0f, 0.0f, 1.f);
+ gl.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
+ }
+
+ result = testCase->iterate();
+
+ // Call implementation specific post-iterate routine (usually handles native events and swaps buffers)
+ try
+ {
+ renderCtx.postIterate();
+ return result;
+ }
+ catch (const tcu::ResourceError&)
+ {
+ testCtx.getLog().endCase(QP_TEST_RESULT_RESOURCE_ERROR, "Resource error in context post-iteration routine");
+ testCtx.setTerminateAfter(true);
+ return tcu::TestNode::STOP;
+ }
+ catch (const std::exception&)
+ {
+ testCtx.getLog().endCase(QP_TEST_RESULT_FAIL, "Error in context post-iteration routine");
+ return tcu::TestNode::STOP;
+ }
+}
+
+SingleConfigTestPackage::SingleConfigTestPackage(tcu::TestContext& testCtx, const char* packageName,
+ glu::ContextType renderContextType)
+ : deqp::TestPackage(testCtx, packageName, "CTS Single Config Package",
+ renderContextType, "gl_cts/data/")
+{
+}
+
+SingleConfigTestPackage::~SingleConfigTestPackage(void)
+{
+ deqp::TestPackage::deinit();
+}
+
+void SingleConfigTestPackage::init(void)
+{
+ // Call init() in parent - this creates context.
+ deqp::TestPackage::init();
+
+ try
+ {
+ // Add main test groups
+ addChild(new glc::subgroups::GlSubgroupTests(getContext()));
+ }
+ catch (...)
+ {
+ // Destroy context.
+ deqp::TestPackage::deinit();
+ throw;
+ }
+}
+
+tcu::TestCaseExecutor* SingleConfigTestPackage::createExecutor(void) const
+{
+ return new TestCaseWrapper(const_cast<SingleConfigTestPackage&>(*this));
+}
+
+} // glcts
diff --git a/external/openglcts/modules/common/glcSingleConfigTestPackage.hpp b/external/openglcts/modules/common/glcSingleConfigTestPackage.hpp
new file mode 100644
index 0000000..7bca6b2
--- /dev/null
+++ b/external/openglcts/modules/common/glcSingleConfigTestPackage.hpp
@@ -0,0 +1,52 @@
+#ifndef _GLCSINGLECONFIGTESTPACKAGE_HPP
+#define _GLCSINGLECONFIGTESTPACKAGE_HPP
+/*-------------------------------------------------------------------------
+ * OpenGL Conformance Test Suite
+ * -----------------------------
+ *
+ * Copyright (c) 2016 Google Inc.
+ * Copyright (c) 2016-2019 The Khronos Group Inc.
+ * Copyright (c) 2019 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 OpenGL/OpenGL ES Test Package that only gets run in a single config
+ */ /*-------------------------------------------------------------------*/
+
+#include "glcTestPackage.hpp"
+#include "tcuDefs.hpp"
+
+namespace glcts
+{
+
+class SingleConfigTestPackage : public deqp::TestPackage
+{
+public:
+ SingleConfigTestPackage(tcu::TestContext& testCtx, const char* packageName,
+ glu::ContextType renderContextType);
+ ~SingleConfigTestPackage(void);
+
+ void init(void);
+
+ virtual tcu::TestCaseExecutor* createExecutor(void) const;
+
+private:
+ SingleConfigTestPackage(const SingleConfigTestPackage& other);
+ SingleConfigTestPackage& operator=(const SingleConfigTestPackage& other);
+};
+
+} // glcts
+
+#endif // _GLCSINGLECONFIGTESTPACKAGE_HPP
diff --git a/external/openglcts/modules/common/glcSpirvUtils.cpp b/external/openglcts/modules/common/glcSpirvUtils.cpp
index b5aded3..2fae3c3 100644
--- a/external/openglcts/modules/common/glcSpirvUtils.cpp
+++ b/external/openglcts/modules/common/glcSpirvUtils.cpp
@@ -29,18 +29,14 @@
#include "gluContextInfo.hpp"
#include "tcuTestLog.hpp"
-#if defined DEQP_HAVE_GLSLANG
#include "SPIRV/GlslangToSpv.h"
#include "SPIRV/disassemble.h"
#include "SPIRV/doc.h"
#include "glslang/MachineIndependent/localintermediate.h"
#include "glslang/Public/ShaderLang.h"
-#endif // DEQP_HAVE_GLSLANG
-#if defined DEQP_HAVE_SPIRV_TOOLS
#include "spirv-tools/libspirv.hpp"
#include "spirv-tools/optimizer.hpp"
-#endif // DEQP_HAVE_SPIRV_TOOLS
using namespace glu;
@@ -56,11 +52,9 @@
bool is_arb_gl_spirv = m_context.getContextInfo().isExtensionSupported("GL_ARB_gl_spirv");
if ((!is_at_least_gl_46) && (!is_arb_gl_spirv))
- TCU_THROW(NotSupportedError, "GL_ARB_gl_spirv is not supported");
+ TCU_THROW(NotSupportedError, "GL 4.6 or GL_ARB_gl_spirv is not supported");
}
-#if defined DEQP_HAVE_GLSLANG
-
EShLanguage getGlslangStage(glu::ShaderType type)
{
static const EShLanguage stageMap[] = {
@@ -195,9 +189,28 @@
builtin->maxTaskWorkGroupSizeY_NV = 1;
builtin->maxTaskWorkGroupSizeZ_NV = 1;
builtin->maxMeshViewCountNV = 4;
+ builtin->maxDualSourceDrawBuffersEXT = 1;
};
-bool compileGlslToSpirV(tcu::TestLog& log, std::string source, glu::ShaderType type, ShaderBinaryDataType* dst)
+glslang::EShTargetLanguageVersion getSpirvTargetVersion(SpirvVersion version)
+{
+ switch(version)
+ {
+ default:
+ DE_FATAL("unhandled SPIRV target version");
+ // fall-through
+ case SPIRV_VERSION_1_0:
+ return glslang::EShTargetSpv_1_0;
+ case SPIRV_VERSION_1_1:
+ return glslang::EShTargetSpv_1_1;
+ case SPIRV_VERSION_1_2:
+ return glslang::EShTargetSpv_1_2;
+ case SPIRV_VERSION_1_3:
+ return glslang::EShTargetSpv_1_3;
+ }
+}
+
+bool compileGlslToSpirV(tcu::TestLog& log, std::string source, glu::ShaderType type, ShaderBinaryDataType* dst, SpirvVersion version)
{
TBuiltInResource builtinRes;
@@ -212,6 +225,7 @@
const char* src[] = { source.c_str() };
shader.setStrings(src, 1);
+ shader.setEnvTarget(glslang::EshTargetSpv, getSpirvTargetVersion(version));
program.addShader(&shader);
const int compileRes = shader.parse(&builtinRes, 100, false, EShMsgSpvRules);
@@ -247,24 +261,6 @@
return false;
}
-#else // DEQP_HAVE_GLSLANG
-
-bool compileGlslToSpirV(tcu::TestLog& log, std::string source, glu::ShaderType type, ShaderBinaryDataType* dst)
-{
- DE_UNREF(log);
- DE_UNREF(source);
- DE_UNREF(type);
- DE_UNREF(dst);
-
- TCU_THROW(InternalError, "Glslang not available.");
-
- return false;
-}
-
-#endif // DEQP_HAVE_GLSLANG
-
-#if defined DEQP_HAVE_SPIRV_TOOLS
-
void consumer(spv_message_level_t, const char*, const spv_position_t&, const char* m)
{
std::cerr << "error: " << m << std::endl;
@@ -307,39 +303,11 @@
return true;
}
-#else //DEQP_HAVE_SPIRV_TOOLS
-
-void spirvAssemble(ShaderBinaryDataType& dst, const std::string& src)
-{
- DE_UNREF(dst);
- DE_UNREF(src);
-
- TCU_THROW(InternalError, "Spirv-tools not available.");
-}
-
-void spirvDisassemble(std::string& dst, ShaderBinaryDataType& src)
-{
- DE_UNREF(dst);
- DE_UNREF(src);
-
- TCU_THROW(InternalError, "Spirv-tools not available.");
-}
-
-bool spirvValidate(ShaderBinaryDataType& dst, bool throwOnError)
-{
- DE_UNREF(dst);
- DE_UNREF(throwOnError);
-
- TCU_THROW(InternalError, "Spirv-tools not available.");
-}
-
-#endif // DEQP_HAVE_SPIRV_TOOLS
-
-ShaderBinary makeSpirV(tcu::TestLog& log, ShaderSource source)
+ShaderBinary makeSpirV(tcu::TestLog& log, ShaderSource source, SpirvVersion version)
{
ShaderBinary binary;
- if (!spirvUtils::compileGlslToSpirV(log, source.source, source.shaderType, &binary.binary))
+ if (!spirvUtils::compileGlslToSpirV(log, source.source, source.shaderType, &binary.binary, version))
TCU_THROW(InternalError, "Failed to convert GLSL to Spir-V");
binary << source.shaderType << "main";
@@ -421,4 +389,4 @@
} // namespace spirvUtils
-} // namespace glc
\ No newline at end of file
+} // namespace glc
diff --git a/external/openglcts/modules/common/glcSpirvUtils.hpp b/external/openglcts/modules/common/glcSpirvUtils.hpp
index 2ed596a..e5d441b 100644
--- a/external/openglcts/modules/common/glcSpirvUtils.hpp
+++ b/external/openglcts/modules/common/glcSpirvUtils.hpp
@@ -35,9 +35,19 @@
namespace spirvUtils
{
+enum SpirvVersion
+{
+ SPIRV_VERSION_1_0 = 0, //!< SPIR-V 1.0
+ SPIRV_VERSION_1_1 = 1, //!< SPIR-V 1.1
+ SPIRV_VERSION_1_2 = 2, //!< SPIR-V 1.2
+ SPIRV_VERSION_1_3 = 3, //!< SPIR-V 1.3
+
+ SPIRV_VERSION_LAST
+};
+
void checkGlSpirvSupported(deqp::Context& m_context);
-glu::ShaderBinary makeSpirV(tcu::TestLog& log, glu::ShaderSource source);
+glu::ShaderBinary makeSpirV(tcu::TestLog& log, glu::ShaderSource source, SpirvVersion version = SPIRV_VERSION_1_0);
void spirvAssemble(glu::ShaderBinaryDataType& dst, const std::string& src);
void spirvDisassemble(std::string& dst, const glu::ShaderBinaryDataType& src);
diff --git a/external/openglcts/modules/common/subgroups/CMakeLists.txt b/external/openglcts/modules/common/subgroups/CMakeLists.txt
new file mode 100644
index 0000000..dbfa94a
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/CMakeLists.txt
@@ -0,0 +1,44 @@
+include_directories(..)
+
+set(DEQP_GL_SUBGROUPS_SRCS
+ glcSubgroupsTests.cpp
+ glcSubgroupsTests.hpp
+ glcSubgroupsBuiltinVarTests.cpp
+ glcSubgroupsBuiltinVarTests.hpp
+ glcSubgroupsBuiltinMaskVarTests.cpp
+ glcSubgroupsBuiltinMaskVarTests.hpp
+ glcSubgroupsBasicTests.cpp
+ glcSubgroupsBasicTests.hpp
+ glcSubgroupsVoteTests.cpp
+ glcSubgroupsVoteTests.hpp
+ glcSubgroupsBallotTests.cpp
+ glcSubgroupsBallotTests.hpp
+ glcSubgroupsBallotBroadcastTests.cpp
+ glcSubgroupsBallotBroadcastTests.hpp
+ glcSubgroupsBallotOtherTests.cpp
+ glcSubgroupsBallotOtherTests.hpp
+ glcSubgroupsArithmeticTests.cpp
+ glcSubgroupsArithmeticTests.hpp
+ glcSubgroupsClusteredTests.cpp
+ glcSubgroupsClusteredTests.hpp
+ glcSubgroupsPartitionedTests.cpp
+ glcSubgroupsPartitionedTests.hpp
+ glcSubgroupsShuffleTests.cpp
+ glcSubgroupsShuffleTests.hpp
+ glcSubgroupsQuadTests.cpp
+ glcSubgroupsQuadTests.hpp
+ glcSubgroupsShapeTests.cpp
+ glcSubgroupsShapeTests.hpp
+ glcSubgroupsTestsUtils.cpp
+ glcSubgroupsTestsUtils.hpp
+ )
+
+set(DEQP_GL_SUBGROUPS_LIBS
+ glutil
+ tcutil
+ )
+
+PCH(DEQP_GL_SUBGROUPS_SRCS ../../pch.cpp)
+
+add_library(deqp-gl-subgroups STATIC ${DEQP_GL_SUBGROUPS_SRCS})
+target_link_libraries(deqp-gl-subgroups ${DEQP_GL_SUBGROUPS_LIBS})
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsArithmeticTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsArithmeticTests.cpp
new file mode 100755
index 0000000..156b16b
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsArithmeticTests.cpp
@@ -0,0 +1,1053 @@
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "glcSubgroupsArithmeticTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+
+using namespace tcu;
+using namespace std;
+
+namespace glc
+{
+namespace subgroups
+{
+namespace
+{
+enum OpType
+{
+ OPTYPE_ADD = 0,
+ OPTYPE_MUL,
+ OPTYPE_MIN,
+ OPTYPE_MAX,
+ OPTYPE_AND,
+ OPTYPE_OR,
+ OPTYPE_XOR,
+ OPTYPE_INCLUSIVE_ADD,
+ OPTYPE_INCLUSIVE_MUL,
+ OPTYPE_INCLUSIVE_MIN,
+ OPTYPE_INCLUSIVE_MAX,
+ OPTYPE_INCLUSIVE_AND,
+ OPTYPE_INCLUSIVE_OR,
+ OPTYPE_INCLUSIVE_XOR,
+ OPTYPE_EXCLUSIVE_ADD,
+ OPTYPE_EXCLUSIVE_MUL,
+ OPTYPE_EXCLUSIVE_MIN,
+ OPTYPE_EXCLUSIVE_MAX,
+ OPTYPE_EXCLUSIVE_AND,
+ OPTYPE_EXCLUSIVE_OR,
+ OPTYPE_EXCLUSIVE_XOR,
+ OPTYPE_LAST
+};
+
+static bool checkVertexPipelineStages(std::vector<const void*> datas,
+ deUint32 width, deUint32)
+{
+ return glc::subgroups::check(datas, width, 0x3);
+}
+
+static bool checkComputeStage(std::vector<const void*> datas,
+ const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+ deUint32)
+{
+ return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, 0x3);
+}
+
+std::string getOpTypeName(int opType)
+{
+ switch (opType)
+ {
+ default:
+ DE_FATAL("Unsupported op type");
+ return "";
+ case OPTYPE_ADD:
+ return "subgroupAdd";
+ case OPTYPE_MUL:
+ return "subgroupMul";
+ case OPTYPE_MIN:
+ return "subgroupMin";
+ case OPTYPE_MAX:
+ return "subgroupMax";
+ case OPTYPE_AND:
+ return "subgroupAnd";
+ case OPTYPE_OR:
+ return "subgroupOr";
+ case OPTYPE_XOR:
+ return "subgroupXor";
+ case OPTYPE_INCLUSIVE_ADD:
+ return "subgroupInclusiveAdd";
+ case OPTYPE_INCLUSIVE_MUL:
+ return "subgroupInclusiveMul";
+ case OPTYPE_INCLUSIVE_MIN:
+ return "subgroupInclusiveMin";
+ case OPTYPE_INCLUSIVE_MAX:
+ return "subgroupInclusiveMax";
+ case OPTYPE_INCLUSIVE_AND:
+ return "subgroupInclusiveAnd";
+ case OPTYPE_INCLUSIVE_OR:
+ return "subgroupInclusiveOr";
+ case OPTYPE_INCLUSIVE_XOR:
+ return "subgroupInclusiveXor";
+ case OPTYPE_EXCLUSIVE_ADD:
+ return "subgroupExclusiveAdd";
+ case OPTYPE_EXCLUSIVE_MUL:
+ return "subgroupExclusiveMul";
+ case OPTYPE_EXCLUSIVE_MIN:
+ return "subgroupExclusiveMin";
+ case OPTYPE_EXCLUSIVE_MAX:
+ return "subgroupExclusiveMax";
+ case OPTYPE_EXCLUSIVE_AND:
+ return "subgroupExclusiveAnd";
+ case OPTYPE_EXCLUSIVE_OR:
+ return "subgroupExclusiveOr";
+ case OPTYPE_EXCLUSIVE_XOR:
+ return "subgroupExclusiveXor";
+ }
+}
+
+std::string getOpTypeOperation(int opType, Format format, std::string lhs, std::string rhs)
+{
+ switch (opType)
+ {
+ default:
+ DE_FATAL("Unsupported op type");
+ return "";
+ case OPTYPE_ADD:
+ case OPTYPE_INCLUSIVE_ADD:
+ case OPTYPE_EXCLUSIVE_ADD:
+ return lhs + " + " + rhs;
+ case OPTYPE_MUL:
+ case OPTYPE_INCLUSIVE_MUL:
+ case OPTYPE_EXCLUSIVE_MUL:
+ return lhs + " * " + rhs;
+ case OPTYPE_MIN:
+ case OPTYPE_INCLUSIVE_MIN:
+ case OPTYPE_EXCLUSIVE_MIN:
+ switch (format)
+ {
+ default:
+ return "min(" + lhs + ", " + rhs + ")";
+ case FORMAT_R32_SFLOAT:
+ case FORMAT_R64_SFLOAT:
+ return "(isnan(" + lhs + ") ? " + rhs + " : (isnan(" + rhs + ") ? " + lhs + " : min(" + lhs + ", " + rhs + ")))";
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
+ return "mix(mix(min(" + lhs + ", " + rhs + "), " + lhs + ", isnan(" + rhs + ")), " + rhs + ", isnan(" + lhs + "))";
+ }
+ case OPTYPE_MAX:
+ case OPTYPE_INCLUSIVE_MAX:
+ case OPTYPE_EXCLUSIVE_MAX:
+ switch (format)
+ {
+ default:
+ return "max(" + lhs + ", " + rhs + ")";
+ case FORMAT_R32_SFLOAT:
+ case FORMAT_R64_SFLOAT:
+ return "(isnan(" + lhs + ") ? " + rhs + " : (isnan(" + rhs + ") ? " + lhs + " : max(" + lhs + ", " + rhs + ")))";
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
+ return "mix(mix(max(" + lhs + ", " + rhs + "), " + lhs + ", isnan(" + rhs + ")), " + rhs + ", isnan(" + lhs + "))";
+ }
+ case OPTYPE_AND:
+ case OPTYPE_INCLUSIVE_AND:
+ case OPTYPE_EXCLUSIVE_AND:
+ switch (format)
+ {
+ default:
+ return lhs + " & " + rhs;
+ case FORMAT_R32_BOOL:
+ return lhs + " && " + rhs;
+ case FORMAT_R32G32_BOOL:
+ return "bvec2(" + lhs + ".x && " + rhs + ".x, " + lhs + ".y && " + rhs + ".y)";
+ case FORMAT_R32G32B32_BOOL:
+ return "bvec3(" + lhs + ".x && " + rhs + ".x, " + lhs + ".y && " + rhs + ".y, " + lhs + ".z && " + rhs + ".z)";
+ case FORMAT_R32G32B32A32_BOOL:
+ return "bvec4(" + lhs + ".x && " + rhs + ".x, " + lhs + ".y && " + rhs + ".y, " + lhs + ".z && " + rhs + ".z, " + lhs + ".w && " + rhs + ".w)";
+ }
+ case OPTYPE_OR:
+ case OPTYPE_INCLUSIVE_OR:
+ case OPTYPE_EXCLUSIVE_OR:
+ switch (format)
+ {
+ default:
+ return lhs + " | " + rhs;
+ case FORMAT_R32_BOOL:
+ return lhs + " || " + rhs;
+ case FORMAT_R32G32_BOOL:
+ return "bvec2(" + lhs + ".x || " + rhs + ".x, " + lhs + ".y || " + rhs + ".y)";
+ case FORMAT_R32G32B32_BOOL:
+ return "bvec3(" + lhs + ".x || " + rhs + ".x, " + lhs + ".y || " + rhs + ".y, " + lhs + ".z || " + rhs + ".z)";
+ case FORMAT_R32G32B32A32_BOOL:
+ return "bvec4(" + lhs + ".x || " + rhs + ".x, " + lhs + ".y || " + rhs + ".y, " + lhs + ".z || " + rhs + ".z, " + lhs + ".w || " + rhs + ".w)";
+ }
+ case OPTYPE_XOR:
+ case OPTYPE_INCLUSIVE_XOR:
+ case OPTYPE_EXCLUSIVE_XOR:
+ switch (format)
+ {
+ default:
+ return lhs + " ^ " + rhs;
+ case FORMAT_R32_BOOL:
+ return lhs + " ^^ " + rhs;
+ case FORMAT_R32G32_BOOL:
+ return "bvec2(" + lhs + ".x ^^ " + rhs + ".x, " + lhs + ".y ^^ " + rhs + ".y)";
+ case FORMAT_R32G32B32_BOOL:
+ return "bvec3(" + lhs + ".x ^^ " + rhs + ".x, " + lhs + ".y ^^ " + rhs + ".y, " + lhs + ".z ^^ " + rhs + ".z)";
+ case FORMAT_R32G32B32A32_BOOL:
+ return "bvec4(" + lhs + ".x ^^ " + rhs + ".x, " + lhs + ".y ^^ " + rhs + ".y, " + lhs + ".z ^^ " + rhs + ".z, " + lhs + ".w ^^ " + rhs + ".w)";
+ }
+ }
+}
+
+std::string getIdentity(int opType, Format format)
+{
+ bool isFloat = false;
+ bool isInt = false;
+ bool isUnsigned = false;
+
+ switch (format)
+ {
+ default:
+ DE_FATAL("Unhandled format!");
+ break;
+ case FORMAT_R32_SINT:
+ case FORMAT_R32G32_SINT:
+ case FORMAT_R32G32B32_SINT:
+ case FORMAT_R32G32B32A32_SINT:
+ isInt = true;
+ break;
+ case FORMAT_R32_UINT:
+ case FORMAT_R32G32_UINT:
+ case FORMAT_R32G32B32_UINT:
+ case FORMAT_R32G32B32A32_UINT:
+ isUnsigned = true;
+ break;
+ case FORMAT_R32_SFLOAT:
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
+ isFloat = true;
+ break;
+ case FORMAT_R32_BOOL:
+ case FORMAT_R32G32_BOOL:
+ case FORMAT_R32G32B32_BOOL:
+ case FORMAT_R32G32B32A32_BOOL:
+ break; // bool types are not anything
+ }
+
+ switch (opType)
+ {
+ default:
+ DE_FATAL("Unsupported op type");
+ return "";
+ case OPTYPE_ADD:
+ case OPTYPE_INCLUSIVE_ADD:
+ case OPTYPE_EXCLUSIVE_ADD:
+ return subgroups::getFormatNameForGLSL(format) + "(0)";
+ case OPTYPE_MUL:
+ case OPTYPE_INCLUSIVE_MUL:
+ case OPTYPE_EXCLUSIVE_MUL:
+ return subgroups::getFormatNameForGLSL(format) + "(1)";
+ case OPTYPE_MIN:
+ case OPTYPE_INCLUSIVE_MIN:
+ case OPTYPE_EXCLUSIVE_MIN:
+ if (isFloat)
+ {
+ return subgroups::getFormatNameForGLSL(format) + "(intBitsToFloat(0x7f800000))";
+ }
+ else if (isInt)
+ {
+ return subgroups::getFormatNameForGLSL(format) + "(0x7fffffff)";
+ }
+ else if (isUnsigned)
+ {
+ return subgroups::getFormatNameForGLSL(format) + "(0xffffffffu)";
+ }
+ else
+ {
+ DE_FATAL("Unhandled case");
+ return "";
+ }
+ case OPTYPE_MAX:
+ case OPTYPE_INCLUSIVE_MAX:
+ case OPTYPE_EXCLUSIVE_MAX:
+ if (isFloat)
+ {
+ return subgroups::getFormatNameForGLSL(format) + "(intBitsToFloat(0xff800000))";
+ }
+ else if (isInt)
+ {
+ return subgroups::getFormatNameForGLSL(format) + "(0x80000000)";
+ }
+ else if (isUnsigned)
+ {
+ return subgroups::getFormatNameForGLSL(format) + "(0u)";
+ }
+ else
+ {
+ DE_FATAL("Unhandled case");
+ return "";
+ }
+ case OPTYPE_AND:
+ case OPTYPE_INCLUSIVE_AND:
+ case OPTYPE_EXCLUSIVE_AND:
+ return subgroups::getFormatNameForGLSL(format) + "(~0)";
+ case OPTYPE_OR:
+ case OPTYPE_INCLUSIVE_OR:
+ case OPTYPE_EXCLUSIVE_OR:
+ return subgroups::getFormatNameForGLSL(format) + "(0)";
+ case OPTYPE_XOR:
+ case OPTYPE_INCLUSIVE_XOR:
+ case OPTYPE_EXCLUSIVE_XOR:
+ return subgroups::getFormatNameForGLSL(format) + "(0)";
+ }
+}
+
+std::string getCompare(int opType, Format format, std::string lhs, std::string rhs)
+{
+ std::string formatName = subgroups::getFormatNameForGLSL(format);
+ switch (format)
+ {
+ default:
+ return "all(equal(" + lhs + ", " + rhs + "))";
+ case FORMAT_R32_BOOL:
+ case FORMAT_R32_UINT:
+ case FORMAT_R32_SINT:
+ return "(" + lhs + " == " + rhs + ")";
+ case FORMAT_R32_SFLOAT:
+ case FORMAT_R64_SFLOAT:
+ switch (opType)
+ {
+ default:
+ return "(abs(" + lhs + " - " + rhs + ") < 0.00001)";
+ case OPTYPE_MIN:
+ case OPTYPE_INCLUSIVE_MIN:
+ case OPTYPE_EXCLUSIVE_MIN:
+ case OPTYPE_MAX:
+ case OPTYPE_INCLUSIVE_MAX:
+ case OPTYPE_EXCLUSIVE_MAX:
+ return "(" + lhs + " == " + rhs + ")";
+ }
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
+ switch (opType)
+ {
+ default:
+ return "all(lessThan(abs(" + lhs + " - " + rhs + "), " + formatName + "(0.00001)))";
+ case OPTYPE_MIN:
+ case OPTYPE_INCLUSIVE_MIN:
+ case OPTYPE_EXCLUSIVE_MIN:
+ case OPTYPE_MAX:
+ case OPTYPE_INCLUSIVE_MAX:
+ case OPTYPE_EXCLUSIVE_MAX:
+ return "all(equal(" + lhs + ", " + rhs + "))";
+ }
+ }
+}
+
+struct CaseDefinition
+{
+ int opType;
+ ShaderStageFlags shaderStage;
+ Format format;
+};
+
+void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ std::string indexVars;
+ std::ostringstream bdy;
+
+ subgroups::setFragmentShaderFrameBuffer(programCollection);
+
+ if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ subgroups::setVertexShaderFrameBuffer(programCollection);
+
+ switch (caseDef.opType)
+ {
+ default:
+ indexVars = " uint start = 0u, end = gl_SubgroupSize;\n";
+ break;
+ case OPTYPE_INCLUSIVE_ADD:
+ case OPTYPE_INCLUSIVE_MUL:
+ case OPTYPE_INCLUSIVE_MIN:
+ case OPTYPE_INCLUSIVE_MAX:
+ case OPTYPE_INCLUSIVE_AND:
+ case OPTYPE_INCLUSIVE_OR:
+ case OPTYPE_INCLUSIVE_XOR:
+ indexVars = " uint start = 0u, end = gl_SubgroupInvocationID + 1u;\n";
+ break;
+ case OPTYPE_EXCLUSIVE_ADD:
+ case OPTYPE_EXCLUSIVE_MUL:
+ case OPTYPE_EXCLUSIVE_MIN:
+ case OPTYPE_EXCLUSIVE_MAX:
+ case OPTYPE_EXCLUSIVE_AND:
+ case OPTYPE_EXCLUSIVE_OR:
+ case OPTYPE_EXCLUSIVE_XOR:
+ indexVars = " uint start = 0u, end = gl_SubgroupInvocationID;\n";
+ break;
+ }
+
+ bdy << indexVars
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " ref = "
+ << getIdentity(caseDef.opType, caseDef.format) << ";\n"
+ << " uint tempResult = 0u;\n"
+ << " for (uint index = start; index < end; index++)\n"
+ << " {\n"
+ << " if (subgroupBallotBitExtract(mask, index))\n"
+ << " {\n"
+ << " ref = " << getOpTypeOperation(caseDef.opType, caseDef.format, "ref", "data[index]") << ";\n"
+ << " }\n"
+ << " }\n"
+ << " tempResult = " << getCompare(caseDef.opType, caseDef.format, "ref",
+ getOpTypeName(caseDef.opType) + "(data[gl_SubgroupInvocationID])") << " ? 0x1u : 0u;\n"
+ << " if (1u == (gl_SubgroupInvocationID % 2u))\n"
+ << " {\n"
+ << " mask = subgroupBallot(true);\n"
+ << " ref = " << getIdentity(caseDef.opType, caseDef.format) << ";\n"
+ << " for (uint index = start; index < end; index++)\n"
+ << " {\n"
+ << " if (subgroupBallotBitExtract(mask, index))\n"
+ << " {\n"
+ << " ref = " << getOpTypeOperation(caseDef.opType, caseDef.format, "ref", "data[index]") << ";\n"
+ << " }\n"
+ << " }\n"
+ << " tempResult |= " << getCompare(caseDef.opType, caseDef.format, "ref",
+ getOpTypeName(caseDef.opType) + "(data[gl_SubgroupInvocationID])") << " ? 0x2u : 0u;\n"
+ << " }\n"
+ << " else\n"
+ << " {\n"
+ << " tempResult |= 0x2u;\n"
+ << " }\n";
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream vertexSrc;
+ vertexSrc << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(location = 0) in highp vec4 in_position;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "layout(binding = 0, std140) uniform Buffer0\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec4 mask = subgroupBallot(true);\n"
+ << bdy.str()
+ << " out_color = float(tempResult);\n"
+ << " gl_Position = in_position;\n"
+ << " gl_PointSize = 1.0f;\n"
+ << "}\n";
+ programCollection.add("vert") << glu::VertexSource(vertexSrc.str());
+ }
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream geometry;
+
+ geometry << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(points) in;\n"
+ << "layout(points, max_vertices = 1) out;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "layout(binding = 0, std140) uniform Buffer0\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec4 mask = subgroupBallot(true);\n"
+ << bdy.str()
+ << " out_color = float(tempResult);\n"
+ << " gl_Position = gl_in[0].gl_Position;\n"
+ << " EmitVertex();\n"
+ << " EndPrimitive();\n"
+ << "}\n";
+
+ programCollection.add("geometry") << glu::GeometrySource(geometry.str());
+ }
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream controlSource;
+ controlSource << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(vertices = 2) out;\n"
+ << "layout(location = 0) out float out_color[];\n"
+ << "layout(binding = 0, std140) uniform Buffer0\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " if (gl_InvocationID == 0)\n"
+ <<" {\n"
+ << " gl_TessLevelOuter[0] = 1.0f;\n"
+ << " gl_TessLevelOuter[1] = 1.0f;\n"
+ << " }\n"
+ << " uvec4 mask = subgroupBallot(true);\n"
+ << bdy.str()
+ << " out_color[gl_InvocationID] = float(tempResult);"
+ << " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ << "}\n";
+
+
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSource.str());
+ subgroups::setTesEvalShaderFrameBuffer(programCollection);
+ }
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ {
+
+ std::ostringstream evaluationSource;
+ evaluationSource << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(isolines, equal_spacing, ccw ) in;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "layout(binding = 0, std140) uniform Buffer0\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec4 mask = subgroupBallot(true);\n"
+ << bdy.str()
+ << " out_color = float(tempResult);\n"
+ << " gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
+ << "}\n";
+
+ subgroups::setTesCtrlShaderFrameBuffer(programCollection);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
+ }
+ else
+ {
+ DE_FATAL("Unsupported shader stage");
+ }
+}
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ std::string indexVars;
+ switch (caseDef.opType)
+ {
+ default:
+ indexVars = " uint start = 0u, end = gl_SubgroupSize;\n";
+ break;
+ case OPTYPE_INCLUSIVE_ADD:
+ case OPTYPE_INCLUSIVE_MUL:
+ case OPTYPE_INCLUSIVE_MIN:
+ case OPTYPE_INCLUSIVE_MAX:
+ case OPTYPE_INCLUSIVE_AND:
+ case OPTYPE_INCLUSIVE_OR:
+ case OPTYPE_INCLUSIVE_XOR:
+ indexVars = " uint start = 0u, end = gl_SubgroupInvocationID + 1u;\n";
+ break;
+ case OPTYPE_EXCLUSIVE_ADD:
+ case OPTYPE_EXCLUSIVE_MUL:
+ case OPTYPE_EXCLUSIVE_MIN:
+ case OPTYPE_EXCLUSIVE_MAX:
+ case OPTYPE_EXCLUSIVE_AND:
+ case OPTYPE_EXCLUSIVE_OR:
+ case OPTYPE_EXCLUSIVE_XOR:
+ indexVars = " uint start = 0u, end = gl_SubgroupInvocationID;\n";
+ break;
+ }
+
+ const string bdy =
+ indexVars +
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " ref = "
+ + getIdentity(caseDef.opType, caseDef.format) + ";\n"
+ " uint tempResult = 0u;\n"
+ " for (uint index = start; index < end; index++)\n"
+ " {\n"
+ " if (subgroupBallotBitExtract(mask, index))\n"
+ " {\n"
+ " ref = " + getOpTypeOperation(caseDef.opType, caseDef.format, "ref", "data[index]") + ";\n"
+ " }\n"
+ " }\n"
+ " tempResult = " + getCompare(caseDef.opType, caseDef.format, "ref", getOpTypeName(caseDef.opType) + "(data[gl_SubgroupInvocationID])") + " ? 0x1u : 0u;\n"
+ " if (1u == (gl_SubgroupInvocationID % 2u))\n"
+ " {\n"
+ " mask = subgroupBallot(true);\n"
+ " ref = " + getIdentity(caseDef.opType, caseDef.format) + ";\n"
+ " for (uint index = start; index < end; index++)\n"
+ " {\n"
+ " if (subgroupBallotBitExtract(mask, index))\n"
+ " {\n"
+ " ref = " + getOpTypeOperation(caseDef.opType, caseDef.format, "ref", "data[index]") + ";\n"
+ " }\n"
+ " }\n"
+ " tempResult |= " + getCompare(caseDef.opType, caseDef.format, "ref", getOpTypeName(caseDef.opType) + "(data[gl_SubgroupInvocationID])") + " ? 0x2u : 0u;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " tempResult |= 0x2u;\n"
+ " }\n";
+
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream src;
+
+ src << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Buffer0\n"
+ << "{\n"
+ << " uint result[];\n"
+ << "};\n"
+ << "layout(binding = 1, std430) buffer Buffer1\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+ << " highp uint offset = globalSize.x * ((globalSize.y * "
+ "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+ "gl_GlobalInvocationID.x;\n"
+ << " uvec4 mask = subgroupBallot(true);\n"
+ << bdy
+ << " result[offset] = tempResult;\n"
+ << "}\n";
+
+ programCollection.add("comp") << glu::ComputeSource(src.str());
+ }
+ else
+ {
+ {
+ const std::string vertex =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(binding = 0, std430) buffer Buffer0\n"
+ "{\n"
+ " uint result[];\n"
+ "} b0;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " uvec4 mask = subgroupBallot(true);\n"
+ + bdy+
+ " b0.result[gl_VertexID] = tempResult;\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " float pixelPosition = pixelSize/2.0f - 1.0f;\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_PointSize = 1.0f;\n"
+ "}\n";
+ programCollection.add("vert") << glu::VertexSource(vertex);
+ }
+
+ {
+ const std::string tesc =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(vertices=1) out;\n"
+ "layout(binding = 1, std430) buffer Buffer1\n"
+ "{\n"
+ " uint result[];\n"
+ "} b1;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " uvec4 mask = subgroupBallot(true);\n"
+ + bdy +
+ " b1.result[gl_PrimitiveID] = tempResult;\n"
+ " if (gl_InvocationID == 0)\n"
+ " {\n"
+ " gl_TessLevelOuter[0] = 1.0f;\n"
+ " gl_TessLevelOuter[1] = 1.0f;\n"
+ " }\n"
+ " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ "}\n";
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc);
+ }
+
+ {
+ const std::string tese =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(isolines) in;\n"
+ "layout(binding = 2, std430) buffer Buffer2\n"
+ "{\n"
+ " uint result[];\n"
+ "} b2;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " uvec4 mask = subgroupBallot(true);\n"
+ + bdy +
+ " b2.result[gl_PrimitiveID * 2 + int(gl_TessCoord.x + 0.5)] = tempResult;\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
+ "}\n";
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese);
+ }
+
+ {
+ const std::string geometry =
+ // version added by addGeometryShadersFromTemplate
+ "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(${TOPOLOGY}) in;\n"
+ "layout(points, max_vertices = 1) out;\n"
+ "layout(binding = 3, std430) buffer Buffer3\n"
+ "{\n"
+ " uint result[];\n"
+ "} b3;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " uvec4 mask = subgroupBallot(true);\n"
+ + bdy +
+ " b3.result[gl_PrimitiveIDIn] = tempResult;\n"
+ " gl_Position = gl_in[0].gl_Position;\n"
+ " EmitVertex();\n"
+ " EndPrimitive();\n"
+ "}\n";
+ subgroups::addGeometryShadersFromTemplate(geometry, programCollection);
+ }
+
+ {
+ const std::string fragment =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "precision highp int;\n"
+ "precision highp float;\n"
+ "layout(location = 0) out uint result;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
+ "};\n"
+ "void main (void)\n"
+ "{\n"
+ " uvec4 mask = subgroupBallot(true);\n"
+ + bdy +
+ " result = tempResult;\n"
+ "}\n";
+ programCollection.add("fragment") << glu::FragmentSource(fragment);
+ }
+ subgroups::addNoSubgroupShader(programCollection);
+ }
+}
+
+void supportedCheck (Context& context, CaseDefinition caseDef)
+{
+ if (!subgroups::isSubgroupSupported(context))
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported");
+
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_ARITHMETIC_BIT))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup arithmetic operations");
+ }
+
+ if (subgroups::isDoubleFormat(caseDef.format) &&
+ !subgroups::isDoubleSupportedForDevice(context))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
+ }
+}
+
+tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
+{
+ if (!subgroups::areSubgroupOperationsSupportedForStage(
+ context, caseDef.shaderStage))
+ {
+ if (subgroups::areSubgroupOperationsRequiredForStage(
+ caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ else
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+ }
+ }
+
+ subgroups::SSBOData inputData;
+ inputData.format = caseDef.format;
+ inputData.layout = subgroups::SSBOData::LayoutStd140;
+ inputData.numElements = subgroups::maxSupportedSubgroupSize();
+ inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData.binding = 0u;
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ return subgroups::makeVertexFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ return subgroups::makeGeometryFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_CONTROL_BIT);
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_EVALUATION_BIT);
+ else
+ TCU_THROW(InternalError, "Unhandled shader stage");
+}
+
+bool checkShaderStages (Context& context, const CaseDefinition& caseDef)
+{
+ if (!subgroups::areSubgroupOperationsSupportedForStage(
+ context, caseDef.shaderStage))
+ {
+ if (subgroups::areSubgroupOperationsRequiredForStage(
+ caseDef.shaderStage))
+ {
+ return false;
+ }
+ else
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+ }
+ }
+ return true;
+}
+
+tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+{
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ if(!checkShaderStages(context,caseDef))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ subgroups::SSBOData inputData;
+ inputData.format = caseDef.format;
+ inputData.layout = subgroups::SSBOData::LayoutStd430;
+ inputData.numElements = subgroups::maxSupportedSubgroupSize();
+ inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData.binding = 1u;
+
+ return subgroups::makeComputeTest(context, FORMAT_R32_UINT, &inputData, 1, checkComputeStage);
+ }
+ else
+ {
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
+
+ ShaderStageFlags stages = (ShaderStageFlags)(caseDef.shaderStage & supportedStages);
+
+ if ( SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ {
+ if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0)
+ TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+ else
+ stages = SHADER_STAGE_FRAGMENT_BIT;
+ }
+
+ if ((ShaderStageFlags)0u == stages)
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
+
+ subgroups::SSBOData inputData;
+ inputData.format = caseDef.format;
+ inputData.layout = subgroups::SSBOData::LayoutStd430;
+ inputData.numElements = subgroups::maxSupportedSubgroupSize();
+ inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData.binding = 4u;
+ inputData.stages = stages;
+
+ return subgroups::allStages(context, FORMAT_R32_UINT, &inputData,
+ 1, checkVertexPipelineStages, stages);
+ }
+}
+}
+
+deqp::TestCaseGroup* createSubgroupsArithmeticTests(deqp::Context& testCtx)
+{
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
+ testCtx, "graphics", "Subgroup arithmetic category tests: graphics"));
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
+ testCtx, "compute", "Subgroup arithmetic category tests: compute"));
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
+ testCtx, "framebuffer", "Subgroup arithmetic category tests: framebuffer"));
+
+ const ShaderStageFlags stages[] =
+ {
+ SHADER_STAGE_VERTEX_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT,
+ };
+
+ const Format formats[] =
+ {
+ FORMAT_R32_SINT, FORMAT_R32G32_SINT, FORMAT_R32G32B32_SINT,
+ FORMAT_R32G32B32A32_SINT, FORMAT_R32_UINT, FORMAT_R32G32_UINT,
+ FORMAT_R32G32B32_UINT, FORMAT_R32G32B32A32_UINT,
+ FORMAT_R32_SFLOAT, FORMAT_R32G32_SFLOAT,
+ FORMAT_R32G32B32_SFLOAT, FORMAT_R32G32B32A32_SFLOAT,
+ FORMAT_R64_SFLOAT, FORMAT_R64G64_SFLOAT,
+ FORMAT_R64G64B64_SFLOAT, FORMAT_R64G64B64A64_SFLOAT,
+ FORMAT_R32_BOOL, FORMAT_R32G32_BOOL,
+ FORMAT_R32G32B32_BOOL, FORMAT_R32G32B32A32_BOOL,
+ };
+
+ for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
+ {
+ const Format format = formats[formatIndex];
+
+ for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
+ {
+ bool isBool = false;
+ bool isFloat = false;
+
+ switch (format)
+ {
+ default:
+ break;
+ case FORMAT_R32_SFLOAT:
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
+ isFloat = true;
+ break;
+ case FORMAT_R32_BOOL:
+ case FORMAT_R32G32_BOOL:
+ case FORMAT_R32G32B32_BOOL:
+ case FORMAT_R32G32B32A32_BOOL:
+ isBool = true;
+ break;
+ }
+
+ bool isBitwiseOp = false;
+
+ switch (opTypeIndex)
+ {
+ default:
+ break;
+ case OPTYPE_AND:
+ case OPTYPE_INCLUSIVE_AND:
+ case OPTYPE_EXCLUSIVE_AND:
+ case OPTYPE_OR:
+ case OPTYPE_INCLUSIVE_OR:
+ case OPTYPE_EXCLUSIVE_OR:
+ case OPTYPE_XOR:
+ case OPTYPE_INCLUSIVE_XOR:
+ case OPTYPE_EXCLUSIVE_XOR:
+ isBitwiseOp = true;
+ break;
+ }
+
+ if (isFloat && isBitwiseOp)
+ {
+ // Skip float with bitwise category.
+ continue;
+ }
+
+ if (isBool && !isBitwiseOp)
+ {
+ // Skip bool when its not the bitwise category.
+ continue;
+ }
+ std::string op = getOpTypeName(opTypeIndex);
+
+ {
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_COMPUTE_BIT, format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(),
+ de::toLower(op) + "_" +
+ subgroups::getFormatNameForGLSL(format),
+ "", supportedCheck, initPrograms, test, caseDef);
+ }
+
+ {
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_ALL_GRAPHICS, format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(),
+ de::toLower(op) + "_" +
+ subgroups::getFormatNameForGLSL(format),
+ "", supportedCheck, initPrograms, test, caseDef);
+ }
+
+ for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+ {
+ const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex], format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(), de::toLower(op) + "_" + subgroups::getFormatNameForGLSL(format) +
+ "_" + getShaderStageName(caseDef.shaderStage), "",
+ supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
+ }
+ }
+ }
+
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
+ testCtx, "arithmetic", "Subgroup arithmetic category tests"));
+
+ group->addChild(graphicGroup.release());
+ group->addChild(computeGroup.release());
+ group->addChild(framebufferGroup.release());
+
+ return group.release();
+}
+
+} // subgroups
+} // glc
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsArithmeticTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsArithmeticTests.hpp
new file mode 100644
index 0000000..fbd02f4
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsArithmeticTests.hpp
@@ -0,0 +1,41 @@
+#ifndef _GLCSUBGROUPSARITHMETICTESTS_HPP
+#define _GLCSUBGROUPSARITHMETICTESTS_HPP
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "glcTestCase.hpp"
+
+namespace glc
+{
+namespace subgroups
+{
+
+deqp::TestCaseGroup* createSubgroupsArithmeticTests(deqp::Context& testCtx);
+
+} // subgroups
+} // glc
+
+#endif // _GLCSUBGROUPSARITHMETICTESTS_HPP
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsBallotBroadcastTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsBallotBroadcastTests.cpp
new file mode 100755
index 0000000..0bb5561
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsBallotBroadcastTests.cpp
@@ -0,0 +1,583 @@
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "glcSubgroupsBallotBroadcastTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+
+using namespace tcu;
+using namespace std;
+
+namespace glc
+{
+namespace subgroups
+{
+namespace
+{
+enum OpType
+{
+ OPTYPE_BROADCAST = 0,
+ OPTYPE_BROADCAST_FIRST,
+ OPTYPE_LAST
+};
+
+static bool checkVertexPipelineStages(std::vector<const void*> datas,
+ deUint32 width, deUint32)
+{
+ return glc::subgroups::check(datas, width, 3);
+}
+
+static bool checkComputeStages(std::vector<const void*> datas,
+ const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+ deUint32)
+{
+ return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, 3);
+}
+
+std::string getOpTypeName(int opType)
+{
+ switch (opType)
+ {
+ default:
+ DE_FATAL("Unsupported op type");
+ return "";
+ case OPTYPE_BROADCAST:
+ return "subgroupBroadcast";
+ case OPTYPE_BROADCAST_FIRST:
+ return "subgroupBroadcastFirst";
+ }
+}
+
+struct CaseDefinition
+{
+ int opType;
+ ShaderStageFlags shaderStage;
+ Format format;
+};
+
+std::string getBodySource(CaseDefinition caseDef)
+{
+ std::ostringstream bdy;
+
+ bdy << " uvec4 mask = subgroupBallot(true);\n";
+ bdy << " uint tempResult = 0u;\n";
+
+ if (OPTYPE_BROADCAST == caseDef.opType)
+ {
+ bdy << " tempResult = 0x3u;\n";
+ for (int i = 0; i < (int)subgroups::maxSupportedSubgroupSize(); i++)
+ {
+ bdy << " {\n"
+ << " const uint id = "<< i << "u;\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format)
+ << " op = subgroupBroadcast(data1[gl_SubgroupInvocationID], id);\n"
+ << " if ((id < gl_SubgroupSize) && subgroupBallotBitExtract(mask, id))\n"
+ << " {\n"
+ << " if (op != data1[id])\n"
+ << " {\n"
+ << " tempResult = 0u;\n"
+ << " }\n"
+ << " }\n"
+ << " }\n";
+ }
+ }
+ else
+ {
+ bdy << " uint firstActive = 0u;\n"
+ << " for (uint i = 0u; i < gl_SubgroupSize; i++)\n"
+ << " {\n"
+ << " if (subgroupBallotBitExtract(mask, i))\n"
+ << " {\n"
+ << " firstActive = i;\n"
+ << " break;\n"
+ << " }\n"
+ << " }\n"
+ << " tempResult |= (subgroupBroadcastFirst(data1[gl_SubgroupInvocationID]) == data1[firstActive]) ? 0x1u : 0u;\n"
+ << " // make the firstActive invocation inactive now\n"
+ << " if (firstActive == gl_SubgroupInvocationID)\n"
+ << " {\n"
+ << " for (uint i = 0u; i < gl_SubgroupSize; i++)\n"
+ << " {\n"
+ << " if (subgroupBallotBitExtract(mask, i))\n"
+ << " {\n"
+ << " firstActive = i;\n"
+ << " break;\n"
+ << " }\n"
+ << " }\n"
+ << " tempResult |= (subgroupBroadcastFirst(data1[gl_SubgroupInvocationID]) == data1[firstActive]) ? 0x2u : 0u;\n"
+ << " }\n"
+ << " else\n"
+ << " {\n"
+ << " // the firstActive invocation didn't partake in the second result so set it to true\n"
+ << " tempResult |= 0x2u;\n"
+ << " }\n";
+ }
+ return bdy.str();
+}
+
+void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ subgroups::setFragmentShaderFrameBuffer(programCollection);
+
+ if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ subgroups::setVertexShaderFrameBuffer(programCollection);
+
+ std::string bdyStr = getBodySource(caseDef);
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream vertex;
+ vertex << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(location = 0) in highp vec4 in_position;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "layout(binding = 0, std140) uniform Buffer0\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << bdyStr
+ << " out_color = float(tempResult);\n"
+ << " gl_Position = in_position;\n"
+ << " gl_PointSize = 1.0f;\n"
+ << "}\n";
+ programCollection.add("vert") << glu::VertexSource(vertex.str());
+ }
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream geometry;
+
+ geometry << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(points) in;\n"
+ << "layout(points, max_vertices = 1) out;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "layout(binding = 0, std140) uniform Buffer0\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" <<subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << bdyStr
+ << " out_color = float(tempResult);\n"
+ << " gl_Position = gl_in[0].gl_Position;\n"
+ << " EmitVertex();\n"
+ << " EndPrimitive();\n"
+ << "}\n";
+
+ programCollection.add("geometry") << glu::GeometrySource(geometry.str());
+ }
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream controlSource;
+
+ controlSource << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(vertices = 2) out;\n"
+ << "layout(location = 0) out float out_color[];\n"
+ << "layout(binding = 0, std140) uniform Buffer0\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" <<subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " if (gl_InvocationID == 0)\n"
+ << " {\n"
+ << " gl_TessLevelOuter[0] = 1.0f;\n"
+ << " gl_TessLevelOuter[1] = 1.0f;\n"
+ << " }\n"
+ << bdyStr
+ << " out_color[gl_InvocationID ] = float(tempResult);\n"
+ << " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ << "}\n";
+
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSource.str());
+ subgroups::setTesEvalShaderFrameBuffer(programCollection);
+ }
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream evaluationSource;
+ evaluationSource << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(isolines, equal_spacing, ccw ) in;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "layout(binding = 0, std140) uniform Buffer0\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" <<subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << bdyStr
+ << " out_color = float(tempResult);\n"
+ << " gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
+ << "}\n";
+
+ subgroups::setTesCtrlShaderFrameBuffer(programCollection);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
+ }
+ else
+ {
+ DE_FATAL("Unsupported shader stage");
+ }
+}
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ std::string bdyStr = getBodySource(caseDef);
+
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream src;
+
+ src << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Buffer0\n"
+ << "{\n"
+ << " uint result[];\n"
+ << "};\n"
+ << "layout(binding = 1, std430) buffer Buffer1\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+ << " highp uint offset = globalSize.x * ((globalSize.y * "
+ "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+ "gl_GlobalInvocationID.x;\n"
+ << bdyStr
+ << " result[offset] = tempResult;\n"
+ << "}\n";
+
+ programCollection.add("comp") << glu::ComputeSource(src.str());
+ }
+ else
+ {
+ const string vertex =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(binding = 0, std430) buffer Buffer0\n"
+ "{\n"
+ " uint result[];\n"
+ "} b0;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data1[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdyStr +
+ " b0.result[gl_VertexID] = tempResult;\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " float pixelPosition = pixelSize/2.0f - 1.0f;\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_PointSize = 1.0f;\n"
+ "}\n";
+
+ const string tesc =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(vertices=1) out;\n"
+ "layout(binding = 1, std430) buffer Buffer1\n"
+ "{\n"
+ " uint result[];\n"
+ "} b1;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data1[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdyStr +
+ " b1.result[gl_PrimitiveID] = tempResult;\n"
+ " if (gl_InvocationID == 0)\n"
+ " {\n"
+ " gl_TessLevelOuter[0] = 1.0f;\n"
+ " gl_TessLevelOuter[1] = 1.0f;\n"
+ " }\n"
+ " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ "}\n";
+
+ const string tese =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(isolines) in;\n"
+ "layout(binding = 2, std430) buffer Buffer2\n"
+ "{\n"
+ " uint result[];\n"
+ "} b2;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data1[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdyStr +
+ " b2.result[gl_PrimitiveID * 2 + int(gl_TessCoord.x + 0.5)] = tempResult;\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
+ "}\n";
+
+ const string geometry =
+ //version string added by addGeometryShadersFromTemplate
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(${TOPOLOGY}) in;\n"
+ "layout(points, max_vertices = 1) out;\n"
+ "layout(binding = 3, std430) buffer Buffer3\n"
+ "{\n"
+ " uint result[];\n"
+ "} b3;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data1[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdyStr +
+ " b3.result[gl_PrimitiveIDIn] = tempResult;\n"
+ " gl_Position = gl_in[0].gl_Position;\n"
+ " EmitVertex();\n"
+ " EndPrimitive();\n"
+ "}\n";
+
+ const string fragment =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "precision highp int;\n"
+ "precision highp float;\n"
+ "layout(location = 0) out uint result;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data1[];\n"
+ "};\n"
+ "void main (void)\n"
+ "{\n"
+ + bdyStr +
+ " result = tempResult;\n"
+ "}\n";
+
+ subgroups::addNoSubgroupShader(programCollection);
+
+ programCollection.add("vert") << glu::VertexSource(vertex);
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese);
+ subgroups::addGeometryShadersFromTemplate(geometry, programCollection);
+ programCollection.add("fragment") << glu::FragmentSource(fragment);
+ }
+}
+
+void supportedCheck (Context& context, CaseDefinition caseDef)
+{
+ if (!subgroups::isSubgroupSupported(context))
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported");
+
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_BALLOT_BIT))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup ballot operations");
+ }
+
+ if (subgroups::isDoubleFormat(caseDef.format) &&
+ !subgroups::isDoubleSupportedForDevice(context))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
+ }
+}
+
+tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
+{
+ if (!subgroups::areSubgroupOperationsSupportedForStage(
+ context, caseDef.shaderStage))
+ {
+ if (subgroups::areSubgroupOperationsRequiredForStage(caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ else
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+ }
+ }
+
+ subgroups::SSBOData inputData[1];
+ inputData[0].format = caseDef.format;
+ inputData[0].layout = subgroups::SSBOData::LayoutStd140;
+ inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+ inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ return subgroups::makeVertexFrameBufferTest(context, FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ return subgroups::makeGeometryFrameBufferTest(context, FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_CONTROL_BIT);
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_EVALUATION_BIT);
+ else
+ TCU_THROW(InternalError, "Unhandled shader stage");
+}
+
+
+tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+{
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ if (!subgroups::areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage))
+ {
+ if (subgroups::areSubgroupOperationsRequiredForStage(caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ else
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+ }
+ }
+ subgroups::SSBOData inputData[1];
+ inputData[0].format = caseDef.format;
+ inputData[0].layout = subgroups::SSBOData::LayoutStd430;
+ inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+ inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData[0].binding = 1u;
+
+ return subgroups::makeComputeTest(context, FORMAT_R32_UINT, inputData, 1, checkComputeStages);
+ }
+ else
+ {
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
+
+ ShaderStageFlags stages = (ShaderStageFlags)(caseDef.shaderStage & supportedStages);
+
+ if ( SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ {
+ if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0)
+ TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+ else
+ stages = SHADER_STAGE_FRAGMENT_BIT;
+ }
+
+ if ((ShaderStageFlags)0u == stages)
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
+
+ subgroups::SSBOData inputData;
+ inputData.format = caseDef.format;
+ inputData.layout = subgroups::SSBOData::LayoutStd430;
+ inputData.numElements = subgroups::maxSupportedSubgroupSize();
+ inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData.binding = 4u;
+ inputData.stages = stages;
+
+ return subgroups::allStages(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, stages);
+ }
+}
+}
+
+deqp::TestCaseGroup* createSubgroupsBallotBroadcastTests(deqp::Context& testCtx)
+{
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
+ testCtx, "graphics", "Subgroup ballot broadcast category tests: graphics"));
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
+ testCtx, "compute", "Subgroup ballot broadcast category tests: compute"));
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
+ testCtx, "framebuffer", "Subgroup ballot broadcast category tests: framebuffer"));
+
+ const ShaderStageFlags stages[] =
+ {
+ SHADER_STAGE_VERTEX_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT,
+ };
+
+ const Format formats[] =
+ {
+ FORMAT_R32_SINT, FORMAT_R32G32_SINT, FORMAT_R32G32B32_SINT,
+ FORMAT_R32G32B32A32_SINT, FORMAT_R32_UINT, FORMAT_R32G32_UINT,
+ FORMAT_R32G32B32_UINT, FORMAT_R32G32B32A32_UINT,
+ FORMAT_R32_SFLOAT, FORMAT_R32G32_SFLOAT,
+ FORMAT_R32G32B32_SFLOAT, FORMAT_R32G32B32A32_SFLOAT,
+ FORMAT_R64_SFLOAT, FORMAT_R64G64_SFLOAT,
+ FORMAT_R64G64B64_SFLOAT, FORMAT_R64G64B64A64_SFLOAT,
+ FORMAT_R32_BOOL, FORMAT_R32G32_BOOL,
+ FORMAT_R32G32B32_BOOL, FORMAT_R32G32B32A32_BOOL,
+ };
+
+ for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
+ {
+ const Format format = formats[formatIndex];
+
+ for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
+ {
+ const std::string op = de::toLower(getOpTypeName(opTypeIndex));
+ const std::string name = op + "_" + subgroups::getFormatNameForGLSL(format);
+
+ {
+ CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_COMPUTE_BIT, format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(), name, "", supportedCheck, initPrograms, test, caseDef);
+ }
+
+ {
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_ALL_GRAPHICS, format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(), name, "", supportedCheck, initPrograms, test, caseDef);
+ }
+
+ for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+ {
+ const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex], format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(), name + getShaderStageName(caseDef.shaderStage), "",
+ supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
+ }
+ }
+ }
+
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
+ testCtx, "ballot_broadcast", "Subgroup ballot broadcast category tests"));
+
+ group->addChild(graphicGroup.release());
+ group->addChild(computeGroup.release());
+ group->addChild(framebufferGroup.release());
+ return group.release();
+}
+
+} // subgroups
+} // glc
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsBallotBroadcastTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsBallotBroadcastTests.hpp
new file mode 100644
index 0000000..d1deb95
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsBallotBroadcastTests.hpp
@@ -0,0 +1,41 @@
+#ifndef _GLCSUBGROUPSBALLOTBROADCASTTESTS_HPP
+#define _GLCSUBGROUPSBALLOTBROADCASTTESTS_HPP
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "glcTestCase.hpp"
+
+namespace glc
+{
+namespace subgroups
+{
+
+deqp::TestCaseGroup* createSubgroupsBallotBroadcastTests(deqp::Context& testCtx);
+
+} // subgroups
+} // glc
+
+#endif // _GLCSUBGROUPSBALLOTBROADCASTTESTS_HPP
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsBallotOtherTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsBallotOtherTests.cpp
new file mode 100755
index 0000000..acf97b3
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsBallotOtherTests.cpp
@@ -0,0 +1,583 @@
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "glcSubgroupsBallotOtherTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+
+using namespace tcu;
+using namespace std;
+
+namespace glc
+{
+namespace subgroups
+{
+namespace
+{
+enum OpType
+{
+ OPTYPE_INVERSE_BALLOT = 0,
+ OPTYPE_BALLOT_BIT_EXTRACT,
+ OPTYPE_BALLOT_BIT_COUNT,
+ OPTYPE_BALLOT_INCLUSIVE_BIT_COUNT,
+ OPTYPE_BALLOT_EXCLUSIVE_BIT_COUNT,
+ OPTYPE_BALLOT_FIND_LSB,
+ OPTYPE_BALLOT_FIND_MSB,
+ OPTYPE_LAST
+};
+
+static bool checkVertexPipelineStages(std::vector<const void*> datas,
+ deUint32 width, deUint32)
+{
+ return glc::subgroups::check(datas, width, 0xf);
+}
+
+static bool checkComputeStage(std::vector<const void*> datas,
+ const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+ deUint32)
+{
+ return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, 0xf);
+}
+
+std::string getOpTypeName(int opType)
+{
+ switch (opType)
+ {
+ default:
+ DE_FATAL("Unsupported op type");
+ return "";
+ case OPTYPE_INVERSE_BALLOT:
+ return "subgroupInverseBallot";
+ case OPTYPE_BALLOT_BIT_EXTRACT:
+ return "subgroupBallotBitExtract";
+ case OPTYPE_BALLOT_BIT_COUNT:
+ return "subgroupBallotBitCount";
+ case OPTYPE_BALLOT_INCLUSIVE_BIT_COUNT:
+ return "subgroupBallotInclusiveBitCount";
+ case OPTYPE_BALLOT_EXCLUSIVE_BIT_COUNT:
+ return "subgroupBallotExclusiveBitCount";
+ case OPTYPE_BALLOT_FIND_LSB:
+ return "subgroupBallotFindLSB";
+ case OPTYPE_BALLOT_FIND_MSB:
+ return "subgroupBallotFindMSB";
+ }
+}
+
+struct CaseDefinition
+{
+ int opType;
+ ShaderStageFlags shaderStage;
+};
+
+std::string getBodySource(CaseDefinition caseDef)
+{
+ std::ostringstream bdy;
+
+ bdy << " uvec4 allOnes = uvec4(0xFFFFFFFF);\n"
+ << " uvec4 allZeros = uvec4(0);\n"
+ << " uint tempResult = 0u;\n"
+ << "#define MAKE_HIGH_BALLOT_RESULT(i) uvec4("
+ << "i >= 32u ? 0u : (0xFFFFFFFFu << i), "
+ << "i >= 64u ? 0u : (0xFFFFFFFFu << ((i < 32u) ? 0u : (i - 32u))), "
+ << "i >= 96u ? 0u : (0xFFFFFFFFu << ((i < 64u) ? 0u : (i - 64u))), "
+ << " 0xFFFFFFFFu << ((i < 96u) ? 0u : (i - 96u)))\n"
+ << "#define MAKE_SINGLE_BIT_BALLOT_RESULT(i) uvec4("
+ << "i >= 32u ? 0u : 0x1u << i, "
+ << "i < 32u || i >= 64u ? 0u : 0x1u << (i - 32u), "
+ << "i < 64u || i >= 96u ? 0u : 0x1u << (i - 64u), "
+ << "i < 96u ? 0u : 0x1u << (i - 96u))\n";
+
+ switch (caseDef.opType)
+ {
+ default:
+ DE_FATAL("Unknown op type!");
+ break;
+ case OPTYPE_INVERSE_BALLOT:
+ bdy << " tempResult |= subgroupInverseBallot(allOnes) ? 0x1u : 0u;\n"
+ << " tempResult |= subgroupInverseBallot(allZeros) ? 0u : 0x2u;\n"
+ << " tempResult |= subgroupInverseBallot(subgroupBallot(true)) ? 0x4u : 0u;\n"
+ << " tempResult |= 0x8u;\n";
+ break;
+ case OPTYPE_BALLOT_BIT_EXTRACT:
+ bdy << " tempResult |= subgroupBallotBitExtract(allOnes, gl_SubgroupInvocationID) ? 0x1u : 0u;\n"
+ << " tempResult |= subgroupBallotBitExtract(allZeros, gl_SubgroupInvocationID) ? 0u : 0x2u;\n"
+ << " tempResult |= subgroupBallotBitExtract(subgroupBallot(true), gl_SubgroupInvocationID) ? 0x4u : 0u;\n"
+ << " tempResult |= 0x8u;\n"
+ << " for (uint i = 0u; i < gl_SubgroupSize; i++)\n"
+ << " {\n"
+ << " if (!subgroupBallotBitExtract(allOnes, gl_SubgroupInvocationID))\n"
+ << " {\n"
+ << " tempResult &= ~0x8u;\n"
+ << " }\n"
+ << " }\n";
+ break;
+ case OPTYPE_BALLOT_BIT_COUNT:
+ bdy << " tempResult |= gl_SubgroupSize == subgroupBallotBitCount(allOnes) ? 0x1u : 0u;\n"
+ << " tempResult |= 0u == subgroupBallotBitCount(allZeros) ? 0x2u : 0u;\n"
+ << " tempResult |= 0u < subgroupBallotBitCount(subgroupBallot(true)) ? 0x4u : 0u;\n"
+ << " tempResult |= 0u == subgroupBallotBitCount(MAKE_HIGH_BALLOT_RESULT(gl_SubgroupSize)) ? 0x8u : 0u;\n";
+ break;
+ case OPTYPE_BALLOT_INCLUSIVE_BIT_COUNT:
+ bdy << " uint inclusiveOffset = gl_SubgroupInvocationID + 1u;\n"
+ << " tempResult |= inclusiveOffset == subgroupBallotInclusiveBitCount(allOnes) ? 0x1u : 0u;\n"
+ << " tempResult |= 0u == subgroupBallotInclusiveBitCount(allZeros) ? 0x2u : 0u;\n"
+ << " tempResult |= 0u < subgroupBallotInclusiveBitCount(subgroupBallot(true)) ? 0x4u : 0u;\n"
+ << " tempResult |= 0x8u;\n"
+ << " uvec4 inclusiveUndef = MAKE_HIGH_BALLOT_RESULT(inclusiveOffset);\n"
+ << " bool undefTerritory = false;\n"
+ << " for (uint i = 0u; i <= 128u; i++)\n"
+ << " {\n"
+ << " uvec4 iUndef = MAKE_HIGH_BALLOT_RESULT(i);\n"
+ << " if (iUndef == inclusiveUndef)"
+ << " {\n"
+ << " undefTerritory = true;\n"
+ << " }\n"
+ << " uint inclusiveBitCount = subgroupBallotInclusiveBitCount(iUndef);\n"
+ << " if (undefTerritory && (0u != inclusiveBitCount))\n"
+ << " {\n"
+ << " tempResult &= ~0x8u;\n"
+ << " }\n"
+ << " else if (!undefTerritory && (0u == inclusiveBitCount))\n"
+ << " {\n"
+ << " tempResult &= ~0x8u;\n"
+ << " }\n"
+ << " }\n";
+ break;
+ case OPTYPE_BALLOT_EXCLUSIVE_BIT_COUNT:
+ bdy << " uint exclusiveOffset = gl_SubgroupInvocationID;\n"
+ << " tempResult |= exclusiveOffset == subgroupBallotExclusiveBitCount(allOnes) ? 0x1u : 0u;\n"
+ << " tempResult |= 0u == subgroupBallotExclusiveBitCount(allZeros) ? 0x2u : 0u;\n"
+ << " tempResult |= 0x4u;\n"
+ << " tempResult |= 0x8u;\n"
+ << " uvec4 exclusiveUndef = MAKE_HIGH_BALLOT_RESULT(exclusiveOffset);\n"
+ << " bool undefTerritory = false;\n"
+ << " for (uint i = 0u; i <= 128u; i++)\n"
+ << " {\n"
+ << " uvec4 iUndef = MAKE_HIGH_BALLOT_RESULT(i);\n"
+ << " if (iUndef == exclusiveUndef)"
+ << " {\n"
+ << " undefTerritory = true;\n"
+ << " }\n"
+ << " uint exclusiveBitCount = subgroupBallotExclusiveBitCount(iUndef);\n"
+ << " if (undefTerritory && (0u != exclusiveBitCount))\n"
+ << " {\n"
+ << " tempResult &= ~0x4u;\n"
+ << " }\n"
+ << " else if (!undefTerritory && (0u == exclusiveBitCount))\n"
+ << " {\n"
+ << " tempResult &= ~0x8u;\n"
+ << " }\n"
+ << " }\n";
+ break;
+ case OPTYPE_BALLOT_FIND_LSB:
+ bdy << " tempResult |= 0u == subgroupBallotFindLSB(allOnes) ? 0x1u : 0u;\n"
+ << " if (subgroupElect())\n"
+ << " {\n"
+ << " tempResult |= 0x2u;\n"
+ << " }\n"
+ << " else\n"
+ << " {\n"
+ << " tempResult |= 0u < subgroupBallotFindLSB(subgroupBallot(true)) ? 0x2u : 0u;\n"
+ << " }\n"
+ << " tempResult |= gl_SubgroupSize > subgroupBallotFindLSB(subgroupBallot(true)) ? 0x4u : 0u;\n"
+ << " tempResult |= 0x8u;\n"
+ << " for (uint i = 0u; i < gl_SubgroupSize; i++)\n"
+ << " {\n"
+ << " if (i != subgroupBallotFindLSB(MAKE_HIGH_BALLOT_RESULT(i)))\n"
+ << " {\n"
+ << " tempResult &= ~0x8u;\n"
+ << " }\n"
+ << " }\n";
+ break;
+ case OPTYPE_BALLOT_FIND_MSB:
+ bdy << " tempResult |= (gl_SubgroupSize - 1u) == subgroupBallotFindMSB(allOnes) ? 0x1u : 0u;\n"
+ << " if (subgroupElect())\n"
+ << " {\n"
+ << " tempResult |= 0x2u;\n"
+ << " }\n"
+ << " else\n"
+ << " {\n"
+ << " tempResult |= 0u < subgroupBallotFindMSB(subgroupBallot(true)) ? 0x2u : 0u;\n"
+ << " }\n"
+ << " tempResult |= gl_SubgroupSize > subgroupBallotFindMSB(subgroupBallot(true)) ? 0x4u : 0u;\n"
+ << " tempResult |= 0x8u;\n"
+ << " for (uint i = 0u; i < gl_SubgroupSize; i++)\n"
+ << " {\n"
+ << " if (i != subgroupBallotFindMSB(MAKE_SINGLE_BIT_BALLOT_RESULT(i)))\n"
+ << " {\n"
+ << " tempResult &= ~0x8u;\n"
+ << " }\n"
+ << " }\n";
+ break;
+ }
+ return bdy.str();
+}
+
+void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ subgroups::setFragmentShaderFrameBuffer(programCollection);
+
+ if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ subgroups::setVertexShaderFrameBuffer(programCollection);
+
+ std::string bdyStr = getBodySource(caseDef);
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream vertex;
+ vertex << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(location = 0) in highp vec4 in_position;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << bdyStr
+ << " out_color = float(tempResult);\n"
+ << " gl_Position = in_position;\n"
+ << " gl_PointSize = 1.0f;\n"
+ << "}\n";
+ programCollection.add("vert") << glu::VertexSource(vertex.str());
+ }
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream geometry;
+
+ geometry << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(points) in;\n"
+ << "layout(points, max_vertices = 1) out;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "void main (void)\n"
+ << "{\n"
+ << bdyStr
+ << " out_color = float(tempResult);\n"
+ << " gl_Position = gl_in[0].gl_Position;\n"
+ << " EmitVertex();\n"
+ << " EndPrimitive();\n"
+ << "}\n";
+
+ programCollection.add("geometry") << glu::GeometrySource(geometry.str());
+ }
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream controlSource;
+
+ controlSource << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(vertices = 2) out;\n"
+ << "layout(location = 0) out float out_color[];\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " if (gl_InvocationID == 0)\n"
+ << " {\n"
+ << " gl_TessLevelOuter[0] = 1.0f;\n"
+ << " gl_TessLevelOuter[1] = 1.0f;\n"
+ << " }\n"
+ << bdyStr
+ << " out_color[gl_InvocationID ] = float(tempResult);\n"
+ << " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ << "}\n";
+
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSource.str());
+ subgroups::setTesEvalShaderFrameBuffer(programCollection);
+ }
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream evaluationSource;
+ evaluationSource << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(isolines, equal_spacing, ccw ) in;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "void main (void)\n"
+ << "{\n"
+ << bdyStr
+ << " out_color = float(tempResult);\n"
+ << " gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
+ << "}\n";
+
+ subgroups::setTesCtrlShaderFrameBuffer(programCollection);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
+ }
+ else
+ {
+ DE_FATAL("Unsupported shader stage");
+ }
+}
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ std::string bdyStr = getBodySource(caseDef);
+
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream src;
+
+ src << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Buffer0\n"
+ << "{\n"
+ << " uint result[];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+ << " highp uint offset = globalSize.x * ((globalSize.y * "
+ "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+ "gl_GlobalInvocationID.x;\n"
+ << bdyStr
+ << " result[offset] = tempResult;\n"
+ << "}\n";
+
+ programCollection.add("comp") << glu::ComputeSource(src.str());
+ }
+ else
+ {
+ const string vertex =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(binding = 0, std430) buffer Buffer0\n"
+ "{\n"
+ " uint result[];\n"
+ "} b0;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdyStr +
+ " b0.result[gl_VertexID] = tempResult;\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " float pixelPosition = pixelSize/2.0f - 1.0f;\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_PointSize = 1.0f;\n"
+ "}\n";
+
+ const string tesc =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(vertices=1) out;\n"
+ "layout(binding = 1, std430) buffer Buffer1\n"
+ "{\n"
+ " uint result[];\n"
+ "} b1;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdyStr +
+ " b1.result[gl_PrimitiveID] = tempResult;\n"
+ " if (gl_InvocationID == 0)\n"
+ " {\n"
+ " gl_TessLevelOuter[0] = 1.0f;\n"
+ " gl_TessLevelOuter[1] = 1.0f;\n"
+ " }\n"
+ " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ "}\n";
+
+ const string tese =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(isolines) in;\n"
+ "layout(binding = 2, std430) buffer Buffer2\n"
+ "{\n"
+ " uint result[];\n"
+ "} b2;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdyStr +
+ " b2.result[gl_PrimitiveID * 2 + int(gl_TessCoord.x + 0.5)] = tempResult;\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
+ "}\n";
+
+ const string geometry =
+ // version string added by addGeometryShadersFromTemplate
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(${TOPOLOGY}) in;\n"
+ "layout(points, max_vertices = 1) out;\n"
+ "layout(binding = 3, std430) buffer Buffer3\n"
+ "{\n"
+ " uint result[];\n"
+ "} b3;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdyStr +
+ " b3.result[gl_PrimitiveIDIn] = tempResult;\n"
+ " gl_Position = gl_in[0].gl_Position;\n"
+ " EmitVertex();\n"
+ " EndPrimitive();\n"
+ "}\n";
+
+ const string fragment =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "precision highp int;\n"
+ "layout(location = 0) out uint result;\n"
+ "void main (void)\n"
+ "{\n"
+ + bdyStr +
+ " result = tempResult;\n"
+ "}\n";
+
+ subgroups::addNoSubgroupShader(programCollection);
+
+ programCollection.add("vert") << glu::VertexSource(vertex);
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese);
+ subgroups::addGeometryShadersFromTemplate(geometry, programCollection);
+ programCollection.add("fragment") << glu::FragmentSource(fragment);
+ }
+}
+
+void supportedCheck (Context& context, CaseDefinition caseDef)
+{
+ DE_UNREF(caseDef);
+ if (!subgroups::isSubgroupSupported(context))
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported");
+
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_BALLOT_BIT))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup ballot operations");
+ }
+}
+
+tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
+{
+ if (!subgroups::areSubgroupOperationsSupportedForStage(
+ context, caseDef.shaderStage))
+ {
+ if (subgroups::areSubgroupOperationsRequiredForStage(caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ else
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+ }
+ }
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ return subgroups::makeVertexFrameBufferTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ return subgroups::makeGeometryFrameBufferTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+ else if ((SHADER_STAGE_TESS_CONTROL_BIT | SHADER_STAGE_TESS_EVALUATION_BIT) & caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+ else
+ TCU_THROW(InternalError, "Unhandled shader stage");
+}
+
+tcu::TestStatus test (Context& context, const CaseDefinition caseDef)
+{
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ if (!subgroups::areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ return subgroups::makeComputeTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkComputeStage);
+ }
+ else
+ {
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
+
+ ShaderStageFlags stages = (ShaderStageFlags)(caseDef.shaderStage & supportedStages);
+
+ if ( SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ {
+ if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0)
+ TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+ else
+ stages = SHADER_STAGE_FRAGMENT_BIT;
+ }
+
+ if ((ShaderStageFlags)0u == stages)
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
+
+ return subgroups::allStages(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages, stages);
+ }
+ return tcu::TestStatus::pass("OK");
+}
+}
+
+deqp::TestCaseGroup* createSubgroupsBallotOtherTests(deqp::Context& testCtx)
+{
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
+ testCtx, "graphics", "Subgroup ballot other category tests: graphics"));
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
+ testCtx, "compute", "Subgroup ballot other category tests: compute"));
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
+ testCtx, "framebuffer", "Subgroup ballot other category tests: framebuffer"));
+
+ const ShaderStageFlags stages[] =
+ {
+ SHADER_STAGE_VERTEX_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT,
+ };
+
+ for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
+ {
+ const string op = de::toLower(getOpTypeName(opTypeIndex));
+ {
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_COMPUTE_BIT};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(), op, "", supportedCheck, initPrograms, test, caseDef);
+ }
+
+ {
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_ALL_GRAPHICS};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(), op, "", supportedCheck, initPrograms, test, caseDef);
+ }
+
+ for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+ {
+ const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex]};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(), op + "_" + getShaderStageName(caseDef.shaderStage), "", supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
+ }
+ }
+
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
+ testCtx, "ballot_other", "Subgroup ballot other category tests"));
+
+ group->addChild(graphicGroup.release());
+ group->addChild(computeGroup.release());
+ group->addChild(framebufferGroup.release());
+
+ return group.release();
+}
+
+} // subgroups
+} // glc
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsBallotOtherTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsBallotOtherTests.hpp
new file mode 100644
index 0000000..e40de7b
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsBallotOtherTests.hpp
@@ -0,0 +1,41 @@
+#ifndef _GLCSUBGROUPSBALLOTOTHERTESTS_HPP
+#define _GLCSUBGROUPSBALLOTOTHERTESTS_HPP
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "glcTestCase.hpp"
+
+namespace glc
+{
+namespace subgroups
+{
+
+deqp::TestCaseGroup* createSubgroupsBallotOtherTests(deqp::Context& testCtx);
+
+} // subgroups
+} // glc
+
+#endif // _GLCSUBGROUPSBALLOTOTHERTESTS_HPP
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsBallotTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsBallotTests.cpp
new file mode 100755
index 0000000..728910f
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsBallotTests.cpp
@@ -0,0 +1,504 @@
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "glcSubgroupsBallotTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+
+using namespace tcu;
+using namespace std;
+
+namespace glc
+{
+namespace subgroups
+{
+namespace
+{
+static bool checkVertexPipelineStages(std::vector<const void*> datas,
+ deUint32 width, deUint32)
+{
+ return glc::subgroups::check(datas, width, 0x7);
+}
+
+static bool checkComputeStage(std::vector<const void*> datas,
+ const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+ deUint32)
+{
+ return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, 0x7);
+}
+
+struct CaseDefinition
+{
+ glc::subgroups::ShaderStageFlags shaderStage;
+};
+
+void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ std::ostringstream subgroupSizeStr;
+ subgroupSizeStr << subgroups::maxSupportedSubgroupSize();
+
+ subgroups::setFragmentShaderFrameBuffer(programCollection);
+
+ if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ subgroups::setVertexShaderFrameBuffer(programCollection);
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ {
+ const string vertexGLSL =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(location = 0) in highp vec4 in_position;\n"
+ "layout(location = 0) out float out_color;\n"
+ "layout(binding = 0, std140) uniform Buffer1\n"
+ "{\n"
+ " uint data[" + subgroupSizeStr.str() + "];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " uint tempResult = 0u;\n"
+ " tempResult |= !bool(uvec4(0) == subgroupBallot(true)) ? 0x1u : 0u;\n"
+ " bool bData = data[gl_SubgroupInvocationID] != 0u;\n"
+ " tempResult |= !bool(uvec4(0) == subgroupBallot(bData)) ? 0x2u : 0u;\n"
+ " tempResult |= uvec4(0) == subgroupBallot(false) ? 0x4u : 0u;\n"
+ " out_color = float(tempResult);\n"
+ " gl_Position = in_position;\n"
+ " gl_PointSize = 1.0f;\n"
+ "}\n";
+ programCollection.add("vert") << glu::VertexSource(vertexGLSL);
+ }
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ {
+ const string geometryGLSL =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(points) in;\n"
+ "layout(points, max_vertices = 1) out;\n"
+ "layout(location = 0) out float out_color;\n"
+ "layout(binding = 0, std140) uniform Buffer1\n"
+ "{\n"
+ " uint data[" + subgroupSizeStr.str() + "];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " uint tempResult = 0u;\n"
+ " tempResult |= !bool(uvec4(0) == subgroupBallot(true)) ? 0x1u : 0u;\n"
+ " bool bData = data[gl_SubgroupInvocationID] != 0u;\n"
+ " tempResult |= !bool(uvec4(0) == subgroupBallot(bData)) ? 0x2u : 0u;\n"
+ " tempResult |= uvec4(0) == subgroupBallot(false) ? 0x4u : 0u;\n"
+ " out_color = float(tempResult);\n"
+ " gl_Position = gl_in[0].gl_Position;\n"
+ " EmitVertex();\n"
+ " EndPrimitive();\n"
+ "}\n";
+ programCollection.add("geometry") << glu::GeometrySource(geometryGLSL);
+ }
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ {
+ const string controlSourceGLSL =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(vertices = 2) out;\n"
+ "layout(location = 0) out float out_color[];\n"
+ "layout(binding = 0, std140) uniform Buffer1\n"
+ "{\n"
+ " uint data[" + subgroupSizeStr.str() + "];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " if (gl_InvocationID == 0)\n"
+ " {\n"
+ " gl_TessLevelOuter[0] = 1.0f;\n"
+ " gl_TessLevelOuter[1] = 1.0f;\n"
+ " }\n"
+ " uint tempResult = 0u;\n"
+ " tempResult |= !bool(uvec4(0) == subgroupBallot(true)) ? 0x1u : 0u;\n"
+ " bool bData = data[gl_SubgroupInvocationID] != 0u;\n"
+ " tempResult |= !bool(uvec4(0) == subgroupBallot(bData)) ? 0x2u : 0u;\n"
+ " tempResult |= uvec4(0) == subgroupBallot(false) ? 0x4u : 0u;\n"
+ " out_color[gl_InvocationID] = float(tempResult);\n"
+ " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ "}\n";
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSourceGLSL);
+ subgroups::setTesEvalShaderFrameBuffer(programCollection);
+
+ }
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ {
+ const string evaluationSourceGLSL =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(isolines, equal_spacing, ccw ) in;\n"
+ "layout(location = 0) out float out_color;\n"
+ "layout(binding = 0, std140) uniform Buffer1\n"
+ "{\n"
+ " uint data[" + subgroupSizeStr.str() + "];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " uint tempResult = 0u;\n"
+ " tempResult |= !bool(uvec4(0) == subgroupBallot(true)) ? 0x1u : 0u;\n"
+ " bool bData = data[gl_SubgroupInvocationID] != 0u;\n"
+ " tempResult |= !bool(uvec4(0) == subgroupBallot(bData)) ? 0x2u : 0u;\n"
+ " tempResult |= uvec4(0) == subgroupBallot(false) ? 0x4u : 0u;\n"
+ " out_color = float(tempResult);\n"
+ " gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
+ "}\n";
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSourceGLSL);
+
+ subgroups::setTesCtrlShaderFrameBuffer(programCollection);
+ }
+ else
+ {
+ DE_FATAL("Unsupported shader stage");
+ }
+}
+
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream src;
+
+ src << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Buffer1\n"
+ << "{\n"
+ << " uint result[];\n"
+ << "};\n"
+ << "layout(binding = 1, std430) buffer Buffer2\n"
+ << "{\n"
+ << " uint data[];\n"
+ << "};\n"
+ << "\n"
+ << subgroups::getSharedMemoryBallotHelper()
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+ << " highp uint offset = globalSize.x * ((globalSize.y * "
+ "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+ "gl_GlobalInvocationID.x;\n"
+ << " uint tempResult = 0u;\n"
+ << " tempResult |= sharedMemoryBallot(true) == subgroupBallot(true) ? 0x1u : 0u;\n"
+ << " bool bData = data[gl_SubgroupInvocationID] != 0u;\n"
+ << " tempResult |= sharedMemoryBallot(bData) == subgroupBallot(bData) ? 0x2u : 0u;\n"
+ << " tempResult |= uvec4(0) == subgroupBallot(false) ? 0x4u : 0u;\n"
+ << " result[offset] = tempResult;\n"
+ << "}\n";
+
+ programCollection.add("comp") << glu::ComputeSource(src.str());
+ }
+ else
+ {
+ const string vertex =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(binding = 0, std430) buffer Buffer0\n"
+ "{\n"
+ " uint result[];\n"
+ "} b0;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " uint data[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " uint tempResult = 0u;\n"
+ " tempResult |= !bool(uvec4(0) == subgroupBallot(true)) ? 0x1u : 0u;\n"
+ " bool bData = data[gl_SubgroupInvocationID] != 0u;\n"
+ " tempResult |= !bool(uvec4(0) == subgroupBallot(bData)) ? 0x2u : 0u;\n"
+ " tempResult |= uvec4(0) == subgroupBallot(false) ? 0x4u : 0u;\n"
+ " b0.result[gl_VertexID] = tempResult;\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " float pixelPosition = pixelSize/2.0f - 1.0f;\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_PointSize = 1.0f;\n"
+ "}\n";
+
+ const string tesc =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(vertices=1) out;\n"
+ "layout(binding = 1, std430) buffer Buffer1\n"
+ "{\n"
+ " uint result[];\n"
+ "} b1;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " uint data[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " uint tempResult = 0u;\n"
+ " tempResult |= !bool(uvec4(0) == subgroupBallot(true)) ? 0x1u : 0u;\n"
+ " bool bData = data[gl_SubgroupInvocationID] != 0u;\n"
+ " tempResult |= !bool(uvec4(0) == subgroupBallot(bData)) ? 0x2u : 0u;\n"
+ " tempResult |= uvec4(0) == subgroupBallot(false) ? 0x4u : 0u;\n"
+ " b1.result[gl_PrimitiveID] = tempResult;\n"
+ " if (gl_InvocationID == 0)\n"
+ " {\n"
+ " gl_TessLevelOuter[0] = 1.0f;\n"
+ " gl_TessLevelOuter[1] = 1.0f;\n"
+ " }\n"
+ " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ "}\n";
+
+ const string tese =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(isolines) in;\n"
+ "layout(binding = 2, std430) buffer Buffer2\n"
+ "{\n"
+ " uint result[];\n"
+ "} b2;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " uint data[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " uint tempResult = 0u;\n"
+ " tempResult |= !bool(uvec4(0) == subgroupBallot(true)) ? 0x1u : 0u;\n"
+ " bool bData = data[gl_SubgroupInvocationID] != 0u;\n"
+ " tempResult |= !bool(uvec4(0) == subgroupBallot(bData)) ? 0x2u : 0u;\n"
+ " tempResult |= uvec4(0) == subgroupBallot(false) ? 0x4u : 0u;\n"
+ " b2.result[gl_PrimitiveID * 2 + int(gl_TessCoord.x + 0.5)] = tempResult;\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
+ "}\n";
+
+ const string geometry =
+ // version string added by addGeometryShadersFromTemplate
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(${TOPOLOGY}) in;\n"
+ "layout(points, max_vertices = 1) out;\n"
+ "layout(binding = 3, std430) buffer Buffer3\n"
+ "{\n"
+ " uint result[];\n"
+ "} b3;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " uint data[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " uint tempResult = 0u;\n"
+ " tempResult |= !bool(uvec4(0) == subgroupBallot(true)) ? 0x1u : 0u;\n"
+ " bool bData = data[gl_SubgroupInvocationID] != 0u;\n"
+ " tempResult |= !bool(uvec4(0) == subgroupBallot(bData)) ? 0x2u : 0u;\n"
+ " tempResult |= uvec4(0) == subgroupBallot(false) ? 0x4u : 0u;\n"
+ " b3.result[gl_PrimitiveIDIn] = tempResult;\n"
+ " gl_Position = gl_in[0].gl_Position;\n"
+ " EmitVertex();\n"
+ " EndPrimitive();\n"
+ "}\n";
+
+ const string fragment =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "precision highp int;\n"
+ "layout(location = 0) out uint result;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " uint data[];\n"
+ "};\n"
+ "void main (void)\n"
+ "{\n"
+ " uint tempResult = 0u;\n"
+ " tempResult |= !bool(uvec4(0) == subgroupBallot(true)) ? 0x1u : 0u;\n"
+ " bool bData = data[gl_SubgroupInvocationID] != 0u;\n"
+ " tempResult |= !bool(uvec4(0) == subgroupBallot(bData)) ? 0x2u : 0u;\n"
+ " tempResult |= uvec4(0) == subgroupBallot(false) ? 0x4u : 0u;\n"
+ " result = tempResult;\n"
+ "}\n";
+
+ subgroups::addNoSubgroupShader(programCollection);
+
+ programCollection.add("vert") << glu::VertexSource(vertex);
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese);
+ subgroups::addGeometryShadersFromTemplate(geometry, programCollection);
+ programCollection.add("fragment") << glu::FragmentSource(fragment);
+ }
+}
+
+void supportedCheck (Context& context, CaseDefinition caseDef)
+{
+ DE_UNREF(caseDef);
+ if (!subgroups::isSubgroupSupported(context))
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported");
+
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_BALLOT_BIT))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup ballot operations");
+ }
+}
+
+tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
+{
+ if (!subgroups::areSubgroupOperationsSupportedForStage(
+ context, caseDef.shaderStage))
+ {
+ if (subgroups::areSubgroupOperationsRequiredForStage(caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ else
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+ }
+ }
+
+ subgroups::SSBOData inputData[1];
+ inputData[0].format = FORMAT_R32_UINT;
+ inputData[0].layout = subgroups::SSBOData::LayoutStd140;
+ inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+ inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData[0].binding = 0u;
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ return subgroups::makeVertexFrameBufferTest(context, FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ return subgroups::makeGeometryFrameBufferTest(context, FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_CONTROL_BIT);
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_EVALUATION_BIT);
+ else
+ TCU_THROW(InternalError, "Unhandled shader stage");
+}
+
+tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+{
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ if (!subgroups::areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ subgroups::SSBOData inputData[1];
+ inputData[0].format = FORMAT_R32_UINT;
+ inputData[0].layout = subgroups::SSBOData::LayoutStd430;
+ inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+ inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData[0].binding = 1u;
+
+ return subgroups::makeComputeTest(context, FORMAT_R32_UINT, inputData, 1, checkComputeStage);
+ }
+ else
+ {
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
+
+ ShaderStageFlags stages = (ShaderStageFlags)(caseDef.shaderStage & supportedStages);
+
+ if ( SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ {
+ if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0)
+ TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+ else
+ stages = SHADER_STAGE_FRAGMENT_BIT;
+ }
+
+ if ((ShaderStageFlags)0u == stages)
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
+
+ subgroups::SSBOData inputData;
+ inputData.format = FORMAT_R32_UINT;
+ inputData.layout = subgroups::SSBOData::LayoutStd430;
+ inputData.numElements = subgroups::maxSupportedSubgroupSize();
+ inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData.binding = 4u;
+ inputData.stages = stages;
+
+ return subgroups::allStages(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, stages);
+ }
+}
+}
+
+deqp::TestCaseGroup* createSubgroupsBallotTests(deqp::Context& testCtx)
+{
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
+ testCtx, "graphics", "Subgroup ballot category tests: graphics"));
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
+ testCtx, "compute", "Subgroup ballot category tests: compute"));
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
+ testCtx, "framebuffer", "Subgroup ballot category tests: framebuffer"));
+
+ const ShaderStageFlags stages[] =
+ {
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT,
+ SHADER_STAGE_VERTEX_BIT
+ };
+
+ {
+ const CaseDefinition caseDef = {SHADER_STAGE_COMPUTE_BIT};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(),
+ getShaderStageName(caseDef.shaderStage), "",
+ supportedCheck, initPrograms, test, caseDef);
+ }
+
+ {
+ const CaseDefinition caseDef = {SHADER_STAGE_ALL_GRAPHICS};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(), "graphic", "", supportedCheck, initPrograms, test, caseDef);
+ }
+
+ for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+ {
+ const CaseDefinition caseDef = {stages[stageIndex]};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(), getShaderStageName(caseDef.shaderStage), "",
+ supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
+ }
+
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
+ testCtx, "ballot", "Subgroup ballot category tests"));
+
+ group->addChild(graphicGroup.release());
+ group->addChild(computeGroup.release());
+ group->addChild(framebufferGroup.release());
+
+ return group.release();
+}
+
+} // subgroups
+} // glc
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsBallotTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsBallotTests.hpp
new file mode 100644
index 0000000..957de65
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsBallotTests.hpp
@@ -0,0 +1,41 @@
+#ifndef _GLCSUBGROUPSBALLOTTESTS_HPP
+#define _GLCSUBGROUPSBALLOTTESTS_HPP
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "glcTestCase.hpp"
+
+namespace glc
+{
+namespace subgroups
+{
+
+deqp::TestCaseGroup* createSubgroupsBallotTests(deqp::Context& testCtx);
+
+} // subgroups
+} // glc
+
+#endif // _GLCSUBGROUPSBALLOTTESTS_HPP
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsBasicTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsBasicTests.cpp
new file mode 100755
index 0000000..acdc764
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsBasicTests.cpp
@@ -0,0 +1,1556 @@
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "glcSubgroupsBasicTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+#include "tcuStringTemplate.hpp"
+
+using namespace tcu;
+using namespace std;
+
+namespace glc
+{
+namespace subgroups
+{
+
+namespace
+{
+static const deUint32 ELECTED_VALUE = 42u;
+static const deUint32 UNELECTED_VALUE = 13u;
+static const deUint64 SHADER_BUFFER_SIZE = 4096ull;
+
+static bool checkFragmentSubgroupBarriersNoSSBO(std::vector<const void*> datas,
+ deUint32 width, deUint32 height, deUint32)
+{
+ const float* const resultData = reinterpret_cast<const float*>(datas[0]);
+
+ for (deUint32 x = 0u; x < width; ++x)
+ {
+ for (deUint32 y = 0u; y < height; ++y)
+ {
+ const deUint32 ndx = (x * height + y) * 4u;
+ if (1.0f == resultData[ndx +2])
+ {
+ if(resultData[ndx] != resultData[ndx +1])
+ {
+ return false;
+ }
+ }
+ else if (resultData[ndx] != resultData[ndx +3])
+ {
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
+static bool checkVertexPipelineStagesSubgroupElectNoSSBO(std::vector<const void*> datas,
+ deUint32 width, deUint32)
+{
+ const float* const resultData = reinterpret_cast<const float*>(datas[0]);
+ float poisonValuesFound = 0.0f;
+ float numSubgroupsUsed = 0.0f;
+
+ for (deUint32 x = 0; x < width; ++x)
+ {
+ deUint32 val = static_cast<deUint32>(resultData[x * 2]);
+ numSubgroupsUsed += resultData[x * 2 + 1];
+
+ switch (val)
+ {
+ default:
+ // some garbage value was found!
+ return false;
+ case UNELECTED_VALUE:
+ break;
+ case ELECTED_VALUE:
+ poisonValuesFound += 1.0f;
+ break;
+ }
+ }
+ return numSubgroupsUsed == poisonValuesFound;
+}
+
+static bool checkVertexPipelineStagesSubgroupElect(std::vector<const void*> datas,
+ deUint32 width, deUint32)
+{
+ const deUint32* const resultData =
+ reinterpret_cast<const deUint32*>(datas[0]);
+ deUint32 poisonValuesFound = 0;
+
+ for (deUint32 x = 0; x < width; ++x)
+ {
+ deUint32 val = resultData[x];
+
+ switch (val)
+ {
+ default:
+ // some garbage value was found!
+ return false;
+ case UNELECTED_VALUE:
+ break;
+ case ELECTED_VALUE:
+ poisonValuesFound++;
+ break;
+ }
+ }
+
+ // we used an atomicly incremented counter to note how many subgroups we used for the vertex shader
+ const deUint32 numSubgroupsUsed =
+ *reinterpret_cast<const deUint32*>(datas[1]);
+
+ return numSubgroupsUsed == poisonValuesFound;
+}
+
+static bool checkVertexPipelineStagesSubgroupBarriers(std::vector<const void*> datas,
+ deUint32 width, deUint32)
+{
+ const deUint32* const resultData = reinterpret_cast<const deUint32*>(datas[0]);
+
+ // We used this SSBO to generate our unique value!
+ const deUint32 ref = *reinterpret_cast<const deUint32*>(datas[1]);
+
+ for (deUint32 x = 0; x < width; ++x)
+ {
+ deUint32 val = resultData[x];
+
+ if (val != ref)
+ return false;
+ }
+
+ return true;
+}
+
+static bool checkVertexPipelineStagesSubgroupBarriersNoSSBO(std::vector<const void*> datas,
+ deUint32 width, deUint32)
+{
+ const float* const resultData = reinterpret_cast<const float*>(datas[0]);
+
+ for (deUint32 x = 0u; x < width; ++x)
+ {
+ const deUint32 ndx = x*4u;
+ if (1.0f == resultData[ndx +2])
+ {
+ if(resultData[ndx] != resultData[ndx +1])
+ return false;
+ }
+ else if (resultData[ndx] != resultData[ndx +3])
+ {
+ return false;
+ }
+ }
+ return true;
+}
+
+static bool checkTessellationEvaluationSubgroupBarriersNoSSBO(std::vector<const void*> datas,
+ deUint32 width, deUint32)
+{
+ const float* const resultData = reinterpret_cast<const float*>(datas[0]);
+
+ for (deUint32 x = 0u; x < width; ++x)
+ {
+ const deUint32 ndx = x*4u;
+ if (0.0f == resultData[ndx +2] && resultData[ndx] != resultData[ndx +3])
+ {
+ return false;
+ }
+ }
+ return true;
+}
+
+static bool checkComputeSubgroupElect(std::vector<const void*> datas,
+ const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+ deUint32)
+{
+ return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, 1);
+}
+
+static bool checkComputeSubgroupBarriers(std::vector<const void*> datas,
+ const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+ deUint32)
+{
+ // We used this SSBO to generate our unique value!
+ const deUint32 ref = *reinterpret_cast<const deUint32*>(datas[1]);
+ return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, ref);
+}
+
+enum OpType
+{
+ OPTYPE_ELECT = 0,
+ OPTYPE_SUBGROUP_BARRIER,
+ OPTYPE_SUBGROUP_MEMORY_BARRIER,
+ OPTYPE_SUBGROUP_MEMORY_BARRIER_BUFFER,
+ OPTYPE_SUBGROUP_MEMORY_BARRIER_SHARED,
+ OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE,
+ OPTYPE_LAST
+};
+
+std::string getOpTypeName(int opType)
+{
+ switch (opType)
+ {
+ default:
+ DE_FATAL("Unsupported op type");
+ return "";
+ case OPTYPE_ELECT:
+ return "subgroupElect";
+ case OPTYPE_SUBGROUP_BARRIER:
+ return "subgroupBarrier";
+ case OPTYPE_SUBGROUP_MEMORY_BARRIER:
+ return "subgroupMemoryBarrier";
+ case OPTYPE_SUBGROUP_MEMORY_BARRIER_BUFFER:
+ return "subgroupMemoryBarrierBuffer";
+ case OPTYPE_SUBGROUP_MEMORY_BARRIER_SHARED:
+ return "subgroupMemoryBarrierShared";
+ case OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE:
+ return "subgroupMemoryBarrierImage";
+ }
+}
+
+struct CaseDefinition
+{
+ int opType;
+ subgroups::ShaderStageFlags shaderStage;
+};
+
+void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ if(subgroups::SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage)
+ {
+ const string fragmentGLSL =
+ "${VERSION_DECL}\n"
+ "layout(location = 0) in highp vec4 in_color;\n"
+ "layout(location = 0) out highp vec4 out_color;\n"
+ "void main()\n"
+ "{\n"
+ " out_color = in_color;\n"
+ "}\n";
+
+ programCollection.add("fragment") << glu::FragmentSource(fragmentGLSL);
+ }
+ if (subgroups::SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+ {
+ const string vertexGLSL =
+ "${VERSION_DECL}\n"
+ "void main (void)\n"
+ "{\n"
+ " vec2 uv = vec2((gl_VertexID << 1) & 2, gl_VertexID & 2);\n"
+ " gl_Position = vec4(uv * 2.0f + -1.0f, 0.0f, 1.0f);\n"
+ " gl_PointSize = 1.0f;\n"
+ "}\n";
+
+ programCollection.add("vert") << glu::VertexSource(vertexGLSL);
+ }
+ else if (subgroups::SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ subgroups::setVertexShaderFrameBuffer(programCollection);
+
+ if (OPTYPE_ELECT == caseDef.opType)
+ {
+ std::ostringstream electedValue ;
+ std::ostringstream unelectedValue;
+ electedValue << ELECTED_VALUE;
+ unelectedValue << UNELECTED_VALUE;
+
+ if (subgroups::SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ {
+ const string vertexGLSL =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ "layout(location = 0) out vec4 out_color;\n"
+ "layout(location = 0) in highp vec4 in_position;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " if (subgroupElect())\n"
+ " {\n"
+ " out_color.r = " + electedValue.str() + ".0f;\n"
+ " out_color.g = 1.0f;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " out_color.r = " + unelectedValue.str() + ".0f;\n"
+ " out_color.g = 0.0f;\n"
+ " }\n"
+ " gl_Position = in_position;\n"
+ " gl_PointSize = 1.0f;\n"
+ "}\n";
+
+ programCollection.add("vert") << glu::VertexSource(vertexGLSL);
+ }
+ else if (subgroups::SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ {
+ const string geometryGLSL =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ "layout(points) in;\n"
+ "layout(points, max_vertices = 1) out;\n"
+ "layout(location = 0) out vec4 out_color;\n"
+ "void main (void)\n"
+ "{\n"
+ " if (subgroupElect())\n"
+ " {\n"
+ " out_color.r = " + electedValue.str() + ".0f;\n"
+ " out_color.g = 1.0f;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " out_color.r = " + unelectedValue.str() + ".0f;\n"
+ " out_color.g = 0.0f;\n"
+ " }\n"
+ " gl_Position = gl_in[0].gl_Position;\n"
+ " EmitVertex();\n"
+ " EndPrimitive();\n"
+ "}\n";
+
+ programCollection.add("geometry") << glu::GeometrySource(geometryGLSL);
+ }
+ else if (subgroups::SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ {
+ const string controlSourceGLSL =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ "#extension GL_EXT_tessellation_shader : require\n"
+ "layout(vertices = 2) out;\n"
+ "void main (void)\n"
+ "{\n"
+ " if (gl_InvocationID == 0)\n"
+ " {\n"
+ " gl_TessLevelOuter[0] = 1.0f;\n"
+ " gl_TessLevelOuter[1] = 1.0f;\n"
+ " }\n"
+ " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ "}\n";
+
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSourceGLSL);
+
+ const string evaluationSourceGLSL =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ "#extension GL_EXT_tessellation_shader : require\n"
+ "layout(isolines, equal_spacing, ccw ) in;\n"
+ "layout(location = 0) out vec4 out_color;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " if (subgroupElect())\n"
+ " {\n"
+ " out_color.r = 71.f;\n" // << 2 * ELECTED_VALUE - UNELECTED_VALUE << ";\n"
+ " out_color.g = 2.0f;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " out_color.r = " + unelectedValue.str() + ".0f;\n"
+ " out_color.g = 0.0f;\n"
+ " }\n"
+ " gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
+ "}\n";
+
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSourceGLSL);
+ }
+ else if (subgroups::SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ {
+ const string controlSourceGLSL =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ "#extension GL_EXT_tessellation_shader : require\n"
+ "layout(vertices = 2) out;\n"
+ "layout(location = 0) out vec4 out_color[];\n"
+ "void main (void)\n"
+ "{\n"
+ " if (gl_InvocationID == 0)\n"
+ " {\n"
+ " gl_TessLevelOuter[0] = 1.0f;\n"
+ " gl_TessLevelOuter[1] = 1.0f;\n"
+ " }\n"
+ " if (subgroupElect())\n"
+ " {\n"
+ " out_color[gl_InvocationID].r = " + electedValue.str() + ".0f;\n"
+ " out_color[gl_InvocationID].g = 1.0f;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " out_color[gl_InvocationID].r = " + unelectedValue.str() + ".0f;\n"
+ " out_color[gl_InvocationID].g = 0.0f;\n"
+ " }\n"
+ " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ "}\n";
+
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSourceGLSL);
+
+ const string evaluationSourceGLSL =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "#extension GL_EXT_tessellation_shader : require\n"
+ "layout(isolines, equal_spacing, ccw ) in;\n"
+ "layout(location = 0) in vec4 in_color[];\n"
+ "layout(location = 0) out vec4 out_color;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
+ " out_color = in_color[0];\n"
+ "}\n";
+
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSourceGLSL);
+ }
+ else
+ {
+ DE_FATAL("Unsupported shader stage");
+ }
+ }
+ else
+ {
+ std::ostringstream bdy;
+ string color = (subgroups::SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage) ? "out_color[gl_InvocationID].b = 1.0f;\n" : "out_color.b = 1.0f;\n";
+ switch (caseDef.opType)
+ {
+ default:
+ DE_FATAL("Unhandled op type!");
+ break;
+ case OPTYPE_SUBGROUP_BARRIER:
+ case OPTYPE_SUBGROUP_MEMORY_BARRIER:
+ case OPTYPE_SUBGROUP_MEMORY_BARRIER_BUFFER:
+ {
+ bdy << " tempResult2 = tempBuffer[id];\n"
+ << " if (subgroupElect())\n"
+ << " {\n"
+ << " tempResult = value;\n"
+ << " " << color
+ << " }\n"
+ << " else\n"
+ << " {\n"
+ << " tempResult = tempBuffer[id];\n"
+ << " }\n"
+ << " " << getOpTypeName(caseDef.opType) << "();\n";
+ break;
+ }
+ case OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE:
+ bdy << " tempResult2 = imageLoad(tempImage, ivec2(id, 0)).x;\n"
+ << " if (subgroupElect())\n"
+ << " {\n"
+ << " tempResult = value;\n"
+ << " " << color
+ << " }\n"
+ << " else\n"
+ << " {\n"
+ << " tempResult = imageLoad(tempImage, ivec2(id, 0)).x;\n"
+ << " }\n"
+ << " subgroupMemoryBarrierImage();\n";
+
+ break;
+ }
+
+ if (subgroups::SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream fragment;
+ fragment << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "precision highp int;\n"
+ << "layout(location = 0) out highp vec4 out_color;\n"
+ << "\n"
+ << "layout(binding = 0, std140) uniform Buffer1\n"
+ << "{\n"
+ << " uint tempBuffer["<<SHADER_BUFFER_SIZE/4ull<<"];\n"
+ << "};\n"
+ << "\n"
+ << "layout(binding = 1, std140) uniform Buffer2\n"
+ << "{\n"
+ << " uint value;\n"
+ << "};\n"
+ << (OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? "layout(binding = 0, r32ui) readonly uniform highp uimage2D tempImage;\n" : "\n")
+ << "void main (void)\n"
+ << "{\n"
+ << " if (gl_HelperInvocation) return;\n"
+ << " uint id = 0u;\n"
+ << " if (subgroupElect())\n"
+ << " {\n"
+ << " id = uint(gl_FragCoord.x);\n"
+ << " }\n"
+ << " id = subgroupBroadcastFirst(id);\n"
+ << " uint localId = id;\n"
+ << " uint tempResult = 0u;\n"
+ << " uint tempResult2 = 0u;\n"
+ << " out_color.b = 0.0f;\n"
+ << bdy.str()
+ << " out_color.r = float(tempResult);\n"
+ << " out_color.g = float(value);\n"
+ << " out_color.a = float(tempResult2);\n"
+ << "}\n";
+ programCollection.add("fragment") << glu::FragmentSource(fragment.str());
+ }
+ else if (subgroups::SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream vertex;
+ vertex << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ <<"\n"
+ << "layout(location = 0) out vec4 out_color;\n"
+ << "layout(location = 0) in highp vec4 in_position;\n"
+ << "\n"
+ << "layout(binding = 0, std140) uniform Buffer1\n"
+ << "{\n"
+ << " uint tempBuffer["<<SHADER_BUFFER_SIZE/4ull<<"];\n"
+ << "};\n"
+ << "\n"
+ << "layout(binding = 1, std140) uniform Buffer2\n"
+ << "{\n"
+ << " uint value;\n"
+ << "};\n"
+ << (OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? "layout(binding = 0, r32ui) readonly uniform highp uimage2D tempImage;\n" : "\n")
+ << "void main (void)\n"
+ << "{\n"
+ << " uint id = 0u;\n"
+ << " if (subgroupElect())\n"
+ << " {\n"
+ << " id = uint(gl_VertexID);\n"
+ << " }\n"
+ << " id = subgroupBroadcastFirst(id);\n"
+ << " uint tempResult = 0u;\n"
+ << " uint tempResult2 = 0u;\n"
+ << " out_color.b = 0.0f;\n"
+ << bdy.str()
+ << " out_color.r = float(tempResult);\n"
+ << " out_color.g = float(value);\n"
+ << " out_color.a = float(tempResult2);\n"
+ << " gl_Position = in_position;\n"
+ << " gl_PointSize = 1.0f;\n"
+ << "}\n";
+ programCollection.add("vert") << glu::VertexSource(vertex.str());
+ }
+ else if (subgroups::SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream geometry;
+
+ geometry << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ << "layout(points) in;\n"
+ << "layout(points, max_vertices = 1) out;\n"
+ << "layout(location = 0) out vec4 out_color;\n"
+ << "layout(binding = 0, std140) uniform Buffer1\n"
+ << "{\n"
+ << " uint tempBuffer["<<SHADER_BUFFER_SIZE/4ull<<"];\n"
+ << "};\n"
+ << "\n"
+ << "layout(binding = 1, std140) uniform Buffer2\n"
+ << "{\n"
+ << " uint value;\n"
+ << "};\n"
+ << (OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? "layout(binding = 0, r32ui) readonly uniform highp uimage2D tempImage;\n" : "\n")
+ << "void main (void)\n"
+ << "{\n"
+ << " uint id = 0u;\n"
+ << " if (subgroupElect())\n"
+ << " {\n"
+ << " id = uint(gl_InvocationID);\n"
+ << " }\n"
+ << " id = subgroupBroadcastFirst(id);\n"
+ << " uint tempResult = 0u;\n"
+ << " uint tempResult2 = 0u;\n"
+ << " out_color.b = 0.0f;\n"
+ << bdy.str()
+ << " out_color.r = float(tempResult);\n"
+ << " out_color.g = float(value);\n"
+ << " out_color.a = float(tempResult2);\n"
+ << " gl_Position = gl_in[0].gl_Position;\n"
+ << " EmitVertex();\n"
+ << " EndPrimitive();\n"
+ << "}\n";
+
+ programCollection.add("geometry") << glu::GeometrySource(geometry.str());
+ }
+ else if (subgroups::SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream controlSource;
+ std::ostringstream evaluationSource;
+
+ controlSource << "${VERSION_DECL}\n"
+ << "#extension GL_EXT_tessellation_shader : require\n"
+ << "layout(vertices = 2) out;\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " if (gl_InvocationID == 0)\n"
+ <<" {\n"
+ << " gl_TessLevelOuter[0] = 1.0f;\n"
+ << " gl_TessLevelOuter[1] = 1.0f;\n"
+ << " }\n"
+ << " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ << "}\n";
+
+ evaluationSource << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "#extension GL_EXT_tessellation_shader : require\n"
+ << "layout(isolines, equal_spacing, ccw ) in;\n"
+ << "layout(location = 0) out vec4 out_color;\n"
+ << "layout(binding = 0, std140) uniform Buffer1\n"
+ << "{\n"
+ << " uint tempBuffer["<<SHADER_BUFFER_SIZE/4ull<<"];\n"
+ << "};\n"
+ << "\n"
+ << "layout(binding = 1, std140) uniform Buffer2\n"
+ << "{\n"
+ << " uint value;\n"
+ << "};\n"
+ << (OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? "layout(binding = 0, r32ui) readonly uniform highp uimage2D tempImage;\n" : "\n")
+ << "void main (void)\n"
+ << "{\n"
+ << " uint id = 0u;\n"
+ << " if (subgroupElect())\n"
+ << " {\n"
+ << " id = uint(gl_PrimitiveID);\n"
+ << " }\n"
+ << " id = subgroupBroadcastFirst(id);\n"
+ << " uint tempResult = 0u;\n"
+ << " uint tempResult2 = 0u;\n"
+ << " out_color.b = 0.0f;\n"
+ << bdy.str()
+ << " out_color.r = float(tempResult);\n"
+ << " out_color.g = float(value);\n"
+ << " out_color.a = float(tempResult2);\n"
+ << " gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
+ << "}\n";
+
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSource.str());
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
+ }
+ else if (subgroups::SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream controlSource;
+ std::ostringstream evaluationSource;
+
+ controlSource << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "#extension GL_EXT_tessellation_shader : require\n"
+ << "layout(vertices = 2) out;\n"
+ << "layout(location = 0) out vec4 out_color[];\n"
+ << "layout(binding = 0, std140) uniform Buffer1\n"
+ << "{\n"
+ << " uint tempBuffer["<<SHADER_BUFFER_SIZE/4ull<<"];\n"
+ << "};\n"
+ << "\n"
+ << "layout(binding = 1, std140) uniform Buffer2\n"
+ << "{\n"
+ << " uint value;\n"
+ << "};\n"
+ << (OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? "layout(binding = 0, r32ui) readonly uniform highp uimage2D tempImage;\n" : "\n")
+ << "void main (void)\n"
+ << "{\n"
+ << " uint id = 0u;\n"
+ << " if (gl_InvocationID == 0)\n"
+ <<" {\n"
+ << " gl_TessLevelOuter[0] = 1.0f;\n"
+ << " gl_TessLevelOuter[1] = 1.0f;\n"
+ << " }\n"
+ << " if (subgroupElect())\n"
+ << " {\n"
+ << " id = uint(gl_InvocationID);\n"
+ << " }\n"
+ << " id = subgroupBroadcastFirst(id);\n"
+ << " uint tempResult = 0u;\n"
+ << " uint tempResult2 = 0u;\n"
+ << " out_color[gl_InvocationID].b = 0.0f;\n"
+ << bdy.str()
+ << " out_color[gl_InvocationID].r = float(tempResult);\n"
+ << " out_color[gl_InvocationID].g = float(value);\n"
+ << " out_color[gl_InvocationID].a = float(tempResult2);\n"
+ << " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ << "}\n";
+
+ evaluationSource << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "#extension GL_EXT_tessellation_shader : require\n"
+ << "layout(isolines, equal_spacing, ccw ) in;\n"
+ << "layout(location = 0) in vec4 in_color[];\n"
+ << "layout(location = 0) out vec4 out_color;\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
+ << " out_color = in_color[0];\n"
+ << "}\n";
+
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSource.str());
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
+ }
+ else
+ {
+ DE_FATAL("Unsupported shader stage");
+ }
+ }
+}
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ if (OPTYPE_ELECT == caseDef.opType)
+ {
+ if (subgroups::SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream src;
+
+ src << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Buffer1\n"
+ << "{\n"
+ << " uint result[];\n"
+ << "};\n"
+ << "\n"
+ << subgroups::getSharedMemoryBallotHelper()
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+ << " highp uint offset = globalSize.x * ((globalSize.y * "
+ "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+ "gl_GlobalInvocationID.x;\n"
+ << " uint value = " << UNELECTED_VALUE << "u;\n"
+ << " if (subgroupElect())\n"
+ << " {\n"
+ << " value = " << ELECTED_VALUE << "u;\n"
+ << " }\n"
+ << " uvec4 bits = uvec4(bitCount(sharedMemoryBallot(value == " << ELECTED_VALUE << "u)));\n"
+ << " result[offset] = bits.x + bits.y + bits.z + bits.w;\n"
+ << "}\n";
+
+ programCollection.add("comp") << glu::ComputeSource(src.str());
+ }
+ else
+ {
+ {
+ std::ostringstream vertex;
+ vertex << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ << "layout(binding = 0, std430) buffer Buffer0\n"
+ << "{\n"
+ << " uint result[];\n"
+ << "} b0;\n"
+ << "layout(binding = 4, std430) buffer Buffer4\n"
+ << "{\n"
+ << " uint numSubgroupsExecuted;\n"
+ << "} b4;\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " if (subgroupElect())\n"
+ << " {\n"
+ << " b0.result[gl_VertexID] = " << ELECTED_VALUE << "u;\n"
+ << " atomicAdd(b4.numSubgroupsExecuted, 1u);\n"
+ << " }\n"
+ << " else\n"
+ << " {\n"
+ << " b0.result[gl_VertexID] = " << UNELECTED_VALUE << "u;\n"
+ << " }\n"
+ << " float pixelSize = 2.0f/1024.0f;\n"
+ << " float pixelPosition = pixelSize/2.0f - 1.0f;\n"
+ << " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ << " gl_PointSize = 1.0f;\n"
+ << "}\n";
+ programCollection.add("vert") << glu::VertexSource(vertex.str());
+ }
+
+ {
+ std::ostringstream tesc;
+ tesc << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ << "layout(vertices=1) out;\n"
+ << "layout(binding = 1, std430) buffer Buffer1\n"
+ << "{\n"
+ << " uint result[];\n"
+ << "} b1;\n"
+ << "layout(binding = 5, std430) buffer Buffer5\n"
+ << "{\n"
+ << " uint numSubgroupsExecuted;\n"
+ << "} b5;\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " if (subgroupElect())\n"
+ << " {\n"
+ << " b1.result[gl_PrimitiveID] = " << ELECTED_VALUE << "u;\n"
+ << " atomicAdd(b5.numSubgroupsExecuted, 1u);\n"
+ << " }\n"
+ << " else\n"
+ << " {\n"
+ << " b1.result[gl_PrimitiveID] = " << UNELECTED_VALUE << "u;\n"
+ << " }\n"
+ << " if (gl_InvocationID == 0)\n"
+ << " {\n"
+ << " gl_TessLevelOuter[0] = 1.0f;\n"
+ << " gl_TessLevelOuter[1] = 1.0f;\n"
+ << " }\n"
+ << " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ << "}\n";
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc.str());
+ }
+
+ {
+ std::ostringstream tese;
+ tese << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ << "layout(isolines) in;\n"
+ << "layout(binding = 2, std430) buffer Buffer2\n"
+ << "{\n"
+ << " uint result[];\n"
+ << "} b2;\n"
+ << "layout(binding = 6, std430) buffer Buffer6\n"
+ << "{\n"
+ << " uint numSubgroupsExecuted;\n"
+ << "} b6;\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " if (subgroupElect())\n"
+ << " {\n"
+ << " b2.result[gl_PrimitiveID * 2 + int(gl_TessCoord.x + 0.5)] = " << ELECTED_VALUE << "u;\n"
+ << " atomicAdd(b6.numSubgroupsExecuted, 1u);\n"
+ << " }\n"
+ << " else\n"
+ << " {\n"
+ << " b2.result[gl_PrimitiveID * 2 + int(gl_TessCoord.x + 0.5)] = " << UNELECTED_VALUE << "u;\n"
+ << " }\n"
+ << " float pixelSize = 2.0f/1024.0f;\n"
+ << " gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
+ << "}\n";
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese.str());
+ }
+ {
+ std::ostringstream geometry;
+ geometry << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ << "layout(${TOPOLOGY}) in;\n"
+ << "layout(points, max_vertices = 1) out;\n"
+ << "layout(binding = 3, std430) buffer Buffer3\n"
+ << "{\n"
+ << " uint result[];\n"
+ << "} b3;\n"
+ << "layout(binding = 7, std430) buffer Buffer7\n"
+ << "{\n"
+ << " uint numSubgroupsExecuted;\n"
+ << "} b7;\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " if (subgroupElect())\n"
+ << " {\n"
+ << " b3.result[gl_PrimitiveIDIn] = " << ELECTED_VALUE << "u;\n"
+ << " atomicAdd(b7.numSubgroupsExecuted, 1u);\n"
+ << " }\n"
+ << " else\n"
+ << " {\n"
+ << " b3.result[gl_PrimitiveIDIn] = " << UNELECTED_VALUE << "u;\n"
+ << " }\n"
+ << " gl_Position = gl_in[0].gl_Position;\n"
+ << " EmitVertex();\n"
+ << " EndPrimitive();\n"
+ << "}\n";
+ subgroups::addGeometryShadersFromTemplate(geometry.str(), programCollection);
+ }
+
+ {
+ std::ostringstream fragment;
+ fragment << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ << "precision highp int;\n"
+ << "layout(location = 0) out uint data;\n"
+ << "layout(binding = 8, std430) buffer Buffer8\n"
+ << "{\n"
+ << " uint numSubgroupsExecuted;\n"
+ << "} b8;\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " if (gl_HelperInvocation) return;\n"
+ << " if (subgroupElect())\n"
+ << " {\n"
+ << " data = " << ELECTED_VALUE << "u;\n"
+ << " atomicAdd(b8.numSubgroupsExecuted, 1u);\n"
+ << " }\n"
+ << " else\n"
+ << " {\n"
+ << " data = " << UNELECTED_VALUE << "u;\n"
+ << " }\n"
+ << "}\n";
+ programCollection.add("fragment") << glu::FragmentSource(fragment.str());
+ }
+ subgroups::addNoSubgroupShader(programCollection);
+ }
+ }
+ else
+ {
+ std::ostringstream bdy;
+
+ switch (caseDef.opType)
+ {
+ default:
+ DE_FATAL("Unhandled op type!");
+ break;
+ case OPTYPE_SUBGROUP_BARRIER:
+ case OPTYPE_SUBGROUP_MEMORY_BARRIER:
+ case OPTYPE_SUBGROUP_MEMORY_BARRIER_BUFFER:
+ bdy << " if (subgroupElect())\n"
+ << " {\n"
+ << " b${SSBO1}.tempBuffer[id] = b${SSBO1}.value;\n"
+ << " }\n"
+ << " " << getOpTypeName(caseDef.opType) << "();\n"
+ << " tempResult = b${SSBO1}.tempBuffer[id];\n";
+ break;
+ case OPTYPE_SUBGROUP_MEMORY_BARRIER_SHARED:
+ bdy << " if (subgroupElect())\n"
+ << " {\n"
+ << " tempShared[localId] = b${SSBO1}.value;\n"
+ << " }\n"
+ << " subgroupMemoryBarrierShared();\n"
+ << " tempResult = tempShared[localId];\n";
+ break;
+ case OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE:
+ bdy << " if (subgroupElect())\n"
+ << " {\n"
+ << " imageStore(tempImage${IMG1}, ivec2(id, 0), uvec4(b${SSBO1}.value));\n"
+ << " }\n"
+ << " subgroupMemoryBarrierImage();\n"
+ << " tempResult = imageLoad(tempImage${IMG1}, ivec2(id, 0)).x;\n";
+ break;
+ }
+
+ tcu::StringTemplate bdyTemplate(bdy.str());
+
+ if (subgroups::SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream src;
+ map<string, string> bufferNameMapping;
+ bufferNameMapping.insert(pair<string, string>("SSBO1", "1"));
+ bufferNameMapping.insert(pair<string, string>("IMG1", "0"));
+
+ src << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Buffer0\n"
+ << "{\n"
+ << " uint result[];\n"
+ << "} b0;\n"
+ << "layout(binding = 1, std430) buffer Buffer1\n"
+ << "{\n"
+ << " uint value;\n"
+ << " uint tempBuffer[];\n"
+ << "} b1;\n"
+ << (OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? "layout(binding = 0, r32ui) uniform highp uimage2D tempImage0;\n" : "\n")
+ << "shared uint tempShared[gl_WorkGroupSize.x * gl_WorkGroupSize.y * gl_WorkGroupSize.z];\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+ << " highp uint offset = globalSize.x * ((globalSize.y * "
+ "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+ "gl_GlobalInvocationID.x;\n"
+ << " uint localId = gl_SubgroupID;\n"
+ << " uint id = globalSize.x * ((globalSize.y * "
+ "gl_WorkGroupID.z) + gl_WorkGroupID.y) + "
+ "gl_WorkGroupID.x + localId;\n"
+ << " uint tempResult = 0u;\n"
+ << bdyTemplate.specialize(bufferNameMapping)
+ << " b0.result[offset] = tempResult;\n"
+ << "}\n";
+
+ programCollection.add("comp") << glu::ComputeSource(src.str());
+ }
+ else
+ {
+ {
+ map<string, string> bufferNameMapping;
+ bufferNameMapping.insert(pair<string, string>("SSBO1", "4"));
+ bufferNameMapping.insert(pair<string, string>("IMG1", "0"));
+
+ std::ostringstream vertex;
+ vertex <<
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(binding = 0, std430) buffer Buffer0\n"
+ "{\n"
+ " uint result[];\n"
+ "} b0;\n"
+ "layout(binding = 4, std430) buffer Buffer4\n"
+ "{\n"
+ " uint value;\n"
+ " uint tempBuffer[];\n"
+ "} b4;\n"
+ "layout(binding = 5, std430) buffer Buffer5\n"
+ "{\n"
+ " uint subgroupID;\n"
+ "} b5;\n"
+ << (OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? "layout(binding = 0, r32ui) uniform highp uimage2D tempImage0;\n" : "")
+ << "void main (void)\n"
+ "{\n"
+ " uint id = 0u;\n"
+ " if (subgroupElect())\n"
+ " {\n"
+ " id = atomicAdd(b5.subgroupID, 1u);\n"
+ " }\n"
+ " id = subgroupBroadcastFirst(id);\n"
+ " uint localId = id;\n"
+ " uint tempResult = 0u;\n"
+ + bdyTemplate.specialize(bufferNameMapping) +
+ " b0.result[gl_VertexID] = tempResult;\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " float pixelPosition = pixelSize/2.0f - 1.0f;\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_PointSize = 1.0f;\n"
+ "}\n";
+ programCollection.add("vert") << glu::VertexSource(vertex.str());
+ }
+
+ {
+ map<string, string> bufferNameMapping;
+ bufferNameMapping.insert(pair<string, string>("SSBO1", "6"));
+ bufferNameMapping.insert(pair<string, string>("IMG1", "1"));
+
+ std::ostringstream tesc;
+ tesc <<
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(vertices=1) out;\n"
+ "layout(binding = 1, std430) buffer Buffer1\n"
+ "{\n"
+ " uint result[];\n"
+ "} b1;\n"
+ "layout(binding = 6, std430) buffer Buffer6\n"
+ "{\n"
+ " uint value;\n"
+ " uint tempBuffer[];\n"
+ "} b6;\n"
+ "layout(binding = 7, std430) buffer Buffer7\n"
+ "{\n"
+ " uint subgroupID;\n"
+ "} b7;\n"
+ << (OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? "layout(binding = 1, r32ui) uniform highp uimage2D tempImage1;\n" : "")
+ << "void main (void)\n"
+ "{\n"
+ " uint id = 0u;\n"
+ " if (subgroupElect())\n"
+ " {\n"
+ " id = atomicAdd(b7.subgroupID, 1u);\n"
+ " }\n"
+ " id = subgroupBroadcastFirst(id);\n"
+ " uint localId = id;\n"
+ " uint tempResult = 0u;\n"
+ + bdyTemplate.specialize(bufferNameMapping) +
+ " b1.result[gl_PrimitiveID] = tempResult;\n"
+ " if (gl_InvocationID == 0)\n"
+ " {\n"
+ " gl_TessLevelOuter[0] = 1.0f;\n"
+ " gl_TessLevelOuter[1] = 1.0f;\n"
+ " }\n"
+ " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ "}\n";
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc.str());
+ }
+
+ {
+ map<string, string> bufferNameMapping;
+ bufferNameMapping.insert(pair<string, string>("SSBO1", "8"));
+ bufferNameMapping.insert(pair<string, string>("IMG1", "2"));
+
+ std::ostringstream tese;
+ tese <<
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(isolines) in;\n"
+ "layout(binding = 2, std430) buffer Buffer2\n"
+ "{\n"
+ " uint result[];\n"
+ "} b2;\n"
+ "layout(binding = 8, std430) buffer Buffer8\n"
+ "{\n"
+ " uint value;\n"
+ " uint tempBuffer[];\n"
+ "} b8;\n"
+ "layout(binding = 9, std430) buffer Buffer9\n"
+ "{\n"
+ " uint subgroupID;\n"
+ "} b9;\n"
+ << (OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? "layout(binding = 2, r32ui) uniform highp uimage2D tempImage2;\n" : "")
+ << "void main (void)\n"
+ "{\n"
+ " uint id = 0u;\n"
+ " if (subgroupElect())\n"
+ " {\n"
+ " id = atomicAdd(b9.subgroupID, 1u);\n"
+ " }\n"
+ " id = subgroupBroadcastFirst(id);\n"
+ " uint localId = id;\n"
+ " uint tempResult = 0u;\n"
+ + bdyTemplate.specialize(bufferNameMapping) +
+ " b2.result[gl_PrimitiveID * 2 + int(gl_TessCoord.x + 0.5)] = tempResult;\n"
+ " float pixelSize = 2.0f/1024.0f;\n"" gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
+ "}\n";
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese.str());
+ }
+ {
+ map<string, string> bufferNameMapping;
+ bufferNameMapping.insert(pair<string, string>("SSBO1", "10"));
+ bufferNameMapping.insert(pair<string, string>("IMG1", "3"));
+
+ std::ostringstream geometry;
+ geometry <<
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(${TOPOLOGY}) in;\n"
+ "layout(points, max_vertices = 1) out;\n"
+ "layout(binding = 3, std430) buffer Buffer3\n"
+ "{\n"
+ " uint result[];\n"
+ "} b3;\n"
+ "layout(binding = 10, std430) buffer Buffer10\n"
+ "{\n"
+ " uint value;\n"
+ " uint tempBuffer[];\n"
+ "} b10;\n"
+ "layout(binding = 11, std430) buffer Buffer11\n"
+ "{\n"
+ " uint subgroupID;\n"
+ "} b11;\n"
+ << (OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? "layout(binding = 3, r32ui) uniform highp uimage2D tempImage3;\n" : "")
+ << "void main (void)\n"
+ "{\n"
+ " uint id = 0u;\n"
+ " if (subgroupElect())\n"
+ " {\n"
+ " id = atomicAdd(b11.subgroupID, 1u);\n"
+ " }\n"
+ " id = subgroupBroadcastFirst(id);\n"
+ " uint localId = id;\n"
+ " uint tempResult = 0u;\n"
+ + bdyTemplate.specialize(bufferNameMapping) +
+ " b3.result[gl_PrimitiveIDIn] = tempResult;\n"
+ " gl_Position = gl_in[0].gl_Position;\n"
+ " EmitVertex();\n"
+ " EndPrimitive();\n"
+ "}\n";
+ subgroups::addGeometryShadersFromTemplate(geometry.str(), programCollection);
+ }
+
+ {
+ map<string, string> bufferNameMapping;
+ bufferNameMapping.insert(pair<string, string>("SSBO1", "12"));
+ bufferNameMapping.insert(pair<string, string>("IMG1", "4"));
+
+ std::ostringstream fragment;
+ fragment <<
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "precision highp int;\n"
+ "layout(location = 0) out uint result;\n"
+ "layout(binding = 12, std430) buffer Buffer12\n"
+ "{\n"
+ " uint value;\n"
+ " uint tempBuffer[];\n"
+ "} b12;\n"
+ "layout(binding = 13, std430) buffer Buffer13\n"
+ "{\n"
+ " uint subgroupID;\n"
+ "} b13;\n"
+ << (OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? "layout(binding = 4, r32ui) uniform highp uimage2D tempImage4;\n" : "")
+ << "void main (void)\n"
+ "{\n"
+ " if (gl_HelperInvocation) return;\n"
+ " uint id = 0u;\n"
+ " if (subgroupElect())\n"
+ " {\n"
+ " id = atomicAdd(b13.subgroupID, 1u);\n"
+ " }\n"
+ " id = subgroupBroadcastFirst(id);\n"
+ " uint localId = id;\n"
+ " uint tempResult = 0u;\n"
+ + bdyTemplate.specialize(bufferNameMapping) +
+ " result = tempResult;\n"
+ "}\n";
+ programCollection.add("fragment") << glu::FragmentSource(fragment.str());
+ }
+
+ subgroups::addNoSubgroupShader(programCollection);
+ }
+ }
+}
+
+void supportedCheck (Context& context, CaseDefinition caseDef)
+{
+ DE_UNREF(caseDef);
+ if (!subgroups::isSubgroupSupported(context))
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported");
+}
+
+tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
+{
+ if (!subgroups::areSubgroupOperationsSupportedForStage(
+ context, caseDef.shaderStage))
+ {
+ if (subgroups::areSubgroupOperationsRequiredForStage(
+ caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ else
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+ }
+ }
+
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, subgroups::SUBGROUP_FEATURE_BASIC_BIT))
+ {
+ return tcu::TestStatus::fail(
+ "Subgroup feature " +
+ subgroups::getSubgroupFeatureName(subgroups::SUBGROUP_FEATURE_BASIC_BIT) +
+ " is a required capability!");
+ }
+
+ if (OPTYPE_ELECT != caseDef.opType && subgroups::SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage)
+ {
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, subgroups::SUBGROUP_FEATURE_BALLOT_BIT))
+ {
+ TCU_THROW(NotSupportedError, "Subgroup basic operation non-compute stage test required that ballot operations are supported!");
+ }
+ }
+
+ if (OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType)
+ {
+ if (!subgroups::isImageSupportedForStageOnDevice(context, caseDef.shaderStage))
+ {
+ TCU_THROW(NotSupportedError, "Subgroup basic memory barrier image test for " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " stage requires that image uniforms be supported on this stage");
+ }
+ }
+
+ const deUint32 inputDatasCount = OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? 3u : 2u;
+ std::vector<subgroups::SSBOData> inputDatas (inputDatasCount);
+
+ inputDatas[0].format = subgroups::FORMAT_R32_UINT;
+ inputDatas[0].layout = subgroups::SSBOData::LayoutStd140;
+ inputDatas[0].numElements = SHADER_BUFFER_SIZE/4ull;
+ inputDatas[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputDatas[0].binding = 0u;
+
+ inputDatas[1].format = subgroups::FORMAT_R32_UINT;
+ inputDatas[1].layout = subgroups::SSBOData::LayoutStd140;
+ inputDatas[1].numElements = 1ull;
+ inputDatas[1].initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputDatas[1].binding = 1u;
+
+ if(OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType )
+ {
+ inputDatas[2].format = subgroups::FORMAT_R32_UINT;
+ inputDatas[2].layout = subgroups::SSBOData::LayoutPacked;
+ inputDatas[2].numElements = SHADER_BUFFER_SIZE;
+ inputDatas[2].initializeType = subgroups::SSBOData::InitializeNone;
+ inputDatas[2].isImage = true;
+ inputDatas[2].binding = 0u;
+ }
+
+ if (subgroups::SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ {
+ if (OPTYPE_ELECT == caseDef.opType)
+ return subgroups::makeVertexFrameBufferTest(context, subgroups::FORMAT_R32G32_SFLOAT, DE_NULL, 0u, checkVertexPipelineStagesSubgroupElectNoSSBO);
+ else
+ return subgroups::makeVertexFrameBufferTest(context, subgroups::FORMAT_R32G32B32A32_SFLOAT, &inputDatas[0], inputDatasCount, checkVertexPipelineStagesSubgroupBarriersNoSSBO);
+ }
+ else if (subgroups::SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+ {
+ return subgroups::makeFragmentFrameBufferTest(context, subgroups::FORMAT_R32G32B32A32_SFLOAT, &inputDatas[0], inputDatasCount, checkFragmentSubgroupBarriersNoSSBO);
+ }
+ else if (subgroups::SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ {
+ if (OPTYPE_ELECT == caseDef.opType)
+ return subgroups::makeGeometryFrameBufferTest(context, subgroups::FORMAT_R32G32_SFLOAT, DE_NULL, 0u, checkVertexPipelineStagesSubgroupElectNoSSBO);
+ else
+ return subgroups::makeGeometryFrameBufferTest(context, subgroups::FORMAT_R32G32B32A32_SFLOAT, &inputDatas[0], inputDatasCount, checkVertexPipelineStagesSubgroupBarriersNoSSBO);
+ }
+
+ if (OPTYPE_ELECT == caseDef.opType)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, subgroups::FORMAT_R32G32_SFLOAT, DE_NULL, 0u, checkVertexPipelineStagesSubgroupElectNoSSBO, caseDef.shaderStage);
+
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, subgroups::FORMAT_R32G32B32A32_SFLOAT, &inputDatas[0], inputDatasCount,
+ (subgroups::SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)? checkVertexPipelineStagesSubgroupBarriersNoSSBO : checkTessellationEvaluationSubgroupBarriersNoSSBO,
+ caseDef.shaderStage);
+}
+
+tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+{
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, subgroups::SUBGROUP_FEATURE_BASIC_BIT))
+ {
+ return tcu::TestStatus::fail(
+ "Subgroup feature " +
+ subgroups::getSubgroupFeatureName(subgroups::SUBGROUP_FEATURE_BASIC_BIT) +
+ " is a required capability!");
+ }
+
+ if (OPTYPE_ELECT != caseDef.opType && subgroups::SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage)
+ {
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, subgroups::SUBGROUP_FEATURE_BALLOT_BIT))
+ {
+ TCU_THROW(NotSupportedError, "Subgroup basic operation non-compute stage test required that ballot operations are supported!");
+ }
+ }
+
+ if (subgroups::SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ if (!subgroups::areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail("Shader stage " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+
+ if (OPTYPE_ELECT == caseDef.opType)
+ {
+ return subgroups::makeComputeTest(context, subgroups::FORMAT_R32_UINT, DE_NULL, 0, checkComputeSubgroupElect);
+ }
+ else
+ {
+ const deUint32 inputDatasCount = 2;
+ subgroups::SSBOData inputDatas[inputDatasCount];
+ inputDatas[0].format = subgroups::FORMAT_R32_UINT;
+ inputDatas[0].layout = subgroups::SSBOData::LayoutStd430;
+ inputDatas[0].numElements = 1 + SHADER_BUFFER_SIZE;
+ inputDatas[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputDatas[0].binding = 1u;
+
+ inputDatas[1].format = subgroups::FORMAT_R32_UINT;
+ inputDatas[1].layout = subgroups::SSBOData::LayoutPacked;
+ inputDatas[1].numElements = SHADER_BUFFER_SIZE;
+ inputDatas[1].initializeType = subgroups::SSBOData::InitializeNone;
+ inputDatas[1].isImage = true;
+ inputDatas[1].binding = 0u;
+
+ return subgroups::makeComputeTest(context, subgroups::FORMAT_R32_UINT, inputDatas, inputDatasCount, checkComputeSubgroupBarriers);
+ }
+ }
+ else
+ {
+ if (!subgroups::isFragmentSSBOSupportedForDevice(context))
+ {
+ TCU_THROW(NotSupportedError, "Subgroup basic operation require that the fragment stage be able to write to SSBOs!");
+ }
+
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
+ int combinedSSBOs = context.getDeqpContext().getContextInfo().getInt(GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS);
+
+ subgroups::ShaderStageFlags stages = (subgroups::ShaderStageFlags)(caseDef.shaderStage & supportedStages);
+
+ if ( subgroups::SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ {
+ if ( (stages & subgroups::SHADER_STAGE_FRAGMENT_BIT) == 0)
+ TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+ else
+ stages = subgroups::SHADER_STAGE_FRAGMENT_BIT;
+ }
+
+ if ((subgroups::ShaderStageFlags)0u == stages)
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
+
+ // with sufficient effort we could dynamically assign the binding points
+ // based on the number of stages actually supported, etc, but we already
+ // have the framebuffer tests which cover those cases, so there doesn't seem
+ // to be much benefit in doing that right now.
+ if (combinedSSBOs < 14)
+ TCU_THROW(NotSupportedError, "Device does not support enough combined SSBOs for this test (14)");
+
+ if (OPTYPE_ELECT == caseDef.opType)
+ {
+ const deUint32 inputCount = 5u;
+ subgroups::SSBOData inputData[inputCount];
+
+ inputData[0].format = subgroups::FORMAT_R32_UINT;
+ inputData[0].layout = subgroups::SSBOData::LayoutStd430;
+ inputData[0].numElements = 1;
+ inputData[0].initializeType = subgroups::SSBOData::InitializeZero;
+ inputData[0].binding = 4u;
+ inputData[0].stages = subgroups::SHADER_STAGE_VERTEX_BIT;
+
+ inputData[1].format = subgroups::FORMAT_R32_UINT;
+ inputData[1].layout = subgroups::SSBOData::LayoutStd430;
+ inputData[1].numElements = 1;
+ inputData[1].initializeType = subgroups::SSBOData::InitializeZero;
+ inputData[1].binding = 5u;
+ inputData[1].stages = subgroups::SHADER_STAGE_TESS_CONTROL_BIT;
+
+ inputData[2].format = subgroups::FORMAT_R32_UINT;
+ inputData[2].layout = subgroups::SSBOData::LayoutStd430;
+ inputData[2].numElements = 1;
+ inputData[2].initializeType = subgroups::SSBOData::InitializeZero;
+ inputData[2].binding = 6u;
+ inputData[2].stages = subgroups::SHADER_STAGE_TESS_EVALUATION_BIT;
+
+ inputData[3].format = subgroups::FORMAT_R32_UINT;
+ inputData[3].layout = subgroups::SSBOData::LayoutStd430;
+ inputData[3].numElements = 1;
+ inputData[3].initializeType = subgroups::SSBOData::InitializeZero;
+ inputData[3].binding = 7u;
+ inputData[3].stages = subgroups::SHADER_STAGE_GEOMETRY_BIT;
+
+ inputData[4].format = subgroups::FORMAT_R32_UINT;
+ inputData[4].layout = subgroups::SSBOData::LayoutStd430;
+ inputData[4].numElements = 1;
+ inputData[4].initializeType = subgroups::SSBOData::InitializeZero;
+ inputData[4].binding = 8u;
+ inputData[4].stages = subgroups::SHADER_STAGE_FRAGMENT_BIT;
+
+ return subgroups::allStages(context, subgroups::FORMAT_R32_UINT, inputData, inputCount, checkVertexPipelineStagesSubgroupElect, stages);
+ }
+ else
+ {
+ const subgroups::ShaderStageFlags stagesBits[] =
+ {
+ subgroups::SHADER_STAGE_VERTEX_BIT,
+ subgroups::SHADER_STAGE_TESS_CONTROL_BIT,
+ subgroups::SHADER_STAGE_TESS_EVALUATION_BIT,
+ subgroups::SHADER_STAGE_GEOMETRY_BIT,
+ subgroups::SHADER_STAGE_FRAGMENT_BIT,
+ };
+
+ const deUint32 inputDatasCount = DE_LENGTH_OF_ARRAY(stagesBits) * 3u;
+ subgroups::SSBOData inputDatas[inputDatasCount];
+
+ for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(stagesBits); ++ndx)
+ {
+ const deUint32 index = ndx*3;
+ const deUint32 ssboIndex = ndx*2;
+ const deUint32 imgIndex = ndx;
+ inputDatas[index].format = subgroups::FORMAT_R32_UINT;
+ inputDatas[index].layout = subgroups::SSBOData::LayoutStd430;
+ inputDatas[index].numElements = 1 + SHADER_BUFFER_SIZE;
+ inputDatas[index].initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputDatas[index].binding = ssboIndex + 4u;
+ inputDatas[index].stages = stagesBits[ndx];
+
+ inputDatas[index + 1].format = subgroups::FORMAT_R32_UINT;
+ inputDatas[index + 1].layout = subgroups::SSBOData::LayoutStd430;
+ inputDatas[index + 1].numElements = 1;
+ inputDatas[index + 1].initializeType = subgroups::SSBOData::InitializeZero;
+ inputDatas[index + 1].binding = ssboIndex + 5u;
+ inputDatas[index + 1].stages = stagesBits[ndx];
+
+ inputDatas[index + 2].format = subgroups::FORMAT_R32_UINT;
+ inputDatas[index + 2].layout = subgroups::SSBOData::LayoutPacked;
+ inputDatas[index + 2].numElements = SHADER_BUFFER_SIZE;
+ inputDatas[index + 2].initializeType = subgroups::SSBOData::InitializeNone;
+ inputDatas[index + 2].isImage = true;
+ inputDatas[index + 2].binding = imgIndex;
+ inputDatas[index + 2].stages = stagesBits[ndx];
+ }
+
+ return subgroups::allStages(context, subgroups::FORMAT_R32_UINT, inputDatas, inputDatasCount, checkVertexPipelineStagesSubgroupBarriers, stages);
+ }
+ }
+}
+}
+
+deqp::TestCaseGroup* createSubgroupsBasicTests(deqp::Context& testCtx)
+{
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
+ testCtx, "graphics", "Subgroup basic category tests: graphics"));
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
+ testCtx, "compute", "Subgroup basic category tests: compute"));
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
+ testCtx, "framebuffer", "Subgroup basic category tests: framebuffer"));
+
+ const subgroups::ShaderStageFlags stages[] =
+ {
+ SHADER_STAGE_FRAGMENT_BIT,
+ SHADER_STAGE_VERTEX_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT,
+ };
+
+ for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
+ {
+ const std::string op = de::toLower(getOpTypeName(opTypeIndex));
+
+ {
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_COMPUTE_BIT};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(), op, "",
+ supportedCheck, initPrograms, test, caseDef);
+ }
+
+ if (OPTYPE_SUBGROUP_MEMORY_BARRIER_SHARED == opTypeIndex)
+ {
+ // Shared isn't available in non compute shaders.
+ continue;
+ }
+
+ {
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_ALL_GRAPHICS};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(),
+ op, "",
+ supportedCheck, initPrograms, test, caseDef);
+ }
+
+ if (OPTYPE_ELECT == opTypeIndex)
+ {
+ for (int stageIndex = 1; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+ {
+ const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex]};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(),
+ op + "_" + getShaderStageName(caseDef.shaderStage), "",
+ supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
+ }
+ }
+ else
+ {
+ for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+ {
+ const CaseDefinition caseDefFrag = {opTypeIndex, stages[stageIndex]};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(),
+ op + "_" + getShaderStageName(caseDefFrag.shaderStage), "",
+ supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDefFrag);
+ }
+ }
+
+ }
+
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
+ testCtx, "basic", "Subgroup basic category tests"));
+
+ group->addChild(graphicGroup.release());
+ group->addChild(computeGroup.release());
+ group->addChild(framebufferGroup.release());
+
+ return group.release();
+}
+
+} // subgroups
+} // glc
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsBasicTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsBasicTests.hpp
new file mode 100644
index 0000000..1aac442
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsBasicTests.hpp
@@ -0,0 +1,41 @@
+#ifndef _GLCSUBGROUPSBASICTESTS_HPP
+#define _GLCSUBGROUPSBASICTESTS_HPP
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "glcTestCase.hpp"
+
+namespace glc
+{
+namespace subgroups
+{
+
+deqp::TestCaseGroup* createSubgroupsBasicTests(deqp::Context& testCtx);
+
+} // subgroups
+} // glc
+
+#endif // _GLCSUBGROUPSBASICTESTS_HPP
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinMaskVarTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinMaskVarTests.cpp
new file mode 100755
index 0000000..d4aa9e7
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinMaskVarTests.cpp
@@ -0,0 +1,511 @@
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "glcSubgroupsBuiltinMaskVarTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+
+using namespace tcu;
+using namespace std;
+
+namespace glc
+{
+namespace subgroups
+{
+
+static bool checkVertexPipelineStages(std::vector<const void*> datas,
+ deUint32 width, deUint32)
+{
+ return check(datas, width, 1);
+}
+
+static bool checkComputeStage(std::vector<const void*> datas,
+ const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+ deUint32)
+{
+ return checkCompute(datas, numWorkgroups, localSize, 1);
+}
+
+namespace
+{
+struct CaseDefinition
+{
+ std::string varName;
+ ShaderStageFlags shaderStage;
+};
+}
+
+std::string subgroupMask (const CaseDefinition& caseDef)
+{
+ std::ostringstream bdy;
+
+ bdy << " uint tempResult = 0x1u;\n"
+ << " uint bit = 0x1u;\n"
+ << " uint bitCount = 0x0u;\n"
+ << " uvec4 mask = subgroupBallot(true);\n"
+ << " uvec4 var = " << caseDef.varName << ";\n"
+ << " for (uint i = 0u; i < gl_SubgroupSize; i++)\n"
+ << " {\n";
+
+ if ("gl_SubgroupEqMask" == caseDef.varName)
+ {
+ bdy << " if ((i == gl_SubgroupInvocationID) ^^ subgroupBallotBitExtract(var, i))\n"
+ << " {\n"
+ << " tempResult = 0u;\n"
+ << " }\n";
+ }
+ else if ("gl_SubgroupGeMask" == caseDef.varName)
+ {
+ bdy << " if ((i >= gl_SubgroupInvocationID) ^^ subgroupBallotBitExtract(var, i))\n"
+ << " {\n"
+ << " tempResult = 0u;\n"
+ << " }\n";
+ }
+ else if ("gl_SubgroupGtMask" == caseDef.varName)
+ {
+ bdy << " if ((i > gl_SubgroupInvocationID) ^^ subgroupBallotBitExtract(var, i))\n"
+ << " {\n"
+ << " tempResult = 0u;\n"
+ << " }\n";
+ }
+ else if ("gl_SubgroupLeMask" == caseDef.varName)
+ {
+ bdy << " if ((i <= gl_SubgroupInvocationID) ^^ subgroupBallotBitExtract(var, i))\n"
+ << " {\n"
+ << " tempResult = 0u;\n"
+ << " }\n";
+ }
+ else if ("gl_SubgroupLtMask" == caseDef.varName)
+ {
+ bdy << " if ((i < gl_SubgroupInvocationID) ^^ subgroupBallotBitExtract(var, i))\n"
+ << " {\n"
+ << " tempResult = 0u;\n"
+ << " }\n";
+ }
+
+ bdy << " }\n"
+ << " for (uint i = 0u; i < 32u; i++)\n"
+ << " {\n"
+ << " if ((var.x & bit) > 0u)\n"
+ << " {\n"
+ << " bitCount++;\n"
+ << " }\n"
+ << " if ((var.y & bit) > 0u)\n"
+ << " {\n"
+ << " bitCount++;\n"
+ << " }\n"
+ << " if ((var.z & bit) > 0u)\n"
+ << " {\n"
+ << " bitCount++;\n"
+ << " }\n"
+ << " if ((var.w & bit) > 0u)\n"
+ << " {\n"
+ << " bitCount++;\n"
+ << " }\n"
+ << " bit = bit << 1u;\n"
+ << " }\n"
+ << " if (subgroupBallotBitCount(var) != bitCount)\n"
+ << " {\n"
+ << " tempResult = 0u;\n"
+ << " }\n";
+ return bdy.str();
+}
+
+void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ subgroups::setFragmentShaderFrameBuffer(programCollection);
+
+ if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ subgroups::setVertexShaderFrameBuffer(programCollection);
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ {
+ const string bdy = subgroupMask(caseDef);
+ const string vertexGLSL =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(location = 0) out float out_color;\n"
+ "layout(location = 0) in highp vec4 in_position;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdy +
+ " out_color = float(tempResult);\n"
+ " gl_Position = in_position;\n"
+ " gl_PointSize = 1.0f;\n"
+ "}\n";
+ programCollection.add("vert") << glu::VertexSource(vertexGLSL);
+ }
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ {
+ const string bdy = subgroupMask(caseDef);
+ const string evaluationSourceGLSL =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "#extension GL_EXT_tessellation_shader : require\n"
+ "layout(isolines, equal_spacing, ccw ) in;\n"
+ "layout(location = 0) out float out_color;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdy +
+ " out_color = float(tempResult);\n"
+ " gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
+ "}\n";
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSourceGLSL);
+ subgroups::setTesCtrlShaderFrameBuffer(programCollection);
+ }
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ {
+ const string bdy = subgroupMask(caseDef);
+ const string controlSourceGLSL =
+ "${VERSION_DECL}\n"
+ "#extension GL_EXT_tessellation_shader : require\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(vertices = 2) out;\n"
+ "layout(location = 0) out float out_color[];\n"
+ "void main (void)\n"
+ "{\n"
+ " if (gl_InvocationID == 0)\n"
+ " {\n"
+ " gl_TessLevelOuter[0] = 1.0f;\n"
+ " gl_TessLevelOuter[1] = 1.0f;\n"
+ " }\n"
+ + bdy +
+ " out_color[gl_InvocationID] = float(tempResult);\n"
+ " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ "}\n";
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSourceGLSL);
+ subgroups::setTesEvalShaderFrameBuffer(programCollection);
+ }
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ {
+ const string bdy = subgroupMask(caseDef);
+ const string geometryGLSL =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(points) in;\n"
+ "layout(points, max_vertices = 1) out;\n"
+ "layout(location = 0) out float out_color;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdy +
+ " out_color = float(tempResult);\n"
+ " gl_Position = gl_in[0].gl_Position;\n"
+ " EmitVertex();\n"
+ " EndPrimitive();\n"
+ "}\n";
+ programCollection.add("geometry") << glu::GeometrySource(geometryGLSL);
+ }
+ else
+ {
+ DE_FATAL("Unsupported shader stage");
+ }
+}
+
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ const string bdy = subgroupMask(caseDef);
+
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream src;
+
+ src << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Output\n"
+ << "{\n"
+ << " uint result[];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+ << " highp uint offset = globalSize.x * ((globalSize.y * "
+ "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+ "gl_GlobalInvocationID.x;\n"
+ << bdy
+ << " result[offset] = tempResult;\n"
+ << "}\n";
+
+ programCollection.add("comp") << glu::ComputeSource(src.str());
+ }
+ else
+ {
+ {
+ const string vertex =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(binding = 0, std430) buffer Output0\n"
+ "{\n"
+ " uint result[];\n"
+ "} b0;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdy +
+ " b0.result[gl_VertexID] = tempResult;\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " float pixelPosition = pixelSize/2.0f - 1.0f;\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_PointSize = 1.0f;\n"
+ "}\n";
+ programCollection.add("vert") << glu::VertexSource(vertex);
+ }
+
+ {
+ const string tesc =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(vertices=1) out;\n"
+ "layout(binding = 1, std430) buffer Output1\n"
+ "{\n"
+ " uint result[];\n"
+ "} b1;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdy +
+ " b1.result[gl_PrimitiveID] = tempResult;\n"
+ " if (gl_InvocationID == 0)\n"
+ " {\n"
+ " gl_TessLevelOuter[0] = 1.0f;\n"
+ " gl_TessLevelOuter[1] = 1.0f;\n"
+ " }\n"
+ " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ "}\n";
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc);
+ }
+
+ {
+ const string tese =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(isolines) in;\n"
+ "layout(binding = 2, std430) buffer Output2\n"
+ "{\n"
+ " uint result[];\n"
+ "} b2;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdy +
+ " b2.result[gl_PrimitiveID * 2 + int(gl_TessCoord.x + 0.5)] = tempResult;\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
+ "}\n";
+
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese);
+ }
+
+ {
+ const string geometry =
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(${TOPOLOGY}) in;\n"
+ "layout(points, max_vertices = 1) out;\n"
+ "layout(binding = 3, std430) buffer Output3\n"
+ "{\n"
+ " uint result[];\n"
+ "} b3;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdy +
+ " b3.result[gl_PrimitiveIDIn] = tempResult;\n"
+ " gl_Position = gl_in[0].gl_Position;\n"
+ " EmitVertex();\n"
+ " EndPrimitive();\n"
+ "}\n";
+
+ subgroups::addGeometryShadersFromTemplate(geometry, programCollection);
+ }
+
+ {
+ const string fragment =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "precision highp int;\n"
+ "layout(location = 0) out uint result;\n"
+ "void main (void)\n"
+ "{\n"
+ + bdy +
+ " result = tempResult;\n"
+ "}\n";
+
+ programCollection.add("fragment") << glu::FragmentSource(fragment);
+ }
+
+ subgroups::addNoSubgroupShader(programCollection);
+ }
+}
+
+void supportedCheck (Context& context, CaseDefinition caseDef)
+{
+ DE_UNREF(caseDef);
+ if (!subgroups::isSubgroupSupported(context))
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported");
+}
+
+tcu::TestStatus noSSBOtest(Context& context, const CaseDefinition caseDef)
+{
+ if (!areSubgroupOperationsSupportedForStage(
+ context, caseDef.shaderStage))
+ {
+ if (areSubgroupOperationsRequiredForStage(caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " + getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ else
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+ }
+ }
+
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_BALLOT_BIT))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup ballot operations");
+ }
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ return makeVertexFrameBufferTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+ else if ((SHADER_STAGE_TESS_EVALUATION_BIT | SHADER_STAGE_TESS_CONTROL_BIT) & caseDef.shaderStage )
+ return makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+
+ return makeGeometryFrameBufferTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+}
+
+
+tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+{
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_BALLOT_BIT))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup ballot operations");
+ }
+
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ if (!areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " + getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ return makeComputeTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkComputeStage);
+ }
+ else
+ {
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
+
+ subgroups::ShaderStageFlags stages = (subgroups::ShaderStageFlags)(caseDef.shaderStage & supportedStages);
+
+ if ( SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ {
+ if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0)
+ TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+ else
+ stages = SHADER_STAGE_FRAGMENT_BIT;
+ }
+
+ if ((ShaderStageFlags)0u == stages)
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
+
+ return subgroups::allStages(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages, stages);
+ }
+}
+
+deqp::TestCaseGroup* createSubgroupsBuiltinMaskVarTests(deqp::Context& testCtx)
+{
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
+ testCtx, "graphics", "Subgroup builtin mask category tests: graphics"));
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
+ testCtx, "compute", "Subgroup builtin mask category tests: compute"));
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
+ testCtx, "framebuffer", "Subgroup builtin mask category tests: framebuffer"));
+
+ const char* const all_stages_vars[] =
+ {
+ "SubgroupEqMask",
+ "SubgroupGeMask",
+ "SubgroupGtMask",
+ "SubgroupLeMask",
+ "SubgroupLtMask",
+ };
+
+ const subgroups::ShaderStageFlags stages[] =
+ {
+ SHADER_STAGE_VERTEX_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT,
+ };
+
+
+ for (int a = 0; a < DE_LENGTH_OF_ARRAY(all_stages_vars); ++a)
+ {
+ const std::string var = all_stages_vars[a];
+ const std::string varLower = de::toLower(var);
+
+ {
+ const CaseDefinition caseDef = {"gl_" + var, SHADER_STAGE_ALL_GRAPHICS};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(),
+ varLower, "",
+ supportedCheck, initPrograms, test, caseDef);
+ }
+
+ {
+ const CaseDefinition caseDef = {"gl_" + var, SHADER_STAGE_COMPUTE_BIT};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(),
+ varLower, "",
+ supportedCheck, initPrograms, test, caseDef);
+ }
+
+ for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+ {
+ const CaseDefinition caseDef = {"gl_" + var, stages[stageIndex]};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(),
+ varLower + "_" +
+ getShaderStageName(caseDef.shaderStage), "",
+ supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
+ }
+ }
+
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
+ testCtx, "builtin_mask_var", "Subgroup builtin mask variable tests"));
+
+ group->addChild(graphicGroup.release());
+ group->addChild(computeGroup.release());
+ group->addChild(framebufferGroup.release());
+
+ return group.release();
+}
+} // subgroups
+} // glc
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinMaskVarTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinMaskVarTests.hpp
new file mode 100644
index 0000000..cc14961
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinMaskVarTests.hpp
@@ -0,0 +1,41 @@
+#ifndef _GLCSUBGROUPSBUILTINMASKVARTESTS_HPP
+#define _GLCSUBGROUPSBUILTINMASKVARTESTS_HPP
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "glcTestCase.hpp"
+
+namespace glc
+{
+namespace subgroups
+{
+
+deqp::TestCaseGroup* createSubgroupsBuiltinMaskVarTests(deqp::Context& testCtx);
+
+} // subgroups
+} // glc
+
+#endif // _GLCSUBGROUPSBUILTINMASKVARTESTS_HPP
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinVarTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinVarTests.cpp
new file mode 100755
index 0000000..65541ba
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinVarTests.cpp
@@ -0,0 +1,810 @@
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "glcSubgroupsBuiltinVarTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+
+using namespace tcu;
+using namespace std;
+
+namespace glc
+{
+namespace subgroups
+{
+
+bool checkVertexPipelineStagesSubgroupSize(std::vector<const void*> datas,
+ deUint32 width, deUint32 subgroupSize)
+{
+ const deUint32* data =
+ reinterpret_cast<const deUint32*>(datas[0]);
+ for (deUint32 x = 0; x < width; ++x)
+ {
+ deUint32 val = data[x * 4];
+
+ if (subgroupSize != val)
+ return false;
+ }
+
+ return true;
+}
+
+bool checkVertexPipelineStagesSubgroupInvocationID(std::vector<const void*> datas,
+ deUint32 width, deUint32 subgroupSize)
+{
+ const deUint32* data =
+ reinterpret_cast<const deUint32*>(datas[0]);
+ vector<deUint32> subgroupInvocationHits(subgroupSize, 0);
+
+ for (deUint32 x = 0; x < width; ++x)
+ {
+ deUint32 subgroupInvocationID = data[(x * 4) + 1];
+
+ if (subgroupInvocationID >= subgroupSize)
+ return false;
+ subgroupInvocationHits[subgroupInvocationID]++;
+ }
+
+ const deUint32 totalSize = width;
+
+ deUint32 totalInvocationsRun = 0;
+ for (deUint32 i = 0; i < subgroupSize; ++i)
+ {
+ totalInvocationsRun += subgroupInvocationHits[i];
+ }
+
+ if (totalInvocationsRun != totalSize)
+ return false;
+
+ return true;
+}
+
+static bool checkComputeSubgroupSize(std::vector<const void*> datas,
+ const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+ deUint32 subgroupSize)
+{
+ const deUint32* data = reinterpret_cast<const deUint32*>(datas[0]);
+
+ for (deUint32 nX = 0; nX < numWorkgroups[0]; ++nX)
+ {
+ for (deUint32 nY = 0; nY < numWorkgroups[1]; ++nY)
+ {
+ for (deUint32 nZ = 0; nZ < numWorkgroups[2]; ++nZ)
+ {
+ for (deUint32 lX = 0; lX < localSize[0]; ++lX)
+ {
+ for (deUint32 lY = 0; lY < localSize[1]; ++lY)
+ {
+ for (deUint32 lZ = 0; lZ < localSize[2];
+ ++lZ)
+ {
+ const deUint32 globalInvocationX =
+ nX * localSize[0] + lX;
+ const deUint32 globalInvocationY =
+ nY * localSize[1] + lY;
+ const deUint32 globalInvocationZ =
+ nZ * localSize[2] + lZ;
+
+ const deUint32 globalSizeX =
+ numWorkgroups[0] * localSize[0];
+ const deUint32 globalSizeY =
+ numWorkgroups[1] * localSize[1];
+
+ const deUint32 offset =
+ globalSizeX *
+ ((globalSizeY *
+ globalInvocationZ) +
+ globalInvocationY) +
+ globalInvocationX;
+
+ if (subgroupSize != data[offset * 4])
+ return false;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return true;
+}
+
+static bool checkComputeSubgroupInvocationID(std::vector<const void*> datas,
+ const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+ deUint32 subgroupSize)
+{
+ const deUint32* data = reinterpret_cast<const deUint32*>(datas[0]);
+
+ for (deUint32 nX = 0; nX < numWorkgroups[0]; ++nX)
+ {
+ for (deUint32 nY = 0; nY < numWorkgroups[1]; ++nY)
+ {
+ for (deUint32 nZ = 0; nZ < numWorkgroups[2]; ++nZ)
+ {
+ const deUint32 totalLocalSize =
+ localSize[0] * localSize[1] * localSize[2];
+ vector<deUint32> subgroupInvocationHits(subgroupSize, 0);
+
+ for (deUint32 lX = 0; lX < localSize[0]; ++lX)
+ {
+ for (deUint32 lY = 0; lY < localSize[1]; ++lY)
+ {
+ for (deUint32 lZ = 0; lZ < localSize[2];
+ ++lZ)
+ {
+ const deUint32 globalInvocationX =
+ nX * localSize[0] + lX;
+ const deUint32 globalInvocationY =
+ nY * localSize[1] + lY;
+ const deUint32 globalInvocationZ =
+ nZ * localSize[2] + lZ;
+
+ const deUint32 globalSizeX =
+ numWorkgroups[0] * localSize[0];
+ const deUint32 globalSizeY =
+ numWorkgroups[1] * localSize[1];
+
+ const deUint32 offset =
+ globalSizeX *
+ ((globalSizeY *
+ globalInvocationZ) +
+ globalInvocationY) +
+ globalInvocationX;
+
+ deUint32 subgroupInvocationID = data[(offset * 4) + 1];
+
+ if (subgroupInvocationID >= subgroupSize)
+ return false;
+
+ subgroupInvocationHits[subgroupInvocationID]++;
+ }
+ }
+ }
+
+ deUint32 totalInvocationsRun = 0;
+ for (deUint32 i = 0; i < subgroupSize; ++i)
+ {
+ totalInvocationsRun += subgroupInvocationHits[i];
+ }
+
+ if (totalInvocationsRun != totalLocalSize)
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
+static bool checkComputeNumSubgroups (std::vector<const void*> datas,
+ const deUint32 numWorkgroups[3],
+ const deUint32 localSize[3],
+ deUint32)
+{
+ const deUint32* data = reinterpret_cast<const deUint32*>(datas[0]);
+
+ for (deUint32 nX = 0; nX < numWorkgroups[0]; ++nX)
+ {
+ for (deUint32 nY = 0; nY < numWorkgroups[1]; ++nY)
+ {
+ for (deUint32 nZ = 0; nZ < numWorkgroups[2]; ++nZ)
+ {
+ const deUint32 totalLocalSize =
+ localSize[0] * localSize[1] * localSize[2];
+
+ for (deUint32 lX = 0; lX < localSize[0]; ++lX)
+ {
+ for (deUint32 lY = 0; lY < localSize[1]; ++lY)
+ {
+ for (deUint32 lZ = 0; lZ < localSize[2];
+ ++lZ)
+ {
+ const deUint32 globalInvocationX =
+ nX * localSize[0] + lX;
+ const deUint32 globalInvocationY =
+ nY * localSize[1] + lY;
+ const deUint32 globalInvocationZ =
+ nZ * localSize[2] + lZ;
+
+ const deUint32 globalSizeX =
+ numWorkgroups[0] * localSize[0];
+ const deUint32 globalSizeY =
+ numWorkgroups[1] * localSize[1];
+
+ const deUint32 offset =
+ globalSizeX *
+ ((globalSizeY *
+ globalInvocationZ) +
+ globalInvocationY) +
+ globalInvocationX;
+
+ deUint32 numSubgroups = data[(offset * 4) + 2];
+
+ if (numSubgroups > totalLocalSize)
+ return false;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return true;
+}
+
+static bool checkComputeSubgroupID (std::vector<const void*> datas,
+ const deUint32 numWorkgroups[3],
+ const deUint32 localSize[3],
+ deUint32)
+{
+ const deUint32* data = reinterpret_cast<const deUint32*>(datas[0]);
+
+ for (deUint32 nX = 0; nX < numWorkgroups[0]; ++nX)
+ {
+ for (deUint32 nY = 0; nY < numWorkgroups[1]; ++nY)
+ {
+ for (deUint32 nZ = 0; nZ < numWorkgroups[2]; ++nZ)
+ {
+ for (deUint32 lX = 0; lX < localSize[0]; ++lX)
+ {
+ for (deUint32 lY = 0; lY < localSize[1]; ++lY)
+ {
+ for (deUint32 lZ = 0; lZ < localSize[2];
+ ++lZ)
+ {
+ const deUint32 globalInvocationX =
+ nX * localSize[0] + lX;
+ const deUint32 globalInvocationY =
+ nY * localSize[1] + lY;
+ const deUint32 globalInvocationZ =
+ nZ * localSize[2] + lZ;
+
+ const deUint32 globalSizeX =
+ numWorkgroups[0] * localSize[0];
+ const deUint32 globalSizeY =
+ numWorkgroups[1] * localSize[1];
+
+ const deUint32 offset =
+ globalSizeX *
+ ((globalSizeY *
+ globalInvocationZ) +
+ globalInvocationY) +
+ globalInvocationX;
+
+ deUint32 numSubgroups = data[(offset * 4) + 2];
+ deUint32 subgroupID = data[(offset * 4) + 3];
+
+ if (subgroupID >= numSubgroups)
+ return false;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return true;
+}
+
+namespace
+{
+struct CaseDefinition
+{
+ std::string varName;
+ ShaderStageFlags shaderStage;
+};
+}
+
+void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ {
+ const string fragmentGLSL =
+ "${VERSION_DECL}\n"
+ "precision highp int;\n"
+ "layout(location = 0) in highp vec4 in_color;\n"
+ "layout(location = 0) out uvec4 out_color;\n"
+ "void main()\n"
+ "{\n"
+ " out_color = uvec4(in_color);\n"
+ "}\n";
+ programCollection.add("fragment") << glu::FragmentSource(fragmentGLSL);
+ }
+
+ if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ subgroups::setVertexShaderFrameBuffer(programCollection);
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ {
+ const string vertexGLSL =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ "layout(location = 0) out vec4 out_color;\n"
+ "layout(location = 0) in highp vec4 in_position;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " out_color = vec4(gl_SubgroupSize, gl_SubgroupInvocationID, 1.0f, 1.0f);\n"
+ " gl_Position = in_position;\n"
+ " gl_PointSize = 1.0f;\n"
+ "}\n";
+ programCollection.add("vert") << glu::VertexSource(vertexGLSL);
+ }
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ {
+ const string controlSourceGLSL =
+ "${VERSION_DECL}\n"
+ "#extension GL_EXT_tessellation_shader : require\n"
+ "layout(vertices = 2) out;\n"
+ "layout(location = 0) out vec4 out_color[];\n"
+ "void main (void)\n"
+ "{\n"
+ " if (gl_InvocationID == 0)\n"
+ " {\n"
+ " gl_TessLevelOuter[0] = 1.0f;\n"
+ " gl_TessLevelOuter[1] = 1.0f;\n"
+ " }\n"
+ " out_color[gl_InvocationID] = vec4(0.0f);\n"
+ " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ "}\n";
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSourceGLSL);
+
+ const string evaluationSourceGLSL =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ "#extension GL_EXT_tessellation_shader : require\n"
+ "layout(isolines, equal_spacing, ccw ) in;\n"
+ "layout(location = 0) in vec4 in_color[];\n"
+ "layout(location = 0) out vec4 out_color;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
+ " out_color = vec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0.0f, 0.0f);\n"
+ "}\n";
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSourceGLSL);
+ }
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ {
+ const string controlSourceGLSL =
+ "${VERSION_DECL}\n"
+ "#extension GL_EXT_tessellation_shader : require\n"
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ "layout(vertices = 2) out;\n"
+ "layout(location = 0) out vec4 out_color[];\n"
+ "void main (void)\n"
+ "{\n"
+ " if (gl_InvocationID == 0)\n"
+ " {\n"
+ " gl_TessLevelOuter[0] = 1.0f;\n"
+ " gl_TessLevelOuter[1] = 1.0f;\n"
+ " }\n"
+ " out_color[gl_InvocationID] = vec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);\n"
+ " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ "}\n";
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSourceGLSL);
+
+ const string evaluationSourceGLSL =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ "#extension GL_EXT_tessellation_shader : require\n"
+ "layout(isolines, equal_spacing, ccw ) in;\n"
+ "layout(location = 0) in vec4 in_color[];\n"
+ "layout(location = 0) out vec4 out_color;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
+ " out_color = in_color[0];\n"
+ "}\n";
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSourceGLSL);
+ }
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ {
+ const string geometryGLSL =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ "layout(points) in;\n"
+ "layout(points, max_vertices = 1) out;\n"
+ "layout(location = 0) out vec4 out_color;\n"
+ "void main (void)\n"
+ "{\n"
+ " out_color = vec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);\n"
+ " gl_Position = gl_in[0].gl_Position;\n"
+ " EmitVertex();\n"
+ " EndPrimitive();\n"
+ "}\n";
+ programCollection.add("geometry") << glu::GeometrySource(geometryGLSL);
+ }
+ else
+ {
+ DE_FATAL("Unsupported shader stage");
+ }
+}
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream src;
+
+ src << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Output\n"
+ << "{\n"
+ << " uvec4 result[];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+ << " highp uint offset = globalSize.x * ((globalSize.y * "
+ "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+ "gl_GlobalInvocationID.x;\n"
+ << " result[offset] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, gl_NumSubgroups, gl_SubgroupID);\n"
+ << "}\n";
+
+ programCollection.add("comp") << glu::ComputeSource(src.str());
+ }
+ else
+ {
+ {
+ const string vertexGLSL =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ "layout(binding = 0, std430) buffer Output0\n"
+ "{\n"
+ " uvec4 result[];\n"
+ "} b0;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " b0.result[gl_VertexID] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " float pixelPosition = pixelSize/2.0f - 1.0f;\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_PointSize = 1.0f;\n"
+ "}\n";
+ programCollection.add("vert") << glu::VertexSource(vertexGLSL);
+ }
+
+ {
+ const string tescGLSL =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ "layout(vertices=1) out;\n"
+ "layout(binding = 1, std430) buffer Output1\n"
+ "{\n"
+ " uvec4 result[];\n"
+ "} b1;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " b1.result[gl_PrimitiveID] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);\n"
+ " if (gl_InvocationID == 0)\n"
+ " {\n"
+ " gl_TessLevelOuter[0] = 1.0f;\n"
+ " gl_TessLevelOuter[1] = 1.0f;\n"
+ " }\n"
+ " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ "}\n";
+ programCollection.add("tesc") << glu::TessellationControlSource(tescGLSL);
+ }
+
+ {
+ const string teseGLSL =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ "layout(isolines) in;\n"
+ "layout(binding = 2, std430) buffer Output2\n"
+ "{\n"
+ " uvec4 result[];\n"
+ "} b2;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " b2.result[gl_PrimitiveID * 2 + int(gl_TessCoord.x + 0.5)] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
+ "}\n";
+ programCollection.add("tese") << glu::TessellationEvaluationSource(teseGLSL);
+ }
+
+ {
+ const string geometryGLSL =
+ // version string is added by addGeometryShadersFromTemplate
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ "layout(${TOPOLOGY}) in;\n"
+ "layout(points, max_vertices = 1) out;\n"
+ "layout(binding = 3, std430) buffer Output3\n"
+ "{\n"
+ " uvec4 result[];\n"
+ "} b3;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " b3.result[gl_PrimitiveIDIn] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);\n"
+ " gl_Position = gl_in[0].gl_Position;\n"
+ " EmitVertex();\n"
+ " EndPrimitive();\n"
+ "}\n";
+ addGeometryShadersFromTemplate(geometryGLSL, programCollection);
+ }
+
+ {
+ const string fragmentGLSL =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ "precision highp int;\n"
+ "layout(location = 0) out uvec4 data;\n"
+ "void main (void)\n"
+ "{\n"
+ " data = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);\n"
+ "}\n";
+ programCollection.add("fragment") << glu::FragmentSource(fragmentGLSL);
+ }
+
+ subgroups::addNoSubgroupShader(programCollection);
+ }
+}
+
+void supportedCheck (Context& context, CaseDefinition caseDef)
+{
+ DE_UNREF(caseDef);
+ if (!subgroups::isSubgroupSupported(context))
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported");
+}
+
+tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
+{
+ if (!areSubgroupOperationsSupportedForStage(
+ context, caseDef.shaderStage))
+ {
+ if (areSubgroupOperationsRequiredForStage(caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " + getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ else
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+ }
+ }
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ {
+ if ("gl_SubgroupSize" == caseDef.varName)
+ {
+ return makeVertexFrameBufferTest(
+ context, FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupSize);
+ }
+ else if ("gl_SubgroupInvocationID" == caseDef.varName)
+ {
+ return makeVertexFrameBufferTest(
+ context, FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupInvocationID);
+ }
+ else
+ {
+ return tcu::TestStatus::fail(
+ caseDef.varName + " failed (unhandled error checking case " +
+ caseDef.varName + ")!");
+ }
+ }
+ else if ((SHADER_STAGE_TESS_EVALUATION_BIT | SHADER_STAGE_TESS_CONTROL_BIT) & caseDef.shaderStage )
+ {
+ if ("gl_SubgroupSize" == caseDef.varName)
+ {
+ return makeTessellationEvaluationFrameBufferTest(
+ context, FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupSize);
+ }
+ else if ("gl_SubgroupInvocationID" == caseDef.varName)
+ {
+ return makeTessellationEvaluationFrameBufferTest(
+ context, FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupInvocationID);
+ }
+ else
+ {
+ return tcu::TestStatus::fail(
+ caseDef.varName + " failed (unhandled error checking case " +
+ caseDef.varName + ")!");
+ }
+ }
+ else if (SHADER_STAGE_GEOMETRY_BIT & caseDef.shaderStage )
+ {
+ if ("gl_SubgroupSize" == caseDef.varName)
+ {
+ return makeGeometryFrameBufferTest(
+ context, FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupSize);
+ }
+ else if ("gl_SubgroupInvocationID" == caseDef.varName)
+ {
+ return makeGeometryFrameBufferTest(
+ context, FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupInvocationID);
+ }
+ else
+ {
+ return tcu::TestStatus::fail(
+ caseDef.varName + " failed (unhandled error checking case " +
+ caseDef.varName + ")!");
+ }
+ }
+ else
+ {
+ TCU_THROW(InternalError, "Unhandled shader stage");
+ }
+}
+
+
+tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+{
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ if (!areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " + getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+
+ if ("gl_SubgroupSize" == caseDef.varName)
+ {
+ return makeComputeTest(context, FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkComputeSubgroupSize);
+ }
+ else if ("gl_SubgroupInvocationID" == caseDef.varName)
+ {
+ return makeComputeTest(context, FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkComputeSubgroupInvocationID);
+ }
+ else if ("gl_NumSubgroups" == caseDef.varName)
+ {
+ return makeComputeTest(context, FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkComputeNumSubgroups);
+ }
+ else if ("gl_SubgroupID" == caseDef.varName)
+ {
+ return makeComputeTest(context, FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkComputeSubgroupID);
+ }
+ else
+ {
+ return tcu::TestStatus::fail(
+ caseDef.varName + " failed (unhandled error checking case " +
+ caseDef.varName + ")!");
+ }
+ }
+ else
+ {
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
+
+ subgroups::ShaderStageFlags stages = (subgroups::ShaderStageFlags)(caseDef.shaderStage & supportedStages);
+
+ if (SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ {
+ if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0)
+ TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+ else
+ stages = SHADER_STAGE_FRAGMENT_BIT;
+ }
+
+ if ((ShaderStageFlags)0u == stages)
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
+
+ if ("gl_SubgroupSize" == caseDef.varName)
+ {
+ return subgroups::allStages(context, FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupSize, stages);
+ }
+ else if ("gl_SubgroupInvocationID" == caseDef.varName)
+ {
+ return subgroups::allStages(context, FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupInvocationID, stages);
+ }
+ else
+ {
+ return tcu::TestStatus::fail(
+ caseDef.varName + " failed (unhandled error checking case " +
+ caseDef.varName + ")!");
+ }
+ }
+}
+
+deqp::TestCaseGroup* createSubgroupsBuiltinVarTests(deqp::Context& testCtx)
+{
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
+ testCtx, "graphics", "Subgroup builtin variable tests: graphics"));
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
+ testCtx, "compute", "Subgroup builtin variable tests: compute"));
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
+ testCtx, "framebuffer", "Subgroup builtin variable tests: framebuffer"));
+
+ const char* const all_stages_vars[] =
+ {
+ "SubgroupSize",
+ "SubgroupInvocationID"
+ };
+
+ const char* const compute_only_vars[] =
+ {
+ "NumSubgroups",
+ "SubgroupID"
+ };
+
+ const ShaderStageFlags stages[] =
+ {
+ SHADER_STAGE_VERTEX_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT,
+ };
+
+ for (int a = 0; a < DE_LENGTH_OF_ARRAY(all_stages_vars); ++a)
+ {
+ const std::string var = all_stages_vars[a];
+ const std::string varLower = de::toLower(var);
+
+ {
+ const CaseDefinition caseDef = { "gl_" + var, SHADER_STAGE_ALL_GRAPHICS};
+
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(),
+ varLower, "",
+ supportedCheck, initPrograms, test, caseDef);
+ }
+
+ {
+ const CaseDefinition caseDef = {"gl_" + var, SHADER_STAGE_COMPUTE_BIT};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(),
+ varLower + "_" + getShaderStageName(caseDef.shaderStage), "",
+ supportedCheck, initPrograms, test, caseDef);
+ }
+
+ for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+ {
+ const CaseDefinition caseDef = {"gl_" + var, stages[stageIndex]};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(),
+ varLower + "_" + getShaderStageName(caseDef.shaderStage), "",
+ supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
+ }
+ }
+
+ for (int a = 0; a < DE_LENGTH_OF_ARRAY(compute_only_vars); ++a)
+ {
+ const std::string var = compute_only_vars[a];
+
+ const CaseDefinition caseDef = {"gl_" + var, SHADER_STAGE_COMPUTE_BIT};
+
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(), de::toLower(var), "",
+ supportedCheck, initPrograms, test, caseDef);
+ }
+
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
+ testCtx, "builtin_var", "Subgroup builtin variable tests"));
+
+ group->addChild(graphicGroup.release());
+ group->addChild(computeGroup.release());
+ group->addChild(framebufferGroup.release());
+
+ return group.release();
+}
+
+} // subgroups
+} // glc
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinVarTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinVarTests.hpp
new file mode 100644
index 0000000..e578104
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinVarTests.hpp
@@ -0,0 +1,41 @@
+#ifndef _GLCSUBGROUPSBUILTINVARTESTS_HPP
+#define _GLCSUBGROUPSBUILTINVARTESTS_HPP
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "glcTestCase.hpp"
+
+namespace glc
+{
+namespace subgroups
+{
+
+deqp::TestCaseGroup* createSubgroupsBuiltinVarTests(deqp::Context& testCtx);
+
+} // subgroups
+} // glc
+
+#endif // _GLCSUBGROUPSBUILTINVARTESTS_HPP
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsClusteredTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsClusteredTests.cpp
new file mode 100755
index 0000000..e460591
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsClusteredTests.cpp
@@ -0,0 +1,870 @@
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "glcSubgroupsClusteredTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+
+using namespace tcu;
+using namespace std;
+
+namespace glc
+{
+namespace subgroups
+{
+namespace
+{
+enum OpType
+{
+ OPTYPE_CLUSTERED_ADD = 0,
+ OPTYPE_CLUSTERED_MUL,
+ OPTYPE_CLUSTERED_MIN,
+ OPTYPE_CLUSTERED_MAX,
+ OPTYPE_CLUSTERED_AND,
+ OPTYPE_CLUSTERED_OR,
+ OPTYPE_CLUSTERED_XOR,
+ OPTYPE_CLUSTERED_LAST
+};
+
+static bool checkVertexPipelineStages(std::vector<const void*> datas,
+ deUint32 width, deUint32)
+{
+ return glc::subgroups::check(datas, width, 1);
+}
+
+static bool checkComputeStage(std::vector<const void*> datas,
+ const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+ deUint32)
+{
+ return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, 1);
+}
+
+std::string getOpTypeName(int opType)
+{
+ switch (opType)
+ {
+ default:
+ DE_FATAL("Unsupported op type");
+ return "";
+ case OPTYPE_CLUSTERED_ADD:
+ return "subgroupClusteredAdd";
+ case OPTYPE_CLUSTERED_MUL:
+ return "subgroupClusteredMul";
+ case OPTYPE_CLUSTERED_MIN:
+ return "subgroupClusteredMin";
+ case OPTYPE_CLUSTERED_MAX:
+ return "subgroupClusteredMax";
+ case OPTYPE_CLUSTERED_AND:
+ return "subgroupClusteredAnd";
+ case OPTYPE_CLUSTERED_OR:
+ return "subgroupClusteredOr";
+ case OPTYPE_CLUSTERED_XOR:
+ return "subgroupClusteredXor";
+ }
+}
+
+std::string getOpTypeOperation(int opType, Format format, std::string lhs, std::string rhs)
+{
+ switch (opType)
+ {
+ default:
+ DE_FATAL("Unsupported op type");
+ return "";
+ case OPTYPE_CLUSTERED_ADD:
+ return lhs + " + " + rhs;
+ case OPTYPE_CLUSTERED_MUL:
+ return lhs + " * " + rhs;
+ case OPTYPE_CLUSTERED_MIN:
+ switch (format)
+ {
+ default:
+ return "min(" + lhs + ", " + rhs + ")";
+ case FORMAT_R32_SFLOAT:
+ case FORMAT_R64_SFLOAT:
+ return "(isnan(" + lhs + ") ? " + rhs + " : (isnan(" + rhs + ") ? " + lhs + " : min(" + lhs + ", " + rhs + ")))";
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
+ return "mix(mix(min(" + lhs + ", " + rhs + "), " + lhs + ", isnan(" + rhs + ")), " + rhs + ", isnan(" + lhs + "))";
+ }
+ case OPTYPE_CLUSTERED_MAX:
+ switch (format)
+ {
+ default:
+ return "max(" + lhs + ", " + rhs + ")";
+ case FORMAT_R32_SFLOAT:
+ case FORMAT_R64_SFLOAT:
+ return "(isnan(" + lhs + ") ? " + rhs + " : (isnan(" + rhs + ") ? " + lhs + " : max(" + lhs + ", " + rhs + ")))";
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
+ return "mix(mix(max(" + lhs + ", " + rhs + "), " + lhs + ", isnan(" + rhs + ")), " + rhs + ", isnan(" + lhs + "))";
+ }
+ case OPTYPE_CLUSTERED_AND:
+ switch (format)
+ {
+ default:
+ return lhs + " & " + rhs;
+ case FORMAT_R32_BOOL:
+ return lhs + " && " + rhs;
+ case FORMAT_R32G32_BOOL:
+ return "bvec2(" + lhs + ".x && " + rhs + ".x, " + lhs + ".y && " + rhs + ".y)";
+ case FORMAT_R32G32B32_BOOL:
+ return "bvec3(" + lhs + ".x && " + rhs + ".x, " + lhs + ".y && " + rhs + ".y, " + lhs + ".z && " + rhs + ".z)";
+ case FORMAT_R32G32B32A32_BOOL:
+ return "bvec4(" + lhs + ".x && " + rhs + ".x, " + lhs + ".y && " + rhs + ".y, " + lhs + ".z && " + rhs + ".z, " + lhs + ".w && " + rhs + ".w)";
+ }
+ case OPTYPE_CLUSTERED_OR:
+ switch (format)
+ {
+ default:
+ return lhs + " | " + rhs;
+ case FORMAT_R32_BOOL:
+ return lhs + " || " + rhs;
+ case FORMAT_R32G32_BOOL:
+ return "bvec2(" + lhs + ".x || " + rhs + ".x, " + lhs + ".y || " + rhs + ".y)";
+ case FORMAT_R32G32B32_BOOL:
+ return "bvec3(" + lhs + ".x || " + rhs + ".x, " + lhs + ".y || " + rhs + ".y, " + lhs + ".z || " + rhs + ".z)";
+ case FORMAT_R32G32B32A32_BOOL:
+ return "bvec4(" + lhs + ".x || " + rhs + ".x, " + lhs + ".y || " + rhs + ".y, " + lhs + ".z || " + rhs + ".z, " + lhs + ".w || " + rhs + ".w)";
+ }
+ case OPTYPE_CLUSTERED_XOR:
+ switch (format)
+ {
+ default:
+ return lhs + " ^ " + rhs;
+ case FORMAT_R32_BOOL:
+ return lhs + " ^^ " + rhs;
+ case FORMAT_R32G32_BOOL:
+ return "bvec2(" + lhs + ".x ^^ " + rhs + ".x, " + lhs + ".y ^^ " + rhs + ".y)";
+ case FORMAT_R32G32B32_BOOL:
+ return "bvec3(" + lhs + ".x ^^ " + rhs + ".x, " + lhs + ".y ^^ " + rhs + ".y, " + lhs + ".z ^^ " + rhs + ".z)";
+ case FORMAT_R32G32B32A32_BOOL:
+ return "bvec4(" + lhs + ".x ^^ " + rhs + ".x, " + lhs + ".y ^^ " + rhs + ".y, " + lhs + ".z ^^ " + rhs + ".z, " + lhs + ".w ^^ " + rhs + ".w)";
+ }
+ }
+}
+
+std::string getIdentity(int opType, Format format)
+{
+ bool isFloat = false;
+ bool isInt = false;
+ bool isUnsigned = false;
+
+ switch (format)
+ {
+ default:
+ DE_FATAL("Unhandled format!");
+ break;
+ case FORMAT_R32_SINT:
+ case FORMAT_R32G32_SINT:
+ case FORMAT_R32G32B32_SINT:
+ case FORMAT_R32G32B32A32_SINT:
+ isInt = true;
+ break;
+ case FORMAT_R32_UINT:
+ case FORMAT_R32G32_UINT:
+ case FORMAT_R32G32B32_UINT:
+ case FORMAT_R32G32B32A32_UINT:
+ isUnsigned = true;
+ break;
+ case FORMAT_R32_SFLOAT:
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
+ isFloat = true;
+ break;
+ case FORMAT_R32_BOOL:
+ case FORMAT_R32G32_BOOL:
+ case FORMAT_R32G32B32_BOOL:
+ case FORMAT_R32G32B32A32_BOOL:
+ break; // bool types are not anything
+ }
+
+ switch (opType)
+ {
+ default:
+ DE_FATAL("Unsupported op type");
+ return "";
+ case OPTYPE_CLUSTERED_ADD:
+ return subgroups::getFormatNameForGLSL(format) + "(0)";
+ case OPTYPE_CLUSTERED_MUL:
+ return subgroups::getFormatNameForGLSL(format) + "(1)";
+ case OPTYPE_CLUSTERED_MIN:
+ if (isFloat)
+ {
+ return subgroups::getFormatNameForGLSL(format) + "(intBitsToFloat(0x7f800000))";
+ }
+ else if (isInt)
+ {
+ return subgroups::getFormatNameForGLSL(format) + "(0x7fffffff)";
+ }
+ else if (isUnsigned)
+ {
+ return subgroups::getFormatNameForGLSL(format) + "(0xffffffffu)";
+ }
+ else
+ {
+ DE_FATAL("Unhandled case");
+ return "";
+ }
+ case OPTYPE_CLUSTERED_MAX:
+ if (isFloat)
+ {
+ return subgroups::getFormatNameForGLSL(format) + "(intBitsToFloat(0xff800000))";
+ }
+ else if (isInt)
+ {
+ return subgroups::getFormatNameForGLSL(format) + "(0x80000000)";
+ }
+ else if (isUnsigned)
+ {
+ return subgroups::getFormatNameForGLSL(format) + "(0u)";
+ }
+ else
+ {
+ DE_FATAL("Unhandled case");
+ return "";
+ }
+ case OPTYPE_CLUSTERED_AND:
+ return subgroups::getFormatNameForGLSL(format) + "(~0)";
+ case OPTYPE_CLUSTERED_OR:
+ return subgroups::getFormatNameForGLSL(format) + "(0)";
+ case OPTYPE_CLUSTERED_XOR:
+ return subgroups::getFormatNameForGLSL(format) + "(0)";
+ }
+}
+
+std::string getCompare(int opType, Format format, std::string lhs, std::string rhs)
+{
+ std::string formatName = subgroups::getFormatNameForGLSL(format);
+ switch (format)
+ {
+ default:
+ return "all(equal(" + lhs + ", " + rhs + "))";
+ case FORMAT_R32_BOOL:
+ case FORMAT_R32_UINT:
+ case FORMAT_R32_SINT:
+ return "(" + lhs + " == " + rhs + ")";
+ case FORMAT_R32_SFLOAT:
+ case FORMAT_R64_SFLOAT:
+ switch (opType)
+ {
+ default:
+ return "(abs(" + lhs + " - " + rhs + ") < 0.00001)";
+ case OPTYPE_CLUSTERED_MIN:
+ case OPTYPE_CLUSTERED_MAX:
+ return "(" + lhs + " == " + rhs + ")";
+ }
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
+ switch (opType)
+ {
+ default:
+ return "all(lessThan(abs(" + lhs + " - " + rhs + "), " + formatName + "(0.00001)))";
+ case OPTYPE_CLUSTERED_MIN:
+ case OPTYPE_CLUSTERED_MAX:
+ return "all(equal(" + lhs + ", " + rhs + "))";
+ }
+ }
+}
+
+struct CaseDefinition
+{
+ int opType;
+ ShaderStageFlags shaderStage;
+ Format format;
+};
+
+std::string getBodySource(CaseDefinition caseDef)
+{
+ std::ostringstream bdy;
+ bdy << " bool tempResult = true;\n";
+
+ for (deUint32 i = 1; i <= subgroups::maxSupportedSubgroupSize(); i *= 2)
+ {
+ bdy << " {\n"
+ << " const uint clusterSize = " << i << "u;\n"
+ << " if (clusterSize <= gl_SubgroupSize)\n"
+ << " {\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+ << getOpTypeName(caseDef.opType) + "(data[gl_SubgroupInvocationID], clusterSize);\n"
+ << " for (uint clusterOffset = 0u; clusterOffset < gl_SubgroupSize; clusterOffset += clusterSize)\n"
+ << " {\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " ref = "
+ << getIdentity(caseDef.opType, caseDef.format) << ";\n"
+ << " for (uint index = clusterOffset; index < (clusterOffset + clusterSize); index++)\n"
+ << " {\n"
+ << " if (subgroupBallotBitExtract(mask, index))\n"
+ << " {\n"
+ << " ref = " << getOpTypeOperation(caseDef.opType, caseDef.format, "ref", "data[index]") << ";\n"
+ << " }\n"
+ << " }\n"
+ << " if ((clusterOffset <= gl_SubgroupInvocationID) && (gl_SubgroupInvocationID < (clusterOffset + clusterSize)))\n"
+ << " {\n"
+ << " if (!" << getCompare(caseDef.opType, caseDef.format, "ref", "op") << ")\n"
+ << " {\n"
+ << " tempResult = false;\n"
+ << " }\n"
+ << " }\n"
+ << " }\n"
+ << " }\n"
+ << " }\n";
+ }
+ return bdy.str();
+}
+
+void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ subgroups::setFragmentShaderFrameBuffer(programCollection);
+
+ if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ subgroups::setVertexShaderFrameBuffer(programCollection);
+
+ std::string bdy = getBodySource(caseDef);
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream vertexSrc;
+ vertexSrc << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_clustered: enable\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(location = 0) in highp vec4 in_position;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "layout(binding = 0, std140) uniform Buffer0\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec4 mask = subgroupBallot(true);\n"
+ << bdy
+ << " out_color = float(tempResult ? 1 : 0);\n"
+ << " gl_Position = in_position;\n"
+ << " gl_PointSize = 1.0f;\n"
+ << "}\n";
+ programCollection.add("vert") << glu::VertexSource(vertexSrc.str());
+ }
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream geometry;
+
+ geometry << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_clustered: enable\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(points) in;\n"
+ << "layout(points, max_vertices = 1) out;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "layout(binding = 0, std140) uniform Buffer0\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec4 mask = subgroupBallot(true);\n"
+ << bdy
+ << " out_color = tempResult ? 1.0 : 0.0;\n"
+ << " gl_Position = gl_in[0].gl_Position;\n"
+ << " EmitVertex();\n"
+ << " EndPrimitive();\n"
+ << "}\n";
+
+ programCollection.add("geometry") << glu::GeometrySource(geometry.str());
+ }
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream controlSource;
+
+ controlSource << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_clustered: enable\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(vertices = 2) out;\n"
+ << "layout(location = 0) out float out_color[];\n"
+ << "layout(binding = 0, std140) uniform Buffer0\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " if (gl_InvocationID == 0)\n"
+ <<" {\n"
+ << " gl_TessLevelOuter[0] = 1.0f;\n"
+ << " gl_TessLevelOuter[1] = 1.0f;\n"
+ << " }\n"
+ << " uvec4 mask = subgroupBallot(true);\n"
+ << bdy
+ << " out_color[gl_InvocationID] = tempResult ? 1.0 : 0.0;\n"
+ << " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ << "}\n";
+
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSource.str());
+ subgroups::setTesEvalShaderFrameBuffer(programCollection);
+ }
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream evaluationSource;
+
+ evaluationSource << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_clustered: enable\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(isolines, equal_spacing, ccw ) in;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "layout(binding = 0, std140) uniform Buffer0\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec4 mask = subgroupBallot(true);\n"
+ << bdy
+ << " out_color = tempResult ? 1.0 : 0.0;\n"
+ << " gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
+ << "}\n";
+
+ subgroups::setTesCtrlShaderFrameBuffer(programCollection);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
+ }
+ else
+ {
+ DE_FATAL("Unsupported shader stage");
+ }
+}
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ std::string bdy = getBodySource(caseDef);
+
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream src;
+
+ src << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_clustered: enable\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Buffer0\n"
+ << "{\n"
+ << " uint result[];\n"
+ << "};\n"
+ << "layout(binding = 1, std430) buffer Buffer1\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+ << " highp uint offset = globalSize.x * ((globalSize.y * "
+ "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+ "gl_GlobalInvocationID.x;\n"
+ << " uvec4 mask = subgroupBallot(true);\n"
+ << bdy
+ << " result[offset] = tempResult ? 1u : 0u;\n"
+ << "}\n";
+
+ programCollection.add("comp") << glu::ComputeSource(src.str());
+ }
+ else
+ {
+ {
+ const string vertex =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_clustered: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(binding = 0, std430) buffer Buffer0\n"
+ "{\n"
+ " uint result[];\n"
+ "} b0;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " uvec4 mask = subgroupBallot(true);\n"
+ + bdy +
+ " b0.result[gl_VertexID] = tempResult ? 1u : 0u;\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " float pixelPosition = pixelSize/2.0f - 1.0f;\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ "}\n";
+
+ programCollection.add("vert") << glu::VertexSource(vertex);
+ }
+
+ {
+ const string tesc =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_clustered: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(vertices=1) out;\n"
+ "layout(binding = 1, std430) buffer Buffer1\n"
+ "{\n"
+ " uint result[];\n"
+ "} b1;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " uvec4 mask = subgroupBallot(true);\n"
+ + bdy +
+ " b1.result[gl_PrimitiveID] = tempResult ? 1u : 0u;\n"
+ " if (gl_InvocationID == 0)\n"
+ " {\n"
+ " gl_TessLevelOuter[0] = 1.0f;\n"
+ " gl_TessLevelOuter[1] = 1.0f;\n"
+ " }\n"
+ " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ "}\n";
+
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc);
+ }
+
+ {
+ const string tese =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_clustered: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(isolines) in;\n"
+ "layout(binding = 2, std430) buffer Buffer2\n"
+ "{\n"
+ " uint result[];\n"
+ "} b2;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " uvec4 mask = subgroupBallot(true);\n"
+ + bdy +
+ " b2.result[gl_PrimitiveID * 2 + int(gl_TessCoord.x + 0.5)] = tempResult ? 1u : 0u;\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
+ "}\n";
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese);
+ }
+
+ {
+ const string geometry =
+ // version string added by addGeometryShadersFromTemplate
+ "#extension GL_KHR_shader_subgroup_clustered: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(${TOPOLOGY}) in;\n"
+ "layout(points, max_vertices = 1) out;\n"
+ "layout(binding = 3, std430) buffer Buffer3\n"
+ "{\n"
+ " uint result[];\n"
+ "} b3;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " uvec4 mask = subgroupBallot(true);\n"
+ + bdy +
+ " b3.result[gl_PrimitiveIDIn] = tempResult ? 1u : 0u;\n"
+ " gl_Position = gl_in[0].gl_Position;\n"
+ " EmitVertex();\n"
+ " EndPrimitive();\n"
+ "}\n";
+ subgroups::addGeometryShadersFromTemplate(geometry, programCollection);
+ }
+
+ {
+ const string fragment =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_clustered: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "precision highp int;\n"
+ "precision highp float;\n"
+ "layout(location = 0) out uint result;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
+ "};\n"
+ "void main (void)\n"
+ "{\n"
+ " uvec4 mask = subgroupBallot(true);\n"
+ + bdy +
+ " result = tempResult ? 1u : 0u;\n"
+ "}\n";
+ programCollection.add("fragment") << glu::FragmentSource(fragment);
+ }
+
+ subgroups::addNoSubgroupShader(programCollection);
+ }
+}
+
+void supportedCheck (Context& context, CaseDefinition caseDef)
+{
+ if (!subgroups::isSubgroupSupported(context))
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported");
+
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_CLUSTERED_BIT))
+ TCU_THROW(NotSupportedError, "Device does not support subgroup clustered operations");
+
+ if (subgroups::isDoubleFormat(caseDef.format) &&
+ !subgroups::isDoubleSupportedForDevice(context))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
+ }
+}
+
+tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
+{
+ if (!subgroups::areSubgroupOperationsSupportedForStage(
+ context, caseDef.shaderStage))
+ {
+ if (subgroups::areSubgroupOperationsRequiredForStage(
+ caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ else
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+ }
+ }
+
+ subgroups::SSBOData inputData;
+ inputData.format = caseDef.format;
+ inputData.layout = subgroups::SSBOData::LayoutStd140;
+ inputData.numElements = subgroups::maxSupportedSubgroupSize();
+ inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData.binding = 0u;
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ return subgroups::makeVertexFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ return subgroups::makeGeometryFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_CONTROL_BIT);
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_EVALUATION_BIT);
+ else
+ TCU_THROW(InternalError, "Unhandled shader stage");
+}
+
+tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+{
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ if (!subgroups::areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ subgroups::SSBOData inputData;
+ inputData.format = caseDef.format;
+ inputData.layout = subgroups::SSBOData::LayoutStd430;
+ inputData.numElements = subgroups::maxSupportedSubgroupSize();
+ inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData.binding = 1u;
+
+ return subgroups::makeComputeTest(context, FORMAT_R32_UINT, &inputData, 1, checkComputeStage);
+ }
+ else
+ {
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
+
+ ShaderStageFlags stages = (ShaderStageFlags)(caseDef.shaderStage & supportedStages);
+
+ if (SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ {
+ if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0)
+ TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+ else
+ stages = SHADER_STAGE_FRAGMENT_BIT;
+ }
+
+ if ((ShaderStageFlags)0u == stages)
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
+
+ subgroups::SSBOData inputData;
+ inputData.format = caseDef.format;
+ inputData.layout = subgroups::SSBOData::LayoutStd430;
+ inputData.numElements = subgroups::maxSupportedSubgroupSize();
+ inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData.binding = 4u;
+ inputData.stages = stages;
+
+ return subgroups::allStages(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, stages);
+ }
+}
+}
+
+deqp::TestCaseGroup* createSubgroupsClusteredTests(deqp::Context& testCtx)
+{
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
+ testCtx, "graphics", "Subgroup clustered category tests: graphics"));
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
+ testCtx, "compute", "Subgroup clustered category tests: compute"));
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
+ testCtx, "framebuffer", "Subgroup clustered category tests: framebuffer"));
+
+ const ShaderStageFlags stages[] =
+ {
+ SHADER_STAGE_VERTEX_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT
+ };
+
+ const Format formats[] =
+ {
+ FORMAT_R32_SINT, FORMAT_R32G32_SINT, FORMAT_R32G32B32_SINT,
+ FORMAT_R32G32B32A32_SINT, FORMAT_R32_UINT, FORMAT_R32G32_UINT,
+ FORMAT_R32G32B32_UINT, FORMAT_R32G32B32A32_UINT,
+ FORMAT_R32_SFLOAT, FORMAT_R32G32_SFLOAT,
+ FORMAT_R32G32B32_SFLOAT, FORMAT_R32G32B32A32_SFLOAT,
+ FORMAT_R64_SFLOAT, FORMAT_R64G64_SFLOAT,
+ FORMAT_R64G64B64_SFLOAT, FORMAT_R64G64B64A64_SFLOAT,
+ FORMAT_R32_BOOL, FORMAT_R32G32_BOOL,
+ FORMAT_R32G32B32_BOOL, FORMAT_R32G32B32A32_BOOL,
+ };
+
+ for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
+ {
+ const Format format = formats[formatIndex];
+
+ for (int opTypeIndex = 0; opTypeIndex < OPTYPE_CLUSTERED_LAST; ++opTypeIndex)
+ {
+ bool isBool = false;
+ bool isFloat = false;
+
+ switch (format)
+ {
+ default:
+ break;
+ case FORMAT_R32_SFLOAT:
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
+ isFloat = true;
+ break;
+ case FORMAT_R32_BOOL:
+ case FORMAT_R32G32_BOOL:
+ case FORMAT_R32G32B32_BOOL:
+ case FORMAT_R32G32B32A32_BOOL:
+ isBool = true;
+ break;
+ }
+
+ bool isBitwiseOp = false;
+
+ switch (opTypeIndex)
+ {
+ default:
+ break;
+ case OPTYPE_CLUSTERED_AND:
+ case OPTYPE_CLUSTERED_OR:
+ case OPTYPE_CLUSTERED_XOR:
+ isBitwiseOp = true;
+ break;
+ }
+
+ if (isFloat && isBitwiseOp)
+ {
+ // Skip float with bitwise category.
+ continue;
+ }
+
+ if (isBool && !isBitwiseOp)
+ {
+ // Skip bool when its not the bitwise category.
+ continue;
+ }
+
+ const std::string name = de::toLower(getOpTypeName(opTypeIndex))
+ +"_" + subgroups::getFormatNameForGLSL(format);
+
+ {
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_COMPUTE_BIT, format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(), name, "", supportedCheck, initPrograms, test, caseDef);
+ }
+
+ {
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_ALL_GRAPHICS, format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(), name,
+ "", supportedCheck, initPrograms, test, caseDef);
+ }
+
+ for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+ {
+ const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex], format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(), name +"_" + getShaderStageName(caseDef.shaderStage), "",
+ supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
+ }
+ }
+ }
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
+ testCtx, "clustered", "Subgroup clustered category tests"));
+
+ group->addChild(graphicGroup.release());
+ group->addChild(computeGroup.release());
+ group->addChild(framebufferGroup.release());
+
+ return group.release();
+}
+
+} // subgroups
+} // glc
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsClusteredTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsClusteredTests.hpp
new file mode 100644
index 0000000..f9e3e26
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsClusteredTests.hpp
@@ -0,0 +1,41 @@
+#ifndef _GLCSUBGROUPSCLUSTEREDTESTS_HPP
+#define _GLCSUBGROUPSCLUSTEREDTESTS_HPP
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "glcTestCase.hpp"
+
+namespace glc
+{
+namespace subgroups
+{
+
+deqp::TestCaseGroup* createSubgroupsClusteredTests(deqp::Context& testCtx);
+
+} // subgroups
+} // glc
+
+#endif // _GLCSUBGROUPSCLUSTEREDTESTS_HPP
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsPartitionedTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsPartitionedTests.cpp
new file mode 100755
index 0000000..412ae03
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsPartitionedTests.cpp
@@ -0,0 +1,987 @@
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2018-2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "glcSubgroupsPartitionedTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+
+using namespace tcu;
+using namespace std;
+
+namespace glc
+{
+namespace subgroups
+{
+namespace
+{
+enum OpType
+{
+ OPTYPE_ADD = 0,
+ OPTYPE_MUL,
+ OPTYPE_MIN,
+ OPTYPE_MAX,
+ OPTYPE_AND,
+ OPTYPE_OR,
+ OPTYPE_XOR,
+ OPTYPE_INCLUSIVE_ADD,
+ OPTYPE_INCLUSIVE_MUL,
+ OPTYPE_INCLUSIVE_MIN,
+ OPTYPE_INCLUSIVE_MAX,
+ OPTYPE_INCLUSIVE_AND,
+ OPTYPE_INCLUSIVE_OR,
+ OPTYPE_INCLUSIVE_XOR,
+ OPTYPE_EXCLUSIVE_ADD,
+ OPTYPE_EXCLUSIVE_MUL,
+ OPTYPE_EXCLUSIVE_MIN,
+ OPTYPE_EXCLUSIVE_MAX,
+ OPTYPE_EXCLUSIVE_AND,
+ OPTYPE_EXCLUSIVE_OR,
+ OPTYPE_EXCLUSIVE_XOR,
+ OPTYPE_LAST
+};
+
+static bool checkVertexPipelineStages(std::vector<const void*> datas,
+ deUint32 width, deUint32)
+{
+ return glc::subgroups::check(datas, width, 0xFFFFFF);
+}
+
+static bool checkComputeStage(std::vector<const void*> datas,
+ const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+ deUint32)
+{
+ return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, 0xFFFFFF);
+}
+
+std::string getOpTypeName(int opType)
+{
+ switch (opType)
+ {
+ default:
+ DE_FATAL("Unsupported op type");
+ return "";
+ case OPTYPE_ADD:
+ return "subgroupAdd";
+ case OPTYPE_MUL:
+ return "subgroupMul";
+ case OPTYPE_MIN:
+ return "subgroupMin";
+ case OPTYPE_MAX:
+ return "subgroupMax";
+ case OPTYPE_AND:
+ return "subgroupAnd";
+ case OPTYPE_OR:
+ return "subgroupOr";
+ case OPTYPE_XOR:
+ return "subgroupXor";
+ case OPTYPE_INCLUSIVE_ADD:
+ return "subgroupInclusiveAdd";
+ case OPTYPE_INCLUSIVE_MUL:
+ return "subgroupInclusiveMul";
+ case OPTYPE_INCLUSIVE_MIN:
+ return "subgroupInclusiveMin";
+ case OPTYPE_INCLUSIVE_MAX:
+ return "subgroupInclusiveMax";
+ case OPTYPE_INCLUSIVE_AND:
+ return "subgroupInclusiveAnd";
+ case OPTYPE_INCLUSIVE_OR:
+ return "subgroupInclusiveOr";
+ case OPTYPE_INCLUSIVE_XOR:
+ return "subgroupInclusiveXor";
+ case OPTYPE_EXCLUSIVE_ADD:
+ return "subgroupExclusiveAdd";
+ case OPTYPE_EXCLUSIVE_MUL:
+ return "subgroupExclusiveMul";
+ case OPTYPE_EXCLUSIVE_MIN:
+ return "subgroupExclusiveMin";
+ case OPTYPE_EXCLUSIVE_MAX:
+ return "subgroupExclusiveMax";
+ case OPTYPE_EXCLUSIVE_AND:
+ return "subgroupExclusiveAnd";
+ case OPTYPE_EXCLUSIVE_OR:
+ return "subgroupExclusiveOr";
+ case OPTYPE_EXCLUSIVE_XOR:
+ return "subgroupExclusiveXor";
+ }
+}
+
+std::string getOpTypeNamePartitioned(int opType)
+{
+ switch (opType)
+ {
+ default:
+ DE_FATAL("Unsupported op type");
+ return "";
+ case OPTYPE_ADD:
+ return "subgroupPartitionedAddNV";
+ case OPTYPE_MUL:
+ return "subgroupPartitionedMulNV";
+ case OPTYPE_MIN:
+ return "subgroupPartitionedMinNV";
+ case OPTYPE_MAX:
+ return "subgroupPartitionedMaxNV";
+ case OPTYPE_AND:
+ return "subgroupPartitionedAndNV";
+ case OPTYPE_OR:
+ return "subgroupPartitionedOrNV";
+ case OPTYPE_XOR:
+ return "subgroupPartitionedXorNV";
+ case OPTYPE_INCLUSIVE_ADD:
+ return "subgroupPartitionedInclusiveAddNV";
+ case OPTYPE_INCLUSIVE_MUL:
+ return "subgroupPartitionedInclusiveMulNV";
+ case OPTYPE_INCLUSIVE_MIN:
+ return "subgroupPartitionedInclusiveMinNV";
+ case OPTYPE_INCLUSIVE_MAX:
+ return "subgroupPartitionedInclusiveMaxNV";
+ case OPTYPE_INCLUSIVE_AND:
+ return "subgroupPartitionedInclusiveAndNV";
+ case OPTYPE_INCLUSIVE_OR:
+ return "subgroupPartitionedInclusiveOrNV";
+ case OPTYPE_INCLUSIVE_XOR:
+ return "subgroupPartitionedInclusiveXorNV";
+ case OPTYPE_EXCLUSIVE_ADD:
+ return "subgroupPartitionedExclusiveAddNV";
+ case OPTYPE_EXCLUSIVE_MUL:
+ return "subgroupPartitionedExclusiveMulNV";
+ case OPTYPE_EXCLUSIVE_MIN:
+ return "subgroupPartitionedExclusiveMinNV";
+ case OPTYPE_EXCLUSIVE_MAX:
+ return "subgroupPartitionedExclusiveMaxNV";
+ case OPTYPE_EXCLUSIVE_AND:
+ return "subgroupPartitionedExclusiveAndNV";
+ case OPTYPE_EXCLUSIVE_OR:
+ return "subgroupPartitionedExclusiveOrNV";
+ case OPTYPE_EXCLUSIVE_XOR:
+ return "subgroupPartitionedExclusiveXorNV";
+ }
+}
+
+std::string getIdentity(int opType, Format format)
+{
+ bool isFloat = false;
+ bool isInt = false;
+ bool isUnsigned = false;
+
+ switch (format)
+ {
+ default:
+ DE_FATAL("Unhandled format!");
+ return "";
+ case FORMAT_R32_SINT:
+ case FORMAT_R32G32_SINT:
+ case FORMAT_R32G32B32_SINT:
+ case FORMAT_R32G32B32A32_SINT:
+ isInt = true;
+ break;
+ case FORMAT_R32_UINT:
+ case FORMAT_R32G32_UINT:
+ case FORMAT_R32G32B32_UINT:
+ case FORMAT_R32G32B32A32_UINT:
+ isUnsigned = true;
+ break;
+ case FORMAT_R32_SFLOAT:
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
+ isFloat = true;
+ break;
+ case FORMAT_R32_BOOL:
+ case FORMAT_R32G32_BOOL:
+ case FORMAT_R32G32B32_BOOL:
+ case FORMAT_R32G32B32A32_BOOL:
+ break; // bool types are not anything
+ }
+
+ switch (opType)
+ {
+ default:
+ DE_FATAL("Unsupported op type");
+ return "";
+ case OPTYPE_ADD:
+ case OPTYPE_INCLUSIVE_ADD:
+ case OPTYPE_EXCLUSIVE_ADD:
+ return subgroups::getFormatNameForGLSL(format) + "(0)";
+ case OPTYPE_MUL:
+ case OPTYPE_INCLUSIVE_MUL:
+ case OPTYPE_EXCLUSIVE_MUL:
+ return subgroups::getFormatNameForGLSL(format) + "(1)";
+ case OPTYPE_MIN:
+ case OPTYPE_INCLUSIVE_MIN:
+ case OPTYPE_EXCLUSIVE_MIN:
+ if (isFloat)
+ {
+ return subgroups::getFormatNameForGLSL(format) + "(intBitsToFloat(0x7f800000))";
+ }
+ else if (isInt)
+ {
+ return subgroups::getFormatNameForGLSL(format) + "(0x7fffffff)";
+ }
+ else if (isUnsigned)
+ {
+ return subgroups::getFormatNameForGLSL(format) + "(0xffffffffu)";
+ }
+ else
+ {
+ DE_FATAL("Unhandled case");
+ return "";
+ }
+ case OPTYPE_MAX:
+ case OPTYPE_INCLUSIVE_MAX:
+ case OPTYPE_EXCLUSIVE_MAX:
+ if (isFloat)
+ {
+ return subgroups::getFormatNameForGLSL(format) + "(intBitsToFloat(0xff800000))";
+ }
+ else if (isInt)
+ {
+ return subgroups::getFormatNameForGLSL(format) + "(0x80000000)";
+ }
+ else if (isUnsigned)
+ {
+ return subgroups::getFormatNameForGLSL(format) + "(0u)";
+ }
+ else
+ {
+ DE_FATAL("Unhandled case");
+ return "";
+ }
+ case OPTYPE_AND:
+ case OPTYPE_INCLUSIVE_AND:
+ case OPTYPE_EXCLUSIVE_AND:
+ return subgroups::getFormatNameForGLSL(format) + "(~0)";
+ case OPTYPE_OR:
+ case OPTYPE_INCLUSIVE_OR:
+ case OPTYPE_EXCLUSIVE_OR:
+ return subgroups::getFormatNameForGLSL(format) + "(0)";
+ case OPTYPE_XOR:
+ case OPTYPE_INCLUSIVE_XOR:
+ case OPTYPE_EXCLUSIVE_XOR:
+ return subgroups::getFormatNameForGLSL(format) + "(0)";
+ }
+}
+
+std::string getCompare(int opType, Format format, std::string lhs, std::string rhs)
+{
+ std::string formatName = subgroups::getFormatNameForGLSL(format);
+ switch (format)
+ {
+ default:
+ return "all(equal(" + lhs + ", " + rhs + "))";
+ case FORMAT_R32_BOOL:
+ case FORMAT_R32_UINT:
+ case FORMAT_R32_SINT:
+ return "(" + lhs + " == " + rhs + ")";
+ case FORMAT_R32_SFLOAT:
+ case FORMAT_R64_SFLOAT:
+ switch (opType)
+ {
+ default:
+ return "(abs(" + lhs + " - " + rhs + ") < 0.00001)";
+ case OPTYPE_MIN:
+ case OPTYPE_INCLUSIVE_MIN:
+ case OPTYPE_EXCLUSIVE_MIN:
+ case OPTYPE_MAX:
+ case OPTYPE_INCLUSIVE_MAX:
+ case OPTYPE_EXCLUSIVE_MAX:
+ return "(" + lhs + " == " + rhs + ")";
+ }
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
+ switch (opType)
+ {
+ default:
+ return "all(lessThan(abs(" + lhs + " - " + rhs + "), " + formatName + "(0.00001)))";
+ case OPTYPE_MIN:
+ case OPTYPE_INCLUSIVE_MIN:
+ case OPTYPE_EXCLUSIVE_MIN:
+ case OPTYPE_MAX:
+ case OPTYPE_INCLUSIVE_MAX:
+ case OPTYPE_EXCLUSIVE_MAX:
+ return "all(equal(" + lhs + ", " + rhs + "))";
+ }
+ }
+}
+
+struct CaseDefinition
+{
+ int opType;
+ ShaderStageFlags shaderStage;
+ Format format;
+};
+
+string getTestString(const CaseDefinition &caseDef)
+{
+ // NOTE: tempResult can't have anything in bits 31:24 to avoid int->float
+ // conversion overflow in framebuffer tests.
+ string fmt = subgroups::getFormatNameForGLSL(caseDef.format);
+ string bdy =
+ " uint tempResult = 0u;\n"
+ " uint id = gl_SubgroupInvocationID;\n";
+
+ // Test the case where the partition has a single subset with all invocations in it.
+ // This should generate the same result as the non-partitioned function.
+ bdy +=
+ " uvec4 allBallot = mask;\n"
+ " " + fmt + " allResult = " + getOpTypeNamePartitioned(caseDef.opType) + "(data[gl_SubgroupInvocationID], allBallot);\n"
+ " " + fmt + " refResult = " + getOpTypeName(caseDef.opType) + "(data[gl_SubgroupInvocationID]);\n"
+ " if (" + getCompare(caseDef.opType, caseDef.format, "allResult", "refResult") + ") {\n"
+ " tempResult |= 0x1u;\n"
+ " }\n";
+
+ // The definition of a partition doesn't forbid bits corresponding to inactive
+ // invocations being in the subset with active invocations. In other words, test that
+ // bits corresponding to inactive invocations are ignored.
+ bdy +=
+ " if (0u == (gl_SubgroupInvocationID % 2u)) {\n"
+ " " + fmt + " allResult = " + getOpTypeNamePartitioned(caseDef.opType) + "(data[gl_SubgroupInvocationID], allBallot);\n"
+ " " + fmt + " refResult = " + getOpTypeName(caseDef.opType) + "(data[gl_SubgroupInvocationID]);\n"
+ " if (" + getCompare(caseDef.opType, caseDef.format, "allResult", "refResult") + ") {\n"
+ " tempResult |= 0x2u;\n"
+ " }\n"
+ " } else {\n"
+ " tempResult |= 0x2u;\n"
+ " }\n";
+
+ // Test the case where the partition has each invocation in a unique subset. For
+ // exclusive ops, the result is identity. For reduce/inclusive, it's the original value.
+ string expectedSelfResult = "data[gl_SubgroupInvocationID]";
+ if (caseDef.opType >= OPTYPE_EXCLUSIVE_ADD &&
+ caseDef.opType <= OPTYPE_EXCLUSIVE_XOR) {
+ expectedSelfResult = getIdentity(caseDef.opType, caseDef.format);
+ }
+
+ bdy +=
+ " uvec4 selfBallot = subgroupPartitionNV(gl_SubgroupInvocationID);\n"
+ " " + fmt + " selfResult = " + getOpTypeNamePartitioned(caseDef.opType) + "(data[gl_SubgroupInvocationID], selfBallot);\n"
+ " if (" + getCompare(caseDef.opType, caseDef.format, "selfResult", expectedSelfResult) + ") {\n"
+ " tempResult |= 0x4u;\n"
+ " }\n";
+
+ // Test "random" partitions based on a hash of the invocation id.
+ // This "hash" function produces interesting/randomish partitions.
+ static const char *idhash = "((id%N)+(id%(N+1u))-(id%2u)+(id/2u))%((N+1u)/2u)";
+
+ bdy +=
+ " for (uint N = 1u; N < 16u; ++N) {\n"
+ " " + fmt + " idhashFmt = " + fmt + "(" + idhash + ");\n"
+ " uvec4 partitionBallot = subgroupPartitionNV(idhashFmt) & mask;\n"
+ " " + fmt + " partitionedResult = " + getOpTypeNamePartitioned(caseDef.opType) + "(data[gl_SubgroupInvocationID], partitionBallot);\n"
+ " for (uint i = 0u; i < N; ++i) {\n"
+ " " + fmt + " iFmt = " + fmt + "(i);\n"
+ " if (" + getCompare(caseDef.opType, caseDef.format, "idhashFmt", "iFmt") + ") {\n"
+ " " + fmt + " subsetResult = " + getOpTypeName(caseDef.opType) + "(data[gl_SubgroupInvocationID]);\n"
+ " tempResult |= " + getCompare(caseDef.opType, caseDef.format, "partitionedResult", "subsetResult") + " ? (0x4u << N) : 0u;\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ // tests in flow control:
+ " if (1u == (gl_SubgroupInvocationID % 2u)) {\n"
+ " for (uint N = 1u; N < 7u; ++N) {\n"
+ " " + fmt + " idhashFmt = " + fmt + "(" + idhash + ");\n"
+ " uvec4 partitionBallot = subgroupPartitionNV(idhashFmt) & mask;\n"
+ " " + fmt + " partitionedResult = " + getOpTypeNamePartitioned(caseDef.opType) + "(data[gl_SubgroupInvocationID], partitionBallot);\n"
+ " for (uint i = 0u; i < N; ++i) {\n"
+ " " + fmt + " iFmt = " + fmt + "(i);\n"
+ " if (" + getCompare(caseDef.opType, caseDef.format, "idhashFmt", "iFmt") + ") {\n"
+ " " + fmt + " subsetResult = " + getOpTypeName(caseDef.opType) + "(data[gl_SubgroupInvocationID]);\n"
+ " tempResult |= " + getCompare(caseDef.opType, caseDef.format, "partitionedResult", "subsetResult") + " ? (0x20000u << N) : 0u;\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " } else {\n"
+ " tempResult |= 0xFC0000u;\n"
+ " }\n"
+ ;
+
+ return bdy;
+}
+
+void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ std::ostringstream bdy;
+
+ subgroups::setFragmentShaderFrameBuffer(programCollection);
+
+ if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ subgroups::setVertexShaderFrameBuffer(programCollection);
+
+ bdy << getTestString(caseDef);
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream vertexSrc;
+ vertexSrc << "${VERSION_DECL}\n"
+ << "#extension GL_NV_shader_subgroup_partitioned: enable\n"
+ << "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(location = 0) in highp vec4 in_position;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "layout(binding = 0, std140) uniform Buffer0\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec4 mask = subgroupBallot(true);\n"
+ << bdy.str()
+ << " out_color = float(tempResult);\n"
+ << " gl_Position = in_position;\n"
+ << " gl_PointSize = 1.0f;\n"
+ << "}\n";
+ programCollection.add("vert") << glu::VertexSource(vertexSrc.str());
+ }
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream geometry;
+
+ geometry << "${VERSION_DECL}\n"
+ << "#extension GL_NV_shader_subgroup_partitioned: enable\n"
+ << "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(points) in;\n"
+ << "layout(points, max_vertices = 1) out;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "layout(binding = 0, std140) uniform Buffer0\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec4 mask = subgroupBallot(true);\n"
+ << bdy.str()
+ << " out_color = float(tempResult);\n"
+ << " gl_Position = gl_in[0].gl_Position;\n"
+ << " EmitVertex();\n"
+ << " EndPrimitive();\n"
+ << "}\n";
+
+ programCollection.add("geometry") << glu::GeometrySource(geometry.str());
+ }
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream controlSource;
+ controlSource << "${VERSION_DECL}\n"
+ << "#extension GL_NV_shader_subgroup_partitioned: enable\n"
+ << "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(vertices = 2) out;\n"
+ << "layout(location = 0) out float out_color[];\n"
+ << "layout(binding = 0, std140) uniform Buffer0\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " if (gl_InvocationID == 0)\n"
+ <<" {\n"
+ << " gl_TessLevelOuter[0] = 1.0f;\n"
+ << " gl_TessLevelOuter[1] = 1.0f;\n"
+ << " }\n"
+ << " uvec4 mask = subgroupBallot(true);\n"
+ << bdy.str()
+ << " out_color[gl_InvocationID] = float(tempResult);"
+ << " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ << "}\n";
+
+
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSource.str());
+ subgroups::setTesEvalShaderFrameBuffer(programCollection);
+ }
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ {
+
+ std::ostringstream evaluationSource;
+ evaluationSource << "${VERSION_DECL}\n"
+ << "#extension GL_NV_shader_subgroup_partitioned: enable\n"
+ << "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(isolines, equal_spacing, ccw ) in;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "layout(binding = 0, std140) uniform Buffer0\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec4 mask = subgroupBallot(true);\n"
+ << bdy.str()
+ << " out_color = float(tempResult);\n"
+ << " gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
+ << "}\n";
+
+ subgroups::setTesCtrlShaderFrameBuffer(programCollection);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
+ }
+ else
+ {
+ DE_FATAL("Unsupported shader stage");
+ }
+}
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ const string bdy = getTestString(caseDef);
+
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream src;
+
+ src << "${VERSION_DECL}\n"
+ << "#extension GL_NV_shader_subgroup_partitioned: enable\n"
+ << "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Buffer0\n"
+ << "{\n"
+ << " uint result[];\n"
+ << "};\n"
+ << "layout(binding = 1, std430) buffer Buffer1\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+ << " highp uint offset = globalSize.x * ((globalSize.y * "
+ "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+ "gl_GlobalInvocationID.x;\n"
+ << " uvec4 mask = subgroupBallot(true);\n"
+ << bdy
+ << " result[offset] = tempResult;\n"
+ << "}\n";
+
+ programCollection.add("comp") << glu::ComputeSource(src.str());
+ }
+ else
+ {
+ {
+ const std::string vertex =
+ "${VERSION_DECL}\n"
+ "#extension GL_NV_shader_subgroup_partitioned: enable\n"
+ "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(binding = 0, std430) buffer Buffer0\n"
+ "{\n"
+ " uint result[];\n"
+ "} b0;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " uvec4 mask = subgroupBallot(true);\n"
+ + bdy+
+ " b0.result[gl_VertexID] = tempResult;\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " float pixelPosition = pixelSize/2.0f - 1.0f;\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_PointSize = 1.0f;\n"
+ "}\n";
+ programCollection.add("vert") << glu::VertexSource(vertex);
+ }
+
+ {
+ const std::string tesc =
+ "${VERSION_DECL}\n"
+ "#extension GL_NV_shader_subgroup_partitioned: enable\n"
+ "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(vertices=1) out;\n"
+ "layout(binding = 1, std430) buffer Buffer1\n"
+ "{\n"
+ " uint result[];\n"
+ "} b1;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " uvec4 mask = subgroupBallot(true);\n"
+ + bdy +
+ " b1.result[gl_PrimitiveID] = tempResult;\n"
+ " if (gl_InvocationID == 0)\n"
+ " {\n"
+ " gl_TessLevelOuter[0] = 1.0f;\n"
+ " gl_TessLevelOuter[1] = 1.0f;\n"
+ " }\n"
+ " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ "}\n";
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc);
+ }
+
+ {
+ const std::string tese =
+ "${VERSION_DECL}\n"
+ "#extension GL_NV_shader_subgroup_partitioned: enable\n"
+ "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(isolines) in;\n"
+ "layout(binding = 2, std430) buffer Buffer2\n"
+ "{\n"
+ " uint result[];\n"
+ "} b2;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " uvec4 mask = subgroupBallot(true);\n"
+ + bdy +
+ " b2.result[gl_PrimitiveID * 2 + int(gl_TessCoord.x + 0.5)] = tempResult;\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
+ "}\n";
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese);
+ }
+
+ {
+ const std::string geometry =
+ // version added by addGeometryShadersFromTemplate
+ "#extension GL_NV_shader_subgroup_partitioned: enable\n"
+ "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(${TOPOLOGY}) in;\n"
+ "layout(points, max_vertices = 1) out;\n"
+ "layout(binding = 3, std430) buffer Buffer3\n"
+ "{\n"
+ " uint result[];\n"
+ "} b3;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " uvec4 mask = subgroupBallot(true);\n"
+ + bdy +
+ " b3.result[gl_PrimitiveIDIn] = tempResult;\n"
+ " gl_Position = gl_in[0].gl_Position;\n"
+ " EmitVertex();\n"
+ " EndPrimitive();\n"
+ "}\n";
+ subgroups::addGeometryShadersFromTemplate(geometry, programCollection);
+ }
+
+ {
+ const std::string fragment =
+ "${VERSION_DECL}\n"
+ "#extension GL_NV_shader_subgroup_partitioned: enable\n"
+ "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "precision highp int;\n"
+ "precision highp float;\n"
+ "layout(location = 0) out uint result;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
+ "};\n"
+ "void main (void)\n"
+ "{\n"
+ " uvec4 mask = subgroupBallot(true);\n"
+ + bdy +
+ " result = tempResult;\n"
+ "}\n";
+ programCollection.add("fragment") << glu::FragmentSource(fragment);
+ }
+ subgroups::addNoSubgroupShader(programCollection);
+ }
+}
+
+void supportedCheck (Context& context, CaseDefinition caseDef)
+{
+ if (!subgroups::isSubgroupSupported(context))
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported");
+
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_PARTITIONED_BIT_NV))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup partitioned operations");
+ }
+
+ if (subgroups::isDoubleFormat(caseDef.format) &&
+ !subgroups::isDoubleSupportedForDevice(context))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
+ }
+}
+
+tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
+{
+ if (!subgroups::areSubgroupOperationsSupportedForStage(
+ context, caseDef.shaderStage))
+ {
+ if (subgroups::areSubgroupOperationsRequiredForStage(
+ caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ else
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+ }
+ }
+
+ subgroups::SSBOData inputData;
+ inputData.format = caseDef.format;
+ inputData.layout = subgroups::SSBOData::LayoutStd140;
+ inputData.numElements = subgroups::maxSupportedSubgroupSize();
+ inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData.binding = 0u;
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ return subgroups::makeVertexFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ return subgroups::makeGeometryFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_CONTROL_BIT);
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_EVALUATION_BIT);
+ else
+ TCU_THROW(InternalError, "Unhandled shader stage");
+}
+
+bool checkShaderStages (Context& context, const CaseDefinition& caseDef)
+{
+ if (!subgroups::areSubgroupOperationsSupportedForStage(
+ context, caseDef.shaderStage))
+ {
+ if (subgroups::areSubgroupOperationsRequiredForStage(
+ caseDef.shaderStage))
+ {
+ return false;
+ }
+ else
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+ }
+ }
+ return true;
+}
+
+tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+{
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ if(!checkShaderStages(context,caseDef))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ subgroups::SSBOData inputData;
+ inputData.format = caseDef.format;
+ inputData.layout = subgroups::SSBOData::LayoutStd430;
+ inputData.numElements = subgroups::maxSupportedSubgroupSize();
+ inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData.binding = 1u;
+
+ return subgroups::makeComputeTest(context, FORMAT_R32_UINT, &inputData, 1, checkComputeStage);
+ }
+ else
+ {
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
+
+ ShaderStageFlags stages = (ShaderStageFlags)(caseDef.shaderStage & supportedStages);
+
+ if ( SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ {
+ if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0)
+ TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+ else
+ stages = SHADER_STAGE_FRAGMENT_BIT;
+ }
+
+ if ((ShaderStageFlags)0u == stages)
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
+
+ subgroups::SSBOData inputData;
+ inputData.format = caseDef.format;
+ inputData.layout = subgroups::SSBOData::LayoutStd430;
+ inputData.numElements = subgroups::maxSupportedSubgroupSize();
+ inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData.binding = 4u;
+ inputData.stages = stages;
+
+ return subgroups::allStages(context, FORMAT_R32_UINT, &inputData,
+ 1, checkVertexPipelineStages, stages);
+ }
+}
+}
+
+deqp::TestCaseGroup* createSubgroupsPartitionedTests(deqp::Context& testCtx)
+{
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
+ testCtx, "graphics", "Subgroup partitioned category tests: graphics"));
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
+ testCtx, "compute", "Subgroup partitioned category tests: compute"));
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
+ testCtx, "framebuffer", "Subgroup partitioned category tests: framebuffer"));
+
+
+ const ShaderStageFlags stages[] =
+ {
+ SHADER_STAGE_VERTEX_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT,
+ };
+
+ const Format formats[] =
+ {
+ FORMAT_R32_SINT, FORMAT_R32G32_SINT, FORMAT_R32G32B32_SINT,
+ FORMAT_R32G32B32A32_SINT, FORMAT_R32_UINT, FORMAT_R32G32_UINT,
+ FORMAT_R32G32B32_UINT, FORMAT_R32G32B32A32_UINT,
+ FORMAT_R32_SFLOAT, FORMAT_R32G32_SFLOAT,
+ FORMAT_R32G32B32_SFLOAT, FORMAT_R32G32B32A32_SFLOAT,
+ FORMAT_R64_SFLOAT, FORMAT_R64G64_SFLOAT,
+ FORMAT_R64G64B64_SFLOAT, FORMAT_R64G64B64A64_SFLOAT,
+ FORMAT_R32_BOOL, FORMAT_R32G32_BOOL,
+ FORMAT_R32G32B32_BOOL, FORMAT_R32G32B32A32_BOOL,
+ };
+
+ for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
+ {
+ const Format format = formats[formatIndex];
+
+ for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
+ {
+ bool isBool = false;
+ bool isFloat = false;
+
+ switch (format)
+ {
+ default:
+ break;
+ case FORMAT_R32_SFLOAT:
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
+ isFloat = true;
+ break;
+ case FORMAT_R32_BOOL:
+ case FORMAT_R32G32_BOOL:
+ case FORMAT_R32G32B32_BOOL:
+ case FORMAT_R32G32B32A32_BOOL:
+ isBool = true;
+ break;
+ }
+
+ bool isBitwiseOp = false;
+
+ switch (opTypeIndex)
+ {
+ default:
+ break;
+ case OPTYPE_AND:
+ case OPTYPE_INCLUSIVE_AND:
+ case OPTYPE_EXCLUSIVE_AND:
+ case OPTYPE_OR:
+ case OPTYPE_INCLUSIVE_OR:
+ case OPTYPE_EXCLUSIVE_OR:
+ case OPTYPE_XOR:
+ case OPTYPE_INCLUSIVE_XOR:
+ case OPTYPE_EXCLUSIVE_XOR:
+ isBitwiseOp = true;
+ break;
+ }
+
+ if (isFloat && isBitwiseOp)
+ {
+ // Skip float with bitwise category.
+ continue;
+ }
+
+ if (isBool && !isBitwiseOp)
+ {
+ // Skip bool when its not the bitwise category.
+ continue;
+ }
+ const std::string name = de::toLower(getOpTypeName(opTypeIndex)) + "_" +
+ subgroups::getFormatNameForGLSL(format);
+
+ {
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_COMPUTE_BIT, format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(),
+ name, "", supportedCheck, initPrograms, test, caseDef);
+ }
+
+ {
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_ALL_GRAPHICS, format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(),
+ name, "", supportedCheck, initPrograms, test, caseDef);
+ }
+
+ for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+ {
+ const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex], format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(),
+ name + "_" + getShaderStageName(caseDef.shaderStage), "",
+ supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
+ }
+ }
+ }
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
+ testCtx, "partitioned", "NV_shader_subgroup_partitioned category tests"));
+
+ group->addChild(graphicGroup.release());
+ group->addChild(computeGroup.release());
+ group->addChild(framebufferGroup.release());
+
+ return group.release();
+}
+
+} // subgroups
+} // glc
+
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsPartitionedTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsPartitionedTests.hpp
new file mode 100755
index 0000000..8102d1d
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsPartitionedTests.hpp
@@ -0,0 +1,41 @@
+#ifndef _GLCSUBGROUPSPARTITIONEDTESTS_HPP
+#define _GLCSUBGROUPSPARTITIONEDTESTS_HPP
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2018-2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "glcTestCase.hpp"
+
+namespace glc
+{
+namespace subgroups
+{
+
+deqp::TestCaseGroup* createSubgroupsPartitionedTests(deqp::Context& testCtx);
+
+} // subgroups
+} // glc
+
+#endif // _GLCSUBGROUPSPARTITIONEDTESTS_HPP
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsQuadTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsQuadTests.cpp
new file mode 100755
index 0000000..7919df7
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsQuadTests.cpp
@@ -0,0 +1,746 @@
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "glcSubgroupsQuadTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+
+using namespace tcu;
+using namespace std;
+
+namespace glc
+{
+namespace subgroups
+{
+namespace
+{
+enum OpType
+{
+ OPTYPE_QUAD_BROADCAST = 0,
+ OPTYPE_QUAD_SWAP_HORIZONTAL,
+ OPTYPE_QUAD_SWAP_VERTICAL,
+ OPTYPE_QUAD_SWAP_DIAGONAL,
+ OPTYPE_LAST
+};
+
+static bool checkVertexPipelineStages(std::vector<const void*> datas,
+ deUint32 width, deUint32)
+{
+ return glc::subgroups::check(datas, width, 1);
+}
+
+static bool checkComputeStage(std::vector<const void*> datas,
+ const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+ deUint32)
+{
+ return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, 1);
+}
+
+std::string getOpTypeName(int opType)
+{
+ switch (opType)
+ {
+ default:
+ DE_FATAL("Unsupported op type");
+ return "";
+ case OPTYPE_QUAD_BROADCAST:
+ return "subgroupQuadBroadcast";
+ case OPTYPE_QUAD_SWAP_HORIZONTAL:
+ return "subgroupQuadSwapHorizontal";
+ case OPTYPE_QUAD_SWAP_VERTICAL:
+ return "subgroupQuadSwapVertical";
+ case OPTYPE_QUAD_SWAP_DIAGONAL:
+ return "subgroupQuadSwapDiagonal";
+ }
+}
+
+struct CaseDefinition
+{
+ int opType;
+ ShaderStageFlags shaderStage;
+ Format format;
+ int direction;
+};
+
+void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ std::string swapTable[OPTYPE_LAST];
+
+ subgroups::setFragmentShaderFrameBuffer(programCollection);
+
+ if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ subgroups::setVertexShaderFrameBuffer(programCollection);
+
+ swapTable[OPTYPE_QUAD_BROADCAST] = "";
+ swapTable[OPTYPE_QUAD_SWAP_HORIZONTAL] = " const uint swapTable[4] = uint[](1u, 0u, 3u, 2u);\n";
+ swapTable[OPTYPE_QUAD_SWAP_VERTICAL] = " const uint swapTable[4] = uint[](2u, 3u, 0u, 1u);\n";
+ swapTable[OPTYPE_QUAD_SWAP_DIAGONAL] = " const uint swapTable[4] = uint[](3u, 2u, 1u, 0u);\n";
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream vertexSrc;
+ vertexSrc << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_quad: enable\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(location = 0) in highp vec4 in_position;\n"
+ << "layout(location = 0) out float result;\n"
+ << "layout(binding = 0, std140) uniform Buffer0\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec4 mask = subgroupBallot(true);\n"
+ << swapTable[caseDef.opType];
+
+ if (OPTYPE_QUAD_BROADCAST == caseDef.opType)
+ {
+ vertexSrc << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+ << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID], " << caseDef.direction << "u);\n"
+ << " uint otherID = (gl_SubgroupInvocationID & ~0x3u) + " << caseDef.direction << "u;\n";
+ }
+ else
+ {
+ vertexSrc << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+ << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID]);\n"
+ << " uint otherID = (gl_SubgroupInvocationID & ~0x3u) + swapTable[gl_SubgroupInvocationID & 0x3u];\n";
+ }
+
+ vertexSrc << " if (subgroupBallotBitExtract(mask, otherID))\n"
+ << " {\n"
+ << " result = (op == data[otherID]) ? 1.0f : 0.0f;\n"
+ << " }\n"
+ << " else\n"
+ << " {\n"
+ << " result = 1.0f;\n" // Invocation we read from was inactive, so we can't verify results!
+ << " }\n"
+ << " gl_Position = in_position;\n"
+ << " gl_PointSize = 1.0f;\n"
+ << "}\n";
+ programCollection.add("vert") << glu::VertexSource(vertexSrc.str());
+ }
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream geometry;
+
+ geometry << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_quad: enable\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(points) in;\n"
+ << "layout(points, max_vertices = 1) out;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "layout(binding = 0, std140) uniform Buffer0\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec4 mask = subgroupBallot(true);\n"
+ << swapTable[caseDef.opType];
+
+ if (OPTYPE_QUAD_BROADCAST == caseDef.opType)
+ {
+ geometry << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+ << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID], " << caseDef.direction << "u);\n"
+ << " uint otherID = (gl_SubgroupInvocationID & ~0x3u) + " << caseDef.direction << "u;\n";
+ }
+ else
+ {
+ geometry << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+ << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID]);\n"
+ << " uint otherID = (gl_SubgroupInvocationID & ~0x3u) + swapTable[gl_SubgroupInvocationID & 0x3u];\n";
+ }
+
+ geometry << " if (subgroupBallotBitExtract(mask, otherID))\n"
+ << " {\n"
+ << " out_color = (op == data[otherID]) ? 1.0 : 0.0;\n"
+ << " }\n"
+ << " else\n"
+ << " {\n"
+ << " out_color = 1.0;\n" // Invocation we read from was inactive, so we can't verify results!
+ << " }\n"
+ << " gl_Position = gl_in[0].gl_Position;\n"
+ << " EmitVertex();\n"
+ << " EndPrimitive();\n"
+ << "}\n";
+
+ programCollection.add("geometry") << glu::GeometrySource(geometry.str());
+ }
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream controlSource;
+
+ controlSource << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_quad: enable\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(vertices = 2) out;\n"
+ << "layout(location = 0) out float out_color[];\n"
+ << "layout(binding = 0, std140) uniform Buffer0\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " if (gl_InvocationID == 0)\n"
+ <<" {\n"
+ << " gl_TessLevelOuter[0] = 1.0f;\n"
+ << " gl_TessLevelOuter[1] = 1.0f;\n"
+ << " }\n"
+ << " uvec4 mask = subgroupBallot(true);\n"
+ << swapTable[caseDef.opType];
+
+ if (OPTYPE_QUAD_BROADCAST == caseDef.opType)
+ {
+ controlSource << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+ << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID], " << caseDef.direction << "u);\n"
+ << " uint otherID = (gl_SubgroupInvocationID & ~0x3u) + " << caseDef.direction << "u;\n";
+ }
+ else
+ {
+ controlSource << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+ << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID]);\n"
+ << " uint otherID = (gl_SubgroupInvocationID & ~0x3u) + swapTable[gl_SubgroupInvocationID & 0x3u];\n";
+ }
+
+ controlSource << " if (subgroupBallotBitExtract(mask, otherID))\n"
+ << " {\n"
+ << " out_color[gl_InvocationID] = (op == data[otherID]) ? 1.0 : 0.0;\n"
+ << " }\n"
+ << " else\n"
+ << " {\n"
+ << " out_color[gl_InvocationID] = 1.0; \n"// Invocation we read from was inactive, so we can't verify results!
+ << " }\n"
+ << " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ << "}\n";
+
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSource.str());
+ subgroups::setTesEvalShaderFrameBuffer(programCollection);
+ }
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ {
+ ostringstream evaluationSource;
+ evaluationSource << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_quad: enable\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(isolines, equal_spacing, ccw ) in;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "layout(binding = 0, std140) uniform Buffer0\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec4 mask = subgroupBallot(true);\n"
+ << swapTable[caseDef.opType];
+
+ if (OPTYPE_QUAD_BROADCAST == caseDef.opType)
+ {
+ evaluationSource << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+ << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID], " << caseDef.direction << "u);\n"
+ << " uint otherID = (gl_SubgroupInvocationID & ~0x3u) + " << caseDef.direction << "u;\n";
+ }
+ else
+ {
+ evaluationSource << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+ << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID]);\n"
+ << " uint otherID = (gl_SubgroupInvocationID & ~0x3u) + swapTable[gl_SubgroupInvocationID & 0x3u];\n";
+ }
+
+ evaluationSource << " if (subgroupBallotBitExtract(mask, otherID))\n"
+ << " {\n"
+ << " out_color = (op == data[otherID]) ? 1.0 : 0.0;\n"
+ << " }\n"
+ << " else\n"
+ << " {\n"
+ << " out_color = 1.0;\n" // Invocation we read from was inactive, so we can't verify results!
+ << " }\n"
+ << " gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
+ << "}\n";
+
+ subgroups::setTesCtrlShaderFrameBuffer(programCollection);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
+ }
+ else
+ {
+ DE_FATAL("Unsupported shader stage");
+ }
+}
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ std::string swapTable[OPTYPE_LAST];
+ swapTable[OPTYPE_QUAD_BROADCAST] = "";
+ swapTable[OPTYPE_QUAD_SWAP_HORIZONTAL] = " const uint swapTable[4] = uint[](1u, 0u, 3u, 2u);\n";
+ swapTable[OPTYPE_QUAD_SWAP_VERTICAL] = " const uint swapTable[4] = uint[](2u, 3u, 0u, 1u);\n";
+ swapTable[OPTYPE_QUAD_SWAP_DIAGONAL] = " const uint swapTable[4] = uint[](3u, 2u, 1u, 0u);\n";
+
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream src;
+
+ src << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_quad: enable\n"
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Buffer0\n"
+ << "{\n"
+ << " uint result[];\n"
+ << "};\n"
+ << "layout(binding = 1, std430) buffer Buffer1\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+ << " highp uint offset = globalSize.x * ((globalSize.y * "
+ "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+ "gl_GlobalInvocationID.x;\n"
+ << " uvec4 mask = subgroupBallot(true);\n"
+ << swapTable[caseDef.opType];
+
+
+ if (OPTYPE_QUAD_BROADCAST == caseDef.opType)
+ {
+ src << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+ << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID], " << caseDef.direction << "u);\n"
+ << " uint otherID = (gl_SubgroupInvocationID & ~0x3u) + " << caseDef.direction << "u;\n";
+ }
+ else
+ {
+ src << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+ << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID]);\n"
+ << " uint otherID = (gl_SubgroupInvocationID & ~0x3u) + swapTable[gl_SubgroupInvocationID & 0x3u];\n";
+ }
+
+ src << " if (subgroupBallotBitExtract(mask, otherID))\n"
+ << " {\n"
+ << " result[offset] = (op == data[otherID]) ? 1u : 0u;\n"
+ << " }\n"
+ << " else\n"
+ << " {\n"
+ << " result[offset] = 1u; // Invocation we read from was inactive, so we can't verify results!\n"
+ << " }\n"
+ << "}\n";
+
+ programCollection.add("comp") << glu::ComputeSource(src.str());
+ }
+ else
+ {
+ std::ostringstream src;
+ if (OPTYPE_QUAD_BROADCAST == caseDef.opType)
+ {
+ src << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+ << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID], " << caseDef.direction << "u);\n"
+ << " uint otherID = (gl_SubgroupInvocationID & ~0x3u) + " << caseDef.direction << "u;\n";
+ }
+ else
+ {
+ src << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+ << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID]);\n"
+ << " uint otherID = (gl_SubgroupInvocationID & ~0x3u) + swapTable[gl_SubgroupInvocationID & 0x3u];\n";
+ }
+ const string sourceType = src.str();
+
+ {
+ const string vertex =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_quad: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(binding = 0, std430) buffer Buffer0\n"
+ "{\n"
+ " uint result[];\n"
+ "} b0;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " uvec4 mask = subgroupBallot(true);\n"
+ + swapTable[caseDef.opType]
+ + sourceType +
+ " if (subgroupBallotBitExtract(mask, otherID))\n"
+ " {\n"
+ " b0.result[gl_VertexID] = (op == data[otherID]) ? 1u : 0u;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " b0.result[gl_VertexID] = 1u; // Invocation we read from was inactive, so we can't verify results!\n"
+ " }\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " float pixelPosition = pixelSize/2.0f - 1.0f;\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ "}\n";
+ programCollection.add("vert") << glu::VertexSource(vertex);
+ }
+
+ {
+ const string tesc =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_quad: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(vertices=1) out;\n"
+ "layout(binding = 1, std430) buffer Buffer1\n"
+ "{\n"
+ " uint result[];\n"
+ "} b1;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " uvec4 mask = subgroupBallot(true);\n"
+ + swapTable[caseDef.opType]
+ + sourceType +
+ " if (subgroupBallotBitExtract(mask, otherID))\n"
+ " {\n"
+ " b1.result[gl_PrimitiveID] = (op == data[otherID]) ? 1u : 0u;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " b1.result[gl_PrimitiveID] = 1u; // Invocation we read from was inactive, so we can't verify results!\n"
+ " }\n"
+ " if (gl_InvocationID == 0)\n"
+ " {\n"
+ " gl_TessLevelOuter[0] = 1.0f;\n"
+ " gl_TessLevelOuter[1] = 1.0f;\n"
+ " }\n"
+ " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ "}\n";
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc);
+ }
+
+ {
+ const string tese =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_quad: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(isolines) in;\n"
+ "layout(binding = 2, std430) buffer Buffer2\n"
+ "{\n"
+ " uint result[];\n"
+ "} b2;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " uvec4 mask = subgroupBallot(true);\n"
+ + swapTable[caseDef.opType]
+ + sourceType +
+ " if (subgroupBallotBitExtract(mask, otherID))\n"
+ " {\n"
+ " b2.result[gl_PrimitiveID * 2 + int(gl_TessCoord.x + 0.5)] = (op == data[otherID]) ? 1u : 0u;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " b2.result[gl_PrimitiveID * 2 + int(gl_TessCoord.x + 0.5)] = 1u; // Invocation we read from was inactive, so we can't verify results!\n"
+ " }\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
+ "}\n";
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese);
+ }
+
+ {
+ const string geometry =
+ // version added by addGeometryShadersFromTemplate
+ "#extension GL_KHR_shader_subgroup_quad: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(${TOPOLOGY}) in;\n"
+ "layout(points, max_vertices = 1) out;\n"
+ "layout(binding = 3, std430) buffer Buffer3\n"
+ "{\n"
+ " uint result[];\n"
+ "} b3;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " uvec4 mask = subgroupBallot(true);\n"
+ + swapTable[caseDef.opType]
+ + sourceType +
+ " if (subgroupBallotBitExtract(mask, otherID))\n"
+ " {\n"
+ " b3.result[gl_PrimitiveIDIn] = (op == data[otherID]) ? 1u : 0u;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " b3.result[gl_PrimitiveIDIn] = 1u; // Invocation we read from was inactive, so we can't verify results!\n"
+ " }\n"
+ " gl_Position = gl_in[0].gl_Position;\n"
+ " EmitVertex();\n"
+ " EndPrimitive();\n"
+ "}\n";
+ subgroups::addGeometryShadersFromTemplate(geometry, programCollection);
+ }
+
+ {
+ const string fragment =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_quad: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "precision highp int;\n"
+ "precision highp float;\n"
+ "layout(location = 0) out uint result;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
+ "};\n"
+ "void main (void)\n"
+ "{\n"
+ " uvec4 mask = subgroupBallot(true);\n"
+ + swapTable[caseDef.opType]
+ + sourceType +
+ " if (subgroupBallotBitExtract(mask, otherID))\n"
+ " {\n"
+ " result = (op == data[otherID]) ? 1u : 0u;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " result = 1u; // Invocation we read from was inactive, so we can't verify results!\n"
+ " }\n"
+ "}\n";
+ programCollection.add("fragment") << glu::FragmentSource(fragment);
+ }
+ subgroups::addNoSubgroupShader(programCollection);
+ }
+}
+
+void supportedCheck (Context& context, CaseDefinition caseDef)
+{
+ if (!subgroups::isSubgroupSupported(context))
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported");
+
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_QUAD_BIT))
+ TCU_THROW(NotSupportedError, "Device does not support subgroup quad operations");
+
+
+ if (subgroups::isDoubleFormat(caseDef.format) &&
+ !subgroups::isDoubleSupportedForDevice(context))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
+ }
+}
+
+tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
+{
+ if (!subgroups::areSubgroupOperationsSupportedForStage(
+ context, caseDef.shaderStage))
+ {
+ if (subgroups::areSubgroupOperationsRequiredForStage(
+ caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ else
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+ }
+ }
+
+ subgroups::SSBOData inputData;
+ inputData.format = caseDef.format;
+ inputData.layout = subgroups::SSBOData::LayoutStd140;
+ inputData.numElements = subgroups::maxSupportedSubgroupSize();
+ inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData.binding = 0u;
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ return subgroups::makeVertexFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ return subgroups::makeGeometryFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_CONTROL_BIT);
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_EVALUATION_BIT);
+ else
+ TCU_THROW(InternalError, "Unhandled shader stage");
+}
+
+
+tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+{
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ if (!subgroups::areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ subgroups::SSBOData inputData;
+ inputData.format = caseDef.format;
+ inputData.layout = subgroups::SSBOData::LayoutStd430;
+ inputData.numElements = subgroups::maxSupportedSubgroupSize();
+ inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData.binding = 1u;
+
+ return subgroups::makeComputeTest(context, FORMAT_R32_UINT, &inputData, 1, checkComputeStage);
+ }
+ else
+ {
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
+
+ ShaderStageFlags stages = (ShaderStageFlags)(caseDef.shaderStage & supportedStages);
+
+ if (SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ {
+ if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0)
+ TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+ else
+ stages = SHADER_STAGE_FRAGMENT_BIT;
+ }
+
+ if ((ShaderStageFlags)0u == stages)
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
+
+ subgroups::SSBOData inputData;
+ inputData.format = caseDef.format;
+ inputData.layout = subgroups::SSBOData::LayoutStd430;
+ inputData.numElements = subgroups::maxSupportedSubgroupSize();
+ inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData.binding = 4u;
+ inputData.stages = stages;
+
+ return subgroups::allStages(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, stages);
+ }
+}
+}
+
+deqp::TestCaseGroup* createSubgroupsQuadTests(deqp::Context& testCtx)
+{
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
+ testCtx, "graphics", "Subgroup arithmetic category tests: graphics"));
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
+ testCtx, "compute", "Subgroup arithmetic category tests: compute"));
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
+ testCtx, "framebuffer", "Subgroup arithmetic category tests: framebuffer"));
+
+ const Format formats[] =
+ {
+ FORMAT_R32_SINT, FORMAT_R32G32_SINT, FORMAT_R32G32B32_SINT,
+ FORMAT_R32G32B32A32_SINT, FORMAT_R32_UINT, FORMAT_R32G32_UINT,
+ FORMAT_R32G32B32_UINT, FORMAT_R32G32B32A32_UINT,
+ FORMAT_R32_SFLOAT, FORMAT_R32G32_SFLOAT,
+ FORMAT_R32G32B32_SFLOAT, FORMAT_R32G32B32A32_SFLOAT,
+ FORMAT_R64_SFLOAT, FORMAT_R64G64_SFLOAT,
+ FORMAT_R64G64B64_SFLOAT, FORMAT_R64G64B64A64_SFLOAT,
+ FORMAT_R32_BOOL, FORMAT_R32G32_BOOL,
+ FORMAT_R32G32B32_BOOL, FORMAT_R32G32B32A32_BOOL,
+ };
+
+ const ShaderStageFlags stages[] =
+ {
+ SHADER_STAGE_VERTEX_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT,
+ };
+
+ for (int direction = 0; direction < 4; ++direction)
+ {
+ for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
+ {
+ const Format format = formats[formatIndex];
+
+ for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
+ {
+ const std::string op = de::toLower(getOpTypeName(opTypeIndex));
+ std::ostringstream name;
+ name << de::toLower(op);
+
+ if (OPTYPE_QUAD_BROADCAST == opTypeIndex)
+ {
+ name << "_" << direction;
+ }
+ else
+ {
+ if (0 != direction)
+ {
+ // We don't need direction for swap operations.
+ continue;
+ }
+ }
+
+ name << "_" << subgroups::getFormatNameForGLSL(format);
+
+ {
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_COMPUTE_BIT, format, direction};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(), name.str(), "", supportedCheck, initPrograms, test, caseDef);
+ }
+
+ {
+ const CaseDefinition caseDef =
+ {
+ opTypeIndex,
+ SHADER_STAGE_ALL_GRAPHICS,
+ format,
+ direction
+ };
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(), name.str(), "", supportedCheck, initPrograms, test, caseDef);
+ }
+ for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+ {
+ const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex], format, direction};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(), name.str()+"_"+ getShaderStageName(caseDef.shaderStage), "",
+ supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
+ }
+
+ }
+ }
+ }
+
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
+ testCtx, "quad", "Subgroup quad category tests"));
+
+ group->addChild(graphicGroup.release());
+ group->addChild(computeGroup.release());
+ group->addChild(framebufferGroup.release());
+
+ return group.release();
+}
+} // subgroups
+} // glc
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsQuadTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsQuadTests.hpp
new file mode 100644
index 0000000..ec0ab6b
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsQuadTests.hpp
@@ -0,0 +1,41 @@
+#ifndef _GLCSUBGROUPSQUADTESTS_HPP
+#define _GLCSUBGROUPSQUADTESTS_HPP
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "glcTestCase.hpp"
+
+namespace glc
+{
+namespace subgroups
+{
+
+deqp::TestCaseGroup* createSubgroupsQuadTests(deqp::Context& testCtx);
+
+} // subgroups
+} // glc
+
+#endif // _GLCSUBGROUPSQUADTESTS_HPP
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsShapeTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsShapeTests.cpp
new file mode 100755
index 0000000..25b884a
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsShapeTests.cpp
@@ -0,0 +1,586 @@
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "glcSubgroupsShapeTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+
+using namespace tcu;
+using namespace std;
+
+namespace glc
+{
+namespace subgroups
+{
+namespace
+{
+static bool checkVertexPipelineStages(std::vector<const void*> datas,
+ deUint32 width, deUint32)
+{
+ return glc::subgroups::check(datas, width, 1);
+}
+
+static bool checkComputeStage(std::vector<const void*> datas,
+ const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+ deUint32)
+{
+ return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, 1);
+}
+
+enum OpType
+{
+ OPTYPE_CLUSTERED = 0,
+ OPTYPE_QUAD,
+ OPTYPE_LAST
+};
+
+std::string getOpTypeName(int opType)
+{
+ switch (opType)
+ {
+ default:
+ DE_FATAL("Unsupported op type");
+ return "";
+ case OPTYPE_CLUSTERED:
+ return "clustered";
+ case OPTYPE_QUAD:
+ return "quad";
+ }
+}
+
+struct CaseDefinition
+{
+ int opType;
+ ShaderStageFlags shaderStage;
+};
+
+void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ std::ostringstream bdy;
+ std::string extension = (OPTYPE_CLUSTERED == caseDef.opType) ?
+ "#extension GL_KHR_shader_subgroup_clustered: enable\n" :
+ "#extension GL_KHR_shader_subgroup_quad: enable\n";
+
+ subgroups::setFragmentShaderFrameBuffer(programCollection);
+
+ if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ subgroups::setVertexShaderFrameBuffer(programCollection);
+
+ extension += "#extension GL_KHR_shader_subgroup_ballot: enable\n";
+
+ bdy << " uint tempResult = 0x1u;\n"
+ << " uvec4 mask = subgroupBallot(true);\n";
+
+ if (OPTYPE_CLUSTERED == caseDef.opType)
+ {
+ for (deUint32 i = 1; i <= subgroups::maxSupportedSubgroupSize(); i *= 2)
+ {
+ bdy << " if (gl_SubgroupSize >= " << i << "u)\n"
+ << " {\n"
+ << " uvec4 contribution = uvec4(0);\n"
+ << " uint modID = gl_SubgroupInvocationID % 32u;\n"
+ << " switch (gl_SubgroupInvocationID / 32u)\n"
+ << " {\n"
+ << " case 0u: contribution.x = 1u << modID; break;\n"
+ << " case 1u: contribution.y = 1u << modID; break;\n"
+ << " case 2u: contribution.z = 1u << modID; break;\n"
+ << " case 3u: contribution.w = 1u << modID; break;\n"
+ << " }\n"
+ << " uvec4 result = subgroupClusteredOr(contribution, " << i << "u);\n"
+ << " uint rootID = gl_SubgroupInvocationID & ~(" << i - 1 << "u);\n"
+ << " for (uint i = 0u; i < " << i << "u; i++)\n"
+ << " {\n"
+ << " uint nextID = rootID + i;\n"
+ << " if (subgroupBallotBitExtract(mask, nextID) ^^ subgroupBallotBitExtract(result, nextID))\n"
+ << " {\n"
+ << " tempResult = 0u;\n"
+ << " }\n"
+ << " }\n"
+ << " }\n";
+ }
+ }
+ else
+ {
+ bdy << " uint cluster[4] =\n"
+ << " uint[](\n"
+ << " subgroupQuadBroadcast(gl_SubgroupInvocationID, 0u),\n"
+ << " subgroupQuadBroadcast(gl_SubgroupInvocationID, 1u),\n"
+ << " subgroupQuadBroadcast(gl_SubgroupInvocationID, 2u),\n"
+ << " subgroupQuadBroadcast(gl_SubgroupInvocationID, 3u)\n"
+ << " );\n"
+ << " uint rootID = gl_SubgroupInvocationID & ~0x3u;\n"
+ << " for (uint i = 0u; i < 4u; i++)\n"
+ << " {\n"
+ << " uint nextID = rootID + i;\n"
+ << " if (subgroupBallotBitExtract(mask, nextID) && (cluster[i] != nextID))\n"
+ << " {\n"
+ << " tempResult = mask.x;\n"
+ << " }\n"
+ << " }\n";
+ }
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream vertexSrc;
+ vertexSrc << "${VERSION_DECL}\n"
+ << extension
+ << "layout(location = 0) in highp vec4 in_position;\n"
+ << "layout(location = 0) out float result;\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << bdy.str()
+ << " result = float(tempResult);\n"
+ << " gl_Position = in_position;\n"
+ << " gl_PointSize = 1.0f;\n"
+ << "}\n";
+ programCollection.add("vert") << glu::VertexSource(vertexSrc.str());
+ }
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream geometry;
+
+ geometry << "${VERSION_DECL}\n"
+ << extension
+ << "layout(points) in;\n"
+ << "layout(points, max_vertices = 1) out;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << bdy.str()
+ << " out_color = float(tempResult);\n"
+ << " gl_Position = gl_in[0].gl_Position;\n"
+ << " EmitVertex();\n"
+ << " EndPrimitive();\n"
+ << "}\n";
+
+ programCollection.add("geometry") << glu::GeometrySource(geometry.str());
+ }
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream controlSource;
+
+ controlSource << "${VERSION_DECL}\n"
+ << extension
+ << "layout(vertices = 2) out;\n"
+ << "layout(location = 0) out float out_color[];\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " if (gl_InvocationID == 0)\n"
+ <<" {\n"
+ << " gl_TessLevelOuter[0] = 1.0f;\n"
+ << " gl_TessLevelOuter[1] = 1.0f;\n"
+ << " }\n"
+ << bdy.str()
+ << " out_color[gl_InvocationID] = float(tempResult);\n"
+ << " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ << "}\n";
+
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSource.str());
+ subgroups::setTesEvalShaderFrameBuffer(programCollection);
+ }
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream evaluationSource;
+
+ evaluationSource << "${VERSION_DECL}\n"
+ << extension
+ << "layout(isolines, equal_spacing, ccw) in;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "void main (void)\n"
+ << "{\n"
+ << bdy.str()
+ << " out_color = float(tempResult);\n"
+ << " gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
+ << "}\n";
+
+ subgroups::setTesCtrlShaderFrameBuffer(programCollection);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
+ }
+ else
+ {
+ DE_FATAL("Unsupported shader stage");
+ }
+}
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ std::string extension = (OPTYPE_CLUSTERED == caseDef.opType) ?
+ "#extension GL_KHR_shader_subgroup_clustered: enable\n" :
+ "#extension GL_KHR_shader_subgroup_quad: enable\n";
+
+ extension += "#extension GL_KHR_shader_subgroup_ballot: enable\n";
+
+ std::ostringstream bdy;
+
+ bdy << " uint tempResult = 0x1u;\n"
+ << " uvec4 mask = subgroupBallot(true);\n";
+
+ if (OPTYPE_CLUSTERED == caseDef.opType)
+ {
+ for (deUint32 i = 1; i <= subgroups::maxSupportedSubgroupSize(); i *= 2)
+ {
+ bdy << " if (gl_SubgroupSize >= " << i << "u)\n"
+ << " {\n"
+ << " uvec4 contribution = uvec4(0);\n"
+ << " uint modID = gl_SubgroupInvocationID % 32u;\n"
+ << " switch (gl_SubgroupInvocationID / 32u)\n"
+ << " {\n"
+ << " case 0u: contribution.x = 1u << modID; break;\n"
+ << " case 1u: contribution.y = 1u << modID; break;\n"
+ << " case 2u: contribution.z = 1u << modID; break;\n"
+ << " case 3u: contribution.w = 1u << modID; break;\n"
+ << " }\n"
+ << " uvec4 result = subgroupClusteredOr(contribution, " << i << "u);\n"
+ << " uint rootID = gl_SubgroupInvocationID & ~(" << i - 1 << "u);\n"
+ << " for (uint i = 0u; i < " << i << "u; i++)\n"
+ << " {\n"
+ << " uint nextID = rootID + i;\n"
+ << " if (subgroupBallotBitExtract(mask, nextID) ^^ subgroupBallotBitExtract(result, nextID))\n"
+ << " {\n"
+ << " tempResult = 0u;\n"
+ << " }\n"
+ << " }\n"
+ << " }\n";
+ }
+ }
+ else
+ {
+ bdy << " uint cluster[4] =\n"
+ << " uint[](\n"
+ << " subgroupQuadBroadcast(gl_SubgroupInvocationID, 0u),\n"
+ << " subgroupQuadBroadcast(gl_SubgroupInvocationID, 1u),\n"
+ << " subgroupQuadBroadcast(gl_SubgroupInvocationID, 2u),\n"
+ << " subgroupQuadBroadcast(gl_SubgroupInvocationID, 3u)\n"
+ << " );\n"
+ << " uint rootID = gl_SubgroupInvocationID & ~0x3u;\n"
+ << " for (uint i = 0u; i < 4u; i++)\n"
+ << " {\n"
+ << " uint nextID = rootID + i;\n"
+ << " if (subgroupBallotBitExtract(mask, nextID) && (cluster[i] != nextID))\n"
+ << " {\n"
+ << " tempResult = mask.x;\n"
+ << " }\n"
+ << " }\n";
+ }
+
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream src;
+
+ src << "${VERSION_DECL}\n"
+ << extension
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Buffer0\n"
+ << "{\n"
+ << " uint result[];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+ << " highp uint offset = globalSize.x * ((globalSize.y * "
+ "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+ "gl_GlobalInvocationID.x;\n"
+ << bdy.str()
+ << " result[offset] = tempResult;\n"
+ << "}\n";
+
+ programCollection.add("comp") << glu::ComputeSource(src.str());
+ }
+ else
+ {
+ {
+ const string vertex =
+ "${VERSION_DECL}\n"
+ + extension +
+ "layout(binding = 0, std430) buffer Buffer0\n"
+ "{\n"
+ " uint result[];\n"
+ "} b0;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdy.str() +
+ " b0.result[gl_VertexID] = tempResult;\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " float pixelPosition = pixelSize/2.0f - 1.0f;\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ "}\n";
+
+ programCollection.add("vert") << glu::VertexSource(vertex);
+ }
+
+ {
+ const string tesc =
+ "${VERSION_DECL}\n"
+ + extension +
+ "layout(vertices=1) out;\n"
+ "layout(binding = 1, std430) buffer Buffer1\n"
+ "{\n"
+ " uint result[];\n"
+ "} b1;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdy.str() +
+ " b1.result[gl_PrimitiveID] = 1u;\n"
+ " if (gl_InvocationID == 0)\n"
+ " {\n"
+ " gl_TessLevelOuter[0] = 1.0f;\n"
+ " gl_TessLevelOuter[1] = 1.0f;\n"
+ " }\n"
+ " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ "}\n";
+
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc);
+ }
+
+ {
+ const string tese =
+ "${VERSION_DECL}\n"
+ + extension +
+ "layout(isolines) in;\n"
+ "layout(binding = 2, std430) buffer Buffer2\n"
+ "{\n"
+ " uint result[];\n"
+ "} b2;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdy.str() +
+ " b2.result[gl_PrimitiveID * 2 + int(gl_TessCoord.x + 0.5)] = 1u;\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
+ "}\n";
+
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese);
+ }
+
+ {
+ const string geometry =
+ // version added by addGeometryShadersFromTemplate
+ extension +
+ "layout(${TOPOLOGY}) in;\n"
+ "layout(points, max_vertices = 1) out;\n"
+ "layout(binding = 3, std430) buffer Buffer3\n"
+ "{\n"
+ " uint result[];\n"
+ "} b3;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdy.str() +
+ " b3.result[gl_PrimitiveIDIn] = tempResult;\n"
+ " gl_Position = gl_in[0].gl_Position;\n"
+ " EmitVertex();\n"
+ " EndPrimitive();\n"
+ "}\n";
+
+ subgroups::addGeometryShadersFromTemplate(geometry, programCollection);
+ }
+
+ {
+ const string fragment =
+ "${VERSION_DECL}\n"
+ + extension +
+ "precision highp int;\n"
+ "layout(location = 0) out uint result;\n"
+ "void main (void)\n"
+ "{\n"
+ + bdy.str() +
+ " result = tempResult;\n"
+ "}\n";
+
+ programCollection.add("fragment") << glu::FragmentSource(fragment);
+ }
+ subgroups::addNoSubgroupShader(programCollection);
+ }
+}
+
+void supportedCheck (Context& context, CaseDefinition caseDef)
+{
+ if (!subgroups::isSubgroupSupported(context))
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported");
+
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_BALLOT_BIT))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup ballot operations");
+ }
+
+ if (OPTYPE_CLUSTERED == caseDef.opType)
+ {
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_CLUSTERED_BIT))
+ {
+ TCU_THROW(NotSupportedError, "Subgroup shape tests require that clustered operations are supported!");
+ }
+ }
+
+ if (OPTYPE_QUAD == caseDef.opType)
+ {
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_QUAD_BIT))
+ {
+ TCU_THROW(NotSupportedError, "Subgroup shape tests require that quad operations are supported!");
+ }
+ }
+}
+
+tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
+{
+ if (!subgroups::areSubgroupOperationsSupportedForStage(
+ context, caseDef.shaderStage))
+ {
+ if (subgroups::areSubgroupOperationsRequiredForStage(
+ caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ else
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+ }
+ }
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ return subgroups::makeVertexFrameBufferTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ return subgroups::makeGeometryFrameBufferTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages, SHADER_STAGE_TESS_CONTROL_BIT);
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages, SHADER_STAGE_TESS_EVALUATION_BIT);
+ else
+ TCU_THROW(InternalError, "Unhandled shader stage");
+}
+
+
+tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+{
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_BASIC_BIT))
+ {
+ return tcu::TestStatus::fail(
+ "Subgroup feature " +
+ subgroups::getSubgroupFeatureName(SUBGROUP_FEATURE_BASIC_BIT) +
+ " is a required capability!");
+ }
+
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ if (!subgroups::areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ return subgroups::makeComputeTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkComputeStage);
+ }
+ else
+ {
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
+
+ ShaderStageFlags stages = (ShaderStageFlags)(caseDef.shaderStage & supportedStages);
+
+ if (SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ {
+ if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0)
+ TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+ else
+ stages = SHADER_STAGE_FRAGMENT_BIT;
+ }
+
+ if ((ShaderStageFlags)0u == stages)
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
+
+ return subgroups::allStages(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages, stages);
+ }
+}
+}
+
+deqp::TestCaseGroup* createSubgroupsShapeTests(deqp::Context& testCtx)
+{
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
+ testCtx, "graphics", "Subgroup shape category tests: graphics"));
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
+ testCtx, "compute", "Subgroup shape category tests: compute"));
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
+ testCtx, "framebuffer", "Subgroup shape category tests: framebuffer"));
+
+ const ShaderStageFlags stages[] =
+ {
+ SHADER_STAGE_VERTEX_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT,
+ };
+
+ for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
+ {
+ const std::string op = de::toLower(getOpTypeName(opTypeIndex));
+
+ {
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_COMPUTE_BIT};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(), op, "", supportedCheck, initPrograms, test, caseDef);
+
+ }
+
+ {
+ const CaseDefinition caseDef =
+ {
+ opTypeIndex,
+ SHADER_STAGE_ALL_GRAPHICS
+ };
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(),
+ op, "",
+ supportedCheck, initPrograms, test, caseDef);
+ }
+
+ for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+ {
+ const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex]};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(),op + "_" + getShaderStageName(caseDef.shaderStage), "",
+ supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
+ }
+ }
+
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
+ testCtx, "shape", "Subgroup shape category tests"));
+
+ group->addChild(graphicGroup.release());
+ group->addChild(computeGroup.release());
+ group->addChild(framebufferGroup.release());
+
+ return group.release();
+}
+
+} // subgroups
+} // glc
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsShapeTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsShapeTests.hpp
new file mode 100644
index 0000000..4c63484
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsShapeTests.hpp
@@ -0,0 +1,41 @@
+#ifndef _GLCSUBGROUPSSHAPETESTS_HPP
+#define _GLCSUBGROUPSSHAPETESTS_HPP
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "glcTestCase.hpp"
+
+namespace glc
+{
+namespace subgroups
+{
+
+deqp::TestCaseGroup* createSubgroupsShapeTests(deqp::Context& testCtx);
+
+} // subgroups
+} // glc
+
+#endif // _GLCSUBGROUPSSHAPETESTS_HPP
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsShuffleTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsShuffleTests.cpp
new file mode 100755
index 0000000..89f6d3b
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsShuffleTests.cpp
@@ -0,0 +1,659 @@
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "glcSubgroupsShuffleTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+
+using namespace tcu;
+using namespace std;
+
+namespace glc
+{
+namespace subgroups
+{
+namespace
+{
+enum OpType
+{
+ OPTYPE_SHUFFLE = 0,
+ OPTYPE_SHUFFLE_XOR,
+ OPTYPE_SHUFFLE_UP,
+ OPTYPE_SHUFFLE_DOWN,
+ OPTYPE_LAST
+};
+
+static bool checkVertexPipelineStages(std::vector<const void*> datas,
+ deUint32 width, deUint32)
+{
+ return glc::subgroups::check(datas, width, 1);
+}
+
+static bool checkComputeStage(std::vector<const void*> datas,
+ const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+ deUint32)
+{
+ return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, 1);
+}
+
+std::string getOpTypeName(int opType)
+{
+ switch (opType)
+ {
+ default:
+ DE_FATAL("Unsupported op type");
+ return "";
+ case OPTYPE_SHUFFLE:
+ return "subgroupShuffle";
+ case OPTYPE_SHUFFLE_XOR:
+ return "subgroupShuffleXor";
+ case OPTYPE_SHUFFLE_UP:
+ return "subgroupShuffleUp";
+ case OPTYPE_SHUFFLE_DOWN:
+ return "subgroupShuffleDown";
+ }
+}
+
+struct CaseDefinition
+{
+ int opType;
+ ShaderStageFlags shaderStage;
+ Format format;
+};
+
+const std::string to_string(int x) {
+ std::ostringstream oss;
+ oss << x;
+ return oss.str();
+}
+
+const std::string DeclSource(CaseDefinition caseDef, int baseBinding)
+{
+ return
+ "layout(binding = " + to_string(baseBinding) + ", std430) readonly buffer BufferB0\n"
+ "{\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data1[];\n"
+ "};\n"
+ "layout(binding = " + to_string(baseBinding + 1) + ", std430) readonly buffer BufferB1\n"
+ "{\n"
+ " uint data2[];\n"
+ "};\n";
+}
+
+const std::string TestSource(CaseDefinition caseDef)
+{
+ std::string idTable[OPTYPE_LAST];
+ idTable[OPTYPE_SHUFFLE] = "id_in";
+ idTable[OPTYPE_SHUFFLE_XOR] = "gl_SubgroupInvocationID ^ id_in";
+ idTable[OPTYPE_SHUFFLE_UP] = "gl_SubgroupInvocationID - id_in";
+ idTable[OPTYPE_SHUFFLE_DOWN] = "gl_SubgroupInvocationID + id_in";
+
+ const std::string testSource =
+ " uint temp_res;\n"
+ " uvec4 mask = subgroupBallot(true);\n"
+ " uint id_in = data2[gl_SubgroupInvocationID] & (gl_SubgroupSize - 1u);\n"
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " op = "
+ + getOpTypeName(caseDef.opType) + "(data1[gl_SubgroupInvocationID], id_in);\n"
+ " uint id = " + idTable[caseDef.opType] + ";\n"
+ " if ((id < gl_SubgroupSize) && subgroupBallotBitExtract(mask, id))\n"
+ " {\n"
+ " temp_res = (op == data1[id]) ? 1u : 0u;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " temp_res = 1u; // Invocation we read from was inactive, so we can't verify results!\n"
+ " }\n";
+
+ return testSource;
+}
+
+void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ subgroups::setFragmentShaderFrameBuffer(programCollection);
+
+ if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ subgroups::setVertexShaderFrameBuffer(programCollection);
+
+ const std::string extSource =
+ (OPTYPE_SHUFFLE == caseDef.opType || OPTYPE_SHUFFLE_XOR == caseDef.opType) ?
+ "#extension GL_KHR_shader_subgroup_shuffle: enable\n" :
+ "#extension GL_KHR_shader_subgroup_shuffle_relative: enable\n";
+
+ const std::string testSource = TestSource(caseDef);
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream vertexSrc;
+ vertexSrc << "${VERSION_DECL}\n"
+ << extSource
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(location = 0) in highp vec4 in_position;\n"
+ << "layout(location = 0) out float result;\n"
+ << "layout(binding = 0, std140) uniform Buffer0\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "layout(binding = 1, std140) uniform Buffer1\n"
+ << "{\n"
+ << " uint data2[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << testSource
+ << " result = float(temp_res);\n"
+ << " gl_Position = in_position;\n"
+ << " gl_PointSize = 1.0f;\n"
+ << "}\n";
+ programCollection.add("vert") << glu::VertexSource(vertexSrc.str());
+ }
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream geometry;
+
+ geometry << "${VERSION_DECL}\n"
+ << extSource
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(points) in;\n"
+ << "layout(points, max_vertices = 1) out;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "layout(binding = 0, std140) uniform Buffer0\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "layout(binding = 1, std140) uniform Buffer1\n"
+ << "{\n"
+ << " uint data2[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << testSource
+ << " out_color = float(temp_res);\n"
+ << " gl_Position = gl_in[0].gl_Position;\n"
+ << " EmitVertex();\n"
+ << " EndPrimitive();\n"
+ << "}\n";
+
+ programCollection.add("geometry") << glu::GeometrySource(geometry.str());
+ }
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream controlSource;
+
+ controlSource << "${VERSION_DECL}\n"
+ << extSource
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(vertices = 2) out;\n"
+ << "layout(location = 0) out float out_color[];\n"
+ << "layout(binding = 0, std140) uniform Buffer0\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "layout(binding = 1, std140) uniform Buffer1\n"
+ << "{\n"
+ << " uint data2[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " if (gl_InvocationID == 0)\n"
+ <<" {\n"
+ << " gl_TessLevelOuter[0] = 1.0f;\n"
+ << " gl_TessLevelOuter[1] = 1.0f;\n"
+ << " }\n"
+ << testSource
+ << " out_color[gl_InvocationID] = float(temp_res);\n"
+ << " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ << "}\n";
+
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSource.str());
+ subgroups::setTesEvalShaderFrameBuffer(programCollection);
+
+ }
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream evaluationSource;
+ evaluationSource << "${VERSION_DECL}\n"
+ << extSource
+ << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << "layout(isolines, equal_spacing, ccw ) in;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "layout(binding = 0, std140) uniform Buffer0\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "layout(binding = 1, std140) uniform Buffer1\n"
+ << "{\n"
+ << " uint data2[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << testSource
+ << " out_color = float(temp_res);\n"
+ << " gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
+ << "}\n";
+
+ subgroups::setTesCtrlShaderFrameBuffer(programCollection);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
+ }
+ else
+ {
+ DE_FATAL("Unsupported shader stage");
+ }
+}
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ const std::string versionSource =
+ "${VERSION_DECL}\n";
+ const std::string vSource =
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n";
+ const std::string eSource =
+ (OPTYPE_SHUFFLE == caseDef.opType || OPTYPE_SHUFFLE_XOR == caseDef.opType) ?
+ "#extension GL_KHR_shader_subgroup_shuffle: enable\n" :
+ "#extension GL_KHR_shader_subgroup_shuffle_relative: enable\n";
+ const std::string extSource = vSource + eSource;
+
+ const std::string testSource = TestSource(caseDef);
+
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream src;
+
+ src << versionSource + extSource
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Buffer0\n"
+ << "{\n"
+ << " uint result[];\n"
+ << "};\n"
+ << DeclSource(caseDef, 1)
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+ << " highp uint offset = globalSize.x * ((globalSize.y * "
+ "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+ "gl_GlobalInvocationID.x;\n"
+ << testSource
+ << " result[offset] = temp_res;\n"
+ << "}\n";
+
+ programCollection.add("comp") << glu::ComputeSource(src.str());
+ }
+ else
+ {
+ const std::string declSource = DeclSource(caseDef, 4);
+
+ {
+ const string vertex =
+ versionSource + extSource +
+ "layout(binding = 0, std430) buffer Buffer0\n"
+ "{\n"
+ " uint result[];\n"
+ "} b0;\n"
+ + declSource +
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + testSource +
+ " b0.result[gl_VertexID] = temp_res;\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " float pixelPosition = pixelSize/2.0f - 1.0f;\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_PointSize = 1.0f;\n"
+ "}\n";
+
+ programCollection.add("vert") << glu::VertexSource(vertex);
+ }
+
+ {
+ const string tesc =
+ versionSource + extSource +
+ "layout(vertices=1) out;\n"
+ "layout(binding = 1, std430) buffer Buffer1\n"
+ "{\n"
+ " uint result[];\n"
+ "} b1;\n"
+ + declSource +
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + testSource +
+ " b1.result[gl_PrimitiveID] = temp_res;\n"
+ " if (gl_InvocationID == 0)\n"
+ " {\n"
+ " gl_TessLevelOuter[0] = 1.0f;\n"
+ " gl_TessLevelOuter[1] = 1.0f;\n"
+ " }\n"
+ " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ "}\n";
+
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc);
+ }
+
+ {
+ const string tese =
+ versionSource + extSource +
+ "layout(isolines) in;\n"
+ "layout(binding = 2, std430) buffer Buffer2\n"
+ "{\n"
+ " uint result[];\n"
+ "} b2;\n"
+ + declSource +
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + testSource +
+ " b2.result[gl_PrimitiveID * 2 + int(gl_TessCoord.x + 0.5)] = temp_res;\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
+ "}\n";
+
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese);
+ }
+
+ {
+ const string geometry =
+ // version is added by addGeometryShadersFromTemplate
+ extSource +
+ "layout(${TOPOLOGY}) in;\n"
+ "layout(points, max_vertices = 1) out;\n"
+ "layout(binding = 3, std430) buffer Buffer3\n"
+ "{\n"
+ " uint result[];\n"
+ "} b3;\n"
+ + declSource +
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + testSource +
+ " b3.result[gl_PrimitiveIDIn] = temp_res;\n"
+ " gl_Position = gl_in[0].gl_Position;\n"
+ " EmitVertex();\n"
+ " EndPrimitive();\n"
+ "}\n";
+
+ subgroups::addGeometryShadersFromTemplate(geometry, programCollection);
+ }
+ {
+ const string fragment =
+ versionSource + extSource +
+ "precision highp int;\n"
+ "precision highp float;\n"
+ "layout(location = 0) out uint result;\n"
+ + declSource +
+ "void main (void)\n"
+ "{\n"
+ + testSource +
+ " result = temp_res;\n"
+ "}\n";
+
+ programCollection.add("fragment") << glu::FragmentSource(fragment);
+ }
+
+ subgroups::addNoSubgroupShader(programCollection);
+ }
+}
+
+void supportedCheck (Context& context, CaseDefinition caseDef)
+{
+ if (!subgroups::isSubgroupSupported(context))
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported");
+
+ switch (caseDef.opType)
+ {
+ case OPTYPE_SHUFFLE:
+ case OPTYPE_SHUFFLE_XOR:
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_SHUFFLE_BIT))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup shuffle operations");
+ }
+ break;
+ default:
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup shuffle relative operations");
+ }
+ break;
+ }
+
+ if (subgroups::isDoubleFormat(caseDef.format) &&
+ !subgroups::isDoubleSupportedForDevice(context))
+ TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
+}
+
+tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
+{
+ if (!subgroups::areSubgroupOperationsSupportedForStage(
+ context, caseDef.shaderStage))
+ {
+ if (subgroups::areSubgroupOperationsRequiredForStage(
+ caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ else
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+ }
+ }
+
+ subgroups::SSBOData inputData[2];
+ inputData[0].format = caseDef.format;
+ inputData[0].layout = subgroups::SSBOData::LayoutStd140;
+ inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+ inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData[0].binding = 0u;
+
+ inputData[1].format = FORMAT_R32_UINT;
+ inputData[1].layout = subgroups::SSBOData::LayoutStd140;
+ inputData[1].numElements = inputData[0].numElements;
+ inputData[1].initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData[1].binding = 1u;
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ return subgroups::makeVertexFrameBufferTest(context, FORMAT_R32_UINT, inputData, 2, checkVertexPipelineStages);
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ return subgroups::makeGeometryFrameBufferTest(context, FORMAT_R32_UINT, inputData, 2, checkVertexPipelineStages);
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, inputData, 2, checkVertexPipelineStages, SHADER_STAGE_TESS_CONTROL_BIT);
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, inputData, 2, checkVertexPipelineStages, SHADER_STAGE_TESS_EVALUATION_BIT);
+ else
+ TCU_THROW(InternalError, "Unhandled shader stage");
+}
+
+
+tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+{
+ switch (caseDef.opType)
+ {
+ case OPTYPE_SHUFFLE:
+ case OPTYPE_SHUFFLE_XOR:
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_SHUFFLE_BIT))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup shuffle operations");
+ }
+ break;
+ default:
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup shuffle relative operations");
+ }
+ break;
+ }
+
+ if (subgroups::isDoubleFormat(caseDef.format) && !subgroups::isDoubleSupportedForDevice(context))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
+ }
+
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ if (!subgroups::areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ subgroups::SSBOData inputData[2];
+ inputData[0].format = caseDef.format;
+ inputData[0].layout = subgroups::SSBOData::LayoutStd430;
+ inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+ inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData[0].binding = 1u;
+
+ inputData[1].format = FORMAT_R32_UINT;
+ inputData[1].layout = subgroups::SSBOData::LayoutStd430;
+ inputData[1].numElements = inputData[0].numElements;
+ inputData[1].initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData[1].binding = 2u;
+
+ return subgroups::makeComputeTest(context, FORMAT_R32_UINT, inputData, 2, checkComputeStage);
+ }
+
+ else
+ {
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
+
+ ShaderStageFlags stages = (ShaderStageFlags)(caseDef.shaderStage & supportedStages);
+
+ if (SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ {
+ if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0)
+ TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+ else
+ stages = SHADER_STAGE_FRAGMENT_BIT;
+ }
+
+ if ((ShaderStageFlags)0u == stages)
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
+
+ subgroups::SSBOData inputData[2];
+ inputData[0].format = caseDef.format;
+ inputData[0].layout = subgroups::SSBOData::LayoutStd430;
+ inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+ inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData[0].binding = 4u;
+ inputData[0].stages = stages;
+
+ inputData[1].format = FORMAT_R32_UINT;
+ inputData[1].layout = subgroups::SSBOData::LayoutStd430;
+ inputData[1].numElements = inputData[0].numElements;
+ inputData[1].initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData[1].binding = 5u;
+ inputData[1].stages = stages;
+
+ return subgroups::allStages(context, FORMAT_R32_UINT, inputData, 2, checkVertexPipelineStages, stages);
+ }
+}
+}
+
+deqp::TestCaseGroup* createSubgroupsShuffleTests(deqp::Context& testCtx)
+{
+
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
+ testCtx, "graphics", "Subgroup shuffle category tests: graphics"));
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
+ testCtx, "compute", "Subgroup shuffle category tests: compute"));
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
+ testCtx, "framebuffer", "Subgroup shuffle category tests: framebuffer"));
+
+ const Format formats[] =
+ {
+ FORMAT_R32_SINT, FORMAT_R32G32_SINT, FORMAT_R32G32B32_SINT,
+ FORMAT_R32G32B32A32_SINT, FORMAT_R32_UINT, FORMAT_R32G32_UINT,
+ FORMAT_R32G32B32_UINT, FORMAT_R32G32B32A32_UINT,
+ FORMAT_R32_SFLOAT, FORMAT_R32G32_SFLOAT,
+ FORMAT_R32G32B32_SFLOAT, FORMAT_R32G32B32A32_SFLOAT,
+ FORMAT_R64_SFLOAT, FORMAT_R64G64_SFLOAT,
+ FORMAT_R64G64B64_SFLOAT, FORMAT_R64G64B64A64_SFLOAT,
+ FORMAT_R32_BOOL, FORMAT_R32G32_BOOL,
+ FORMAT_R32G32B32_BOOL, FORMAT_R32G32B32A32_BOOL,
+ };
+
+ const ShaderStageFlags stages[] =
+ {
+ SHADER_STAGE_VERTEX_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT,
+ };
+
+ for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
+ {
+ const Format format = formats[formatIndex];
+
+ for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
+ {
+
+ const string name =
+ de::toLower(getOpTypeName(opTypeIndex)) +
+ "_" + subgroups::getFormatNameForGLSL(format);
+
+ {
+ const CaseDefinition caseDef =
+ {
+ opTypeIndex,
+ SHADER_STAGE_ALL_GRAPHICS,
+ format
+ };
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(), name, "", supportedCheck, initPrograms, test, caseDef);
+ }
+
+ {
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_COMPUTE_BIT, format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(), name, "", supportedCheck, initPrograms, test, caseDef);
+ }
+
+ for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+ {
+ const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex], format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(), name + "_" + getShaderStageName(caseDef.shaderStage), "",
+ supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
+ }
+ }
+ }
+
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
+ testCtx, "shuffle", "Subgroup shuffle category tests"));
+
+ group->addChild(graphicGroup.release());
+ group->addChild(computeGroup.release());
+ group->addChild(framebufferGroup.release());
+
+ return group.release();
+}
+
+} // subgroups
+} // glc
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsShuffleTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsShuffleTests.hpp
new file mode 100644
index 0000000..e425182
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsShuffleTests.hpp
@@ -0,0 +1,41 @@
+#ifndef _GLCSUBGROUPSSHUFFLETESTS_HPP
+#define _GLCSUBGROUPSSHUFFLETESTS_HPP
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "glcTestCase.hpp"
+
+namespace glc
+{
+namespace subgroups
+{
+
+deqp::TestCaseGroup* createSubgroupsShuffleTests(deqp::Context& testCtx);
+
+} // subgroups
+} // glc
+
+#endif // _GLCSUBGROUPSSHUFFLETESTS_HPP
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsTests.cpp
new file mode 100755
index 0000000..5818c54
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsTests.cpp
@@ -0,0 +1,75 @@
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "glcSubgroupsTests.hpp"
+#include "glcSubgroupsBuiltinVarTests.hpp"
+#include "glcSubgroupsBuiltinMaskVarTests.hpp"
+#include "glcSubgroupsBasicTests.hpp"
+#include "glcSubgroupsVoteTests.hpp"
+#include "glcSubgroupsBallotTests.hpp"
+#include "glcSubgroupsBallotBroadcastTests.hpp"
+#include "glcSubgroupsBallotOtherTests.hpp"
+#include "glcSubgroupsArithmeticTests.hpp"
+#include "glcSubgroupsClusteredTests.hpp"
+#include "glcSubgroupsPartitionedTests.hpp"
+#include "glcSubgroupsShuffleTests.hpp"
+#include "glcSubgroupsQuadTests.hpp"
+#include "glcSubgroupsShapeTests.hpp"
+//#include "glcTestGroupUtil.hpp"
+
+namespace glc
+{
+namespace subgroups
+{
+
+/** Constructor.
+ *
+ * @param context Rendering context.
+ */
+GlSubgroupTests::GlSubgroupTests(deqp::Context& context)
+ : TestCaseGroup(context, "subgroups", "Shader Subgroup Operation tests")
+{
+}
+
+/** Initializes the test group contents. */
+void GlSubgroupTests::init()
+{
+ addChild(createSubgroupsBuiltinVarTests(m_context));
+ addChild(createSubgroupsBuiltinMaskVarTests(m_context));
+ addChild(createSubgroupsBasicTests(m_context));
+ addChild(createSubgroupsVoteTests(m_context));
+ addChild(createSubgroupsBallotTests(m_context));
+ addChild(createSubgroupsBallotBroadcastTests(m_context));
+ addChild(createSubgroupsBallotOtherTests(m_context));
+ addChild(createSubgroupsArithmeticTests(m_context));
+ addChild(createSubgroupsClusteredTests(m_context));
+ addChild(createSubgroupsPartitionedTests(m_context));
+ addChild(createSubgroupsShuffleTests(m_context));
+ addChild(createSubgroupsQuadTests(m_context));
+ addChild(createSubgroupsShapeTests(m_context));
+}
+
+} // subgroups
+} // glc
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsTests.hpp
new file mode 100644
index 0000000..cc45a51
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsTests.hpp
@@ -0,0 +1,53 @@
+#ifndef _GLCSUBGROUPSTESTS_HPP
+#define _GLCSUBGROUPSTESTS_HPP
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "glcTestCase.hpp"
+
+namespace glc
+{
+namespace subgroups
+{
+
+/** Test group which encapsulates all subgroup conformance tests */
+class GlSubgroupTests : public deqp::TestCaseGroup
+{
+public:
+ /* Public methods */
+ GlSubgroupTests(deqp::Context& context);
+
+ void init();
+
+private:
+ GlSubgroupTests(const GlSubgroupTests& other);
+ GlSubgroupTests& operator=(const GlSubgroupTests& other);
+};
+
+} // subgroups
+} // glc
+
+#endif // _GLCSUBGROUPSTESTS_HPP
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsTestsUtils.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsTestsUtils.cpp
new file mode 100755
index 0000000..f579dd7
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsTestsUtils.cpp
@@ -0,0 +1,2198 @@
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests Utils
+ */ /*--------------------------------------------------------------------*/
+
+#include "glcSubgroupsTestsUtils.hpp"
+#include "deRandom.hpp"
+#include "tcuCommandLine.hpp"
+#include "tcuStringTemplate.hpp"
+#include "gluContextInfo.hpp"
+#include "gluShaderUtil.hpp"
+
+using namespace deqp;
+using namespace std;
+using namespace glc;
+using namespace glw;
+
+namespace
+{
+// debug callback function
+// To use:
+// gl.enable(GL_DEBUG_OUTPUT);
+// gl.debugMessageCallback(debugCallback, &context);
+//
+void debugCallback(GLenum source, GLenum type, GLuint id, GLenum severity,
+ GLsizei length, const char * message, const void * userParam)
+{
+ glc::Context *context = (glc::Context *)userParam;
+
+ tcu::TestLog& log = context->getDeqpContext().getTestContext().getLog();
+
+ log << tcu::TestLog::Message
+ << "DEBUG: source = " << source << ", type= " << type << ", id = " << id << ", severity = " << severity
+ << ", length = " << length << "\n"
+ << "DEBUG: `" << message << "`"
+ << tcu::TestLog::EndMessage;
+
+}
+
+// getFormatReadInfo
+// returns the stride in bytes
+deUint32 getFormatReadInfo(const subgroups::Format format, GLenum &readFormat, GLenum &readType)
+{
+ using namespace subgroups;
+ switch (format)
+ {
+ default:
+ DE_FATAL("Unhandled format!");
+ // fall-through
+ case FORMAT_R32G32B32A32_SFLOAT:
+ readFormat = GL_RGBA;
+ readType = GL_FLOAT;
+ return 4u;
+ case FORMAT_R32G32_SFLOAT:
+ readFormat = GL_RG;
+ readType = GL_FLOAT;
+ return 2u;
+ case FORMAT_R32_UINT:
+ readFormat = GL_RED_INTEGER;
+ readType = GL_UNSIGNED_INT;
+ return 1u;
+ case FORMAT_R32G32B32A32_UINT:
+ readFormat = GL_RGBA_INTEGER;
+ readType = GL_UNSIGNED_INT;
+ return 4u;
+ }
+}
+
+deUint32 getMaxWidth ()
+{
+ return 1024u;
+}
+
+deUint32 getNextWidth (const deUint32 width)
+{
+ if (width < 128)
+ {
+ // This ensures we test every value up to 128 (the max subgroup size).
+ return width + 1;
+ }
+ else
+ {
+ // And once we hit 128 we increment to only power of 2's to reduce testing time.
+ return width * 2;
+ }
+}
+
+deUint32 getFormatSizeInBytes(const subgroups::Format format)
+{
+ using namespace subgroups;
+ switch (format)
+ {
+ default:
+ DE_FATAL("Unhandled format!");
+ return 0;
+ case FORMAT_R32_SINT:
+ case FORMAT_R32_UINT:
+ return sizeof(deInt32);
+ case FORMAT_R32G32_SINT:
+ case FORMAT_R32G32_UINT:
+ return static_cast<deUint32>(sizeof(deInt32) * 2);
+ case FORMAT_R32G32B32_SINT:
+ case FORMAT_R32G32B32_UINT:
+ case FORMAT_R32G32B32A32_SINT:
+ case FORMAT_R32G32B32A32_UINT:
+ return static_cast<deUint32>(sizeof(deInt32) * 4);
+ case FORMAT_R32_SFLOAT:
+ return 4;
+ case FORMAT_R32G32_SFLOAT:
+ return 8;
+ case FORMAT_R32G32B32_SFLOAT:
+ return 16;
+ case FORMAT_R32G32B32A32_SFLOAT:
+ return 16;
+ case FORMAT_R64_SFLOAT:
+ return 8;
+ case FORMAT_R64G64_SFLOAT:
+ return 16;
+ case FORMAT_R64G64B64_SFLOAT:
+ return 32;
+ case FORMAT_R64G64B64A64_SFLOAT:
+ return 32;
+ // The below formats are used to represent bool and bvec* types. These
+ // types are passed to the shader as int and ivec* types, before the
+ // calculations are done as booleans. We need a distinct type here so
+ // that the shader generators can switch on it and generate the correct
+ // shader source for testing.
+ case FORMAT_R32_BOOL:
+ return sizeof(deInt32);
+ case FORMAT_R32G32_BOOL:
+ return static_cast<deUint32>(sizeof(deInt32) * 2);
+ case FORMAT_R32G32B32_BOOL:
+ case FORMAT_R32G32B32A32_BOOL:
+ return static_cast<deUint32>(sizeof(deInt32) * 4);
+ }
+}
+
+deUint32 getElementSizeInBytes(
+ const subgroups::Format format,
+ const subgroups::SSBOData::InputDataLayoutType layout)
+{
+ deUint32 bytes = getFormatSizeInBytes(format);
+ if (layout == subgroups::SSBOData::LayoutStd140)
+ return bytes < 16 ? 16 : bytes;
+ else
+ return bytes;
+}
+
+
+de::MovePtr<glu::ShaderProgram> makeGraphicsPipeline(glc::Context& context,
+ const subgroups::ShaderStageFlags stages,
+ const GlslSource * vshader,
+ const GlslSource * fshader,
+ const GlslSource * gshader,
+ const GlslSource * tcshader,
+ const GlslSource * teshader)
+{
+ tcu::TestLog& log = context.getDeqpContext().getTestContext().getLog();
+ const bool doShaderLog = log.isShaderLoggingEnabled();
+ DE_UNREF(stages); // only used for asserts
+
+ map<string, string> templateArgs;
+ string versionDecl(getGLSLVersionDeclaration(context.getGLSLVersion()));
+ templateArgs.insert(pair<string, string>("VERSION_DECL", versionDecl));
+
+ string vertSource, tescSource, teseSource, geomSource, fragSource;
+ if (vshader)
+ {
+ DE_ASSERT(stages & subgroups::SHADER_STAGE_VERTEX_BIT);
+ tcu::StringTemplate shaderTemplate(vshader->sources[glu::SHADERTYPE_VERTEX][0]);
+ string shaderSource(shaderTemplate.specialize(templateArgs));
+ if (doShaderLog)
+ {
+ log << tcu::TestLog::Message << "vertex shader:\n"
+ << shaderSource << "\n:end:" << tcu::TestLog::EndMessage;
+ }
+ vertSource = shaderSource;
+ }
+ if (tcshader)
+ {
+ DE_ASSERT(stages & subgroups::SHADER_STAGE_TESS_CONTROL_BIT);
+ tcu::StringTemplate shaderTemplate(tcshader->sources[glu::SHADERTYPE_TESSELLATION_CONTROL][0]);
+ string shaderSource(shaderTemplate.specialize(templateArgs));
+ if (doShaderLog)
+ {
+ log << tcu::TestLog::Message << "tess control shader:\n"
+ << shaderSource << "\n:end:" << tcu::TestLog::EndMessage;
+ }
+ tescSource = shaderSource;
+ }
+ if (teshader)
+ {
+ DE_ASSERT(stages & subgroups::SHADER_STAGE_TESS_EVALUATION_BIT);
+ tcu::StringTemplate shaderTemplate(teshader->sources[glu::SHADERTYPE_TESSELLATION_EVALUATION][0]);
+ string shaderSource(shaderTemplate.specialize(templateArgs));
+ if (doShaderLog)
+ {
+ log << tcu::TestLog::Message << "tess eval shader:\n"
+ << shaderSource << "\n:end:" << tcu::TestLog::EndMessage;
+ }
+ teseSource = shaderSource;
+ }
+ if (gshader)
+ {
+ DE_ASSERT(stages & subgroups::SHADER_STAGE_GEOMETRY_BIT);
+ tcu::StringTemplate shaderTemplate(gshader->sources[glu::SHADERTYPE_GEOMETRY][0]);
+ string shaderSource(shaderTemplate.specialize(templateArgs));
+ if (doShaderLog)
+ {
+ log << tcu::TestLog::Message << "geometry shader:\n"
+ << shaderSource << "\n:end:" << tcu::TestLog::EndMessage;
+ }
+ geomSource = shaderSource;
+ }
+ if (fshader)
+ {
+ DE_ASSERT(stages & subgroups::SHADER_STAGE_FRAGMENT_BIT);
+ tcu::StringTemplate shaderTemplate(fshader->sources[glu::SHADERTYPE_FRAGMENT][0]);
+ string shaderSource(shaderTemplate.specialize(templateArgs));
+ if (doShaderLog)
+ {
+ log << tcu::TestLog::Message << "fragment shader:\n"
+ << shaderSource << "\n:end:" << tcu::TestLog::EndMessage;
+ }
+ fragSource = shaderSource;
+ }
+
+ glu::ShaderProgram *program = DE_NULL;
+ if(context.getShaderType() == SHADER_TYPE_GLSL)
+ {
+ glu::ProgramSources sources;
+ if (vshader)
+ sources << glu::VertexSource(vertSource);
+ if (tcshader)
+ sources << glu::TessellationControlSource(tescSource);
+ if (teshader)
+ sources << glu::TessellationEvaluationSource(teseSource);
+ if (gshader)
+ sources << glu::GeometrySource(geomSource);
+ if (fshader)
+ sources << glu::FragmentSource(fragSource);
+
+ program = new glu::ShaderProgram(context.getDeqpContext().getRenderContext().getFunctions(), sources);
+ } else {
+ DE_ASSERT(context.getShaderType() == SHADER_TYPE_SPIRV);
+
+ glu::ProgramBinaries binaries;
+ if (vshader)
+ binaries << spirvUtils::makeSpirV(log, glu::VertexSource(vertSource), spirvUtils::SPIRV_VERSION_1_3);
+ if (tcshader)
+ binaries << spirvUtils::makeSpirV(log, glu::TessellationControlSource(tescSource), spirvUtils::SPIRV_VERSION_1_3);
+ if (teshader)
+ binaries << spirvUtils::makeSpirV(log, glu::TessellationEvaluationSource(teseSource), spirvUtils::SPIRV_VERSION_1_3);
+ if (gshader)
+ binaries << spirvUtils::makeSpirV(log, glu::GeometrySource(geomSource), spirvUtils::SPIRV_VERSION_1_3);
+ if (fshader)
+ binaries << spirvUtils::makeSpirV(log, glu::FragmentSource(fragSource), spirvUtils::SPIRV_VERSION_1_3);
+
+ program = new glu::ShaderProgram(context.getDeqpContext().getRenderContext().getFunctions(), binaries);
+ }
+
+ if (!program->isOk())
+ {
+ log << tcu::TestLog::Message << "Shader build failed.\n"
+ << "Vertex: " << (vshader ? program->getShaderInfo(glu::SHADERTYPE_VERTEX).infoLog : "n/a") << "\n"
+ << "Tess Cont: " << (tcshader ? program->getShaderInfo(glu::SHADERTYPE_TESSELLATION_CONTROL).infoLog : "n/a") << "\n"
+ << "Tess Eval: " << (teshader ? program->getShaderInfo(glu::SHADERTYPE_TESSELLATION_EVALUATION).infoLog : "n/a") << "\n"
+ << "Geometry: " << (gshader ? program->getShaderInfo(glu::SHADERTYPE_GEOMETRY).infoLog : "n/a") << "\n"
+ << "Fragment: " << (fshader ? program->getShaderInfo(glu::SHADERTYPE_FRAGMENT).infoLog : "n/a") << "\n"
+ << "Program: " << program->getProgramInfo().infoLog << tcu::TestLog::EndMessage;
+ }
+ return de::MovePtr<glu::ShaderProgram>(program);
+}
+
+de::MovePtr<glu::ShaderProgram> makeComputePipeline(glc::Context& context, const GlslSource &glslTemplate,
+ deUint32 localSizeX, deUint32 localSizeY, deUint32 localSizeZ)
+{
+
+ tcu::TestLog& log = context.getDeqpContext().getTestContext().getLog();
+ const bool doShaderLog = log.isShaderLoggingEnabled();
+
+ tcu::StringTemplate computeTemplate(glslTemplate.sources[glu::SHADERTYPE_COMPUTE][0]);
+
+ map<string, string> templateArgs;
+ {
+ stringstream localSize;
+ localSize << "local_size_x = " << localSizeX;
+ templateArgs.insert(pair<string, string>("LOCAL_SIZE_X", localSize.str()));
+ }
+ {
+ stringstream localSize;
+ localSize << "local_size_y = " << localSizeY;
+ templateArgs.insert(pair<string, string>("LOCAL_SIZE_Y", localSize.str()));
+ }
+ {
+ stringstream localSize;
+ localSize << "local_size_z = " << localSizeZ;
+ templateArgs.insert(pair<string, string>("LOCAL_SIZE_Z", localSize.str()));
+ }
+ string versionDecl(getGLSLVersionDeclaration(context.getGLSLVersion()));
+ templateArgs.insert(pair<string, string>("VERSION_DECL", versionDecl));
+
+ glu::ComputeSource cshader(glu::ComputeSource(computeTemplate.specialize(templateArgs)));
+
+ if (doShaderLog)
+ {
+ log << tcu::TestLog::Message << "compute shader specialized source:\n"
+ << cshader.source << "\n:end:" << tcu::TestLog::EndMessage;
+ }
+
+ glu::ShaderProgram *program = DE_NULL;
+ if(context.getShaderType() == SHADER_TYPE_GLSL)
+ {
+ glu::ProgramSources sources;
+ sources << cshader;
+ program = new glu::ShaderProgram(context.getDeqpContext().getRenderContext().getFunctions(), sources);
+ } else {
+ DE_ASSERT(context.getShaderType() == SHADER_TYPE_SPIRV);
+
+ glu::ProgramBinaries binaries;
+ binaries << spirvUtils::makeSpirV(log, cshader, spirvUtils::SPIRV_VERSION_1_3);
+
+ program = new glu::ShaderProgram(context.getDeqpContext().getRenderContext().getFunctions(), binaries);
+ }
+
+ if (!program->isOk())
+ {
+ log << tcu::TestLog::Message << "Shader build failed.\n"
+ << "Compute: " << program->getShaderInfo(glu::SHADERTYPE_COMPUTE).infoLog << "\n"
+ << "Program: " << program->getProgramInfo().infoLog << tcu::TestLog::EndMessage;
+ }
+ return de::MovePtr<glu::ShaderProgram>(program);
+}
+
+struct Buffer;
+struct Image;
+
+struct BufferOrImage
+{
+ bool isImage() const
+ {
+ return m_isImage;
+ }
+
+ Buffer* getAsBuffer()
+ {
+ if (m_isImage) DE_FATAL("Trying to get a buffer as an image!");
+ return reinterpret_cast<Buffer* >(this);
+ }
+
+ Image* getAsImage()
+ {
+ if (!m_isImage) DE_FATAL("Trying to get an image as a buffer!");
+ return reinterpret_cast<Image*>(this);
+ }
+
+ virtual subgroups::DescriptorType getType() const
+ {
+ if (m_isImage)
+ {
+ return subgroups::DESCRIPTOR_TYPE_STORAGE_IMAGE;
+ }
+ else
+ {
+ return subgroups::DESCRIPTOR_TYPE_STORAGE_BUFFER;
+ }
+ }
+
+ GLuint getId()
+ {
+ return m_objectId;
+ }
+
+ virtual ~BufferOrImage() {}
+
+protected:
+ explicit BufferOrImage(glc::Context& context, bool image)
+ : m_gl(context.getDeqpContext().getRenderContext().getFunctions())
+ , m_isImage(image)
+ , m_objectId(0) {}
+
+ const glw::Functions & m_gl;
+ bool m_isImage;
+ GLuint m_objectId;
+};
+
+struct Buffer : public BufferOrImage
+{
+ explicit Buffer(
+ glc::Context& context, deUint64 sizeInBytes, GLenum target = GL_SHADER_STORAGE_BUFFER)
+ : BufferOrImage (context, false)
+ , m_sizeInBytes (sizeInBytes)
+ , m_target (target)
+ {
+ m_gl.genBuffers(1, &m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "genBuffers");
+ m_gl.bindBuffer(m_target, m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "bindBuffer");
+ m_gl.bufferData(m_target, m_sizeInBytes, NULL, GL_DYNAMIC_DRAW);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "bufferData");
+ m_gl.bindBuffer(m_target, 0);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "bindBuffer(0)");
+ }
+
+ virtual ~Buffer()
+ {
+ if (m_objectId != 0)
+ {
+ m_gl.deleteBuffers(1, &m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glDeleteBuffers");
+ }
+ }
+
+ virtual subgroups::DescriptorType getType() const
+ {
+ if (GL_UNIFORM_BUFFER == m_target)
+ {
+ return subgroups::DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+ }
+ return subgroups::DESCRIPTOR_TYPE_STORAGE_BUFFER;
+ }
+
+ glw::GLvoid* mapBufferPtr() {
+ glw::GLvoid *ptr;
+
+ m_gl.bindBuffer(m_target, m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glBindBuffer");
+
+ ptr = m_gl.mapBufferRange(m_target, 0, m_sizeInBytes, GL_MAP_READ_BIT | GL_MAP_WRITE_BIT);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glMapBuffer");
+
+ m_gl.bindBuffer(m_target, 0);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glBindBuffer(0)");
+
+ return ptr;
+ }
+
+ void unmapBufferPtr() {
+ m_gl.bindBuffer(m_target, m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glBindBuffer");
+
+ m_gl.unmapBuffer(m_target);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glUnmapBuffer");
+
+ m_gl.bindBuffer(m_target, 0);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glBindBuffer(0)");
+ }
+
+ deUint64 getSize() const {
+ return m_sizeInBytes;
+ }
+
+private:
+ deUint64 m_sizeInBytes;
+ const GLenum m_target;
+};
+
+struct Image : public BufferOrImage
+{
+ explicit Image(glc::Context& context, deUint32 width, deUint32 height,
+ subgroups::Format format)
+ : BufferOrImage(context, true)
+ {
+ m_gl.genTextures(1, &m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glGenTextures");
+ m_gl.bindTexture(GL_TEXTURE_2D, m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glBindTexture");
+ m_gl.texStorage2D(GL_TEXTURE_2D, 1, format, width, height);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glTexStorage2D");
+ }
+
+ virtual ~Image()
+ {
+ if (m_objectId != 0)
+ {
+ m_gl.deleteTextures(1, &m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glDeleteTextures");
+ }
+ }
+
+private:
+};
+
+struct Vao
+{
+ explicit Vao(glc::Context& context)
+ : m_gl(context.getDeqpContext().getRenderContext().getFunctions())
+ , m_objectId(0)
+ {
+ m_gl.genVertexArrays(1, &m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glGenVertexArrays");
+ m_gl.bindVertexArray(m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glBindVertexArray");
+ }
+
+ ~Vao()
+ {
+ if (m_objectId != 0)
+ {
+ m_gl.deleteVertexArrays(1, &m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glDeleteVertexArrays");
+ }
+ }
+
+private:
+ const glw::Functions & m_gl;
+ GLuint m_objectId;
+};
+
+struct Fbo
+{
+ explicit Fbo(glc::Context& context)
+ : m_gl(context.getDeqpContext().getRenderContext().getFunctions())
+ , m_objectId(0)
+ {
+ m_gl.genFramebuffers(1, &m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glGenFramebuffers");
+ m_gl.bindFramebuffer(GL_FRAMEBUFFER, m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glBindFramebuffer");
+ }
+
+ ~Fbo()
+ {
+ if (m_objectId != 0)
+ {
+ m_gl.deleteFramebuffers(1, &m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "deleteFramebuffers");
+ }
+ }
+
+ void bind2D(Image &img)
+ {
+ m_gl.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, img.getId(), 0);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glFramebufferTexture2D");
+ }
+
+private:
+ const glw::Functions & m_gl;
+ GLuint m_objectId;
+
+};
+}
+
+std::string glc::subgroups::getSharedMemoryBallotHelper()
+{
+ return "shared uvec4 superSecretComputeShaderHelper[gl_WorkGroupSize.x * gl_WorkGroupSize.y * gl_WorkGroupSize.z];\n"
+ "uvec4 sharedMemoryBallot(bool vote)\n"
+ "{\n"
+ " uint groupOffset = gl_SubgroupID;\n"
+ " // One invocation in the group 0's the whole group's data\n"
+ " if (subgroupElect())\n"
+ " {\n"
+ " superSecretComputeShaderHelper[groupOffset] = uvec4(0);\n"
+ " }\n"
+ " subgroupMemoryBarrierShared();\n"
+ " if (vote)\n"
+ " {\n"
+ " highp uint invocationId = gl_SubgroupInvocationID % 32u;\n"
+ " highp uint bitToSet = 1u << invocationId;\n"
+ " switch (gl_SubgroupInvocationID / 32u)\n"
+ " {\n"
+ " case 0u: atomicOr(superSecretComputeShaderHelper[groupOffset].x, bitToSet); break;\n"
+ " case 1u: atomicOr(superSecretComputeShaderHelper[groupOffset].y, bitToSet); break;\n"
+ " case 2u: atomicOr(superSecretComputeShaderHelper[groupOffset].z, bitToSet); break;\n"
+ " case 3u: atomicOr(superSecretComputeShaderHelper[groupOffset].w, bitToSet); break;\n"
+ " }\n"
+ " }\n"
+ " subgroupMemoryBarrierShared();\n"
+ " return superSecretComputeShaderHelper[groupOffset];\n"
+ "}\n";
+}
+
+deUint32 glc::subgroups::getSubgroupSize(Context& context)
+{
+ int subgroupSize = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SIZE_KHR);
+
+ return subgroupSize;
+}
+
+deUint32 glc::subgroups::maxSupportedSubgroupSize() {
+ return 128u;
+}
+
+std::string glc::subgroups::getShaderStageName(ShaderStageFlags stage)
+{
+ DE_ASSERT(stage & SHADER_STAGE_ALL_VALID);
+ switch (stage)
+ {
+ default:
+ DE_FATAL("Unhandled stage!");
+ return "";
+ case SHADER_STAGE_COMPUTE_BIT:
+ return "compute";
+ case SHADER_STAGE_FRAGMENT_BIT:
+ return "fragment";
+ case SHADER_STAGE_VERTEX_BIT:
+ return "vertex";
+ case SHADER_STAGE_GEOMETRY_BIT:
+ return "geometry";
+ case SHADER_STAGE_TESS_CONTROL_BIT:
+ return "tess_control";
+ case SHADER_STAGE_TESS_EVALUATION_BIT:
+ return "tess_eval";
+ }
+}
+
+std::string glc::subgroups::getSubgroupFeatureName(SubgroupFeatureFlags bit)
+{
+ DE_ASSERT(bit & SUBGROUP_FEATURE_ALL_VALID);
+ switch (bit)
+ {
+ default:
+ DE_FATAL("Unknown subgroup feature category!");
+ return "";
+ case SUBGROUP_FEATURE_BASIC_BIT:
+ return "GL_SUBGROUP_FEATURE_BASIC_BIT_KHR";
+ case SUBGROUP_FEATURE_VOTE_BIT:
+ return "GL_SUBGROUP_FEATURE_VOTE_BIT_KHR";
+ case SUBGROUP_FEATURE_ARITHMETIC_BIT:
+ return "GL_SUBGROUP_FEATURE_ARITHMETIC_BIT_KHR";
+ case SUBGROUP_FEATURE_BALLOT_BIT:
+ return "GL_SUBGROUP_FEATURE_BALLOT_BIT_KHR";
+ case SUBGROUP_FEATURE_SHUFFLE_BIT:
+ return "GL_SUBGROUP_FEATURE_SHUFFLE_BIT_KHR";
+ case SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT:
+ return "GL_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT_KHR";
+ case SUBGROUP_FEATURE_CLUSTERED_BIT:
+ return "GL_SUBGROUP_FEATURE_CLUSTERED_BIT_KHR";
+ case SUBGROUP_FEATURE_QUAD_BIT:
+ return "GL_SUBGROUP_FEATURE_QUAD_BIT_KHR";
+ case SUBGROUP_FEATURE_PARTITIONED_BIT_NV:
+ return "GL_SUBGROUP_FEATURE_PARTITIONED_BIT_NV";
+ }
+}
+
+void glc::subgroups::addNoSubgroupShader (SourceCollections& programCollection)
+{
+ {
+ const std::string vertNoSubgroupGLSL =
+ "${VERSION_DECL}\n"
+ "void main (void)\n"
+ "{\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " float pixelPosition = pixelSize/2.0f - 1.0f;\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_PointSize = 1.0f;\n"
+ "}\n";
+ programCollection.add("vert_noSubgroup") << glu::VertexSource(vertNoSubgroupGLSL);
+ }
+
+ {
+ const std::string tescNoSubgroupGLSL =
+ "${VERSION_DECL}\n"
+ "layout(vertices=1) out;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " if (gl_InvocationID == 0)\n"
+ " {\n"
+ " gl_TessLevelOuter[0] = 1.0f;\n"
+ " gl_TessLevelOuter[1] = 1.0f;\n"
+ " }\n"
+ " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ "}\n";
+ programCollection.add("tesc_noSubgroup") << glu::TessellationControlSource(tescNoSubgroupGLSL);
+ }
+
+ {
+ const std::string teseNoSubgroupGLSL =
+ "${VERSION_DECL}\n"
+ "layout(isolines) in;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
+ "}\n";
+ programCollection.add("tese_noSubgroup") << glu::TessellationEvaluationSource(teseNoSubgroupGLSL);
+ }
+
+}
+
+std::string glc::subgroups::getVertShaderForStage(const ShaderStageFlags stage)
+{
+ DE_ASSERT(stage & SHADER_STAGE_ALL_VALID);
+ switch (stage)
+ {
+ default:
+ DE_FATAL("Unhandled stage!");
+ return "";
+ case SHADER_STAGE_FRAGMENT_BIT:
+ return
+ "${VERSION_DECL}\n"
+ "void main (void)\n"
+ "{\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " float pixelPosition = pixelSize/2.0f - 1.0f;\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ "}\n";
+ case SHADER_STAGE_GEOMETRY_BIT:
+ return
+ "${VERSION_DECL}\n"
+ "void main (void)\n"
+ "{\n"
+ "}\n";
+ case SHADER_STAGE_TESS_CONTROL_BIT:
+ case SHADER_STAGE_TESS_EVALUATION_BIT:
+ return
+ "${VERSION_DECL}\n"
+ "void main (void)\n"
+ "{\n"
+ "}\n";
+ }
+}
+
+bool glc::subgroups::isSubgroupSupported(Context& context)
+{
+ return context.getDeqpContext().getContextInfo().isExtensionSupported("GL_KHR_shader_subgroup");
+}
+
+bool glc::subgroups::areSubgroupOperationsSupportedForStage(
+ Context& context, const ShaderStageFlags stage)
+{
+ DE_ASSERT(stage & SHADER_STAGE_ALL_VALID);
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
+
+ return (stage & supportedStages) ? true : false;
+}
+
+bool glc::subgroups::areSubgroupOperationsRequiredForStage(
+ const ShaderStageFlags stage)
+{
+ DE_ASSERT(stage & SHADER_STAGE_ALL_VALID);
+ switch (stage)
+ {
+ default:
+ return false;
+ case SHADER_STAGE_COMPUTE_BIT:
+ return true;
+ }
+}
+
+bool glc::subgroups::isSubgroupFeatureSupportedForDevice(
+ Context& context,
+ const SubgroupFeatureFlags bit)
+{
+ DE_ASSERT(bit & SUBGROUP_FEATURE_ALL_VALID);
+
+ int supportedOperations = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_FEATURES_KHR);
+
+ return (bit & supportedOperations) ? true : false;
+}
+
+bool glc::subgroups::isFragmentSSBOSupportedForDevice(Context& context)
+{
+ int numFragmentSSBOs = context.getDeqpContext().getContextInfo().getInt(GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS);
+
+ return (numFragmentSSBOs > 0) ? true : false;
+}
+
+bool glc::subgroups::isVertexSSBOSupportedForDevice(Context& context)
+{
+ int numVertexSSBOs = context.getDeqpContext().getContextInfo().getInt(GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS);
+
+ return (numVertexSSBOs > 0) ? true : false;
+}
+
+bool glc::subgroups::isImageSupportedForStageOnDevice(Context& context, const ShaderStageFlags stage)
+{
+ glw::GLint stageQuery;
+ DE_ASSERT(stage & SHADER_STAGE_ALL_VALID);
+
+ // image uniforms are optional in VTG stages
+ switch (stage)
+ {
+ case SHADER_STAGE_FRAGMENT_BIT:
+ case SHADER_STAGE_COMPUTE_BIT:
+ default:
+ return true;
+ case SHADER_STAGE_VERTEX_BIT:
+ stageQuery = GL_MAX_VERTEX_IMAGE_UNIFORMS;
+ break;
+ case SHADER_STAGE_TESS_CONTROL_BIT:
+ stageQuery = GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS;
+ break;
+ case SHADER_STAGE_TESS_EVALUATION_BIT:
+ stageQuery = GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS;
+ break;
+ case SHADER_STAGE_GEOMETRY_BIT:
+ stageQuery = GL_MAX_GEOMETRY_IMAGE_UNIFORMS;
+ break;
+ }
+
+ int numImages = context.getDeqpContext().getContextInfo().getInt(stageQuery);
+
+ return (numImages > 0) ? true : false;
+}
+
+bool glc::subgroups::isDoubleSupportedForDevice(Context& context)
+{
+ glu::ContextType contextType = context.getDeqpContext().getRenderContext().getType();
+ return (glu::contextSupports(contextType, glu::ApiType::core(4, 0)) ||
+ context.getDeqpContext().getContextInfo().isExtensionSupported("GL_ARB_gpu_shader_fp64"));
+}
+
+bool glc::subgroups::isDoubleFormat(Format format)
+{
+ switch (format)
+ {
+ default:
+ return false;
+ case FORMAT_R64_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
+ return true;
+ }
+}
+
+std::string glc::subgroups::getFormatNameForGLSL (Format format)
+{
+ switch (format)
+ {
+ default:
+ DE_FATAL("Unhandled format!");
+ return "";
+ case FORMAT_R32_SINT:
+ return "int";
+ case FORMAT_R32G32_SINT:
+ return "ivec2";
+ case FORMAT_R32G32B32_SINT:
+ return "ivec3";
+ case FORMAT_R32G32B32A32_SINT:
+ return "ivec4";
+ case FORMAT_R32_UINT:
+ return "uint";
+ case FORMAT_R32G32_UINT:
+ return "uvec2";
+ case FORMAT_R32G32B32_UINT:
+ return "uvec3";
+ case FORMAT_R32G32B32A32_UINT:
+ return "uvec4";
+ case FORMAT_R32_SFLOAT:
+ return "float";
+ case FORMAT_R32G32_SFLOAT:
+ return "vec2";
+ case FORMAT_R32G32B32_SFLOAT:
+ return "vec3";
+ case FORMAT_R32G32B32A32_SFLOAT:
+ return "vec4";
+ case FORMAT_R64_SFLOAT:
+ return "double";
+ case FORMAT_R64G64_SFLOAT:
+ return "dvec2";
+ case FORMAT_R64G64B64_SFLOAT:
+ return "dvec3";
+ case FORMAT_R64G64B64A64_SFLOAT:
+ return "dvec4";
+ case FORMAT_R32_BOOL:
+ return "bool";
+ case FORMAT_R32G32_BOOL:
+ return "bvec2";
+ case FORMAT_R32G32B32_BOOL:
+ return "bvec3";
+ case FORMAT_R32G32B32A32_BOOL:
+ return "bvec4";
+ }
+}
+
+void glc::subgroups::setVertexShaderFrameBuffer (SourceCollections& programCollection)
+{
+ programCollection.add("vert") << glu::VertexSource(
+ "${VERSION_DECL}\n"
+ "layout(location = 0) in highp vec4 in_position;\n"
+ "void main (void)\n"
+ "{\n"
+ " gl_Position = in_position;\n"
+ "}\n");
+}
+
+void glc::subgroups::setFragmentShaderFrameBuffer (SourceCollections& programCollection)
+{
+ programCollection.add("fragment") << glu::FragmentSource(
+ "${VERSION_DECL}\n"
+ "precision highp int;\n"
+ "layout(location = 0) in highp float in_color;\n"
+ "layout(location = 0) out uint out_color;\n"
+ "void main()\n"
+ "{\n"
+ " out_color = uint(in_color);\n"
+ "}\n");
+}
+
+void glc::subgroups::setTesCtrlShaderFrameBuffer (SourceCollections& programCollection)
+{
+ programCollection.add("tesc") << glu::TessellationControlSource(
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ "#extension GL_EXT_tessellation_shader : require\n"
+ "layout(vertices = 2) out;\n"
+ "void main (void)\n"
+ "{\n"
+ " if (gl_InvocationID == 0)\n"
+ " {\n"
+ " gl_TessLevelOuter[0] = 1.0f;\n"
+ " gl_TessLevelOuter[1] = 1.0f;\n"
+ " }\n"
+ " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ "}\n");
+}
+
+void glc::subgroups::setTesEvalShaderFrameBuffer (SourceCollections& programCollection)
+{
+ programCollection.add("tese") << glu::TessellationEvaluationSource(
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "#extension GL_EXT_tessellation_shader : require\n"
+ "layout(isolines, equal_spacing, ccw ) in;\n"
+ "layout(location = 0) in float in_color[];\n"
+ "layout(location = 0) out float out_color;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
+ " out_color = in_color[0];\n"
+ "}\n");
+}
+
+void glc::subgroups::addGeometryShadersFromTemplate (const std::string& glslTemplate, SourceCollections& collection)
+{
+ tcu::StringTemplate geometryTemplate(glslTemplate);
+
+ map<string, string> linesParams;
+ linesParams.insert(pair<string, string>("TOPOLOGY", "lines"));
+
+ map<string, string> pointsParams;
+ pointsParams.insert(pair<string, string>("TOPOLOGY", "points"));
+
+ collection.add("geometry_lines") << glu::GeometrySource("${VERSION_DECL}\n" + geometryTemplate.specialize(linesParams));
+ collection.add("geometry_points") << glu::GeometrySource("${VERSION_DECL}\n" + geometryTemplate.specialize(pointsParams));
+}
+
+void initializeMemory(deqp::Context& context, glw::GLvoid *hostPtr, subgroups::SSBOData& data)
+{
+ using namespace subgroups;
+ const Format format = data.format;
+ const deUint64 size = data.numElements *
+ (data.isImage ? getFormatSizeInBytes(format) : getElementSizeInBytes(format, data.layout));
+ if (subgroups::SSBOData::InitializeNonZero == data.initializeType)
+ {
+ de::Random rnd(context.getTestContext().getCommandLine().getBaseSeed());
+ switch (format)
+ {
+ default:
+ DE_FATAL("Illegal buffer format");
+ break;
+ case FORMAT_R32_BOOL:
+ case FORMAT_R32G32_BOOL:
+ case FORMAT_R32G32B32_BOOL:
+ case FORMAT_R32G32B32A32_BOOL:
+ case FORMAT_R32_SINT:
+ case FORMAT_R32G32_SINT:
+ case FORMAT_R32G32B32_SINT:
+ case FORMAT_R32G32B32A32_SINT:
+ case FORMAT_R32_UINT:
+ case FORMAT_R32G32_UINT:
+ case FORMAT_R32G32B32_UINT:
+ case FORMAT_R32G32B32A32_UINT:
+ {
+ deUint32* ptr = reinterpret_cast<deUint32*>(hostPtr);
+
+ for (deUint64 k = 0; k < (size / sizeof(deUint32)); k++)
+ {
+ ptr[k] = rnd.getUint32();
+ }
+ }
+ break;
+ case FORMAT_R32_SFLOAT:
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ {
+ float* ptr = reinterpret_cast<float*>(hostPtr);
+
+ for (deUint64 k = 0; k < (size / sizeof(float)); k++)
+ {
+ ptr[k] = rnd.getFloat();
+ }
+ }
+ break;
+ case FORMAT_R64_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
+ {
+ double* ptr = reinterpret_cast<double*>(hostPtr);
+
+ for (deUint64 k = 0; k < (size / sizeof(double)); k++)
+ {
+ ptr[k] = rnd.getDouble();
+ }
+ }
+ break;
+ }
+ }
+ else if (subgroups::SSBOData::InitializeZero == data.initializeType)
+ {
+ deUint32* ptr = reinterpret_cast<deUint32*>(hostPtr);
+
+ for (deUint64 k = 0; k < size / 4; k++)
+ {
+ ptr[k] = 0;
+ }
+ }
+
+ if (subgroups::SSBOData::InitializeNone != data.initializeType)
+ {
+ // nothing to do for GL
+ }
+}
+
+deUint32 getResultBinding (const glc::subgroups::ShaderStageFlags shaderStage)
+{
+ using namespace glc::subgroups;
+ switch(shaderStage)
+ {
+ case SHADER_STAGE_VERTEX_BIT:
+ return 0u;
+ break;
+ case SHADER_STAGE_TESS_CONTROL_BIT:
+ return 1u;
+ break;
+ case SHADER_STAGE_TESS_EVALUATION_BIT:
+ return 2u;
+ break;
+ case SHADER_STAGE_GEOMETRY_BIT:
+ return 3u;
+ break;
+ default:
+ DE_ASSERT(0);
+ return -1;
+ }
+ DE_ASSERT(0);
+ return -1;
+}
+
+tcu::TestStatus glc::subgroups::makeTessellationEvaluationFrameBufferTest(
+ Context& context, Format format, SSBOData* extraData,
+ deUint32 extraDataCount,
+ bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize),
+ const ShaderStageFlags shaderStage)
+{
+ tcu::TestLog& log = context.getDeqpContext().getTestContext().getLog();
+ const glw::Functions& gl = context.getDeqpContext().getRenderContext().getFunctions();
+
+ const deUint32 maxWidth = getMaxWidth();
+ vector<de::SharedPtr<BufferOrImage> > inputBuffers (extraDataCount);
+
+ const GlslSource& vshader = context.getSourceCollection().get("vert");
+ const GlslSource& tcshader = context.getSourceCollection().get("tesc");
+ const GlslSource& teshader = context.getSourceCollection().get("tese");
+ const GlslSource& fshader = context.getSourceCollection().get("fragment");
+
+ for (deUint32 i = 0u; i < extraDataCount; i++)
+ {
+ if (extraData[i].isImage)
+ {
+ inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Image(context, static_cast<deUint32>(extraData[i].numElements), 1u, extraData[i].format));
+ // haven't implemented init for images yet
+ DE_ASSERT(extraData[i].initializeType == subgroups::SSBOData::InitializeNone);
+ }
+ else
+ {
+ deUint64 size = getElementSizeInBytes(extraData[i].format, extraData[i].layout) * extraData[i].numElements;
+ inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Buffer(context, size, GL_UNIFORM_BUFFER));
+
+ glw::GLvoid *ptr = inputBuffers[i]->getAsBuffer()->mapBufferPtr();
+ initializeMemory(context.getDeqpContext(), ptr, extraData[i]);
+ inputBuffers[i]->getAsBuffer()->unmapBufferPtr();
+ }
+ }
+
+ for (deUint32 ndx = 0u; ndx < extraDataCount; ndx++)
+ {
+ log << tcu::TestLog::Message
+ << "binding inputBuffers[" << ndx << "](" << inputBuffers[ndx]->getType() << ", " << inputBuffers[ndx]->getId() << " ), "
+ << "stage = " << shaderStage << " , binding = " << extraData[ndx].binding << "\n"
+ << tcu::TestLog::EndMessage;
+
+ if (inputBuffers[ndx]->isImage())
+ {
+ gl.bindImageTexture(extraData[ndx].binding, inputBuffers[ndx]->getId(),
+ 0, GL_FALSE, 0, GL_READ_ONLY, extraData[ndx].format);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindImageTexture()");
+ } else
+ {
+ gl.bindBufferBase(inputBuffers[ndx]->getType(), extraData[ndx].binding, inputBuffers[ndx]->getId());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBufferBase()");
+ }
+ }
+
+ de::MovePtr<glu::ShaderProgram> pipeline(
+ makeGraphicsPipeline(context, (ShaderStageFlags)(SHADER_STAGE_VERTEX_BIT | SHADER_STAGE_FRAGMENT_BIT | SHADER_STAGE_TESS_CONTROL_BIT | SHADER_STAGE_TESS_EVALUATION_BIT),
+ &vshader, &fshader, DE_NULL, &tcshader, &teshader));
+ if (!pipeline->isOk())
+ {
+ return tcu::TestStatus::fail("tese graphics program build failed");
+ }
+
+ const deUint32 subgroupSize = getSubgroupSize(context);
+ const deUint64 vertexBufferSize = 2ull * maxWidth * sizeof(tcu::Vec4);
+ Buffer vertexBuffer (context, vertexBufferSize, GL_ARRAY_BUFFER);
+ unsigned totalIterations = 0u;
+ unsigned failedIterations = 0u;
+ Image discardableImage (context, maxWidth, 1u, format);
+
+ {
+ glw::GLvoid * bufferPtr = vertexBuffer.mapBufferPtr();
+ std::vector<tcu::Vec4> data (2u * maxWidth, tcu::Vec4(1.0f, 0.0f, 1.0f, 1.0f));
+ const float pixelSize = 2.0f / static_cast<float>(maxWidth);
+ float leftHandPosition = -1.0f;
+
+ for(deUint32 ndx = 0u; ndx < data.size(); ndx+=2u)
+ {
+ data[ndx][0] = leftHandPosition;
+ leftHandPosition += pixelSize;
+ data[ndx+1][0] = leftHandPosition;
+ }
+
+ deMemcpy(bufferPtr, &data[0], data.size() * sizeof(tcu::Vec4));
+ vertexBuffer.unmapBufferPtr();
+ }
+
+ Vao vao(context);
+ Fbo fbo(context);
+ fbo.bind2D(discardableImage);
+
+ gl.viewport(0, 0, maxWidth, 1u);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport");
+
+ const deUint64 imageResultSize = getFormatSizeInBytes(format) * maxWidth;
+ vector<glw::GLubyte> imageBufferResult(imageResultSize);
+ const deUint64 vertexBufferOffset = 0u;
+
+ for (deUint32 width = 1u; width < maxWidth; width = getNextWidth(width))
+ {
+ totalIterations++;
+
+ {
+ gl.clearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glClearColor");
+ gl.clear(GL_COLOR_BUFFER_BIT);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glClear");
+
+ gl.useProgram(pipeline->getProgram());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram");
+
+ gl.enableVertexAttribArray(0);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray");
+
+ gl.bindBuffer(GL_ARRAY_BUFFER, vertexBuffer.getId());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer");
+
+ gl.vertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(tcu::Vec4), glu::BufferOffsetAsPointer(vertexBufferOffset));
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer");
+
+ gl.patchParameteri(GL_PATCH_VERTICES, 2u);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glPatchParameter(PATCH_VERTICES)");
+
+ gl.drawArrays(GL_PATCHES, 0, 2 * width);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays");
+
+ gl.disableVertexAttribArray(0);
+
+ GLenum readFormat;
+ GLenum readType;
+ getFormatReadInfo(format, readFormat, readType);
+
+ gl.readPixels(0, 0, width, 1, readFormat, readType, (GLvoid*)&imageBufferResult[0]);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels");
+ }
+
+ {
+ std::vector<const void*> datas;
+ datas.push_back(&imageBufferResult[0]);
+ if (!checkResult(datas, width/2u, subgroupSize))
+ failedIterations++;
+ }
+ }
+
+ if (0 < failedIterations)
+ {
+ log << tcu::TestLog::Message << (totalIterations - failedIterations) << " / "
+ << totalIterations << " values passed" << tcu::TestLog::EndMessage;
+ return tcu::TestStatus::fail("Failed!");
+ } else
+ {
+ log << tcu::TestLog::Message << (totalIterations - failedIterations) << " / "
+ <<totalIterations << " values passed" << tcu::TestLog::EndMessage;
+ }
+
+ return tcu::TestStatus::pass("OK");
+}
+
+bool glc::subgroups::check(std::vector<const void*> datas,
+ deUint32 width, deUint32 ref)
+{
+ const deUint32* data = reinterpret_cast<const deUint32*>(datas[0]);
+
+ for (deUint32 n = 0; n < width; ++n)
+ {
+ if (data[n] != ref)
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool glc::subgroups::checkCompute(std::vector<const void*> datas,
+ const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+ deUint32 ref)
+{
+ const deUint32 globalSizeX = numWorkgroups[0] * localSize[0];
+ const deUint32 globalSizeY = numWorkgroups[1] * localSize[1];
+ const deUint32 globalSizeZ = numWorkgroups[2] * localSize[2];
+
+ return check(datas, globalSizeX * globalSizeY * globalSizeZ, ref);
+}
+
+
+tcu::TestStatus glc::subgroups::makeGeometryFrameBufferTest(
+ Context& context, Format format, SSBOData* extraData,
+ deUint32 extraDataCount,
+ bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize))
+{
+ tcu::TestLog& log = context.getDeqpContext().getTestContext().getLog();
+ const glw::Functions& gl = context.getDeqpContext().getRenderContext().getFunctions();
+
+ const deUint32 maxWidth = getMaxWidth();
+ vector<de::SharedPtr<BufferOrImage> > inputBuffers (extraDataCount);
+
+ const GlslSource& vshader = context.getSourceCollection().get("vert");
+ const GlslSource& gshader = context.getSourceCollection().get("geometry");
+ const GlslSource& fshader = context.getSourceCollection().get("fragment");
+
+ for (deUint32 i = 0u; i < extraDataCount; i++)
+ {
+ if (extraData[i].isImage)
+ {
+ inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Image(context, static_cast<deUint32>(extraData[i].numElements), 1u, extraData[i].format));
+ // haven't implemented init for images yet
+ DE_ASSERT(extraData[i].initializeType == subgroups::SSBOData::InitializeNone);
+ }
+ else
+ {
+ deUint64 size = getElementSizeInBytes(extraData[i].format, extraData[i].layout) * extraData[i].numElements;
+ inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Buffer(context, size, GL_UNIFORM_BUFFER));
+
+ glw::GLvoid *ptr = inputBuffers[i]->getAsBuffer()->mapBufferPtr();
+ initializeMemory(context.getDeqpContext(), ptr, extraData[i]);
+ inputBuffers[i]->getAsBuffer()->unmapBufferPtr();
+ }
+ }
+
+ for (deUint32 ndx = 0u; ndx < extraDataCount; ndx++)
+ {
+ log << tcu::TestLog::Message
+ << "binding inputBuffers[" << ndx << "](" << inputBuffers[ndx]->getType() << ", " << inputBuffers[ndx]->getId() << " ), "
+ << "GEOMETRY, binding = " << extraData[ndx].binding << "\n"
+ << tcu::TestLog::EndMessage;
+
+ if (inputBuffers[ndx]->isImage())
+ {
+ gl.bindImageTexture(extraData[ndx].binding, inputBuffers[ndx]->getId(),
+ 0, GL_FALSE, 0, GL_READ_ONLY, extraData[ndx].format);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindImageTexture()");
+ } else
+ {
+ gl.bindBufferBase(inputBuffers[ndx]->getType(), extraData[ndx].binding, inputBuffers[ndx]->getId());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBufferBase()");
+ }
+ }
+
+ de::MovePtr<glu::ShaderProgram> pipeline(
+ makeGraphicsPipeline(context, (ShaderStageFlags)(SHADER_STAGE_VERTEX_BIT | SHADER_STAGE_FRAGMENT_BIT | SHADER_STAGE_GEOMETRY_BIT),
+ &vshader, &fshader, &gshader, DE_NULL, DE_NULL));
+ if (!pipeline->isOk())
+ {
+ return tcu::TestStatus::fail("geom graphics program build failed");
+ }
+
+ const deUint32 subgroupSize = getSubgroupSize(context);
+ const deUint64 vertexBufferSize = maxWidth * sizeof(tcu::Vec4);
+ Buffer vertexBuffer (context, vertexBufferSize, GL_ARRAY_BUFFER);
+ unsigned totalIterations = 0u;
+ unsigned failedIterations = 0u;
+ Image discardableImage (context, maxWidth, 1u, format);
+
+ {
+ glw::GLvoid * bufferPtr = vertexBuffer.mapBufferPtr();
+ std::vector<tcu::Vec4> data (maxWidth, tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
+ const float pixelSize = 2.0f / static_cast<float>(maxWidth);
+ float leftHandPosition = -1.0f;
+
+ for(deUint32 ndx = 0u; ndx < maxWidth; ++ndx)
+ {
+ data[ndx][0] = leftHandPosition + pixelSize / 2.0f;
+ leftHandPosition += pixelSize;
+ }
+
+ deMemcpy(bufferPtr, &data[0], maxWidth * sizeof(tcu::Vec4));
+ vertexBuffer.unmapBufferPtr();
+ }
+
+ Vao vao(context);
+ Fbo fbo(context);
+ fbo.bind2D(discardableImage);
+
+ gl.viewport(0, 0, maxWidth, 1u);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport");
+
+ const deUint64 imageResultSize = getFormatSizeInBytes(format) * maxWidth;
+ vector<glw::GLubyte> imageBufferResult(imageResultSize);
+ const deUint64 vertexBufferOffset = 0u;
+
+ for (deUint32 width = 1u; width < maxWidth; width = getNextWidth(width))
+ {
+ totalIterations++;
+
+ for (deUint32 ndx = 0u; ndx < inputBuffers.size(); ndx++)
+ {
+ if (inputBuffers[ndx]->isImage())
+ {
+ DE_ASSERT(extraData[ndx].initializeType == subgroups::SSBOData::InitializeNone);
+ } else
+ {
+ glw::GLvoid *ptr = inputBuffers[ndx]->getAsBuffer()->mapBufferPtr();
+ initializeMemory(context.getDeqpContext(), ptr, extraData[ndx]);
+ inputBuffers[ndx]->getAsBuffer()->unmapBufferPtr();
+ }
+ }
+
+ {
+ gl.clearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glClearColor");
+ gl.clear(GL_COLOR_BUFFER_BIT);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glClear");
+
+ gl.useProgram(pipeline->getProgram());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram");
+
+ gl.enableVertexAttribArray(0);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray");
+
+ gl.bindBuffer(GL_ARRAY_BUFFER, vertexBuffer.getId());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer");
+
+ gl.vertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(tcu::Vec4), glu::BufferOffsetAsPointer(vertexBufferOffset));
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer");
+
+ gl.drawArrays(GL_POINTS, 0, width);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays");
+
+ gl.disableVertexAttribArray(0);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glDisableVertexAttribArray");
+
+ GLenum readFormat;
+ GLenum readType;
+ getFormatReadInfo(format, readFormat, readType);
+
+ gl.readPixels(0, 0, width, 1, readFormat, readType, (GLvoid*)&imageBufferResult[0]);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels");
+ }
+
+ {
+ std::vector<const void*> datas;
+ datas.push_back(&imageBufferResult[0]);
+ if (!checkResult(datas, width, subgroupSize))
+ failedIterations++;
+ }
+ }
+
+ if (0 < failedIterations)
+ {
+ log << tcu::TestLog::Message << (totalIterations - failedIterations) << " / "
+ << totalIterations << " values passed" << tcu::TestLog::EndMessage;
+ return tcu::TestStatus::fail("Failed!");
+ } else
+ {
+ log << tcu::TestLog::Message << (totalIterations - failedIterations) << " / "
+ <<totalIterations << " values passed" << tcu::TestLog::EndMessage;
+ }
+
+ return tcu::TestStatus::pass("OK");
+}
+
+tcu::TestStatus glc::subgroups::allStages(
+ Context& context, Format format, SSBOData* extraDatas,
+ deUint32 extraDatasCount,
+ bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize),
+ const ShaderStageFlags shaderStageTested)
+{
+ const deUint32 maxWidth = getMaxWidth();
+ vector<ShaderStageFlags> stagesVector;
+ ShaderStageFlags shaderStageRequired = (ShaderStageFlags)0ull;
+ tcu::TestLog& log = context.getDeqpContext().getTestContext().getLog();
+ const glw::Functions& gl = context.getDeqpContext().getRenderContext().getFunctions();
+
+ if (shaderStageTested & SHADER_STAGE_VERTEX_BIT)
+ {
+ stagesVector.push_back(SHADER_STAGE_VERTEX_BIT);
+ }
+ if (shaderStageTested & SHADER_STAGE_TESS_CONTROL_BIT)
+ {
+ stagesVector.push_back(SHADER_STAGE_TESS_CONTROL_BIT);
+ shaderStageRequired = (ShaderStageFlags)((deUint32)shaderStageRequired | ((deUint32)(shaderStageTested & SHADER_STAGE_TESS_EVALUATION_BIT) ? 0u : (deUint32)SHADER_STAGE_TESS_EVALUATION_BIT));
+ shaderStageRequired = (ShaderStageFlags)((deUint32)shaderStageRequired | ((deUint32)(shaderStageTested & SHADER_STAGE_VERTEX_BIT) ? 0u : (deUint32)SHADER_STAGE_VERTEX_BIT));
+ }
+ if (shaderStageTested & SHADER_STAGE_TESS_EVALUATION_BIT)
+ {
+ stagesVector.push_back(SHADER_STAGE_TESS_EVALUATION_BIT);
+ shaderStageRequired = (ShaderStageFlags)((deUint32)shaderStageRequired | ((deUint32)(shaderStageTested & SHADER_STAGE_VERTEX_BIT) ? 0u : (deUint32)SHADER_STAGE_VERTEX_BIT));
+ shaderStageRequired = (ShaderStageFlags)((deUint32)shaderStageRequired | ((deUint32)(shaderStageTested & SHADER_STAGE_TESS_CONTROL_BIT) ? 0u : (deUint32)SHADER_STAGE_TESS_CONTROL_BIT));
+ }
+ if (shaderStageTested & SHADER_STAGE_GEOMETRY_BIT)
+ {
+ stagesVector.push_back(SHADER_STAGE_GEOMETRY_BIT);
+ const ShaderStageFlags required = SHADER_STAGE_VERTEX_BIT;
+ shaderStageRequired = (ShaderStageFlags)((deUint32)shaderStageRequired | ((deUint32)(shaderStageTested & required) ? 0u : (deUint32)required));
+ }
+ if (shaderStageTested & SHADER_STAGE_FRAGMENT_BIT)
+ {
+ const ShaderStageFlags required = SHADER_STAGE_VERTEX_BIT;
+ shaderStageRequired = (ShaderStageFlags)((deUint32)shaderStageRequired | ((deUint32)(shaderStageTested & required) ? 0u : (deUint32)required));
+ }
+
+ const deUint32 stagesCount = static_cast<deUint32>(stagesVector.size());
+ const string vert = (shaderStageRequired & SHADER_STAGE_VERTEX_BIT) ? "vert_noSubgroup" : "vert";
+ const string tesc = (shaderStageRequired & SHADER_STAGE_TESS_CONTROL_BIT) ? "tesc_noSubgroup" : "tesc";
+ const string tese = (shaderStageRequired & SHADER_STAGE_TESS_EVALUATION_BIT) ? "tese_noSubgroup" : "tese";
+
+ shaderStageRequired = (ShaderStageFlags)(shaderStageTested | shaderStageRequired);
+
+ const GlslSource *vshader = &context.getSourceCollection().get(vert);
+ const GlslSource *fshader = DE_NULL;
+ const GlslSource *gshader = DE_NULL;
+ const GlslSource *tcshader = DE_NULL;
+ const GlslSource *teshader = DE_NULL;
+
+ if (shaderStageRequired & SHADER_STAGE_TESS_CONTROL_BIT)
+ {
+ tcshader = &context.getSourceCollection().get(tesc);
+ teshader = &context.getSourceCollection().get(tese);
+ }
+ if (shaderStageRequired & SHADER_STAGE_GEOMETRY_BIT)
+ {
+ if (shaderStageRequired & SHADER_STAGE_TESS_EVALUATION_BIT)
+ {
+ // tessellation shaders output line primitives
+ gshader = &context.getSourceCollection().get("geometry_lines");
+ }
+ else
+ {
+ // otherwise points are processed by geometry shader
+ gshader = &context.getSourceCollection().get("geometry_points");
+ }
+ }
+ if (shaderStageRequired & SHADER_STAGE_FRAGMENT_BIT)
+ {
+ fshader = &context.getSourceCollection().get("fragment");
+ }
+
+ std::vector< de::SharedPtr<BufferOrImage> > inputBuffers(stagesCount + extraDatasCount);
+
+ // The implicit result SSBO we use to store our outputs from the shader
+ for (deUint32 ndx = 0u; ndx < stagesCount; ++ndx)
+ {
+ const deUint64 shaderSize = (stagesVector[ndx] == SHADER_STAGE_TESS_EVALUATION_BIT) ? maxWidth * 2 : maxWidth;
+ const deUint64 size = getElementSizeInBytes(format, SSBOData::LayoutStd430) * shaderSize;
+ inputBuffers[ndx] = de::SharedPtr<BufferOrImage>(new Buffer(context, size));
+
+ log << tcu::TestLog::Message
+ << "binding inputBuffers[" << ndx << "](" << inputBuffers[ndx]->getType() << ", "
+ << inputBuffers[ndx]->getId() << ", " << size << "), "
+ << "inputstage[" << ndx << "] = " << stagesVector[ndx] << " binding = " << getResultBinding(stagesVector[ndx])
+ << tcu::TestLog::EndMessage;
+
+ gl.bindBufferBase(inputBuffers[ndx]->getType(), getResultBinding(stagesVector[ndx]), inputBuffers[ndx]->getId());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBufferBase(ndx, inputBuffers[ndx])");
+ }
+
+ for (deUint32 ndx = stagesCount; ndx < stagesCount + extraDatasCount; ++ndx)
+ {
+ const deUint32 datasNdx = ndx - stagesCount;
+ if (extraDatas[datasNdx].isImage)
+ {
+ inputBuffers[ndx] = de::SharedPtr<BufferOrImage>(new Image(context, static_cast<deUint32>(extraDatas[datasNdx].numElements), 1, extraDatas[datasNdx].format));
+
+ // haven't implemented init for images yet
+ DE_ASSERT(extraDatas[datasNdx].initializeType == subgroups::SSBOData::InitializeNone);
+ }
+ else
+ {
+ const deUint64 size = getElementSizeInBytes(extraDatas[datasNdx].format, extraDatas[datasNdx].layout) * extraDatas[datasNdx].numElements;
+ inputBuffers[ndx] = de::SharedPtr<BufferOrImage>(new Buffer(context, size));
+
+ glw::GLvoid *ptr = inputBuffers[ndx]->getAsBuffer()->mapBufferPtr();
+ initializeMemory(context.getDeqpContext(), ptr, extraDatas[datasNdx]);
+ inputBuffers[ndx]->getAsBuffer()->unmapBufferPtr();
+ }
+
+ log << tcu::TestLog::Message
+ << "binding inputBuffers[" << ndx << "](" << inputBuffers[ndx]->getType() << ", "
+ << inputBuffers[ndx]->getId() << ", " << extraDatas[datasNdx].numElements << " els), "
+ << "extrastage[" << datasNdx << "] = " << extraDatas[datasNdx].stages << " binding = " << extraDatas[datasNdx].binding
+ << tcu::TestLog::EndMessage;
+
+ if (inputBuffers[ndx]->isImage())
+ {
+ gl.bindImageTexture(extraDatas[datasNdx].binding, inputBuffers[ndx]->getId(),
+ 0, GL_FALSE, 0, GL_READ_WRITE, extraDatas[datasNdx].format);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindImageTexture(extraDatas[datasNdx])");
+ } else
+ {
+ gl.bindBufferBase(inputBuffers[ndx]->getType(), extraDatas[datasNdx].binding, inputBuffers[ndx]->getId());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBufferBase(extraDatas[datasNdx])");
+ }
+ }
+
+ de::MovePtr<glu::ShaderProgram> pipeline(
+ makeGraphicsPipeline(context, shaderStageRequired, vshader, fshader, gshader, tcshader, teshader));
+
+ if (!pipeline->isOk())
+ {
+ return tcu::TestStatus::fail("allstages graphics program build failed");
+ }
+
+ {
+ const deUint32 subgroupSize = getSubgroupSize(context);
+ unsigned totalIterations = 0u;
+ unsigned failedIterations = 0u;
+ Image resultImage (context, maxWidth, 1, format);
+ const deUint64 imageResultSize = getFormatSizeInBytes(format) * maxWidth;
+ vector<glw::GLubyte> imageBufferResult(imageResultSize);
+
+ Vao vao(context);
+ Fbo fbo(context);
+ fbo.bind2D(resultImage);
+
+ gl.viewport(0, 0, maxWidth, 1u);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "viewport");
+
+ for (deUint32 width = 1u; width < maxWidth; width = getNextWidth(width))
+ {
+ for (deUint32 ndx = stagesCount; ndx < stagesCount + extraDatasCount; ++ndx)
+ {
+ // re-init the data
+ if (extraDatas[ndx - stagesCount].isImage)
+ {
+ // haven't implemented init for images yet
+ DE_ASSERT(extraDatas[ndx - stagesCount].initializeType == subgroups::SSBOData::InitializeNone);
+ } else
+ {
+ glw::GLvoid *ptr = inputBuffers[ndx]->getAsBuffer()->mapBufferPtr();
+ initializeMemory(context.getDeqpContext(), ptr, extraDatas[ndx - stagesCount]);
+ inputBuffers[ndx]->getAsBuffer()->unmapBufferPtr();
+ }
+ }
+
+ totalIterations++;
+
+ gl.clearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glClearColor");
+ gl.clear(GL_COLOR_BUFFER_BIT);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glClear");
+
+ gl.useProgram(pipeline->getProgram());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram");
+
+ glw::GLenum drawType;
+ if (shaderStageRequired & SHADER_STAGE_TESS_CONTROL_BIT)
+ {
+ drawType = GL_PATCHES;
+ gl.patchParameteri(GL_PATCH_VERTICES, 1u);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glPatchParameter(PATCH_VERTICES)");
+ } else
+ {
+ drawType = GL_POINTS;
+ }
+
+ gl.drawArrays(drawType, 0, width);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays");
+
+ GLenum readFormat;
+ GLenum readType;
+ getFormatReadInfo(format, readFormat, readType);
+
+ gl.readPixels(0, 0, width, 1, readFormat, readType, (GLvoid*)&imageBufferResult[0]);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels");
+
+ for (deUint32 ndx = 0u; ndx < stagesCount; ++ndx)
+ {
+ std::vector<const void*> datas;
+ std::vector<Buffer *> buffersToUnmap;
+
+ if (!inputBuffers[ndx]->isImage())
+ {
+ glw::GLvoid * resultData = inputBuffers[ndx]->getAsBuffer()->mapBufferPtr();
+ buffersToUnmap.push_back(inputBuffers[ndx]->getAsBuffer());
+ // we always have our result data first
+ datas.push_back(resultData);
+ }
+
+ for (deUint32 index = stagesCount; index < stagesCount + extraDatasCount; ++index)
+ {
+ const deUint32 datasNdx = index - stagesCount;
+ if ((stagesVector[ndx] & extraDatas[datasNdx].stages) && (!inputBuffers[index]->isImage()))
+ {
+ glw::GLvoid * resultData = inputBuffers[index]->getAsBuffer()->mapBufferPtr();
+ buffersToUnmap.push_back(inputBuffers[index]->getAsBuffer());
+ datas.push_back(resultData);
+ }
+ }
+
+ if (!checkResult(datas, (stagesVector[ndx] == SHADER_STAGE_TESS_EVALUATION_BIT) ? width * 2 : width , subgroupSize))
+ failedIterations++;
+
+ while( !buffersToUnmap.empty() )
+ {
+ Buffer * buf = buffersToUnmap.back();
+ buf->unmapBufferPtr();
+ buffersToUnmap.pop_back();
+ }
+ }
+ if (shaderStageTested & SHADER_STAGE_FRAGMENT_BIT)
+ {
+ std::vector<const void*> datas;
+ std::vector<Buffer *> buffersToUnmap;
+
+ // we always have our result data first
+ datas.push_back(&imageBufferResult[0]);
+
+ for (deUint32 index = stagesCount; index < stagesCount + extraDatasCount; ++index)
+ {
+ const deUint32 datasNdx = index - stagesCount;
+ if (SHADER_STAGE_FRAGMENT_BIT & extraDatas[datasNdx].stages && (!inputBuffers[index]->isImage()))
+ {
+ glw::GLvoid * resultData = inputBuffers[index]->getAsBuffer()->mapBufferPtr();
+ buffersToUnmap.push_back(inputBuffers[index]->getAsBuffer());
+ // we always have our result data first
+ datas.push_back(resultData);
+ }
+ }
+
+ if (!checkResult(datas, width, subgroupSize))
+ failedIterations++;
+
+ while( !buffersToUnmap.empty() )
+ {
+ Buffer * buf = buffersToUnmap.back();
+ buf->unmapBufferPtr();
+ buffersToUnmap.pop_back();
+ }
+ }
+
+ }
+
+ if (0 < failedIterations)
+ {
+ log << tcu::TestLog::Message << (totalIterations - failedIterations) << " / "
+ << totalIterations << " values passed" << tcu::TestLog::EndMessage;
+ return tcu::TestStatus::fail("Failed!");
+ } else
+ {
+ log << tcu::TestLog::Message << (totalIterations - failedIterations) << " / "
+ << totalIterations << " values passed" << tcu::TestLog::EndMessage;
+ }
+ }
+ return tcu::TestStatus::pass("OK");
+}
+
+tcu::TestStatus glc::subgroups::makeVertexFrameBufferTest(Context& context, Format format,
+ SSBOData* extraData, deUint32 extraDataCount,
+ bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize))
+{
+ tcu::TestLog& log = context.getDeqpContext().getTestContext().getLog();
+ const glw::Functions& gl = context.getDeqpContext().getRenderContext().getFunctions();
+
+ const deUint32 maxWidth = getMaxWidth();
+ vector<de::SharedPtr<BufferOrImage> > inputBuffers (extraDataCount);
+
+ const GlslSource& vshader = context.getSourceCollection().get("vert");
+ const GlslSource& fshader = context.getSourceCollection().get("fragment");
+
+ for (deUint32 i = 0u; i < extraDataCount; i++)
+ {
+ if (extraData[i].isImage)
+ {
+ inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Image(context, static_cast<deUint32>(extraData[i].numElements), 1u, extraData[i].format));
+
+ // haven't implemented init for images yet
+ DE_ASSERT(extraData[i].initializeType == subgroups::SSBOData::InitializeNone);
+ }
+ else
+ {
+ deUint64 size = getElementSizeInBytes(extraData[i].format, extraData[i].layout) * extraData[i].numElements;
+ inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Buffer(context, size, GL_UNIFORM_BUFFER));
+
+ glw::GLvoid *ptr = inputBuffers[i]->getAsBuffer()->mapBufferPtr();
+ initializeMemory(context.getDeqpContext(), ptr, extraData[i]);
+ inputBuffers[i]->getAsBuffer()->unmapBufferPtr();
+ }
+ }
+
+ for (deUint32 ndx = 0u; ndx < extraDataCount; ndx++)
+ {
+ log << tcu::TestLog::Message
+ << "binding inputBuffers[" << ndx << "](" << inputBuffers[ndx]->getType() << ", " << inputBuffers[ndx]->getId() << " ), "
+ << "VERTEX, binding = " << extraData[ndx].binding << "\n"
+ << tcu::TestLog::EndMessage;
+
+ if (inputBuffers[ndx]->isImage())
+ {
+ gl.bindImageTexture(extraData[ndx].binding, inputBuffers[ndx]->getId(),
+ 0, GL_FALSE, 0, GL_READ_ONLY, extraData[ndx].format);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindImageTexture()");
+ } else
+ {
+ gl.bindBufferBase(inputBuffers[ndx]->getType(), extraData[ndx].binding, inputBuffers[ndx]->getId());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBufferBase()");
+ }
+ }
+
+ de::MovePtr<glu::ShaderProgram> pipeline(
+ makeGraphicsPipeline(context, (ShaderStageFlags)(SHADER_STAGE_VERTEX_BIT | SHADER_STAGE_FRAGMENT_BIT),
+ &vshader, &fshader, DE_NULL, DE_NULL, DE_NULL));
+
+ if (!pipeline->isOk())
+ {
+ return tcu::TestStatus::fail("vert graphics program build failed");
+ }
+
+ const deUint32 subgroupSize = getSubgroupSize(context);
+
+ const deUint64 vertexBufferSize = maxWidth * sizeof(tcu::Vec4);
+ Buffer vertexBuffer (context, vertexBufferSize, GL_ARRAY_BUFFER);
+
+ unsigned totalIterations = 0u;
+ unsigned failedIterations = 0u;
+
+ Image discardableImage (context, maxWidth, 1u, format);
+
+ {
+ glw::GLvoid * bufferPtr = vertexBuffer.mapBufferPtr();
+ std::vector<tcu::Vec4> data (maxWidth, tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
+ const float pixelSize = 2.0f / static_cast<float>(maxWidth);
+ float leftHandPosition = -1.0f;
+
+ for(deUint32 ndx = 0u; ndx < maxWidth; ++ndx)
+ {
+ data[ndx][0] = leftHandPosition + pixelSize / 2.0f;
+ leftHandPosition += pixelSize;
+ }
+
+ deMemcpy(bufferPtr, &data[0], maxWidth * sizeof(tcu::Vec4));
+ vertexBuffer.unmapBufferPtr();
+ }
+
+ Vao vao(context);
+ Fbo fbo(context);
+ fbo.bind2D(discardableImage);
+
+ gl.viewport(0, 0, maxWidth, 1u);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport");
+
+ const deUint64 imageResultSize = getFormatSizeInBytes(format) * maxWidth;
+ vector<glw::GLubyte> imageBufferResult(imageResultSize);
+ const deUint64 vertexBufferOffset = 0u;
+
+ for (deUint32 width = 1u; width < maxWidth; width = getNextWidth(width))
+ {
+ totalIterations++;
+
+ for (deUint32 ndx = 0u; ndx < inputBuffers.size(); ndx++)
+ {
+ if (inputBuffers[ndx]->isImage())
+ {
+ DE_ASSERT(extraData[ndx].initializeType == subgroups::SSBOData::InitializeNone);
+ } else
+ {
+ glw::GLvoid *ptr = inputBuffers[ndx]->getAsBuffer()->mapBufferPtr();
+ initializeMemory(context.getDeqpContext(), ptr, extraData[ndx]);
+ inputBuffers[ndx]->getAsBuffer()->unmapBufferPtr();
+ }
+ }
+
+ {
+ gl.clearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glClearColor");
+ gl.clear(GL_COLOR_BUFFER_BIT);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glClear");
+
+ gl.useProgram(pipeline->getProgram());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram");
+
+ gl.enableVertexAttribArray(0);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray");
+
+ gl.bindBuffer(GL_ARRAY_BUFFER, vertexBuffer.getId());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer");
+
+ gl.vertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(tcu::Vec4), glu::BufferOffsetAsPointer(vertexBufferOffset));
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer");
+
+ gl.drawArrays(GL_POINTS, 0, width);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays");
+
+ gl.disableVertexAttribArray(0);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glDisableVertexAttribArray");
+
+ GLenum readFormat;
+ GLenum readType;
+ getFormatReadInfo(format, readFormat, readType);
+
+ gl.readPixels(0, 0, width, 1, readFormat, readType, (GLvoid*)&imageBufferResult[0]);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels");
+ }
+
+ {
+ std::vector<const void*> datas;
+ datas.push_back(&imageBufferResult[0]);
+ if (!checkResult(datas, width, subgroupSize))
+ failedIterations++;
+ }
+ }
+
+ if (0 < failedIterations)
+ {
+ log << tcu::TestLog::Message << (totalIterations - failedIterations) << " / "
+ << totalIterations << " values passed" << tcu::TestLog::EndMessage;
+ return tcu::TestStatus::fail("Failed!");
+ } else
+ {
+ log << tcu::TestLog::Message << (totalIterations - failedIterations) << " / "
+ <<totalIterations << " values passed" << tcu::TestLog::EndMessage;
+ }
+
+ return tcu::TestStatus::pass("OK");
+}
+
+
+tcu::TestStatus glc::subgroups::makeFragmentFrameBufferTest (Context& context, Format format, SSBOData* extraDatas,
+ deUint32 extraDatasCount,
+ bool (*checkResult)(std::vector<const void*> datas, deUint32 width,
+ deUint32 height, deUint32 subgroupSize))
+{
+ tcu::TestLog& log = context.getDeqpContext().getTestContext().getLog();
+ const glw::Functions& gl = context.getDeqpContext().getRenderContext().getFunctions();
+
+ const GlslSource& vshader = context.getSourceCollection().get("vert");
+ const GlslSource& fshader = context.getSourceCollection().get("fragment");
+
+ std::vector< de::SharedPtr<BufferOrImage> > inputBuffers(extraDatasCount);
+
+ for (deUint32 i = 0; i < extraDatasCount; i++)
+ {
+ if (extraDatas[i].isImage)
+ {
+ inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Image(context,
+ static_cast<deUint32>(extraDatas[i].numElements), 1, extraDatas[i].format));
+
+ // haven't implemented init for images yet
+ DE_ASSERT(extraDatas[i].initializeType == subgroups::SSBOData::InitializeNone);
+ }
+ else
+ {
+ deUint64 size =
+ getElementSizeInBytes(extraDatas[i].format, extraDatas[i].layout) * extraDatas[i].numElements;
+ inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Buffer(context, size, GL_UNIFORM_BUFFER));
+
+ glw::GLvoid *ptr = inputBuffers[i]->getAsBuffer()->mapBufferPtr();
+ initializeMemory(context.getDeqpContext(), ptr, extraDatas[i]);
+ inputBuffers[i]->getAsBuffer()->unmapBufferPtr();
+ }
+ }
+
+ for (deUint32 i = 0; i < extraDatasCount; i++)
+ {
+ log << tcu::TestLog::Message
+ << "binding inputBuffers[" << i << "](" << inputBuffers[i]->getType() << ", " << inputBuffers[i]->getId() << " ), "
+ << "FRAGMENT, binding = " << extraDatas[i].binding << "\n"
+ << tcu::TestLog::EndMessage;
+
+ if (inputBuffers[i]->isImage())
+ {
+ gl.bindImageTexture(extraDatas[i].binding, inputBuffers[i]->getId(),
+ 0, GL_FALSE, 0, GL_READ_ONLY, extraDatas[i].format);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindImageTexture()");
+ } else
+ {
+ gl.bindBufferBase(inputBuffers[i]->getType(), extraDatas[i].binding, inputBuffers[i]->getId());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBufferBase()");
+ }
+ }
+
+ de::MovePtr<glu::ShaderProgram> pipeline(
+ makeGraphicsPipeline(context, (ShaderStageFlags)(SHADER_STAGE_VERTEX_BIT | SHADER_STAGE_FRAGMENT_BIT),
+ &vshader, &fshader, DE_NULL, DE_NULL, DE_NULL));
+
+ if (!pipeline->isOk())
+ {
+ return tcu::TestStatus::fail("frag graphics program build failed");
+ }
+
+ const deUint32 subgroupSize = getSubgroupSize(context);
+
+ unsigned totalIterations = 0;
+ unsigned failedIterations = 0;
+
+ Vao vao(context);
+ Fbo fbo(context);
+
+ for (deUint32 width = 8; width <= subgroupSize; width *= 2)
+ {
+ for (deUint32 height = 8; height <= subgroupSize; height *= 2)
+ {
+ totalIterations++;
+
+ // re-init the data
+ for (deUint32 i = 0; i < extraDatasCount; i++)
+ {
+ if (inputBuffers[i]->isImage())
+ {
+ DE_ASSERT(extraDatas[i].initializeType == subgroups::SSBOData::InitializeNone);
+ } else
+ {
+ glw::GLvoid *ptr = inputBuffers[i]->getAsBuffer()->mapBufferPtr();
+ initializeMemory(context.getDeqpContext(), ptr, extraDatas[i]);
+ inputBuffers[i]->getAsBuffer()->unmapBufferPtr();
+ }
+ }
+
+ deUint64 formatSize = getFormatSizeInBytes(format);
+ const deUint64 resultImageSizeInBytes =
+ width * height * formatSize;
+
+ Image resultImage(context, width, height, format);
+
+ vector<glw::GLubyte> resultBuffer(resultImageSizeInBytes);
+
+ fbo.bind2D(resultImage);
+
+ gl.viewport(0, 0, width, height);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport");
+
+ gl.clearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glClearColor");
+ gl.clear(GL_COLOR_BUFFER_BIT);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glClear");
+
+ gl.useProgram(pipeline->getProgram());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram");
+
+ gl.drawArrays(GL_TRIANGLE_STRIP, 0, 4);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays");
+
+ GLenum readFormat;
+ GLenum readType;
+ getFormatReadInfo(format, readFormat, readType);
+
+ gl.readPixels(0, 0, width, height, readFormat, readType, (GLvoid*)&resultBuffer[0]);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels");
+
+ std::vector<const void*> datas;
+ {
+ // we always have our result data first
+ datas.push_back(&resultBuffer[0]);
+ }
+
+ if (!checkResult(datas, width, height, subgroupSize))
+ {
+ failedIterations++;
+ }
+ }
+ }
+
+ if (0 < failedIterations)
+ {
+ log << tcu::TestLog::Message << (totalIterations - failedIterations) << " / "
+ << totalIterations << " values passed" << tcu::TestLog::EndMessage;
+ return tcu::TestStatus::fail("Failed!");
+ } else
+ {
+ log << tcu::TestLog::Message << (totalIterations - failedIterations) << " / "
+ <<totalIterations << " values passed" << tcu::TestLog::EndMessage;
+ }
+ return tcu::TestStatus::pass("OK");
+}
+
+tcu::TestStatus glc::subgroups::makeComputeTest(
+ Context& context, Format format, SSBOData* inputs, deUint32 inputsCount,
+ bool (*checkResult)(std::vector<const void*> datas,
+ const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+ deUint32 subgroupSize))
+{
+ const glw::Functions& gl = context.getDeqpContext().getRenderContext().getFunctions();
+ deUint64 elementSize = getFormatSizeInBytes(format);
+
+ const deUint64 resultBufferSize = maxSupportedSubgroupSize() *
+ maxSupportedSubgroupSize() *
+ maxSupportedSubgroupSize();
+ const deUint64 resultBufferSizeInBytes = resultBufferSize * elementSize;
+
+ Buffer resultBuffer(
+ context, resultBufferSizeInBytes);
+
+ std::vector< de::SharedPtr<BufferOrImage> > inputBuffers(inputsCount);
+
+ for (deUint32 i = 0; i < inputsCount; i++)
+ {
+ if (inputs[i].isImage)
+ {
+ inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Image(context,
+ static_cast<deUint32>(inputs[i].numElements), 1, inputs[i].format));
+ // haven't implemented init for images yet
+ DE_ASSERT(inputs[i].initializeType == subgroups::SSBOData::InitializeNone);
+ }
+ else
+ {
+ deUint64 size =
+ getElementSizeInBytes(inputs[i].format, inputs[i].layout) * inputs[i].numElements;
+ inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Buffer(context, size));
+
+ glw::GLvoid *ptr = inputBuffers[i]->getAsBuffer()->mapBufferPtr();
+ initializeMemory(context.getDeqpContext(), ptr, inputs[i]);
+ inputBuffers[i]->getAsBuffer()->unmapBufferPtr();
+ }
+
+ }
+
+ tcu::TestLog& log = context.getDeqpContext().getTestContext().getLog();
+ log << tcu::TestLog::Message
+ << "binding resultbuffer(type=" << resultBuffer.getType()
+ << ", id=" << resultBuffer.getId() << ", binding=0), COMPUTE"
+ << tcu::TestLog::EndMessage;
+
+ gl.bindBufferBase(resultBuffer.getType(), 0, resultBuffer.getId());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBufferBase(0, resultBuffer)");
+
+ for (deUint32 i = 0; i < inputsCount; i++)
+ {
+ log << tcu::TestLog::Message
+ << "binding inputBuffers[" << i << "](type=" << inputBuffers[i]->getType()
+ << ", id=" << inputBuffers[i]->getId() << ", binding="
+ << inputs[i].binding << "), 1, COMPUTE"
+ << tcu::TestLog::EndMessage;
+
+ if (inputBuffers[i]->isImage())
+ {
+ gl.bindImageTexture(inputs[i].binding, inputBuffers[i]->getId(),
+ 0, GL_FALSE, 0, GL_READ_WRITE, inputs[i].format);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindImageTexture(inputBuffer[i]");
+ } else
+ {
+ gl.bindBufferBase(inputBuffers[i]->getType(), inputs[i].binding, inputBuffers[i]->getId());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBufferBase(inputBuffer[i])");
+ }
+ }
+
+ const GlslSource &cshader = context.getSourceCollection().get("comp");
+
+ unsigned totalIterations = 0;
+ unsigned failedIterations = 0;
+
+ const deUint32 subgroupSize = getSubgroupSize(context);
+
+ const deUint32 numWorkgroups[3] = {4, 2, 2};
+
+ const deUint32 localSizesToTestCount = 15;
+ deUint32 localSizesToTest[localSizesToTestCount][3] =
+ {
+ {1, 1, 1},
+ {32, 4, 1},
+ {32, 1, 4},
+ {1, 32, 4},
+ {1, 4, 32},
+ {4, 1, 32},
+ {4, 32, 1},
+ {subgroupSize, 1, 1},
+ {1, subgroupSize, 1},
+ {1, 1, subgroupSize},
+ {3, 5, 7},
+ {128, 1, 1},
+ {1, 128, 1},
+ {1, 1, 64},
+ {1, 1, 1} // Isn't used, just here to make double buffering checks easier
+ };
+
+
+ de::MovePtr<glu::ShaderProgram> lastPipeline(
+ makeComputePipeline(context, cshader,
+ localSizesToTest[0][0], localSizesToTest[0][1], localSizesToTest[0][2]));
+
+ for (deUint32 index = 0; index < (localSizesToTestCount - 1); index++)
+ {
+ const deUint32 nextX = localSizesToTest[index + 1][0];
+ const deUint32 nextY = localSizesToTest[index + 1][1];
+ const deUint32 nextZ = localSizesToTest[index + 1][2];
+
+ // we are running one test
+ totalIterations++;
+
+ if (!lastPipeline->isOk())
+ {
+ return tcu::TestStatus::fail("compute shaders build failed");
+ }
+
+ gl.useProgram(lastPipeline->getProgram());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram");
+
+ gl.dispatchCompute(numWorkgroups[0], numWorkgroups[1], numWorkgroups[2]);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glDispatchCompute");
+
+ de::MovePtr<glu::ShaderProgram> nextPipeline(
+ makeComputePipeline(context, cshader, nextX, nextY, nextZ));
+
+ std::vector<const void*> datas;
+
+ {
+ glw::GLvoid * resultData = resultBuffer.mapBufferPtr();
+
+ // we always have our result data first
+ datas.push_back(resultData);
+ }
+
+ for (deUint32 i = 0; i < inputsCount; i++)
+ {
+ if (!inputBuffers[i]->isImage())
+ {
+ glw::GLvoid *resultData = inputBuffers[i]->getAsBuffer()->mapBufferPtr();
+
+ // we always have our result data first
+ datas.push_back(resultData);
+ }
+ }
+
+ if (!checkResult(datas, numWorkgroups, localSizesToTest[index], subgroupSize))
+ {
+ failedIterations++;
+ }
+
+ resultBuffer.unmapBufferPtr();
+ for (deUint32 i = 0; i < inputsCount; i++)
+ {
+ if (!inputBuffers[i]->isImage())
+ {
+ inputBuffers[i]->getAsBuffer()->unmapBufferPtr();
+ }
+ }
+
+ lastPipeline = nextPipeline;
+ }
+
+ if (0 < failedIterations)
+ {
+ log << tcu::TestLog::Message << (totalIterations - failedIterations) << " / "
+ << totalIterations << " values passed" << tcu::TestLog::EndMessage;
+ return tcu::TestStatus::fail("Failed!");
+ } else
+ {
+ log << tcu::TestLog::Message << (totalIterations - failedIterations) << " / "
+ << totalIterations << " values passed" << tcu::TestLog::EndMessage;
+ }
+
+ return tcu::TestStatus::pass("OK");
+}
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsTestsUtils.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsTestsUtils.hpp
new file mode 100644
index 0000000..0143233
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsTestsUtils.hpp
@@ -0,0 +1,486 @@
+#ifndef _GLCSUBGROUPSTESTSUTILS_HPP
+#define _GLCSUBGROUPSTESTSUTILS_HPP
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups tests utility classes
+ */ /*--------------------------------------------------------------------*/
+
+#include "deDefs.hpp"
+#include "deSTLUtil.hpp"
+#include "deStringUtil.hpp"
+#include "glwEnums.hpp"
+#include "glwFunctions.hpp"
+#include "glwDefs.hpp"
+#include "tcuDefs.hpp"
+#include "tcuTestCase.hpp"
+#include "glcTestCase.hpp"
+#include "glcSpirvUtils.hpp"
+
+#include "tcuFormatUtil.hpp"
+#include "tcuTestLog.hpp"
+#include "tcuVectorUtil.hpp"
+
+#include "gluShaderUtil.hpp"
+#include "gluContextInfo.hpp"
+
+#include "deSharedPtr.hpp"
+#include "deUniquePtr.hpp"
+
+#include <string>
+
+namespace glc
+{
+
+enum ShaderType
+{
+ SHADER_TYPE_GLSL = 0,
+ SHADER_TYPE_SPIRV,
+
+ SHADER_TYPE_LAST
+};
+
+template<typename Program>
+class ProgramCollection
+{
+public:
+ ProgramCollection (void);
+ ~ProgramCollection (void);
+
+ void clear (void);
+
+ Program& add (const std::string& name);
+ void add (const std::string& name, de::MovePtr<Program>& program);
+
+ bool contains (const std::string& name) const;
+ const Program& get (const std::string& name) const;
+
+ class Iterator
+ {
+ private:
+ typedef typename std::map<std::string, Program*>::const_iterator IteratorImpl;
+
+ public:
+ explicit Iterator (const IteratorImpl& i) : m_impl(i) {}
+
+ Iterator& operator++ (void) { ++m_impl; return *this; }
+ const Program& operator* (void) const { return getProgram(); }
+
+ const std::string& getName (void) const { return m_impl->first; }
+ const Program& getProgram (void) const { return *m_impl->second; }
+
+ bool operator== (const Iterator& other) const { return m_impl == other.m_impl; }
+ bool operator!= (const Iterator& other) const { return m_impl != other.m_impl; }
+
+ private:
+
+ IteratorImpl m_impl;
+ };
+
+ Iterator begin (void) const { return Iterator(m_programs.begin()); }
+ Iterator end (void) const { return Iterator(m_programs.end()); }
+
+ bool empty (void) const { return m_programs.empty(); }
+
+private:
+ typedef std::map<std::string, Program*> ProgramMap;
+
+ ProgramMap m_programs;
+};
+
+template<typename Program>
+ProgramCollection<Program>::ProgramCollection (void)
+{
+}
+
+template<typename Program>
+ProgramCollection<Program>::~ProgramCollection (void)
+{
+ clear();
+}
+
+template<typename Program>
+void ProgramCollection<Program>::clear (void)
+{
+ for (typename ProgramMap::const_iterator i = m_programs.begin(); i != m_programs.end(); ++i)
+ delete i->second;
+ m_programs.clear();
+}
+
+template<typename Program>
+Program& ProgramCollection<Program>::add (const std::string& name)
+{
+ DE_ASSERT(!contains(name));
+ de::MovePtr<Program> prog = de::newMovePtr<Program>();
+ m_programs[name] = prog.get();
+ prog.release();
+ return *m_programs[name];
+}
+
+template<typename Program>
+void ProgramCollection<Program>::add (const std::string& name, de::MovePtr<Program>& program)
+{
+ DE_ASSERT(!contains(name));
+ m_programs[name] = program.get();
+ program.release();
+}
+
+template<typename Program>
+bool ProgramCollection<Program>::contains (const std::string& name) const
+{
+ return de::contains(m_programs, name);
+}
+
+template<typename Program>
+const Program& ProgramCollection<Program>::get (const std::string& name) const
+{
+ DE_ASSERT(contains(name));
+ return *m_programs.find(name)->second;
+}
+
+struct GlslSource
+{
+ std::vector<std::string> sources[glu::SHADERTYPE_LAST];
+
+ GlslSource& operator<< (const glu::ShaderSource& shaderSource)
+ {
+ sources[shaderSource.shaderType].push_back(shaderSource.source);
+ return *this;
+ }
+};
+
+typedef ProgramCollection<GlslSource> SourceCollections;
+
+
+class Context
+{
+public:
+ Context (deqp::Context& deqpCtx)
+ : m_deqpCtx(deqpCtx)
+ , m_sourceCollection()
+ , m_glslVersion(glu::getContextTypeGLSLVersion(m_deqpCtx.getRenderContext().getType()))
+ , m_shaderType(SHADER_TYPE_GLSL)
+ {}
+ ~Context (void) {}
+ deqp::Context& getDeqpContext (void) const { return m_deqpCtx; }
+ SourceCollections& getSourceCollection (void) { return m_sourceCollection; }
+ glu::GLSLVersion getGLSLVersion (void) { return m_glslVersion; }
+ ShaderType getShaderType (void) { return m_shaderType; }
+ void setShaderType (ShaderType type) { m_shaderType = type; }
+
+protected:
+ deqp::Context& m_deqpCtx;
+ SourceCollections m_sourceCollection;
+ glu::GLSLVersion m_glslVersion;
+ ShaderType m_shaderType;
+};
+
+namespace subgroups
+{
+
+template<typename Arg0>
+class SubgroupFactory : public deqp::TestCase
+{
+public:
+ //void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+ typedef void (*InitFunction)(SourceCollections& programCollection, Arg0 arg0);
+ //void supportedCheck (Context& context, CaseDefinition caseDef)
+ typedef void (*SupportFunction)(Context& context, Arg0 arg0);
+ //tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+ typedef tcu::TestStatus (*TestFunction)(Context& context, const Arg0 arg0);
+
+ /* Public methods */
+ SubgroupFactory(deqp::Context& context, tcu::TestNodeType type, const std::string& name, const std::string& desc,
+ SupportFunction suppFunc, InitFunction initFunc, TestFunction testFunc, Arg0 arg0)
+ : TestCase(context, type, name.c_str(), desc.c_str())
+ , m_supportedFunc(suppFunc)
+ , m_initFunc(initFunc)
+ , m_testFunc(testFunc)
+ , m_arg0(arg0)
+ , m_glcContext(m_context)
+ {}
+
+ void init()
+ {
+ m_supportedFunc(m_glcContext, m_arg0);
+
+ m_initFunc(m_glcContext.getSourceCollection(), m_arg0);
+ }
+
+ void deinit()
+ {
+ // nothing to do
+ }
+
+ tcu::TestNode::IterateResult iterate()
+ {
+ DE_ASSERT(m_testFunc);
+ tcu::TestLog& log = m_testCtx.getLog();
+
+ try {
+ // do SPIRV version of tests if supported
+ log << tcu::TestLog::Message << "SPIRV pass beginning..." << tcu::TestLog::EndMessage;
+ spirvUtils::checkGlSpirvSupported(m_glcContext.getDeqpContext());
+
+ m_glcContext.setShaderType(SHADER_TYPE_SPIRV);
+
+ const tcu::TestStatus result = m_testFunc(m_glcContext, m_arg0);
+ if (result.isComplete())
+ {
+ DE_ASSERT(m_testCtx.getTestResult() == QP_TEST_RESULT_LAST);
+ if (result.getCode() == QP_TEST_RESULT_PASS)
+ {
+ log << tcu::TestLog::Message << "SPIRV pass completed successfully ("
+ << result.getDescription() << ")." << tcu::TestLog::EndMessage;
+ } else {
+ // test failed - log result and stop
+ m_testCtx.setTestResult(result.getCode(), result.getDescription().c_str());
+ return tcu::TestNode::STOP;
+ }
+ }
+ } catch(tcu::NotSupportedError& e)
+ {
+ log << tcu::TestLog::Message << "SPIRV pass skipped ("
+ << e.getMessage() << ")." << tcu::TestLog::EndMessage;
+ }
+
+ // do GLSL version of the tests
+ log << tcu::TestLog::Message << "GLSL pass beginning..." << tcu::TestLog::EndMessage;
+ m_glcContext.setShaderType(SHADER_TYPE_GLSL);
+ const tcu::TestStatus result = m_testFunc(m_glcContext, m_arg0);
+
+ if (result.isComplete())
+ {
+ DE_ASSERT(m_testCtx.getTestResult() == QP_TEST_RESULT_LAST);
+ log << tcu::TestLog::Message << "GLSL pass completed successfully ("
+ << result.getDescription() << ")." << tcu::TestLog::EndMessage;
+ m_testCtx.setTestResult(result.getCode(), result.getDescription().c_str());
+ return tcu::TestNode::STOP;
+ }
+
+ return tcu::TestNode::CONTINUE;
+ }
+
+ static void addFunctionCaseWithPrograms (deqp::TestCaseGroup* group,
+ const std::string& name,
+ const std::string& desc,
+ SupportFunction suppFunc,
+ InitFunction initFunc,
+ TestFunction testFunc,
+ Arg0 arg0)
+ {
+ group->addChild(new SubgroupFactory(group->getContext(), tcu::NODETYPE_SELF_VALIDATE, name, desc, suppFunc, initFunc, testFunc, arg0));
+ }
+
+private:
+ SupportFunction m_supportedFunc;
+ InitFunction m_initFunc;
+ TestFunction m_testFunc;
+ Arg0 m_arg0;
+
+ Context m_glcContext;
+};
+
+
+typedef enum ShaderStageFlags
+{
+ SHADER_STAGE_VERTEX_BIT = GL_VERTEX_SHADER_BIT,
+ SHADER_STAGE_FRAGMENT_BIT = GL_FRAGMENT_SHADER_BIT,
+ SHADER_STAGE_GEOMETRY_BIT = GL_GEOMETRY_SHADER_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT = GL_TESS_CONTROL_SHADER_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT = GL_TESS_EVALUATION_SHADER_BIT,
+ SHADER_STAGE_COMPUTE_BIT = GL_COMPUTE_SHADER_BIT,
+ SHADER_STAGE_ALL_GRAPHICS = (SHADER_STAGE_VERTEX_BIT | SHADER_STAGE_FRAGMENT_BIT | SHADER_STAGE_GEOMETRY_BIT |
+ SHADER_STAGE_TESS_CONTROL_BIT | SHADER_STAGE_TESS_EVALUATION_BIT ),
+ SHADER_STAGE_ALL_VALID = (SHADER_STAGE_ALL_GRAPHICS | SHADER_STAGE_COMPUTE_BIT),
+} ShaderStageFlags;
+
+typedef enum SubgroupFeatureFlags
+{
+ SUBGROUP_FEATURE_BASIC_BIT = GL_SUBGROUP_FEATURE_BASIC_BIT_KHR,
+ SUBGROUP_FEATURE_VOTE_BIT = GL_SUBGROUP_FEATURE_VOTE_BIT_KHR,
+ SUBGROUP_FEATURE_ARITHMETIC_BIT = GL_SUBGROUP_FEATURE_ARITHMETIC_BIT_KHR,
+ SUBGROUP_FEATURE_BALLOT_BIT = GL_SUBGROUP_FEATURE_BALLOT_BIT_KHR,
+ SUBGROUP_FEATURE_SHUFFLE_BIT = GL_SUBGROUP_FEATURE_SHUFFLE_BIT_KHR,
+ SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT = GL_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT_KHR,
+ SUBGROUP_FEATURE_CLUSTERED_BIT = GL_SUBGROUP_FEATURE_CLUSTERED_BIT_KHR,
+ SUBGROUP_FEATURE_QUAD_BIT = GL_SUBGROUP_FEATURE_QUAD_BIT_KHR,
+ SUBGROUP_FEATURE_PARTITIONED_BIT_NV = GL_SUBGROUP_FEATURE_PARTITIONED_BIT_NV,
+ SUBGROUP_FEATURE_ALL_VALID = (SUBGROUP_FEATURE_BASIC_BIT | SUBGROUP_FEATURE_VOTE_BIT | SUBGROUP_FEATURE_ARITHMETIC_BIT |
+ SUBGROUP_FEATURE_BALLOT_BIT | SUBGROUP_FEATURE_SHUFFLE_BIT | SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT |
+ SUBGROUP_FEATURE_CLUSTERED_BIT | SUBGROUP_FEATURE_QUAD_BIT | SUBGROUP_FEATURE_QUAD_BIT |
+ SUBGROUP_FEATURE_PARTITIONED_BIT_NV),
+} SubgroupFeatureFlags;
+
+typedef enum Format
+{
+ FORMAT_UNDEFINED = 0,
+ FORMAT_R32_SINT = GL_R32I,
+ FORMAT_R32_UINT = GL_R32UI,
+ FORMAT_R32G32_SINT = GL_RG32I,
+ FORMAT_R32G32_UINT = GL_RG32UI,
+ FORMAT_R32G32B32_SINT = GL_RGB32I,
+ FORMAT_R32G32B32_UINT = GL_RGB32UI,
+ FORMAT_R32G32B32A32_SINT = GL_RGBA32I,
+ FORMAT_R32G32B32A32_UINT = GL_RGBA32UI,
+ FORMAT_R32_SFLOAT = GL_R32F,
+ FORMAT_R32G32_SFLOAT = GL_RG32F,
+ FORMAT_R32G32B32_SFLOAT = GL_RGB32F,
+ FORMAT_R32G32B32A32_SFLOAT = GL_RGBA32F,
+ FORMAT_R64_SFLOAT = 0x6000,
+ FORMAT_R64G64_SFLOAT,
+ FORMAT_R64G64B64_SFLOAT,
+ FORMAT_R64G64B64A64_SFLOAT,
+ FORMAT_R32_BOOL = 0x6100,
+ FORMAT_R32G32_BOOL,
+ FORMAT_R32G32B32_BOOL,
+ FORMAT_R32G32B32A32_BOOL,
+} Format;
+
+typedef enum DescriptorType
+{
+ DESCRIPTOR_TYPE_UNIFORM_BUFFER = GL_UNIFORM_BUFFER,
+ DESCRIPTOR_TYPE_STORAGE_BUFFER = GL_SHADER_STORAGE_BUFFER,
+ DESCRIPTOR_TYPE_STORAGE_IMAGE = GL_TEXTURE_2D,
+} DescriptorType;
+
+// A struct to represent input data to a shader
+struct SSBOData
+{
+ SSBOData() :
+ initializeType (InitializeNone),
+ layout (LayoutStd140),
+ format (FORMAT_UNDEFINED),
+ numElements (0),
+ isImage (false),
+ binding (0u),
+ stages ((ShaderStageFlags)0u)
+ {}
+
+ enum InputDataInitializeType
+ {
+ InitializeNone = 0,
+ InitializeNonZero,
+ InitializeZero,
+ } initializeType;
+
+ enum InputDataLayoutType
+ {
+ LayoutStd140 = 0,
+ LayoutStd430,
+ LayoutPacked,
+ } layout;
+
+ Format format;
+ deUint64 numElements;
+ bool isImage;
+ deUint32 binding;
+ ShaderStageFlags stages;
+};
+
+std::string getSharedMemoryBallotHelper();
+
+deUint32 getSubgroupSize(Context& context);
+
+deUint32 maxSupportedSubgroupSize();
+
+std::string getShaderStageName(ShaderStageFlags stage);
+
+std::string getSubgroupFeatureName(SubgroupFeatureFlags bit);
+
+void addNoSubgroupShader (SourceCollections& programCollection);
+
+std::string getVertShaderForStage(ShaderStageFlags stage);
+
+bool isSubgroupSupported(Context& context);
+
+bool areSubgroupOperationsSupportedForStage(
+ Context& context, ShaderStageFlags stage);
+
+bool areSubgroupOperationsRequiredForStage(ShaderStageFlags stage);
+
+bool isSubgroupFeatureSupportedForDevice(Context& context, SubgroupFeatureFlags bit);
+
+bool isFragmentSSBOSupportedForDevice(Context& context);
+
+bool isVertexSSBOSupportedForDevice(Context& context);
+
+bool isImageSupportedForStageOnDevice(Context& context, const ShaderStageFlags stage);
+
+bool isDoubleSupportedForDevice(Context& context);
+
+bool isDoubleFormat(Format format);
+
+std::string getFormatNameForGLSL(Format format);
+
+void addGeometryShadersFromTemplate (const std::string& glslTemplate, SourceCollections& collection);
+
+void setVertexShaderFrameBuffer (SourceCollections& programCollection);
+
+void setFragmentShaderFrameBuffer (SourceCollections& programCollection);
+
+void setFragmentShaderFrameBuffer (SourceCollections& programCollection);
+
+void setTesCtrlShaderFrameBuffer (SourceCollections& programCollection);
+
+void setTesEvalShaderFrameBuffer (SourceCollections& programCollection);
+
+bool check(std::vector<const void*> datas,
+ deUint32 width, deUint32 ref);
+
+bool checkCompute(std::vector<const void*> datas,
+ const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+ deUint32 ref);
+
+tcu::TestStatus makeTessellationEvaluationFrameBufferTest(Context& context, Format format,
+ SSBOData* extraData, deUint32 extraDataCount,
+ bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize),
+ const ShaderStageFlags shaderStage = SHADER_STAGE_ALL_GRAPHICS);
+
+tcu::TestStatus makeGeometryFrameBufferTest(Context& context, Format format, SSBOData* extraData,
+ deUint32 extraDataCount,
+ bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize));
+
+tcu::TestStatus allStages(Context& context, Format format,
+ SSBOData* extraData, deUint32 extraDataCount,
+ bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize),
+ const ShaderStageFlags shaderStage);
+
+tcu::TestStatus makeVertexFrameBufferTest(Context& context, Format format,
+ SSBOData* extraData, deUint32 extraDataCount,
+ bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize));
+
+tcu::TestStatus makeFragmentFrameBufferTest(Context& context, Format format,
+ SSBOData* extraData, deUint32 extraDataCount,
+ bool (*checkResult)(std::vector<const void*> datas, deUint32 width,
+ deUint32 height, deUint32 subgroupSize));
+
+tcu::TestStatus makeComputeTest(
+ Context& context, Format format, SSBOData* inputs,
+ deUint32 inputsCount,
+ bool (*checkResult)(std::vector<const void*> datas,
+ const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+ deUint32 subgroupSize));
+} // subgroups
+} // glc
+
+#endif // _GLCSUBGROUPSTESTSUTILS_HPP
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsVoteTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsVoteTests.cpp
new file mode 100755
index 0000000..a41acf8
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsVoteTests.cpp
@@ -0,0 +1,804 @@
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "glcSubgroupsVoteTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+#include "tcuStringTemplate.hpp"
+
+using namespace tcu;
+using namespace std;
+
+namespace glc
+{
+namespace subgroups
+{
+
+namespace
+{
+
+enum OpType
+{
+ OPTYPE_ALL = 0,
+ OPTYPE_ANY,
+ OPTYPE_ALLEQUAL,
+ OPTYPE_LAST
+};
+
+static bool checkVertexPipelineStages(std::vector<const void*> datas,
+ deUint32 width, deUint32)
+{
+ return glc::subgroups::check(datas, width, 0x1F);
+}
+
+static bool checkFragmentPipelineStages(std::vector<const void*> datas,
+ deUint32 width, deUint32 height, deUint32)
+{
+ const deUint32* data =
+ reinterpret_cast<const deUint32*>(datas[0]);
+ for (deUint32 x = 0u; x < width; ++x)
+ {
+ for (deUint32 y = 0u; y < height; ++y)
+ {
+ const deUint32 ndx = (x * height + y);
+ deUint32 val = data[ndx] & 0x1F;
+
+ if (data[ndx] & 0x40) //Helper fragment shader invocation was executed
+ {
+ if(val != 0x1F)
+ return false;
+ }
+ else //Helper fragment shader invocation was not executed yet
+ {
+ if (val != 0x1E)
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+static bool checkComputeStage(std::vector<const void*> datas,
+ const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+ deUint32)
+{
+ return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, 0x1F);
+}
+
+std::string getOpTypeName(int opType)
+{
+ switch (opType)
+ {
+ default:
+ DE_FATAL("Unsupported op type");
+ return "";
+ case OPTYPE_ALL:
+ return "subgroupAll";
+ case OPTYPE_ANY:
+ return "subgroupAny";
+ case OPTYPE_ALLEQUAL:
+ return "subgroupAllEqual";
+ }
+}
+
+struct CaseDefinition
+{
+ int opType;
+ ShaderStageFlags shaderStage;
+ Format format;
+};
+
+void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ const bool formatIsBoolean =
+ FORMAT_R32_BOOL == caseDef.format || FORMAT_R32G32_BOOL == caseDef.format || FORMAT_R32G32B32_BOOL == caseDef.format || FORMAT_R32G32B32A32_BOOL == caseDef.format;
+
+ if (SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage)
+ subgroups::setFragmentShaderFrameBuffer(programCollection);
+
+ if (SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+ {
+ const string vertex = "${VERSION_DECL}\n"
+ "void main (void)\n"
+ "{\n"
+ " vec2 uv = vec2(float(gl_VertexID & 1), float((gl_VertexID >> 1) & 1));\n"
+ " gl_Position = vec4(uv * 4.0f -2.0f, 0.0f, 1.0f);\n"
+ " gl_PointSize = 1.0f;\n"
+ "}\n";
+ programCollection.add("vert") << glu::VertexSource(vertex);
+ }
+ else if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ subgroups::setVertexShaderFrameBuffer(programCollection);
+
+ const string source =
+ (OPTYPE_ALL == caseDef.opType) ?
+ " result = " + getOpTypeName(caseDef.opType) +
+ "(true) ? 0x1u : 0u;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(false) ? 0u : 0x1Au;\n"
+ " result |= 0x4u;\n"
+ : (OPTYPE_ANY == caseDef.opType) ?
+ " result = " + getOpTypeName(caseDef.opType) +
+ "(true) ? 0x1u : 0u;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(false) ? 0u : 0x1Au;\n"
+ " result |= 0x4u;\n"
+ : (OPTYPE_ALLEQUAL == caseDef.opType) ?
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + "(1.25 * float(data[gl_SubgroupInvocationID]) + 5.0);\n" +
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueNoEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + (formatIsBoolean ? "(subgroupElect())\n;" : "(12.0 * float(data[gl_SubgroupInvocationID]) + float(gl_SubgroupInvocationID));\n") +
+ " result = " + getOpTypeName(caseDef.opType) + "("
+ + subgroups::getFormatNameForGLSL(caseDef.format) + "(1)) ? 0x1u : 0u;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(gl_SubgroupInvocationID) ? 0u : 0x2u;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(data[0]) ? 0x4u : 0u;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(valueEqual) ? 0x8u : 0x0u;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(valueNoEqual) ? 0x0u : 0x10u;\n"
+ " if (subgroupElect()) result |= 0x2u | 0x10u;\n"
+ : "";
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream vertexSrc;
+ vertexSrc << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_vote: enable\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "layout(location = 0) in highp vec4 in_position;\n"
+ << "layout(binding = 0, std140) uniform Buffer1\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uint result;\n"
+ << source
+ << " out_color = float(result);\n"
+ << " gl_Position = in_position;\n"
+ << " gl_PointSize = 1.0f;\n"
+ << "}\n";
+
+ programCollection.add("vert") << glu::VertexSource(vertexSrc.str());
+ }
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream geometry;
+
+ geometry << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_vote: enable\n"
+ << "layout(points) in;\n"
+ << "layout(points, max_vertices = 1) out;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "layout(binding = 0, std140) uniform Buffer1\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uint result;\n"
+ << source
+ << " out_color = float(result);\n"
+ << " gl_Position = gl_in[0].gl_Position;\n"
+ << " EmitVertex();\n"
+ << " EndPrimitive();\n"
+ << "}\n";
+
+ programCollection.add("geometry") << glu::GeometrySource(geometry.str());
+ }
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream controlSource;
+ controlSource << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_vote: enable\n"
+ << "layout(vertices = 2) out;\n"
+ << "layout(location = 0) out float out_color[];\n"
+ << "layout(binding = 0, std140) uniform Buffer1\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uint result;\n"
+ << " if (gl_InvocationID == 0)\n"
+ <<" {\n"
+ << " gl_TessLevelOuter[0] = 1.0f;\n"
+ << " gl_TessLevelOuter[1] = 1.0f;\n"
+ << " }\n"
+ << source
+ << " out_color[gl_InvocationID] = float(result);"
+ << " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ << "}\n";
+
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSource.str());
+ subgroups::setTesEvalShaderFrameBuffer(programCollection);
+ }
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream evaluationSource;
+ evaluationSource << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_vote: enable\n"
+ << "#extension GL_EXT_tessellation_shader : require\n"
+ << "layout(isolines, equal_spacing, ccw ) in;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "layout(binding = 0, std140) uniform Buffer1\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uint result;\n"
+ << " highp uint offset = uint(gl_PrimitiveID) * 2u + uint(gl_TessCoord.x + 0.5);\n"
+ << source
+ << " out_color = float(result);\n"
+ << " gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
+ << "}\n";
+
+ subgroups::setTesCtrlShaderFrameBuffer(programCollection);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
+ }
+ else if (SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+ {
+ const string sourceFragment =
+ (OPTYPE_ALL == caseDef.opType) ?
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(!gl_HelperInvocation) ? 0x0u : 0x1u;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(false) ? 0u : 0x1Au;\n"
+ " result |= 0x4u;\n"
+ : (OPTYPE_ANY == caseDef.opType) ?
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(gl_HelperInvocation) ? 0x1u : 0x0u;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(false) ? 0u : 0x1Au;\n"
+ " result |= 0x4u;\n"
+ : (OPTYPE_ALLEQUAL == caseDef.opType) ?
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + "(1.25 * float(data[gl_SubgroupInvocationID]) + 5.0);\n" +
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueNoEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + (formatIsBoolean ? "(subgroupElect());\n" : "(12.0 * float(data[gl_SubgroupInvocationID]) + gl_FragCoord.x * float(gl_SubgroupInvocationID));\n") +
+ " result |= " + getOpTypeName(caseDef.opType) + "("
+ + subgroups::getFormatNameForGLSL(caseDef.format) + "(1)) ? 0x10u : 0u;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(gl_SubgroupInvocationID) ? 0u : 0x2u;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(data[0]) ? 0x4u : 0u;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(valueEqual) ? 0x8u : 0x0u;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(gl_HelperInvocation) ? 0x0u : 0x1u;\n"
+ " if (subgroupElect()) result |= 0x2u | 0x10u;\n"
+ : "";
+
+ std::ostringstream fragmentSource;
+ fragmentSource << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_vote: enable\n"
+ << "precision highp float;\n"
+ << "layout(location = 0) out uint out_color;\n"
+ << "layout(binding = 0, std140) uniform Buffer1\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << ""
+ << "void main()\n"
+ << "{\n"
+ << " uint result = 0u;\n"
+ << " if (dFdx(float(gl_SubgroupInvocationID) * gl_FragCoord.x * gl_FragCoord.y) - dFdy(float(gl_SubgroupInvocationID) * gl_FragCoord.x * gl_FragCoord.y) > 0.0f)\n"
+ << " {\n"
+ << " result |= 0x20u;\n" // to be sure that compiler doesn't remove dFdx and dFdy executions
+ << " }\n"
+ << " bool helper = subgroupAny(gl_HelperInvocation);\n"
+ << " if (helper)\n"
+ << " {\n"
+ << " result |= 0x40u;\n"
+ << " }\n"
+ << sourceFragment
+ << " out_color = result;\n"
+ << "}\n";
+
+ programCollection.add("fragment") << glu::FragmentSource(fragmentSource.str());
+ }
+ else
+ {
+ DE_FATAL("Unsupported shader stage");
+ }
+}
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ const bool formatIsBoolean =
+ FORMAT_R32_BOOL == caseDef.format || FORMAT_R32G32_BOOL == caseDef.format || FORMAT_R32G32B32_BOOL == caseDef.format || FORMAT_R32G32B32A32_BOOL == caseDef.format;
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream src;
+
+ src << "${VERSION_DECL}\n"
+ << "#extension GL_KHR_shader_subgroup_vote: enable\n"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Buffer1\n"
+ << "{\n"
+ << " uint result[];\n"
+ << "};\n"
+ << "layout(binding = 1, std430) buffer Buffer2\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+ << " highp uint offset = globalSize.x * ((globalSize.y * "
+ "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+ "gl_GlobalInvocationID.x;\n";
+ if (OPTYPE_ALL == caseDef.opType)
+ {
+ src << " result[offset] = " << getOpTypeName(caseDef.opType)
+ << "(true) ? 0x1u : 0u;\n"
+ << " result[offset] |= " << getOpTypeName(caseDef.opType)
+ << "(false) ? 0u : 0x1Au;\n"
+ << " result[offset] |= " << getOpTypeName(caseDef.opType)
+ << "(data[gl_SubgroupInvocationID] > 0u) ? 0x4u : 0u;\n";
+ }
+ else if (OPTYPE_ANY == caseDef.opType)
+ {
+ src << " result[offset] = " << getOpTypeName(caseDef.opType)
+ << "(true) ? 0x1u : 0u;\n"
+ << " result[offset] |= " << getOpTypeName(caseDef.opType)
+ << "(false) ? 0u : 0x1Au;\n"
+ << " result[offset] |= " << getOpTypeName(caseDef.opType)
+ << "(data[gl_SubgroupInvocationID] == data[0]) ? 0x4u : 0u;\n";
+ }
+
+ else if (OPTYPE_ALLEQUAL == caseDef.opType)
+ {
+ src << " " << subgroups::getFormatNameForGLSL(caseDef.format) <<" valueEqual = " << subgroups::getFormatNameForGLSL(caseDef.format) << "(1.25 * float(data[gl_SubgroupInvocationID]) + 5.0);\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) <<" valueNoEqual = " << subgroups::getFormatNameForGLSL(caseDef.format) << (formatIsBoolean ? "(subgroupElect());\n" : "(12.0 * float(data[gl_SubgroupInvocationID]) + float(offset));\n")
+ <<" result[offset] = " << getOpTypeName(caseDef.opType) << "("
+ << subgroups::getFormatNameForGLSL(caseDef.format) << "(1)) ? 0x1u : 0x0u;\n"
+ << " result[offset] |= " << getOpTypeName(caseDef.opType)
+ << "(gl_SubgroupInvocationID) ? 0x0u : 0x2u;\n"
+ << " result[offset] |= " << getOpTypeName(caseDef.opType)
+ << "(data[0]) ? 0x4u : 0x0u;\n"
+ << " result[offset] |= "<< getOpTypeName(caseDef.opType)
+ << "(valueEqual) ? 0x8u : 0x0u;\n"
+ << " result[offset] |= "<< getOpTypeName(caseDef.opType)
+ << "(valueNoEqual) ? 0x0u : 0x10u;\n"
+ << " if (subgroupElect()) result[offset] |= 0x2u | 0x10u;\n";
+ }
+
+ src << "}\n";
+
+ programCollection.add("comp") << glu::ComputeSource(src.str());
+ }
+ else
+ {
+ const string source =
+ (OPTYPE_ALL == caseDef.opType) ?
+ " b${SSBO1}.result[offset] = " + getOpTypeName(caseDef.opType) +
+ "(true) ? 0x1u : 0u;\n"
+ " b${SSBO1}.result[offset] |= " + getOpTypeName(caseDef.opType) +
+ "(false) ? 0u : 0x1Au;\n"
+ " b${SSBO1}.result[offset] |= 0x4u;\n"
+ : (OPTYPE_ANY == caseDef.opType) ?
+ " b${SSBO1}.result[offset] = " + getOpTypeName(caseDef.opType) +
+ "(true) ? 0x1u : 0u;\n"
+ " b${SSBO1}.result[offset] |= " + getOpTypeName(caseDef.opType) +
+ "(false) ? 0u : 0x1Au;\n"
+ " b${SSBO1}.result[offset] |= 0x4u;\n"
+ : (OPTYPE_ALLEQUAL == caseDef.opType) ?
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + "(1.25 * float(data[gl_SubgroupInvocationID]) + 5.0);\n" +
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueNoEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + (formatIsBoolean ? "(subgroupElect());\n" : "(12.0 * float(data[gl_SubgroupInvocationID]) + float(gl_SubgroupInvocationID));\n") +
+ " b${SSBO1}.result[offset] = " + getOpTypeName(caseDef.opType) + "("
+ + subgroups::getFormatNameForGLSL(caseDef.format) + "(1)) ? 0x1u : 0u;\n"
+ " b${SSBO1}.result[offset] |= " + getOpTypeName(caseDef.opType) +
+ "(gl_SubgroupInvocationID) ? 0u : 0x2u;\n"
+ " b${SSBO1}.result[offset] |= " + getOpTypeName(caseDef.opType) +
+ "(data[0]) ? 0x4u : 0u;\n"
+ " b${SSBO1}.result[offset] |= " + getOpTypeName(caseDef.opType) +
+ "(valueEqual) ? 0x8u : 0x0u;\n"
+ " b${SSBO1}.result[offset] |= " + getOpTypeName(caseDef.opType) +
+ "(valueNoEqual) ? 0x0u : 0x10u;\n"
+ " if (subgroupElect()) b${SSBO1}.result[offset] |= 0x2u | 0x10u;\n"
+ : "";
+
+ tcu::StringTemplate sourceTemplate(source);
+
+ const string formatString = subgroups::getFormatNameForGLSL(caseDef.format);
+
+ {
+ map<string, string> bufferNameMapping;
+ bufferNameMapping.insert(pair<string, string>("SSBO1", "0"));
+
+ const string vertex =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_vote: enable\n"
+ "layout(binding = 0, std430) buffer Buffer0\n"
+ "{\n"
+ " uint result[];\n"
+ "} b0;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + formatString + " data[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " highp int offset = gl_VertexID;\n"
+ + sourceTemplate.specialize(bufferNameMapping) +
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " float pixelPosition = pixelSize/2.0f - 1.0f;\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_PointSize = 1.0f;\n"
+ "}\n";
+ programCollection.add("vert") << glu::VertexSource(vertex);
+ }
+
+ {
+ map<string, string> bufferNameMapping;
+ bufferNameMapping.insert(pair<string, string>("SSBO1", "1"));
+
+ const string tesc =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_vote: enable\n"
+ "layout(vertices=1) out;\n"
+ "layout(binding = 1, std430) buffer Buffer1\n"
+ "{\n"
+ " uint result[];\n"
+ "} b1;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + formatString + " data[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " highp int offset = gl_PrimitiveID;\n"
+ + sourceTemplate.specialize(bufferNameMapping) +
+ " if (gl_InvocationID == 0)\n"
+ " {\n"
+ " gl_TessLevelOuter[0] = 1.0f;\n"
+ " gl_TessLevelOuter[1] = 1.0f;\n"
+ " }\n"
+ " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ "}\n";
+
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc);
+ }
+
+ {
+ map<string, string> bufferNameMapping;
+ bufferNameMapping.insert(pair<string, string>("SSBO1", "2"));
+
+ const string tese =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_vote: enable\n"
+ "layout(isolines) in;\n"
+ "layout(binding = 2, std430) buffer Buffer2\n"
+ "{\n"
+ " uint result[];\n"
+ "} b2;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + formatString + " data[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " highp uint offset = uint(gl_PrimitiveID * 2) + uint(gl_TessCoord.x + 0.5);\n"
+ + sourceTemplate.specialize(bufferNameMapping) +
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
+ "}\n";
+
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese);
+ }
+
+ {
+ map<string, string> bufferNameMapping;
+ bufferNameMapping.insert(pair<string, string>("SSBO1", "3"));
+
+ const string geometry =
+ // version string added by addGeometryShadersFromTemplate
+ "#extension GL_KHR_shader_subgroup_vote: enable\n"
+ "layout(${TOPOLOGY}) in;\n"
+ "layout(points, max_vertices = 1) out;\n"
+ "layout(binding = 3, std430) buffer Buffer3\n"
+ "{\n"
+ " uint result[];\n"
+ "} b3;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + formatString + " data[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " highp int offset = gl_PrimitiveIDIn;\n"
+ + sourceTemplate.specialize(bufferNameMapping) +
+ " gl_Position = gl_in[0].gl_Position;\n"
+ " EmitVertex();\n"
+ " EndPrimitive();\n"
+ "}\n";
+
+ subgroups::addGeometryShadersFromTemplate(geometry, programCollection);
+ }
+
+ {
+ const string sourceFragment =
+ (OPTYPE_ALL == caseDef.opType) ?
+ " result = " + getOpTypeName(caseDef.opType) +
+ "(true) ? 0x1u : 0u;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(false) ? 0u : 0x1Au;\n"
+ " result |= 0x4u;\n"
+ : (OPTYPE_ANY == caseDef.opType) ?
+ " result = " + getOpTypeName(caseDef.opType) +
+ "(true) ? 0x1u : 0u;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(false) ? 0u : 0x1Au;\n"
+ " result |= 0x4u;\n"
+ : (OPTYPE_ALLEQUAL == caseDef.opType) ?
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + "(1.25 * float(data[gl_SubgroupInvocationID]) + 5.0);\n" +
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueNoEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + (formatIsBoolean ? "(subgroupElect());\n" : "(12.0 * float(data[gl_SubgroupInvocationID]) + gl_FragCoord.x * float(gl_SubgroupInvocationID));\n") +
+ " result = " + getOpTypeName(caseDef.opType) + "("
+ + subgroups::getFormatNameForGLSL(caseDef.format) + "(1)) ? 0x1u : 0u;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(gl_SubgroupInvocationID) ? 0u : 0x2u;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(data[0]) ? 0x4u : 0u;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(valueEqual) ? 0x8u : 0x0u;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(valueNoEqual) ? 0x0u : 0x10u;\n"
+ " if (subgroupElect()) result |= 0x2u | 0x10u;\n"
+ : "";
+ const string fragment =
+ "${VERSION_DECL}\n"
+ "#extension GL_KHR_shader_subgroup_vote: enable\n"
+ "precision highp float;\n"
+ "layout(location = 0) out uint result;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
+ "{\n"
+ " " + formatString + " data[];\n"
+ "};\n"
+ "void main (void)\n"
+ "{\n"
+ + sourceFragment +
+ "}\n";
+
+ programCollection.add("fragment") << glu::FragmentSource(fragment);
+ }
+
+ subgroups::addNoSubgroupShader(programCollection);
+ }
+}
+
+void supportedCheck (Context& context, CaseDefinition caseDef)
+{
+ if (!subgroups::isSubgroupSupported(context))
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported");
+
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, subgroups::SUBGROUP_FEATURE_VOTE_BIT))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup vote operations");
+ }
+
+ if (subgroups::isDoubleFormat(caseDef.format) &&
+ !subgroups::isDoubleSupportedForDevice(context))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
+ }
+}
+
+tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
+{
+ if (!subgroups::areSubgroupOperationsSupportedForStage(
+ context, caseDef.shaderStage))
+ {
+ if (subgroups::areSubgroupOperationsRequiredForStage(
+ caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ else
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+ }
+ }
+
+ subgroups::SSBOData inputData;
+ inputData.format = caseDef.format;
+ inputData.layout = subgroups::SSBOData::LayoutStd140;
+ inputData.numElements = subgroups::maxSupportedSubgroupSize();
+ inputData.initializeType = OPTYPE_ALLEQUAL == caseDef.opType ? subgroups::SSBOData::InitializeZero : subgroups::SSBOData::InitializeNonZero;
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ return subgroups::makeVertexFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ return subgroups::makeGeometryFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_CONTROL_BIT);
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_EVALUATION_BIT);
+ else if (SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+ return subgroups::makeFragmentFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkFragmentPipelineStages);
+ else
+ TCU_THROW(InternalError, "Unhandled shader stage");
+}
+
+
+tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+{
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ if (!subgroups::areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+
+ subgroups::SSBOData inputData;
+ inputData.format = caseDef.format;
+ inputData.layout = subgroups::SSBOData::LayoutStd430;
+ inputData.numElements = subgroups::maxSupportedSubgroupSize();
+ inputData.initializeType = OPTYPE_ALLEQUAL == caseDef.opType ? subgroups::SSBOData::InitializeZero : subgroups::SSBOData::InitializeNonZero;
+ inputData.binding = 1u;
+
+ return subgroups::makeComputeTest(context, FORMAT_R32_UINT, &inputData,
+ 1, checkComputeStage);
+ }
+ else
+ {
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
+
+ ShaderStageFlags stages = (ShaderStageFlags)(caseDef.shaderStage & supportedStages);
+
+ if (SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ {
+ if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0)
+ TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+ else
+ stages = SHADER_STAGE_FRAGMENT_BIT;
+ }
+
+ if ((ShaderStageFlags)0u == stages)
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
+
+ subgroups::SSBOData inputData;
+ inputData.format = caseDef.format;
+ inputData.layout = subgroups::SSBOData::LayoutStd430;
+ inputData.numElements = subgroups::maxSupportedSubgroupSize();
+ inputData.initializeType = OPTYPE_ALLEQUAL == caseDef.opType ? subgroups::SSBOData::InitializeZero : subgroups::SSBOData::InitializeNonZero;
+ inputData.binding = 4u;
+ inputData.stages = stages;
+
+ return subgroups::allStages(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, stages);
+ }
+}
+
+} // namespace
+
+deqp::TestCaseGroup* createSubgroupsVoteTests(deqp::Context& testCtx)
+{
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
+ testCtx, "graphics", "Subgroup arithmetic category tests: graphics"));
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
+ testCtx, "compute", "Subgroup arithmetic category tests: compute"));
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
+ testCtx, "framebuffer", "Subgroup arithmetic category tests: framebuffer"));
+
+ de::MovePtr<deqp::TestCaseGroup> fragHelperGroup(new deqp::TestCaseGroup(
+ testCtx, "frag_helper", "Subgroup arithmetic category tests: fragment helper invocation"));
+
+ const ShaderStageFlags stages[] =
+ {
+ SHADER_STAGE_VERTEX_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT,
+ };
+
+ const Format formats[] =
+ {
+ FORMAT_R32_SINT, FORMAT_R32G32_SINT, FORMAT_R32G32B32_SINT,
+ FORMAT_R32G32B32A32_SINT, FORMAT_R32_UINT, FORMAT_R32G32_UINT,
+ FORMAT_R32G32B32_UINT, FORMAT_R32G32B32A32_UINT,
+ FORMAT_R32_SFLOAT, FORMAT_R32G32_SFLOAT,
+ FORMAT_R32G32B32_SFLOAT, FORMAT_R32G32B32A32_SFLOAT,
+ FORMAT_R64_SFLOAT, FORMAT_R64G64_SFLOAT,
+ FORMAT_R64G64B64_SFLOAT, FORMAT_R64G64B64A64_SFLOAT,
+ FORMAT_R32_BOOL, FORMAT_R32G32_BOOL,
+ FORMAT_R32G32B32_BOOL, FORMAT_R32G32B32A32_BOOL,
+ };
+
+ for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
+ {
+ const Format format = formats[formatIndex];
+
+ for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
+ {
+ // Skip the typed tests for all but subgroupAllEqual()
+ if ((FORMAT_R32_UINT != format) && (OPTYPE_ALLEQUAL != opTypeIndex))
+ {
+ continue;
+ }
+
+ const std::string op = de::toLower(getOpTypeName(opTypeIndex));
+
+ {
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_COMPUTE_BIT, format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(),
+ op + "_" + subgroups::getFormatNameForGLSL(format),
+ "", supportedCheck, initPrograms, test, caseDef);
+ }
+
+ {
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_ALL_GRAPHICS, format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(),
+ op + "_" + subgroups::getFormatNameForGLSL(format),
+ "", supportedCheck, initPrograms, test, caseDef);
+ }
+
+ for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+ {
+ const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex], format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(),
+ op + "_" +
+ subgroups::getFormatNameForGLSL(format)
+ + "_" + getShaderStageName(caseDef.shaderStage), "",
+ supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
+ }
+
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_FRAGMENT_BIT, format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(fragHelperGroup.get(),
+ op + "_" +
+ subgroups::getFormatNameForGLSL(format)
+ + "_" + getShaderStageName(caseDef.shaderStage), "",
+ supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
+ }
+ }
+
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
+ testCtx, "vote", "Subgroup vote category tests"));
+
+ group->addChild(graphicGroup.release());
+ group->addChild(computeGroup.release());
+ group->addChild(framebufferGroup.release());
+ group->addChild(fragHelperGroup.release());
+
+ return group.release();
+}
+
+} // subgroups
+} // glc
diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsVoteTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsVoteTests.hpp
new file mode 100644
index 0000000..ab39d2f
--- /dev/null
+++ b/external/openglcts/modules/common/subgroups/glcSubgroupsVoteTests.hpp
@@ -0,0 +1,41 @@
+#ifndef _GLCSUBGROUPSVOTETESTS_HPP
+#define _GLCSUBGROUPSVOTETESTS_HPP
+/*------------------------------------------------------------------------
+ * OpenGL Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "glcTestCase.hpp"
+
+namespace glc
+{
+namespace subgroups
+{
+
+deqp::TestCaseGroup* createSubgroupsVoteTests(deqp::Context& testCtx);
+
+} // subgroups
+} // glc
+
+#endif // _GLCSUBGROUPSVOTETESTS_HPP
diff --git a/external/openglcts/modules/gl/CMakeLists.txt b/external/openglcts/modules/gl/CMakeLists.txt
index 8c2268a..6ef9f79 100644
--- a/external/openglcts/modules/gl/CMakeLists.txt
+++ b/external/openglcts/modules/gl/CMakeLists.txt
@@ -130,14 +130,6 @@
tcutil
)
-if (DEQP_HAVE_GLSLANG)
- add_definitions(-DDEQP_HAVE_GLSLANG=1)
-endif ()
-
-if(DEQP_HAVE_SPIRV_TOOLS)
- add_definitions(-DDEQP_HAVE_SPIRV_TOOLS=1)
-endif()
-
if (DEQP_GTF_AVAILABLE)
list(APPEND GLCTS_GL_LIBS glcts-gtf)
endif ()
diff --git a/external/openglcts/modules/gl/gl4cDirectStateAccessVertexArraysTests.cpp b/external/openglcts/modules/gl/gl4cDirectStateAccessVertexArraysTests.cpp
index fa27408..9e0ba0d 100644
--- a/external/openglcts/modules/gl/gl4cDirectStateAccessVertexArraysTests.cpp
+++ b/external/openglcts/modules/gl/gl4cDirectStateAccessVertexArraysTests.cpp
@@ -316,7 +316,7 @@
glw::GLuint id;
} shader[] = { { vertex_shader, GL_VERTEX_SHADER, 0 }, { s_fragment_shader, GL_FRAGMENT_SHADER, 0 } };
- glw::GLuint const shader_count = sizeof(shader) / sizeof(shader[0]);
+ glw::GLuint const shader_count = DE_LENGTH_OF_ARRAY(shader);
glw::GLuint po = 0;
@@ -884,7 +884,7 @@
glw::GLuint id;
} shader[] = { { s_vertex_shader, GL_VERTEX_SHADER, 0 }, { s_fragment_shader, GL_FRAGMENT_SHADER, 0 } };
- glw::GLuint const shader_count = sizeof(shader) / sizeof(shader[0]);
+ glw::GLuint const shader_count = DE_LENGTH_OF_ARRAY(shader);
try
{
@@ -1331,7 +1331,7 @@
glw::GLuint id;
} shader[] = { { s_vertex_shader, GL_VERTEX_SHADER, 0 }, { s_fragment_shader, GL_FRAGMENT_SHADER, 0 } };
- glw::GLuint const shader_count = sizeof(shader) / sizeof(shader[0]);
+ glw::GLuint const shader_count = DE_LENGTH_OF_ARRAY(shader);
try
{
@@ -1962,7 +1962,7 @@
0 },
{ { s_fragment_shader, DE_NULL, DE_NULL }, 1, GL_FRAGMENT_SHADER, 0 } };
- glw::GLuint const shader_count = sizeof(shader) / sizeof(shader[0]);
+ glw::GLuint const shader_count = DE_LENGTH_OF_ARRAY(shader);
try
{
@@ -2652,7 +2652,7 @@
glw::GLuint id;
} shader[] = { { s_vertex_shader, GL_VERTEX_SHADER, 0 }, { s_fragment_shader, GL_FRAGMENT_SHADER, 0 } };
- glw::GLuint const shader_count = sizeof(shader) / sizeof(shader[0]);
+ glw::GLuint const shader_count = DE_LENGTH_OF_ARRAY(shader);
try
{
@@ -4770,7 +4770,7 @@
{
bad_type++;
is_accepted_type = false;
- for (glw::GLuint i = 0; i < sizeof(accepted_types) / sizeof(accepted_types); ++i)
+ for (glw::GLuint i = 0; i < DE_LENGTH_OF_ARRAY(accepted_types); ++i)
{
if (accepted_types[i] == bad_type)
{
@@ -5481,7 +5481,7 @@
{
bad_pname++;
is_accepted_pname = false;
- for (glw::GLuint i = 0; i < sizeof(accepted_pnames) / sizeof(accepted_pnames); ++i)
+ for (glw::GLuint i = 0; i < DE_LENGTH_OF_ARRAY(accepted_pnames); ++i)
{
if (accepted_pnames[i] == bad_pname)
{
diff --git a/external/openglcts/modules/gl/gl4cGlSpirvTests.cpp b/external/openglcts/modules/gl/gl4cGlSpirvTests.cpp
index b0727e4..d885e90 100644
--- a/external/openglcts/modules/gl/gl4cGlSpirvTests.cpp
+++ b/external/openglcts/modules/gl/gl4cGlSpirvTests.cpp
@@ -335,7 +335,6 @@
}
else if (it == ITERATE_SPIRV)
{
-#if defined DEQP_HAVE_GLSLANG
ProgramBinaries binaries;
binaries << spirvUtils::makeSpirV(m_context.getTestContext().getLog(), VertexSource(m_vertex));
binaries << spirvUtils::makeSpirV(m_context.getTestContext().getLog(),
@@ -345,16 +344,6 @@
binaries << spirvUtils::makeSpirV(m_context.getTestContext().getLog(), GeometrySource(m_geometry));
binaries << spirvUtils::makeSpirV(m_context.getTestContext().getLog(), FragmentSource(m_fragment));
program = new ShaderProgram(gl, binaries);
-#else // DEQP_HAVE_GLSLANG
- tcu::Archive& archive = m_testCtx.getArchive();
- ProgramBinaries binaries;
- binaries << commonUtils::readSpirV(archive.getResource("spirv/modules_positive/vertex.nspv"));
- binaries << commonUtils::readSpirV(archive.getResource("spirv/modules_positive/tess_control.nspv"));
- binaries << commonUtils::readSpirV(archive.getResource("spirv/modules_positive/tess_evaluation.nspv"));
- binaries << commonUtils::readSpirV(archive.getResource("spirv/modules_positive/geometry.nspv"));
- binaries << commonUtils::readSpirV(archive.getResource("spirv/modules_positive/fragment.nspv"));
- program = new ShaderProgram(gl, binaries);
-#endif // DEQP_HAVE_GLSLANG
}
if (!program->isOk())
@@ -565,18 +554,12 @@
gl.bufferData(GL_ARRAY_BUFFER, 9 * sizeof(GLfloat), (GLvoid*)vertices, GL_DYNAMIC_DRAW);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData");
-#if defined DEQP_HAVE_SPIRV_TOOLS
ShaderBinary binary;
binary << SHADERTYPE_VERTEX << "mainv";
binary << SHADERTYPE_FRAGMENT << "mainf";
spirvUtils::spirvAssemble(binary.binary, m_spirv);
spirvUtils::spirvValidate(binary.binary, true);
-#else // DEQP_HAVE_SPIRV_TOOLS
- tcu::Archive& archive = m_testCtx.getArchive();
- ShaderBinary binary = commonUtils::readSpirV(
- archive.getResource("spirv/spirv_modules_shader_binary_multiple_shader_objects/binary.nspv"));
-#endif // DEQP_HAVE_SPIRV_TOOLS
ProgramBinaries binaries;
binaries << binary;
@@ -715,7 +698,6 @@
ProgramBinaries binaries;
ShaderBinary vertexBinary;
-#if defined DEQP_HAVE_GLSLANG && DEQP_HAVE_SPIRV_TOOLS
{
vertexBinary = spirvUtils::makeSpirV(m_context.getTestContext().getLog(), VertexSource(m_vertex));
@@ -742,10 +724,6 @@
spirvUtils::spirvAssemble(vertexBinary.binary, input);
spirvUtils::spirvValidate(vertexBinary.binary, true);
}
-#else // DEQP_HAVE_GLSLANG && DEQP_HAVE_SPIRV_TOOLS
- tcu::Archive& archive = m_testCtx.getArchive();
- vertexBinary = commonUtils::readSpirV(archive.getResource("spirv/modules_state_queries/vertex.nspv"));
-#endif // DEQP_HAVE_GLSLANG && DEQP_HAVE_SPIRV_TOOLS
binaries << vertexBinary;
ShaderProgram program(gl, binaries);
@@ -907,12 +885,7 @@
ShaderBinary vertexBinary;
-#if defined DEQP_HAVE_GLSLANG
vertexBinary = spirvUtils::makeSpirV(m_context.getTestContext().getLog(), VertexSource(m_vertex));
-#else // DEQP_HAVE_GLSLANG
- tcu::Archive& archive = m_testCtx.getArchive();
- vertexBinary = commonUtils::readSpirV(archive.getResource("spirv/modules_error_verification/vertex.nspv"));
-#endif // DEQP_HAVE_GLSLANG
gl.shaderSource(m_glslShaderId, 1, &shaderSrc, &shaderLen);
GLU_EXPECT_NO_ERROR(gl.getError(), "shaderSource");
@@ -1130,7 +1103,6 @@
tcu::TestNode::IterateResult SpirvGlslToSpirVEnableTest::iterate()
{
-#if defined DEQP_HAVE_GLSLANG && DEQP_HAVE_SPIRV_TOOLS
{
const Functions& gl = m_context.getRenderContext().getFunctions();
@@ -1164,11 +1136,6 @@
m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
}
-#else // DEQP_HAVE_GLSLANG && DEQP_HAVE_SPIRV_TOOLS
-
- TCU_THROW(InternalError, "Either glslang or spirv-tools not available.");
-
-#endif // DEQP_HAVE_GLSLANG && DEQP_HAVE_SPIRV_TOOLS
return STOP;
}
@@ -1703,13 +1670,7 @@
sources << vertexSource;
ShaderBinary vertexBinary;
-#if defined DEQP_HAVE_GLSLANG
vertexBinary = spirvUtils::makeSpirV(m_context.getTestContext().getLog(), vertexSource);
-#else // DEQP_HAVE_GLSLANG
- tcu::Archive& archive = m_testCtx.getArchive();
- vertexBinary =
- commonUtils::readSpirV(archive.getResource("spirv/glsl_to_spirv_builtin_functions/common_vertex.nspv"));
-#endif //DEQP_HAVE_GLSLANG
binaries << vertexBinary;
}
@@ -1717,19 +1678,8 @@
ShaderBinary shaderBinary;
std::string spirvSource;
-#if defined DEQP_HAVE_GLSLANG
shaderBinary = spirvUtils::makeSpirV(m_context.getTestContext().getLog(), shaderSource);
-#else // DEQP_HAVE_GLSLANG
- {
- std::stringstream ss;
- ss << "spirv/glsl_to_spirv_builtin_functions/binary_" << i << ".nspv";
- tcu::Archive& archive = m_testCtx.getArchive();
- shaderBinary = commonUtils::readSpirV(archive.getResource(ss.str().c_str()));
- }
-#endif // DEQP_HAVE_GLSLANG
-
-#if defined DEQP_HAVE_SPIRV_TOOLS
{
spirvUtils::spirvDisassemble(spirvSource, shaderBinary.binary);
@@ -1744,9 +1694,6 @@
TCU_THROW(InternalError, "Mappings for shader failed.");
}
}
-#else // DEQP_HAVE_SPIRV_TOOLS
- spirvSource = "Could not disassemble Spir-V module. SPIRV-TOOLS not available.";
-#endif // DEQP_HAVE_SPIRV_TOOLS
binaries << shaderBinary;
@@ -1756,13 +1703,7 @@
sources << tessEvalSource;
ShaderBinary tessEvalBinary;
-#if defined DEQP_HAVE_GLSLANG
tessEvalBinary = spirvUtils::makeSpirV(m_context.getTestContext().getLog(), tessEvalSource);
-#else // DEQP_HAVE_GLSLANG
- tcu::Archive& archive = m_testCtx.getArchive();
- tessEvalBinary = commonUtils::readSpirV(
- archive.getResource("spirv/glsl_to_spirv_builtin_functions/common_tesseval.nspv"));
-#endif // DEQP_HAVE_GLSLANG
binaries << tessEvalBinary;
}
@@ -2068,20 +2009,10 @@
ShaderBinary vertexBinary;
ShaderBinary fragmentBinary;
-#if defined DEQP_HAVE_GLSLANG
{
vertexBinary = spirvUtils::makeSpirV(m_context.getTestContext().getLog(), VertexSource(m_vertex));
fragmentBinary = spirvUtils::makeSpirV(m_context.getTestContext().getLog(), FragmentSource(m_fragment));
}
-#else // DEQP_HAVE_GLSLANG
- {
- tcu::Archive& archive = m_testCtx.getArchive();
- vertexBinary =
- commonUtils::readSpirV(archive.getResource("spirv/glsl_to_spirv_specialization_constants/vertex.nspv"));
- fragmentBinary =
- commonUtils::readSpirV(archive.getResource("spirv/glsl_to_spirv_specialization_constants/fragment.nspv"));
- }
-#endif // DEQP_HAVE_GLSLANG
fragmentBinary << SpecializationData(10, 128);
ProgramBinaries binaries;
@@ -2450,7 +2381,6 @@
{
std::vector<ShaderBinary> binariesVec;
-#if defined DEQP_HAVE_GLSLANG
ProgramBinaries binaries;
for (int s = 0; s < (signed)m_validations[v].shaders.size(); ++s)
{
@@ -2459,22 +2389,8 @@
binariesVec.push_back(shaderBinary);
binaries << shaderBinary;
}
-#else // DEQP_HAVE_GLSLANG
- tcu::Archive& archive = m_testCtx.getArchive();
- ProgramBinaries binaries;
- for (int s = 0; s < (signed)m_validations[v].shaders.size(); ++s)
- {
- std::stringstream ss;
- ss << "spirv/spirv_validation_builtin_variable_decorations/shader_" << v << "_" << s << ".nspv";
-
- ShaderBinary shaderBinary = commonUtils::readSpirV(archive.getResource(ss.str().c_str()));
- binariesVec.push_back(shaderBinary);
- binaries << shaderBinary;
- }
-#endif // DEQP_HAVE_GLSLANG
program = new ShaderProgram(gl, binaries);
-#if defined DEQP_HAVE_SPIRV_TOOLS
std::string spirvSource;
for (int s = 0; s < (signed)m_validations[v].shaders.size(); ++s)
@@ -2494,7 +2410,6 @@
TCU_THROW(InternalError, "Mappings for shader failed.");
}
}
-#endif // DEQP_HAVE_SPIRV_TOOLS
}
if (!program->isOk())
@@ -3458,7 +3373,6 @@
for (int s = 0; s < (signed)pipeline.size(); ++s)
{
ShaderStage& stage = pipeline[s];
-#if defined DEQP_HAVE_GLSLANG
stage.binary = spirvUtils::makeSpirV(m_context.getTestContext().getLog(), stage.source);
std::stringstream ssw;
if (stage.name.empty())
@@ -3466,15 +3380,6 @@
else
ssw << "gl_cts/data/spirv/spirv_validation_capabilities/" << stage.name << ".nspv";
commonUtils::writeSpirV(ssw.str().c_str(), stage.binary);
-#else // DEQP_HAVE_GLSLANG
- tcu::Archive& archive = m_testCtx.getArchive();
- std::stringstream ss;
- if (stage.name.empty())
- ss << "spirv/spirv_validation_capabilities/binary_p" << p << "s" << s << ".nspv";
- else
- ss << "spirv/spirv_validation_capabilities/" << stage.name << ".nspv";
- stage.binary = commonUtils::readSpirV(archive.getResource(ss.str().c_str()));
-#endif // DEQP_HAVE_GLSLANG
programBinaries << stage.binary;
}
@@ -3505,7 +3410,6 @@
return STOP;
}
-#if defined DEQP_HAVE_SPIRV_TOOLS
for (int s = 0; s < (signed)pipeline.size(); ++s)
{
ShaderStage stage = pipeline[s];
@@ -3541,7 +3445,6 @@
}
}
}
-#endif // DEQP_HAVE_SPIRV_TOOLS
}
m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
diff --git a/external/openglcts/modules/gl/gl4cShaderStorageBufferObjectTests.cpp b/external/openglcts/modules/gl/gl4cShaderStorageBufferObjectTests.cpp
index 564a1f0..7597d49 100644
--- a/external/openglcts/modules/gl/gl4cShaderStorageBufferObjectTests.cpp
+++ b/external/openglcts/modules/gl/gl4cShaderStorageBufferObjectTests.cpp
@@ -6109,7 +6109,7 @@
int pad[3];
vec4 position;
} data[6];
- memset(data, 0, sizeof(data));
+ deMemset((void *)data, 0, sizeof(data));
glGenBuffers(1, &m_storage_buffer);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_storage_buffer);
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(data), data, GL_DYNAMIC_DRAW);
diff --git a/external/openglcts/modules/glcTestPackageRegistry.cpp b/external/openglcts/modules/glcTestPackageRegistry.cpp
index 9cba9ba..0162907 100644
--- a/external/openglcts/modules/glcTestPackageRegistry.cpp
+++ b/external/openglcts/modules/glcTestPackageRegistry.cpp
@@ -55,6 +55,7 @@
#include "gl4cTestPackages.hpp"
#include "glcNoDefaultContextPackage.hpp"
+#include "glcSingleConfigTestPackage.hpp"
#if defined(DEQP_GTF_AVAILABLE)
#include "gtfGL30TestPackage.hpp"
@@ -155,6 +156,19 @@
return new glcts::NoDefaultContextPackage(testCtx, "KHR-NoContext");
}
+static tcu::TestPackage* createSingleConfigGL45TestPackage(tcu::TestContext& testCtx)
+{
+ return new glcts::SingleConfigTestPackage(testCtx, "KHR-Single-GL45", glu::ContextType(glu::ApiType::core(4, 5)));
+}
+static tcu::TestPackage* createSingleConfigGL46TestPackage(tcu::TestContext& testCtx)
+{
+ return new glcts::SingleConfigTestPackage(testCtx, "KHR-Single-GL46", glu::ContextType(glu::ApiType::core(4, 6)));
+}
+static tcu::TestPackage* createSingleConfigES32TestPackage(tcu::TestContext& testCtx)
+{
+ return new glcts::SingleConfigTestPackage(testCtx, "KHR-Single-GLES32", glu::ContextType(glu::ApiType::es(3, 2)));
+}
+
static tcu::TestPackage* createGL30Package(tcu::TestContext& testCtx)
{
return new gl3cts::GL30TestPackage(testCtx, "KHR-GL30");
@@ -290,6 +304,10 @@
registry->registerPackage("KHR-NoContext", createNoDefaultCustomContextPackage);
+ registry->registerPackage("KHR-Single-GL45", createSingleConfigGL45TestPackage);
+ registry->registerPackage("KHR-Single-GL46", createSingleConfigGL46TestPackage);
+ registry->registerPackage("KHR-Single-GLES32", createSingleConfigES32TestPackage);
+
registry->registerPackage("KHR-GL30", createGL30Package);
registry->registerPackage("KHR-GL31", createGL31Package);
registry->registerPackage("KHR-GL32", createGL32Package);
diff --git a/external/openglcts/modules/gles31/es31cArrayOfArraysTests.cpp b/external/openglcts/modules/gles31/es31cArrayOfArraysTests.cpp
index de5a07b..2ef6ea0 100644
--- a/external/openglcts/modules/gles31/es31cArrayOfArraysTests.cpp
+++ b/external/openglcts/modules/gles31/es31cArrayOfArraysTests.cpp
@@ -1787,7 +1787,7 @@
};
for (size_t invalid_declarations_index = 0;
- invalid_declarations_index < sizeof(invalid_declarations) / sizeof(invalid_declarations);
+ invalid_declarations_index < DE_LENGTH_OF_ARRAY(invalid_declarations);
invalid_declarations_index++)
{
std::string shader_source;
@@ -1825,7 +1825,7 @@
};
for (size_t invalid_declarations_index = 0;
- invalid_declarations_index < sizeof(invalid_declarations) / sizeof(invalid_declarations);
+ invalid_declarations_index < DE_LENGTH_OF_ARRAY(invalid_declarations);
invalid_declarations_index++)
{
std::string shader_source;
@@ -1864,7 +1864,7 @@
std::string non_constant_variable_declaration = " uint a = 2u;\n";
for (size_t invalid_declarations_index = 0;
- invalid_declarations_index < sizeof(invalid_declarations) / sizeof(invalid_declarations);
+ invalid_declarations_index < DE_LENGTH_OF_ARRAY(invalid_declarations);
invalid_declarations_index++)
{
std::string shader_source;
diff --git a/external/openglcts/modules/gles31/es31cDrawIndirectTests.cpp b/external/openglcts/modules/gles31/es31cDrawIndirectTests.cpp
index b308f1f..8a947d9 100644
--- a/external/openglcts/modules/gles31/es31cDrawIndirectTests.cpp
+++ b/external/openglcts/modules/gles31/es31cDrawIndirectTests.cpp
@@ -5628,10 +5628,11 @@
ReadPixelsFloat<api>(0, 0, getWindowWidth(), getWindowHeight() / 4, &bufferTest1[0]);
result.sub_result(BuffersCompare(bufferTest1, getWindowWidth(), getWindowHeight() / 4, bufferRef1,
getWindowWidth(), getWindowHeight() / 4));
-
- ReadPixelsFloat<api>(0, (getWindowHeight() + 3) / 4, getWindowWidth(), getWindowHeight() / 2, &bufferTest2[0]);
+ // height = 2 * (getWindowHeight() / 4) to avoid border pixels
+ // in case the height is not a multiple of 4.
+ ReadPixelsFloat<api>(0, (getWindowHeight() + 3) / 4, getWindowWidth(), 2 * (getWindowHeight() / 4), &bufferTest2[0]);
result.sub_result(BuffersCompare(bufferTest2, getWindowWidth(), getWindowHeight() / 2, bufferRef2,
- getWindowWidth(), getWindowHeight() / 2));
+ getWindowWidth(), 2 *(getWindowHeight() / 4)));
ReadPixelsFloat<api>(0, (getWindowHeight() * 3 + 3) / 4, getWindowWidth(), getWindowHeight() / 4,
&bufferTest1[0]);
diff --git a/external/openglcts/modules/runner/glcKhronosMustpassEsSingleConfig.hpp b/external/openglcts/modules/runner/glcKhronosMustpassEsSingleConfig.hpp
new file mode 100644
index 0000000..85e48dc
--- /dev/null
+++ b/external/openglcts/modules/runner/glcKhronosMustpassEsSingleConfig.hpp
@@ -0,0 +1,28 @@
+#ifndef _GLCKHRONOSMUSTPASSESSINGLECONFIG_HPP
+#define _GLCKHRONOSMUSTPASSESSINGLECONFIG_HPP
+/* Copyright (C) 2016-2017 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.
+*/
+
+/* WARNING: This is auto-generated file. Do not modify, since changes will
+ * be lost! Modify the generating script instead.
+ */
+
+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 },
+};
+
+#endif // _GLCKHRONOSMUSTPASSESSINGLECONFIG_HPP
diff --git a/external/openglcts/modules/runner/glcKhronosMustpassGlSingleConfig.hpp b/external/openglcts/modules/runner/glcKhronosMustpassGlSingleConfig.hpp
new file mode 100644
index 0000000..00c9c37
--- /dev/null
+++ b/external/openglcts/modules/runner/glcKhronosMustpassGlSingleConfig.hpp
@@ -0,0 +1,29 @@
+#ifndef _GLCKHRONOSMUSTPASSGLSINGLECONFIG_HPP
+#define _GLCKHRONOSMUSTPASSGLSINGLECONFIG_HPP
+/* Copyright (C) 2016-2017 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.
+*/
+
+/* WARNING: This is auto-generated file. Do not modify, since changes will
+ * be lost! Modify the generating script instead.
+ */
+
+const char* mustpassDir = "gl_cts/data/mustpass/gl/khronos_mustpass_single/4.6.1.x/";
+
+static const RunParams khronos_mustpass_gl_single_config_first_cfg[] = {
+ { glu::ApiType::core(4, 5), "khr-single", DE_NULL, "unspecified", 1, DE_NULL, 64, 64 },
+ { glu::ApiType::core(4, 6), "khr-single", DE_NULL, "unspecified", 1, DE_NULL, 64, 64 },
+};
+
+#endif // _GLCKHRONOSMUSTPASSGLSINGLECONFIG_HPP
diff --git a/external/openglcts/modules/runner/glcTestRunner.cpp b/external/openglcts/modules/runner/glcTestRunner.cpp
index fd55b91..885cfa8 100644
--- a/external/openglcts/modules/runner/glcTestRunner.cpp
+++ b/external/openglcts/modules/runner/glcTestRunner.cpp
@@ -402,11 +402,48 @@
DE_LENGTH_OF_ARRAY(khronos_mustpass_es_nocontext_first_cfg), mustpassDir);
}
+static void getTestRunsForSingleConfig(glu::ApiType type, vector<TestRunParams>& runs, const ConfigList& configs, const RunParams* runParams,
+ const int numRunParams, const char* mustpassDir)
+{
+ vector<Config>::const_iterator cfgIter = configs.configs.begin();
+
+ for (int i = 0; i < numRunParams; ++i)
+ {
+ if (type != runParams[i].apiType)
+ continue;
+
+ const char* apiName = getApiName(runParams[i].apiType);
+
+ const int width = runParams[i].surfaceWidth;
+ const int height = runParams[i].surfaceHeight;
+ const int seed = runParams[i].baseSeed;
+
+ TestRunParams params;
+ params.logFilename = getLogFileName(apiName, runParams[i].configName, 1, i, width, height, seed);
+
+ getBaseOptions(params.args, mustpassDir, apiName, runParams[i].configName, runParams[i].screenRotation, width,
+ height);
+
+ params.args.push_back(string("--deqp-base-seed=") + de::toString(seed));
+
+ appendConfigArgs(*cfgIter, params.args, runParams[i].fboConfig);
+
+ runs.push_back(params);
+ }
+}
+static void getTestRunsForSingleConfigES(glu::ApiType type, vector<TestRunParams>& runs, const ConfigList& configs)
+{
+#include "glcKhronosMustpassEsSingleConfig.hpp"
+ getTestRunsForSingleConfig(type, runs, configs, khronos_mustpass_es_single_config_first_cfg,
+ DE_LENGTH_OF_ARRAY(khronos_mustpass_es_single_config_first_cfg), mustpassDir);
+}
+
static void getTestRunsForES(glu::ApiType type, const ConfigList& configs, vector<TestRunParams>& runs)
{
getTestRunsForAOSPEGL(runs, configs);
getTestRunsForAOSPES(runs, configs, type);
getTestRunsForNoContextES(type, runs, configs);
+ getTestRunsForSingleConfigES(type, runs, configs);
#include "glcKhronosMustpassEs.hpp"
@@ -450,10 +487,17 @@
getTestRunsForNoContext(type, runs, configs, khronos_mustpass_gl_nocontext_first_cfg,
DE_LENGTH_OF_ARRAY(khronos_mustpass_gl_nocontext_first_cfg), mustpassDir);
}
+static void getTestRunsForSingleConfigGL(glu::ApiType type, vector<TestRunParams>& runs, const ConfigList& configs)
+{
+#include "glcKhronosMustpassGlSingleConfig.hpp"
+ getTestRunsForSingleConfig(type, runs, configs, khronos_mustpass_gl_single_config_first_cfg,
+ DE_LENGTH_OF_ARRAY(khronos_mustpass_gl_single_config_first_cfg), mustpassDir);
+}
static void getTestRunsForGL(glu::ApiType type, const ConfigList& configs, vector<TestRunParams>& runs)
{
getTestRunsForNoContextGL(type, runs, configs);
+ getTestRunsForSingleConfigGL(type, runs, configs);
#include "glcKhronosMustpassGl.hpp"
for (vector<Config>::const_iterator cfgIter = configs.configs.begin(); cfgIter != configs.configs.end(); ++cfgIter)
diff --git a/external/openglcts/scripts/build_caselists.py b/external/openglcts/scripts/build_caselists.py
index 35710b9..ced4106 100644
--- a/external/openglcts/scripts/build_caselists.py
+++ b/external/openglcts/scripts/build_caselists.py
@@ -79,6 +79,9 @@
Module("KHR-NOCTX-GL40","GL40"),
Module("KHR-NOCTX-GL43","GL43"),
Module("KHR-NOCTX-GL45","GL45"),
+ Module("KHR-Single-GL45","GL45"),
+ Module("KHR-Single-GL46","GL46"),
+ Module("KHR-Single-GLES32","GLES32"),
]
GLCTS_BIN_NAME = "glcts"
GLCTS_DIR_NAME = "external/openglcts/modules/"
diff --git a/external/openglcts/scripts/build_mustpass.py b/external/openglcts/scripts/build_mustpass.py
index 0ba4d04..f98c973 100644
--- a/external/openglcts/scripts/build_mustpass.py
+++ b/external/openglcts/scripts/build_mustpass.py
@@ -79,6 +79,12 @@
CTS_KHR_MP_NOCTX_ES_PROJECT = Project(name = "Khronos Mustpass ES NoContext", path = CTS_KHR_MP_NOCTX_DATA_DIR, incpath = CTS_MP_INC_DIR, devicepath = CTS_KHR_MP_NOCTX_DEVICE_DIR, copyright = COPYRIGHT_DECLARATION)
+CTS_KHR_MP_SINGLE_DATA_DIR = os.path.join(DEQP_DIR, "external", "openglcts", "data", "mustpass", "gles", "khronos_mustpass_single")
+
+CTS_KHR_MP_SINGLE_DEVICE_DIR = "gl_cts/data/mustpass/gles/khronos_mustpass_single"
+
+CTS_KHR_MP_SINGLE_ES_PROJECT = Project(name = "Khronos Mustpass ES Single Config", path = CTS_KHR_MP_SINGLE_DATA_DIR, incpath = CTS_MP_INC_DIR, devicepath = CTS_KHR_MP_SINGLE_DEVICE_DIR, copyright = COPYRIGHT_DECLARATION)
+
EGL_MODULE = getModuleByName("dEQP-EGL")
ES2CTS_MODULE = getModuleByName("dEQP-GLES2")
ES3CTS_MODULE = getModuleByName("dEQP-GLES3")
@@ -90,6 +96,7 @@
ES32KHR_MODULE = getModuleByName("KHR-GLES32")
NOCTX_ES2_KHR_MODULE = getModuleByName("KHR-NOCTX-ES2")
NOCTX_ES32_KHR_MODULE = getModuleByName("KHR-NOCTX-ES32")
+SINGLE_ES32_KHR_MODULE = getModuleByName("KHR-Single-GLES32")
ES2GTF_MODULE = getModuleByName("GTF-GLES2")
ES3GTF_MODULE = getModuleByName("GTF-GLES3")
@@ -877,6 +884,16 @@
filters = MASTER_GLES32_COMMON_FILTERS),
])
+GLCTS_SINGLE_ES32_KHR_PKG = Package(module = SINGLE_ES32_KHR_MODULE, configurations = [
+ # Master
+ Configuration(name = "khr-single",
+ surfacewidth = "64",
+ surfaceheight = "64",
+ baseseed = "1",
+ filters = [include("gles32-khr-single.txt")]),
+ ])
+
+
ES_MUSTPASS_LISTS = [
# 3.2.2.x
Mustpass(project = CTS_KHR_MP_ES_PROJECT, version = "3.2.2.x", isCurrent=False,
@@ -989,6 +1006,9 @@
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=True,
+ packages = [GLCTS_SINGLE_ES32_KHR_PKG]),
+
Mustpass(project = CTS_AOSP_MP_ES_PROJECT, version = "master", isCurrent=True,
packages = [MASTER_GLES2_PKG, MASTER_GLES3_PKG, MASTER_GLES31_PKG]),
@@ -1015,6 +1035,12 @@
GL_CTS_NOCTX_PROJECT = Project(name = "Khronos Mustpass GL NoContext", path = GL_CTS_KHR_MP_NOCTX_DATA_DIR, incpath = GL_CTS_MP_INC_DIR, devicepath = GL_CTS_KHR_MP_NOCTX_DEVICE_DIR, copyright = COPYRIGHT_DECLARATION)
+GL_CTS_KHR_MP_SINGLE_DATA_DIR = os.path.join(DEQP_DIR, "external", "openglcts", "data", "mustpass", "gl", "khronos_mustpass_single")
+
+GL_CTS_KHR_MP_SINGLE_DEVICE_DIR = "gl_cts/data/mustpass/gl/khronos_mustpass_single"
+
+GL_CTS_KHR_SINGLE_PROJECT = Project(name = "Khronos Mustpass GL Single Config", path = GL_CTS_KHR_MP_SINGLE_DATA_DIR, incpath = GL_CTS_MP_INC_DIR, devicepath = GL_CTS_KHR_MP_SINGLE_DEVICE_DIR, copyright = COPYRIGHT_DECLARATION)
+
GL_MODULES = OrderedDict([
('KHR-GL46', ['master', [include('gl46-master.txt'), exclude('gl46-test-issues.txt'), exclude('gl46-waivers.txt')]]),
('KHR-GL45', ['master', [include('gl45-master.txt'), exclude('gl45-test-issues.txt'), exclude('gl45-waivers.txt')]]),
@@ -1044,6 +1070,8 @@
NOCTX_GL40_KHR_MODULE = getModuleByName("KHR-NOCTX-GL40")
NOCTX_GL43_KHR_MODULE = getModuleByName("KHR-NOCTX-GL43")
NOCTX_GL45_KHR_MODULE = getModuleByName("KHR-NOCTX-GL45")
+SINGLE_GL45_KHR_MODULE = getModuleByName("KHR-Single-GL45")
+SINGLE_GL46_KHR_MODULE = getModuleByName("KHR-Single-GL46")
GLCTS_NOCTX_GL30_KHR_PKG = Package(module = NOCTX_GL30_KHR_MODULE, configurations = [
# Master
@@ -1081,6 +1109,24 @@
filters = [include("gl45-khr-master.txt")]),
])
+GLCTS_SINGLE_GL45_KHR_PKG = Package(module = SINGLE_GL45_KHR_MODULE, configurations = [
+ # Master
+ Configuration(name = "khr-single",
+ surfacewidth = "64",
+ surfaceheight = "64",
+ baseseed = "1",
+ filters = [include("gl45-khr-single.txt")]),
+ ])
+
+GLCTS_SINGLE_GL46_KHR_PKG = Package(module = SINGLE_GL46_KHR_MODULE, configurations = [
+ # Master
+ Configuration(name = "khr-single",
+ surfacewidth = "64",
+ surfaceheight = "64",
+ baseseed = "1",
+ filters = [include("gl46-khr-single.txt")]),
+ ])
+
def generateGLMustpass():
gl_packages = []
for packageName in GL_MODULES:
@@ -1111,6 +1157,7 @@
Mustpass(project = GL_CTS_NOCTX_PROJECT, version = "4.6.0.x", isCurrent=False, packages = [GLCTS_NOCTX_GL30_KHR_PKG, GLCTS_NOCTX_GL40_KHR_PKG, GLCTS_NOCTX_GL43_KHR_PKG, GLCTS_NOCTX_GL45_KHR_PKG]),
Mustpass(project = GL_CTS_KHR_MP_PROJECT, version = "4.6.1.x", isCurrent=True, packages = gl_packages),
Mustpass(project = GL_CTS_NOCTX_PROJECT, version = "4.6.1.x", isCurrent=True, packages = [GLCTS_NOCTX_GL30_KHR_PKG, GLCTS_NOCTX_GL40_KHR_PKG, GLCTS_NOCTX_GL43_KHR_PKG, GLCTS_NOCTX_GL45_KHR_PKG]),
+ Mustpass(project = GL_CTS_KHR_SINGLE_PROJECT, version = "4.6.1.x", isCurrent=True, packages = [GLCTS_SINGLE_GL45_KHR_PKG, GLCTS_SINGLE_GL46_KHR_PKG]),
]
return mustpass
diff --git a/external/openglcts/scripts/mustpass.py b/external/openglcts/scripts/mustpass.py
index 11cabf1..06a6abe 100644
--- a/external/openglcts/scripts/mustpass.py
+++ b/external/openglcts/scripts/mustpass.py
@@ -132,7 +132,7 @@
def readCaseList (filename):
cases = []
- with open(filename, 'rb') as f:
+ with open(filename, 'rt') as f:
for line in f:
if line[:6] == "TEST: ":
cases.append(line[6:].strip())
@@ -143,7 +143,7 @@
def readPatternList (filename):
ptrns = []
- with open(filename, 'rb') as f:
+ with open(filename, 'rt') as f:
for line in f:
line = line.strip()
if len(line) > 0 and line[0] != '#':
@@ -242,11 +242,12 @@
for package in mustpass.packages:
for config in package.configurations:
configElem = ElementTree.SubElement(packageElem, "Configuration",
- useForFirstEGLConfig = str(package.useforfirsteglconfig),
- name = config.name,
caseListFile = getCaseListFileName(package, config),
commandLine = getCommandLine(config),
- os = str(config.os))
+ name = config.name,
+ os = str(config.os),
+ useForFirstEGLConfig = str(package.useforfirsteglconfig)
+ )
return mustpassElem
@@ -408,7 +409,7 @@
specFilename = os.path.join(mustpass.project.path, mustpass.version, "mustpass.xml")
print(" Writing spec: " + specFilename)
- writeFile(specFilename, prettifyXML(specXML))
+ writeFile(specFilename, prettifyXML(specXML).decode())
print("Done!")
diff --git a/external/spirv-tools/CMakeLists.txt b/external/spirv-tools/CMakeLists.txt
index 69064a1..215c0d3 100644
--- a/external/spirv-tools/CMakeLists.txt
+++ b/external/spirv-tools/CMakeLists.txt
@@ -26,17 +26,15 @@
if (EXISTS ${SPIRV_TOOLS_ABS_PATH}/source/opcode.cpp AND
EXISTS ${SPIRV_HEADERS_ABS_PATH}/include/spirv/1.0/spirv.h)
- message(STATUS "spirv-tools found; building with DEQP_HAVE_SPIRV_TOOLS")
+ message(STATUS "spirv-tools found")
set(CMAKE_C_FLAGS ${DE_3RD_PARTY_C_FLAGS})
set(CMAKE_CXX_FLAGS ${DE_3RD_PARTY_CXX_FLAGS})
# SPIR-V tools requires SPIRV-Headers
set(SPIRV-Headers_SOURCE_DIR ${SPIRV_HEADERS_ABS_PATH})
- set(DEQP_HAVE_SPIRV_TOOLS ON PARENT_SCOPE)
set(SPIRV_SKIP_EXECUTABLES ON CACHE BOOL "" FORCE)
add_subdirectory(${SPIRV_TOOLS_ABS_PATH} spirv-tools)
else ()
- message(STATUS "spirv-tools not found; SPIR-V assembly not available")
- set(DEQP_HAVE_SPIRV_TOOLS OFF PARENT_SCOPE)
+ message(FATAL_ERROR "spirv-tools not found")
endif ()
diff --git a/external/vulkancts/README.md b/external/vulkancts/README.md
index 34d1f3e..c86c9e8 100644
--- a/external/vulkancts/README.md
+++ b/external/vulkancts/README.md
@@ -116,26 +116,6 @@
python <vulkancts>/external/vulkancts/scripts/build_mustpass.py
-Pre-compiling SPIR-V binaries
------------------------------
-
-For distribution, and platforms that don't support GLSL to SPIR-V compilation,
-SPIR-V binaries can be pre-built with following command:
-
- python external/vulkancts/scripts/build_spirv_binaries.py
-
-By default the script builds SPIR-V binaries for Vulkan 1.1.
-Binaries for other Vulkan versions can be requested by supplying
-an extra command line option:
-
- python external/vulkancts/scripts/build_spirv_binaries.py --target-vulkan-version <Vulkan version>
-
-Binaries will be written to `external/vulkancts/data/vulkan/prebuilt/`.
-
-Test modules (or in case of Android, the APK) must be re-built after building
-SPIR-V programs in order for the binaries to be available.
-
-
Running CTS
-----------
@@ -169,6 +149,17 @@
--deqp-shadercache=disable
+CTS execution may be split into N fractions ( for the purpose of running it in parallel ) using
+
+ --deqp-fraction=I,N
+
+where I denotes index of current CTS execution ( I=[0..N-1], N=[1..8] )
+
+When collecting results for a Conformance Submission Package the number of fractions must not exceed 8,
+and a list of mandatory information tests for each fraction must be supplied:
+
+ --deqp-fraction-mandatory-caselist-file=<vulkancts>external/vulkancts/mustpass/master/vk-fraction-mandatory-tests.txt
+
No other command line options are allowed.
### Win32
@@ -204,15 +195,20 @@
The conformance submission package must contain the following:
-1. Full test logs (`TestResults.qpa`) from CTS runs against all driver builds
+1. Full test logs (`TestResults.qpa`) from CTS runs against all driver builds and all fractions
2. Result of `git status` and `git log` from CTS source directory
3. Any patches used on top of release tag
4. Conformance statement
-Test logs (1) should be named `<submission pkg dir>/TestResults-<driver build type>.qpa`,
-for example `TestResults-armeabi-v7a.qpa`. On platforms where multiple different driver
+Test logs (1) should be named `<submission pkg dir>/TestResults-<driver build type>-<fraction id>-of-<total fractions>.qpa`,
+for example `TestResults-armeabi-v7a-1-of-8.qpa`. On platforms where multiple different driver
builds (for example 64-bit and 32-bit) are present, CTS logs must be provided
-for each driver build as part of the submission package.
+for each driver build as part of the submission package. If CTS run was split into multiple
+fractions then result files for all fractions must be provided, each file must
+contain results of the mandatory information tests.
+
+Fractions may be run on different physical devices but each device must represent
+the same Conformant Product.
Test logs generated on a system which exposes more than one physical device
in a device group can be used for products that expose one or more physical
@@ -252,7 +248,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.1.5.0
+ CONFORM_VERSION: vulkan-cts-1.1.6.0
PRODUCT: Product A
PRODUCT: Product B
...
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/barrier-in-loop-with-break.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/barrier-in-loop-with-break.amber
new file mode 100644
index 0000000..6373d4f
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/barrier-in-loop-with-break.amber
@@ -0,0 +1,199 @@
+# Copyright 2018 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 compute shader with a barrier in a loop with a break
+
+# Derived from the following GLSL.
+
+# Compute shader GLSL:
+# #version 310 es
+#
+# layout(set = 0, binding = 1) uniform buf1 {
+# vec2 injectionSwitch;
+# };
+# layout(std430, binding = 0) buffer doesNotMatter {
+# int global_seed;
+# int data[];
+# };
+# layout(local_size_x = 16, local_size_y = 1) in;
+# void main()
+# {
+# int lid = int(gl_LocalInvocationID.x);
+# int val = global_seed;
+# for(
+# int i = 0;
+# i < 2;
+# i ++
+# )
+# {
+# if(lid > 0)
+# {
+# val += data[lid - 1];
+# if(injectionSwitch.x > 100.0)
+# {
+# break;
+# }
+# }
+# barrier();
+# }
+# if (lid == 0) {
+# data[0] = 42;
+# }
+# }
+
+[compute shader spirv]
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 74
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %4 "main" %12
+ OpExecutionMode %4 LocalSize 16 1 1
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "lid"
+ OpName %12 "gl_LocalInvocationID"
+ OpName %18 "val"
+ OpName %20 "doesNotMatter"
+ OpMemberName %20 0 "global_seed"
+ OpMemberName %20 1 "data"
+ OpName %22 ""
+ OpName %27 "i"
+ OpName %50 "buf1"
+ OpMemberName %50 0 "injectionSwitch"
+ OpName %52 ""
+ OpDecorate %12 BuiltIn LocalInvocationId
+ OpDecorate %19 ArrayStride 4
+ OpMemberDecorate %20 0 Offset 0
+ OpMemberDecorate %20 1 Offset 4
+ OpDecorate %20 BufferBlock
+ OpDecorate %22 DescriptorSet 0
+ OpDecorate %22 Binding 0
+ OpMemberDecorate %50 0 Offset 0
+ OpDecorate %50 Block
+ OpDecorate %52 DescriptorSet 0
+ OpDecorate %52 Binding 1
+ OpDecorate %73 BuiltIn WorkgroupSize
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeInt 32 0
+ %10 = OpTypeVector %9 3
+ %11 = OpTypePointer Input %10
+ %12 = OpVariable %11 Input
+ %13 = OpConstant %9 0
+ %14 = OpTypePointer Input %9
+ %19 = OpTypeRuntimeArray %6
+ %20 = OpTypeStruct %6 %19
+ %21 = OpTypePointer Uniform %20
+ %22 = OpVariable %21 Uniform
+ %23 = OpConstant %6 0
+ %24 = OpTypePointer Uniform %6
+ %34 = OpConstant %6 2
+ %35 = OpTypeBool
+ %41 = OpConstant %6 1
+ %48 = OpTypeFloat 32
+ %49 = OpTypeVector %48 2
+ %50 = OpTypeStruct %49
+ %51 = OpTypePointer Uniform %50
+ %52 = OpVariable %51 Uniform
+ %53 = OpTypePointer Uniform %48
+ %56 = OpConstant %48 100
+ %61 = OpConstant %9 2
+ %62 = OpConstant %9 264
+ %69 = OpConstant %6 42
+ %71 = OpConstant %9 16
+ %72 = OpConstant %9 1
+ %73 = OpConstantComposite %10 %71 %72 %72
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %18 = OpVariable %7 Function
+ %27 = OpVariable %7 Function
+ %15 = OpAccessChain %14 %12 %13
+ %16 = OpLoad %9 %15
+ %17 = OpBitcast %6 %16
+ OpStore %8 %17
+ %25 = OpAccessChain %24 %22 %23
+ %26 = OpLoad %6 %25
+ OpStore %18 %26
+ OpStore %27 %23
+ OpBranch %28
+ %28 = OpLabel
+ OpLoopMerge %30 %31 None
+ OpBranch %32
+ %32 = OpLabel
+ %33 = OpLoad %6 %27
+ %36 = OpSLessThan %35 %33 %34
+ OpBranchConditional %36 %29 %30
+ %29 = OpLabel
+ %37 = OpLoad %6 %8
+ %38 = OpSGreaterThan %35 %37 %23
+ OpSelectionMerge %40 None
+ OpBranchConditional %38 %39 %40
+ %39 = OpLabel
+ %42 = OpLoad %6 %8
+ %43 = OpISub %6 %42 %41
+ %44 = OpAccessChain %24 %22 %41 %43
+ %45 = OpLoad %6 %44
+ %46 = OpLoad %6 %18
+ %47 = OpIAdd %6 %46 %45
+ OpStore %18 %47
+ %54 = OpAccessChain %53 %52 %23 %13
+ %55 = OpLoad %48 %54
+ %57 = OpFOrdGreaterThan %35 %55 %56
+ OpSelectionMerge %59 None
+ OpBranchConditional %57 %58 %59
+ %58 = OpLabel
+ OpBranch %30
+ %59 = OpLabel
+ OpBranch %40
+ %40 = OpLabel
+ OpControlBarrier %61 %61 %62
+ OpBranch %31
+ %31 = OpLabel
+ %63 = OpLoad %6 %27
+ %64 = OpIAdd %6 %63 %41
+ OpStore %27 %64
+ OpBranch %28
+ %30 = OpLabel
+ %65 = OpLoad %6 %8
+ %66 = OpIEqual %35 %65 %23
+ OpSelectionMerge %68 None
+ OpBranchConditional %66 %67 %68
+ %67 = OpLabel
+ %70 = OpAccessChain %24 %22 %41 %23
+ OpStore %70 %69
+ OpBranch %68
+ %68 = OpLabel
+ OpReturn
+ OpFunctionEnd
+
+
+[test]
+## Uniforms
+# injectionSwitch
+uniform ubo 0:1 vec2 0 0.0 1.0
+## SSBO
+ssbo 0 subdata int 0 12345
+ssbo 0 subdata int 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+
+compute 1 1 1
+probe ssbo int 0 4 == 42
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/color-write-in-loop.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/color-write-in-loop.amber
new file mode 100644
index 0000000..a274672
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/color-write-in-loop.amber
@@ -0,0 +1,185 @@
+# Copyright 2019 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 that writes to color in a loop
+
+# Checks that the top-left pixel is red.
+# Passes because main ends by writing red to _GLF_color.
+
+# Optimized using spirv-opt with the following arguments:
+# '-O'
+# spirv-opt commit hash: a2ef7be242bcacaa9127a3ce011602ec54b2c9ed
+
+# Derived from the following GLSL.
+
+# Fragment shader GLSL:
+# #version 310 es
+#
+# precision highp float;
+#
+# struct S {
+# int f0;
+# mat4x3 f1;
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void g()
+# {
+# S s = S(0, mat4x3(1.0));
+# for(
+# int l = 0;
+# l < (gl_FragCoord.x == 0.0 ? 1 : 2);
+# l ++
+# )
+# {
+# _GLF_color = vec4(1.0);
+# s.f0++;
+# }
+# if(s.f0 < 1000)
+# {
+# return;
+# }
+# }
+# void main()
+# {
+# g();
+# for(
+# int i = 0;
+# i < (gl_FragCoord.x == 0.0 ? 1 : 2);
+# i++
+# )
+# {
+# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
+# }
+# }
+
+[require]
+fbsize 256 256
+
+[vertex shader passthrough]
+
+[fragment shader spirv]
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 120
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %34 %47
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %12 "S"
+ OpMemberName %12 0 "f0"
+ OpMemberName %12 1 "f1"
+ OpName %34 "gl_FragCoord"
+ OpName %47 "_GLF_color"
+ OpMemberDecorate %12 0 RelaxedPrecision
+ OpDecorate %34 BuiltIn FragCoord
+ OpDecorate %47 Location 0
+ OpDecorate %76 RelaxedPrecision
+ OpDecorate %104 RelaxedPrecision
+ OpDecorate %105 RelaxedPrecision
+ OpDecorate %107 RelaxedPrecision
+ OpDecorate %109 RelaxedPrecision
+ OpDecorate %117 RelaxedPrecision
+ OpDecorate %119 RelaxedPrecision
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %8 = OpTypeInt 32 1
+ %9 = OpTypeFloat 32
+ %10 = OpTypeVector %9 3
+ %11 = OpTypeMatrix %10 4
+ %12 = OpTypeStruct %8 %11
+ %15 = OpConstant %8 0
+ %16 = OpConstant %9 1
+ %17 = OpConstant %9 0
+ %18 = OpConstantComposite %10 %16 %17 %17
+ %19 = OpConstantComposite %10 %17 %16 %17
+ %20 = OpConstantComposite %10 %17 %17 %16
+ %21 = OpConstantComposite %10 %17 %17 %17
+ %22 = OpConstantComposite %11 %18 %19 %20 %21
+ %23 = OpConstantComposite %12 %15 %22
+ %32 = OpTypeVector %9 4
+ %33 = OpTypePointer Input %32
+ %34 = OpVariable %33 Input
+ %35 = OpTypeInt 32 0
+ %36 = OpConstant %35 0
+ %37 = OpTypePointer Input %9
+ %40 = OpTypeBool
+ %42 = OpConstant %8 1
+ %43 = OpConstant %8 2
+ %46 = OpTypePointer Output %32
+ %47 = OpVariable %46 Output
+ %48 = OpConstantComposite %32 %16 %16 %16 %16
+ %56 = OpConstant %8 1000
+ %74 = OpConstantComposite %32 %16 %17 %17 %16
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ OpBranch %88
+ %88 = OpLabel
+ OpLoopMerge %89 %90 None
+ OpBranch %92
+ %92 = OpLabel
+ %118 = OpPhi %12 %23 %88 %115 %102
+ %117 = OpPhi %8 %15 %88 %107 %102
+ %97 = OpAccessChain %37 %34 %36
+ %98 = OpLoad %9 %97
+ %99 = OpFOrdEqual %40 %98 %17
+ %100 = OpSelect %8 %99 %42 %43
+ %101 = OpSLessThan %40 %117 %100
+ OpLoopMerge %93 %102 None
+ OpBranchConditional %101 %102 %93
+ %102 = OpLabel
+ OpStore %47 %48
+ %104 = OpCompositeExtract %8 %118 0
+ %105 = OpIAdd %8 %104 %42
+ %115 = OpCompositeInsert %12 %105 %118 0
+ %107 = OpIAdd %8 %117 %42
+ OpBranch %92
+ %93 = OpLabel
+ %109 = OpCompositeExtract %8 %118 0
+ %110 = OpSLessThan %40 %109 %56
+ OpSelectionMerge %111 None
+ OpBranchConditional %110 %112 %111
+ %112 = OpLabel
+ OpBranch %89
+ %111 = OpLabel
+ OpBranch %89
+ %90 = OpLabel
+ OpBranch %88
+ %89 = OpLabel
+ OpBranch %63
+ %63 = OpLabel
+ %119 = OpPhi %8 %15 %89 %76 %64
+ %73 = OpSLessThan %40 %119 %100
+ OpLoopMerge %65 %64 None
+ OpBranchConditional %73 %64 %65
+ %64 = OpLabel
+ OpStore %47 %74
+ %76 = OpIAdd %8 %119 %42
+ OpBranch %63
+ %65 = OpLabel
+ OpReturn
+ OpFunctionEnd
+
+
+[test]
+draw rect -1 -1 2 2
+probe rgba (0, 0) (1, 0, 0, 1)
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/continue-and-merge.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/continue-and-merge.amber
index 8e49dd8..4eae650 100644
--- a/external/vulkancts/data/vulkan/amber/graphicsfuzz/continue-and-merge.amber
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/continue-and-merge.amber
@@ -49,13 +49,15 @@
%42 = OpLabel
OpLoopMerge %47 %45 None
OpBranchConditional %false %49 %47
- %49 = OpLabel
- OpLoopMerge %45 %52 None
- OpBranchConditional %false %45 %45
- %52 = OpLabel
- OpBranch %49
- %45 = OpLabel
- OpBranch %42
+ %49 = OpLabel
+ OpLoopMerge %50 %52 None
+ OpBranchConditional %false %50 %50
+ %52 = OpLabel
+ OpBranch %49
+ %50 = OpLabel
+ OpBranch %45
+ %45 = OpLabel
+ OpBranch %42
%47 = OpLabel
OpStore %_GLF_color %red
OpReturn
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/control-flow-switch.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/control-flow-switch.amber
index efc9bb1..113ac09 100644
--- a/external/vulkancts/data/vulkan/amber/graphicsfuzz/control-flow-switch.amber
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/control-flow-switch.amber
@@ -86,7 +86,7 @@
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 7
-; Bound: 195
+; Bound: 196
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
@@ -157,10 +157,12 @@
OpBranchConditional %150 %151 %146
%151 = OpLabel
%154 = OpConvertFToS %int %124
- OpSelectionMerge %156 None
+ OpSelectionMerge %195 None
OpSwitch %154 %156 9 %157 42 %158
+ %195 = OpLabel
+ OpBranch %156
%156 = OpLabel
- %194 = OpPhi %bool %179 %151 %178 %166
+ %194 = OpPhi %bool %179 %151 %178 %166 %false %195
%169 = OpIAdd %int %177 %int_1
OpBranch %145
%157 = OpLabel
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/dead-barriers-in-loops.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/dead-barriers-in-loops.amber
new file mode 100644
index 0000000..f99c513
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/dead-barriers-in-loops.amber
@@ -0,0 +1,314 @@
+# Copyright 2019 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 compute shader with dead barriers
+
+# Checks that the output value is 42.
+# Passes because main always writes 42 to out_data.
+
+# Derived from the following GLSL.
+
+# Compute shader GLSL:
+# #version 310 es
+#
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# vec2 injectionSwitch;
+# };
+#
+# layout(std430, binding = 0) buffer theSSBO
+# {
+# int out_data;
+# };
+#
+# layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+# void main()
+# {
+# out_data = 42;
+# if (injectionSwitch.x > injectionSwitch.y) // false
+# {
+# barrier();
+# }
+#
+# if (injectionSwitch.x > injectionSwitch.y) // false
+# {
+# barrier();
+# }
+#
+# // single iteration loop
+# for (
+# int i = int(injectionSwitch.y); // 1
+# i > 0;
+# --i)
+# {
+# barrier();
+# }
+#
+# float GLF_live3s = 0.0;
+#
+# // single iteration loop
+# do
+# {
+# // single iteration loop
+# for (
+# int i = 1;
+# i < 2;
+# i++)
+# {
+# if (injectionSwitch.x > 1.0) // false
+# {
+# barrier();
+# }
+#
+# if (injectionSwitch.x > injectionSwitch.y) // false
+# {
+# barrier();
+# }
+#
+# // single iteration loop
+# for (
+# int z = int(injectionSwitch.y); // 1
+# z > 0;
+# --z)
+# {
+# GLF_live3s += 1.0;
+# }
+#
+# if (i >= 1) // true
+# {
+# if (injectionSwitch.x > 1.0) // false
+# {
+# barrier();
+# }
+# }
+# }
+# } while (injectionSwitch.x > injectionSwitch.y); // false
+#
+# }
+
+[compute shader spirv]
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 115
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %4 "main"
+ OpExecutionMode %4 LocalSize 1 1 1
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %7 "theSSBO"
+ OpMemberName %7 0 "out_data"
+ OpName %9 ""
+ OpName %16 "buf1"
+ OpMemberName %16 0 "injectionSwitch"
+ OpName %18 ""
+ OpName %41 "i"
+ OpName %56 "GLF_live3s"
+ OpName %62 "i"
+ OpName %84 "z"
+ OpMemberDecorate %7 0 Offset 0
+ OpDecorate %7 BufferBlock
+ OpDecorate %9 DescriptorSet 0
+ OpDecorate %9 Binding 0
+ OpMemberDecorate %16 0 Offset 0
+ OpDecorate %16 Block
+ OpDecorate %18 DescriptorSet 0
+ OpDecorate %18 Binding 1
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypeStruct %6
+ %8 = OpTypePointer Uniform %7
+ %9 = OpVariable %8 Uniform
+ %10 = OpConstant %6 0
+ %11 = OpConstant %6 42
+ %12 = OpTypePointer Uniform %6
+ %14 = OpTypeFloat 32
+ %15 = OpTypeVector %14 2
+ %16 = OpTypeStruct %15
+ %17 = OpTypePointer Uniform %16
+ %18 = OpVariable %17 Uniform
+ %19 = OpTypeInt 32 0
+ %20 = OpConstant %19 0
+ %21 = OpTypePointer Uniform %14
+ %24 = OpConstant %19 1
+ %27 = OpTypeBool
+ %31 = OpConstant %19 2
+ %32 = OpConstant %19 264
+ %40 = OpTypePointer Function %6
+ %53 = OpConstant %6 1
+ %55 = OpTypePointer Function %14
+ %57 = OpConstant %14 0
+ %69 = OpConstant %6 2
+ %73 = OpConstant %14 1
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %41 = OpVariable %40 Function
+ %56 = OpVariable %55 Function
+ %62 = OpVariable %40 Function
+ %84 = OpVariable %40 Function
+ %13 = OpAccessChain %12 %9 %10
+ OpStore %13 %11
+ %22 = OpAccessChain %21 %18 %10 %20
+ %23 = OpLoad %14 %22
+ %25 = OpAccessChain %21 %18 %10 %24
+ %26 = OpLoad %14 %25
+ %28 = OpFOrdGreaterThan %27 %23 %26
+ OpSelectionMerge %30 None
+ OpBranchConditional %28 %29 %30
+ %29 = OpLabel
+ OpControlBarrier %31 %31 %32
+ OpBranch %30
+ %30 = OpLabel
+ %33 = OpAccessChain %21 %18 %10 %20
+ %34 = OpLoad %14 %33
+ %35 = OpAccessChain %21 %18 %10 %24
+ %36 = OpLoad %14 %35
+ %37 = OpFOrdGreaterThan %27 %34 %36
+ OpSelectionMerge %39 None
+ OpBranchConditional %37 %38 %39
+ %38 = OpLabel
+ OpControlBarrier %31 %31 %32
+ OpBranch %39
+ %39 = OpLabel
+ %42 = OpAccessChain %21 %18 %10 %24
+ %43 = OpLoad %14 %42
+ %44 = OpConvertFToS %6 %43
+ OpStore %41 %44
+ OpBranch %45
+ %45 = OpLabel
+ OpLoopMerge %47 %48 None
+ OpBranch %49
+ %49 = OpLabel
+ %50 = OpLoad %6 %41
+ %51 = OpSGreaterThan %27 %50 %10
+ OpBranchConditional %51 %46 %47
+ %46 = OpLabel
+ OpControlBarrier %31 %31 %32
+ OpBranch %48
+ %48 = OpLabel
+ %52 = OpLoad %6 %41
+ %54 = OpISub %6 %52 %53
+ OpStore %41 %54
+ OpBranch %45
+ %47 = OpLabel
+ OpStore %56 %57
+ OpBranch %58
+ %58 = OpLabel
+ OpLoopMerge %60 %61 None
+ OpBranch %59
+ %59 = OpLabel
+ OpStore %62 %53
+ OpBranch %63
+ %63 = OpLabel
+ OpLoopMerge %65 %66 None
+ OpBranch %67
+ %67 = OpLabel
+ %68 = OpLoad %6 %62
+ %70 = OpSLessThan %27 %68 %69
+ OpBranchConditional %70 %64 %65
+ %64 = OpLabel
+ %71 = OpAccessChain %21 %18 %10 %20
+ %72 = OpLoad %14 %71
+ %74 = OpFOrdGreaterThan %27 %72 %73
+ OpSelectionMerge %76 None
+ OpBranchConditional %74 %75 %76
+ %75 = OpLabel
+ OpControlBarrier %31 %31 %32
+ OpBranch %76
+ %76 = OpLabel
+ %77 = OpAccessChain %21 %18 %10 %20
+ %78 = OpLoad %14 %77
+ %79 = OpAccessChain %21 %18 %10 %24
+ %80 = OpLoad %14 %79
+ %81 = OpFOrdGreaterThan %27 %78 %80
+ OpSelectionMerge %83 None
+ OpBranchConditional %81 %82 %83
+ %82 = OpLabel
+ OpControlBarrier %31 %31 %32
+ OpBranch %83
+ %83 = OpLabel
+ %85 = OpAccessChain %21 %18 %10 %24
+ %86 = OpLoad %14 %85
+ %87 = OpConvertFToS %6 %86
+ OpStore %84 %87
+ OpBranch %88
+ %88 = OpLabel
+ OpLoopMerge %90 %91 None
+ OpBranch %92
+ %92 = OpLabel
+ %93 = OpLoad %6 %84
+ %94 = OpSGreaterThan %27 %93 %10
+ OpBranchConditional %94 %89 %90
+ %89 = OpLabel
+ %95 = OpLoad %14 %56
+ %96 = OpFAdd %14 %95 %73
+ OpStore %56 %96
+ OpBranch %91
+ %91 = OpLabel
+ %97 = OpLoad %6 %84
+ %98 = OpISub %6 %97 %53
+ OpStore %84 %98
+ OpBranch %88
+ %90 = OpLabel
+ %99 = OpLoad %6 %62
+ %100 = OpSGreaterThanEqual %27 %99 %53
+ OpSelectionMerge %102 None
+ OpBranchConditional %100 %101 %102
+ %101 = OpLabel
+ %103 = OpAccessChain %21 %18 %10 %20
+ %104 = OpLoad %14 %103
+ %105 = OpFOrdGreaterThan %27 %104 %73
+ OpSelectionMerge %107 None
+ OpBranchConditional %105 %106 %107
+ %106 = OpLabel
+ OpControlBarrier %31 %31 %32
+ OpBranch %107
+ %107 = OpLabel
+ OpBranch %102
+ %102 = OpLabel
+ OpBranch %66
+ %66 = OpLabel
+ %108 = OpLoad %6 %62
+ %109 = OpIAdd %6 %108 %53
+ OpStore %62 %109
+ OpBranch %63
+ %65 = OpLabel
+ OpBranch %61
+ %61 = OpLabel
+ %110 = OpAccessChain %21 %18 %10 %20
+ %111 = OpLoad %14 %110
+ %112 = OpAccessChain %21 %18 %10 %24
+ %113 = OpLoad %14 %112
+ %114 = OpFOrdGreaterThan %27 %111 %113
+ OpBranchConditional %114 %58 %60
+ %60 = OpLabel
+ OpReturn
+ OpFunctionEnd
+
+
+[test]
+## Uniforms
+# injectionSwitch
+uniform ubo 0:1 vec2 0 0.0 1.0
+## SSBO
+ssbo 0 subdata int 0 0
+
+compute 1 1 1
+probe ssbo int 0 0 == 42
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/early-return-and-barrier.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/early-return-and-barrier.amber
new file mode 100644
index 0000000..1fc571c
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/early-return-and-barrier.amber
@@ -0,0 +1,148 @@
+# Copyright 2019 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 compute shader with an early return and a barrier
+
+# Checks that the output value is 42.
+# Passes because main always writes 42 to out_data.
+
+# Optimized using spirv-opt with the following arguments:
+# '-O'
+# spirv-opt commit hash: a2ef7be242bcacaa9127a3ce011602ec54b2c9ed
+
+# Derived from the following GLSL.
+
+# Compute shader GLSL:
+# #version 310 es
+#
+# precision highp float;
+#
+# layout(std430, binding = 0) buffer theSSBO {
+# int out_data;
+# };
+#
+# layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+# void f(vec2 v)
+# {
+# if(1.0 < v.x)
+# {
+# return;
+# }
+# barrier();
+# }
+# void main()
+# {
+# out_data = 42;
+# mat2 m;
+# for(int i = 1; i > 0; i --)
+# {
+# m = mat2(1.0);
+# }
+# f(vec2(1.0) * (m - mat2(1.0)));
+# }
+
+[compute shader spirv]
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 87
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %4 "main"
+ OpExecutionMode %4 LocalSize 1 1 1
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %27 "theSSBO"
+ OpMemberName %27 0 "out_data"
+ OpName %29 ""
+ OpMemberDecorate %27 0 Offset 0
+ OpDecorate %27 BufferBlock
+ OpDecorate %29 DescriptorSet 0
+ OpDecorate %29 Binding 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 2
+ %13 = OpConstant %6 1
+ %14 = OpTypeInt 32 0
+ %19 = OpTypeBool
+ %24 = OpConstant %14 2
+ %25 = OpConstant %14 264
+ %26 = OpTypeInt 32 1
+ %27 = OpTypeStruct %26
+ %28 = OpTypePointer Uniform %27
+ %29 = OpVariable %28 Uniform
+ %30 = OpConstant %26 0
+ %31 = OpConstant %26 42
+ %32 = OpTypePointer Uniform %26
+ %36 = OpConstant %26 1
+ %44 = OpTypeMatrix %7 2
+ %47 = OpConstant %6 0
+ %48 = OpConstantComposite %7 %13 %47
+ %49 = OpConstantComposite %7 %47 %13
+ %50 = OpConstantComposite %44 %48 %49
+ %53 = OpConstantComposite %7 %13 %13
+ %86 = OpUndef %44
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %33 = OpAccessChain %32 %29 %30
+ OpStore %33 %31
+ OpBranch %37
+ %37 = OpLabel
+ %85 = OpPhi %44 %86 %5 %50 %38
+ %84 = OpPhi %26 %36 %5 %52 %38
+ %43 = OpSGreaterThan %19 %84 %30
+ OpLoopMerge %39 %38 None
+ OpBranchConditional %43 %38 %39
+ %38 = OpLabel
+ %52 = OpISub %26 %84 %36
+ OpBranch %37
+ %39 = OpLabel
+ %55 = OpCompositeExtract %7 %85 0
+ %57 = OpFSub %7 %55 %48
+ %58 = OpCompositeExtract %7 %85 1
+ %60 = OpFSub %7 %58 %49
+ %61 = OpCompositeConstruct %44 %57 %60
+ %62 = OpVectorTimesMatrix %7 %53 %61
+ OpBranch %74
+ %74 = OpLabel
+ OpLoopMerge %75 %76 None
+ OpBranch %77
+ %77 = OpLabel
+ %79 = OpCompositeExtract %6 %62 0
+ %80 = OpFOrdLessThan %19 %13 %79
+ OpSelectionMerge %81 None
+ OpBranchConditional %80 %82 %81
+ %82 = OpLabel
+ OpBranch %75
+ %81 = OpLabel
+ OpControlBarrier %24 %24 %25
+ OpBranch %75
+ %76 = OpLabel
+ OpBranch %74
+ %75 = OpLabel
+ OpReturn
+ OpFunctionEnd
+
+
+[test]
+## SSBO
+ssbo 0 subdata int 0 0
+
+compute 1 1 1
+probe ssbo int 0 0 == 42
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/fragcoord-control-flow-2.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/fragcoord-control-flow-2.amber
index cfcb9fb..baa82c9 100644
--- a/external/vulkancts/data/vulkan/amber/graphicsfuzz/fragcoord-control-flow-2.amber
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/fragcoord-control-flow-2.amber
@@ -57,7 +57,7 @@
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 7
-; Bound: 96
+; Bound: 98
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
@@ -105,7 +105,7 @@
%32 = OpLoad %float %31
%33 = OpConvertFToS %int %32
%35 = OpSLessThan %bool %33 %int_10000000
- OpSelectionMerge %37 None
+ OpSelectionMerge %96 None
OpBranchConditional %35 %36 %38
%36 = OpLabel
OpBranch %37
@@ -124,12 +124,14 @@
%54 = OpLabel
%89 = OpPhi %int %int_0 %47 %62 %55
%60 = OpSLessThan %bool %89 %int_1
- OpLoopMerge %56 %55 None
- OpBranchConditional %60 %55 %56
+ OpLoopMerge %97 %55 None
+ OpBranchConditional %60 %55 %97
%55 = OpLabel
OpStore %_GLF_color %12
%62 = OpIAdd %int %89 %int_1
OpBranch %54
+ %97 = OpLabel
+ OpBranch %56
%56 = OpLabel
%64 = OpIAdd %int %83 %int_1
OpBranch %46
@@ -151,8 +153,10 @@
OpKill
%44 = OpLabel
OpBranch %37
+ %96 = OpLabel
+ OpBranch %37
%37 = OpLabel
- %95 = OpPhi %v4float %87 %36 %85 %44
+ %95 = OpPhi %v4float %87 %36 %85 %44 %88 %96
%81 = OpIAdd %int %82 %int_1
OpBranch %17
%19 = OpLabel
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/fragcoord-control-flow.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/fragcoord-control-flow.amber
index b7fb85c..4539440 100644
--- a/external/vulkancts/data/vulkan/amber/graphicsfuzz/fragcoord-control-flow.amber
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/fragcoord-control-flow.amber
@@ -85,7 +85,7 @@
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 7
-; Bound: 201
+; Bound: 206
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
@@ -146,10 +146,12 @@
OpBranch %19
%35 = OpLabel
%39 = OpFOrdLessThan %bool %32 %float_0
- OpSelectionMerge %41 None
+ OpSelectionMerge %201 None
OpBranchConditional %39 %40 %41
%40 = OpLabel
OpBranch %19
+ %201 = OpLabel
+ OpBranch %41
%41 = OpLabel
%44 = OpIAdd %int %167 %int_1
OpBranch %17
@@ -166,8 +168,10 @@
%49 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
%50 = OpLoad %float %49
%52 = OpFOrdLessThan %bool %50 %float_40
- OpSelectionMerge %53 None
+ OpSelectionMerge %202 None
OpBranchConditional %52 %53 %55
+ %202 = OpLabel
+ OpBranch %53
%53 = OpLabel
OpStore %_GLF_color %12
OpBranchConditional %false %45 %47
@@ -187,7 +191,7 @@
OpBranchConditional %70 %65 %66
%65 = OpLabel
%74 = OpFOrdLessThan %bool %50 %float_160
- OpSelectionMerge %76 None
+ OpSelectionMerge %203 None
OpBranchConditional %74 %75 %94
%75 = OpLabel
OpBranch %78
@@ -200,13 +204,15 @@
%86 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
%87 = OpLoad %float %86
%88 = OpFOrdLessThan %bool %87 %float_0
- OpSelectionMerge %90 None
+ OpSelectionMerge %204 None
OpBranchConditional %88 %89 %91
%89 = OpLabel
OpBranch %90
%91 = OpLabel
OpStore %_GLF_color %12
OpBranch %90
+ %204 = OpLabel
+ OpBranch %90
%90 = OpLabel
%93 = OpISub %int %185 %int_1
OpBranch %78
@@ -244,12 +250,14 @@
%126 = OpLabel
%182 = OpPhi %int %int_0 %119 %134 %127
%132 = OpSLessThan %bool %182 %int_1
- OpLoopMerge %128 %127 None
- OpBranchConditional %132 %127 %128
+ OpLoopMerge %205 %127 None
+ OpBranchConditional %132 %127 %205
%127 = OpLabel
OpStore %_GLF_color %12
%134 = OpIAdd %int %182 %int_1
OpBranch %126
+ %205 = OpLabel
+ OpBranch %128
%128 = OpLabel
%136 = OpIAdd %int %172 %int_1
OpBranch %118
@@ -274,8 +282,10 @@
%100 = OpLabel
%200 = OpPhi %v4float %176 %104 %174 %116
OpBranch %76
+ %203 = OpLabel
+ OpBranch %76
%76 = OpLabel
- %197 = OpPhi %v4float %176 %80 %200 %100
+ %197 = OpPhi %v4float %176 %80 %200 %100 %181 %203
%153 = OpISub %int %171 %int_1
OpBranch %64
%66 = OpLabel
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/if-and-switch.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/if-and-switch.amber
new file mode 100644
index 0000000..1b3157e
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/if-and-switch.amber
@@ -0,0 +1,155 @@
+# Copyright 2019 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 a switch and some data flow
+
+# Checks that the top-left pixel is red.
+# Passes because main always writes red to _GLF_color.
+
+# Optimized using spirv-opt with the following arguments:
+# '-Os'
+
+# Derived from the following GLSL.
+
+# Fragment shader GLSL:
+# #version 310 es
+#
+# precision highp float;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# vec2 injectionSwitch;
+# };
+#
+# void main()
+# {
+# float data[2];
+# data[0] = injectionSwitch.x;
+# data[1] = injectionSwitch.x;
+#
+# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
+#
+# if (data[1] > 1.0)
+# {
+# switch (int(injectionSwitch.x))
+# {
+# case 0:
+# float temp = 1.0;
+# case 1:
+# data[int(injectionSwitch.x)] = temp;
+# _GLF_color = vec4(0.0, 0.0, 0.0, 0.0);
+# default:
+# break;
+# }
+# }
+# }
+
+[require]
+fbsize 256 256
+
+[vertex shader passthrough]
+
+[fragment shader spirv]
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 58
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %30
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %11 "data"
+ OpName %15 "buf0"
+ OpMemberName %15 0 "injectionSwitch"
+ OpName %17 ""
+ OpName %30 "_GLF_color"
+ OpMemberDecorate %15 0 Offset 0
+ OpDecorate %15 Block
+ OpDecorate %17 DescriptorSet 0
+ OpDecorate %17 Binding 0
+ OpDecorate %30 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 = OpTypeVector %6 2
+ %15 = OpTypeStruct %14
+ %16 = OpTypePointer Uniform %15
+ %17 = OpVariable %16 Uniform
+ %18 = OpConstant %7 0
+ %19 = OpTypePointer Uniform %6
+ %22 = OpTypePointer Function %6
+ %24 = OpConstant %12 1
+ %28 = OpTypeVector %6 4
+ %29 = OpTypePointer Output %28
+ %30 = OpVariable %29 Output
+ %31 = OpConstant %6 1
+ %32 = OpConstant %6 0
+ %33 = OpConstantComposite %28 %31 %32 %32 %31
+ %36 = OpTypeBool
+ %53 = OpConstantComposite %28 %32 %32 %32 %32
+ %57 = OpUndef %6
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %11 = OpVariable %10 Function
+ %20 = OpAccessChain %19 %17 %13 %18
+ %21 = OpLoad %6 %20
+ %23 = OpAccessChain %22 %11 %13
+ OpStore %23 %21
+ %27 = OpAccessChain %22 %11 %24
+ OpStore %27 %21
+ OpStore %30 %33
+ %35 = OpLoad %6 %27
+ %37 = OpFOrdGreaterThan %36 %35 %31
+ OpSelectionMerge %39 None
+ OpBranchConditional %37 %38 %39
+ %38 = OpLabel
+ %42 = OpConvertFToS %12 %21
+ OpSelectionMerge %45 None
+ OpSwitch %42 %45 0 %43 1 %44
+ %45 = OpLabel
+ OpBranch %39
+ %43 = OpLabel
+ OpBranch %44
+ %44 = OpLabel
+ %56 = OpPhi %6 %57 %38 %31 %43
+ %52 = OpAccessChain %22 %11 %42
+ OpStore %52 %56
+ OpStore %30 %53
+ OpBranch %45
+ %39 = OpLabel
+ OpReturn
+ OpFunctionEnd
+
+
+[test]
+## Uniforms
+# injectionSwitch
+uniform ubo 0:0 vec2 0 0.0 1.0
+
+draw rect -1 -1 2 2
+probe rgba (0, 0) (1, 0, 0, 1)
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/mat-array-deep-control-flow.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/mat-array-deep-control-flow.amber
index a5d60e5..ef6c7d4 100644
--- a/external/vulkancts/data/vulkan/amber/graphicsfuzz/mat-array-deep-control-flow.amber
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/mat-array-deep-control-flow.amber
@@ -60,7 +60,7 @@
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 7
-; Bound: 104
+; Bound: 106
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
@@ -134,8 +134,8 @@
%60 = OpLabel
%99 = OpPhi %int %int_0 %52 %88 %86
%66 = OpSLessThan %bool %99 %int_4
- OpLoopMerge %62 %86 None
- OpBranchConditional %66 %61 %62
+ OpLoopMerge %104 %86 None
+ OpBranchConditional %66 %61 %104
%61 = OpLabel
%74 = OpSelect %int %66 %int_1 %int_0
%78 = OpAccessChain %_ptr_Function_float %m %74 %98 %uint_3
@@ -144,14 +144,18 @@
%81 = OpFDiv %v2float %70 %80
%83 = OpExtInst %float %1 Distance %70 %81
%84 = OpFOrdLessThan %bool %83 %float_1
- OpSelectionMerge %86 None
+ OpSelectionMerge %105 None
OpBranchConditional %84 %85 %86
%85 = OpLabel
OpStore %_GLF_color %36
OpBranch %86
+ %105 = OpLabel
+ OpBranch %86
%86 = OpLabel
%88 = OpIAdd %int %99 %int_1
OpBranch %60
+ %104 = OpLabel
+ OpBranch %62
%62 = OpLabel
%90 = OpIAdd %int %98 %int_1
OpBranch %51
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/mat-array-distance.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/mat-array-distance.amber
index 58e4159..a5658ef 100644
--- a/external/vulkancts/data/vulkan/amber/graphicsfuzz/mat-array-distance.amber
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/mat-array-distance.amber
@@ -55,7 +55,7 @@
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 7
-; Bound: 98
+; Bound: 100
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
@@ -134,14 +134,14 @@
%97 = OpPhi %int %int_0 %42 %66 %81
%96 = OpPhi %int %int_0 %42 %84 %81
%57 = OpSLessThan %bool %96 %int_4
- OpLoopMerge %53 %81 None
- OpBranchConditional %57 %52 %53
+ OpLoopMerge %98 %81 None
+ OpBranchConditional %57 %52 %98
%52 = OpLabel
%60 = OpSGreaterThanEqual %bool %97 %int_2
OpSelectionMerge %62 None
OpBranchConditional %60 %61 %62
%61 = OpLabel
- OpBranch %53
+ OpBranch %98
%62 = OpLabel
%66 = OpIAdd %int %97 %int_1
%73 = OpAccessChain %_ptr_Function_v4float %m %96 %95
@@ -149,14 +149,18 @@
%75 = OpVectorShuffle %v2float %74 %74 0 1
%78 = OpExtInst %float %1 Distance %76 %75
%79 = OpFOrdLessThan %bool %78 %float_1
- OpSelectionMerge %81 None
+ OpSelectionMerge %99 None
OpBranchConditional %79 %80 %81
%80 = OpLabel
OpStore %_GLF_color %82
OpBranch %81
+ %99 = OpLabel
+ OpBranch %81
%81 = OpLabel
%84 = OpIAdd %int %96 %int_1
OpBranch %51
+ %98 = OpLabel
+ OpBranch %53
%53 = OpLabel
%86 = OpIAdd %int %95 %int_1
OpBranch %41
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/matrices-and-return-in-loop.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/matrices-and-return-in-loop.amber
new file mode 100644
index 0000000..1c1fd09
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/matrices-and-return-in-loop.amber
@@ -0,0 +1,142 @@
+# Copyright 2019 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 matrices and a return in a loop
+
+# Checks that the top-left pixel is red.
+# Passes because main always writes red to _GLF_color.
+
+# Optimized using spirv-opt with the following arguments:
+# '-O'
+# spirv-opt commit hash: a2ef7be242bcacaa9127a3ce011602ec54b2c9ed
+
+# Derived from the following GLSL.
+
+# Fragment shader GLSL:
+# #version 310 es
+#
+# precision highp float;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# vec3 f(mat2 m)
+# {
+# do
+# {
+# return vec3(1.0);
+# }
+# while(false);
+# }
+#
+# void main()
+# {
+# mat2 m = mat2(0.0);
+# if(gl_FragCoord.x >= 0.0)
+# {
+# m = mat2(1.0);
+# }
+# f(m * m);
+# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
+# }
+
+[require]
+fbsize 256 256
+
+[vertex shader passthrough]
+
+[fragment shader spirv]
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 52
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %31 %49
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %13 "f(mf22;"
+ OpName %12 "m"
+ OpName %31 "gl_FragCoord"
+ OpName %46 "param"
+ OpName %49 "_GLF_color"
+ OpDecorate %31 BuiltIn FragCoord
+ OpDecorate %49 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 2
+ %8 = OpTypeMatrix %7 2
+ %9 = OpTypePointer Function %8
+ %10 = OpTypeVector %6 3
+ %11 = OpTypeFunction %10 %9
+ %19 = OpConstant %6 1
+ %20 = OpConstantComposite %10 %19 %19 %19
+ %22 = OpTypeBool
+ %26 = OpConstant %6 0
+ %27 = OpConstantComposite %7 %26 %26
+ %28 = OpConstantComposite %8 %27 %27
+ %29 = OpTypeVector %6 4
+ %30 = OpTypePointer Input %29
+ %31 = OpVariable %30 Input
+ %32 = OpTypeInt 32 0
+ %33 = OpConstant %32 0
+ %34 = OpTypePointer Input %6
+ %40 = OpConstantComposite %7 %19 %26
+ %41 = OpConstantComposite %7 %26 %19
+ %42 = OpConstantComposite %8 %40 %41
+ %48 = OpTypePointer Output %29
+ %49 = OpVariable %48 Output
+ %50 = OpConstantComposite %29 %19 %26 %26 %19
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %46 = OpVariable %9 Function
+ %35 = OpAccessChain %34 %31 %33
+ %36 = OpLoad %6 %35
+ %37 = OpFOrdGreaterThanEqual %22 %36 %26
+ OpSelectionMerge %39 None
+ OpBranchConditional %37 %38 %39
+ %38 = OpLabel
+ OpBranch %39
+ %39 = OpLabel
+ %51 = OpPhi %8 %28 %5 %42 %38
+ %45 = OpMatrixTimesMatrix %8 %51 %51
+ OpStore %46 %45
+ %47 = OpFunctionCall %10 %13 %46
+ OpStore %49 %50
+ OpReturn
+ OpFunctionEnd
+ %13 = OpFunction %10 None %11
+ %12 = OpFunctionParameter %9
+ %14 = OpLabel
+ OpBranch %15
+ %15 = OpLabel
+ OpLoopMerge %17 %18 None
+ OpBranch %16
+ %16 = OpLabel
+ OpReturnValue %20
+ %18 = OpLabel
+ OpBranch %15
+ %17 = OpLabel
+ OpUnreachable
+ OpFunctionEnd
+
+
+[test]
+draw rect -1 -1 2 2
+probe rgba (0, 0) (1, 0, 0, 1)
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/return-in-loop-in-function.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/return-in-loop-in-function.amber
new file mode 100644
index 0000000..dfd6569
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/return-in-loop-in-function.amber
@@ -0,0 +1,175 @@
+# Copyright 2019 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 early return from loop in function
+
+# The test passes because the fragment shader writes a red pixel, and then
+# terminates without further output manipulation (the other write of red
+# is not dynamically reachable)
+
+# Optimized using spirv-opt with the following arguments:
+# '--merge-blocks'
+# spirv-opt commit hash: 4a00a80c40484a6f6f72f48c9d34943cf8f180d4
+
+# Derived from the following GLSL.
+
+# Fragment shader GLSL:
+# #version 310 es
+#
+# precision highp float;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# float f()
+# {
+# for(
+# int i = 1;
+# i < 10;
+# i ++
+# )
+# {
+# if(float(i) >= 1.0)
+# {
+# return 1.0;
+# }
+# }
+# return 1.0;
+# }
+# void main()
+# {
+# vec4 c = vec4(1.0, 0.0, 0.0, 1.0);
+# for(
+# int i = 0;
+# i < 1;
+# i ++
+# )
+# {
+# c.x = f();
+# }
+# _GLF_color = c;
+# }
+
+[require]
+fbsize 256 256
+
+[vertex shader passthrough]
+
+[fragment shader spirv]
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 59
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %56
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "f("
+ OpName %12 "i"
+ OpName %36 "c"
+ OpName %39 "i"
+ OpName %56 "_GLF_color"
+ OpDecorate %12 RelaxedPrecision
+ OpDecorate %19 RelaxedPrecision
+ OpDecorate %23 RelaxedPrecision
+ OpDecorate %30 RelaxedPrecision
+ OpDecorate %31 RelaxedPrecision
+ OpDecorate %39 RelaxedPrecision
+ OpDecorate %46 RelaxedPrecision
+ OpDecorate %53 RelaxedPrecision
+ OpDecorate %54 RelaxedPrecision
+ OpDecorate %56 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeFunction %6
+ %10 = OpTypeInt 32 1
+ %11 = OpTypePointer Function %10
+ %13 = OpConstant %10 1
+ %20 = OpConstant %10 10
+ %21 = OpTypeBool
+ %25 = OpConstant %6 1
+ %34 = OpTypeVector %6 4
+ %35 = OpTypePointer Function %34
+ %37 = OpConstant %6 0
+ %38 = OpConstantComposite %34 %25 %37 %37 %25
+ %40 = OpConstant %10 0
+ %49 = OpTypeInt 32 0
+ %50 = OpConstant %49 0
+ %51 = OpTypePointer Function %6
+ %55 = OpTypePointer Output %34
+ %56 = OpVariable %55 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %36 = OpVariable %35 Function
+ %39 = OpVariable %11 Function
+ OpStore %36 %38
+ OpStore %39 %40
+ OpBranch %41
+ %41 = OpLabel
+ %46 = OpLoad %10 %39
+ %47 = OpSLessThan %21 %46 %13
+ OpLoopMerge %43 %42 None
+ OpBranchConditional %47 %42 %43
+ %42 = OpLabel
+ %48 = OpFunctionCall %6 %8
+ %52 = OpAccessChain %51 %36 %50
+ OpStore %52 %48
+ %53 = OpLoad %10 %39
+ %54 = OpIAdd %10 %53 %13
+ OpStore %39 %54
+ OpBranch %41
+ %43 = OpLabel
+ %57 = OpLoad %34 %36
+ OpStore %56 %57
+ OpReturn
+ OpFunctionEnd
+ %8 = OpFunction %6 None %7
+ %9 = OpLabel
+ %12 = OpVariable %11 Function
+ OpStore %12 %13
+ OpBranch %14
+ %14 = OpLabel
+ %19 = OpLoad %10 %12
+ %22 = OpSLessThan %21 %19 %20
+ OpLoopMerge %16 %28 None
+ OpBranchConditional %22 %15 %16
+ %15 = OpLabel
+ %23 = OpLoad %10 %12
+ %24 = OpConvertSToF %6 %23
+ %26 = OpFOrdGreaterThanEqual %21 %24 %25
+ OpSelectionMerge %58 None
+ OpBranchConditional %26 %27 %28
+ %27 = OpLabel
+ OpReturnValue %25
+ %58 = OpLabel
+ OpBranch %28
+ %28 = OpLabel
+ %30 = OpLoad %10 %12
+ %31 = OpIAdd %10 %30 %13
+ OpStore %12 %31
+ OpBranch %14
+ %16 = OpLabel
+ OpReturnValue %25
+ OpFunctionEnd
+
+
+[test]
+draw rect -1 -1 2 2
+probe rgba (0, 0) (1, 0, 0, 1)
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/unreachable-loops-in-switch.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/unreachable-loops-in-switch.amber
new file mode 100644
index 0000000..2becdff
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/unreachable-loops-in-switch.amber
@@ -0,0 +1,183 @@
+# Copyright 2019 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 unreachable loops in a switch
+
+# The test passes because the fragment shader writes a red pixel, and then
+# terminates without further output manipulation
+
+# Derived from the following GLSL.
+
+# Fragment shader GLSL:
+# #version 310 es
+#
+# precision highp float;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
+# float data[1];
+# for(int i = 0; i < 1; i++) {
+# if(data[i] < data[0]) {
+# if(false) {
+# if(float(i) >= 1.0) { }
+# }
+# switch(0) {
+# case 1:
+# for(; 1 > 0;) { }
+# for(;;) { }
+# case 0:
+# data[0] = 2.0;
+# break;
+# }
+# }
+# }
+# }
+
+[require]
+fbsize 256 256
+
+[vertex shader passthrough]
+
+[fragment shader spirv]
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 67
+; 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 %15 "i"
+ OpName %30 "data"
+ OpDecorate %9 Location 0
+ OpDecorate %15 RelaxedPrecision
+ OpDecorate %22 RelaxedPrecision
+ OpDecorate %31 RelaxedPrecision
+ OpDecorate %43 RelaxedPrecision
+ OpDecorate %65 RelaxedPrecision
+ OpDecorate %66 RelaxedPrecision
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 4
+ %8 = OpTypePointer Output %7
+ %9 = OpVariable %8 Output
+ %10 = OpConstant %6 1
+ %11 = OpConstant %6 0
+ %12 = OpConstantComposite %7 %10 %11 %11 %10
+ %13 = OpTypeInt 32 1
+ %14 = OpTypePointer Function %13
+ %16 = OpConstant %13 0
+ %23 = OpConstant %13 1
+ %24 = OpTypeBool
+ %26 = OpTypeInt 32 0
+ %27 = OpConstant %26 1
+ %28 = OpTypeArray %6 %27
+ %29 = OpTypePointer Function %28
+ %32 = OpTypePointer Function %6
+ %40 = OpConstantFalse %24
+ %56 = OpConstantTrue %24
+ %61 = OpConstant %6 2
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %15 = OpVariable %14 Function
+ %30 = OpVariable %29 Function
+ OpStore %9 %12
+ OpStore %15 %16
+ OpBranch %17
+ %17 = OpLabel
+ OpLoopMerge %19 %20 None
+ OpBranch %21
+ %21 = OpLabel
+ %22 = OpLoad %13 %15
+ %25 = OpSLessThan %24 %22 %23
+ OpBranchConditional %25 %18 %19
+ %18 = OpLabel
+ %31 = OpLoad %13 %15
+ %33 = OpAccessChain %32 %30 %31
+ %34 = OpLoad %6 %33
+ %35 = OpAccessChain %32 %30 %16
+ %36 = OpLoad %6 %35
+ %37 = OpFOrdLessThan %24 %34 %36
+ OpSelectionMerge %39 None
+ OpBranchConditional %37 %38 %39
+ %38 = OpLabel
+ OpSelectionMerge %42 None
+ OpBranchConditional %40 %41 %42
+ %41 = OpLabel
+ %43 = OpLoad %13 %15
+ %44 = OpConvertSToF %6 %43
+ %45 = OpFOrdGreaterThanEqual %24 %44 %10
+ OpSelectionMerge %47 None
+ OpBranchConditional %45 %46 %47
+ %46 = OpLabel
+ OpBranch %47
+ %47 = OpLabel
+ OpBranch %42
+ %42 = OpLabel
+ OpSelectionMerge %50 None
+ OpSwitch %16 %50 1 %48 0 %49
+ %48 = OpLabel
+ OpBranch %51
+ %51 = OpLabel
+ OpLoopMerge %53 %54 None
+ OpBranch %55
+ %55 = OpLabel
+ OpBranchConditional %56 %52 %53
+ %52 = OpLabel
+ OpBranch %54
+ %54 = OpLabel
+ OpBranch %51
+ %53 = OpLabel
+ OpBranch %57
+ %57 = OpLabel
+ OpLoopMerge %59 %60 None
+ OpBranch %58
+ %58 = OpLabel
+ OpBranch %60
+ %60 = OpLabel
+ OpBranch %57
+ %59 = OpLabel
+ OpBranch %49
+ %49 = OpLabel
+ %62 = OpAccessChain %32 %30 %16
+ OpStore %62 %61
+ OpBranch %50
+ %50 = OpLabel
+ OpBranch %39
+ %39 = OpLabel
+ OpBranch %20
+ %20 = OpLabel
+ %65 = OpLoad %13 %15
+ %66 = OpIAdd %13 %65 %23
+ OpStore %15 %66
+ OpBranch %17
+ %19 = OpLabel
+ OpReturn
+ OpFunctionEnd
+
+
+[test]
+draw rect -1 -1 2 2
+probe rgba (0, 0) (1, 0, 0, 1)
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/comp_pc_entry_point.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/comp_pc_entry_point.amber
new file mode 100644
index 0000000..302db96
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/comp_pc_entry_point.amber
@@ -0,0 +1,79 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; Compute shader with push constnat.
+;
+; #version 430
+;
+; layout(push_constant) uniform pushConstants {
+; int in_val;
+; } u_pushConstants;
+;
+; layout(std430, binding = 0) buffer output_buffer
+; {
+; int out_SSBO[];
+; };
+;
+; void main() {
+; out_SSBO[gl_GlobalInvocationID.z] = u_pushConstants.in_val;
+; }
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main" %_ %gl_GlobalInvocationID %u_pushConstants
+ OpExecutionMode %main LocalSize 1 1 1
+ OpSource GLSL 430
+ OpName %main "main"
+ OpName %output_buffer "output_buffer"
+ OpMemberName %output_buffer 0 "out_SSBO"
+ OpName %_ ""
+ OpName %gl_GlobalInvocationID "gl_GlobalInvocationID"
+ OpName %pushConstants "pushConstants"
+ OpMemberName %pushConstants 0 "in_val"
+ OpName %u_pushConstants "u_pushConstants"
+ OpDecorate %_runtimearr_int ArrayStride 4
+ OpMemberDecorate %output_buffer 0 Offset 0
+ OpDecorate %output_buffer Block
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
+ OpMemberDecorate %pushConstants 0 Offset 0
+ OpDecorate %pushConstants Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+%_runtimearr_int = OpTypeRuntimeArray %int
+%output_buffer = OpTypeStruct %_runtimearr_int
+%_ptr_StorageBuffer_output_buffer = OpTypePointer StorageBuffer %output_buffer
+ %_ = OpVariable %_ptr_StorageBuffer_output_buffer StorageBuffer
+ %int_0 = OpConstant %int 0
+ %uint = OpTypeInt 32 0
+ %v3uint = OpTypeVector %uint 3
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
+ %uint_2 = OpConstant %uint 2
+%_ptr_Input_uint = OpTypePointer Input %uint
+%pushConstants = OpTypeStruct %int
+%_ptr_PushConstant_pushConstants = OpTypePointer PushConstant %pushConstants
+%u_pushConstants = OpVariable %_ptr_PushConstant_pushConstants PushConstant
+%_ptr_PushConstant_int = OpTypePointer PushConstant %int
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %18 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_2
+ %19 = OpLoad %uint %18
+ %24 = OpAccessChain %_ptr_PushConstant_int %u_pushConstants %int_0
+ %25 = OpLoad %int %24
+ %27 = OpAccessChain %_ptr_StorageBuffer_int %_ %int_0 %19
+ OpStore %27 %25
+ OpReturn
+ OpFunctionEnd
+[test]
+uniform int 0 1
+ssbo 0:0 subdata int 0 -1 -1
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo int 0:0 0 == 1 -1
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/comp_ssbo_entry_point.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/comp_ssbo_entry_point.amber
new file mode 100644
index 0000000..225a469
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/comp_ssbo_entry_point.amber
@@ -0,0 +1,84 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; Compute shader with SSBO input and output.
+; #version 430
+;
+; layout(std430, binding = 0) buffer input_buffer
+; {
+; int data_SSBO[];
+; };
+;
+; layout(std430, binding = 1) buffer output_buffer
+; {
+; int out_SSBO[];
+; };
+;
+; void main() {
+; out_SSBO[gl_GlobalInvocationID.z] = data_SSBO[gl_GlobalInvocationID.z];
+; }
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main" %_ %gl_GlobalInvocationID %__0
+ OpExecutionMode %main LocalSize 1 1 1
+ OpSource GLSL 430
+ OpName %main "main"
+ OpName %output_buffer "output_buffer"
+ OpMemberName %output_buffer 0 "out_SSBO"
+ OpName %_ ""
+ OpName %gl_GlobalInvocationID "gl_GlobalInvocationID"
+ OpName %input_buffer "input_buffer"
+ OpMemberName %input_buffer 0 "data_SSBO"
+ OpName %__0 ""
+ OpDecorate %_runtimearr_int ArrayStride 4
+ OpMemberDecorate %output_buffer 0 Offset 0
+ OpDecorate %output_buffer Block
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 1
+ OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
+ OpDecorate %_runtimearr_int_0 ArrayStride 4
+ OpMemberDecorate %input_buffer 0 Offset 0
+ OpDecorate %input_buffer Block
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 0
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+%_runtimearr_int = OpTypeRuntimeArray %int
+%output_buffer = OpTypeStruct %_runtimearr_int
+%_ptr_StorageBuffer_output_buffer = OpTypePointer StorageBuffer %output_buffer
+ %_ = OpVariable %_ptr_StorageBuffer_output_buffer StorageBuffer
+ %int_0 = OpConstant %int 0
+ %uint = OpTypeInt 32 0
+ %v3uint = OpTypeVector %uint 3
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
+ %uint_2 = OpConstant %uint 2
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_runtimearr_int_0 = OpTypeRuntimeArray %int
+%input_buffer = OpTypeStruct %_runtimearr_int_0
+%_ptr_StorageBuffer_input_buffer = OpTypePointer StorageBuffer %input_buffer
+ %__0 = OpVariable %_ptr_StorageBuffer_input_buffer StorageBuffer
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %18 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_2
+ %19 = OpLoad %uint %18
+ %24 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_2
+ %25 = OpLoad %uint %24
+ %27 = OpAccessChain %_ptr_StorageBuffer_int %__0 %int_0 %25
+ %28 = OpLoad %int %27
+ %29 = OpAccessChain %_ptr_StorageBuffer_int %_ %int_0 %19
+ OpStore %29 %28
+ OpReturn
+ OpFunctionEnd
+[test]
+ssbo 0:0 subdata int 0 0 1
+ssbo 0:1 subdata int 0 -1 -1
+
+compute entrypoint main
+compute 1 1 2
+
+probe ssbo int 0:1 0 == 0 1
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/comp_ubo_entry_point.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/comp_ubo_entry_point.amber
new file mode 100644
index 0000000..11da462
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/comp_ubo_entry_point.amber
@@ -0,0 +1,87 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; Compute shader with a UBO.
+;
+; #version 430
+;
+; layout(binding = 0) uniform input_buffer
+; {
+; int in_data[2];
+; };
+;
+; layout(std430, binding = 1) buffer output_buffer
+; {
+; int out_SSBO[];
+; };
+;
+; void main() {
+; out_SSBO[gl_GlobalInvocationID.z] = in_data[gl_GlobalInvocationID.z];
+; }
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main" %_ %gl_GlobalInvocationID %__0
+ OpExecutionMode %main LocalSize 1 1 1
+ OpSource GLSL 430
+ OpName %main "main"
+ OpName %output_buffer "output_buffer"
+ OpMemberName %output_buffer 0 "out_SSBO"
+ OpName %_ ""
+ OpName %gl_GlobalInvocationID "gl_GlobalInvocationID"
+ OpName %input_buffer "input_buffer"
+ OpMemberName %input_buffer 0 "in_data"
+ OpName %__0 ""
+ OpDecorate %_runtimearr_int ArrayStride 4
+ OpMemberDecorate %output_buffer 0 Offset 0
+ OpDecorate %output_buffer Block
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 1
+ OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
+ OpDecorate %_arr_int_uint_2 ArrayStride 16
+ OpMemberDecorate %input_buffer 0 Offset 0
+ OpDecorate %input_buffer Block
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 0
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+%_runtimearr_int = OpTypeRuntimeArray %int
+%output_buffer = OpTypeStruct %_runtimearr_int
+%_ptr_StorageBuffer_output_buffer = OpTypePointer StorageBuffer %output_buffer
+ %_ = OpVariable %_ptr_StorageBuffer_output_buffer StorageBuffer
+ %int_0 = OpConstant %int 0
+ %uint = OpTypeInt 32 0
+ %v3uint = OpTypeVector %uint 3
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
+ %uint_2 = OpConstant %uint 2
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%input_buffer = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_input_buffer = OpTypePointer Uniform %input_buffer
+ %__0 = OpVariable %_ptr_Uniform_input_buffer Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %18 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_2
+ %19 = OpLoad %uint %18
+ %24 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_2
+ %25 = OpLoad %uint %24
+ %27 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %25
+ %28 = OpLoad %int %27
+ %30 = OpAccessChain %_ptr_StorageBuffer_int %_ %int_0 %19
+ OpStore %30 %28
+ OpReturn
+ OpFunctionEnd
+[test]
+uniform ubo 0:0 int 0 0
+uniform ubo 0:0 int 16 1
+ssbo 0:1 subdata int 0 -1 -1
+
+compute entrypoint main
+compute 1 1 2
+
+probe ssbo int 0:1 0 == 0 1
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
new file mode 100644
index 0000000..fdc2f0a
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/comp_workgroup_entry_point.amber
@@ -0,0 +1,92 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; #version 430
+;
+; layout(local_size_x = 2) in;
+; layout(local_size_y = 2) in;
+; layout(local_size_z = 2) in;
+;
+; layout(std430, binding = 1) buffer output_buffer
+; {
+; uint x[8];
+; };
+;
+; shared uint wg_data[8];
+;
+; void main() {
+; atomicExchange(wg_data[gl_LocalInvocationIndex], gl_LocalInvocationIndex);
+; uint val = atomicExchange(wg_data[(gl_LocalInvocationIndex+1)%8], 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
+ OpSource GLSL 430
+ OpName %main "main"
+ OpName %wg_data "wg_data"
+ OpName %gl_LocalInvocationIndex "gl_LocalInvocationIndex"
+ OpName %val "val"
+ OpName %output_buffer "output_buffer"
+ OpMemberName %output_buffer 0 "x"
+ OpName %_ ""
+ OpDecorate %gl_LocalInvocationIndex BuiltIn LocalInvocationIndex
+ OpDecorate %_arr_uint_uint_8_0 ArrayStride 4
+ OpMemberDecorate %output_buffer 0 Offset 0
+ OpDecorate %output_buffer Block
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 1
+ OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
+ %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
+%_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
+%_ptr_StorageBuffer_output_buffer = OpTypePointer StorageBuffer %output_buffer
+ %_ = OpVariable %_ptr_StorageBuffer_output_buffer StorageBuffer
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+%_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
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %val = OpVariable %_ptr_Function_uint Function
+ %13 = OpLoad %uint %gl_LocalInvocationIndex
+ %15 = OpAccessChain %_ptr_Workgroup_uint %wg_data %13
+ %16 = OpLoad %uint %gl_LocalInvocationIndex
+ %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
+ %25 = OpAccessChain %_ptr_Workgroup_uint %wg_data %24
+ %26 = OpAtomicExchange %uint %25 %uint_1 %uint_0 %uint_0
+ OpStore %val %26
+ %33 = OpLoad %uint %gl_LocalInvocationIndex
+ %34 = OpLoad %uint %val
+ %36 = OpAccessChain %_ptr_StorageBuffer_uint %_ %int_0 %33
+ OpStore %36 %34
+ OpReturn
+ OpFunctionEnd
+
+[test]
+ssbo 0:1 subdata int 0 -1 -1 -1 -1 -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
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/frag_pc_entry_point.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/frag_pc_entry_point.amber
new file mode 100644
index 0000000..cd44fbf
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/frag_pc_entry_point.amber
@@ -0,0 +1,57 @@
+[require]
+VK_KHR_spirv_1_4
+
+[vertex shader passthrough]
+
+[fragment shader spirv]
+; A fragment shader with a push constant.
+;
+; #version 430
+;
+; layout(push_constant) uniform pushConstants {
+; vec4 in_val;
+; } u_pushConstants;
+;
+; layout(location = 0) out vec4 outColor;
+;
+; void main() {
+; outColor = u_pushConstants.in_val;
+; }
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %outColor %u_pushConstants
+ OpExecutionMode %main OriginUpperLeft
+ OpSource GLSL 430
+ OpName %main "main"
+ OpName %outColor "outColor"
+ OpName %pushConstants "pushConstants"
+ OpMemberName %pushConstants 0 "in_val"
+ OpName %u_pushConstants "u_pushConstants"
+ OpDecorate %outColor Location 0
+ OpMemberDecorate %pushConstants 0 Offset 0
+ OpDecorate %pushConstants Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %outColor = OpVariable %_ptr_Output_v4float Output
+%pushConstants = OpTypeStruct %v4float
+%_ptr_PushConstant_pushConstants = OpTypePointer PushConstant %pushConstants
+%u_pushConstants = OpVariable %_ptr_PushConstant_pushConstants PushConstant
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+%_ptr_PushConstant_v4float = OpTypePointer PushConstant %v4float
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %16 = OpAccessChain %_ptr_PushConstant_v4float %u_pushConstants %int_0
+ %17 = OpLoad %v4float %16
+ OpStore %outColor %17
+ OpReturn
+ OpFunctionEnd
+[test]
+uniform float 0 0.2 0.3 0.4 0.1
+draw rect -1 -1 2 2
+
+probe rect rgba (0, 0, 250, 250) (0.2 0.3 0.4 0.1)
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/frag_ssbo_entry_point.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/frag_ssbo_entry_point.amber
new file mode 100644
index 0000000..68b1742
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/frag_ssbo_entry_point.amber
@@ -0,0 +1,62 @@
+[require]
+VK_KHR_spirv_1_4
+
+[vertex shader passthrough]
+
+[fragment shader spirv]
+; A fragment shader with a ubo.
+;
+; #version 430
+;
+; layout(std430, binding = 0) buffer input_buffer
+; {
+; vec4 data_SSBO[];
+; };
+;
+; layout(location = 0) out vec4 outColor;
+;
+; void main() {
+; outColor = data_SSBO[0];
+; }
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %_ %outColor
+ OpExecutionMode %main OriginUpperLeft
+ OpSource GLSL 430
+ OpName %main "main"
+ OpName %outColor "outColor"
+ OpName %input_buffer "input_buffer"
+ OpMemberName %input_buffer 0 "data_SSBO"
+ OpName %_ ""
+ OpDecorate %outColor Location 0
+ OpDecorate %_runtimearr_v4float ArrayStride 16
+ OpMemberDecorate %input_buffer 0 Offset 0
+ OpDecorate %input_buffer Block
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %outColor = OpVariable %_ptr_Output_v4float Output
+%_runtimearr_v4float = OpTypeRuntimeArray %v4float
+%input_buffer = OpTypeStruct %_runtimearr_v4float
+%_ptr_StorageBuffer_input_buffer = OpTypePointer StorageBuffer %input_buffer
+ %_ = OpVariable %_ptr_StorageBuffer_input_buffer StorageBuffer
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+%_ptr_StorageBuffer_v4float = OpTypePointer StorageBuffer %v4float
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %17 = OpAccessChain %_ptr_StorageBuffer_v4float %_ %int_0 %int_0
+ %18 = OpLoad %v4float %17
+ OpStore %outColor %18
+ OpReturn
+ OpFunctionEnd
+[test]
+ssbo 0:0 subdata float 0 0.2 0.3 0.4 0.1
+draw rect -1 -1 2 2
+
+probe rect rgba (0, 0, 250, 250) (0.2 0.3 0.4 0.1)
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/frag_ubo_entry_point.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/frag_ubo_entry_point.amber
new file mode 100644
index 0000000..bf440c9
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/frag_ubo_entry_point.amber
@@ -0,0 +1,60 @@
+[require]
+VK_KHR_spirv_1_4
+
+[vertex shader passthrough]
+
+[fragment shader spirv]
+; A fragment shader with a ubo.
+;
+; #version 430
+;
+; layout(binding = 0) uniform input_buffer
+; {
+; vec4 in_data;
+; };
+;
+; layout(location = 0) out vec4 outColor;
+;
+; void main() {
+; outColor = in_data;
+; }
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %_ %outColor
+ OpExecutionMode %main OriginUpperLeft
+ OpSource GLSL 430
+ OpName %main "main"
+ OpName %outColor "outColor"
+ OpName %input_buffer "input_buffer"
+ OpMemberName %input_buffer 0 "in_data"
+ OpName %_ ""
+ OpDecorate %outColor Location 0
+ OpMemberDecorate %input_buffer 0 Offset 0
+ OpDecorate %input_buffer Block
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %outColor = OpVariable %_ptr_Output_v4float Output
+%input_buffer = OpTypeStruct %v4float
+%_ptr_Uniform_input_buffer = OpTypePointer Uniform %input_buffer
+ %_ = OpVariable %_ptr_Uniform_input_buffer Uniform
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %16 = OpAccessChain %_ptr_Uniform_v4float %_ %int_0
+ %17 = OpLoad %v4float %16
+ OpStore %outColor %17
+ OpReturn
+ OpFunctionEnd
+[test]
+uniform ubo 0:0 float 0 0.2 0.3 0.4 0.1
+draw rect -1 -1 2 2
+
+probe rect rgba (0, 0, 250, 250) (0.2 0.3 0.4 0.1)
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/geom_pc_entry_point.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/geom_pc_entry_point.amber
new file mode 100644
index 0000000..0ca78fe
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/geom_pc_entry_point.amber
@@ -0,0 +1,152 @@
+[require]
+VK_KHR_spirv_1_4
+geometryShader
+
+[vertex shader passthrough]
+[geometry shader spirv]
+; Test a geometry shader with a push constant in the OpEntryPoint.
+; #version 450
+;
+; layout(triangles) in;
+; layout(triangle_strip, max_vertices = 3) out;
+;
+; layout(push_constant) uniform pushConstants {
+; float factor;
+; } u_pushConstants;
+;
+; void main()
+; {
+; for( int i = 0; i < 3; i++ ) {
+; vec3 point = gl_in[i].gl_Position.xyz;
+; gl_Position = vec4(point * u_pushConstants.factor, 1.0);
+; EmitVertex();
+; }
+; EndPrimitive();
+; }
+
+ OpCapability Geometry
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Geometry %main "main" %gl_in %_ %u_pushConstants
+ OpExecutionMode %main Triangles
+ OpExecutionMode %main Invocations 1
+ OpExecutionMode %main OutputTriangleStrip
+ OpExecutionMode %main OutputVertices 3
+ OpSource GLSL 450
+ OpName %main "main"
+ OpName %i "i"
+ OpName %point "point"
+ OpName %gl_PerVertex "gl_PerVertex"
+ OpMemberName %gl_PerVertex 0 "gl_Position"
+ OpMemberName %gl_PerVertex 1 "gl_PointSize"
+ OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
+ OpMemberName %gl_PerVertex 3 "gl_CullDistance"
+ OpName %gl_in "gl_in"
+ OpName %gl_PerVertex_0 "gl_PerVertex"
+ OpMemberName %gl_PerVertex_0 0 "gl_Position"
+ OpMemberName %gl_PerVertex_0 1 "gl_PointSize"
+ OpMemberName %gl_PerVertex_0 2 "gl_ClipDistance"
+ OpMemberName %gl_PerVertex_0 3 "gl_CullDistance"
+ OpName %_ ""
+ OpName %pushConstants "pushConstants"
+ OpMemberName %pushConstants 0 "factor"
+ OpName %u_pushConstants "u_pushConstants"
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
+ 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
+ OpMemberDecorate %gl_PerVertex_0 3 BuiltIn CullDistance
+ OpDecorate %gl_PerVertex_0 Block
+ OpMemberDecorate %pushConstants 0 Offset 0
+ OpDecorate %pushConstants Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+ %int_0 = OpConstant %int 0
+ %int_3 = OpConstant %int 3
+ %bool = OpTypeBool
+ %float = OpTypeFloat 32
+ %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+ %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 %_arr_float_uint_1
+ %uint_3 = OpConstant %uint 3
+%_arr_gl_PerVertex_uint_3 = OpTypeArray %gl_PerVertex %uint_3
+%_ptr_Input__arr_gl_PerVertex_uint_3 = OpTypePointer Input %_arr_gl_PerVertex_uint_3
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_uint_3 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex_0 = OpTypePointer Output %gl_PerVertex_0
+ %_ = OpVariable %_ptr_Output_gl_PerVertex_0 Output
+%pushConstants = OpTypeStruct %float
+%_ptr_PushConstant_pushConstants = OpTypePointer PushConstant %pushConstants
+%u_pushConstants = OpVariable %_ptr_PushConstant_pushConstants PushConstant
+%_ptr_PushConstant_float = OpTypePointer PushConstant %float
+ %float_1 = OpConstant %float 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %int_1 = OpConstant %int 1
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %i = OpVariable %_ptr_Function_int Function
+ %point = OpVariable %_ptr_Function_v3float Function
+ OpStore %i %int_0
+ OpBranch %10
+ %10 = OpLabel
+ OpLoopMerge %12 %13 None
+ OpBranch %14
+ %14 = OpLabel
+ %15 = OpLoad %int %i
+ %18 = OpSLessThan %bool %15 %int_3
+ OpBranchConditional %18 %11 %12
+ %11 = OpLabel
+ %32 = OpLoad %int %i
+ %34 = OpAccessChain %_ptr_Input_v4float %gl_in %32 %int_0
+ %35 = OpLoad %v4float %34
+ %36 = OpVectorShuffle %v3float %35 %35 0 1 2
+ OpStore %point %36
+ %40 = OpLoad %v3float %point
+ %45 = OpAccessChain %_ptr_PushConstant_float %u_pushConstants %int_0
+ %46 = OpLoad %float %45
+ %47 = OpVectorTimesScalar %v3float %40 %46
+ %49 = OpCompositeExtract %float %47 0
+ %50 = OpCompositeExtract %float %47 1
+ %51 = OpCompositeExtract %float %47 2
+ %52 = OpCompositeConstruct %v4float %49 %50 %51 %float_1
+ %54 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %54 %52
+ OpEmitVertex
+ OpBranch %13
+ %13 = OpLabel
+ %55 = OpLoad %int %i
+ %57 = OpIAdd %int %55 %int_1
+ OpStore %i %57
+ OpBranch %10
+ %12 = OpLabel
+ OpEndPrimitive
+ OpReturn
+ OpFunctionEnd
+[fragment shader]
+#version 430
+layout(location = 0) out vec4 outColor;
+void main() {
+ outColor = vec4(0.5, 0.5, 0.5, 0.5);
+}
+
+[test]
+uniform float 0 0.5
+clear
+draw rect -1 -1 2 2
+
+probe rect rgba (62, 62, 125, 125) (0.5 0.5 0.5 0.5)
+probe rect rgba (0, 0, 250, 62) (0.0 0.0 0.0 0.0)
+probe rect rgba (0, 0, 62, 250) (0.0 0.0 0.0 0.0)
+probe rect rgba (187, 0, 63, 250) (0.0 0.0 0.0 0.0)
+probe rect rgba (0, 187, 250, 63) (0.0 0.0 0.0 0.0)
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/geom_ssbo_entry_point.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/geom_ssbo_entry_point.amber
new file mode 100644
index 0000000..624d6f0
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/geom_ssbo_entry_point.amber
@@ -0,0 +1,154 @@
+[require]
+VK_KHR_spirv_1_4
+geometryShader
+
+[vertex shader passthrough]
+[geometry shader spirv]
+; Test a geometry shader with an SSBO on the OpEntryPoint instruction.
+; #version 450
+;
+; layout(triangles) in;
+; layout(triangle_strip, max_vertices = 3) out;
+;
+; layout(std430, binding = 0) buffer input_buffer
+; {
+; float factor;
+; };
+;
+; void main()
+; {
+; for( int i = 0; i < 3; i++ ) {
+; vec3 point = gl_in[i].gl_Position.xyz;
+; gl_Position = vec4(point * factor, 1.0);
+; EmitVertex();
+; }
+; EndPrimitive();
+; }
+ OpCapability Geometry
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Geometry %main "main" %gl_in %_ %__0
+ OpExecutionMode %main Triangles
+ OpExecutionMode %main Invocations 1
+ OpExecutionMode %main OutputTriangleStrip
+ OpExecutionMode %main OutputVertices 3
+ OpSource GLSL 450
+ OpName %main "main"
+ OpName %i "i"
+ OpName %point "point"
+ OpName %gl_PerVertex "gl_PerVertex"
+ OpMemberName %gl_PerVertex 0 "gl_Position"
+ OpMemberName %gl_PerVertex 1 "gl_PointSize"
+ OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
+ OpMemberName %gl_PerVertex 3 "gl_CullDistance"
+ OpName %gl_in "gl_in"
+ OpName %gl_PerVertex_0 "gl_PerVertex"
+ OpMemberName %gl_PerVertex_0 0 "gl_Position"
+ OpMemberName %gl_PerVertex_0 1 "gl_PointSize"
+ OpMemberName %gl_PerVertex_0 2 "gl_ClipDistance"
+ OpMemberName %gl_PerVertex_0 3 "gl_CullDistance"
+ OpName %_ ""
+ OpName %input_buffer "input_buffer"
+ OpMemberName %input_buffer 0 "factor"
+ OpName %__0 ""
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
+ 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
+ OpMemberDecorate %gl_PerVertex_0 3 BuiltIn CullDistance
+ OpDecorate %gl_PerVertex_0 Block
+ OpMemberDecorate %input_buffer 0 Offset 0
+ OpDecorate %input_buffer Block
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 0
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+ %int_0 = OpConstant %int 0
+ %int_3 = OpConstant %int 3
+ %bool = OpTypeBool
+ %float = OpTypeFloat 32
+ %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+ %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 %_arr_float_uint_1
+ %uint_3 = OpConstant %uint 3
+%_arr_gl_PerVertex_uint_3 = OpTypeArray %gl_PerVertex %uint_3
+%_ptr_Input__arr_gl_PerVertex_uint_3 = OpTypePointer Input %_arr_gl_PerVertex_uint_3
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_uint_3 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex_0 = OpTypePointer Output %gl_PerVertex_0
+ %_ = OpVariable %_ptr_Output_gl_PerVertex_0 Output
+%input_buffer = OpTypeStruct %float
+%_ptr_StorageBuffer_input_buffer = OpTypePointer StorageBuffer %input_buffer
+ %__0 = OpVariable %_ptr_StorageBuffer_input_buffer StorageBuffer
+%_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
+ %float_1 = OpConstant %float 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %int_1 = OpConstant %int 1
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %i = OpVariable %_ptr_Function_int Function
+ %point = OpVariable %_ptr_Function_v3float Function
+ OpStore %i %int_0
+ OpBranch %10
+ %10 = OpLabel
+ OpLoopMerge %12 %13 None
+ OpBranch %14
+ %14 = OpLabel
+ %15 = OpLoad %int %i
+ %18 = OpSLessThan %bool %15 %int_3
+ OpBranchConditional %18 %11 %12
+ %11 = OpLabel
+ %32 = OpLoad %int %i
+ %34 = OpAccessChain %_ptr_Input_v4float %gl_in %32 %int_0
+ %35 = OpLoad %v4float %34
+ %36 = OpVectorShuffle %v3float %35 %35 0 1 2
+ OpStore %point %36
+ %40 = OpLoad %v3float %point
+ %45 = OpAccessChain %_ptr_StorageBuffer_float %__0 %int_0
+ %46 = OpLoad %float %45
+ %47 = OpVectorTimesScalar %v3float %40 %46
+ %49 = OpCompositeExtract %float %47 0
+ %50 = OpCompositeExtract %float %47 1
+ %51 = OpCompositeExtract %float %47 2
+ %52 = OpCompositeConstruct %v4float %49 %50 %51 %float_1
+ %54 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %54 %52
+ OpEmitVertex
+ OpBranch %13
+ %13 = OpLabel
+ %55 = OpLoad %int %i
+ %57 = OpIAdd %int %55 %int_1
+ OpStore %i %57
+ OpBranch %10
+ %12 = OpLabel
+ OpEndPrimitive
+ OpReturn
+ OpFunctionEnd
+[fragment shader]
+#version 430
+layout(location = 0) out vec4 outColor;
+void main() {
+ outColor = vec4(0.5, 0.5, 0.5, 0.5);
+}
+
+[test]
+ssbo 0:0 subdata float 0 0.5
+clear
+draw rect -1 -1 2 2
+
+probe rect rgba (62, 62, 125, 125) (0.5 0.5 0.5 0.5)
+probe rect rgba (0, 0, 250, 62) (0.0 0.0 0.0 0.0)
+probe rect rgba (0, 0, 62, 250) (0.0 0.0 0.0 0.0)
+probe rect rgba (187, 0, 63, 250) (0.0 0.0 0.0 0.0)
+probe rect rgba (0, 187, 250, 63) (0.0 0.0 0.0 0.0)
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/geom_ubo_entry_point.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/geom_ubo_entry_point.amber
new file mode 100644
index 0000000..5128bda
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/geom_ubo_entry_point.amber
@@ -0,0 +1,155 @@
+[require]
+VK_KHR_spirv_1_4
+geometryShader
+
+[vertex shader passthrough]
+[geometry shader spirv]
+; Test a geometry shader with a UBO on the OpEntryPoint instruction.
+; #version 450
+;
+; layout(triangles) in;
+; layout(triangle_strip, max_vertices = 3) out;
+;
+; layout(binding = 0) uniform input_buffer
+; {
+; float factor;
+; };
+;
+; void main()
+; {
+; for( int i = 0; i < 3; i++ ) {
+; vec3 point = gl_in[i].gl_Position.xyz;
+; gl_Position = vec4(point * factor, 1.0);
+; EmitVertex();
+; }
+; EndPrimitive();
+; }
+
+ OpCapability Geometry
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Geometry %main "main" %gl_in %_ %__0
+ OpExecutionMode %main Triangles
+ OpExecutionMode %main Invocations 1
+ OpExecutionMode %main OutputTriangleStrip
+ OpExecutionMode %main OutputVertices 3
+ OpSource GLSL 450
+ OpName %main "main"
+ OpName %i "i"
+ OpName %point "point"
+ OpName %gl_PerVertex "gl_PerVertex"
+ OpMemberName %gl_PerVertex 0 "gl_Position"
+ OpMemberName %gl_PerVertex 1 "gl_PointSize"
+ OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
+ OpMemberName %gl_PerVertex 3 "gl_CullDistance"
+ OpName %gl_in "gl_in"
+ OpName %gl_PerVertex_0 "gl_PerVertex"
+ OpMemberName %gl_PerVertex_0 0 "gl_Position"
+ OpMemberName %gl_PerVertex_0 1 "gl_PointSize"
+ OpMemberName %gl_PerVertex_0 2 "gl_ClipDistance"
+ OpMemberName %gl_PerVertex_0 3 "gl_CullDistance"
+ OpName %_ ""
+ OpName %input_buffer "input_buffer"
+ OpMemberName %input_buffer 0 "factor"
+ OpName %__0 ""
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
+ 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
+ OpMemberDecorate %gl_PerVertex_0 3 BuiltIn CullDistance
+ OpDecorate %gl_PerVertex_0 Block
+ OpMemberDecorate %input_buffer 0 Offset 0
+ OpDecorate %input_buffer Block
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 0
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+ %int_0 = OpConstant %int 0
+ %int_3 = OpConstant %int 3
+ %bool = OpTypeBool
+ %float = OpTypeFloat 32
+ %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+ %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 %_arr_float_uint_1
+ %uint_3 = OpConstant %uint 3
+%_arr_gl_PerVertex_uint_3 = OpTypeArray %gl_PerVertex %uint_3
+%_ptr_Input__arr_gl_PerVertex_uint_3 = OpTypePointer Input %_arr_gl_PerVertex_uint_3
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_uint_3 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex_0 = OpTypePointer Output %gl_PerVertex_0
+ %_ = OpVariable %_ptr_Output_gl_PerVertex_0 Output
+%input_buffer = OpTypeStruct %float
+%_ptr_Uniform_input_buffer = OpTypePointer Uniform %input_buffer
+ %__0 = OpVariable %_ptr_Uniform_input_buffer Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+ %float_1 = OpConstant %float 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %int_1 = OpConstant %int 1
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %i = OpVariable %_ptr_Function_int Function
+ %point = OpVariable %_ptr_Function_v3float Function
+ OpStore %i %int_0
+ OpBranch %10
+ %10 = OpLabel
+ OpLoopMerge %12 %13 None
+ OpBranch %14
+ %14 = OpLabel
+ %15 = OpLoad %int %i
+ %18 = OpSLessThan %bool %15 %int_3
+ OpBranchConditional %18 %11 %12
+ %11 = OpLabel
+ %32 = OpLoad %int %i
+ %34 = OpAccessChain %_ptr_Input_v4float %gl_in %32 %int_0
+ %35 = OpLoad %v4float %34
+ %36 = OpVectorShuffle %v3float %35 %35 0 1 2
+ OpStore %point %36
+ %40 = OpLoad %v3float %point
+ %45 = OpAccessChain %_ptr_Uniform_float %__0 %int_0
+ %46 = OpLoad %float %45
+ %47 = OpVectorTimesScalar %v3float %40 %46
+ %49 = OpCompositeExtract %float %47 0
+ %50 = OpCompositeExtract %float %47 1
+ %51 = OpCompositeExtract %float %47 2
+ %52 = OpCompositeConstruct %v4float %49 %50 %51 %float_1
+ %54 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %54 %52
+ OpEmitVertex
+ OpBranch %13
+ %13 = OpLabel
+ %55 = OpLoad %int %i
+ %57 = OpIAdd %int %55 %int_1
+ OpStore %i %57
+ OpBranch %10
+ %12 = OpLabel
+ OpEndPrimitive
+ OpReturn
+ OpFunctionEnd
+[fragment shader]
+#version 430
+layout(location = 0) out vec4 outColor;
+void main() {
+ outColor = vec4(0.5, 0.5, 0.5, 0.5);
+}
+
+[test]
+uniform ubo 0:0 float 0 0.5
+clear
+draw rect -1 -1 2 2
+
+probe rect rgba (62, 62, 125, 125) (0.5 0.5 0.5 0.5)
+probe rect rgba (0, 0, 250, 62) (0.0 0.0 0.0 0.0)
+probe rect rgba (0, 0, 62, 250) (0.0 0.0 0.0 0.0)
+probe rect rgba (187, 0, 63, 250) (0.0 0.0 0.0 0.0)
+probe rect rgba (0, 187, 250, 63) (0.0 0.0 0.0 0.0)
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/tess_con_pc_entry_point.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/tess_con_pc_entry_point.amber
new file mode 100644
index 0000000..a38ada6
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/tess_con_pc_entry_point.amber
@@ -0,0 +1,192 @@
+[require]
+VK_KHR_spirv_1_4
+tessellationShader
+
+[vertex shader]
+#version 450
+
+layout(location = 0) in vec4 position;
+layout(location = 1) in vec4 vert_color;
+layout(location = 0) out vec4 tsc_color;
+
+void main() {
+ gl_Position = position;
+ tsc_color = vert_color;
+}
+
+[tessellation control shader spirv]
+; Test tessellation control shader with push constant on entry point.
+; But also modified to set gl_TessLevelInner gl_TessLevelOuter
+; #version 450
+; #extension GL_ARB_separate_shader_objects : enable
+;
+; layout(vertices = 3) out;
+;
+; layout(location = 0) in vec4 tsc_color[];
+; layout(location = 0) out vec4 tse_color[];
+;
+; layout(push_constant) uniform pushConstants {
+; vec4 in_val;
+; } pc;
+; #define ID gl_InvocationID
+;
+; void main()
+; {
+; gl_out[ID].gl_Position = gl_in[ID].gl_Position;
+; tse_color[ID] = tsc_color[ID]+pc.in_val;
+; }
+ OpCapability Tessellation
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint TessellationControl %main "main" %gl_out %gl_InvocationID %gl_in %tse_color %pc %tsc_color %gl_TessLevelInner %gl_TessLevelOuter
+ OpExecutionMode %main OutputVertices 3
+ OpSource GLSL 450
+ OpSourceExtension "GL_ARB_separate_shader_objects"
+ OpName %main "main"
+ OpName %gl_PerVertex "gl_PerVertex"
+ OpMemberName %gl_PerVertex 0 "gl_Position"
+ OpMemberName %gl_PerVertex 1 "gl_PointSize"
+ OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
+ OpMemberName %gl_PerVertex 3 "gl_CullDistance"
+ OpName %gl_out "gl_out"
+ OpName %gl_InvocationID "gl_InvocationID"
+ OpName %gl_PerVertex_0 "gl_PerVertex"
+ OpMemberName %gl_PerVertex_0 0 "gl_Position"
+ OpMemberName %gl_PerVertex_0 1 "gl_PointSize"
+ OpMemberName %gl_PerVertex_0 2 "gl_ClipDistance"
+ OpMemberName %gl_PerVertex_0 3 "gl_CullDistance"
+ OpName %gl_in "gl_in"
+ OpName %tse_color "tse_color"
+ OpName %pushConstants "pushConstants"
+ OpMemberName %pushConstants 0 "in_val"
+ OpName %pc "pc"
+ OpName %tsc_color "tsc_color"
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
+ 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
+ OpMemberDecorate %gl_PerVertex_0 3 BuiltIn CullDistance
+ OpDecorate %gl_PerVertex_0 Block
+ OpDecorate %tse_color Location 0
+ OpMemberDecorate %pushConstants 0 Offset 0
+ OpDecorate %pushConstants Block
+ OpDecorate %tsc_color Location 0
+ OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
+ OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
+ OpDecorate %gl_TessLevelInner Patch
+ OpDecorate %gl_TessLevelOuter Patch
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+ %uint = OpTypeInt 32 0
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %uint_4 = OpConstant %uint 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+ %float_1 = OpConstant %float 1.0
+ %arr_2_1 = OpConstantComposite %_arr_float_uint_2 %float_1 %float_1
+ %arr_4_1 = OpConstantComposite %_arr_float_uint_4 %float_1 %float_1 %float_1 %float_1
+%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
+%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
+%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output %arr_2_1
+%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output %arr_4_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_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
+ %int = OpTypeInt 32 1
+%_ptr_Input_int = OpTypePointer Input %int
+%gl_InvocationID = OpVariable %_ptr_Input_int Input
+ %int_0 = OpConstant %int 0
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1 %_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_v4float_uint_3 = OpTypeArray %v4float %uint_3
+%_ptr_Output__arr_v4float_uint_3 = OpTypePointer Output %_arr_v4float_uint_3
+ %tse_color = OpVariable %_ptr_Output__arr_v4float_uint_3 Output
+%pushConstants = OpTypeStruct %v4float
+%_ptr_PushConstant_pushConstants = OpTypePointer PushConstant %pushConstants
+ %pc = OpVariable %_ptr_PushConstant_pushConstants PushConstant
+%_ptr_PushConstant_v4float = OpTypePointer PushConstant %v4float
+%_arr_v4float_uint_32 = OpTypeArray %v4float %uint_32
+%_ptr_Input__arr_v4float_uint_32 = OpTypePointer Input %_arr_v4float_uint_32
+ %tsc_color = OpVariable %_ptr_Input__arr_v4float_uint_32 Input
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %19 = OpLoad %int %gl_InvocationID
+ %26 = OpLoad %int %gl_InvocationID
+ %28 = OpAccessChain %_ptr_Input_v4float %gl_in %26 %int_0
+ %29 = OpLoad %v4float %28
+ %31 = OpAccessChain %_ptr_Output_v4float %gl_out %19 %int_0
+ OpStore %31 %29
+ %35 = OpLoad %int %gl_InvocationID
+ %36 = OpLoad %int %gl_InvocationID
+ %37 = OpAccessChain %_ptr_Input_v4float %tsc_color %36
+ %38 = OpLoad %v4float %37
+ %43 = OpAccessChain %_ptr_PushConstant_v4float %pc %int_0
+ %44 = OpLoad %v4float %43
+ %45 = OpFAdd %v4float %38 %44
+ %46 = OpAccessChain %_ptr_Output_v4float %tse_color %35
+ OpStore %46 %45
+ OpReturn
+ OpFunctionEnd
+[tessellation evaluation shader]
+#version 450
+#extension GL_ARB_separate_shader_objects : enable
+
+layout(triangles, equal_spacing, cw) in;
+
+layout(location = 0) in vec4 tse_color[];
+layout(location = 0) out vec4 frag_color;
+
+void main()
+{
+ vec4 p0 = gl_TessCoord.x * gl_in[0].gl_Position;
+ vec4 p1 = gl_TessCoord.y * gl_in[1].gl_Position;
+ vec4 p2 = gl_TessCoord.z * gl_in[2].gl_Position;
+ gl_Position = p0 + p1 + p2;
+ frag_color = tse_color[0];
+}
+
+[fragment shader]
+#version 450
+
+layout(location = 0) in vec4 frag_color;
+layout(location = 0) out vec4 final_color;
+
+void main() {
+ final_color = frag_color;
+}
+
+[vertex data]
+# position vert_color
+ 0/R8G8_SNORM 1/R8G8B8A8_UNORM
+
+# Red for entire frame
+# R8 G8 R8 G8 B8 A8
+ -128 -128 255 0 0 255
+ 127 127 255 0 0 255
+ -128 127 255 0 0 255
+
+ -128 -128 255 0 0 255
+ 127 127 255 0 0 255
+ 127 -128 255 0 0 255
+
+[test]
+uniform float 0 0.0 0.0 0.3 0.0
+clear
+draw arrays PATCH_LIST 0 6
+relative probe rect rgb (0.0, 0.0, 1.0, 1.0) (1.0, 0, 0.3)
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/tess_con_ssbo_entry_point.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/tess_con_ssbo_entry_point.amber
new file mode 100644
index 0000000..9e02e87
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/tess_con_ssbo_entry_point.amber
@@ -0,0 +1,196 @@
+[require]
+VK_KHR_spirv_1_4
+tessellationShader
+
+[vertex shader]
+#version 450
+
+layout(location = 0) in vec4 position;
+layout(location = 1) in vec4 vert_color;
+layout(location = 0) out vec4 tsc_color;
+
+void main() {
+ gl_Position = position;
+ tsc_color = vert_color;
+}
+
+[tessellation control shader spirv]
+; Test tessellation control shader with an ssbo on the entry point.
+; #version 450
+; #extension GL_ARB_separate_shader_objects : enable
+;
+; layout(vertices = 3) out;
+;
+; layout(location = 0) in vec4 tsc_color[];
+; layout(location = 0) out vec4 tse_color[];
+;
+; #define ID gl_InvocationID
+;
+; layout(std430, binding = 0) buffer input_buffer
+; {
+; vec4 in_val;
+; };
+;
+; void main()
+; {
+; gl_out[ID].gl_Position = gl_in[ID].gl_Position;
+; tse_color[ID] = tsc_color[ID]+in_val;
+; }
+ OpCapability Tessellation
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint TessellationControl %main "main" %gl_out %gl_InvocationID %gl_in %tse_color %_ %tsc_color %gl_TessLevelInner %gl_TessLevelOuter
+ OpExecutionMode %main OutputVertices 3
+ OpSource GLSL 450
+ OpSourceExtension "GL_ARB_separate_shader_objects"
+ OpName %main "main"
+ OpName %gl_PerVertex "gl_PerVertex"
+ OpMemberName %gl_PerVertex 0 "gl_Position"
+ OpMemberName %gl_PerVertex 1 "gl_PointSize"
+ OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
+ OpMemberName %gl_PerVertex 3 "gl_CullDistance"
+ OpName %gl_out "gl_out"
+ OpName %gl_InvocationID "gl_InvocationID"
+ OpName %gl_PerVertex_0 "gl_PerVertex"
+ OpMemberName %gl_PerVertex_0 0 "gl_Position"
+ OpMemberName %gl_PerVertex_0 1 "gl_PointSize"
+ OpMemberName %gl_PerVertex_0 2 "gl_ClipDistance"
+ OpMemberName %gl_PerVertex_0 3 "gl_CullDistance"
+ OpName %gl_in "gl_in"
+ OpName %tse_color "tse_color"
+ OpName %input_buffer "input_buffer"
+ OpMemberName %input_buffer 0 "in_val"
+ OpName %_ ""
+ OpName %tsc_color "tsc_color"
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
+ 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
+ OpMemberDecorate %gl_PerVertex_0 3 BuiltIn CullDistance
+ OpDecorate %gl_PerVertex_0 Block
+ OpDecorate %tse_color Location 0
+ OpMemberDecorate %input_buffer 0 Offset 0
+ OpDecorate %input_buffer Block
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %tsc_color Location 0
+ OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
+ OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
+ OpDecorate %gl_TessLevelInner Patch
+ OpDecorate %gl_TessLevelOuter Patch
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+ %uint = OpTypeInt 32 0
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %uint_4 = OpConstant %uint 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+ %float_1 = OpConstant %float 1.0
+ %arr_2_1 = OpConstantComposite %_arr_float_uint_2 %float_1 %float_1
+ %arr_4_1 = OpConstantComposite %_arr_float_uint_4 %float_1 %float_1 %float_1 %float_1
+%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
+%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
+%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output %arr_2_1
+%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output %arr_4_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_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
+ %int = OpTypeInt 32 1
+%_ptr_Input_int = OpTypePointer Input %int
+%gl_InvocationID = OpVariable %_ptr_Input_int Input
+ %int_0 = OpConstant %int 0
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1 %_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_v4float_uint_3 = OpTypeArray %v4float %uint_3
+%_ptr_Output__arr_v4float_uint_3 = OpTypePointer Output %_arr_v4float_uint_3
+ %tse_color = OpVariable %_ptr_Output__arr_v4float_uint_3 Output
+%input_buffer = OpTypeStruct %v4float
+%_ptr_StorageBuffer_input_buffer = OpTypePointer StorageBuffer %input_buffer
+ %_ = OpVariable %_ptr_StorageBuffer_input_buffer StorageBuffer
+%_ptr_StorageBuffer_v4float = OpTypePointer StorageBuffer %v4float
+%_arr_v4float_uint_32 = OpTypeArray %v4float %uint_32
+%_ptr_Input__arr_v4float_uint_32 = OpTypePointer Input %_arr_v4float_uint_32
+ %tsc_color = OpVariable %_ptr_Input__arr_v4float_uint_32 Input
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %19 = OpLoad %int %gl_InvocationID
+ %26 = OpLoad %int %gl_InvocationID
+ %28 = OpAccessChain %_ptr_Input_v4float %gl_in %26 %int_0
+ %29 = OpLoad %v4float %28
+ %31 = OpAccessChain %_ptr_Output_v4float %gl_out %19 %int_0
+ OpStore %31 %29
+ %35 = OpLoad %int %gl_InvocationID
+ %36 = OpLoad %int %gl_InvocationID
+ %37 = OpAccessChain %_ptr_Input_v4float %tsc_color %36
+ %38 = OpLoad %v4float %37
+ %43 = OpAccessChain %_ptr_StorageBuffer_v4float %_ %int_0
+ %44 = OpLoad %v4float %43
+ %45 = OpFAdd %v4float %38 %44
+ %46 = OpAccessChain %_ptr_Output_v4float %tse_color %35
+ OpStore %46 %45
+ OpReturn
+ OpFunctionEnd
+
+[tessellation evaluation shader]
+#version 450
+#extension GL_ARB_separate_shader_objects : enable
+
+layout(triangles, equal_spacing, cw) in;
+
+layout(location = 0) in vec4 tse_color[];
+layout(location = 0) out vec4 frag_color;
+
+void main()
+{
+ vec4 p0 = gl_TessCoord.x * gl_in[0].gl_Position;
+ vec4 p1 = gl_TessCoord.y * gl_in[1].gl_Position;
+ vec4 p2 = gl_TessCoord.z * gl_in[2].gl_Position;
+ gl_Position = p0 + p1 + p2;
+ frag_color = tse_color[0];
+}
+
+[fragment shader]
+#version 450
+
+layout(location = 0) in vec4 frag_color;
+layout(location = 0) out vec4 final_color;
+
+void main() {
+ final_color = frag_color;
+}
+
+[vertex data]
+# position vert_color
+ 0/R8G8_SNORM 1/R8G8B8A8_UNORM
+
+# Red for entire frame
+# R8 G8 R8 G8 B8 A8
+ -128 -128 255 0 0 255
+ 127 127 255 0 0 255
+ -128 127 255 0 0 255
+
+ -128 -128 255 0 0 255
+ 127 127 255 0 0 255
+ 127 -128 255 0 0 255
+
+[test]
+ssbo 0:0 subdata float 0 0.0 0.0 0.3 0.0
+clear
+draw arrays PATCH_LIST 0 6
+relative probe rect rgb (0.0, 0.0, 1.0, 1.0) (1.0, 0, 0.3)
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/tess_con_ubo_entry_point.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/tess_con_ubo_entry_point.amber
new file mode 100644
index 0000000..24122fd
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/tess_con_ubo_entry_point.amber
@@ -0,0 +1,195 @@
+[require]
+VK_KHR_spirv_1_4
+tessellationShader
+
+[vertex shader]
+#version 450
+
+layout(location = 0) in vec4 position;
+layout(location = 1) in vec4 vert_color;
+layout(location = 0) out vec4 tsc_color;
+
+void main() {
+ gl_Position = position;
+ tsc_color = vert_color;
+}
+
+[tessellation control shader spirv]
+; Test tessellation control shader with a ubo on the entry point.
+; #version 450
+; #extension GL_ARB_separate_shader_objects : enable
+;
+; layout(vertices = 3) out;
+;
+; layout(location = 0) in vec4 tsc_color[];
+; layout(location = 0) out vec4 tse_color[];
+;
+; #define ID gl_InvocationID
+;
+; layout(binding = 0) uniform input_buffer
+; {
+; vec4 in_val;
+; };
+;
+; void main()
+; {
+; gl_out[ID].gl_Position = gl_in[ID].gl_Position;
+; tse_color[ID] = tsc_color[ID]+in_val;
+; }
+ OpCapability Tessellation
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint TessellationControl %main "main" %gl_out %gl_InvocationID %gl_in %tse_color %_ %tsc_color %gl_TessLevelInner %gl_TessLevelOuter
+ OpExecutionMode %main OutputVertices 3
+ OpSource GLSL 450
+ OpSourceExtension "GL_ARB_separate_shader_objects"
+ OpName %main "main"
+ OpName %gl_PerVertex "gl_PerVertex"
+ OpMemberName %gl_PerVertex 0 "gl_Position"
+ OpMemberName %gl_PerVertex 1 "gl_PointSize"
+ OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
+ OpMemberName %gl_PerVertex 3 "gl_CullDistance"
+ OpName %gl_out "gl_out"
+ OpName %gl_InvocationID "gl_InvocationID"
+ OpName %gl_PerVertex_0 "gl_PerVertex"
+ OpMemberName %gl_PerVertex_0 0 "gl_Position"
+ OpMemberName %gl_PerVertex_0 1 "gl_PointSize"
+ OpMemberName %gl_PerVertex_0 2 "gl_ClipDistance"
+ OpMemberName %gl_PerVertex_0 3 "gl_CullDistance"
+ OpName %gl_in "gl_in"
+ OpName %tse_color "tse_color"
+ OpName %input_buffer "input_buffer"
+ OpMemberName %input_buffer 0 "in_val"
+ OpName %_ ""
+ OpName %tsc_color "tsc_color"
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
+ 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
+ OpMemberDecorate %gl_PerVertex_0 3 BuiltIn CullDistance
+ OpDecorate %gl_PerVertex_0 Block
+ OpDecorate %tse_color Location 0
+ OpMemberDecorate %input_buffer 0 Offset 0
+ OpDecorate %input_buffer Block
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %tsc_color Location 0
+ OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
+ OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
+ OpDecorate %gl_TessLevelInner Patch
+ OpDecorate %gl_TessLevelOuter Patch
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+ %uint = OpTypeInt 32 0
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %uint_4 = OpConstant %uint 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_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
+ %int = OpTypeInt 32 1
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+ %float_1 = OpConstant %float 1.0
+ %arr_2_1 = OpConstantComposite %_arr_float_uint_2 %float_1 %float_1
+ %arr_4_1 = OpConstantComposite %_arr_float_uint_4 %float_1 %float_1 %float_1 %float_1
+%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
+%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
+%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output %arr_2_1
+%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output %arr_4_1
+%_ptr_Input_int = OpTypePointer Input %int
+%gl_InvocationID = OpVariable %_ptr_Input_int Input
+ %int_0 = OpConstant %int 0
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1 %_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_v4float_uint_3 = OpTypeArray %v4float %uint_3
+%_ptr_Output__arr_v4float_uint_3 = OpTypePointer Output %_arr_v4float_uint_3
+ %tse_color = OpVariable %_ptr_Output__arr_v4float_uint_3 Output
+%input_buffer = OpTypeStruct %v4float
+%_ptr_Uniform_input_buffer = OpTypePointer Uniform %input_buffer
+ %_ = OpVariable %_ptr_Uniform_input_buffer Uniform
+%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
+%_arr_v4float_uint_32 = OpTypeArray %v4float %uint_32
+%_ptr_Input__arr_v4float_uint_32 = OpTypePointer Input %_arr_v4float_uint_32
+ %tsc_color = OpVariable %_ptr_Input__arr_v4float_uint_32 Input
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %19 = OpLoad %int %gl_InvocationID
+ %26 = OpLoad %int %gl_InvocationID
+ %28 = OpAccessChain %_ptr_Input_v4float %gl_in %26 %int_0
+ %29 = OpLoad %v4float %28
+ %31 = OpAccessChain %_ptr_Output_v4float %gl_out %19 %int_0
+ OpStore %31 %29
+ %35 = OpLoad %int %gl_InvocationID
+ %36 = OpLoad %int %gl_InvocationID
+ %37 = OpAccessChain %_ptr_Input_v4float %tsc_color %36
+ %38 = OpLoad %v4float %37
+ %43 = OpAccessChain %_ptr_Uniform_v4float %_ %int_0
+ %44 = OpLoad %v4float %43
+ %45 = OpFAdd %v4float %38 %44
+ %46 = OpAccessChain %_ptr_Output_v4float %tse_color %35
+ OpStore %46 %45
+ OpReturn
+ OpFunctionEnd
+[tessellation evaluation shader]
+#version 450
+#extension GL_ARB_separate_shader_objects : enable
+
+layout(triangles, equal_spacing, cw) in;
+
+layout(location = 0) in vec4 tse_color[];
+layout(location = 0) out vec4 frag_color;
+
+void main()
+{
+ vec4 p0 = gl_TessCoord.x * gl_in[0].gl_Position;
+ vec4 p1 = gl_TessCoord.y * gl_in[1].gl_Position;
+ vec4 p2 = gl_TessCoord.z * gl_in[2].gl_Position;
+ gl_Position = p0 + p1 + p2;
+ frag_color = tse_color[0];
+}
+
+[fragment shader]
+#version 450
+
+layout(location = 0) in vec4 frag_color;
+layout(location = 0) out vec4 final_color;
+
+void main() {
+ final_color = frag_color;
+}
+
+[vertex data]
+# position vert_color
+ 0/R8G8_SNORM 1/R8G8B8A8_UNORM
+
+# Red for entire frame
+# R8 G8 R8 G8 B8 A8
+ -128 -128 255 0 0 255
+ 127 127 255 0 0 255
+ -128 127 255 0 0 255
+
+ -128 -128 255 0 0 255
+ 127 127 255 0 0 255
+ 127 -128 255 0 0 255
+
+[test]
+uniform ubo 0:0 float 0 0.0 0.0 0.3 0.0
+clear
+draw arrays PATCH_LIST 0 6
+relative probe rect rgb (0.0, 0.0, 1.0, 1.0) (1.0, 0, 0.3)
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/tess_eval_pc_entry_point.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/tess_eval_pc_entry_point.amber
new file mode 100644
index 0000000..2ee71ab
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/tess_eval_pc_entry_point.amber
@@ -0,0 +1,210 @@
+[require]
+VK_KHR_spirv_1_4
+tessellationShader
+
+[vertex shader]
+#version 450
+
+layout(location = 0) in vec4 position;
+layout(location = 1) in vec4 vert_color;
+layout(location = 0) out vec4 tsc_color;
+
+void main() {
+ gl_Position = position;
+ tsc_color = vert_color;
+}
+
+[tessellation control shader]
+#version 450
+#extension GL_ARB_separate_shader_objects : enable
+
+layout(vertices = 3) out;
+
+layout(location = 0) in vec4 tsc_color[];
+layout(location = 0) out vec4 tse_color[];
+
+#define ID gl_InvocationID
+
+void main()
+{
+ gl_out[ID].gl_Position = gl_in[ID].gl_Position;
+ tse_color[ID] = tsc_color[ID];
+ gl_TessLevelOuter[0] = 1.0;
+ gl_TessLevelOuter[1] = 1.0;
+ gl_TessLevelOuter[2] = 1.0;
+ gl_TessLevelInner[0] = 1.0;
+ gl_TessLevelInner[1] = 1.0;
+}
+
+[tessellation evaluation shader spirv]
+; Test tessellation evaluation shader with a push constant on the entry point.
+; #version 450
+; #extension GL_ARB_separate_shader_objects : enable
+;
+; layout(triangles, equal_spacing, cw) in;
+;
+; layout(location = 0) in vec4 tse_color[];
+; layout(location = 0) out vec4 frag_color;
+;
+; layout(push_constant) uniform pushConstants {
+; vec4 in_val;
+; } pc;
+;
+; void main()
+; {
+; vec4 p0 = gl_TessCoord.x * gl_in[0].gl_Position;
+; vec4 p1 = gl_TessCoord.y * gl_in[1].gl_Position;
+; vec4 p2 = gl_TessCoord.z * gl_in[2].gl_Position;
+; gl_Position = p0 + p1 + p2;
+; frag_color = tse_color[0]+pc.in_val;
+; }
+ OpCapability Tessellation
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint TessellationEvaluation %main "main" %gl_TessCoord %gl_in %_ %frag_color %tse_color %pc
+ OpExecutionMode %main Triangles
+ OpExecutionMode %main SpacingEqual
+ OpExecutionMode %main VertexOrderCw
+ OpSource GLSL 450
+ OpSourceExtension "GL_ARB_separate_shader_objects"
+ OpName %main "main"
+ OpName %p0 "p0"
+ OpName %gl_TessCoord "gl_TessCoord"
+ OpName %gl_PerVertex "gl_PerVertex"
+ OpMemberName %gl_PerVertex 0 "gl_Position"
+ OpMemberName %gl_PerVertex 1 "gl_PointSize"
+ OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
+ OpMemberName %gl_PerVertex 3 "gl_CullDistance"
+ OpName %gl_in "gl_in"
+ OpName %p1 "p1"
+ OpName %p2 "p2"
+ OpName %gl_PerVertex_0 "gl_PerVertex"
+ OpMemberName %gl_PerVertex_0 0 "gl_Position"
+ OpMemberName %gl_PerVertex_0 1 "gl_PointSize"
+ OpMemberName %gl_PerVertex_0 2 "gl_ClipDistance"
+ OpMemberName %gl_PerVertex_0 3 "gl_CullDistance"
+ OpName %_ ""
+ OpName %frag_color "frag_color"
+ OpName %tse_color "tse_color"
+ OpName %pushConstants "pushConstants"
+ OpMemberName %pushConstants 0 "in_val"
+ OpName %pc "pc"
+ OpDecorate %gl_TessCoord BuiltIn TessCoord
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
+ 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
+ OpMemberDecorate %gl_PerVertex_0 3 BuiltIn CullDistance
+ OpDecorate %gl_PerVertex_0 Block
+ OpDecorate %frag_color Location 0
+ OpDecorate %tse_color Location 0
+ OpMemberDecorate %pushConstants 0 Offset 0
+ OpDecorate %pushConstants Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+ %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%gl_TessCoord = OpVariable %_ptr_Input_v3float Input
+ %uint = OpTypeInt 32 0
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+ %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1
+ %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_uint_32 = OpTypeArray %gl_PerVertex %uint_32
+%_ptr_Input__arr_gl_PerVertex_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_uint_32
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_uint_32 Input
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+ %int_1 = OpConstant %int 1
+ %uint_2 = OpConstant %uint 2
+ %int_2 = OpConstant %int 2
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex_0 = OpTypePointer Output %gl_PerVertex_0
+ %_ = OpVariable %_ptr_Output_gl_PerVertex_0 Output
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %frag_color = 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
+ %tse_color = OpVariable %_ptr_Input__arr_v4float_uint_32 Input
+%pushConstants = OpTypeStruct %v4float
+%_ptr_PushConstant_pushConstants = OpTypePointer PushConstant %pushConstants
+ %pc = OpVariable %_ptr_PushConstant_pushConstants PushConstant
+%_ptr_PushConstant_v4float = OpTypePointer PushConstant %v4float
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %p0 = OpVariable %_ptr_Function_v4float Function
+ %p1 = OpVariable %_ptr_Function_v4float Function
+ %p2 = OpVariable %_ptr_Function_v4float Function
+ %16 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_0
+ %17 = OpLoad %float %16
+ %28 = OpAccessChain %_ptr_Input_v4float %gl_in %int_0 %int_0
+ %29 = OpLoad %v4float %28
+ %30 = OpVectorTimesScalar %v4float %29 %17
+ OpStore %p0 %30
+ %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
+ OpStore %p1 %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
+ OpStore %p2 %45
+ %49 = OpLoad %v4float %p0
+ %50 = OpLoad %v4float %p1
+ %51 = OpFAdd %v4float %49 %50
+ %52 = OpLoad %v4float %p2
+ %53 = OpFAdd %v4float %51 %52
+ %55 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %55 %53
+ %60 = OpAccessChain %_ptr_Input_v4float %tse_color %int_0
+ %61 = OpLoad %v4float %60
+ %66 = OpAccessChain %_ptr_PushConstant_v4float %pc %int_0
+ %67 = OpLoad %v4float %66
+ %68 = OpFAdd %v4float %61 %67
+ OpStore %frag_color %68
+ OpReturn
+ OpFunctionEnd
+
+[fragment shader]
+#version 450
+
+layout(location = 0) in vec4 frag_color;
+layout(location = 0) out vec4 final_color;
+
+void main() {
+ final_color = frag_color;
+}
+
+[vertex data]
+# position vert_color
+ 0/R8G8_SNORM 1/R8G8B8A8_UNORM
+
+# Red for entire frame
+# R8 G8 R8 G8 B8 A8
+ -128 -128 255 0 0 255
+ 127 127 255 0 0 255
+ -128 127 255 0 0 255
+
+ -128 -128 255 0 0 255
+ 127 127 255 0 0 255
+ 127 -128 255 0 0 255
+
+[test]
+uniform float 0 0.0 0.0 0.3 0.0
+clear
+draw arrays PATCH_LIST 0 6
+relative probe rect rgb (0.0, 0.0, 1.0, 1.0) (1.0, 0, 0.3)
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/tess_eval_ssbo_entry_point.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/tess_eval_ssbo_entry_point.amber
new file mode 100644
index 0000000..a6148b0
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/tess_eval_ssbo_entry_point.amber
@@ -0,0 +1,213 @@
+[require]
+VK_KHR_spirv_1_4
+tessellationShader
+
+[vertex shader]
+#version 450
+
+layout(location = 0) in vec4 position;
+layout(location = 1) in vec4 vert_color;
+layout(location = 0) out vec4 tsc_color;
+
+void main() {
+ gl_Position = position;
+ tsc_color = vert_color;
+}
+
+[tessellation control shader]
+#version 450
+#extension GL_ARB_separate_shader_objects : enable
+
+layout(vertices = 3) out;
+
+layout(location = 0) in vec4 tsc_color[];
+layout(location = 0) out vec4 tse_color[];
+
+#define ID gl_InvocationID
+
+void main()
+{
+ gl_out[ID].gl_Position = gl_in[ID].gl_Position;
+ tse_color[ID] = tsc_color[ID];
+ gl_TessLevelOuter[0] = 1.0;
+ gl_TessLevelOuter[1] = 1.0;
+ gl_TessLevelOuter[2] = 1.0;
+ gl_TessLevelInner[0] = 1.0;
+ gl_TessLevelInner[1] = 1.0;
+}
+
+[tessellation evaluation shader spirv]
+; Test tessellation evaluation shader with an SSBO on the entry point.
+; #version 450
+; #extension GL_ARB_separate_shader_objects : enable
+;
+; layout(triangles, equal_spacing, cw) in;
+;
+; layout(location = 0) in vec4 tse_color[];
+; layout(location = 0) out vec4 frag_color;
+;
+; layout(std430, binding = 0) buffer input_buffer
+; {
+; vec4 in_val;
+; };
+;
+; void main()
+; {
+; vec4 p0 = gl_TessCoord.x * gl_in[0].gl_Position;
+; vec4 p1 = gl_TessCoord.y * gl_in[1].gl_Position;
+; vec4 p2 = gl_TessCoord.z * gl_in[2].gl_Position;
+; gl_Position = p0 + p1 + p2;
+; frag_color = tse_color[0]+in_val;
+; }
+ OpCapability Tessellation
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint TessellationEvaluation %main "main" %gl_TessCoord %gl_in %_ %frag_color %tse_color %__0
+ OpExecutionMode %main Triangles
+ OpExecutionMode %main SpacingEqual
+ OpExecutionMode %main VertexOrderCw
+ OpSource GLSL 450
+ OpSourceExtension "GL_ARB_separate_shader_objects"
+ OpName %main "main"
+ OpName %p0 "p0"
+ OpName %gl_TessCoord "gl_TessCoord"
+ OpName %gl_PerVertex "gl_PerVertex"
+ OpMemberName %gl_PerVertex 0 "gl_Position"
+ OpMemberName %gl_PerVertex 1 "gl_PointSize"
+ OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
+ OpMemberName %gl_PerVertex 3 "gl_CullDistance"
+ OpName %gl_in "gl_in"
+ OpName %p1 "p1"
+ OpName %p2 "p2"
+ OpName %gl_PerVertex_0 "gl_PerVertex"
+ OpMemberName %gl_PerVertex_0 0 "gl_Position"
+ OpMemberName %gl_PerVertex_0 1 "gl_PointSize"
+ OpMemberName %gl_PerVertex_0 2 "gl_ClipDistance"
+ OpMemberName %gl_PerVertex_0 3 "gl_CullDistance"
+ OpName %_ ""
+ OpName %frag_color "frag_color"
+ OpName %tse_color "tse_color"
+ OpName %input_buffer "input_buffer"
+ OpMemberName %input_buffer 0 "in_val"
+ OpName %__0 ""
+ OpDecorate %gl_TessCoord BuiltIn TessCoord
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
+ 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
+ OpMemberDecorate %gl_PerVertex_0 3 BuiltIn CullDistance
+ OpDecorate %gl_PerVertex_0 Block
+ OpDecorate %frag_color Location 0
+ OpDecorate %tse_color Location 0
+ OpMemberDecorate %input_buffer 0 Offset 0
+ OpDecorate %input_buffer Block
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 0
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+ %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%gl_TessCoord = OpVariable %_ptr_Input_v3float Input
+ %uint = OpTypeInt 32 0
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+ %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1
+ %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_uint_32 = OpTypeArray %gl_PerVertex %uint_32
+%_ptr_Input__arr_gl_PerVertex_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_uint_32
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_uint_32 Input
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+ %int_1 = OpConstant %int 1
+ %uint_2 = OpConstant %uint 2
+ %int_2 = OpConstant %int 2
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex_0 = OpTypePointer Output %gl_PerVertex_0
+ %_ = OpVariable %_ptr_Output_gl_PerVertex_0 Output
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %frag_color = 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
+ %tse_color = OpVariable %_ptr_Input__arr_v4float_uint_32 Input
+%input_buffer = OpTypeStruct %v4float
+%_ptr_StorageBuffer_input_buffer = OpTypePointer StorageBuffer %input_buffer
+ %__0 = OpVariable %_ptr_StorageBuffer_input_buffer StorageBuffer
+%_ptr_StorageBuffer_v4float = OpTypePointer StorageBuffer %v4float
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %p0 = OpVariable %_ptr_Function_v4float Function
+ %p1 = OpVariable %_ptr_Function_v4float Function
+ %p2 = OpVariable %_ptr_Function_v4float Function
+ %16 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_0
+ %17 = OpLoad %float %16
+ %28 = OpAccessChain %_ptr_Input_v4float %gl_in %int_0 %int_0
+ %29 = OpLoad %v4float %28
+ %30 = OpVectorTimesScalar %v4float %29 %17
+ OpStore %p0 %30
+ %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
+ OpStore %p1 %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
+ OpStore %p2 %45
+ %49 = OpLoad %v4float %p0
+ %50 = OpLoad %v4float %p1
+ %51 = OpFAdd %v4float %49 %50
+ %52 = OpLoad %v4float %p2
+ %53 = OpFAdd %v4float %51 %52
+ %55 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %55 %53
+ %60 = OpAccessChain %_ptr_Input_v4float %tse_color %int_0
+ %61 = OpLoad %v4float %60
+ %66 = OpAccessChain %_ptr_StorageBuffer_v4float %__0 %int_0
+ %67 = OpLoad %v4float %66
+ %68 = OpFAdd %v4float %61 %67
+ OpStore %frag_color %68
+ OpReturn
+ OpFunctionEnd
+
+[fragment shader]
+#version 450
+
+layout(location = 0) in vec4 frag_color;
+layout(location = 0) out vec4 final_color;
+
+void main() {
+ final_color = frag_color;
+}
+
+[vertex data]
+# position vert_color
+ 0/R8G8_SNORM 1/R8G8B8A8_UNORM
+
+# Red for entire frame
+# R8 G8 R8 G8 B8 A8
+ -128 -128 255 0 0 255
+ 127 127 255 0 0 255
+ -128 127 255 0 0 255
+
+ -128 -128 255 0 0 255
+ 127 127 255 0 0 255
+ 127 -128 255 0 0 255
+
+[test]
+ssbo 0:0 subdata float 0 0.0 0.0 0.3 0.0
+clear
+draw arrays PATCH_LIST 0 6
+relative probe rect rgb (0.0, 0.0, 1.0, 1.0) (1.0, 0, 0.3)
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/tess_eval_ubo_entry_point.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/tess_eval_ubo_entry_point.amber
new file mode 100644
index 0000000..7d2267a
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/tess_eval_ubo_entry_point.amber
@@ -0,0 +1,213 @@
+[require]
+VK_KHR_spirv_1_4
+tessellationShader
+
+[vertex shader]
+#version 450
+
+layout(location = 0) in vec4 position;
+layout(location = 1) in vec4 vert_color;
+layout(location = 0) out vec4 tsc_color;
+
+void main() {
+ gl_Position = position;
+ tsc_color = vert_color;
+}
+
+[tessellation control shader]
+#version 450
+#extension GL_ARB_separate_shader_objects : enable
+
+layout(vertices = 3) out;
+
+layout(location = 0) in vec4 tsc_color[];
+layout(location = 0) out vec4 tse_color[];
+
+#define ID gl_InvocationID
+
+void main()
+{
+ gl_out[ID].gl_Position = gl_in[ID].gl_Position;
+ tse_color[ID] = tsc_color[ID];
+ gl_TessLevelOuter[0] = 1.0;
+ gl_TessLevelOuter[1] = 1.0;
+ gl_TessLevelOuter[2] = 1.0;
+ gl_TessLevelInner[0] = 1.0;
+ gl_TessLevelInner[1] = 1.0;
+}
+
+[tessellation evaluation shader spirv]
+; Test tessellation evaluation shader with a UBO on the entry point.
+; #version 450
+; #extension GL_ARB_separate_shader_objects : enable
+;
+; layout(triangles, equal_spacing, cw) in;
+;
+; layout(location = 0) in vec4 tse_color[];
+; layout(location = 0) out vec4 frag_color;
+;
+; layout(binding = 0) uniform input_buffer
+; {
+; vec4 in_val;
+; };
+;
+; void main()
+; {
+; vec4 p0 = gl_TessCoord.x * gl_in[0].gl_Position;
+; vec4 p1 = gl_TessCoord.y * gl_in[1].gl_Position;
+; vec4 p2 = gl_TessCoord.z * gl_in[2].gl_Position;
+; gl_Position = p0 + p1 + p2;
+; frag_color = tse_color[0]+in_val;
+; }
+ OpCapability Tessellation
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint TessellationEvaluation %main "main" %gl_TessCoord %gl_in %_ %frag_color %tse_color %__0
+ OpExecutionMode %main Triangles
+ OpExecutionMode %main SpacingEqual
+ OpExecutionMode %main VertexOrderCw
+ OpSource GLSL 450
+ OpSourceExtension "GL_ARB_separate_shader_objects"
+ OpName %main "main"
+ OpName %p0 "p0"
+ OpName %gl_TessCoord "gl_TessCoord"
+ OpName %gl_PerVertex "gl_PerVertex"
+ OpMemberName %gl_PerVertex 0 "gl_Position"
+ OpMemberName %gl_PerVertex 1 "gl_PointSize"
+ OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
+ OpMemberName %gl_PerVertex 3 "gl_CullDistance"
+ OpName %gl_in "gl_in"
+ OpName %p1 "p1"
+ OpName %p2 "p2"
+ OpName %gl_PerVertex_0 "gl_PerVertex"
+ OpMemberName %gl_PerVertex_0 0 "gl_Position"
+ OpMemberName %gl_PerVertex_0 1 "gl_PointSize"
+ OpMemberName %gl_PerVertex_0 2 "gl_ClipDistance"
+ OpMemberName %gl_PerVertex_0 3 "gl_CullDistance"
+ OpName %_ ""
+ OpName %frag_color "frag_color"
+ OpName %tse_color "tse_color"
+ OpName %input_buffer "input_buffer"
+ OpMemberName %input_buffer 0 "in_val"
+ OpName %__0 ""
+ OpDecorate %gl_TessCoord BuiltIn TessCoord
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
+ 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
+ OpMemberDecorate %gl_PerVertex_0 3 BuiltIn CullDistance
+ OpDecorate %gl_PerVertex_0 Block
+ OpDecorate %frag_color Location 0
+ OpDecorate %tse_color Location 0
+ OpMemberDecorate %input_buffer 0 Offset 0
+ OpDecorate %input_buffer Block
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 0
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+ %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%gl_TessCoord = OpVariable %_ptr_Input_v3float Input
+ %uint = OpTypeInt 32 0
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+ %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1
+ %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_uint_32 = OpTypeArray %gl_PerVertex %uint_32
+%_ptr_Input__arr_gl_PerVertex_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_uint_32
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_uint_32 Input
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+ %int_1 = OpConstant %int 1
+ %uint_2 = OpConstant %uint 2
+ %int_2 = OpConstant %int 2
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex_0 = OpTypePointer Output %gl_PerVertex_0
+ %_ = OpVariable %_ptr_Output_gl_PerVertex_0 Output
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %frag_color = 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
+ %tse_color = OpVariable %_ptr_Input__arr_v4float_uint_32 Input
+%input_buffer = OpTypeStruct %v4float
+%_ptr_Uniform_input_buffer = OpTypePointer Uniform %input_buffer
+ %__0 = OpVariable %_ptr_Uniform_input_buffer Uniform
+%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %p0 = OpVariable %_ptr_Function_v4float Function
+ %p1 = OpVariable %_ptr_Function_v4float Function
+ %p2 = OpVariable %_ptr_Function_v4float Function
+ %16 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_0
+ %17 = OpLoad %float %16
+ %28 = OpAccessChain %_ptr_Input_v4float %gl_in %int_0 %int_0
+ %29 = OpLoad %v4float %28
+ %30 = OpVectorTimesScalar %v4float %29 %17
+ OpStore %p0 %30
+ %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
+ OpStore %p1 %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
+ OpStore %p2 %45
+ %49 = OpLoad %v4float %p0
+ %50 = OpLoad %v4float %p1
+ %51 = OpFAdd %v4float %49 %50
+ %52 = OpLoad %v4float %p2
+ %53 = OpFAdd %v4float %51 %52
+ %55 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %55 %53
+ %60 = OpAccessChain %_ptr_Input_v4float %tse_color %int_0
+ %61 = OpLoad %v4float %60
+ %66 = OpAccessChain %_ptr_Uniform_v4float %__0 %int_0
+ %67 = OpLoad %v4float %66
+ %68 = OpFAdd %v4float %61 %67
+ OpStore %frag_color %68
+ OpReturn
+ OpFunctionEnd
+
+[fragment shader]
+#version 450
+
+layout(location = 0) in vec4 frag_color;
+layout(location = 0) out vec4 final_color;
+
+void main() {
+ final_color = frag_color;
+}
+
+[vertex data]
+# position vert_color
+ 0/R8G8_SNORM 1/R8G8B8A8_UNORM
+
+# Red for entire frame
+# R8 G8 R8 G8 B8 A8
+ -128 -128 255 0 0 255
+ 127 127 255 0 0 255
+ -128 127 255 0 0 255
+
+ -128 -128 255 0 0 255
+ 127 127 255 0 0 255
+ 127 -128 255 0 0 255
+
+[test]
+uniform ubo 0:0 float 0 0.0 0.0 0.3 0.0
+clear
+draw arrays PATCH_LIST 0 6
+relative probe rect rgb (0.0, 0.0, 1.0, 1.0) (1.0, 0, 0.3)
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/vert_pc_entry_point.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/vert_pc_entry_point.amber
new file mode 100644
index 0000000..55a517e
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/vert_pc_entry_point.amber
@@ -0,0 +1,156 @@
+[require]
+VK_KHR_spirv_1_4
+
+[vertex shader spirv]
+; Test a vertex shader with a push constant on the OpEntryPoint.
+;
+;#version 450
+;
+;layout(push_constant) uniform pushConstants {
+; vec2 in_val_0;
+; vec2 in_val_1;
+; vec2 in_val_2;
+; vec2 in_val_3;
+;} u_pushConstants;
+;
+;void main()
+;{
+; switch(gl_VertexIndex)
+; {
+; case 0:
+; {
+; gl_Position = vec4(u_pushConstants.in_val_0, 0.0, 1.0);
+; break;
+; }
+; case 1:
+; {
+; gl_Position = vec4(u_pushConstants.in_val_1, 0.0, 1.0);
+; break;
+; }
+; case 2:
+; {
+; gl_Position = vec4(u_pushConstants.in_val_2, 0.0, 1.0);
+; break;
+; }
+; case 3:
+; {
+; gl_Position = vec4(u_pushConstants.in_val_3, 0.0, 1.0);
+; break;
+; }
+; }
+;}
+ OpCapability Shader
+%1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Vertex %main "main" %gl_VertexIndex %gl_Output %u_pushConstants
+ OpSource GLSL 450
+ OpName %main "main"
+ OpName %gl_VertexIndex "gl_VertexIndex"
+ OpName %gl_PerVertex "gl_PerVertex"
+ OpMemberName %gl_PerVertex 0 "gl_Position"
+ OpMemberName %gl_PerVertex 1 "gl_PointSize"
+ OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
+ OpMemberName %gl_PerVertex 3 "gl_CullDistance"
+ OpName %gl_Output "gl_Output"
+ OpName %pushConstants "pushConstants"
+ OpMemberName %pushConstants 0 "in_val_0"
+ OpMemberName %pushConstants 1 "in_val_1"
+ OpMemberName %pushConstants 2 "in_val_2"
+ OpMemberName %pushConstants 3 "in_val_3"
+ OpName %u_pushConstants "u_pushConstants"
+ OpDecorate %gl_VertexIndex BuiltIn VertexIndex
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
+ OpDecorate %gl_PerVertex Block
+ OpMemberDecorate %pushConstants 0 Offset 0
+ OpMemberDecorate %pushConstants 1 Offset 8
+ OpMemberDecorate %pushConstants 2 Offset 16
+ OpMemberDecorate %pushConstants 3 Offset 24
+ OpDecorate %pushConstants Block
+%type_void = OpTypeVoid
+%type_func_void = OpTypeFunction %type_void
+%sint = OpTypeInt 32 1
+%ptr_sint_input = OpTypePointer Input %sint
+%gl_VertexIndex = OpVariable %ptr_sint_input Input
+%float32 = OpTypeFloat 32
+%fvec4 = OpTypeVector %float32 4
+%uint = OpTypeInt 32 0
+%const_uint_1 = OpConstant %uint 1
+%type_array_float = OpTypeArray %float32 %const_uint_1
+%gl_PerVertex = OpTypeStruct %fvec4 %float32 %type_array_float %type_array_float
+%ptr_perVert_out = OpTypePointer Output %gl_PerVertex
+%gl_Output = OpVariable %ptr_perVert_out Output
+%const_sint_0 = OpConstant %sint 0
+%fvec2 = OpTypeVector %float32 2
+%pushConstants = OpTypeStruct %fvec2 %fvec2 %fvec2 %fvec2
+%ptr_push_const = OpTypePointer PushConstant %pushConstants
+%u_pushConstants = OpVariable %ptr_push_const PushConstant
+%ptr_pc_fvec2 = OpTypePointer PushConstant %fvec2
+%const_float32_0 = OpConstant %float32 0
+%const_float32_1 = OpConstant %float32 1
+%ptr_output_fvec4 = OpTypePointer Output %fvec4
+%const_sint_1 = OpConstant %sint 1
+%const_sint_2 = OpConstant %sint 2
+%const_sint_3 = OpConstant %sint 3
+%main = OpFunction %type_void None %type_func_void
+%5 = OpLabel
+%9 = OpLoad %sint %gl_VertexIndex
+ OpSelectionMerge %14 None
+ OpSwitch %9 %14 0 %10 1 %11 2 %12 3 %13
+%10 = OpLabel
+%31 = OpAccessChain %ptr_pc_fvec2 %u_pushConstants %const_sint_0
+%32 = OpLoad %fvec2 %31
+%35 = OpCompositeExtract %float32 %32 0
+%36 = OpCompositeExtract %float32 %32 1
+%37 = OpCompositeConstruct %fvec4 %35 %36 %const_float32_0 %const_float32_1
+%39 = OpAccessChain %ptr_output_fvec4 %gl_Output %const_sint_0
+ OpStore %39 %37
+ OpBranch %14
+%11 = OpLabel
+%42 = OpAccessChain %ptr_pc_fvec2 %u_pushConstants %const_sint_1
+%43 = OpLoad %fvec2 %42
+%44 = OpCompositeExtract %float32 %43 0
+%45 = OpCompositeExtract %float32 %43 1
+%46 = OpCompositeConstruct %fvec4 %44 %45 %const_float32_0 %const_float32_1
+%47 = OpAccessChain %ptr_output_fvec4 %gl_Output %const_sint_0
+ OpStore %47 %46
+ OpBranch %14
+%12 = OpLabel
+%50 = OpAccessChain %ptr_pc_fvec2 %u_pushConstants %const_sint_2
+%51 = OpLoad %fvec2 %50
+%52 = OpCompositeExtract %float32 %51 0
+%53 = OpCompositeExtract %float32 %51 1
+%54 = OpCompositeConstruct %fvec4 %52 %53 %const_float32_0 %const_float32_1
+%55 = OpAccessChain %ptr_output_fvec4 %gl_Output %const_sint_0
+ OpStore %55 %54
+ OpBranch %14
+%13 = OpLabel
+%58 = OpAccessChain %ptr_pc_fvec2 %u_pushConstants %const_sint_3
+%59 = OpLoad %fvec2 %58
+%60 = OpCompositeExtract %float32 %59 0
+%61 = OpCompositeExtract %float32 %59 1
+%62 = OpCompositeConstruct %fvec4 %60 %61 %const_float32_0 %const_float32_1
+%63 = OpAccessChain %ptr_output_fvec4 %gl_Output %const_sint_0
+ OpStore %63 %62
+ OpBranch %14
+%14 = OpLabel
+ OpReturn
+ OpFunctionEnd
+
+[fragment shader]
+#version 430
+layout(location = 0) out vec4 outColor;
+void main() {
+ outColor = vec4(0.5, 0.5, 0.5, 0.5);
+}
+
+[test]
+clear
+# Draw over bottom left quadrant
+uniform float 0 -1.0 -1.0 0.0 -1.0 -1.0 0.0 0.0 0.0
+draw rect -1 -1 2 2
+
+probe rect rgba (0, 0, 125, 125) (0.5 0.5 0.5 0.5)
+probe rect rgba (125, 125, 125, 125) (0.0 0.0 0.0 0.0)
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/vert_ssbo_entry_point.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/vert_ssbo_entry_point.amber
new file mode 100644
index 0000000..12be351
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/vert_ssbo_entry_point.amber
@@ -0,0 +1,99 @@
+[require]
+VK_KHR_spirv_1_4
+
+[vertex shader spirv]
+; Test a vertex shader with an SSBO in the OpEntryPoint instruction.
+;
+; #version 450
+;
+; layout(std430, binding = 0) buffer input_buffer
+; {
+; vec2 in_data[3];
+; };
+;
+; void main() {
+; gl_Position = vec4(in_data[gl_VertexIndex], 0.0, 1.0);
+; }
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Vertex %main "main" %_ %__0 %gl_VertexIndex
+ OpSource GLSL 450
+ OpName %main "main"
+ OpName %gl_PerVertex "gl_PerVertex"
+ OpMemberName %gl_PerVertex 0 "gl_Position"
+ OpMemberName %gl_PerVertex 1 "gl_PointSize"
+ OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
+ OpMemberName %gl_PerVertex 3 "gl_CullDistance"
+ OpName %_ ""
+ OpName %input_buffer "input_buffer"
+ OpMemberName %input_buffer 0 "in_data"
+ OpName %__0 ""
+ OpName %gl_VertexIndex "gl_VertexIndex"
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
+ OpDecorate %gl_PerVertex Block
+ OpDecorate %_arr_v2float_uint_3 ArrayStride 8
+ OpMemberDecorate %input_buffer 0 Offset 0
+ OpDecorate %input_buffer Block
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 0
+ OpDecorate %gl_VertexIndex BuiltIn VertexIndex
+ %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 %_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
+ %v2float = OpTypeVector %float 2
+ %uint_3 = OpConstant %uint 3
+%_arr_v2float_uint_3 = OpTypeArray %v2float %uint_3
+%input_buffer = OpTypeStruct %_arr_v2float_uint_3
+%_ptr_StorageBuffer_input_buffer = OpTypePointer StorageBuffer %input_buffer
+ %__0 = OpVariable %_ptr_StorageBuffer_input_buffer StorageBuffer
+%_ptr_Input_int = OpTypePointer Input %int
+%gl_VertexIndex = OpVariable %_ptr_Input_int Input
+%_ptr_StorageBuffer_v2float = OpTypePointer StorageBuffer %v2float
+ %float_0 = OpConstant %float 0
+ %float_1 = OpConstant %float 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %24 = OpLoad %int %gl_VertexIndex
+ %26 = OpAccessChain %_ptr_StorageBuffer_v2float %__0 %int_0 %24
+ %27 = OpLoad %v2float %26
+ %30 = OpCompositeExtract %float %27 0
+ %31 = OpCompositeExtract %float %27 1
+ %32 = OpCompositeConstruct %v4float %30 %31 %float_0 %float_1
+ %34 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %34 %32
+ OpReturn
+ OpFunctionEnd
+[fragment shader]
+#version 430
+layout(location = 0) out vec4 outColor;
+void main() {
+ outColor = vec4(0.5, 0.5, 0.5, 0.5);
+}
+
+[vertex data]
+ 0/R8G8_SNORM 1/R8G8B8A8_UNORM
+ -128 -128 255 0 0 255
+ 127 127 255 0 0 255
+ -128 127 255 0 0 255
+
+[test]
+ssbo 0:0 subdata float 0 -1.0 -1.0 1.0 -1.0 -1.0 1.0
+clear
+draw arrays TRIANGLE_LIST 0 3
+
+probe rect rgba (0, 0, 125, 125) (0.5 0.5 0.5 0.5)
+probe rect rgba (125, 125, 125, 125) (0.0 0.0 0.0 0.0)
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/vert_ubo_entry_point.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/vert_ubo_entry_point.amber
new file mode 100644
index 0000000..cdf2f66
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/vert_ubo_entry_point.amber
@@ -0,0 +1,99 @@
+[require]
+VK_KHR_spirv_1_4
+
+[vertex shader spirv]
+; Test a vertex shader with a ubo on the OpEntryPoint.
+;
+; #version 450
+;
+; layout(binding = 0) uniform input_buffer
+; {
+; vec2 in_data[3];
+; };
+;
+; void main() {
+; gl_Position = vec4(in_data[gl_VertexIndex], 0.0, 1.0);
+; }
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Vertex %main "main" %_ %__0 %gl_VertexIndex
+ OpSource GLSL 450
+ OpName %main "main"
+ OpName %gl_PerVertex "gl_PerVertex"
+ OpMemberName %gl_PerVertex 0 "gl_Position"
+ OpMemberName %gl_PerVertex 1 "gl_PointSize"
+ OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
+ OpMemberName %gl_PerVertex 3 "gl_CullDistance"
+ OpName %_ ""
+ OpName %input_buffer "input_buffer"
+ OpMemberName %input_buffer 0 "in_data"
+ OpName %__0 ""
+ OpName %gl_VertexIndex "gl_VertexIndex"
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
+ OpDecorate %gl_PerVertex Block
+ OpDecorate %_arr_v2float_uint_3 ArrayStride 16
+ OpMemberDecorate %input_buffer 0 Offset 0
+ OpDecorate %input_buffer Block
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 0
+ OpDecorate %gl_VertexIndex BuiltIn VertexIndex
+ %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 %_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
+ %v2float = OpTypeVector %float 2
+ %uint_3 = OpConstant %uint 3
+%_arr_v2float_uint_3 = OpTypeArray %v2float %uint_3
+%input_buffer = OpTypeStruct %_arr_v2float_uint_3
+%_ptr_Uniform_input_buffer = OpTypePointer Uniform %input_buffer
+ %__0 = OpVariable %_ptr_Uniform_input_buffer Uniform
+%_ptr_Input_int = OpTypePointer Input %int
+%gl_VertexIndex = OpVariable %_ptr_Input_int Input
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+ %float_0 = OpConstant %float 0
+ %float_1 = OpConstant %float 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %24 = OpLoad %int %gl_VertexIndex
+ %26 = OpAccessChain %_ptr_Uniform_v2float %__0 %int_0 %24
+ %27 = OpLoad %v2float %26
+ %30 = OpCompositeExtract %float %27 0
+ %31 = OpCompositeExtract %float %27 1
+ %32 = OpCompositeConstruct %v4float %30 %31 %float_0 %float_1
+ %34 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %34 %32
+ OpReturn
+ OpFunctionEnd
+[fragment shader]
+#version 430
+layout(location = 0) out vec4 outColor;
+void main() {
+ outColor = vec4(0.5, 0.5, 0.5, 0.5);
+}
+
+[vertex data]
+ 0/R8G8_SNORM 1/R8G8B8A8_UNORM
+ -128 -128 255 0 0 255
+ 127 127 255 0 0 255
+ -128 127 255 0 0 255
+
+[test]
+uniform ubo 0:0 float 0 -1.0 -1.0 0.0 0.0 1.0 -1.0 0.0 0.0 -1.0 1.0
+clear
+draw arrays TRIANGLE_LIST 0 3
+
+probe rect rgba (0, 0, 125, 125) (0.5 0.5 0.5 0.5)
+probe rect rgba (125, 125, 125, 125) (0.0 0.0 0.0 0.0)
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/counter_buffer.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/counter_buffer.amber
new file mode 100644
index 0000000..49dc7e5
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/counter_buffer.amber
@@ -0,0 +1,104 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; Test that the HlslCounterBufferGOOGLE/CounterBuffer decoration is accepted.
+; Generated with
+;
+;
+; RWStructuredBuffer<uint4> sbuf_rw_i;
+; RWStructuredBuffer<uint4> sbuf_rw_d;
+;
+; void main()
+; {
+; sbuf_rw_i[0].x = sbuf_rw_i.IncrementCounter();
+; sbuf_rw_d[0].x = sbuf_rw_d.DecrementCounter();
+; }
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main" %sbuf_rw_i_0 %sbuf_rw_i_count_0 %sbuf_rw_d %sbuf_rw_d_count
+ OpExecutionMode %main LocalSize 1 1 1
+ OpSource HLSL 500
+ OpName %main "main"
+ OpName %sbuf_rw_i "sbuf_rw_i"
+ OpMemberName %sbuf_rw_i 0 "@data"
+ OpName %sbuf_rw_i_0 "sbuf_rw_i"
+ OpName %sbuf_rw_i_count "sbuf_rw_i@count"
+ OpMemberName %sbuf_rw_i_count 0 "@count"
+ OpName %sbuf_rw_i_count_0 "sbuf_rw_i@count"
+ OpName %sbuf_rw_d "sbuf_rw_d"
+ OpName %sbuf_rw_d_count "sbuf_rw_d@count"
+ OpDecorate %_runtimearr_v4uint ArrayStride 16
+ OpMemberDecorate %sbuf_rw_i 0 Offset 0
+ OpDecorate %sbuf_rw_i Block
+ OpDecorate %sbuf_rw_i_0 DescriptorSet 0
+ OpDecorate %sbuf_rw_i_0 Binding 0
+ OpMemberDecorate %sbuf_rw_i_count 0 Offset 0
+ OpDecorate %sbuf_rw_i_count Block
+ OpDecorate %sbuf_rw_i_count_0 DescriptorSet 0
+ OpDecorate %sbuf_rw_i_count_0 Binding 1
+ OpDecorate %sbuf_rw_d DescriptorSet 0
+ OpDecorate %sbuf_rw_d Binding 2
+ OpDecorate %sbuf_rw_d_count DescriptorSet 0
+ OpDecorate %sbuf_rw_d_count Binding 3
+ OpDecorateId %sbuf_rw_i_0 CounterBuffer %sbuf_rw_i_count_0
+ OpDecorateId %sbuf_rw_d CounterBuffer %sbuf_rw_d_count
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v4uint = OpTypeVector %uint 4
+%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint
+ %sbuf_rw_i = OpTypeStruct %_runtimearr_v4uint
+%_ptr_StorageBuffer_sbuf_rw_i = OpTypePointer StorageBuffer %sbuf_rw_i
+%sbuf_rw_i_0 = OpVariable %_ptr_StorageBuffer_sbuf_rw_i StorageBuffer
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+%sbuf_rw_i_count = OpTypeStruct %uint
+%_ptr_StorageBuffer_sbuf_rw_i_count = OpTypePointer StorageBuffer %sbuf_rw_i_count
+%sbuf_rw_i_count_0 = OpVariable %_ptr_StorageBuffer_sbuf_rw_i_count StorageBuffer
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+ %uint_1 = OpConstant %uint 1
+ %uint_0 = OpConstant %uint 0
+ %sbuf_rw_d = OpVariable %_ptr_StorageBuffer_sbuf_rw_i StorageBuffer
+%sbuf_rw_d_count = OpVariable %_ptr_StorageBuffer_sbuf_rw_i_count StorageBuffer
+%uint_4294967295 = OpConstant %uint 4294967295
+ %int_n1 = OpConstant %int -1
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %34 = OpAccessChain %_ptr_StorageBuffer_uint %sbuf_rw_i_count_0 %int_0
+ %35 = OpAtomicIAdd %uint %34 %uint_1 %uint_0 %uint_1
+ %36 = OpAccessChain %_ptr_StorageBuffer_uint %sbuf_rw_i_0 %int_0 %int_0 %uint_0
+ OpStore %36 %35
+ %37 = OpAccessChain %_ptr_StorageBuffer_uint %sbuf_rw_d_count %int_0
+ %38 = OpAtomicIAdd %uint %37 %uint_1 %uint_0 %uint_4294967295
+ %39 = OpIAdd %uint %38 %int_n1
+ %40 = OpAccessChain %_ptr_StorageBuffer_uint %sbuf_rw_d %int_0 %int_0 %uint_0
+ OpStore %40 %39
+ OpReturn
+ OpFunctionEnd
+[test]
+# sbuf_rw_i_0
+ssbo 0:0 16
+# sbuf_rw_i_count_0
+ssbo 0:1 4
+# sbuf_rw_d
+ssbo 0:2 16
+# sbuf_rw_d_count
+ssbo 0:3 4
+
+ssbo 0:0 subdata uint 0 200 200 200 200
+ssbo 0:1 subdata uint 0 8
+ssbo 0:2 subdata uint 0 200 200 200 200
+ssbo 0:3 subdata uint 0 8
+
+compute entrypoint main
+compute 1 1 1
+
+# Check the storage buffer.
+probe ssbo uint 0:0 0 == 8 200 200 200
+probe ssbo uint 0:2 0 == 7 200 200 200
+
+# Check the counters.
+probe ssbo uint 0:1 0 == 9
+probe ssbo uint 0:3 0 == 7
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string.amber
new file mode 100644
index 0000000..8eff2e96
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string.amber
@@ -0,0 +1,48 @@
+[require]
+VK_KHR_spirv_1_4
+
+[vertex shader passthrough]
+
+[fragment shader spirv]
+; Test that OpDecorateStringGOOGLE/OpDecorateString is accepted.
+; Generated with
+;
+; float4 main(uint pos : FOO) : SV_Target0
+; {
+; float4 result = 0.5;
+; return result;
+; }
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %pos %_entryPointOutput
+ OpExecutionMode %main OriginUpperLeft
+ OpSource HLSL 500
+ OpName %main "main"
+ OpName %pos "pos"
+ OpName %_entryPointOutput "@entryPointOutput"
+ OpDecorate %pos Flat
+ OpDecorate %pos Location 0
+ OpDecorateString %pos UserSemantic "FOO"
+ OpDecorate %_entryPointOutput Location 0
+ OpDecorateString %_entryPointOutput UserSemantic "SV_TARGET0"
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+ %float_0_5 = OpConstant %float 0.5
+ %17 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5
+%_ptr_Input_uint = OpTypePointer Input %uint
+ %pos = OpVariable %_ptr_Input_uint Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%_entryPointOutput = OpVariable %_ptr_Output_v4float Output
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ OpStore %_entryPointOutput %17
+ OpReturn
+ OpFunctionEnd
+[test]
+draw rect -1 -1 2 2
+
+probe rect rgba (0, 0, 250, 250) (0.5, 0.5, 0.5, 0.5)
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/loop_control/iteration_multiple.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/loop_control/iteration_multiple.amber
new file mode 100644
index 0000000..476e06a
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/loop_control/iteration_multiple.amber
@@ -0,0 +1,118 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; Use the IterationMultiple loop control.
+; Generated from with modified loop control:
+;
+; #version 430
+;
+;
+; layout(std430, binding = 0) buffer input_buffer
+; {
+; int in_size;
+; ivec4 data_SSBO[];
+; };
+;
+; layout(std430, binding = 1) buffer output_buffer
+; {
+; int out_size;
+; ivec4 out_SSBO[];
+; };
+;
+; void main() {
+; for( int i = 0; i < in_size; ++i ) {
+; out_SSBO[i] = data_SSBO[i];
+; }
+; }
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main" %_ %__0
+ OpExecutionMode %main LocalSize 1 1 1
+ OpSource GLSL 430
+ OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"
+ OpSourceExtension "GL_GOOGLE_include_directive"
+ OpName %main "main"
+ OpName %i "i"
+ OpName %input_buffer "input_buffer"
+ OpMemberName %input_buffer 0 "in_size"
+ OpMemberName %input_buffer 1 "data_SSBO"
+ OpName %_ ""
+ OpName %output_buffer "output_buffer"
+ OpMemberName %output_buffer 0 "out_size"
+ OpMemberName %output_buffer 1 "out_SSBO"
+ OpName %__0 ""
+ OpDecorate %_runtimearr_v4int ArrayStride 16
+ OpMemberDecorate %input_buffer 0 Offset 0
+ OpMemberDecorate %input_buffer 1 Offset 16
+ OpDecorate %input_buffer Block
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %_runtimearr_v4int_0 ArrayStride 16
+ OpMemberDecorate %output_buffer 0 Offset 0
+ OpMemberDecorate %output_buffer 1 Offset 16
+ OpDecorate %output_buffer Block
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 1
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+ %int_0 = OpConstant %int 0
+ %v4int = OpTypeVector %int 4
+%_runtimearr_v4int = OpTypeRuntimeArray %v4int
+%input_buffer = OpTypeStruct %int %_runtimearr_v4int
+%_ptr_StorageBuffer_input_buffer = OpTypePointer StorageBuffer %input_buffer
+ %_ = OpVariable %_ptr_StorageBuffer_input_buffer StorageBuffer
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+ %bool = OpTypeBool
+%_runtimearr_v4int_0 = OpTypeRuntimeArray %v4int
+%output_buffer = OpTypeStruct %int %_runtimearr_v4int_0
+%_ptr_StorageBuffer_output_buffer = OpTypePointer StorageBuffer %output_buffer
+ %__0 = OpVariable %_ptr_StorageBuffer_output_buffer StorageBuffer
+ %int_1 = OpConstant %int 1
+%_ptr_StorageBuffer_v4int = OpTypePointer StorageBuffer %v4int
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %i = OpVariable %_ptr_Function_int Function
+ OpStore %i %int_0
+ OpBranch %10
+ %10 = OpLabel
+ OpLoopMerge %12 %13 IterationMultiple 3
+ OpBranch %14
+ %14 = OpLabel
+ %15 = OpLoad %int %i
+ %23 = OpAccessChain %_ptr_StorageBuffer_int %_ %int_0
+ %24 = OpLoad %int %23
+ %26 = OpSLessThan %bool %15 %24
+ OpBranchConditional %26 %11 %12
+ %11 = OpLabel
+ %32 = OpLoad %int %i
+ %33 = OpLoad %int %i
+ %35 = OpAccessChain %_ptr_StorageBuffer_v4int %_ %int_1 %33
+ %36 = OpLoad %v4int %35
+ %37 = OpAccessChain %_ptr_StorageBuffer_v4int %__0 %int_1 %32
+ OpStore %37 %36
+ OpBranch %13
+ %13 = OpLabel
+ %38 = OpLoad %int %i
+ %39 = OpIAdd %int %38 %int_1
+ OpStore %i %39
+ OpBranch %10
+ %12 = OpLabel
+ OpReturn
+ OpFunctionEnd
+
+[test]
+ssbo 0:0 112
+ssbo 0:0 subdata int 0 6 0 0 0
+ssbo 0:0 subdata int 16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
+ssbo 0:1 112
+ssbo 0:1 subdata int 0 6 0 0 0
+ssbo 0:1 subdata int 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo int 0:1 16 == 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/loop_control/max_iterations.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/loop_control/max_iterations.amber
new file mode 100644
index 0000000..e85225b
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/loop_control/max_iterations.amber
@@ -0,0 +1,118 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; Use the MaxIterations loop control.
+; Generated from with modified loop control:
+;
+; #version 430
+;
+;
+; layout(std430, binding = 0) buffer input_buffer
+; {
+; int in_size;
+; ivec4 data_SSBO[];
+; };
+;
+; layout(std430, binding = 1) buffer output_buffer
+; {
+; int out_size;
+; ivec4 out_SSBO[];
+; };
+;
+; void main() {
+; for( int i = 0; i < in_size; ++i ) {
+; out_SSBO[i] = data_SSBO[i];
+; }
+; }
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main" %_ %__0
+ OpExecutionMode %main LocalSize 1 1 1
+ OpSource GLSL 430
+ OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"
+ OpSourceExtension "GL_GOOGLE_include_directive"
+ OpName %main "main"
+ OpName %i "i"
+ OpName %input_buffer "input_buffer"
+ OpMemberName %input_buffer 0 "in_size"
+ OpMemberName %input_buffer 1 "data_SSBO"
+ OpName %_ ""
+ OpName %output_buffer "output_buffer"
+ OpMemberName %output_buffer 0 "out_size"
+ OpMemberName %output_buffer 1 "out_SSBO"
+ OpName %__0 ""
+ OpDecorate %_runtimearr_v4int ArrayStride 16
+ OpMemberDecorate %input_buffer 0 Offset 0
+ OpMemberDecorate %input_buffer 1 Offset 16
+ OpDecorate %input_buffer Block
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %_runtimearr_v4int_0 ArrayStride 16
+ OpMemberDecorate %output_buffer 0 Offset 0
+ OpMemberDecorate %output_buffer 1 Offset 16
+ OpDecorate %output_buffer Block
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 1
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+ %int_0 = OpConstant %int 0
+ %v4int = OpTypeVector %int 4
+%_runtimearr_v4int = OpTypeRuntimeArray %v4int
+%input_buffer = OpTypeStruct %int %_runtimearr_v4int
+%_ptr_StorageBuffer_input_buffer = OpTypePointer StorageBuffer %input_buffer
+ %_ = OpVariable %_ptr_StorageBuffer_input_buffer StorageBuffer
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+ %bool = OpTypeBool
+%_runtimearr_v4int_0 = OpTypeRuntimeArray %v4int
+%output_buffer = OpTypeStruct %int %_runtimearr_v4int_0
+%_ptr_StorageBuffer_output_buffer = OpTypePointer StorageBuffer %output_buffer
+ %__0 = OpVariable %_ptr_StorageBuffer_output_buffer StorageBuffer
+ %int_1 = OpConstant %int 1
+%_ptr_StorageBuffer_v4int = OpTypePointer StorageBuffer %v4int
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %i = OpVariable %_ptr_Function_int Function
+ OpStore %i %int_0
+ OpBranch %10
+ %10 = OpLabel
+ OpLoopMerge %12 %13 MaxIterations 6
+ OpBranch %14
+ %14 = OpLabel
+ %15 = OpLoad %int %i
+ %23 = OpAccessChain %_ptr_StorageBuffer_int %_ %int_0
+ %24 = OpLoad %int %23
+ %26 = OpSLessThan %bool %15 %24
+ OpBranchConditional %26 %11 %12
+ %11 = OpLabel
+ %32 = OpLoad %int %i
+ %33 = OpLoad %int %i
+ %35 = OpAccessChain %_ptr_StorageBuffer_v4int %_ %int_1 %33
+ %36 = OpLoad %v4int %35
+ %37 = OpAccessChain %_ptr_StorageBuffer_v4int %__0 %int_1 %32
+ OpStore %37 %36
+ OpBranch %13
+ %13 = OpLabel
+ %38 = OpLoad %int %i
+ %39 = OpIAdd %int %38 %int_1
+ OpStore %i %39
+ OpBranch %10
+ %12 = OpLabel
+ OpReturn
+ OpFunctionEnd
+
+[test]
+ssbo 0:0 112
+ssbo 0:0 subdata int 0 6 0 0 0
+ssbo 0:0 subdata int 16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
+ssbo 0:1 112
+ssbo 0:1 subdata int 0 6 0 0 0
+ssbo 0:1 subdata int 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo int 0:1 16 == 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/loop_control/min_iterations.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/loop_control/min_iterations.amber
new file mode 100644
index 0000000..1b3dbf8
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/loop_control/min_iterations.amber
@@ -0,0 +1,118 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; Use the MinIterations loop control.
+; Generated from with modified loop control:
+;
+; #version 430
+;
+;
+; layout(std430, binding = 0) buffer input_buffer
+; {
+; int in_size;
+; ivec4 data_SSBO[];
+; };
+;
+; layout(std430, binding = 1) buffer output_buffer
+; {
+; int out_size;
+; ivec4 out_SSBO[];
+; };
+;
+; void main() {
+; for( int i = 0; i < in_size; ++i ) {
+; out_SSBO[i] = data_SSBO[i];
+; }
+; }
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main" %_ %__0
+ OpExecutionMode %main LocalSize 1 1 1
+ OpSource GLSL 430
+ OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"
+ OpSourceExtension "GL_GOOGLE_include_directive"
+ OpName %main "main"
+ OpName %i "i"
+ OpName %input_buffer "input_buffer"
+ OpMemberName %input_buffer 0 "in_size"
+ OpMemberName %input_buffer 1 "data_SSBO"
+ OpName %_ ""
+ OpName %output_buffer "output_buffer"
+ OpMemberName %output_buffer 0 "out_size"
+ OpMemberName %output_buffer 1 "out_SSBO"
+ OpName %__0 ""
+ OpDecorate %_runtimearr_v4int ArrayStride 16
+ OpMemberDecorate %input_buffer 0 Offset 0
+ OpMemberDecorate %input_buffer 1 Offset 16
+ OpDecorate %input_buffer Block
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %_runtimearr_v4int_0 ArrayStride 16
+ OpMemberDecorate %output_buffer 0 Offset 0
+ OpMemberDecorate %output_buffer 1 Offset 16
+ OpDecorate %output_buffer Block
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 1
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+ %int_0 = OpConstant %int 0
+ %v4int = OpTypeVector %int 4
+%_runtimearr_v4int = OpTypeRuntimeArray %v4int
+%input_buffer = OpTypeStruct %int %_runtimearr_v4int
+%_ptr_StorageBuffer_input_buffer = OpTypePointer StorageBuffer %input_buffer
+ %_ = OpVariable %_ptr_StorageBuffer_input_buffer StorageBuffer
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+ %bool = OpTypeBool
+%_runtimearr_v4int_0 = OpTypeRuntimeArray %v4int
+%output_buffer = OpTypeStruct %int %_runtimearr_v4int_0
+%_ptr_StorageBuffer_output_buffer = OpTypePointer StorageBuffer %output_buffer
+ %__0 = OpVariable %_ptr_StorageBuffer_output_buffer StorageBuffer
+ %int_1 = OpConstant %int 1
+%_ptr_StorageBuffer_v4int = OpTypePointer StorageBuffer %v4int
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %i = OpVariable %_ptr_Function_int Function
+ OpStore %i %int_0
+ OpBranch %10
+ %10 = OpLabel
+ OpLoopMerge %12 %13 MinIterations 4
+ OpBranch %14
+ %14 = OpLabel
+ %15 = OpLoad %int %i
+ %23 = OpAccessChain %_ptr_StorageBuffer_int %_ %int_0
+ %24 = OpLoad %int %23
+ %26 = OpSLessThan %bool %15 %24
+ OpBranchConditional %26 %11 %12
+ %11 = OpLabel
+ %32 = OpLoad %int %i
+ %33 = OpLoad %int %i
+ %35 = OpAccessChain %_ptr_StorageBuffer_v4int %_ %int_1 %33
+ %36 = OpLoad %v4int %35
+ %37 = OpAccessChain %_ptr_StorageBuffer_v4int %__0 %int_1 %32
+ OpStore %37 %36
+ OpBranch %13
+ %13 = OpLabel
+ %38 = OpLoad %int %i
+ %39 = OpIAdd %int %38 %int_1
+ OpStore %i %39
+ OpBranch %10
+ %12 = OpLabel
+ OpReturn
+ OpFunctionEnd
+
+[test]
+ssbo 0:0 112
+ssbo 0:0 subdata int 0 6 0 0 0
+ssbo 0:0 subdata int 16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
+ssbo 0:1 112
+ssbo 0:1 subdata int 0 6 0 0 0
+ssbo 0:1 subdata int 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo int 0:1 16 == 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/loop_control/partial_count.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/loop_control/partial_count.amber
new file mode 100644
index 0000000..6dd2516
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/loop_control/partial_count.amber
@@ -0,0 +1,118 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; Use the PartialCount loop control.
+; Generated from with modified loop control:
+;
+; #version 430
+;
+;
+; layout(std430, binding = 0) buffer input_buffer
+; {
+; int in_size;
+; ivec4 data_SSBO[];
+; };
+;
+; layout(std430, binding = 1) buffer output_buffer
+; {
+; int out_size;
+; ivec4 out_SSBO[];
+; };
+;
+; void main() {
+; for( int i = 0; i < in_size; ++i ) {
+; out_SSBO[i] = data_SSBO[i];
+; }
+; }
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main" %_ %__0
+ OpExecutionMode %main LocalSize 1 1 1
+ OpSource GLSL 430
+ OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"
+ OpSourceExtension "GL_GOOGLE_include_directive"
+ OpName %main "main"
+ OpName %i "i"
+ OpName %input_buffer "input_buffer"
+ OpMemberName %input_buffer 0 "in_size"
+ OpMemberName %input_buffer 1 "data_SSBO"
+ OpName %_ ""
+ OpName %output_buffer "output_buffer"
+ OpMemberName %output_buffer 0 "out_size"
+ OpMemberName %output_buffer 1 "out_SSBO"
+ OpName %__0 ""
+ OpDecorate %_runtimearr_v4int ArrayStride 16
+ OpMemberDecorate %input_buffer 0 Offset 0
+ OpMemberDecorate %input_buffer 1 Offset 16
+ OpDecorate %input_buffer Block
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %_runtimearr_v4int_0 ArrayStride 16
+ OpMemberDecorate %output_buffer 0 Offset 0
+ OpMemberDecorate %output_buffer 1 Offset 16
+ OpDecorate %output_buffer Block
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 1
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+ %int_0 = OpConstant %int 0
+ %v4int = OpTypeVector %int 4
+%_runtimearr_v4int = OpTypeRuntimeArray %v4int
+%input_buffer = OpTypeStruct %int %_runtimearr_v4int
+%_ptr_StorageBuffer_input_buffer = OpTypePointer StorageBuffer %input_buffer
+ %_ = OpVariable %_ptr_StorageBuffer_input_buffer StorageBuffer
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+ %bool = OpTypeBool
+%_runtimearr_v4int_0 = OpTypeRuntimeArray %v4int
+%output_buffer = OpTypeStruct %int %_runtimearr_v4int_0
+%_ptr_StorageBuffer_output_buffer = OpTypePointer StorageBuffer %output_buffer
+ %__0 = OpVariable %_ptr_StorageBuffer_output_buffer StorageBuffer
+ %int_1 = OpConstant %int 1
+%_ptr_StorageBuffer_v4int = OpTypePointer StorageBuffer %v4int
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %i = OpVariable %_ptr_Function_int Function
+ OpStore %i %int_0
+ OpBranch %10
+ %10 = OpLabel
+ OpLoopMerge %12 %13 PartialCount 4
+ OpBranch %14
+ %14 = OpLabel
+ %15 = OpLoad %int %i
+ %23 = OpAccessChain %_ptr_StorageBuffer_int %_ %int_0
+ %24 = OpLoad %int %23
+ %26 = OpSLessThan %bool %15 %24
+ OpBranchConditional %26 %11 %12
+ %11 = OpLabel
+ %32 = OpLoad %int %i
+ %33 = OpLoad %int %i
+ %35 = OpAccessChain %_ptr_StorageBuffer_v4int %_ %int_1 %33
+ %36 = OpLoad %v4int %35
+ %37 = OpAccessChain %_ptr_StorageBuffer_v4int %__0 %int_1 %32
+ OpStore %37 %36
+ OpBranch %13
+ %13 = OpLabel
+ %38 = OpLoad %int %i
+ %39 = OpIAdd %int %38 %int_1
+ OpStore %i %39
+ OpBranch %10
+ %12 = OpLabel
+ OpReturn
+ OpFunctionEnd
+
+[test]
+ssbo 0:0 112
+ssbo 0:0 subdata int 0 6 0 0 0
+ssbo 0:0 subdata int 16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
+ssbo 0:1 112
+ssbo 0:1 subdata int 0 6 0 0 0
+ssbo 0:1 subdata int 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo int 0:1 16 == 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/loop_control/peel_count.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/loop_control/peel_count.amber
new file mode 100644
index 0000000..fd9d0dc
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/loop_control/peel_count.amber
@@ -0,0 +1,118 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; Use the PeelCount loop control.
+; Generated from with modified loop control:
+;
+; #version 430
+;
+;
+; layout(std430, binding = 0) buffer input_buffer
+; {
+; int in_size;
+; ivec4 data_SSBO[];
+; };
+;
+; layout(std430, binding = 1) buffer output_buffer
+; {
+; int out_size;
+; ivec4 out_SSBO[];
+; };
+;
+; void main() {
+; for( int i = 0; i < in_size; ++i ) {
+; out_SSBO[i] = data_SSBO[i];
+; }
+; }
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main" %_ %__0
+ OpExecutionMode %main LocalSize 1 1 1
+ OpSource GLSL 430
+ OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"
+ OpSourceExtension "GL_GOOGLE_include_directive"
+ OpName %main "main"
+ OpName %i "i"
+ OpName %input_buffer "input_buffer"
+ OpMemberName %input_buffer 0 "in_size"
+ OpMemberName %input_buffer 1 "data_SSBO"
+ OpName %_ ""
+ OpName %output_buffer "output_buffer"
+ OpMemberName %output_buffer 0 "out_size"
+ OpMemberName %output_buffer 1 "out_SSBO"
+ OpName %__0 ""
+ OpDecorate %_runtimearr_v4int ArrayStride 16
+ OpMemberDecorate %input_buffer 0 Offset 0
+ OpMemberDecorate %input_buffer 1 Offset 16
+ OpDecorate %input_buffer Block
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %_runtimearr_v4int_0 ArrayStride 16
+ OpMemberDecorate %output_buffer 0 Offset 0
+ OpMemberDecorate %output_buffer 1 Offset 16
+ OpDecorate %output_buffer Block
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 1
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+ %int_0 = OpConstant %int 0
+ %v4int = OpTypeVector %int 4
+%_runtimearr_v4int = OpTypeRuntimeArray %v4int
+%input_buffer = OpTypeStruct %int %_runtimearr_v4int
+%_ptr_StorageBuffer_input_buffer = OpTypePointer StorageBuffer %input_buffer
+ %_ = OpVariable %_ptr_StorageBuffer_input_buffer StorageBuffer
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+ %bool = OpTypeBool
+%_runtimearr_v4int_0 = OpTypeRuntimeArray %v4int
+%output_buffer = OpTypeStruct %int %_runtimearr_v4int_0
+%_ptr_StorageBuffer_output_buffer = OpTypePointer StorageBuffer %output_buffer
+ %__0 = OpVariable %_ptr_StorageBuffer_output_buffer StorageBuffer
+ %int_1 = OpConstant %int 1
+%_ptr_StorageBuffer_v4int = OpTypePointer StorageBuffer %v4int
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %i = OpVariable %_ptr_Function_int Function
+ OpStore %i %int_0
+ OpBranch %10
+ %10 = OpLabel
+ OpLoopMerge %12 %13 PeelCount 2
+ OpBranch %14
+ %14 = OpLabel
+ %15 = OpLoad %int %i
+ %23 = OpAccessChain %_ptr_StorageBuffer_int %_ %int_0
+ %24 = OpLoad %int %23
+ %26 = OpSLessThan %bool %15 %24
+ OpBranchConditional %26 %11 %12
+ %11 = OpLabel
+ %32 = OpLoad %int %i
+ %33 = OpLoad %int %i
+ %35 = OpAccessChain %_ptr_StorageBuffer_v4int %_ %int_1 %33
+ %36 = OpLoad %v4int %35
+ %37 = OpAccessChain %_ptr_StorageBuffer_v4int %__0 %int_1 %32
+ OpStore %37 %36
+ OpBranch %13
+ %13 = OpLabel
+ %38 = OpLoad %int %i
+ %39 = OpIAdd %int %38 %int_1
+ OpStore %i %39
+ OpBranch %10
+ %12 = OpLabel
+ OpReturn
+ OpFunctionEnd
+
+[test]
+ssbo 0:0 112
+ssbo 0:0 subdata int 0 6 0 0 0
+ssbo 0:0 subdata int 16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
+ssbo 0:1 112
+ssbo 0:1 subdata int 0 6 0 0 0
+ssbo 0:1 subdata int 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo int 0:1 16 == 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/nonwritable/function_2_nonwritable.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/nonwritable/function_2_nonwritable.amber
new file mode 100644
index 0000000..c7c2aac
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/nonwritable/function_2_nonwritable.amber
@@ -0,0 +1,93 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_storage_buffer_storage_class
+
+[compute shader spirv]
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %out_var %in_var %gid_var
+OpExecutionMode %main LocalSize 4 4 1
+
+OpDecorate %uint_rta ArrayStride 4
+OpDecorate %struct Block
+OpMemberDecorate %struct 0 Offset 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+
+OpDecorate %func_var NonWritable
+
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%uint = OpTypeInt 32 0
+%uint3 = OpTypeVector %uint 3
+%uint_0 = OpConstant %uint 0
+%uint_1 = OpConstant %uint 1
+%uint_2 = OpConstant %uint 2
+%uint_3 = OpConstant %uint 3
+%uint_4 = OpConstant %uint 4
+%uint_5 = OpConstant %uint 5
+%uint_6 = OpConstant %uint 6
+%uint_7 = OpConstant %uint 7
+%uint_8 = OpConstant %uint 8
+%uint_9 = OpConstant %uint 9
+%uint_10 = OpConstant %uint 10
+%uint_11 = OpConstant %uint 11
+%uint_12 = OpConstant %uint 12
+%uint_13 = OpConstant %uint 13
+%uint_14 = OpConstant %uint 14
+%uint_15 = OpConstant %uint 15
+%uint_array_4 = OpTypeArray %uint %uint_4
+%array_array_4 = OpTypeArray %uint_array_4 %uint_4
+
+%const_array_r_0 = OpConstantComposite %uint_array_4 %uint_15 %uint_14 %uint_13 %uint_12
+%const_array_r_1 = OpConstantComposite %uint_array_4 %uint_11 %uint_10 %uint_9 %uint_8
+%const_array_r_2 = OpConstantComposite %uint_array_4 %uint_7 %uint_6 %uint_5 %uint_4
+%const_array_r_3 = OpConstantComposite %uint_array_4 %uint_3 %uint_2 %uint_1 %uint_0
+%const_array_r = OpConstantComposite %array_array_4 %const_array_r_0 %const_array_r_1 %const_array_r_2 %const_array_r_3
+
+%ptr_array_array_function = OpTypePointer Function %array_array_4
+%ptr_func_uint = OpTypePointer Function %uint
+%uint_rta = OpTypeRuntimeArray %uint
+%struct = OpTypeStruct %uint_rta
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
+%out_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%in_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%ptr_ssbo_uint = OpTypePointer StorageBuffer %uint
+%ptr_input_uint3 = OpTypePointer Input %uint3
+%gid_var = OpVariable %ptr_input_uint3 Input
+
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%func_var = OpVariable %ptr_array_array_function Function %const_array_r
+%gid = OpLoad %uint3 %gid_var
+%gid_x = OpCompositeExtract %uint %gid 0
+%gid_y = OpCompositeExtract %uint %gid 1
+%x_modifier = OpIMul %uint %gid_x %uint_4
+%idx = OpIAdd %uint %x_modifier %gid_y
+%in_gep = OpAccessChain %ptr_ssbo_uint %in_var %uint_0 %idx
+%ld1 = OpLoad %uint %in_gep
+%v_gep = OpAccessChain %ptr_func_uint %func_var %gid_x %gid_y
+%ld2 = OpLoad %uint %v_gep
+%add = OpIAdd %uint %ld1 %ld2
+%out_gep = OpAccessChain %ptr_ssbo_uint %out_var %uint_0 %idx
+OpStore %out_gep %add
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
+ssbo 0:1 64
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:1 0 == 16 16 16 16
+probe ssbo uint 0:1 16 == 16 16 16 16
+probe ssbo uint 0:1 32 == 16 16 16 16
+probe ssbo uint 0:1 48 == 16 16 16 16
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/nonwritable/function_nonwritable.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/nonwritable/function_nonwritable.amber
new file mode 100644
index 0000000..e83ff19
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/nonwritable/function_nonwritable.amber
@@ -0,0 +1,112 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_storage_buffer_storage_class
+
+[compute shader spirv]
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %out_var
+OpExecutionMode %main LocalSize 1 1 1
+
+OpDecorate %uint_rta ArrayStride 4
+OpDecorate %struct Block
+OpMemberDecorate %struct 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 0
+
+OpDecorate %func_var1 NonWritable
+OpDecorate %func_var2 NonWritable
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%uint = OpTypeInt 32 0
+%uint_0 = OpConstant %uint 0
+%uint_1 = OpConstant %uint 1
+%uint_2 = OpConstant %uint 2
+%uint_3 = OpConstant %uint 3
+%uint_4 = OpConstant %uint 4
+%uint_5 = OpConstant %uint 5
+%uint_6 = OpConstant %uint 6
+%uint_7 = OpConstant %uint 7
+%uint_8 = OpConstant %uint 8
+%uint_9 = OpConstant %uint 9
+%uint_10 = OpConstant %uint 10
+%uint_11 = OpConstant %uint 11
+%uint_12 = OpConstant %uint 12
+%uint_13 = OpConstant %uint 13
+%uint_14 = OpConstant %uint 14
+%uint_15 = OpConstant %uint 15
+%uint_array_4 = OpTypeArray %uint %uint_4
+%array_array_4 = OpTypeArray %uint_array_4 %uint_4
+
+%const_array_f_0 = OpConstantComposite %uint_array_4 %uint_0 %uint_1 %uint_2 %uint_3
+%const_array_f_1 = OpConstantComposite %uint_array_4 %uint_4 %uint_5 %uint_6 %uint_7
+%const_array_f_2 = OpConstantComposite %uint_array_4 %uint_8 %uint_9 %uint_10 %uint_11
+%const_array_f_3 = OpConstantComposite %uint_array_4 %uint_12 %uint_13 %uint_14 %uint_15
+%const_array_f = OpConstantComposite %array_array_4 %const_array_f_0 %const_array_f_1 %const_array_f_2 %const_array_f_3
+
+%const_array_r_0 = OpConstantComposite %uint_array_4 %uint_15 %uint_14 %uint_13 %uint_12
+%const_array_r_1 = OpConstantComposite %uint_array_4 %uint_11 %uint_10 %uint_9 %uint_8
+%const_array_r_2 = OpConstantComposite %uint_array_4 %uint_7 %uint_6 %uint_5 %uint_4
+%const_array_r_3 = OpConstantComposite %uint_array_4 %uint_3 %uint_2 %uint_1 %uint_0
+%const_array_r = OpConstantComposite %array_array_4 %const_array_r_0 %const_array_r_1 %const_array_r_2 %const_array_r_3
+
+%ptr_array_array_function = OpTypePointer Function %array_array_4
+%ptr_func_uint = OpTypePointer Function %uint
+%uint_rta = OpTypeRuntimeArray %uint
+%struct = OpTypeStruct %uint_rta
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
+%out_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%ptr_ssbo_uint = OpTypePointer StorageBuffer %uint
+
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%func_var1 = OpVariable %ptr_array_array_function Function %const_array_f
+%func_var2 = OpVariable %ptr_array_array_function Function %const_array_r
+OpBranch %outer_loop
+
+%outer_loop = OpLabel
+%i = OpPhi %uint %uint_0 %entry %inc_i %outer_latch
+%inc_i = OpIAdd %uint %i %uint_1
+%outer_eq = OpIEqual %bool %inc_i %uint_4
+OpLoopMerge %outer_merge %outer_latch None
+OpBranch %inner_loop
+
+%inner_loop = OpLabel
+%j = OpPhi %uint %uint_0 %outer_loop %inc_j %inner_loop
+%inc_j = OpIAdd %uint %j %uint_1
+%v1_gep = OpAccessChain %ptr_func_uint %func_var1 %i %j
+%ld1 = OpLoad %uint %v1_gep
+%v2_gep = OpAccessChain %ptr_func_uint %func_var2 %i %j
+%ld2 = OpLoad %uint %v2_gep
+%add = OpIAdd %uint %ld1 %ld2
+%i_modifier = OpIMul %uint %i %uint_4
+%out_idx = OpIAdd %uint %i_modifier %j
+%out_gep = OpAccessChain %ptr_ssbo_uint %out_var %uint_0 %out_idx
+OpStore %out_gep %add
+%inner_eq = OpIEqual %bool %inc_j %uint_4
+OpLoopMerge %inner_merge %inner_loop None
+OpBranchConditional %inner_eq %inner_merge %inner_loop
+
+%inner_merge = OpLabel
+OpBranch %outer_latch
+
+%outer_latch = OpLabel
+OpBranchConditional %outer_eq %outer_merge %outer_loop
+
+%outer_merge = OpLabel
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 64
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:0 0 == 15 15 15 15
+probe ssbo uint 0:0 16 == 15 15 15 15
+probe ssbo uint 0:0 32 == 15 15 15 15
+probe ssbo uint 0:0 48 == 15 15 15 15
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/nonwritable/non_main_function_nonwritable.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/nonwritable/non_main_function_nonwritable.amber
new file mode 100644
index 0000000..cb94cd5
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/nonwritable/non_main_function_nonwritable.amber
@@ -0,0 +1,45 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %func_var NonWritable
+OpDecorate %block Block
+OpMemberDecorate %block 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 0
+%void = OpTypeVoid
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_2 = OpConstant %int 2
+%block = OpTypeStruct %int
+%ptr_ssbo_block = OpTypePointer StorageBuffer %block
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%out_var = OpVariable %ptr_ssbo_block StorageBuffer
+%void_fn = OpTypeFunction %void
+%int_fn = OpTypeFunction %int
+%ptr_func_int = OpTypePointer Function %int
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%call = OpFunctionCall %int %func
+%gep = OpAccessChain %ptr_ssbo_int %out_var %int_0
+OpStore %gep %call
+OpReturn
+OpFunctionEnd
+%func = OpFunction %int None %int_fn
+%func_entry = OpLabel
+%func_var = OpVariable %ptr_func_int Function %int_2
+%ld = OpLoad %int %func_var
+OpReturnValue %ld
+OpFunctionEnd
+
+[test]
+ssbo 0:0 4
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:0 0 == 2
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/nonwritable/private_2_nonwritable.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/nonwritable/private_2_nonwritable.amber
new file mode 100644
index 0000000..04da8ae
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/nonwritable/private_2_nonwritable.amber
@@ -0,0 +1,94 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_storage_buffer_storage_class
+
+[compute shader spirv]
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %out_var %in_var %gid_var %priv_var
+OpExecutionMode %main LocalSize 4 4 1
+
+OpDecorate %uint_rta ArrayStride 4
+OpDecorate %struct Block
+OpMemberDecorate %struct 0 Offset 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+
+OpDecorate %priv_var NonWritable
+
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%uint = OpTypeInt 32 0
+%uint3 = OpTypeVector %uint 3
+%uint_0 = OpConstant %uint 0
+%uint_1 = OpConstant %uint 1
+%uint_2 = OpConstant %uint 2
+%uint_3 = OpConstant %uint 3
+%uint_4 = OpConstant %uint 4
+%uint_5 = OpConstant %uint 5
+%uint_6 = OpConstant %uint 6
+%uint_7 = OpConstant %uint 7
+%uint_8 = OpConstant %uint 8
+%uint_9 = OpConstant %uint 9
+%uint_10 = OpConstant %uint 10
+%uint_11 = OpConstant %uint 11
+%uint_12 = OpConstant %uint 12
+%uint_13 = OpConstant %uint 13
+%uint_14 = OpConstant %uint 14
+%uint_15 = OpConstant %uint 15
+%uint_array_4 = OpTypeArray %uint %uint_4
+%array_array_4 = OpTypeArray %uint_array_4 %uint_4
+
+%const_array_r_0 = OpConstantComposite %uint_array_4 %uint_15 %uint_14 %uint_13 %uint_12
+%const_array_r_1 = OpConstantComposite %uint_array_4 %uint_11 %uint_10 %uint_9 %uint_8
+%const_array_r_2 = OpConstantComposite %uint_array_4 %uint_7 %uint_6 %uint_5 %uint_4
+%const_array_r_3 = OpConstantComposite %uint_array_4 %uint_3 %uint_2 %uint_1 %uint_0
+%const_array_r = OpConstantComposite %array_array_4 %const_array_r_0 %const_array_r_1 %const_array_r_2 %const_array_r_3
+
+%ptr_array_array_private = OpTypePointer Private %array_array_4
+%ptr_priv_uint = OpTypePointer Private %uint
+%uint_rta = OpTypeRuntimeArray %uint
+%struct = OpTypeStruct %uint_rta
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
+%out_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%in_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%ptr_ssbo_uint = OpTypePointer StorageBuffer %uint
+%ptr_input_uint3 = OpTypePointer Input %uint3
+%gid_var = OpVariable %ptr_input_uint3 Input
+%priv_var = OpVariable %ptr_array_array_private Private %const_array_r
+
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %uint3 %gid_var
+%gid_x = OpCompositeExtract %uint %gid 0
+%gid_y = OpCompositeExtract %uint %gid 1
+%x_modifier = OpIMul %uint %gid_x %uint_4
+%idx = OpIAdd %uint %x_modifier %gid_y
+%in_gep = OpAccessChain %ptr_ssbo_uint %in_var %uint_0 %idx
+%ld1 = OpLoad %uint %in_gep
+%v_gep = OpAccessChain %ptr_priv_uint %priv_var %gid_x %gid_y
+%ld2 = OpLoad %uint %v_gep
+%add = OpIAdd %uint %ld1 %ld2
+%out_gep = OpAccessChain %ptr_ssbo_uint %out_var %uint_0 %idx
+OpStore %out_gep %add
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
+ssbo 0:1 64
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:1 0 == 16 16 16 16
+probe ssbo uint 0:1 16 == 16 16 16 16
+probe ssbo uint 0:1 32 == 16 16 16 16
+probe ssbo uint 0:1 48 == 16 16 16 16
+
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/nonwritable/private_nonwritable.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/nonwritable/private_nonwritable.amber
new file mode 100644
index 0000000..4b198d2
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/nonwritable/private_nonwritable.amber
@@ -0,0 +1,112 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_storage_buffer_storage_class
+
+[compute shader spirv]
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %out_var %priv_var1 %priv_var2
+OpExecutionMode %main LocalSize 1 1 1
+
+OpDecorate %uint_rta ArrayStride 4
+OpDecorate %struct Block
+OpMemberDecorate %struct 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 0
+
+OpDecorate %priv_var1 NonWritable
+OpDecorate %priv_var2 NonWritable
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%uint = OpTypeInt 32 0
+%uint_0 = OpConstant %uint 0
+%uint_1 = OpConstant %uint 1
+%uint_2 = OpConstant %uint 2
+%uint_3 = OpConstant %uint 3
+%uint_4 = OpConstant %uint 4
+%uint_5 = OpConstant %uint 5
+%uint_6 = OpConstant %uint 6
+%uint_7 = OpConstant %uint 7
+%uint_8 = OpConstant %uint 8
+%uint_9 = OpConstant %uint 9
+%uint_10 = OpConstant %uint 10
+%uint_11 = OpConstant %uint 11
+%uint_12 = OpConstant %uint 12
+%uint_13 = OpConstant %uint 13
+%uint_14 = OpConstant %uint 14
+%uint_15 = OpConstant %uint 15
+%uint_array_4 = OpTypeArray %uint %uint_4
+%array_array_4 = OpTypeArray %uint_array_4 %uint_4
+
+%const_array_f_0 = OpConstantComposite %uint_array_4 %uint_0 %uint_1 %uint_2 %uint_3
+%const_array_f_1 = OpConstantComposite %uint_array_4 %uint_4 %uint_5 %uint_6 %uint_7
+%const_array_f_2 = OpConstantComposite %uint_array_4 %uint_8 %uint_9 %uint_10 %uint_11
+%const_array_f_3 = OpConstantComposite %uint_array_4 %uint_12 %uint_13 %uint_14 %uint_15
+%const_array_f = OpConstantComposite %array_array_4 %const_array_f_0 %const_array_f_1 %const_array_f_2 %const_array_f_3
+
+%const_array_r_0 = OpConstantComposite %uint_array_4 %uint_15 %uint_14 %uint_13 %uint_12
+%const_array_r_1 = OpConstantComposite %uint_array_4 %uint_11 %uint_10 %uint_9 %uint_8
+%const_array_r_2 = OpConstantComposite %uint_array_4 %uint_7 %uint_6 %uint_5 %uint_4
+%const_array_r_3 = OpConstantComposite %uint_array_4 %uint_3 %uint_2 %uint_1 %uint_0
+%const_array_r = OpConstantComposite %array_array_4 %const_array_r_0 %const_array_r_1 %const_array_r_2 %const_array_r_3
+
+%ptr_array_array_private = OpTypePointer Private %array_array_4
+%priv_var1 = OpVariable %ptr_array_array_private Private %const_array_f
+%priv_var2 = OpVariable %ptr_array_array_private Private %const_array_r
+%ptr_priv_uint = OpTypePointer Private %uint
+%uint_rta = OpTypeRuntimeArray %uint
+%struct = OpTypeStruct %uint_rta
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
+%out_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%ptr_ssbo_uint = OpTypePointer StorageBuffer %uint
+
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+OpBranch %outer_loop
+
+%outer_loop = OpLabel
+%i = OpPhi %uint %uint_0 %entry %inc_i %outer_latch
+%inc_i = OpIAdd %uint %i %uint_1
+%outer_eq = OpIEqual %bool %inc_i %uint_4
+OpLoopMerge %outer_merge %outer_latch None
+OpBranch %inner_loop
+
+%inner_loop = OpLabel
+%j = OpPhi %uint %uint_0 %outer_loop %inc_j %inner_loop
+%inc_j = OpIAdd %uint %j %uint_1
+%v1_gep = OpAccessChain %ptr_priv_uint %priv_var1 %i %j
+%ld1 = OpLoad %uint %v1_gep
+%v2_gep = OpAccessChain %ptr_priv_uint %priv_var2 %i %j
+%ld2 = OpLoad %uint %v2_gep
+%add = OpIAdd %uint %ld1 %ld2
+%i_modifier = OpIMul %uint %i %uint_4
+%out_idx = OpIAdd %uint %i_modifier %j
+%out_gep = OpAccessChain %ptr_ssbo_uint %out_var %uint_0 %out_idx
+OpStore %out_gep %add
+%inner_eq = OpIEqual %bool %inc_j %uint_4
+OpLoopMerge %inner_merge %inner_loop None
+OpBranchConditional %inner_eq %inner_merge %inner_loop
+
+%inner_merge = OpLabel
+OpBranch %outer_latch
+
+%outer_latch = OpLabel
+OpBranchConditional %outer_eq %outer_merge %outer_loop
+
+%outer_merge = OpLabel
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 64
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:0 0 == 15 15 15 15
+probe ssbo uint 0:0 16 == 15 15 15 15
+probe ssbo uint 0:0 32 == 15 15 15 15
+probe ssbo uint 0:0 48 == 15 15 15 15
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/different_matrix_layout.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/different_matrix_layout.amber
new file mode 100644
index 0000000..cab34c6
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/different_matrix_layout.amber
@@ -0,0 +1,59 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; Tests copying column major to row major matrix.
+
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %struct1 Block
+OpMemberDecorate %struct1 0 Offset 0
+OpMemberDecorate %struct1 0 ColMajor
+OpMemberDecorate %struct1 0 MatrixStride 16
+OpDecorate %struct2 Block
+OpMemberDecorate %struct2 0 Offset 0
+OpMemberDecorate %struct2 0 RowMajor
+OpMemberDecorate %struct2 0 MatrixStride 16
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+%void = OpTypeVoid
+%float = OpTypeFloat 32
+%float4 = OpTypeVector %float 4
+%matrix = OpTypeMatrix %float4 4
+
+%struct1 = OpTypeStruct %matrix
+%ptr_struct1 = OpTypePointer StorageBuffer %struct1
+
+%struct2 = OpTypeStruct %matrix
+%ptr_struct2 = OpTypePointer StorageBuffer %struct2
+
+%in_var = OpVariable %ptr_struct1 StorageBuffer
+%out_var = OpVariable %ptr_struct2 StorageBuffer
+
+%func_ty = OpTypeFunction %void
+%main = OpFunction %void None %func_ty
+%1 = OpLabel
+%in_struct = OpLoad %struct1 %in_var
+%copy = OpCopyLogical %struct2 %in_struct
+OpStore %out_var %copy
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata vec4 0 1 2 3 4
+ssbo 0:0 subdata vec4 16 5 6 7 8
+ssbo 0:0 subdata vec4 32 9 10 11 12
+ssbo 0:0 subdata vec4 48 13 14 15 16
+ssbo 0:1 64
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo vec4 0:1 0 == 1 5 9 13
+probe ssbo vec4 0:1 16 == 2 6 10 14
+probe ssbo vec4 0:1 32 == 3 7 11 15
+probe ssbo vec4 0:1 48 == 4 8 12 16
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/different_matrix_strides.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/different_matrix_strides.amber
new file mode 100644
index 0000000..207d4ae
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/different_matrix_strides.amber
@@ -0,0 +1,59 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; Tests copying structs containing a matrix with different matrix strides.
+
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %struct1 Block
+OpMemberDecorate %struct1 0 Offset 0
+OpMemberDecorate %struct1 0 ColMajor
+OpMemberDecorate %struct1 0 MatrixStride 16
+OpDecorate %struct2 Block
+OpMemberDecorate %struct2 0 Offset 0
+OpMemberDecorate %struct2 0 ColMajor
+OpMemberDecorate %struct2 0 MatrixStride 32
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+%void = OpTypeVoid
+%float = OpTypeFloat 32
+%float4 = OpTypeVector %float 4
+%matrix = OpTypeMatrix %float4 4
+
+%struct1 = OpTypeStruct %matrix
+%ptr_struct1 = OpTypePointer StorageBuffer %struct1
+
+%struct2 = OpTypeStruct %matrix
+%ptr_struct2 = OpTypePointer StorageBuffer %struct2
+
+%in_var = OpVariable %ptr_struct1 StorageBuffer
+%out_var = OpVariable %ptr_struct2 StorageBuffer
+
+%func_ty = OpTypeFunction %void
+%main = OpFunction %void None %func_ty
+%1 = OpLabel
+%in_struct = OpLoad %struct1 %in_var
+%copy = OpCopyLogical %struct2 %in_struct
+OpStore %out_var %copy
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata vec4 0 1 2 3 4
+ssbo 0:0 subdata vec4 16 5 6 7 8
+ssbo 0:0 subdata vec4 32 9 10 11 12
+ssbo 0:0 subdata vec4 48 13 14 15 16
+ssbo 0:1 128
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo vec4 0:1 0 == 1 2 3 4
+probe ssbo vec4 0:1 32 == 5 6 7 8
+probe ssbo vec4 0:1 64 == 9 10 11 12
+probe ssbo vec4 0:1 96 == 13 14 15 16
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/nested_arrays_different_inner_stride.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/nested_arrays_different_inner_stride.amber
new file mode 100644
index 0000000..175d4ab
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/nested_arrays_different_inner_stride.amber
@@ -0,0 +1,84 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; Tests copying two nested arrays with different inner array strides.
+
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %struct_stride_4 Block
+OpMemberDecorate %struct_stride_4 0 Offset 0
+OpDecorate %struct_stride_8 Block
+OpMemberDecorate %struct_stride_8 0 Offset 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+OpDecorate %float_array_32_stride_4 ArrayStride 4
+OpDecorate %float_array_32_stride_8 ArrayStride 8
+OpDecorate %array_array_stride_4 ArrayStride 256
+OpDecorate %array_array_stride_8 ArrayStride 256
+%void = OpTypeVoid
+%float = OpTypeFloat 32
+%uint = OpTypeInt 32 0
+%uint_0 = OpConstant %uint 0
+%uint_8 = OpConstant %uint 8
+%uint_32 = OpConstant %uint 32
+
+%float_array_32_stride_4 = OpTypeArray %float %uint_32
+%array_array_stride_4 = OpTypeArray %float_array_32_stride_4 %uint_8
+%ptr_array_array_stride_4 = OpTypePointer StorageBuffer %array_array_stride_4
+%struct_stride_4 = OpTypeStruct %array_array_stride_4
+%ptr_struct_stride_4 = OpTypePointer StorageBuffer %struct_stride_4
+
+%float_array_32_stride_8 = OpTypeArray %float %uint_32
+%array_array_stride_8 = OpTypeArray %float_array_32_stride_8 %uint_8
+%ptr_array_array_stride_8 = OpTypePointer StorageBuffer %array_array_stride_8
+%struct_stride_8 = OpTypeStruct %array_array_stride_8
+%ptr_struct_stride_8 = OpTypePointer StorageBuffer %struct_stride_8
+
+%in_var = OpVariable %ptr_struct_stride_4 StorageBuffer
+%out_var = OpVariable %ptr_struct_stride_8 StorageBuffer
+
+%func_ty = OpTypeFunction %void
+%main = OpFunction %void None %func_ty
+%1 = OpLabel
+%in_gep = OpAccessChain %ptr_array_array_stride_4 %in_var %uint_0
+%in_array = OpLoad %array_array_stride_4 %in_gep
+%copy = OpCopyLogical %array_array_stride_8 %in_array
+%out_gep = OpAccessChain %ptr_array_array_stride_8 %out_var %uint_0
+OpStore %out_gep %copy
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata float 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
+ssbo 0:0 subdata float 256 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
+ssbo 0:0 subdata float 512 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
+ssbo 0:0 subdata float 768 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
+ssbo 0:0 subdata float 1024 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
+ssbo 0:0 subdata float 1280 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
+ssbo 0:0 subdata float 1536 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
+ssbo 0:0 subdata float 1792 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
+ssbo 0:1 subdata float 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ssbo 0:1 subdata float 256 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ssbo 0:1 subdata float 512 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ssbo 0:1 subdata float 768 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ssbo 0:1 subdata float 1024 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ssbo 0:1 subdata float 1280 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ssbo 0:1 subdata float 1536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ssbo 0:1 subdata float 1792 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo float 0:1 0 == 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 20 0 21 0 22 0 23 0 24 0 25 0 26 0 27 0 28 0 29 0 30 0 31 0 32 0
+probe ssbo float 0:1 256 == 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 20 0 21 0 22 0 23 0 24 0 25 0 26 0 27 0 28 0 29 0 30 0 31 0 32 0
+probe ssbo float 0:1 512 == 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 20 0 21 0 22 0 23 0 24 0 25 0 26 0 27 0 28 0 29 0 30 0 31 0 32 0
+probe ssbo float 0:1 768 == 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 20 0 21 0 22 0 23 0 24 0 25 0 26 0 27 0 28 0 29 0 30 0 31 0 32 0
+probe ssbo float 0:1 1024 == 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 20 0 21 0 22 0 23 0 24 0 25 0 26 0 27 0 28 0 29 0 30 0 31 0 32 0
+probe ssbo float 0:1 1280 == 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 20 0 21 0 22 0 23 0 24 0 25 0 26 0 27 0 28 0 29 0 30 0 31 0 32 0
+probe ssbo float 0:1 1536 == 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 20 0 21 0 22 0 23 0 24 0 25 0 26 0 27 0 28 0 29 0 30 0 31 0 32 0
+probe ssbo float 0:1 1792 == 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 20 0 21 0 22 0 23 0 24 0 25 0 26 0 27 0 28 0 29 0 30 0 31 0 32 0
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/nested_arrays_different_outer_stride.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/nested_arrays_different_outer_stride.amber
new file mode 100644
index 0000000..3c80af3
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/nested_arrays_different_outer_stride.amber
@@ -0,0 +1,77 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; Tests copying nested arrays with differing outer array strides.
+
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %struct_stride_4 Block
+OpMemberDecorate %struct_stride_4 0 Offset 0
+OpDecorate %struct_stride_8 Block
+OpMemberDecorate %struct_stride_8 0 Offset 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+OpDecorate %float_array_32_stride_4 ArrayStride 4
+OpDecorate %float_array_32_stride_8 ArrayStride 4 ;; for ease this ID is odd
+OpDecorate %array_array_stride_4 ArrayStride 128
+OpDecorate %array_array_stride_8 ArrayStride 256
+%void = OpTypeVoid
+%float = OpTypeFloat 32
+%uint = OpTypeInt 32 0
+%uint_0 = OpConstant %uint 0
+%uint_8 = OpConstant %uint 8
+%uint_32 = OpConstant %uint 32
+
+%float_array_32_stride_4 = OpTypeArray %float %uint_32
+%array_array_stride_4 = OpTypeArray %float_array_32_stride_4 %uint_8
+%ptr_array_array_stride_4 = OpTypePointer StorageBuffer %array_array_stride_4
+%struct_stride_4 = OpTypeStruct %array_array_stride_4
+%ptr_struct_stride_4 = OpTypePointer StorageBuffer %struct_stride_4
+
+%float_array_32_stride_8 = OpTypeArray %float %uint_32
+%array_array_stride_8 = OpTypeArray %float_array_32_stride_4 %uint_8
+%ptr_array_array_stride_8 = OpTypePointer StorageBuffer %array_array_stride_8
+%struct_stride_8 = OpTypeStruct %array_array_stride_8
+%ptr_struct_stride_8 = OpTypePointer StorageBuffer %struct_stride_8
+
+%in_var = OpVariable %ptr_struct_stride_4 StorageBuffer
+%out_var = OpVariable %ptr_struct_stride_8 StorageBuffer
+
+%func_ty = OpTypeFunction %void
+%main = OpFunction %void None %func_ty
+%1 = OpLabel
+%in_gep = OpAccessChain %ptr_array_array_stride_4 %in_var %uint_0
+%in_array = OpLoad %array_array_stride_4 %in_gep
+%copy = OpCopyLogical %array_array_stride_8 %in_array
+%out_gep = OpAccessChain %ptr_array_array_stride_8 %out_var %uint_0
+OpStore %out_gep %copy
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata float 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
+ssbo 0:0 subdata float 128 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
+ssbo 0:0 subdata float 256 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
+ssbo 0:0 subdata float 384 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
+ssbo 0:0 subdata float 512 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
+ssbo 0:0 subdata float 640 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
+ssbo 0:0 subdata float 768 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
+ssbo 0:0 subdata float 896 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
+ssbo 0:1 2048
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo float 0:1 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
+probe ssbo float 0:1 256 == 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
+probe ssbo float 0:1 512 == 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
+probe ssbo float 0:1 768 == 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
+probe ssbo float 0:1 1024 == 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
+probe ssbo float 0:1 1280 == 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
+probe ssbo float 0:1 1536 == 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
+probe ssbo float 0:1 1792 == 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
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/nested_arrays_different_strides.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/nested_arrays_different_strides.amber
new file mode 100644
index 0000000..d6dbb80
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/nested_arrays_different_strides.amber
@@ -0,0 +1,84 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; Tests copying nested arrays with differing inner and outer array strides.
+
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %struct_stride_4 Block
+OpMemberDecorate %struct_stride_4 0 Offset 0
+OpDecorate %struct_stride_8 Block
+OpMemberDecorate %struct_stride_8 0 Offset 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+OpDecorate %float_array_32_stride_4 ArrayStride 4
+OpDecorate %float_array_32_stride_8 ArrayStride 8
+OpDecorate %array_array_stride_4 ArrayStride 128
+OpDecorate %array_array_stride_8 ArrayStride 256
+%void = OpTypeVoid
+%float = OpTypeFloat 32
+%uint = OpTypeInt 32 0
+%uint_0 = OpConstant %uint 0
+%uint_8 = OpConstant %uint 8
+%uint_32 = OpConstant %uint 32
+
+%float_array_32_stride_4 = OpTypeArray %float %uint_32
+%array_array_stride_4 = OpTypeArray %float_array_32_stride_4 %uint_8
+%ptr_array_array_stride_4 = OpTypePointer StorageBuffer %array_array_stride_4
+%struct_stride_4 = OpTypeStruct %array_array_stride_4
+%ptr_struct_stride_4 = OpTypePointer StorageBuffer %struct_stride_4
+
+%float_array_32_stride_8 = OpTypeArray %float %uint_32
+%array_array_stride_8 = OpTypeArray %float_array_32_stride_8 %uint_8
+%ptr_array_array_stride_8 = OpTypePointer StorageBuffer %array_array_stride_8
+%struct_stride_8 = OpTypeStruct %array_array_stride_8
+%ptr_struct_stride_8 = OpTypePointer StorageBuffer %struct_stride_8
+
+%in_var = OpVariable %ptr_struct_stride_4 StorageBuffer
+%out_var = OpVariable %ptr_struct_stride_8 StorageBuffer
+
+%func_ty = OpTypeFunction %void
+%main = OpFunction %void None %func_ty
+%1 = OpLabel
+%in_gep = OpAccessChain %ptr_array_array_stride_4 %in_var %uint_0
+%in_array = OpLoad %array_array_stride_4 %in_gep
+%copy = OpCopyLogical %array_array_stride_8 %in_array
+%out_gep = OpAccessChain %ptr_array_array_stride_8 %out_var %uint_0
+OpStore %out_gep %copy
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata float 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
+ssbo 0:0 subdata float 128 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
+ssbo 0:0 subdata float 256 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
+ssbo 0:0 subdata float 384 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
+ssbo 0:0 subdata float 512 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
+ssbo 0:0 subdata float 640 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
+ssbo 0:0 subdata float 768 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
+ssbo 0:0 subdata float 896 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
+ssbo 0:1 subdata float 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ssbo 0:1 subdata float 256 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ssbo 0:1 subdata float 512 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ssbo 0:1 subdata float 768 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ssbo 0:1 subdata float 1024 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ssbo 0:1 subdata float 1280 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ssbo 0:1 subdata float 1536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ssbo 0:1 subdata float 1792 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo float 0:1 0 == 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 20 0 21 0 22 0 23 0 24 0 25 0 26 0 27 0 28 0 29 0 30 0 31 0 32 0
+probe ssbo float 0:1 256 == 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 20 0 21 0 22 0 23 0 24 0 25 0 26 0 27 0 28 0 29 0 30 0 31 0 32 0
+probe ssbo float 0:1 512 == 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 20 0 21 0 22 0 23 0 24 0 25 0 26 0 27 0 28 0 29 0 30 0 31 0 32 0
+probe ssbo float 0:1 768 == 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 20 0 21 0 22 0 23 0 24 0 25 0 26 0 27 0 28 0 29 0 30 0 31 0 32 0
+probe ssbo float 0:1 1024 == 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 20 0 21 0 22 0 23 0 24 0 25 0 26 0 27 0 28 0 29 0 30 0 31 0 32 0
+probe ssbo float 0:1 1280 == 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 20 0 21 0 22 0 23 0 24 0 25 0 26 0 27 0 28 0 29 0 30 0 31 0 32 0
+probe ssbo float 0:1 1536 == 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 20 0 21 0 22 0 23 0 24 0 25 0 26 0 27 0 28 0 29 0 30 0 31 0 32 0
+probe ssbo float 0:1 1792 == 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 20 0 21 0 22 0 23 0 24 0 25 0 26 0 27 0 28 0 29 0 30 0 31 0 32 0
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/same_array_two_ids.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/same_array_two_ids.amber
new file mode 100644
index 0000000..aa8b8f6
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/same_array_two_ids.amber
@@ -0,0 +1,58 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; Tests copy of same structural array given two IDs.
+
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %struct1 Block
+OpMemberDecorate %struct1 0 Offset 0
+OpDecorate %struct2 Block
+OpMemberDecorate %struct2 0 Offset 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+OpDecorate %float_array1 ArrayStride 4
+OpDecorate %float_array2 ArrayStride 4
+%void = OpTypeVoid
+%float = OpTypeFloat 32
+%uint = OpTypeInt 32 0
+%uint_0 = OpConstant %uint 0
+%uint_32 = OpConstant %uint 32
+
+%float_array1 = OpTypeArray %float %uint_32
+%ptr_float_array1 = OpTypePointer StorageBuffer %float_array1
+%struct1 = OpTypeStruct %float_array1
+%ptr_struct1 = OpTypePointer StorageBuffer %struct1
+
+%float_array2 = OpTypeArray %float %uint_32
+%ptr_float_array2 = OpTypePointer StorageBuffer %float_array2
+%struct2 = OpTypeStruct %float_array2
+%ptr_struct2 = OpTypePointer StorageBuffer %struct2
+
+%in_var = OpVariable %ptr_struct1 StorageBuffer
+%out_var = OpVariable %ptr_struct2 StorageBuffer
+
+%func_ty = OpTypeFunction %void
+%main = OpFunction %void None %func_ty
+%1 = OpLabel
+%in_gep = OpAccessChain %ptr_float_array1 %in_var %uint_0
+%in_array = OpLoad %float_array1 %in_gep
+%copy = OpCopyLogical %float_array2 %in_array
+%out_gep = OpAccessChain %ptr_float_array2 %out_var %uint_0
+OpStore %out_gep %copy
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata float 0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0 20.0 21.0 22.0 23.0 24.0 25.0 26.0 27.0 28.0 29.0 30.0 31.0 32.0
+ssbo 0:1 128
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo float 0:1 0 == 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0 20.0 21.0 22.0 23.0 24.0 25.0 26.0 27.0 28.0 29.0 30.0 31.0 32.0
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/same_struct_two_ids.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/same_struct_two_ids.amber
new file mode 100644
index 0000000..c5b7ea8
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/same_struct_two_ids.amber
@@ -0,0 +1,53 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; Tests copying same structural struct with different IDs.
+
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %struct1 Block
+OpMemberDecorate %struct1 0 Offset 0
+OpMemberDecorate %struct1 1 Offset 4
+OpMemberDecorate %struct1 2 Offset 8
+OpMemberDecorate %struct1 3 Offset 12
+OpDecorate %struct2 Block
+OpMemberDecorate %struct2 0 Offset 0
+OpMemberDecorate %struct2 1 Offset 4
+OpMemberDecorate %struct2 2 Offset 8
+OpMemberDecorate %struct2 3 Offset 12
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+%void = OpTypeVoid
+%int = OpTypeInt 32 0
+
+%struct1 = OpTypeStruct %int %int %int %int
+%ptr_struct1 = OpTypePointer Uniform %struct1
+
+%struct2 = OpTypeStruct %int %int %int %int
+%ptr_struct2 = OpTypePointer StorageBuffer %struct2
+
+%in_var = OpVariable %ptr_struct1 Uniform
+%out_var = OpVariable %ptr_struct2 StorageBuffer
+
+%func_ty = OpTypeFunction %void
+%main = OpFunction %void None %func_ty
+%1 = OpLabel
+%in_struct = OpLoad %struct1 %in_var
+%copy = OpCopyLogical %struct2 %in_struct
+OpStore %out_var %copy
+OpReturn
+OpFunctionEnd
+
+[test]
+uniform ubo 0:0 uvec4 0 1 2 3 4
+ssbo 0:1 subdata uvec4 0 8 8 8 8
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uvec4 0:1 0 == 1 2 3 4
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/ssbo_to_ubo.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/ssbo_to_ubo.amber
new file mode 100644
index 0000000..1e4ae13
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/ssbo_to_ubo.amber
@@ -0,0 +1,94 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; Tests converting from SSBO layout to UBO layout.
+
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+
+OpDecorate %struct1 Block
+OpMemberDecorate %struct1 0 Offset 0
+OpMemberDecorate %struct1 1 Offset 16
+OpMemberDecorate %struct1 2 Offset 48
+OpMemberDecorate %struct1 3 Offset 64
+OpMemberDecorate %struct1 4 Offset 80
+OpMemberDecorate %struct1 5 Offset 96
+OpMemberDecorate %struct1 6 Offset 112
+
+OpDecorate %struct2 Block
+OpMemberDecorate %struct2 0 Offset 0
+OpMemberDecorate %struct2 1 Offset 4
+OpMemberDecorate %struct2 2 Offset 12
+OpMemberDecorate %struct2 3 Offset 16
+OpMemberDecorate %struct2 4 Offset 32
+OpMemberDecorate %struct2 5 Offset 48
+OpMemberDecorate %struct2 6 Offset 64
+
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+
+OpDecorate %int_array_2_stride_4 ArrayStride 4
+OpDecorate %int_array_2_stride_16 ArrayStride 16
+OpMemberDecorate %int_struct1 0 Offset 4
+OpMemberDecorate %int_struct2 0 Offset 8
+
+%void = OpTypeVoid
+%float = OpTypeFloat 32
+%float2 = OpTypeVector %float 2
+%float3 = OpTypeVector %float 3
+%float4 = OpTypeVector %float 4
+%matrix = OpTypeMatrix %float4 4
+%int = OpTypeInt 32 0
+%int_2 = OpConstant %int 2
+%int_array_2_stride_4 = OpTypeArray %int %int_2
+%int_array_2_stride_16 = OpTypeArray %int %int_2
+%int_struct1 = OpTypeStruct %int
+%int_struct2 = OpTypeStruct %int
+
+%struct1 = OpTypeStruct %int %int_array_2_stride_16 %int %int_struct1 %float4 %float3 %float2
+%ptr_struct1 = OpTypePointer StorageBuffer %struct1
+
+%struct2 = OpTypeStruct %int %int_array_2_stride_4 %int %int_struct2 %float4 %float3 %float2
+%ptr_struct2 = OpTypePointer StorageBuffer %struct2
+
+%in_var = OpVariable %ptr_struct2 StorageBuffer
+%out_var = OpVariable %ptr_struct1 StorageBuffer
+
+%func_ty = OpTypeFunction %void
+%main = OpFunction %void None %func_ty
+%1 = OpLabel
+%in_struct = OpLoad %struct2 %in_var
+%copy = OpCopyLogical %struct1 %in_struct
+OpStore %out_var %copy
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 1
+ssbo 0:0 subdata uint 4 2 3
+ssbo 0:0 subdata uint 12 4
+ssbo 0:0 subdata uint 24 5
+# Really vec4
+ssbo 0:0 subdata uint 32 6 7 8 9
+# Really vec3
+ssbo 0:0 subdata uint 48 10 11 12
+# Really vec2
+ssbo 0:0 subdata uint 64 13 14
+ssbo 0:1 128
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:1 0 == 1
+probe ssbo uint 0:1 16 == 2
+probe ssbo uint 0:1 32 == 3
+probe ssbo uint 0:1 48 == 4
+probe ssbo uint 0:1 68 == 5
+probe ssbo uint 0:1 80 == 6 7 8 9
+probe ssbo uint 0:1 96 == 10 11 12
+probe ssbo uint 0:1 112 == 13 14
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/two_arrays_different_stride_1.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/two_arrays_different_stride_1.amber
new file mode 100644
index 0000000..5018ebe
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/two_arrays_different_stride_1.amber
@@ -0,0 +1,58 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; Tests copying smaller array stride to larger array stride.
+
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %struct_stride_4 Block
+OpMemberDecorate %struct_stride_4 0 Offset 0
+OpDecorate %struct_stride_8 Block
+OpMemberDecorate %struct_stride_8 0 Offset 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+OpDecorate %float_array_32_stride_4 ArrayStride 4
+OpDecorate %float_array_32_stride_8 ArrayStride 8
+%void = OpTypeVoid
+%float = OpTypeFloat 32
+%uint = OpTypeInt 32 0
+%uint_0 = OpConstant %uint 0
+%uint_32 = OpConstant %uint 32
+
+%float_array_32_stride_4 = OpTypeArray %float %uint_32
+%ptr_float_array_32_stride_4 = OpTypePointer StorageBuffer %float_array_32_stride_4
+%struct_stride_4 = OpTypeStruct %float_array_32_stride_4
+%ptr_struct_stride_4 = OpTypePointer StorageBuffer %struct_stride_4
+
+%float_array_32_stride_8 = OpTypeArray %float %uint_32
+%ptr_float_array_32_stride_8 = OpTypePointer StorageBuffer %float_array_32_stride_8
+%struct_stride_8 = OpTypeStruct %float_array_32_stride_8
+%ptr_struct_stride_8 = OpTypePointer StorageBuffer %struct_stride_8
+
+%in_var = OpVariable %ptr_struct_stride_4 StorageBuffer
+%out_var = OpVariable %ptr_struct_stride_8 StorageBuffer
+
+%func_ty = OpTypeFunction %void
+%main = OpFunction %void None %func_ty
+%1 = OpLabel
+%in_gep = OpAccessChain %ptr_float_array_32_stride_4 %in_var %uint_0
+%in_array = OpLoad %float_array_32_stride_4 %in_gep
+%copy = OpCopyLogical %float_array_32_stride_8 %in_array
+%out_gep = OpAccessChain %ptr_float_array_32_stride_8 %out_var %uint_0
+OpStore %out_gep %copy
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata float 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
+ssbo 0:1 subdata float 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo float 0:1 0 == 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 20 0 21 0 22 0 23 0 24 0 25 0 26 0 27 0 28 0 29 0 30 0 31 0 32 0
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/two_arrays_different_stride_2.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/two_arrays_different_stride_2.amber
new file mode 100644
index 0000000..f7a3b67
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/two_arrays_different_stride_2.amber
@@ -0,0 +1,58 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; Tests copying larger array stride to smaller array stride.
+
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %struct_stride_4 Block
+OpMemberDecorate %struct_stride_4 0 Offset 0
+OpDecorate %struct_stride_8 Block
+OpMemberDecorate %struct_stride_8 0 Offset 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+OpDecorate %float_array_32_stride_4 ArrayStride 4
+OpDecorate %float_array_32_stride_8 ArrayStride 8
+%void = OpTypeVoid
+%float = OpTypeFloat 32
+%uint = OpTypeInt 32 0
+%uint_0 = OpConstant %uint 0
+%uint_32 = OpConstant %uint 32
+
+%float_array_32_stride_4 = OpTypeArray %float %uint_32
+%ptr_float_array_32_stride_4 = OpTypePointer StorageBuffer %float_array_32_stride_4
+%struct_stride_4 = OpTypeStruct %float_array_32_stride_4
+%ptr_struct_stride_4 = OpTypePointer StorageBuffer %struct_stride_4
+
+%float_array_32_stride_8 = OpTypeArray %float %uint_32
+%ptr_float_array_32_stride_8 = OpTypePointer StorageBuffer %float_array_32_stride_8
+%struct_stride_8 = OpTypeStruct %float_array_32_stride_8
+%ptr_struct_stride_8 = OpTypePointer StorageBuffer %struct_stride_8
+
+%in_var = OpVariable %ptr_struct_stride_8 StorageBuffer
+%out_var = OpVariable %ptr_struct_stride_4 StorageBuffer
+
+%func_ty = OpTypeFunction %void
+%main = OpFunction %void None %func_ty
+%1 = OpLabel
+%in_gep = OpAccessChain %ptr_float_array_32_stride_8 %in_var %uint_0
+%in_array = OpLoad %float_array_32_stride_8 %in_gep
+%copy = OpCopyLogical %float_array_32_stride_4 %in_array
+%out_gep = OpAccessChain %ptr_float_array_32_stride_4 %out_var %uint_0
+OpStore %out_gep %copy
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata float 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 20 0 21 0 22 0 23 0 24 0 25 0 26 0 27 0 28 0 29 0 30 0 31 0 32 0
+ssbo 0:1 128
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo float 0:1 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
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/ubo_to_ssbo.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/ubo_to_ssbo.amber
new file mode 100644
index 0000000..800debf
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopylogical/ubo_to_ssbo.amber
@@ -0,0 +1,96 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; Tests conversion from UBO layout to SSBO layout.
+
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+
+OpDecorate %struct1 Block
+OpMemberDecorate %struct1 0 Offset 0
+OpMemberDecorate %struct1 1 Offset 16
+OpMemberDecorate %struct1 2 Offset 48
+OpMemberDecorate %struct1 3 Offset 64
+OpMemberDecorate %struct1 4 Offset 80
+OpMemberDecorate %struct1 5 Offset 96
+OpMemberDecorate %struct1 6 Offset 112
+
+OpDecorate %struct2 Block
+OpMemberDecorate %struct2 0 Offset 0
+OpMemberDecorate %struct2 1 Offset 4
+OpMemberDecorate %struct2 2 Offset 12
+OpMemberDecorate %struct2 3 Offset 16
+OpMemberDecorate %struct2 4 Offset 32
+OpMemberDecorate %struct2 5 Offset 48
+OpMemberDecorate %struct2 6 Offset 64
+
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+
+OpDecorate %int_array_2_stride_4 ArrayStride 4
+OpDecorate %int_array_2_stride_16 ArrayStride 16
+OpMemberDecorate %int_struct1 0 Offset 4
+OpMemberDecorate %int_struct2 0 Offset 8
+
+%void = OpTypeVoid
+%float = OpTypeFloat 32
+%float2 = OpTypeVector %float 2
+%float3 = OpTypeVector %float 3
+%float4 = OpTypeVector %float 4
+%matrix = OpTypeMatrix %float4 4
+%int = OpTypeInt 32 0
+%int_2 = OpConstant %int 2
+%int_array_2_stride_4 = OpTypeArray %int %int_2
+%int_array_2_stride_16 = OpTypeArray %int %int_2
+%int_struct1 = OpTypeStruct %int
+%int_struct2 = OpTypeStruct %int
+
+%struct1 = OpTypeStruct %int %int_array_2_stride_16 %int %int_struct1 %float4 %float3 %float2
+%ptr_struct1 = OpTypePointer Uniform %struct1
+
+%struct2 = OpTypeStruct %int %int_array_2_stride_4 %int %int_struct2 %float4 %float3 %float2
+%ptr_struct2 = OpTypePointer StorageBuffer %struct2
+
+%in_var = OpVariable %ptr_struct1 Uniform
+%out_var = OpVariable %ptr_struct2 StorageBuffer
+
+%func_ty = OpTypeFunction %void
+%main = OpFunction %void None %func_ty
+%1 = OpLabel
+%in_struct = OpLoad %struct1 %in_var
+%copy = OpCopyLogical %struct2 %in_struct
+OpStore %out_var %copy
+OpReturn
+OpFunctionEnd
+
+[test]
+# Really uint
+uniform ubo 0:0 uint 0 1
+uniform ubo 0:0 uint 16 2
+uniform ubo 0:0 uint 32 3
+uniform ubo 0:0 uint 48 4
+uniform ubo 0:0 uint 68 5
+# Really vec4
+uniform ubo 0:0 uint 80 6 7 8 9
+# Really vec3
+uniform ubo 0:0 uint 96 10 11 12
+# Really vec2
+uniform ubo 0:0 uint 112 13 14
+ssbo 0:1 72
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:1 0 == 1
+probe ssbo uint 0:1 4 == 2
+probe ssbo uint 0:1 8 == 3
+probe ssbo uint 0:1 12 == 4
+probe ssbo uint 0:1 24 == 5
+probe ssbo uint 0:1 32 == 6 7 8 9
+probe ssbo uint 0:1 48 == 10 11 12
+probe ssbo uint 0:1 64 == 13 14
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopymemory/different_alignments.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopymemory/different_alignments.amber
new file mode 100644
index 0000000..ef69349
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopymemory/different_alignments.amber
@@ -0,0 +1,62 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_storage_buffer_storage_class
+
+[compute shader spirv]
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %ssbo
+OpExecutionMode %main LocalSize 1 1 1
+
+OpDecorate %struct Block
+OpMemberDecorate %struct 0 Offset 0
+OpMemberDecorate %struct 1 Offset 16
+OpMemberDecorate %struct 2 Offset 32
+OpMemberDecorate %struct 3 Offset 48
+OpMemberDecorate %struct 4 Offset 64
+OpDecorate %ssbo DescriptorSet 0
+OpDecorate %ssbo Binding 0
+
+%void = OpTypeVoid
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int_3 = OpConstant %int 3
+%int_4 = OpConstant %int 4
+%int4 = OpTypeVector %int 4
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+
+%struct = OpTypeStruct %int4 %int %int %int %int
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
+%ssbo = OpVariable %ptr_ssbo_struct StorageBuffer
+
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%src_gep0 = OpAccessChain %ptr_ssbo_int %ssbo %int_0 %int_0
+%dst_gep0 = OpAccessChain %ptr_ssbo_int %ssbo %int_1
+OpCopyMemory %dst_gep0 %src_gep0 Aligned 16 Aligned 4
+%src_gep1 = OpAccessChain %ptr_ssbo_int %ssbo %int_0 %int_1
+%dst_gep1 = OpAccessChain %ptr_ssbo_int %ssbo %int_2
+OpCopyMemory %dst_gep1 %src_gep1 Aligned 16 Aligned 4
+%src_gep2 = OpAccessChain %ptr_ssbo_int %ssbo %int_0 %int_2
+%dst_gep2 = OpAccessChain %ptr_ssbo_int %ssbo %int_3
+OpCopyMemory %dst_gep2 %src_gep2 Aligned 16 Aligned 4
+%src_gep3 = OpAccessChain %ptr_ssbo_int %ssbo %int_0 %int_3
+%dst_gep3 = OpAccessChain %ptr_ssbo_int %ssbo %int_4
+OpCopyMemory %dst_gep3 %src_gep3 Aligned 16 Aligned 4
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 68
+ssbo 0:0 subdata uint 0 1 2 3 4
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:0 16 == 1
+probe ssbo uint 0:0 32 == 2
+probe ssbo uint 0:0 48 == 3
+probe ssbo uint 0:0 64 == 4
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopymemory/no_source_access_operands.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopymemory/no_source_access_operands.amber
new file mode 100644
index 0000000..ca3ea6d
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopymemory/no_source_access_operands.amber
@@ -0,0 +1,63 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_storage_buffer_storage_class
+
+[compute shader spirv]
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %ssbo
+OpExecutionMode %main LocalSize 1 1 1
+
+OpDecorate %struct Block
+OpMemberDecorate %struct 0 Offset 0
+OpMemberDecorate %struct 1 Offset 16
+OpMemberDecorate %struct 2 Offset 32
+OpMemberDecorate %struct 3 Offset 48
+OpMemberDecorate %struct 4 Offset 64
+OpDecorate %ssbo DescriptorSet 0
+OpDecorate %ssbo Binding 0
+
+%void = OpTypeVoid
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int_3 = OpConstant %int 3
+%int_4 = OpConstant %int 4
+%int4 = OpTypeVector %int 4
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+
+%struct = OpTypeStruct %int4 %int %int %int %int
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
+%ssbo = OpVariable %ptr_ssbo_struct StorageBuffer
+
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%src_gep0 = OpAccessChain %ptr_ssbo_int %ssbo %int_0 %int_0
+%dst_gep0 = OpAccessChain %ptr_ssbo_int %ssbo %int_1
+OpCopyMemory %dst_gep0 %src_gep0 Aligned 16 None
+%src_gep1 = OpAccessChain %ptr_ssbo_int %ssbo %int_0 %int_1
+%dst_gep1 = OpAccessChain %ptr_ssbo_int %ssbo %int_2
+OpCopyMemory %dst_gep1 %src_gep1 Aligned 16 None
+%src_gep2 = OpAccessChain %ptr_ssbo_int %ssbo %int_0 %int_2
+%dst_gep2 = OpAccessChain %ptr_ssbo_int %ssbo %int_3
+OpCopyMemory %dst_gep2 %src_gep2 Aligned 16 None
+%src_gep3 = OpAccessChain %ptr_ssbo_int %ssbo %int_0 %int_3
+%dst_gep3 = OpAccessChain %ptr_ssbo_int %ssbo %int_4
+OpCopyMemory %dst_gep3 %src_gep3 Aligned 16 None
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 68
+ssbo 0:0 subdata uint 0 1 2 3 4
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:0 16 == 1
+probe ssbo uint 0:0 32 == 2
+probe ssbo uint 0:0 48 == 3
+probe ssbo uint 0:0 64 == 4
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopymemory/no_target_access_operands.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopymemory/no_target_access_operands.amber
new file mode 100644
index 0000000..6dc4a21
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opcopymemory/no_target_access_operands.amber
@@ -0,0 +1,63 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_storage_buffer_storage_class
+
+[compute shader spirv]
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %ssbo
+OpExecutionMode %main LocalSize 1 1 1
+
+OpDecorate %struct Block
+OpMemberDecorate %struct 0 Offset 0
+OpMemberDecorate %struct 1 Offset 16
+OpMemberDecorate %struct 2 Offset 32
+OpMemberDecorate %struct 3 Offset 48
+OpMemberDecorate %struct 4 Offset 64
+OpDecorate %ssbo DescriptorSet 0
+OpDecorate %ssbo Binding 0
+
+%void = OpTypeVoid
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int_3 = OpConstant %int 3
+%int_4 = OpConstant %int 4
+%int4 = OpTypeVector %int 4
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+
+%struct = OpTypeStruct %int4 %int %int %int %int
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
+%ssbo = OpVariable %ptr_ssbo_struct StorageBuffer
+
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%src_gep0 = OpAccessChain %ptr_ssbo_int %ssbo %int_0 %int_0
+%dst_gep0 = OpAccessChain %ptr_ssbo_int %ssbo %int_1
+OpCopyMemory %dst_gep0 %src_gep0 None Aligned 4
+%src_gep1 = OpAccessChain %ptr_ssbo_int %ssbo %int_0 %int_1
+%dst_gep1 = OpAccessChain %ptr_ssbo_int %ssbo %int_2
+OpCopyMemory %dst_gep1 %src_gep1 None Aligned 4
+%src_gep2 = OpAccessChain %ptr_ssbo_int %ssbo %int_0 %int_2
+%dst_gep2 = OpAccessChain %ptr_ssbo_int %ssbo %int_3
+OpCopyMemory %dst_gep2 %src_gep2 None Aligned 4
+%src_gep3 = OpAccessChain %ptr_ssbo_int %ssbo %int_0 %int_3
+%dst_gep3 = OpAccessChain %ptr_ssbo_int %ssbo %int_4
+OpCopyMemory %dst_gep3 %src_gep3 None Aligned 4
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 68
+ssbo 0:0 subdata uint 0 1 2 3 4
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:0 16 == 1
+probe ssbo uint 0:0 32 == 2
+probe ssbo uint 0:0 48 == 3
+probe ssbo uint 0:0 64 == 4
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrdiff/ssbo_comparisons_diff.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrdiff/ssbo_comparisons_diff.amber
new file mode 100644
index 0000000..905fe29
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrdiff/ssbo_comparisons_diff.amber
@@ -0,0 +1,174 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VK_KHR_storage_buffer_storage_class
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+; Test operates on a SSBO (%in_var) containing a runtime array of an array of four ints.
+; Size of the runtime array is passed another SSBO (%n_var).
+
+; Each invocation writes out the result of OpPtrDiff
+; for elements of the input runtime array to index 16 of the corresponding output
+; variable. Pointers are based the gid'th element vs the zero'th element.
+
+; Each invocation loops 4 times and writes out results each for OpPtrDiff.
+; The pointers are the lid'th element of gid'th element of
+; the runtime array vs the iteration count element of the gid'th element of
+; the runtime array.
+
+OpCapability Shader
+OpCapability VariablePointersStorageBuffer
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %in_var %diff_var %n_var %lid_var %gid_var
+OpExecutionMode %main LocalSize 4 1 1
+
+OpDecorate %struct_4 Block
+OpMemberDecorate %struct_4 0 Offset 0
+OpDecorate %runtime_4 ArrayStride 16
+OpDecorate %struct_17 Block
+OpMemberDecorate %struct_17 0 Offset 0
+OpDecorate %runtime_17 ArrayStride 68
+OpDecorate %n_struct Block
+OpMemberDecorate %n_struct 0 Offset 0
+OpDecorate %array_4 ArrayStride 4
+OpDecorate %array_17 ArrayStride 4
+
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %diff_var DescriptorSet 0
+OpDecorate %diff_var Binding 1
+OpDecorate %n_var DescriptorSet 0
+OpDecorate %n_var Binding 2
+
+OpDecorate %lid_var BuiltIn LocalInvocationId
+OpDecorate %gid_var BuiltIn WorkgroupId
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 1
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_4 = OpConstant %int 4
+%int_16 = OpConstant %int 16
+%int_17 = OpConstant %int 17
+%int3 = OpTypeVector %int 3
+
+%ptr_input_int3 = OpTypePointer Input %int3
+
+%array_4 = OpTypeArray %int %int_4
+%runtime_4 = OpTypeRuntimeArray %array_4
+%struct_4 = OpTypeStruct %runtime_4
+%ptr_struct_4 = OpTypePointer StorageBuffer %struct_4
+%ptr_array_4 = OpTypePointer StorageBuffer %array_4
+
+%array_17 = OpTypeArray %int %int_17
+%runtime_17 = OpTypeRuntimeArray %array_17
+%struct_17 = OpTypeStruct %runtime_17
+%ptr_struct_17 = OpTypePointer StorageBuffer %struct_17
+%ptr_array_17 = OpTypePointer StorageBuffer %array_17
+
+%ptr_int = OpTypePointer StorageBuffer %int
+%n_struct = OpTypeStruct %int
+%ptr_n_struct = OpTypePointer Uniform %n_struct
+%ptr_n = OpTypePointer Uniform %int
+
+%in_var = OpVariable %ptr_struct_4 StorageBuffer
+%diff_var = OpVariable %ptr_struct_17 StorageBuffer
+%n_var = OpVariable %ptr_n_struct Uniform
+%lid_var = OpVariable %ptr_input_int3 Input
+%gid_var = OpVariable %ptr_input_int3 Input
+
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%n_gep = OpAccessChain %ptr_n %n_var %int_0
+%n = OpLoad %int %n_gep
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%lid = OpLoad %int3 %lid_var
+%lid_x = OpCompositeExtract %int %lid 0
+%array_gep_0 = OpAccessChain %ptr_array_4 %in_var %int_0 %int_0
+%array_gep = OpAccessChain %ptr_array_4 %in_var %int_0 %gid_x
+%cmp_gid = OpSGreaterThanEqual %bool %gid_x %n
+OpSelectionMerge %body None
+OpBranchConditional %cmp_gid %ret %body
+
+%ret = OpLabel
+OpReturn
+
+%body = OpLabel
+%cmp_lid = OpIEqual %bool %lid_x %int_1
+OpSelectionMerge %loop None
+OpBranchConditional %cmp_lid %then %loop
+
+%then = OpLabel
+; Compute results for outer array
+%large_diff = OpPtrDiff %int %array_gep %array_gep_0
+%large_diff_gep = OpAccessChain %ptr_int %diff_var %int_0 %gid_x %int_16
+OpStore %large_diff_gep %large_diff
+;
+OpBranch %loop
+
+%loop = OpLabel
+%i = OpPhi %int %int_0 %body %int_0 %then %inc_i %loop
+%inc_i = OpIAdd %int %i %int_1
+%i_cmp = OpIEqual %bool %inc_i %int_4
+%lid_offset = OpIMul %int %lid_x %int_4
+%gep_offset = OpIAdd %int %lid_offset %i
+; Compute results for inner array
+%ref_gep = OpAccessChain %ptr_int %array_gep %lid_x
+%cmp_gep = OpAccessChain %ptr_int %array_gep %i
+%diff = OpPtrDiff %int %ref_gep %cmp_gep
+%diff_gep = OpAccessChain %ptr_int %diff_var %int_0 %gid_x %gep_offset
+OpStore %diff_gep %diff
+;
+OpLoopMerge %exit %loop None
+OpBranchConditional %i_cmp %exit %loop
+
+%exit = OpLabel
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 2048
+ssbo 0:1 2176
+uniform ubo 0:2 int 0 32
+
+compute entrypoint main
+compute 32 1 1
+
+# diff var
+probe ssbo int 0:1 0 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 0
+probe ssbo int 0:1 68 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 1
+probe ssbo int 0:1 136 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 2
+probe ssbo int 0:1 204 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 3
+probe ssbo int 0:1 272 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 4
+probe ssbo int 0:1 340 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 5
+probe ssbo int 0:1 408 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 6
+probe ssbo int 0:1 476 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 7
+probe ssbo int 0:1 544 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 8
+probe ssbo int 0:1 612 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 9
+probe ssbo int 0:1 680 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 10
+probe ssbo int 0:1 748 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 11
+probe ssbo int 0:1 816 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 12
+probe ssbo int 0:1 884 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 13
+probe ssbo int 0:1 952 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 14
+probe ssbo int 0:1 1020 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 15
+probe ssbo int 0:1 1088 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 16
+probe ssbo int 0:1 1156 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 17
+probe ssbo int 0:1 1224 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 18
+probe ssbo int 0:1 1292 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 19
+probe ssbo int 0:1 1360 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 20
+probe ssbo int 0:1 1428 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 21
+probe ssbo int 0:1 1496 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 22
+probe ssbo int 0:1 1564 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 23
+probe ssbo int 0:1 1632 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 24
+probe ssbo int 0:1 1700 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 25
+probe ssbo int 0:1 1768 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 26
+probe ssbo int 0:1 1836 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 27
+probe ssbo int 0:1 1904 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 28
+probe ssbo int 0:1 1972 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 29
+probe ssbo int 0:1 2040 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 30
+probe ssbo int 0:1 2108 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 31
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrdiff/variable_pointers_vars_ssbo_2_diff.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrdiff/variable_pointers_vars_ssbo_2_diff.amber
new file mode 100644
index 0000000..a5ae58c
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrdiff/variable_pointers_vars_ssbo_2_diff.amber
@@ -0,0 +1,156 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VK_KHR_storage_buffer_storage_class
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+; Tests pointer comparisons with variable pointers
+
+; Stores an array of pointers in Function storage class that point into input
+; SSBO. Each iteration produces an int2 result containing two OpPtrDiffs
+; Pointers evolve by incrementing or decrementing by 1 each iteration (overall
+; ratio is 2:1).
+
+; All uses of OpPtrDiff are within %in_var, so we only need
+; VariablePointersStorageBuffer capability and the corresponding Vulkan
+; feature bit.
+
+OpCapability Shader
+OpCapability VariablePointersStorageBuffer
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+
+OpDecorate %int_rta ArrayStride 4
+OpDecorate %in_struct Block
+OpMemberDecorate %in_struct 0 Offset 0
+OpMemberDecorate %in_struct 1 Offset 4
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+
+OpDecorate %int2_rta ArrayStride 8
+OpDecorate %out_struct Block
+OpMemberDecorate %out_struct 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+
+OpDecorate %ptr_ssbo_int ArrayStride 4
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%uint = OpTypeInt 32 0
+%int = OpTypeInt 32 1
+%int_n1 = OpConstant %int -1
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int_3 = OpConstant %int 3
+%int2 = OpTypeVector %int 2
+
+%int_rta = OpTypeRuntimeArray %int
+%in_struct = OpTypeStruct %int %int_rta
+%ptr_ssbo_in_struct = OpTypePointer StorageBuffer %in_struct
+%in_var = OpVariable %ptr_ssbo_in_struct StorageBuffer
+
+%int2_rta = OpTypeRuntimeArray %int2
+%out_struct = OpTypeStruct %int2_rta
+%ptr_ssbo_out_struct = OpTypePointer StorageBuffer %out_struct
+%out_var = OpVariable %ptr_ssbo_out_struct StorageBuffer
+
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%array_ptr = OpTypeArray %ptr_ssbo_int %int_2
+%ptr_ptr = OpTypePointer Function %array_ptr
+%ptr_func_ptr = OpTypePointer Function %ptr_ssbo_int
+
+%ptr_ssbo_n = OpTypePointer StorageBuffer %int
+%ptr_ssbo_int2 = OpTypePointer StorageBuffer %int2
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%var = OpVariable %ptr_ptr Function
+%n_gep = OpAccessChain %ptr_ssbo_n %in_var %int_0
+%n = OpLoad %int %n_gep
+%length = OpArrayLength %uint %in_var 1
+%length_div_2 = OpSDiv %int %length %int_2
+%mid_gep = OpAccessChain %ptr_ssbo_int %in_var %int_1 %length_div_2
+%func_gep_0 = OpAccessChain %ptr_func_ptr %var %int_0
+%func_gep_1 = OpAccessChain %ptr_func_ptr %var %int_1
+OpStore %func_gep_0 %mid_gep
+OpStore %func_gep_1 %mid_gep
+%cmp_n = OpSLessThanEqual %bool %n %int_0
+OpSelectionMerge %exit None
+OpBranchConditional %cmp_n %exit %loop
+
+%loop = OpLabel
+%i = OpPhi %int %int_0 %entry %inc_i %continue
+%gep_0 = OpLoad %ptr_ssbo_int %func_gep_0
+%gep_1 = OpLoad %ptr_ssbo_int %func_gep_1
+%inc_i = OpIAdd %int %i %int_1
+
+%diff1 = OpPtrDiff %int %gep_0 %gep_1
+%diff2 = OpPtrDiff %int %gep_1 %gep_0
+%result = OpCompositeConstruct %int2 %diff1 %diff2
+%out_gep = OpAccessChain %ptr_ssbo_int2 %out_var %int_0 %i
+OpStore %out_gep %result
+
+OpLoopMerge %loop_exit %continue None
+OpBranch %body
+
+%body = OpLabel
+%i_mod_3 = OpSMod %int %i %int_3
+%cmp_vs_0 = OpIEqual %bool %i_mod_3 %int_0
+OpSelectionMerge %if_merge None
+OpBranchConditional %cmp_vs_0 %then %else
+
+%then = OpLabel
+%then_0_next = OpPtrAccessChain %ptr_ssbo_int %gep_0 %int_n1
+%then_1_next = OpPtrAccessChain %ptr_ssbo_int %gep_1 %int_1
+OpBranch %if_merge
+%else = OpLabel
+%else_0_next = OpPtrAccessChain %ptr_ssbo_int %gep_0 %int_1
+%else_1_next = OpPtrAccessChain %ptr_ssbo_int %gep_1 %int_n1
+OpBranch %if_merge
+
+%if_merge = OpLabel
+%next_0 = OpPhi %ptr_ssbo_int %then_0_next %then %else_0_next %else
+%next_1 = OpPhi %ptr_ssbo_int %then_1_next %then %else_1_next %else
+OpBranch %continue
+
+%continue = OpLabel
+OpStore %func_gep_0 %next_0
+OpStore %func_gep_1 %next_1
+%cmp = OpSGreaterThanEqual %bool %i %n
+OpBranchConditional %cmp %loop_exit %loop
+
+%loop_exit = OpLabel
+OpBranch %exit
+%exit = OpLabel
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 68
+ssbo 0:0 subdata uint 0 16
+ssbo 0:1 128
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo int 0:1 0 == 0 0
+probe ssbo int 0:1 8 == -2 2
+probe ssbo int 0:1 16 == 0 0
+probe ssbo int 0:1 24 == 2 -2
+probe ssbo int 0:1 32 == 0 0
+probe ssbo int 0:1 40 == 2 -2
+probe ssbo int 0:1 48 == 4 -4
+probe ssbo int 0:1 56 == 2 -2
+probe ssbo int 0:1 64 == 4 -4
+probe ssbo int 0:1 72 == 6 -6
+probe ssbo int 0:1 80 == 4 -4
+probe ssbo int 0:1 88 == 6 -6
+probe ssbo int 0:1 96 == 8 -8
+probe ssbo int 0:1 104 == 6 -6
+probe ssbo int 0:1 112 == 8 -8
+probe ssbo int 0:1 120 == 10 -10
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrdiff/variable_pointers_vars_ssbo_diff.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrdiff/variable_pointers_vars_ssbo_diff.amber
new file mode 100644
index 0000000..dc6ff85
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrdiff/variable_pointers_vars_ssbo_diff.amber
@@ -0,0 +1,144 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VK_KHR_storage_buffer_storage_class
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+; Tests use of private variables holding SSBO pointers and pointer comparisons.
+
+; Two iterators are each stored in Private variables: one moves forward, one
+; moves backward. In each iteration an int2 result is written that contains two
+; diffs. Iterators are then moved forward (or backward respectively) one index.
+
+OpCapability Shader
+OpCapability VariablePointersStorageBuffer
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %in_var %out_var %forward_var %backward_var
+OpExecutionMode %main LocalSize 1 1 1
+
+OpDecorate %int_rta ArrayStride 4
+OpDecorate %in_struct Block
+OpMemberDecorate %in_struct 0 Offset 0
+OpMemberDecorate %in_struct 1 Offset 4
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+
+OpDecorate %int2_rta ArrayStride 8
+OpDecorate %out_struct Block
+OpMemberDecorate %out_struct 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+
+OpDecorate %ptr_ssbo_int ArrayStride 4
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 1
+%int_n1 = OpConstant %int -1
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int_3 = OpConstant %int 3
+%int2 = OpTypeVector %int 2
+
+%int_rta = OpTypeRuntimeArray %int
+%in_struct = OpTypeStruct %int %int_rta
+%ptr_ssbo_in_struct = OpTypePointer StorageBuffer %in_struct
+%in_var = OpVariable %ptr_ssbo_in_struct StorageBuffer
+
+%int2_rta = OpTypeRuntimeArray %int2
+%out_struct = OpTypeStruct %int2_rta
+%ptr_ssbo_out_struct = OpTypePointer StorageBuffer %out_struct
+%out_var = OpVariable %ptr_ssbo_out_struct StorageBuffer
+
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%ptr_ptr = OpTypePointer Private %ptr_ssbo_int
+%forward_var = OpVariable %ptr_ptr Private
+%backward_var = OpVariable %ptr_ptr Private
+
+%ptr_ssbo_n = OpTypePointer StorageBuffer %int
+%ptr_ssbo_int2 = OpTypePointer StorageBuffer %int2
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%n_gep = OpAccessChain %ptr_ssbo_n %in_var %int_0
+%n = OpLoad %int %n_gep
+%first_gep = OpAccessChain %ptr_ssbo_int %in_var %int_1 %int_0
+OpStore %forward_var %first_gep
+%last_gep = OpPtrAccessChain %ptr_ssbo_int %first_gep %n
+OpStore %backward_var %last_gep
+%cmp_n = OpSLessThanEqual %bool %n %int_0
+OpSelectionMerge %exit None
+OpBranchConditional %cmp_n %exit %loop
+
+%loop = OpLabel
+%i = OpPhi %int %int_0 %entry %inc_i %loop
+%forward_gep = OpLoad %ptr_ssbo_int %forward_var
+%backward_gep = OpLoad %ptr_ssbo_int %backward_var
+%forward_next = OpPtrAccessChain %ptr_ssbo_int %forward_gep %int_1
+%backward_next = OpPtrAccessChain %ptr_ssbo_int %backward_gep %int_n1
+%inc_i = OpIAdd %int %i %int_1
+OpStore %forward_var %forward_next
+OpStore %backward_var %backward_next
+
+%diff1 = OpPtrDiff %int %forward_gep %backward_gep
+%diff2 = OpPtrDiff %int %backward_gep %forward_gep
+%result = OpCompositeConstruct %int2 %diff1 %diff2
+%out_gep = OpAccessChain %ptr_ssbo_int2 %out_var %int_0 %i
+OpStore %out_gep %result
+
+%cmp = OpSGreaterThanEqual %bool %i %n
+OpLoopMerge %loop_exit %loop None
+OpBranchConditional %cmp %loop_exit %loop
+
+%loop_exit = OpLabel
+OpBranch %exit
+%exit = OpLabel
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 132
+# Only data for number of iterations matters.
+ssbo 0:0 subdata int 0 33
+ssbo 0:1 264
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo ivec2 0:1 0 == -33 33
+probe ssbo ivec2 0:1 8 == -31 31
+probe ssbo ivec2 0:1 16 == -29 29
+probe ssbo ivec2 0:1 24 == -27 27
+probe ssbo ivec2 0:1 32 == -25 25
+probe ssbo ivec2 0:1 40 == -23 23
+probe ssbo ivec2 0:1 48 == -21 21
+probe ssbo ivec2 0:1 56 == -19 19
+probe ssbo ivec2 0:1 64 == -17 17
+probe ssbo ivec2 0:1 72 == -15 15
+probe ssbo ivec2 0:1 80 == -13 13
+probe ssbo ivec2 0:1 88 == -11 11
+probe ssbo ivec2 0:1 96 == -9 9
+probe ssbo ivec2 0:1 104 == -7 7
+probe ssbo ivec2 0:1 112 == -5 5
+probe ssbo ivec2 0:1 120 == -3 3
+probe ssbo ivec2 0:1 128 == -1 1
+probe ssbo ivec2 0:1 136 == 1 -1
+probe ssbo ivec2 0:1 144 == 3 -3
+probe ssbo ivec2 0:1 152 == 5 -5
+probe ssbo ivec2 0:1 160 == 7 -7
+probe ssbo ivec2 0:1 168 == 9 -9
+probe ssbo ivec2 0:1 176 == 11 -11
+probe ssbo ivec2 0:1 184 == 13 -13
+probe ssbo ivec2 0:1 192 == 15 -15
+probe ssbo ivec2 0:1 200 == 17 -17
+probe ssbo ivec2 0:1 208 == 19 -19
+probe ssbo ivec2 0:1 216 == 21 -21
+probe ssbo ivec2 0:1 224 == 23 -23
+probe ssbo ivec2 0:1 232 == 25 -25
+probe ssbo ivec2 0:1 240 == 27 -27
+probe ssbo ivec2 0:1 248 == 29 -29
+probe ssbo ivec2 0:1 256 == 31 -31
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrdiff/variable_pointers_vars_wg_diff.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrdiff/variable_pointers_vars_wg_diff.amber
new file mode 100644
index 0000000..1764c85
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrdiff/variable_pointers_vars_wg_diff.amber
@@ -0,0 +1,129 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VariablePointerFeatures.variablePointers
+VK_KHR_storage_buffer_storage_class
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+; Tests use of private variables holding workgroup pointers and pointer comparisons.
+
+; Two iterators are each stored in Private variables: one moves forward, one
+; moves backward. In each iteration an int2 result is written that contains
+; two diffs (operands swapped). Iterators are then moved forward (or backward
+; respectively) one index.
+
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %wg_var %out_var %forward_var %backward_var
+OpExecutionMode %main LocalSize 1 1 1
+
+OpDecorate %int2_rta ArrayStride 8
+OpDecorate %out_struct Block
+OpMemberDecorate %out_struct 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 0
+
+OpDecorate %ptr_wg_int ArrayStride 4
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 1
+%int_n1 = OpConstant %int -1
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int_3 = OpConstant %int 3
+%int_32 = OpConstant %int 32
+%int2 = OpTypeVector %int 2
+
+%int_array_32 = OpTypeArray %int %int_32
+%ptr_wg_array = OpTypePointer Workgroup %int_array_32
+%wg_var = OpVariable %ptr_wg_array Workgroup
+
+%int2_rta = OpTypeRuntimeArray %int2
+%out_struct = OpTypeStruct %int2_rta
+%ptr_ssbo_out_struct = OpTypePointer StorageBuffer %out_struct
+%out_var = OpVariable %ptr_ssbo_out_struct StorageBuffer
+
+%ptr_wg_int = OpTypePointer Workgroup %int
+%ptr_ptr = OpTypePointer Private %ptr_wg_int
+%forward_var = OpVariable %ptr_ptr Private
+%backward_var = OpVariable %ptr_ptr Private
+
+%ptr_ssbo_int2 = OpTypePointer StorageBuffer %int2
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%first_gep = OpAccessChain %ptr_wg_int %wg_var %int_0
+OpStore %forward_var %first_gep
+%last_gep = OpPtrAccessChain %ptr_wg_int %first_gep %int_32
+OpStore %backward_var %last_gep
+OpBranch %loop
+
+%loop = OpLabel
+%i = OpPhi %int %int_0 %entry %inc_i %loop
+%forward_gep = OpLoad %ptr_wg_int %forward_var
+%backward_gep = OpLoad %ptr_wg_int %backward_var
+%forward_next = OpPtrAccessChain %ptr_wg_int %forward_gep %int_1
+%backward_next = OpPtrAccessChain %ptr_wg_int %backward_gep %int_n1
+%inc_i = OpIAdd %int %i %int_1
+OpStore %forward_var %forward_next
+OpStore %backward_var %backward_next
+
+%diff1 = OpPtrDiff %int %forward_gep %backward_gep
+%diff2 = OpPtrDiff %int %backward_gep %forward_gep
+%result = OpCompositeConstruct %int2 %diff1 %diff2
+%out_gep = OpAccessChain %ptr_ssbo_int2 %out_var %int_0 %i
+OpStore %out_gep %result
+
+%cmp = OpSGreaterThan %bool %i %int_32
+OpLoopMerge %exit %loop None
+OpBranchConditional %cmp %exit %loop
+
+%exit = OpLabel
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 264
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo ivec2 0:0 0 == -32 32
+probe ssbo ivec2 0:0 8 == -30 30
+probe ssbo ivec2 0:0 16 == -28 28
+probe ssbo ivec2 0:0 24 == -26 26
+probe ssbo ivec2 0:0 32 == -24 24
+probe ssbo ivec2 0:0 40 == -22 22
+probe ssbo ivec2 0:0 48 == -20 20
+probe ssbo ivec2 0:0 56 == -18 18
+probe ssbo ivec2 0:0 64 == -16 16
+probe ssbo ivec2 0:0 72 == -14 14
+probe ssbo ivec2 0:0 80 == -12 12
+probe ssbo ivec2 0:0 88 == -10 10
+probe ssbo ivec2 0:0 96 == -8 8
+probe ssbo ivec2 0:0 104 == -6 6
+probe ssbo ivec2 0:0 112 == -4 4
+probe ssbo ivec2 0:0 120 == -2 2
+probe ssbo ivec2 0:0 128 == 0 0
+probe ssbo ivec2 0:0 136 == 2 -2
+probe ssbo ivec2 0:0 144 == 4 -4
+probe ssbo ivec2 0:0 152 == 6 -6
+probe ssbo ivec2 0:0 160 == 8 -8
+probe ssbo ivec2 0:0 168 == 10 -10
+probe ssbo ivec2 0:0 176 == 12 -12
+probe ssbo ivec2 0:0 184 == 14 -14
+probe ssbo ivec2 0:0 192 == 16 -16
+probe ssbo ivec2 0:0 200 == 18 -18
+probe ssbo ivec2 0:0 208 == 20 -20
+probe ssbo ivec2 0:0 216 == 22 -22
+probe ssbo ivec2 0:0 224 == 24 -24
+probe ssbo ivec2 0:0 232 == 26 -26
+probe ssbo ivec2 0:0 240 == 28 -28
+probe ssbo ivec2 0:0 248 == 30 -30
+probe ssbo ivec2 0:0 256 == 32 -32
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrdiff/wg_comparisons_diff.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrdiff/wg_comparisons_diff.amber
new file mode 100644
index 0000000..74a9d53
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrdiff/wg_comparisons_diff.amber
@@ -0,0 +1,158 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VariablePointerFeatures.variablePointers
+VK_KHR_storage_buffer_storage_class
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+; Test operates on a Workgroup array (%wg_var) containing an array of 16 arrays of four ints.
+
+; Each invocation writes out the result of OpPtrDiff for elements of the
+; outer array to index 16 of the corresponding output variable. Pointers are
+; based the gid'th element vs the zero'th element.
+
+; Each invocation loops 4 times and writes out 4 results each for OpPtrDiff.
+; The pointers are the lid'th element of gid'th element of the outer array vs
+; the iteration count mod 4'th element of the gid'th element of the outer
+; array. Results are ordered so each thread writes continguous results.
+
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %wg_var %diff_var %lid_var %gid_var
+OpExecutionMode %main LocalSize 16 4 1
+
+OpDecorate %struct_17 Block
+OpMemberDecorate %struct_17 0 Offset 0
+OpDecorate %runtime_17 ArrayStride 68
+OpDecorate %array_17 ArrayStride 4
+
+OpDecorate %diff_var DescriptorSet 0
+OpDecorate %diff_var Binding 0
+
+OpDecorate %lid_var BuiltIn LocalInvocationId
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 1
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_4 = OpConstant %int 4
+%int_16 = OpConstant %int 16
+%int_17 = OpConstant %int 17
+%int_64 = OpConstant %int 64
+%int3 = OpTypeVector %int 3
+
+%ptr_input_int3 = OpTypePointer Input %int3
+
+%array_4 = OpTypeArray %int %int_4
+%array_array_4 = OpTypeArray %array_4 %int_16
+%ptr_array_array_4 = OpTypePointer Workgroup %array_array_4
+%ptr_array_4 = OpTypePointer Workgroup %array_4
+%ptr_wg_int = OpTypePointer Workgroup %int
+
+%array_17 = OpTypeArray %int %int_17
+%runtime_17 = OpTypeRuntimeArray %array_17
+%struct_17 = OpTypeStruct %runtime_17
+%ptr_struct_17 = OpTypePointer StorageBuffer %struct_17
+%ptr_array_17 = OpTypePointer StorageBuffer %array_17
+%ptr_int = OpTypePointer StorageBuffer %int
+
+%wg_var = OpVariable %ptr_array_array_4 Workgroup
+%diff_var = OpVariable %ptr_struct_17 StorageBuffer
+%lid_var = OpVariable %ptr_input_int3 Input
+%gid_var = OpVariable %ptr_input_int3 Input
+
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%gid_y = OpCompositeExtract %int %gid 1
+%lid = OpLoad %int3 %lid_var
+%lid_x = OpCompositeExtract %int %lid 0
+%lid_y = OpCompositeExtract %int %lid 1
+%array_gep_0 = OpAccessChain %ptr_array_4 %wg_var %int_0
+%array_gep = OpAccessChain %ptr_array_4 %wg_var %lid_x
+%lid_y_is_1 = OpIEqual %bool %lid_y %int_1
+OpSelectionMerge %loop None
+OpBranchConditional %lid_y_is_1 %then %loop
+
+%then = OpLabel
+; Compute results for outer array
+%large_diff = OpPtrDiff %int %array_gep %array_gep_0
+%large_diff_gep = OpAccessChain %ptr_int %diff_var %int_0 %gid_x %int_16
+OpStore %large_diff_gep %large_diff
+;
+OpBranch %loop
+
+%loop = OpLabel
+%i = OpPhi %int %int_0 %entry %int_0 %then %inc_i %loop
+%inc_i = OpIAdd %int %i %int_1
+%i_cmp = OpIEqual %bool %inc_i %int_4
+%lid_offset = OpIMul %int %lid_y %int_4
+%out_gep_index = OpIAdd %int %i %lid_offset
+; Compute results for inner array
+%ref_gep = OpAccessChain %ptr_wg_int %array_gep %lid_y
+%cmp_gep = OpAccessChain %ptr_wg_int %array_gep %i
+%diff = OpPtrDiff %int %ref_gep %cmp_gep
+%diff_gep = OpAccessChain %ptr_int %diff_var %int_0 %gid_x %out_gep_index
+OpStore %diff_gep %diff
+;
+OpLoopMerge %exit %loop None
+OpBranchConditional %i_cmp %exit %loop
+
+%exit = OpLabel
+OpReturn
+OpFunctionEnd
+
+
+[test]
+# 16 x 4 x 2 = 128 work items
+# 4 x 4 = 16 bytes per invocation
+# 2048 bytes from looping
+# 16 x 2 = 32 coarse results (1 per lid)
+# 128 bytes
+# 2176 total bytes
+ssbo 0:0 2176
+
+compute entrypoint main
+compute 2 1 1
+
+# diff var
+probe ssbo int 0:0 0 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 0
+probe ssbo int 0:0 68 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 1
+probe ssbo int 0:0 136 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 2
+probe ssbo int 0:0 204 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 3
+probe ssbo int 0:0 272 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 4
+probe ssbo int 0:0 340 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 5
+probe ssbo int 0:0 408 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 6
+probe ssbo int 0:0 476 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 7
+probe ssbo int 0:0 544 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 8
+probe ssbo int 0:0 612 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 9
+probe ssbo int 0:0 680 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 10
+probe ssbo int 0:0 748 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 11
+probe ssbo int 0:0 816 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 12
+probe ssbo int 0:0 884 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 13
+probe ssbo int 0:0 952 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 14
+probe ssbo int 0:0 1020 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 15
+probe ssbo int 0:0 1088 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 0
+probe ssbo int 0:0 1156 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 1
+probe ssbo int 0:0 1224 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 2
+probe ssbo int 0:0 1292 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 3
+probe ssbo int 0:0 1360 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 4
+probe ssbo int 0:0 1428 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 5
+probe ssbo int 0:0 1496 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 6
+probe ssbo int 0:0 1564 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 7
+probe ssbo int 0:0 1632 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 8
+probe ssbo int 0:0 1700 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 9
+probe ssbo int 0:0 1768 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 10
+probe ssbo int 0:0 1836 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 11
+probe ssbo int 0:0 1904 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 12
+probe ssbo int 0:0 1972 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 13
+probe ssbo int 0:0 2040 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 14
+probe ssbo int 0:0 2108 == 0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0 15
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/different_ssbos_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/different_ssbos_equal.amber
new file mode 100644
index 0000000..1b9321e
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/different_ssbos_equal.amber
@@ -0,0 +1,112 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %var1 %var2 %var3 %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %rta ArrayStride 4
+OpDecorate %struct Block
+OpMemberDecorate %struct 0 Offset 0
+OpDecorate %var1 DescriptorSet 0
+OpDecorate %var1 Binding 0
+OpDecorate %var2 DescriptorSet 0
+OpDecorate %var2 Binding 1
+OpDecorate %var3 DescriptorSet 0
+OpDecorate %var3 Binding 2
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 3
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%rta = OpTypeRuntimeArray %int
+%struct = OpTypeStruct %rta
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
+%ptr_ssbo_rta = OpTypePointer StorageBuffer %rta
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%var1 = OpVariable %ptr_ssbo_struct StorageBuffer
+%var2 = OpVariable %ptr_ssbo_struct StorageBuffer
+%var3 = OpVariable %ptr_ssbo_struct StorageBuffer
+%out_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%out_idx0 = OpCopyObject %int %int_0
+%var1_rta_gep = OpAccessChain %ptr_ssbo_rta %var1 %int_0
+%var1_int_gep = OpAccessChain %ptr_ssbo_int %var1 %int_0 %int_0
+%var2_rta_gep = OpAccessChain %ptr_ssbo_rta %var2 %int_0
+%var2_int_gep = OpAccessChain %ptr_ssbo_int %var2 %int_0 %int_0
+%var3_rta_gep = OpAccessChain %ptr_ssbo_rta %var3 %int_0
+%var3_int_gep = OpAccessChain %ptr_ssbo_int %var3 %int_0 %int_0
+; var1 vs var2
+%v1_eq_v2 = OpPtrEqual %bool %var1 %var2
+%v1_eq_v2_sel = OpSelect %int %v1_eq_v2 %int_1 %int_0
+%out_gep1 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx0
+%out_idx1 = OpIAdd %int %out_idx0 %int_1
+OpStore %out_gep1 %v1_eq_v2_sel
+%v1_eq_v2_rta = OpPtrEqual %bool %var1_rta_gep %var2_rta_gep
+%v1_eq_v2_rta_sel = OpSelect %int %v1_eq_v2_rta %int_1 %int_0
+%out_gep2 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx1
+%out_idx2 = OpIAdd %int %out_idx1 %int_1
+OpStore %out_gep2 %v1_eq_v2_rta_sel
+%v1_eq_v2_int = OpPtrEqual %bool %var1_int_gep %var2_int_gep
+%v1_eq_v2_int_sel = OpSelect %int %v1_eq_v2_int %int_1 %int_0
+%out_gep3 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx2
+%out_idx3 = OpIAdd %int %out_idx2 %int_1
+OpStore %out_gep3 %v1_eq_v2_int_sel
+; var1 vs var3
+%v1_eq_v3 = OpPtrEqual %bool %var1 %var3
+%v1_eq_v3_sel = OpSelect %int %v1_eq_v3 %int_1 %int_0
+%out_gep4 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx3
+%out_idx4 = OpIAdd %int %out_idx3 %int_1
+OpStore %out_gep4 %v1_eq_v3_sel
+%v1_eq_v3_rta = OpPtrEqual %bool %var1_rta_gep %var3_rta_gep
+%v1_eq_v3_rta_sel = OpSelect %int %v1_eq_v3_rta %int_1 %int_0
+%out_gep5 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx4
+%out_idx5 = OpIAdd %int %out_idx4 %int_1
+OpStore %out_gep5 %v1_eq_v3_rta_sel
+%v1_eq_v3_int = OpPtrEqual %bool %var1_int_gep %var3_int_gep
+%v1_eq_v3_int_sel = OpSelect %int %v1_eq_v3_int %int_1 %int_0
+%out_gep6 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx5
+%out_idx6 = OpIAdd %int %out_idx5 %int_1
+OpStore %out_gep6 %v1_eq_v3_int_sel
+; var2 vs var3
+%v2_eq_v3 = OpPtrEqual %bool %var2 %var3
+%v2_eq_v3_sel = OpSelect %int %v2_eq_v3 %int_1 %int_0
+%out_gep7 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx6
+%out_idx7 = OpIAdd %int %out_idx6 %int_1
+OpStore %out_gep7 %v2_eq_v3_sel
+%v2_eq_v3_rta = OpPtrEqual %bool %var2_rta_gep %var3_rta_gep
+%v2_eq_v3_rta_sel = OpSelect %int %v2_eq_v3_rta %int_1 %int_0
+%out_gep8 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx7
+%out_idx8 = OpIAdd %int %out_idx7 %int_1
+OpStore %out_gep8 %v2_eq_v3_rta_sel
+%v2_eq_v3_int = OpPtrEqual %bool %var2_int_gep %var3_int_gep
+%v2_eq_v3_int_sel = OpSelect %int %v2_eq_v3_int %int_1 %int_0
+%out_gep9 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx8
+%out_idx9 = OpIAdd %int %out_idx8 %int_1
+OpStore %out_gep9 %v2_eq_v3_int_sel
+%v1_eq_v1 = OpPtrEqual %bool %var1 %var1
+%v1_eq_v1_sel = OpSelect %int %v1_eq_v1 %int_1 %int_0
+%out_gep10 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx9
+OpStore %out_gep10 %v1_eq_v1_sel
+OpReturn
+OpFunctionEnd
+[test]
+ssbo 0:0 4
+ssbo 0:1 4
+ssbo 0:2 4
+ssbo 0:3 40
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:3 0 == 0 0 0 0 0 0 0 0 0 1
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/different_wgs_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/different_wgs_equal.amber
new file mode 100644
index 0000000..117baa4
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/different_wgs_equal.amber
@@ -0,0 +1,107 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %var1 %var2 %var3 %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %rta ArrayStride 4
+OpDecorate %struct Block
+OpMemberDecorate %struct 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 0
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%rta = OpTypeRuntimeArray %int
+%struct = OpTypeStruct %rta
+%int2 = OpTypeVector %int 2
+%wg_struct = OpTypeStruct %int2
+%ptr_wg_struct = OpTypePointer Workgroup %wg_struct
+%ptr_wg_int2 = OpTypePointer Workgroup %int2
+%ptr_wg_int = OpTypePointer Workgroup %int
+%var1 = OpVariable %ptr_wg_struct Workgroup
+%var2 = OpVariable %ptr_wg_struct Workgroup
+%var3 = OpVariable %ptr_wg_struct Workgroup
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%out_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%out_idx0 = OpCopyObject %int %int_0
+%var1_int2_gep = OpAccessChain %ptr_wg_int2 %var1 %int_0
+%var1_int_gep = OpAccessChain %ptr_wg_int %var1 %int_0 %int_0
+%var2_int2_gep = OpAccessChain %ptr_wg_int2 %var2 %int_0
+%var2_int_gep = OpAccessChain %ptr_wg_int %var2 %int_0 %int_0
+%var3_int2_gep = OpAccessChain %ptr_wg_int2 %var3 %int_0
+%var3_int_gep = OpAccessChain %ptr_wg_int %var3 %int_0 %int_0
+; var1 vs var2
+%v1_eq_v2 = OpPtrEqual %bool %var1 %var2
+%v1_eq_v2_sel = OpSelect %int %v1_eq_v2 %int_1 %int_0
+%out_gep1 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx0
+%out_idx1 = OpIAdd %int %out_idx0 %int_1
+OpStore %out_gep1 %v1_eq_v2_sel
+%v1_eq_v2_rta = OpPtrEqual %bool %var1_int2_gep %var2_int2_gep
+%v1_eq_v2_rta_sel = OpSelect %int %v1_eq_v2_rta %int_1 %int_0
+%out_gep2 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx1
+%out_idx2 = OpIAdd %int %out_idx1 %int_1
+OpStore %out_gep2 %v1_eq_v2_rta_sel
+%v1_eq_v2_int = OpPtrEqual %bool %var1_int_gep %var2_int_gep
+%v1_eq_v2_int_sel = OpSelect %int %v1_eq_v2_int %int_1 %int_0
+%out_gep3 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx2
+%out_idx3 = OpIAdd %int %out_idx2 %int_1
+OpStore %out_gep3 %v1_eq_v2_int_sel
+; var1 vs var3
+%v1_eq_v3 = OpPtrEqual %bool %var1 %var3
+%v1_eq_v3_sel = OpSelect %int %v1_eq_v3 %int_1 %int_0
+%out_gep4 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx3
+%out_idx4 = OpIAdd %int %out_idx3 %int_1
+OpStore %out_gep4 %v1_eq_v3_sel
+%v1_eq_v3_rta = OpPtrEqual %bool %var1_int2_gep %var3_int2_gep
+%v1_eq_v3_rta_sel = OpSelect %int %v1_eq_v3_rta %int_1 %int_0
+%out_gep5 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx4
+%out_idx5 = OpIAdd %int %out_idx4 %int_1
+OpStore %out_gep5 %v1_eq_v3_rta_sel
+%v1_eq_v3_int = OpPtrEqual %bool %var1_int_gep %var3_int_gep
+%v1_eq_v3_int_sel = OpSelect %int %v1_eq_v3_int %int_1 %int_0
+%out_gep6 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx5
+%out_idx6 = OpIAdd %int %out_idx5 %int_1
+OpStore %out_gep6 %v1_eq_v3_int_sel
+; var2 vs var3
+%v2_eq_v3 = OpPtrEqual %bool %var2 %var3
+%v2_eq_v3_sel = OpSelect %int %v2_eq_v3 %int_1 %int_0
+%out_gep7 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx6
+%out_idx7 = OpIAdd %int %out_idx6 %int_1
+OpStore %out_gep7 %v2_eq_v3_sel
+%v2_eq_v3_rta = OpPtrEqual %bool %var2_int2_gep %var3_int2_gep
+%v2_eq_v3_rta_sel = OpSelect %int %v2_eq_v3_rta %int_1 %int_0
+%out_gep8 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx7
+%out_idx8 = OpIAdd %int %out_idx7 %int_1
+OpStore %out_gep8 %v2_eq_v3_rta_sel
+%v2_eq_v3_int = OpPtrEqual %bool %var2_int_gep %var3_int_gep
+%v2_eq_v3_int_sel = OpSelect %int %v2_eq_v3_int %int_1 %int_0
+%out_gep9 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx8
+%out_idx9 = OpIAdd %int %out_idx8 %int_1
+OpStore %out_gep9 %v2_eq_v3_int_sel
+%v1_eq_v1 = OpPtrEqual %bool %var1 %var1
+%v1_eq_v1_sel = OpSelect %int %v1_eq_v1 %int_1 %int_0
+%out_gep10 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx9
+OpStore %out_gep10 %v1_eq_v1_sel
+OpReturn
+OpFunctionEnd
+[test]
+ssbo 0:0 40
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:0 0 == 0 0 0 0 0 0 0 0 0 1
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/null_comparisons_ssbo_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/null_comparisons_ssbo_equal.amber
new file mode 100644
index 0000000..dceb51c
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/null_comparisons_ssbo_equal.amber
@@ -0,0 +1,89 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VK_KHR_storage_buffer_storage_class
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+; This test generates four results.
+
+; The results are based of OpPtrEqual comparisons of
+; %ssbo_var vs null.
+; 0: comparison of %ssbo_var vs null
+; 1: comparison of SSBO float pointer vs null
+; 2: comparison of null struct vs null struct
+; 3: comparison of null float vs null float
+
+OpCapability Shader
+OpCapability VariablePointersStorageBuffer
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %ssbo_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+
+OpDecorate %ssbo_struct Block
+OpMemberDecorate %ssbo_struct 0 Offset 0
+OpDecorate %ssbo_var DescriptorSet 0
+OpDecorate %ssbo_var Binding 0
+
+OpDecorate %out_struct Block
+OpMemberDecorate %out_struct 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%float = OpTypeFloat 32
+%int = OpTypeInt 32 0
+%int4 = OpTypeVector %int 4
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+
+%ssbo_struct = OpTypeStruct %float
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %ssbo_struct
+%ssbo_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%ptr_ssbo_float = OpTypePointer StorageBuffer %float
+
+%out_struct = OpTypeStruct %int4
+%ptr_out_struct = OpTypePointer StorageBuffer %out_struct
+%out_var = OpVariable %ptr_out_struct StorageBuffer
+%ptr_ssbo_int4 = OpTypePointer StorageBuffer %int4
+
+%ptr_ssbo_struct_null = OpConstantNull %ptr_ssbo_struct
+%ptr_ssbo_float_null = OpConstantNull %ptr_ssbo_float
+%ptr_ssbo_struct_null2 = OpConstantNull %ptr_ssbo_struct
+%ptr_ssbo_float_null2 = OpConstantNull %ptr_ssbo_float
+
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+
+%ssbo_equal = OpPtrEqual %bool %ssbo_var %ptr_ssbo_struct_null
+%ssbo_equal_int = OpSelect %int %ssbo_equal %int_1 %int_0
+
+%ssbo_gep_0 = OpAccessChain %ptr_ssbo_float %ssbo_var %int_0
+%ssbo_equal_0 = OpPtrEqual %bool %ssbo_gep_0 %ptr_ssbo_float_null
+%ssbo_equal_0_int = OpSelect %int %ssbo_equal_0 %int_1 %int_0
+
+%null_ssbo_equal = OpPtrEqual %bool %ptr_ssbo_struct_null %ptr_ssbo_struct_null2
+%null_ssbo_equal_int = OpSelect %int %null_ssbo_equal %int_1 %int_0
+
+%null_ssbo_equal_0 = OpPtrEqual %bool %ptr_ssbo_float_null %ptr_ssbo_float_null2
+%null_ssbo_equal_0_int = OpSelect %int %null_ssbo_equal_0 %int_1 %int_0
+
+%combined = OpCompositeConstruct %int4 %ssbo_equal_int %ssbo_equal_0_int %null_ssbo_equal_int %null_ssbo_equal_0_int
+%out_gep = OpAccessChain %ptr_ssbo_int4 %out_var %int_0
+OpStore %out_gep %combined
+
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 16
+ssbo 0:1 16
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uvec4 0:1 0 == 0 0 1 1
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/null_comparisons_wg_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/null_comparisons_wg_equal.amber
new file mode 100644
index 0000000..e407982
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/null_comparisons_wg_equal.amber
@@ -0,0 +1,85 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VariablePointerFeatures.variablePointers
+VK_KHR_storage_buffer_storage_class
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+; This generates 4 results for OpPtrEqual
+
+; The workgroup variable is a struct containing a single float.
+
+; Results:
+; 0: comparison of the workgroup var vs null
+; 1: comparison of the workgroup float vs null
+; 2: comparison of null struct vs null struct
+; 3: comparison of null float vs null float
+
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %wg_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+
+OpDecorate %out_struct Block
+OpMemberDecorate %out_struct 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 0
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%float = OpTypeFloat 32
+%int = OpTypeInt 32 0
+%int4 = OpTypeVector %int 4
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+
+%wg_struct = OpTypeStruct %float
+%ptr_wg_struct = OpTypePointer Workgroup %wg_struct
+%wg_var = OpVariable %ptr_wg_struct Workgroup
+%ptr_wg_float = OpTypePointer Workgroup %float
+
+%out_struct = OpTypeStruct %int4
+%ptr_out_struct = OpTypePointer StorageBuffer %out_struct
+%out_var = OpVariable %ptr_out_struct StorageBuffer
+%ptr_ssbo_int4 = OpTypePointer StorageBuffer %int4
+
+%ptr_wg_struct_null = OpConstantNull %ptr_wg_struct
+%ptr_wg_float_null = OpConstantNull %ptr_wg_float
+%ptr_wg_struct_null2 = OpConstantNull %ptr_wg_struct
+%ptr_wg_float_null2 = OpConstantNull %ptr_wg_float
+
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+
+%wg_equal = OpPtrEqual %bool %wg_var %ptr_wg_struct_null
+%wg_equal_int = OpSelect %int %wg_equal %int_1 %int_0
+
+%wg_gep_0 = OpAccessChain %ptr_wg_float %wg_var %int_0
+%wg_equal_0 = OpPtrEqual %bool %wg_gep_0 %ptr_wg_float_null
+%wg_equal_0_int = OpSelect %int %wg_equal_0 %int_1 %int_0
+
+%null_wg_equal = OpPtrEqual %bool %ptr_wg_struct_null %ptr_wg_struct_null2
+%null_wg_equal_int = OpSelect %int %null_wg_equal %int_1 %int_0
+
+%null_wg_equal_0 = OpPtrEqual %bool %ptr_wg_float_null %ptr_wg_float_null2
+%null_wg_equal_0_int = OpSelect %int %null_wg_equal_0 %int_1 %int_0
+
+%combined = OpCompositeConstruct %int4 %wg_equal_int %wg_equal_0_int %null_wg_equal_int %null_wg_equal_0_int
+%out_gep = OpAccessChain %ptr_ssbo_int4 %out_var %int_0
+OpStore %out_gep %combined
+
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 16
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uvec4 0:0 0 == 0 0 1 1
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/ssbo_comparisons_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/ssbo_comparisons_equal.amber
new file mode 100644
index 0000000..8faf624
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/ssbo_comparisons_equal.amber
@@ -0,0 +1,177 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VK_KHR_storage_buffer_storage_class
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+; Test operates on a SSBO (%in_var) containing a runtime array of an array of four ints.
+; Size of the runtime array is passed another SSBO (%n_var).
+
+; Each invocation writes out the result of OpPtrEqual
+; for elements of the input runtime array to index 16 of the corresponding output
+; variable. Pointers are based the gid'th element vs the zero'th element.
+
+; Each invocation loops 4 times and writes out results each for
+; OpPtrEqual. The pointers are the lid'th element of gid'th element of
+; the runtime array vs the iteration count element of the gid'th element of
+; the runtime array.
+
+OpCapability Shader
+OpCapability VariablePointersStorageBuffer
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %in_var %equal_var %n_var %lid_var %gid_var
+OpExecutionMode %main LocalSize 4 1 1
+
+OpDecorate %struct_4 Block
+OpMemberDecorate %struct_4 0 Offset 0
+OpDecorate %runtime_4 ArrayStride 16
+OpDecorate %struct_17 Block
+OpMemberDecorate %struct_17 0 Offset 0
+OpDecorate %runtime_17 ArrayStride 68
+OpDecorate %n_struct Block
+OpMemberDecorate %n_struct 0 Offset 0
+OpDecorate %array_4 ArrayStride 4
+OpDecorate %array_17 ArrayStride 4
+
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %equal_var DescriptorSet 0
+OpDecorate %equal_var Binding 1
+OpDecorate %n_var DescriptorSet 0
+OpDecorate %n_var Binding 2
+
+OpDecorate %lid_var BuiltIn LocalInvocationId
+OpDecorate %gid_var BuiltIn WorkgroupId
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 1
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_4 = OpConstant %int 4
+%int_16 = OpConstant %int 16
+%int_17 = OpConstant %int 17
+%int3 = OpTypeVector %int 3
+
+%ptr_input_int3 = OpTypePointer Input %int3
+
+%array_4 = OpTypeArray %int %int_4
+%runtime_4 = OpTypeRuntimeArray %array_4
+%struct_4 = OpTypeStruct %runtime_4
+%ptr_struct_4 = OpTypePointer StorageBuffer %struct_4
+%ptr_array_4 = OpTypePointer StorageBuffer %array_4
+
+%array_17 = OpTypeArray %int %int_17
+%runtime_17 = OpTypeRuntimeArray %array_17
+%struct_17 = OpTypeStruct %runtime_17
+%ptr_struct_17 = OpTypePointer StorageBuffer %struct_17
+%ptr_array_17 = OpTypePointer StorageBuffer %array_17
+
+%ptr_int = OpTypePointer StorageBuffer %int
+%n_struct = OpTypeStruct %int
+%ptr_n_struct = OpTypePointer Uniform %n_struct
+%ptr_n = OpTypePointer Uniform %int
+
+%in_var = OpVariable %ptr_struct_4 StorageBuffer
+%equal_var = OpVariable %ptr_struct_17 StorageBuffer
+%n_var = OpVariable %ptr_n_struct Uniform
+%lid_var = OpVariable %ptr_input_int3 Input
+%gid_var = OpVariable %ptr_input_int3 Input
+
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%n_gep = OpAccessChain %ptr_n %n_var %int_0
+%n = OpLoad %int %n_gep
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%lid = OpLoad %int3 %lid_var
+%lid_x = OpCompositeExtract %int %lid 0
+%array_gep_0 = OpAccessChain %ptr_array_4 %in_var %int_0 %int_0
+%array_gep = OpAccessChain %ptr_array_4 %in_var %int_0 %gid_x
+%cmp_gid = OpSGreaterThanEqual %bool %gid_x %n
+OpSelectionMerge %body None
+OpBranchConditional %cmp_gid %ret %body
+
+%ret = OpLabel
+OpReturn
+
+%body = OpLabel
+%cmp_lid = OpIEqual %bool %lid_x %int_1
+OpSelectionMerge %loop None
+OpBranchConditional %cmp_lid %then %loop
+
+%then = OpLabel
+; Compute results for outer array
+%large_equal = OpPtrEqual %bool %array_gep %array_gep_0
+%large_equal_gep = OpAccessChain %ptr_int %equal_var %int_0 %gid_x %int_16
+%large_equal_int = OpSelect %int %large_equal %int_1 %int_0
+OpStore %large_equal_gep %large_equal_int
+;
+OpBranch %loop
+
+%loop = OpLabel
+%i = OpPhi %int %int_0 %body %int_0 %then %inc_i %loop
+%inc_i = OpIAdd %int %i %int_1
+%i_cmp = OpIEqual %bool %inc_i %int_4
+%lid_offset = OpIMul %int %lid_x %int_4
+%gep_offset = OpIAdd %int %lid_offset %i
+; Compute results for inner array
+%ref_gep = OpAccessChain %ptr_int %array_gep %lid_x
+%cmp_gep = OpAccessChain %ptr_int %array_gep %i
+%equal = OpPtrEqual %bool %ref_gep %cmp_gep
+%equal_int = OpSelect %int %equal %int_1 %int_0
+%equal_gep = OpAccessChain %ptr_int %equal_var %int_0 %gid_x %gep_offset
+OpStore %equal_gep %equal_int
+;
+OpLoopMerge %exit %loop None
+OpBranchConditional %i_cmp %exit %loop
+
+%exit = OpLabel
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 2048
+ssbo 0:1 2176
+uniform ubo 0:2 int 0 32
+
+compute entrypoint main
+compute 32 1 1
+
+
+#equal var
+probe ssbo int 0:1 0 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1
+probe ssbo int 0:1 68 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 136 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 204 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 272 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 340 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 408 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 476 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 544 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 612 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 680 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 748 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 816 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 884 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 952 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 1020 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 1088 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 1156 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 1224 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 1292 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 1360 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 1428 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 1496 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 1564 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 1632 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 1700 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 1768 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 1836 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 1904 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 1972 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 2040 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:1 2108 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/variable_pointers_ssbo_2_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/variable_pointers_ssbo_2_equal.amber
new file mode 100644
index 0000000..6da8ebb
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/variable_pointers_ssbo_2_equal.amber
@@ -0,0 +1,133 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VariablePointerFeatures.variablePointers
+VK_KHR_storage_buffer_storage_class
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+; Tests pointer comparisons with variable pointers
+
+; Stores an array of pointers in Function storage class that point into input
+; SSBO. Each iteration produces an OpPtrEqual comparison. Pointers evolve by
+; incrementing or decrementing by 1 each iteration (overall ratio is 2:1).
+
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+
+OpDecorate %int_rta ArrayStride 4
+OpDecorate %in_struct Block
+OpMemberDecorate %in_struct 0 Offset 0
+OpMemberDecorate %in_struct 1 Offset 4
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+
+OpDecorate %out_struct Block
+OpMemberDecorate %out_struct 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+
+OpDecorate %ptr_ssbo_int ArrayStride 4
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%uint = OpTypeInt 32 0
+%int = OpTypeInt 32 1
+%int_n1 = OpConstant %int -1
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int_3 = OpConstant %int 3
+
+%int_rta = OpTypeRuntimeArray %int
+%in_struct = OpTypeStruct %int %int_rta
+%ptr_ssbo_in_struct = OpTypePointer StorageBuffer %in_struct
+%in_var = OpVariable %ptr_ssbo_in_struct StorageBuffer
+
+%out_struct = OpTypeStruct %int_rta
+%ptr_ssbo_out_struct = OpTypePointer StorageBuffer %out_struct
+%out_var = OpVariable %ptr_ssbo_out_struct StorageBuffer
+
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%array_ptr = OpTypeArray %ptr_ssbo_int %int_2
+%ptr_ptr = OpTypePointer Function %array_ptr
+%ptr_func_ptr = OpTypePointer Function %ptr_ssbo_int
+
+%ptr_ssbo_n = OpTypePointer StorageBuffer %int
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%var = OpVariable %ptr_ptr Function
+%n_gep = OpAccessChain %ptr_ssbo_n %in_var %int_0
+%n = OpLoad %int %n_gep
+%length = OpArrayLength %uint %in_var 1
+%length_div_2 = OpSDiv %int %length %int_2
+%mid_gep = OpAccessChain %ptr_ssbo_int %in_var %int_1 %length_div_2
+%func_gep_0 = OpAccessChain %ptr_func_ptr %var %int_0
+%func_gep_1 = OpAccessChain %ptr_func_ptr %var %int_1
+OpStore %func_gep_0 %mid_gep
+OpStore %func_gep_1 %mid_gep
+%cmp_n = OpSLessThanEqual %bool %n %int_0
+OpSelectionMerge %exit None
+OpBranchConditional %cmp_n %exit %loop
+
+%loop = OpLabel
+%i = OpPhi %int %int_0 %entry %inc_i %continue
+%gep_0 = OpLoad %ptr_ssbo_int %func_gep_0
+%gep_1 = OpLoad %ptr_ssbo_int %func_gep_1
+%inc_i = OpIAdd %int %i %int_1
+
+%equal = OpPtrEqual %bool %gep_0 %gep_1
+%equal_int = OpSelect %int %equal %int_1 %int_0
+%out_gep = OpAccessChain %ptr_ssbo_int %out_var %int_0 %i
+OpStore %out_gep %equal_int
+
+OpLoopMerge %loop_exit %continue None
+OpBranch %body
+
+%body = OpLabel
+%i_mod_3 = OpSMod %int %i %int_3
+%cmp_vs_0 = OpIEqual %bool %i_mod_3 %int_0
+OpSelectionMerge %if_merge None
+OpBranchConditional %cmp_vs_0 %then %else
+
+%then = OpLabel
+%then_0_next = OpPtrAccessChain %ptr_ssbo_int %gep_0 %int_n1
+%then_1_next = OpPtrAccessChain %ptr_ssbo_int %gep_1 %int_1
+OpBranch %if_merge
+%else = OpLabel
+%else_0_next = OpPtrAccessChain %ptr_ssbo_int %gep_0 %int_1
+%else_1_next = OpPtrAccessChain %ptr_ssbo_int %gep_1 %int_n1
+OpBranch %if_merge
+
+%if_merge = OpLabel
+%next_0 = OpPhi %ptr_ssbo_int %then_0_next %then %else_0_next %else
+%next_1 = OpPhi %ptr_ssbo_int %then_1_next %then %else_1_next %else
+OpBranch %continue
+
+%continue = OpLabel
+OpStore %func_gep_0 %next_0
+OpStore %func_gep_1 %next_1
+%cmp = OpSGreaterThanEqual %bool %i %n
+OpBranchConditional %cmp %loop_exit %loop
+
+%loop_exit = OpLabel
+OpBranch %exit
+%exit = OpLabel
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 68
+ssbo 0:0 subdata uint 0 16
+ssbo 0:1 64
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:1 0 == 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/variable_pointers_ssbo_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/variable_pointers_ssbo_equal.amber
new file mode 100644
index 0000000..8f2b8a9
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/variable_pointers_ssbo_equal.amber
@@ -0,0 +1,113 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VK_KHR_storage_buffer_storage_class
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+; This test generates four results per iteration of the loop. The loop is executed %n times.
+
+; Each iteration generates a result for OpPtrEqual. One
+; pointer is an iterator through the input SSBO (%in_var) and the other is a
+; selection between the iterator, null or the 0'th index pointer depending on
+; the value of the iterator mod 3.
+
+OpCapability Shader
+OpCapability VariablePointersStorageBuffer
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+
+OpDecorate %int_rta ArrayStride 4
+OpDecorate %ptr_ssbo_int ArrayStride 4
+
+OpDecorate %in_struct Block
+OpMemberDecorate %in_struct 0 Offset 0
+OpMemberDecorate %in_struct 1 Offset 4
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+
+OpDecorate %out_struct Block
+OpMemberDecorate %out_struct 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 1
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int_3 = OpConstant %int 3
+%int2 = OpTypeVector %int 2
+%int_rta = OpTypeRuntimeArray %int
+%int2_rta = OpTypeRuntimeArray %int2
+
+%in_struct = OpTypeStruct %int %int_rta
+%ptr_ssbo_in_struct = OpTypePointer StorageBuffer %in_struct
+%in_var = OpVariable %ptr_ssbo_in_struct StorageBuffer
+
+%out_struct = OpTypeStruct %int_rta
+%ptr_ssbo_out_struct = OpTypePointer StorageBuffer %out_struct
+%out_var = OpVariable %ptr_ssbo_out_struct StorageBuffer
+
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%ptr_ssbo_int_null = OpConstantNull %ptr_ssbo_int
+%ptr_ssbo_n = OpTypePointer StorageBuffer %int
+%ptr_ssbo_int2 = OpTypePointer StorageBuffer %int2
+%void_fn = OpTypeFunction %void
+%ptr_return_fn = OpTypeFunction %ptr_ssbo_int %ptr_ssbo_int %ptr_ssbo_int %int
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%n_gep = OpAccessChain %ptr_ssbo_n %in_var %int_0
+%n = OpLoad %int %n_gep
+%base_ssbo_gep = OpAccessChain %ptr_ssbo_int %in_var %int_1 %int_0
+%n_leq_0 = OpSLessThanEqual %bool %n %int_0
+OpSelectionMerge %exit None
+OpBranchConditional %n_leq_0 %exit %loop
+
+%loop = OpLabel
+%i = OpPhi %int %int_0 %entry %inc_i %loop
+%ssbo_gep = OpPhi %ptr_ssbo_int %base_ssbo_gep %entry %next_ssbo_gep %loop
+%inc_i = OpIAdd %int %i %int_1
+%next_ssbo_gep = OpPtrAccessChain %ptr_ssbo_int %ssbo_gep %int_1
+
+%ptr_call = OpFunctionCall %ptr_ssbo_int %gep_func %ssbo_gep %base_ssbo_gep %i
+%equal = OpPtrEqual %bool %ssbo_gep %ptr_call
+%equal_int = OpSelect %int %equal %int_1 %int_0
+%out_gep = OpAccessChain %ptr_ssbo_int %out_var %int_0 %i
+OpStore %out_gep %equal_int
+
+%cmp = OpSGreaterThanEqual %bool %i %n
+OpLoopMerge %loop_exit %loop None
+OpBranchConditional %cmp %loop_exit %loop
+
+%loop_exit = OpLabel
+OpBranch %exit
+%exit = OpLabel
+OpReturn
+OpFunctionEnd
+
+%gep_func = OpFunction %ptr_ssbo_int None %ptr_return_fn
+%param_ptr = OpFunctionParameter %ptr_ssbo_int
+%param_alt_ptr = OpFunctionParameter %ptr_ssbo_int
+%param_i = OpFunctionParameter %int
+%1 = OpLabel
+%i_mod_3 = OpSMod %int %param_i %int_3
+%i_mod_3_is_0 = OpIEqual %bool %i_mod_3 %int_0
+%i_mod_3_is_1 = OpIEqual %bool %i_mod_3 %int_1
+%ssbo_gep1 = OpSelect %ptr_ssbo_int %i_mod_3_is_0 %param_alt_ptr %ptr_ssbo_int_null
+%ssbo_gep2 = OpSelect %ptr_ssbo_int %i_mod_3_is_1 %param_ptr %ssbo_gep1
+OpReturnValue %ssbo_gep2
+OpFunctionEnd
+
+[test]
+ssbo 0:0 132
+ssbo 0:0 subdata int 0 33
+ssbo 0:1 132
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo int 0:1 0 == 1 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/variable_pointers_vars_ssbo_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/variable_pointers_vars_ssbo_equal.amber
new file mode 100644
index 0000000..cd6675b
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/variable_pointers_vars_ssbo_equal.amber
@@ -0,0 +1,139 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VK_KHR_storage_buffer_storage_class
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+; Tests use of private variables holding SSBO pointers and pointer comparisons.
+
+; Two iterators are each stored in Private variables: one moves forward, one
+; moves backward. In each iteration an OpPtrEqual comparison is written.
+; Iterators are then moved forward (or backward respectively) one index.
+
+OpCapability Shader
+OpCapability VariablePointersStorageBuffer
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %in_var %out_var %forward_var %backward_var
+OpExecutionMode %main LocalSize 1 1 1
+
+OpDecorate %int_rta ArrayStride 4
+OpDecorate %in_struct Block
+OpMemberDecorate %in_struct 0 Offset 0
+OpMemberDecorate %in_struct 1 Offset 4
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+
+OpDecorate %out_struct Block
+OpMemberDecorate %out_struct 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+
+OpDecorate %ptr_ssbo_int ArrayStride 4
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 1
+%int_n1 = OpConstant %int -1
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int_3 = OpConstant %int 3
+
+%int_rta = OpTypeRuntimeArray %int
+%in_struct = OpTypeStruct %int %int_rta
+%ptr_ssbo_in_struct = OpTypePointer StorageBuffer %in_struct
+%in_var = OpVariable %ptr_ssbo_in_struct StorageBuffer
+
+%out_struct = OpTypeStruct %int_rta
+%ptr_ssbo_out_struct = OpTypePointer StorageBuffer %out_struct
+%out_var = OpVariable %ptr_ssbo_out_struct StorageBuffer
+
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%ptr_ptr = OpTypePointer Private %ptr_ssbo_int
+%forward_var = OpVariable %ptr_ptr Private
+%backward_var = OpVariable %ptr_ptr Private
+
+%ptr_ssbo_n = OpTypePointer StorageBuffer %int
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%n_gep = OpAccessChain %ptr_ssbo_n %in_var %int_0
+%n = OpLoad %int %n_gep
+%first_gep = OpAccessChain %ptr_ssbo_int %in_var %int_1 %int_0
+OpStore %forward_var %first_gep
+%last_gep = OpPtrAccessChain %ptr_ssbo_int %first_gep %n
+OpStore %backward_var %last_gep
+%cmp_n = OpSLessThanEqual %bool %n %int_0
+OpSelectionMerge %exit None
+OpBranchConditional %cmp_n %exit %loop
+
+%loop = OpLabel
+%i = OpPhi %int %int_0 %entry %inc_i %loop
+%forward_gep = OpLoad %ptr_ssbo_int %forward_var
+%backward_gep = OpLoad %ptr_ssbo_int %backward_var
+%forward_next = OpPtrAccessChain %ptr_ssbo_int %forward_gep %int_1
+%backward_next = OpPtrAccessChain %ptr_ssbo_int %backward_gep %int_n1
+%inc_i = OpIAdd %int %i %int_1
+OpStore %forward_var %forward_next
+OpStore %backward_var %backward_next
+
+%equal = OpPtrEqual %bool %forward_gep %backward_gep
+%equal_int = OpSelect %int %equal %int_1 %int_0
+%out_gep = OpAccessChain %ptr_ssbo_int %out_var %int_0 %i
+OpStore %out_gep %equal_int
+
+%cmp = OpSGreaterThanEqual %bool %i %n
+OpLoopMerge %loop_exit %loop None
+OpBranchConditional %cmp %loop_exit %loop
+
+%loop_exit = OpLabel
+OpBranch %exit
+%exit = OpLabel
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 132
+# Only data for number of iterations matters.
+ssbo 0:0 subdata int 0 32
+ssbo 0:1 128
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo int 0:1 0 == 0
+probe ssbo int 0:1 4 == 0
+probe ssbo int 0:1 8 == 0
+probe ssbo int 0:1 12 == 0
+probe ssbo int 0:1 16 == 0
+probe ssbo int 0:1 20 == 0
+probe ssbo int 0:1 24 == 0
+probe ssbo int 0:1 28 == 0
+probe ssbo int 0:1 32 == 0
+probe ssbo int 0:1 36 == 0
+probe ssbo int 0:1 40 == 0
+probe ssbo int 0:1 44 == 0
+probe ssbo int 0:1 48 == 0
+probe ssbo int 0:1 52 == 0
+probe ssbo int 0:1 56 == 0
+probe ssbo int 0:1 60 == 0
+probe ssbo int 0:1 64 == 1
+probe ssbo int 0:1 68 == 0
+probe ssbo int 0:1 72 == 0
+probe ssbo int 0:1 76 == 0
+probe ssbo int 0:1 80 == 0
+probe ssbo int 0:1 84 == 0
+probe ssbo int 0:1 88 == 0
+probe ssbo int 0:1 92 == 0
+probe ssbo int 0:1 96 == 0
+probe ssbo int 0:1 100 == 0
+probe ssbo int 0:1 104 == 0
+probe ssbo int 0:1 108 == 0
+probe ssbo int 0:1 112 == 0
+probe ssbo int 0:1 116 == 0
+probe ssbo int 0:1 120 == 0
+probe ssbo int 0:1 124 == 0
+
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/variable_pointers_vars_wg_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/variable_pointers_vars_wg_equal.amber
new file mode 100644
index 0000000..1363c9d
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/variable_pointers_vars_wg_equal.amber
@@ -0,0 +1,125 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VariablePointerFeatures.variablePointers
+VK_KHR_storage_buffer_storage_class
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+; Tests use of private variables holding workgroup pointers and pointer comparisons.
+
+; Two iterators are each stored in Private variables: one moves forward, one
+; moves backward. In each iteration an equal comparison is written. Iterators
+; are then moved forward (or backward respectively) one index.
+
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %wg_var %out_var %forward_var %backward_var
+OpExecutionMode %main LocalSize 1 1 1
+
+OpDecorate %int_rta ArrayStride 4
+OpDecorate %out_struct Block
+OpMemberDecorate %out_struct 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 0
+
+OpDecorate %ptr_wg_int ArrayStride 4
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 1
+%int_n1 = OpConstant %int -1
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int_3 = OpConstant %int 3
+%int_32 = OpConstant %int 32
+
+%int_array_32 = OpTypeArray %int %int_32
+%ptr_wg_array = OpTypePointer Workgroup %int_array_32
+%wg_var = OpVariable %ptr_wg_array Workgroup
+
+%int_rta = OpTypeRuntimeArray %int
+%out_struct = OpTypeStruct %int_rta
+%ptr_ssbo_out_struct = OpTypePointer StorageBuffer %out_struct
+%out_var = OpVariable %ptr_ssbo_out_struct StorageBuffer
+
+%ptr_wg_int = OpTypePointer Workgroup %int
+%ptr_ptr = OpTypePointer Private %ptr_wg_int
+%forward_var = OpVariable %ptr_ptr Private
+%backward_var = OpVariable %ptr_ptr Private
+
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%first_gep = OpAccessChain %ptr_wg_int %wg_var %int_0
+OpStore %forward_var %first_gep
+%last_gep = OpPtrAccessChain %ptr_wg_int %first_gep %int_32
+OpStore %backward_var %last_gep
+OpBranch %loop
+
+%loop = OpLabel
+%i = OpPhi %int %int_0 %entry %inc_i %loop
+%forward_gep = OpLoad %ptr_wg_int %forward_var
+%backward_gep = OpLoad %ptr_wg_int %backward_var
+%forward_next = OpPtrAccessChain %ptr_wg_int %forward_gep %int_1
+%backward_next = OpPtrAccessChain %ptr_wg_int %backward_gep %int_n1
+%inc_i = OpIAdd %int %i %int_1
+OpStore %forward_var %forward_next
+OpStore %backward_var %backward_next
+
+%equal = OpPtrEqual %bool %forward_gep %backward_gep
+%equal_int = OpSelect %int %equal %int_1 %int_0
+%out_gep = OpAccessChain %ptr_ssbo_int %out_var %int_0 %i
+OpStore %out_gep %equal_int
+
+%cmp = OpSGreaterThan %bool %i %int_32
+OpLoopMerge %exit %loop None
+OpBranchConditional %cmp %exit %loop
+
+%exit = OpLabel
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 528
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo int 0:0 0 == 0
+probe ssbo int 0:0 4 == 0
+probe ssbo int 0:0 8 == 0
+probe ssbo int 0:0 12 == 0
+probe ssbo int 0:0 16 == 0
+probe ssbo int 0:0 20 == 0
+probe ssbo int 0:0 24 == 0
+probe ssbo int 0:0 28 == 0
+probe ssbo int 0:0 32 == 0
+probe ssbo int 0:0 36 == 0
+probe ssbo int 0:0 40 == 0
+probe ssbo int 0:0 44 == 0
+probe ssbo int 0:0 48 == 0
+probe ssbo int 0:0 52 == 0
+probe ssbo int 0:0 56 == 0
+probe ssbo int 0:0 60 == 0
+probe ssbo int 0:0 64 == 1
+probe ssbo int 0:0 68 == 0
+probe ssbo int 0:0 72 == 0
+probe ssbo int 0:0 76 == 0
+probe ssbo int 0:0 80 == 0
+probe ssbo int 0:0 84 == 0
+probe ssbo int 0:0 88 == 0
+probe ssbo int 0:0 92 == 0
+probe ssbo int 0:0 96 == 0
+probe ssbo int 0:0 100 == 0
+probe ssbo int 0:0 104 == 0
+probe ssbo int 0:0 108 == 0
+probe ssbo int 0:0 112 == 0
+probe ssbo int 0:0 116 == 0
+probe ssbo int 0:0 120 == 0
+probe ssbo int 0:0 124 == 0
+probe ssbo int 0:0 128 == 0
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/variable_pointers_wg_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/variable_pointers_wg_equal.amber
new file mode 100644
index 0000000..7b17d96
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/variable_pointers_wg_equal.amber
@@ -0,0 +1,98 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VariablePointerFeatures.variablePointers
+VK_KHR_storage_buffer_storage_class
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+; This test generates four results per iteration of the loop. The loop is executed 64 times.
+
+; Each iteration generates results for OpPtrEqual. One pointer is an iterator
+; through the workgroup variable (%wg_var) and the other is a selection between
+; the iterator, null or the 0'th index pointer depending on the value of the
+; iterator mod 3.
+
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %wg_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+
+OpDecorate %int_rta ArrayStride 4
+OpDecorate %ptr_wg_int ArrayStride 4
+
+OpDecorate %out_struct Block
+OpMemberDecorate %out_struct 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 0
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 1
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int_3 = OpConstant %int 3
+%int_32 = OpConstant %int 32
+%int_array = OpTypeArray %int %int_32
+%int_rta = OpTypeRuntimeArray %int
+
+%ptr_wg_int_array = OpTypePointer Workgroup %int_array
+%wg_var = OpVariable %ptr_wg_int_array Workgroup
+
+%out_struct = OpTypeStruct %int_rta
+%ptr_ssbo_out_struct = OpTypePointer StorageBuffer %out_struct
+%out_var = OpVariable %ptr_ssbo_out_struct StorageBuffer
+
+%ptr_wg_int = OpTypePointer Workgroup %int
+%ptr_wg_int_null = OpConstantNull %ptr_wg_int
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%void_fn = OpTypeFunction %void
+%ptr_return_fn = OpTypeFunction %ptr_wg_int %ptr_wg_int %ptr_wg_int %int
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%base_wg_gep = OpAccessChain %ptr_wg_int %wg_var %int_0
+OpBranch %loop
+
+%loop = OpLabel
+%i = OpPhi %int %int_0 %entry %inc_i %loop
+%wg_gep = OpPhi %ptr_wg_int %base_wg_gep %entry %next_wg_gep %loop
+%inc_i = OpIAdd %int %i %int_1
+%next_wg_gep = OpPtrAccessChain %ptr_wg_int %wg_gep %int_1
+
+%ptr_call = OpFunctionCall %ptr_wg_int %gep_func %wg_gep %base_wg_gep %i
+%equal = OpPtrEqual %bool %wg_gep %ptr_call
+%equal_int = OpSelect %int %equal %int_1 %int_0
+%out_gep = OpAccessChain %ptr_ssbo_int %out_var %int_0 %i
+OpStore %out_gep %equal_int
+
+%cmp = OpSGreaterThan %bool %i %int_32
+OpLoopMerge %exit %loop None
+OpBranchConditional %cmp %exit %loop
+
+%exit = OpLabel
+OpReturn
+OpFunctionEnd
+
+%gep_func = OpFunction %ptr_wg_int None %ptr_return_fn
+%param_ptr = OpFunctionParameter %ptr_wg_int
+%param_alt_ptr = OpFunctionParameter %ptr_wg_int
+%param_i = OpFunctionParameter %int
+%1 = OpLabel
+%i_mod_3 = OpSMod %int %param_i %int_3
+%i_mod_3_is_0 = OpIEqual %bool %i_mod_3 %int_0
+%i_mod_3_is_1 = OpIEqual %bool %i_mod_3 %int_1
+%wg_gep1 = OpSelect %ptr_wg_int %i_mod_3_is_0 %param_alt_ptr %ptr_wg_int_null
+%wg_gep2 = OpSelect %ptr_wg_int %i_mod_3_is_1 %param_ptr %wg_gep1
+OpReturnValue %wg_gep2
+OpFunctionEnd
+
+[test]
+ssbo 0:0 132
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo int 0:0 0 == 1 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/wg_comparisons_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/wg_comparisons_equal.amber
new file mode 100644
index 0000000..fdc491e
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/wg_comparisons_equal.amber
@@ -0,0 +1,160 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VariablePointerFeatures.variablePointers
+VK_KHR_storage_buffer_storage_class
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+; Test operates on a Workgroup array (%wg_var) containing an array of 16 arrays of four ints.
+
+; Each invocation writes out the result of OpPtrEqual for elements of the
+; outer array to index 16 of the corresponding output variable. Pointers are
+; based the gid'th element vs the zero'th element.
+
+; Each invocation loops 4 times and writes out 4 results each for OpPtrEqual.
+; The pointers are the lid'th element of gid'th element of the outer array vs
+; the iteration count mod 4'th element of the gid'th element of the outer
+; array. Results are ordered so each thread writes continguous results.
+
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %wg_var %equal_var %lid_var %gid_var
+OpExecutionMode %main LocalSize 16 4 1
+
+OpDecorate %struct_17 Block
+OpMemberDecorate %struct_17 0 Offset 0
+OpDecorate %runtime_17 ArrayStride 68
+OpDecorate %array_17 ArrayStride 4
+
+OpDecorate %equal_var DescriptorSet 0
+OpDecorate %equal_var Binding 0
+
+OpDecorate %lid_var BuiltIn LocalInvocationId
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 1
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_4 = OpConstant %int 4
+%int_16 = OpConstant %int 16
+%int_17 = OpConstant %int 17
+%int_64 = OpConstant %int 64
+%int3 = OpTypeVector %int 3
+
+%ptr_input_int3 = OpTypePointer Input %int3
+
+%array_4 = OpTypeArray %int %int_4
+%array_array_4 = OpTypeArray %array_4 %int_16
+%ptr_array_array_4 = OpTypePointer Workgroup %array_array_4
+%ptr_array_4 = OpTypePointer Workgroup %array_4
+%ptr_wg_int = OpTypePointer Workgroup %int
+
+%array_17 = OpTypeArray %int %int_17
+%runtime_17 = OpTypeRuntimeArray %array_17
+%struct_17 = OpTypeStruct %runtime_17
+%ptr_struct_17 = OpTypePointer StorageBuffer %struct_17
+%ptr_array_17 = OpTypePointer StorageBuffer %array_17
+%ptr_int = OpTypePointer StorageBuffer %int
+
+%wg_var = OpVariable %ptr_array_array_4 Workgroup
+%equal_var = OpVariable %ptr_struct_17 StorageBuffer
+%lid_var = OpVariable %ptr_input_int3 Input
+%gid_var = OpVariable %ptr_input_int3 Input
+
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%gid_y = OpCompositeExtract %int %gid 1
+%lid = OpLoad %int3 %lid_var
+%lid_x = OpCompositeExtract %int %lid 0
+%lid_y = OpCompositeExtract %int %lid 1
+%array_gep_0 = OpAccessChain %ptr_array_4 %wg_var %int_0
+%array_gep = OpAccessChain %ptr_array_4 %wg_var %lid_x
+%lid_y_is_1 = OpIEqual %bool %lid_y %int_1
+OpSelectionMerge %loop None
+OpBranchConditional %lid_y_is_1 %then %loop
+
+%then = OpLabel
+; Compute results for outer array
+%large_equal = OpPtrEqual %bool %array_gep %array_gep_0
+%large_equal_gep = OpAccessChain %ptr_int %equal_var %int_0 %gid_x %int_16
+%large_equal_int = OpSelect %int %large_equal %int_1 %int_0
+OpStore %large_equal_gep %large_equal_int
+;
+OpBranch %loop
+
+%loop = OpLabel
+%i = OpPhi %int %int_0 %entry %int_0 %then %inc_i %loop
+%inc_i = OpIAdd %int %i %int_1
+%i_cmp = OpIEqual %bool %inc_i %int_4
+%lid_offset = OpIMul %int %lid_y %int_4
+%out_gep_index = OpIAdd %int %i %lid_offset
+; Compute results for inner array
+%ref_gep = OpAccessChain %ptr_wg_int %array_gep %lid_y
+%cmp_gep = OpAccessChain %ptr_wg_int %array_gep %i
+%equal = OpPtrEqual %bool %ref_gep %cmp_gep
+%equal_int = OpSelect %int %equal %int_1 %int_0
+%equal_gep = OpAccessChain %ptr_int %equal_var %int_0 %gid_x %out_gep_index
+OpStore %equal_gep %equal_int
+;
+OpLoopMerge %exit %loop None
+OpBranchConditional %i_cmp %exit %loop
+
+%exit = OpLabel
+OpReturn
+OpFunctionEnd
+
+
+[test]
+# 16 x 4 x 2 = 128 work items
+# 4 x 4 = 16 bytes per invocation
+# 2048 bytes from looping
+# 16 x 2 = 32 coarse results (1 per lid)
+# 128 bytes
+# 2176 total bytes
+ssbo 0:0 2176
+
+compute entrypoint main
+compute 2 1 1
+
+#equal var
+probe ssbo int 0:0 0 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1
+probe ssbo int 0:0 68 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 136 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 204 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 272 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 340 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 408 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 476 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 544 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 612 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 680 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 748 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 816 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 884 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 952 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 1020 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 1088 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1
+probe ssbo int 0:0 1156 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 1224 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 1292 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 1360 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 1428 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 1496 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 1564 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 1632 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 1700 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 1768 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 1836 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 1904 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 1972 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 2040 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+probe ssbo int 0:0 2108 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/different_ssbos_not_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/different_ssbos_not_equal.amber
new file mode 100644
index 0000000..e4226b9
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/different_ssbos_not_equal.amber
@@ -0,0 +1,112 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %var1 %var2 %var3 %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %rta ArrayStride 4
+OpDecorate %struct Block
+OpMemberDecorate %struct 0 Offset 0
+OpDecorate %var1 DescriptorSet 0
+OpDecorate %var1 Binding 0
+OpDecorate %var2 DescriptorSet 0
+OpDecorate %var2 Binding 1
+OpDecorate %var3 DescriptorSet 0
+OpDecorate %var3 Binding 2
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 3
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%rta = OpTypeRuntimeArray %int
+%struct = OpTypeStruct %rta
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
+%ptr_ssbo_rta = OpTypePointer StorageBuffer %rta
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%var1 = OpVariable %ptr_ssbo_struct StorageBuffer
+%var2 = OpVariable %ptr_ssbo_struct StorageBuffer
+%var3 = OpVariable %ptr_ssbo_struct StorageBuffer
+%out_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%out_idx0 = OpCopyObject %int %int_0
+%var1_rta_gep = OpAccessChain %ptr_ssbo_rta %var1 %int_0
+%var1_int_gep = OpAccessChain %ptr_ssbo_int %var1 %int_0 %int_0
+%var2_rta_gep = OpAccessChain %ptr_ssbo_rta %var2 %int_0
+%var2_int_gep = OpAccessChain %ptr_ssbo_int %var2 %int_0 %int_0
+%var3_rta_gep = OpAccessChain %ptr_ssbo_rta %var3 %int_0
+%var3_int_gep = OpAccessChain %ptr_ssbo_int %var3 %int_0 %int_0
+; var1 vs var2
+%v1_neq_v2 = OpPtrNotEqual %bool %var1 %var2
+%v1_neq_v2_sel = OpSelect %int %v1_neq_v2 %int_1 %int_0
+%out_gep1 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx0
+%out_idx1 = OpIAdd %int %out_idx0 %int_1
+OpStore %out_gep1 %v1_neq_v2_sel
+%v1_neq_v2_rta = OpPtrNotEqual %bool %var1_rta_gep %var2_rta_gep
+%v1_neq_v2_rta_sel = OpSelect %int %v1_neq_v2_rta %int_1 %int_0
+%out_gep2 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx1
+%out_idx2 = OpIAdd %int %out_idx1 %int_1
+OpStore %out_gep2 %v1_neq_v2_rta_sel
+%v1_neq_v2_int = OpPtrNotEqual %bool %var1_int_gep %var2_int_gep
+%v1_neq_v2_int_sel = OpSelect %int %v1_neq_v2_int %int_1 %int_0
+%out_gep3 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx2
+%out_idx3 = OpIAdd %int %out_idx2 %int_1
+OpStore %out_gep3 %v1_neq_v2_int_sel
+; var1 vs var3
+%v1_neq_v3 = OpPtrNotEqual %bool %var1 %var3
+%v1_neq_v3_sel = OpSelect %int %v1_neq_v3 %int_1 %int_0
+%out_gep4 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx3
+%out_idx4 = OpIAdd %int %out_idx3 %int_1
+OpStore %out_gep4 %v1_neq_v3_sel
+%v1_neq_v3_rta = OpPtrNotEqual %bool %var1_rta_gep %var3_rta_gep
+%v1_neq_v3_rta_sel = OpSelect %int %v1_neq_v3_rta %int_1 %int_0
+%out_gep5 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx4
+%out_idx5 = OpIAdd %int %out_idx4 %int_1
+OpStore %out_gep5 %v1_neq_v3_rta_sel
+%v1_neq_v3_int = OpPtrNotEqual %bool %var1_int_gep %var3_int_gep
+%v1_neq_v3_int_sel = OpSelect %int %v1_neq_v3_int %int_1 %int_0
+%out_gep6 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx5
+%out_idx6 = OpIAdd %int %out_idx5 %int_1
+OpStore %out_gep6 %v1_neq_v3_int_sel
+; var2 vs var3
+%v2_neq_v3 = OpPtrNotEqual %bool %var2 %var3
+%v2_neq_v3_sel = OpSelect %int %v2_neq_v3 %int_1 %int_0
+%out_gep7 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx6
+%out_idx7 = OpIAdd %int %out_idx6 %int_1
+OpStore %out_gep7 %v2_neq_v3_sel
+%v2_neq_v3_rta = OpPtrNotEqual %bool %var2_rta_gep %var3_rta_gep
+%v2_neq_v3_rta_sel = OpSelect %int %v2_neq_v3_rta %int_1 %int_0
+%out_gep8 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx7
+%out_idx8 = OpIAdd %int %out_idx7 %int_1
+OpStore %out_gep8 %v2_neq_v3_rta_sel
+%v2_neq_v3_int = OpPtrNotEqual %bool %var2_int_gep %var3_int_gep
+%v2_neq_v3_int_sel = OpSelect %int %v2_neq_v3_int %int_1 %int_0
+%out_gep9 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx8
+%out_idx9 = OpIAdd %int %out_idx8 %int_1
+OpStore %out_gep9 %v2_neq_v3_int_sel
+%v1_neq_v1 = OpPtrNotEqual %bool %var1 %var1
+%v1_neq_v1_sel = OpSelect %int %v1_neq_v1 %int_1 %int_0
+%out_gep10 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx9
+OpStore %out_gep10 %v1_neq_v1_sel
+OpReturn
+OpFunctionEnd
+[test]
+ssbo 0:0 4
+ssbo 0:1 4
+ssbo 0:2 4
+ssbo 0:3 40
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:3 0 == 1 1 1 1 1 1 1 1 1 0
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/different_wgs_not_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/different_wgs_not_equal.amber
new file mode 100644
index 0000000..718ec3b
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/different_wgs_not_equal.amber
@@ -0,0 +1,109 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %var1 %var2 %var3 %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %rta ArrayStride 4
+OpDecorate %struct Block
+OpMemberDecorate %struct 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 0
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%rta = OpTypeRuntimeArray %int
+%struct = OpTypeStruct %rta
+%int2 = OpTypeVector %int 2
+%wg_struct = OpTypeStruct %int2
+%ptr_wg_struct = OpTypePointer Workgroup %wg_struct
+%ptr_wg_int2 = OpTypePointer Workgroup %int2
+%ptr_wg_int = OpTypePointer Workgroup %int
+%var1 = OpVariable %ptr_wg_struct Workgroup
+%var2 = OpVariable %ptr_wg_struct Workgroup
+%var3 = OpVariable %ptr_wg_struct Workgroup
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
+%ptr_ssbo_rta = OpTypePointer StorageBuffer %rta
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%out_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%out_idx0 = OpCopyObject %int %int_0
+%var1_int2_gep = OpAccessChain %ptr_wg_int2 %var1 %int_0
+%var1_int_gep = OpAccessChain %ptr_wg_int %var1 %int_0 %int_0
+%var2_int2_gep = OpAccessChain %ptr_wg_int2 %var2 %int_0
+%var2_int_gep = OpAccessChain %ptr_wg_int %var2 %int_0 %int_0
+%var3_int2_gep = OpAccessChain %ptr_wg_int2 %var3 %int_0
+%var3_int_gep = OpAccessChain %ptr_wg_int %var3 %int_0 %int_0
+; var1 vs var2
+%v1_neq_v2 = OpPtrNotEqual %bool %var1 %var2
+%v1_neq_v2_sel = OpSelect %int %v1_neq_v2 %int_1 %int_0
+%out_gep1 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx0
+%out_idx1 = OpIAdd %int %out_idx0 %int_1
+OpStore %out_gep1 %v1_neq_v2_sel
+%v1_neq_v2_rta = OpPtrNotEqual %bool %var1_int2_gep %var2_int2_gep
+%v1_neq_v2_rta_sel = OpSelect %int %v1_neq_v2_rta %int_1 %int_0
+%out_gep2 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx1
+%out_idx2 = OpIAdd %int %out_idx1 %int_1
+OpStore %out_gep2 %v1_neq_v2_rta_sel
+%v1_neq_v2_int = OpPtrNotEqual %bool %var1_int_gep %var2_int_gep
+%v1_neq_v2_int_sel = OpSelect %int %v1_neq_v2_int %int_1 %int_0
+%out_gep3 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx2
+%out_idx3 = OpIAdd %int %out_idx2 %int_1
+OpStore %out_gep3 %v1_neq_v2_int_sel
+; var1 vs var3
+%v1_neq_v3 = OpPtrNotEqual %bool %var1 %var3
+%v1_neq_v3_sel = OpSelect %int %v1_neq_v3 %int_1 %int_0
+%out_gep4 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx3
+%out_idx4 = OpIAdd %int %out_idx3 %int_1
+OpStore %out_gep4 %v1_neq_v3_sel
+%v1_neq_v3_rta = OpPtrNotEqual %bool %var1_int2_gep %var3_int2_gep
+%v1_neq_v3_rta_sel = OpSelect %int %v1_neq_v3_rta %int_1 %int_0
+%out_gep5 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx4
+%out_idx5 = OpIAdd %int %out_idx4 %int_1
+OpStore %out_gep5 %v1_neq_v3_rta_sel
+%v1_neq_v3_int = OpPtrNotEqual %bool %var1_int_gep %var3_int_gep
+%v1_neq_v3_int_sel = OpSelect %int %v1_neq_v3_int %int_1 %int_0
+%out_gep6 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx5
+%out_idx6 = OpIAdd %int %out_idx5 %int_1
+OpStore %out_gep6 %v1_neq_v3_int_sel
+; var2 vs var3
+%v2_neq_v3 = OpPtrNotEqual %bool %var2 %var3
+%v2_neq_v3_sel = OpSelect %int %v2_neq_v3 %int_1 %int_0
+%out_gep7 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx6
+%out_idx7 = OpIAdd %int %out_idx6 %int_1
+OpStore %out_gep7 %v2_neq_v3_sel
+%v2_neq_v3_rta = OpPtrNotEqual %bool %var2_int2_gep %var3_int2_gep
+%v2_neq_v3_rta_sel = OpSelect %int %v2_neq_v3_rta %int_1 %int_0
+%out_gep8 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx7
+%out_idx8 = OpIAdd %int %out_idx7 %int_1
+OpStore %out_gep8 %v2_neq_v3_rta_sel
+%v2_neq_v3_int = OpPtrNotEqual %bool %var2_int_gep %var3_int_gep
+%v2_neq_v3_int_sel = OpSelect %int %v2_neq_v3_int %int_1 %int_0
+%out_gep9 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx8
+%out_idx9 = OpIAdd %int %out_idx8 %int_1
+OpStore %out_gep9 %v2_neq_v3_int_sel
+%v1_neq_v1 = OpPtrNotEqual %bool %var1 %var1
+%v1_neq_v1_sel = OpSelect %int %v1_neq_v1 %int_1 %int_0
+%out_gep10 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx9
+OpStore %out_gep10 %v1_neq_v1_sel
+OpReturn
+OpFunctionEnd
+[test]
+ssbo 0:0 40
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:0 0 == 1 1 1 1 1 1 1 1 1 0
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/null_comparisons_ssbo_not_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/null_comparisons_ssbo_not_equal.amber
new file mode 100644
index 0000000..1bc0233
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/null_comparisons_ssbo_not_equal.amber
@@ -0,0 +1,90 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VK_KHR_storage_buffer_storage_class
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+; This test generates four results.
+
+; The results are based of OpPtrNotEqual comparisons of
+; %ssbo_var vs null.
+; 0: comparison of %ssbo_var vs null
+; 1: comparison of SSBO float pointer vs null
+; 2: comparison of null struct vs null struct
+; 3: comparison of null float vs null float
+
+OpCapability Shader
+OpCapability VariablePointersStorageBuffer
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %ssbo_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+
+OpDecorate %ssbo_struct Block
+OpMemberDecorate %ssbo_struct 0 Offset 0
+OpDecorate %ssbo_var DescriptorSet 0
+OpDecorate %ssbo_var Binding 0
+
+OpDecorate %out_struct Block
+OpMemberDecorate %out_struct 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%float = OpTypeFloat 32
+%int = OpTypeInt 32 0
+%int4 = OpTypeVector %int 4
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+
+%ssbo_struct = OpTypeStruct %float
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %ssbo_struct
+%ssbo_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%ptr_ssbo_float = OpTypePointer StorageBuffer %float
+
+%out_struct = OpTypeStruct %int4
+%ptr_out_struct = OpTypePointer StorageBuffer %out_struct
+%out_var = OpVariable %ptr_out_struct StorageBuffer
+%ptr_ssbo_int4 = OpTypePointer StorageBuffer %int4
+
+%ptr_ssbo_struct_null = OpConstantNull %ptr_ssbo_struct
+%ptr_ssbo_float_null = OpConstantNull %ptr_ssbo_float
+%ptr_ssbo_struct_null2 = OpConstantNull %ptr_ssbo_struct
+%ptr_ssbo_float_null2 = OpConstantNull %ptr_ssbo_float
+
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+
+%ssbo_not_equal = OpPtrNotEqual %bool %ssbo_var %ptr_ssbo_struct_null
+%ssbo_not_equal_int = OpSelect %int %ssbo_not_equal %int_1 %int_0
+
+%ssbo_gep_0 = OpAccessChain %ptr_ssbo_float %ssbo_var %int_0
+%ssbo_not_equal_0 = OpPtrNotEqual %bool %ssbo_gep_0 %ptr_ssbo_float_null
+%ssbo_not_equal_0_int = OpSelect %int %ssbo_not_equal_0 %int_1 %int_0
+
+%null_ssbo_not_equal = OpPtrNotEqual %bool %ptr_ssbo_struct_null %ptr_ssbo_struct_null2
+%null_ssbo_not_equal_int = OpSelect %int %null_ssbo_not_equal %int_1 %int_0
+
+%null_ssbo_not_equal_0 = OpPtrNotEqual %bool %ptr_ssbo_float_null %ptr_ssbo_float_null2
+%null_ssbo_not_equal_0_int = OpSelect %int %null_ssbo_not_equal_0 %int_1 %int_0
+
+%combined = OpCompositeConstruct %int4 %ssbo_not_equal_int %ssbo_not_equal_0_int %null_ssbo_not_equal_int %null_ssbo_not_equal_0_int
+%out_gep = OpAccessChain %ptr_ssbo_int4 %out_var %int_0
+OpStore %out_gep %combined
+
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 4
+ssbo 0:1 16
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uvec4 0:1 0 == 1 1 0 0
+
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/null_comparisons_wg_not_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/null_comparisons_wg_not_equal.amber
new file mode 100644
index 0000000..b411618
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/null_comparisons_wg_not_equal.amber
@@ -0,0 +1,86 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VariablePointerFeatures.variablePointers
+VK_KHR_storage_buffer_storage_class
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+; This generates 4 results for OpPtrNotEqual
+
+; The workgroup variable is a struct containing a single float.
+
+; Results:
+; 0: comparison of the workgroup var vs null
+; 1: comparison of the workgroup float vs null
+; 2: comparison of null struct vs null struct
+; 3: comparison of null float vs null float
+
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %wg_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+
+OpDecorate %out_struct Block
+OpMemberDecorate %out_struct 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 0
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%float = OpTypeFloat 32
+%int = OpTypeInt 32 0
+%int4 = OpTypeVector %int 4
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+
+%wg_struct = OpTypeStruct %float
+%ptr_wg_struct = OpTypePointer Workgroup %wg_struct
+%wg_var = OpVariable %ptr_wg_struct Workgroup
+%ptr_wg_float = OpTypePointer Workgroup %float
+
+%out_struct = OpTypeStruct %int4
+%ptr_out_struct = OpTypePointer StorageBuffer %out_struct
+%out_var = OpVariable %ptr_out_struct StorageBuffer
+%ptr_ssbo_int4 = OpTypePointer StorageBuffer %int4
+
+%ptr_wg_struct_null = OpConstantNull %ptr_wg_struct
+%ptr_wg_float_null = OpConstantNull %ptr_wg_float
+%ptr_wg_struct_null2 = OpConstantNull %ptr_wg_struct
+%ptr_wg_float_null2 = OpConstantNull %ptr_wg_float
+
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+
+%wg_not_equal = OpPtrNotEqual %bool %wg_var %ptr_wg_struct_null
+%wg_not_equal_int = OpSelect %int %wg_not_equal %int_1 %int_0
+
+%wg_gep_0 = OpAccessChain %ptr_wg_float %wg_var %int_0
+%wg_not_equal_0 = OpPtrNotEqual %bool %wg_gep_0 %ptr_wg_float_null
+%wg_not_equal_0_int = OpSelect %int %wg_not_equal_0 %int_1 %int_0
+
+%null_wg_not_equal = OpPtrNotEqual %bool %ptr_wg_struct_null %ptr_wg_struct_null2
+%null_wg_not_equal_int = OpSelect %int %null_wg_not_equal %int_1 %int_0
+
+%null_wg_not_equal_0 = OpPtrNotEqual %bool %ptr_wg_float_null %ptr_wg_float_null2
+%null_wg_not_equal_0_int = OpSelect %int %null_wg_not_equal_0 %int_1 %int_0
+
+%combined = OpCompositeConstruct %int4 %wg_not_equal_int %wg_not_equal_0_int %null_wg_not_equal_int %null_wg_not_equal_0_int
+%out_gep = OpAccessChain %ptr_ssbo_int4 %out_var %int_0
+OpStore %out_gep %combined
+
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 16
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uvec4 0:0 0 == 1 1 0 0
+
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/ssbo_comparisons_not_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/ssbo_comparisons_not_equal.amber
new file mode 100644
index 0000000..4bfd722
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/ssbo_comparisons_not_equal.amber
@@ -0,0 +1,177 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VK_KHR_storage_buffer_storage_class
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+; Test operates on a SSBO (%in_var) containing a runtime array of an array of four ints.
+; Size of the runtime array is passed another SSBO (%n_var).
+
+; Each invocation writes out the result of OpPtrNotEqual
+; for elements of the input runtime array to index 16 of the corresponding output
+; variable. Pointers are based the gid'th element vs the zero'th element.
+
+; Each invocation loops 4 times and writes out results each for
+; OpPtrNotEqual. The pointers are the lid'th element of gid'th element of
+; the runtime array vs the iteration count element of the gid'th element of
+; the runtime array.
+
+OpCapability Shader
+OpCapability VariablePointersStorageBuffer
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %in_var %not_equal_var %n_var %lid_var %gid_var
+OpExecutionMode %main LocalSize 4 1 1
+
+OpDecorate %struct_4 Block
+OpMemberDecorate %struct_4 0 Offset 0
+OpDecorate %runtime_4 ArrayStride 16
+OpDecorate %struct_17 Block
+OpMemberDecorate %struct_17 0 Offset 0
+OpDecorate %runtime_17 ArrayStride 68
+OpDecorate %n_struct Block
+OpMemberDecorate %n_struct 0 Offset 0
+OpDecorate %array_4 ArrayStride 4
+OpDecorate %array_17 ArrayStride 4
+
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %not_equal_var DescriptorSet 0
+OpDecorate %not_equal_var Binding 1
+OpDecorate %n_var DescriptorSet 0
+OpDecorate %n_var Binding 2
+
+OpDecorate %lid_var BuiltIn LocalInvocationId
+OpDecorate %gid_var BuiltIn WorkgroupId
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 1
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_4 = OpConstant %int 4
+%int_16 = OpConstant %int 16
+%int_17 = OpConstant %int 17
+%int3 = OpTypeVector %int 3
+
+%ptr_input_int3 = OpTypePointer Input %int3
+
+%array_4 = OpTypeArray %int %int_4
+%runtime_4 = OpTypeRuntimeArray %array_4
+%struct_4 = OpTypeStruct %runtime_4
+%ptr_struct_4 = OpTypePointer StorageBuffer %struct_4
+%ptr_array_4 = OpTypePointer StorageBuffer %array_4
+
+%array_17 = OpTypeArray %int %int_17
+%runtime_17 = OpTypeRuntimeArray %array_17
+%struct_17 = OpTypeStruct %runtime_17
+%ptr_struct_17 = OpTypePointer StorageBuffer %struct_17
+%ptr_array_17 = OpTypePointer StorageBuffer %array_17
+
+%ptr_int = OpTypePointer StorageBuffer %int
+%n_struct = OpTypeStruct %int
+%ptr_n_struct = OpTypePointer Uniform %n_struct
+%ptr_n = OpTypePointer Uniform %int
+
+%in_var = OpVariable %ptr_struct_4 StorageBuffer
+%not_equal_var = OpVariable %ptr_struct_17 StorageBuffer
+%n_var = OpVariable %ptr_n_struct Uniform
+%lid_var = OpVariable %ptr_input_int3 Input
+%gid_var = OpVariable %ptr_input_int3 Input
+
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%n_gep = OpAccessChain %ptr_n %n_var %int_0
+%n = OpLoad %int %n_gep
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%lid = OpLoad %int3 %lid_var
+%lid_x = OpCompositeExtract %int %lid 0
+%array_gep_0 = OpAccessChain %ptr_array_4 %in_var %int_0 %int_0
+%array_gep = OpAccessChain %ptr_array_4 %in_var %int_0 %gid_x
+%cmp_gid = OpSGreaterThanEqual %bool %gid_x %n
+OpSelectionMerge %body None
+OpBranchConditional %cmp_gid %ret %body
+
+%ret = OpLabel
+OpReturn
+
+%body = OpLabel
+%cmp_lid = OpIEqual %bool %lid_x %int_1
+OpSelectionMerge %loop None
+OpBranchConditional %cmp_lid %then %loop
+
+%then = OpLabel
+; Compute results for outer array
+%large_not_equal = OpPtrNotEqual %bool %array_gep %array_gep_0
+%large_not_equal_gep = OpAccessChain %ptr_int %not_equal_var %int_0 %gid_x %int_16
+%large_not_equal_int = OpSelect %int %large_not_equal %int_1 %int_0
+OpStore %large_not_equal_gep %large_not_equal_int
+;
+OpBranch %loop
+
+%loop = OpLabel
+%i = OpPhi %int %int_0 %body %int_0 %then %inc_i %loop
+%inc_i = OpIAdd %int %i %int_1
+%i_cmp = OpIEqual %bool %inc_i %int_4
+%lid_offset = OpIMul %int %lid_x %int_4
+%gep_offset = OpIAdd %int %lid_offset %i
+; Compute results for inner array
+%ref_gep = OpAccessChain %ptr_int %array_gep %lid_x
+%cmp_gep = OpAccessChain %ptr_int %array_gep %i
+%not_equal = OpPtrNotEqual %bool %ref_gep %cmp_gep
+%not_equal_int = OpSelect %int %not_equal %int_1 %int_0
+%not_equal_gep = OpAccessChain %ptr_int %not_equal_var %int_0 %gid_x %gep_offset
+OpStore %not_equal_gep %not_equal_int
+;
+OpLoopMerge %exit %loop None
+OpBranchConditional %i_cmp %exit %loop
+
+%exit = OpLabel
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 2048
+ssbo 0:1 2176
+uniform ubo 0:2 int 0 32
+
+compute entrypoint main
+compute 32 1 1
+
+#not equal var
+probe ssbo int 0:1 0 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 0
+probe ssbo int 0:1 68 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 136 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 204 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 272 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 340 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 408 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 476 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 544 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 612 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 680 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 748 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 816 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 884 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 952 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 1020 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 1088 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 1156 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 1224 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 1292 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 1360 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 1428 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 1496 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 1564 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 1632 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 1700 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 1768 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 1836 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 1904 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 1972 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 2040 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:1 2108 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/variable_pointers_ssbo_2_not_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/variable_pointers_ssbo_2_not_equal.amber
new file mode 100644
index 0000000..0bcd960
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/variable_pointers_ssbo_2_not_equal.amber
@@ -0,0 +1,134 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VariablePointerFeatures.variablePointers
+VK_KHR_storage_buffer_storage_class
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+; Tests pointer comparisons with variable pointers
+
+; Stores an array of pointers in Function storage class that point into input
+; SSBO. Each iteration produces an OpPtrNotEqual comparison. Pointers evolve by
+; incrementing or decrementing by 1 each iteration (overall ratio is 2:1).
+
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+
+OpDecorate %int_rta ArrayStride 4
+OpDecorate %in_struct Block
+OpMemberDecorate %in_struct 0 Offset 0
+OpMemberDecorate %in_struct 1 Offset 4
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+
+OpDecorate %out_struct Block
+OpMemberDecorate %out_struct 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+
+OpDecorate %ptr_ssbo_int ArrayStride 4
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%uint = OpTypeInt 32 0
+%int = OpTypeInt 32 1
+%int_n1 = OpConstant %int -1
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int_3 = OpConstant %int 3
+
+%int_rta = OpTypeRuntimeArray %int
+%in_struct = OpTypeStruct %int %int_rta
+%ptr_ssbo_in_struct = OpTypePointer StorageBuffer %in_struct
+%in_var = OpVariable %ptr_ssbo_in_struct StorageBuffer
+
+%out_struct = OpTypeStruct %int_rta
+%ptr_ssbo_out_struct = OpTypePointer StorageBuffer %out_struct
+%out_var = OpVariable %ptr_ssbo_out_struct StorageBuffer
+
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%array_ptr = OpTypeArray %ptr_ssbo_int %int_2
+%ptr_ptr = OpTypePointer Function %array_ptr
+%ptr_func_ptr = OpTypePointer Function %ptr_ssbo_int
+
+%ptr_ssbo_n = OpTypePointer StorageBuffer %int
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%var = OpVariable %ptr_ptr Function
+%n_gep = OpAccessChain %ptr_ssbo_n %in_var %int_0
+%n = OpLoad %int %n_gep
+%length = OpArrayLength %uint %in_var 1
+%length_div_2 = OpSDiv %int %length %int_2
+%mid_gep = OpAccessChain %ptr_ssbo_int %in_var %int_1 %length_div_2
+%func_gep_0 = OpAccessChain %ptr_func_ptr %var %int_0
+%func_gep_1 = OpAccessChain %ptr_func_ptr %var %int_1
+OpStore %func_gep_0 %mid_gep
+OpStore %func_gep_1 %mid_gep
+%cmp_n = OpSLessThanEqual %bool %n %int_0
+OpSelectionMerge %exit None
+OpBranchConditional %cmp_n %exit %loop
+
+%loop = OpLabel
+%i = OpPhi %int %int_0 %entry %inc_i %continue
+%gep_0 = OpLoad %ptr_ssbo_int %func_gep_0
+%gep_1 = OpLoad %ptr_ssbo_int %func_gep_1
+%inc_i = OpIAdd %int %i %int_1
+
+%not_equal = OpPtrNotEqual %bool %gep_0 %gep_1
+%not_equal_int = OpSelect %int %not_equal %int_1 %int_0
+%out_gep = OpAccessChain %ptr_ssbo_int %out_var %int_0 %i
+OpStore %out_gep %not_equal_int
+
+OpLoopMerge %loop_exit %continue None
+OpBranch %body
+
+%body = OpLabel
+%i_mod_3 = OpSMod %int %i %int_3
+%cmp_vs_0 = OpIEqual %bool %i_mod_3 %int_0
+OpSelectionMerge %if_merge None
+OpBranchConditional %cmp_vs_0 %then %else
+
+%then = OpLabel
+%then_0_next = OpPtrAccessChain %ptr_ssbo_int %gep_0 %int_n1
+%then_1_next = OpPtrAccessChain %ptr_ssbo_int %gep_1 %int_1
+OpBranch %if_merge
+%else = OpLabel
+%else_0_next = OpPtrAccessChain %ptr_ssbo_int %gep_0 %int_1
+%else_1_next = OpPtrAccessChain %ptr_ssbo_int %gep_1 %int_n1
+OpBranch %if_merge
+
+%if_merge = OpLabel
+%next_0 = OpPhi %ptr_ssbo_int %then_0_next %then %else_0_next %else
+%next_1 = OpPhi %ptr_ssbo_int %then_1_next %then %else_1_next %else
+OpBranch %continue
+
+%continue = OpLabel
+OpStore %func_gep_0 %next_0
+OpStore %func_gep_1 %next_1
+%cmp = OpSGreaterThanEqual %bool %i %n
+OpBranchConditional %cmp %loop_exit %loop
+
+%loop_exit = OpLabel
+OpBranch %exit
+%exit = OpLabel
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 68
+ssbo 0:0 subdata uint 0 16
+ssbo 0:1 64
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:1 0 == 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1
+
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/variable_pointers_ssbo_not_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/variable_pointers_ssbo_not_equal.amber
new file mode 100644
index 0000000..d286d2a
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/variable_pointers_ssbo_not_equal.amber
@@ -0,0 +1,115 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VK_KHR_storage_buffer_storage_class
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+; This test generates four results per iteration of the loop. The loop is executed %n times.
+
+; Each iteration generates a result for OpPtrEqual. One
+; pointer is an iterator through the input SSBO (%in_var) and the other is a
+; selection between the iterator, null or the 0'th index pointer depending on
+; the value of the iterator mod 3.
+
+OpCapability Shader
+OpCapability VariablePointersStorageBuffer
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+
+OpDecorate %int_rta ArrayStride 4
+OpDecorate %ptr_ssbo_int ArrayStride 4
+
+OpDecorate %in_struct Block
+OpMemberDecorate %in_struct 0 Offset 0
+OpMemberDecorate %in_struct 1 Offset 4
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+
+OpDecorate %out_struct Block
+OpMemberDecorate %out_struct 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 1
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int_3 = OpConstant %int 3
+%int2 = OpTypeVector %int 2
+%int_rta = OpTypeRuntimeArray %int
+%int2_rta = OpTypeRuntimeArray %int2
+
+%in_struct = OpTypeStruct %int %int_rta
+%ptr_ssbo_in_struct = OpTypePointer StorageBuffer %in_struct
+%in_var = OpVariable %ptr_ssbo_in_struct StorageBuffer
+
+%out_struct = OpTypeStruct %int_rta
+%ptr_ssbo_out_struct = OpTypePointer StorageBuffer %out_struct
+%out_var = OpVariable %ptr_ssbo_out_struct StorageBuffer
+
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%ptr_ssbo_int_null = OpConstantNull %ptr_ssbo_int
+%ptr_ssbo_n = OpTypePointer StorageBuffer %int
+%ptr_ssbo_int2 = OpTypePointer StorageBuffer %int2
+%void_fn = OpTypeFunction %void
+%ptr_return_fn = OpTypeFunction %ptr_ssbo_int %ptr_ssbo_int %ptr_ssbo_int %int
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%n_gep = OpAccessChain %ptr_ssbo_n %in_var %int_0
+%n = OpLoad %int %n_gep
+%base_ssbo_gep = OpAccessChain %ptr_ssbo_int %in_var %int_1 %int_0
+%n_leq_0 = OpSLessThanEqual %bool %n %int_0
+OpSelectionMerge %exit None
+OpBranchConditional %n_leq_0 %exit %loop
+
+%loop = OpLabel
+%i = OpPhi %int %int_0 %entry %inc_i %loop
+%ssbo_gep = OpPhi %ptr_ssbo_int %base_ssbo_gep %entry %next_ssbo_gep %loop
+%inc_i = OpIAdd %int %i %int_1
+%next_ssbo_gep = OpPtrAccessChain %ptr_ssbo_int %ssbo_gep %int_1
+
+%ptr_call = OpFunctionCall %ptr_ssbo_int %gep_func %ssbo_gep %base_ssbo_gep %i
+%not_equal = OpPtrNotEqual %bool %ssbo_gep %ptr_call
+%not_equal_int = OpSelect %int %not_equal %int_1 %int_0
+%out_gep = OpAccessChain %ptr_ssbo_int %out_var %int_0 %i
+OpStore %out_gep %not_equal_int
+
+%cmp = OpSGreaterThanEqual %bool %i %n
+OpLoopMerge %loop_exit %loop None
+OpBranchConditional %cmp %loop_exit %loop
+
+%loop_exit = OpLabel
+OpBranch %exit
+%exit = OpLabel
+OpReturn
+OpFunctionEnd
+
+%gep_func = OpFunction %ptr_ssbo_int None %ptr_return_fn
+%param_ptr = OpFunctionParameter %ptr_ssbo_int
+%param_alt_ptr = OpFunctionParameter %ptr_ssbo_int
+%param_i = OpFunctionParameter %int
+%1 = OpLabel
+%i_mod_3 = OpSMod %int %param_i %int_3
+%i_mod_3_is_0 = OpIEqual %bool %i_mod_3 %int_0
+%i_mod_3_is_1 = OpIEqual %bool %i_mod_3 %int_1
+%ssbo_gep1 = OpSelect %ptr_ssbo_int %i_mod_3_is_0 %param_alt_ptr %ptr_ssbo_int_null
+%ssbo_gep2 = OpSelect %ptr_ssbo_int %i_mod_3_is_1 %param_ptr %ssbo_gep1
+OpReturnValue %ssbo_gep2
+OpFunctionEnd
+
+[test]
+ssbo 0:0 132
+ssbo 0:0 subdata int 0 33
+ssbo 0:1 132
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo int 0:1 0 == 0 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1
+
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/variable_pointers_vars_ssbo_not_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/variable_pointers_vars_ssbo_not_equal.amber
new file mode 100644
index 0000000..fdb0e08
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/variable_pointers_vars_ssbo_not_equal.amber
@@ -0,0 +1,139 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VK_KHR_storage_buffer_storage_class
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+; Tests use of private variables holding SSBO pointers and pointer comparisons.
+
+; Two iterators are each stored in Private variables: one moves forward, one
+; moves backward. In each iteration an OpPtrNotEqual comparison is written.
+; Iterators are then moved forward (or backward respectively) one index.
+
+OpCapability Shader
+OpCapability VariablePointersStorageBuffer
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %in_var %out_var %forward_var %backward_var
+OpExecutionMode %main LocalSize 1 1 1
+
+OpDecorate %int_rta ArrayStride 4
+OpDecorate %in_struct Block
+OpMemberDecorate %in_struct 0 Offset 0
+OpMemberDecorate %in_struct 1 Offset 4
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+
+OpDecorate %out_struct Block
+OpMemberDecorate %out_struct 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+
+OpDecorate %ptr_ssbo_int ArrayStride 4
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 1
+%int_n1 = OpConstant %int -1
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int_3 = OpConstant %int 3
+
+%int_rta = OpTypeRuntimeArray %int
+%in_struct = OpTypeStruct %int %int_rta
+%ptr_ssbo_in_struct = OpTypePointer StorageBuffer %in_struct
+%in_var = OpVariable %ptr_ssbo_in_struct StorageBuffer
+
+%out_struct = OpTypeStruct %int_rta
+%ptr_ssbo_out_struct = OpTypePointer StorageBuffer %out_struct
+%out_var = OpVariable %ptr_ssbo_out_struct StorageBuffer
+
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%ptr_ptr = OpTypePointer Private %ptr_ssbo_int
+%forward_var = OpVariable %ptr_ptr Private
+%backward_var = OpVariable %ptr_ptr Private
+
+%ptr_ssbo_n = OpTypePointer StorageBuffer %int
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%n_gep = OpAccessChain %ptr_ssbo_n %in_var %int_0
+%n = OpLoad %int %n_gep
+%first_gep = OpAccessChain %ptr_ssbo_int %in_var %int_1 %int_0
+OpStore %forward_var %first_gep
+%last_gep = OpPtrAccessChain %ptr_ssbo_int %first_gep %n
+OpStore %backward_var %last_gep
+%cmp_n = OpSLessThanEqual %bool %n %int_0
+OpSelectionMerge %exit None
+OpBranchConditional %cmp_n %exit %loop
+
+%loop = OpLabel
+%i = OpPhi %int %int_0 %entry %inc_i %loop
+%forward_gep = OpLoad %ptr_ssbo_int %forward_var
+%backward_gep = OpLoad %ptr_ssbo_int %backward_var
+%forward_next = OpPtrAccessChain %ptr_ssbo_int %forward_gep %int_1
+%backward_next = OpPtrAccessChain %ptr_ssbo_int %backward_gep %int_n1
+%inc_i = OpIAdd %int %i %int_1
+OpStore %forward_var %forward_next
+OpStore %backward_var %backward_next
+
+%not_equal = OpPtrNotEqual %bool %forward_gep %backward_gep
+%not_equal_int = OpSelect %int %not_equal %int_1 %int_0
+%out_gep = OpAccessChain %ptr_ssbo_int %out_var %int_0 %i
+OpStore %out_gep %not_equal_int
+
+%cmp = OpSGreaterThanEqual %bool %i %n
+OpLoopMerge %loop_exit %loop None
+OpBranchConditional %cmp %loop_exit %loop
+
+%loop_exit = OpLabel
+OpBranch %exit
+%exit = OpLabel
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 132
+# Only data for number of iterations matters.
+ssbo 0:0 subdata int 0 32
+ssbo 0:1 128
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo int 0:1 0 == 1
+probe ssbo int 0:1 4 == 1
+probe ssbo int 0:1 8 == 1
+probe ssbo int 0:1 12 == 1
+probe ssbo int 0:1 16 == 1
+probe ssbo int 0:1 20 == 1
+probe ssbo int 0:1 24 == 1
+probe ssbo int 0:1 28 == 1
+probe ssbo int 0:1 32 == 1
+probe ssbo int 0:1 36 == 1
+probe ssbo int 0:1 40 == 1
+probe ssbo int 0:1 44 == 1
+probe ssbo int 0:1 48 == 1
+probe ssbo int 0:1 52 == 1
+probe ssbo int 0:1 56 == 1
+probe ssbo int 0:1 60 == 1
+probe ssbo int 0:1 64 == 0
+probe ssbo int 0:1 68 == 1
+probe ssbo int 0:1 72 == 1
+probe ssbo int 0:1 76 == 1
+probe ssbo int 0:1 80 == 1
+probe ssbo int 0:1 84 == 1
+probe ssbo int 0:1 88 == 1
+probe ssbo int 0:1 92 == 1
+probe ssbo int 0:1 96 == 1
+probe ssbo int 0:1 100 == 1
+probe ssbo int 0:1 104 == 1
+probe ssbo int 0:1 108 == 1
+probe ssbo int 0:1 112 == 1
+probe ssbo int 0:1 116 == 1
+probe ssbo int 0:1 120 == 1
+probe ssbo int 0:1 124 == 1
+
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/variable_pointers_vars_wg_not_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/variable_pointers_vars_wg_not_equal.amber
new file mode 100644
index 0000000..6a860ac
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/variable_pointers_vars_wg_not_equal.amber
@@ -0,0 +1,125 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VariablePointerFeatures.variablePointers
+VK_KHR_storage_buffer_storage_class
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+; Tests use of private variables holding workgroup pointers and pointer comparisons.
+
+; Two iterators are each stored in Private variables: one moves forward, one
+; moves backward. In each iteration a not equal comparison is written. Iterators
+; are then moved forward (or backward respectively) one index.
+
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %wg_var %out_var %forward_var %backward_var
+OpExecutionMode %main LocalSize 1 1 1
+
+OpDecorate %int_rta ArrayStride 4
+OpDecorate %out_struct Block
+OpMemberDecorate %out_struct 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 0
+
+OpDecorate %ptr_wg_int ArrayStride 4
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 1
+%int_n1 = OpConstant %int -1
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int_3 = OpConstant %int 3
+%int_32 = OpConstant %int 32
+
+%int_array_32 = OpTypeArray %int %int_32
+%ptr_wg_array = OpTypePointer Workgroup %int_array_32
+%wg_var = OpVariable %ptr_wg_array Workgroup
+
+%int_rta = OpTypeRuntimeArray %int
+%out_struct = OpTypeStruct %int_rta
+%ptr_ssbo_out_struct = OpTypePointer StorageBuffer %out_struct
+%out_var = OpVariable %ptr_ssbo_out_struct StorageBuffer
+
+%ptr_wg_int = OpTypePointer Workgroup %int
+%ptr_ptr = OpTypePointer Private %ptr_wg_int
+%forward_var = OpVariable %ptr_ptr Private
+%backward_var = OpVariable %ptr_ptr Private
+
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%first_gep = OpAccessChain %ptr_wg_int %wg_var %int_0
+OpStore %forward_var %first_gep
+%last_gep = OpPtrAccessChain %ptr_wg_int %first_gep %int_32
+OpStore %backward_var %last_gep
+OpBranch %loop
+
+%loop = OpLabel
+%i = OpPhi %int %int_0 %entry %inc_i %loop
+%forward_gep = OpLoad %ptr_wg_int %forward_var
+%backward_gep = OpLoad %ptr_wg_int %backward_var
+%forward_next = OpPtrAccessChain %ptr_wg_int %forward_gep %int_1
+%backward_next = OpPtrAccessChain %ptr_wg_int %backward_gep %int_n1
+%inc_i = OpIAdd %int %i %int_1
+OpStore %forward_var %forward_next
+OpStore %backward_var %backward_next
+
+%not_equal = OpPtrNotEqual %bool %forward_gep %backward_gep
+%not_equal_int = OpSelect %int %not_equal %int_1 %int_0
+%out_gep = OpAccessChain %ptr_ssbo_int %out_var %int_0 %i
+OpStore %out_gep %not_equal_int
+
+%cmp = OpSGreaterThan %bool %i %int_32
+OpLoopMerge %exit %loop None
+OpBranchConditional %cmp %exit %loop
+
+%exit = OpLabel
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 528
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo int 0:0 0 == 1
+probe ssbo int 0:0 4 == 1
+probe ssbo int 0:0 8 == 1
+probe ssbo int 0:0 12 == 1
+probe ssbo int 0:0 16 == 1
+probe ssbo int 0:0 20 == 1
+probe ssbo int 0:0 24 == 1
+probe ssbo int 0:0 28 == 1
+probe ssbo int 0:0 32 == 1
+probe ssbo int 0:0 36 == 1
+probe ssbo int 0:0 40 == 1
+probe ssbo int 0:0 44 == 1
+probe ssbo int 0:0 48 == 1
+probe ssbo int 0:0 52 == 1
+probe ssbo int 0:0 56 == 1
+probe ssbo int 0:0 60 == 1
+probe ssbo int 0:0 64 == 0
+probe ssbo int 0:0 68 == 1
+probe ssbo int 0:0 72 == 1
+probe ssbo int 0:0 76 == 1
+probe ssbo int 0:0 80 == 1
+probe ssbo int 0:0 84 == 1
+probe ssbo int 0:0 88 == 1
+probe ssbo int 0:0 92 == 1
+probe ssbo int 0:0 96 == 1
+probe ssbo int 0:0 100 == 1
+probe ssbo int 0:0 104 == 1
+probe ssbo int 0:0 108 == 1
+probe ssbo int 0:0 112 == 1
+probe ssbo int 0:0 116 == 1
+probe ssbo int 0:0 120 == 1
+probe ssbo int 0:0 124 == 1
+probe ssbo int 0:0 128 == 1
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/variable_pointers_wg_not_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/variable_pointers_wg_not_equal.amber
new file mode 100644
index 0000000..d4214e4
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/variable_pointers_wg_not_equal.amber
@@ -0,0 +1,98 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VariablePointerFeatures.variablePointers
+VK_KHR_storage_buffer_storage_class
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+; This test generates four results per iteration of the loop. The loop is executed 64 times.
+
+; Each iteration generates results for OpPtrNotEqual. One pointer is an iterator
+; through the workgroup variable (%wg_var) and the other is a selection between
+; the iterator, null or the 0'th index pointer depending on the value of the
+; iterator mod 3.
+
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %wg_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+
+OpDecorate %int_rta ArrayStride 4
+OpDecorate %ptr_wg_int ArrayStride 4
+
+OpDecorate %out_struct Block
+OpMemberDecorate %out_struct 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 0
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 1
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int_3 = OpConstant %int 3
+%int_32 = OpConstant %int 32
+%int_array = OpTypeArray %int %int_32
+%int_rta = OpTypeRuntimeArray %int
+
+%ptr_wg_int_array = OpTypePointer Workgroup %int_array
+%wg_var = OpVariable %ptr_wg_int_array Workgroup
+
+%out_struct = OpTypeStruct %int_rta
+%ptr_ssbo_out_struct = OpTypePointer StorageBuffer %out_struct
+%out_var = OpVariable %ptr_ssbo_out_struct StorageBuffer
+
+%ptr_wg_int = OpTypePointer Workgroup %int
+%ptr_wg_int_null = OpConstantNull %ptr_wg_int
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%void_fn = OpTypeFunction %void
+%ptr_return_fn = OpTypeFunction %ptr_wg_int %ptr_wg_int %ptr_wg_int %int
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%base_wg_gep = OpAccessChain %ptr_wg_int %wg_var %int_0
+OpBranch %loop
+
+%loop = OpLabel
+%i = OpPhi %int %int_0 %entry %inc_i %loop
+%wg_gep = OpPhi %ptr_wg_int %base_wg_gep %entry %next_wg_gep %loop
+%inc_i = OpIAdd %int %i %int_1
+%next_wg_gep = OpPtrAccessChain %ptr_wg_int %wg_gep %int_1
+
+%ptr_call = OpFunctionCall %ptr_wg_int %gep_func %wg_gep %base_wg_gep %i
+%not_equal = OpPtrNotEqual %bool %wg_gep %ptr_call ;;;; HEY THIS SHOULD BE PtrNotEqual
+%not_equal_int = OpSelect %int %not_equal %int_1 %int_0
+%out_gep = OpAccessChain %ptr_ssbo_int %out_var %int_0 %i
+OpStore %out_gep %not_equal_int
+
+%cmp = OpSGreaterThan %bool %i %int_32
+OpLoopMerge %exit %loop None
+OpBranchConditional %cmp %exit %loop
+
+%exit = OpLabel
+OpReturn
+OpFunctionEnd
+
+%gep_func = OpFunction %ptr_wg_int None %ptr_return_fn
+%param_ptr = OpFunctionParameter %ptr_wg_int
+%param_alt_ptr = OpFunctionParameter %ptr_wg_int
+%param_i = OpFunctionParameter %int
+%1 = OpLabel
+%i_mod_3 = OpSMod %int %param_i %int_3
+%i_mod_3_is_0 = OpIEqual %bool %i_mod_3 %int_0
+%i_mod_3_is_1 = OpIEqual %bool %i_mod_3 %int_1
+%wg_gep1 = OpSelect %ptr_wg_int %i_mod_3_is_0 %param_alt_ptr %ptr_wg_int_null
+%wg_gep2 = OpSelect %ptr_wg_int %i_mod_3_is_1 %param_ptr %wg_gep1
+OpReturnValue %wg_gep2
+OpFunctionEnd
+
+[test]
+ssbo 0:0 132
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo int 0:0 0 == 0 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/wg_comparisons_not_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/wg_comparisons_not_equal.amber
new file mode 100644
index 0000000..9eb1a20
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/wg_comparisons_not_equal.amber
@@ -0,0 +1,162 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VariablePointerFeatures.variablePointers
+VK_KHR_storage_buffer_storage_class
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+; Test operates on a Workgroup array (%wg_var) containing an array of 16 arrays of four ints.
+
+; Each invocation writes out the result of OpPtrNotEqual for elements of the
+; outer array to index 16 of the corresponding output variable. Pointers are
+; based the gid'th element vs the zero'th element.
+
+; Each invocation loops 4 times and writes out 4 results each for OpPtrNotEqual.
+; The pointers are the lid'th element of gid'th element of the outer array vs
+; the iteration count mod 4'th element of the gid'th element of the outer
+; array. Results are ordered so each thread writes continguous results.
+
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %wg_var %not_equal_var %lid_var %gid_var
+OpExecutionMode %main LocalSize 16 4 1
+
+OpDecorate %struct_17 Block
+OpMemberDecorate %struct_17 0 Offset 0
+OpDecorate %runtime_17 ArrayStride 68
+OpDecorate %array_17 ArrayStride 4
+
+OpDecorate %not_equal_var DescriptorSet 0
+OpDecorate %not_equal_var Binding 0
+
+OpDecorate %lid_var BuiltIn LocalInvocationId
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 1
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_4 = OpConstant %int 4
+%int_16 = OpConstant %int 16
+%int_17 = OpConstant %int 17
+%int_64 = OpConstant %int 64
+%int3 = OpTypeVector %int 3
+
+%input_struct = OpTypeStruct %int3 %int3
+%ptr_input_struct = OpTypePointer Input %input_struct
+%ptr_input_int3 = OpTypePointer Input %int3
+
+%array_4 = OpTypeArray %int %int_4
+%array_array_4 = OpTypeArray %array_4 %int_16
+%ptr_array_array_4 = OpTypePointer Workgroup %array_array_4
+%ptr_array_4 = OpTypePointer Workgroup %array_4
+%ptr_wg_int = OpTypePointer Workgroup %int
+
+%array_17 = OpTypeArray %int %int_17
+%runtime_17 = OpTypeRuntimeArray %array_17
+%struct_17 = OpTypeStruct %runtime_17
+%ptr_struct_17 = OpTypePointer StorageBuffer %struct_17
+%ptr_array_17 = OpTypePointer StorageBuffer %array_17
+%ptr_int = OpTypePointer StorageBuffer %int
+
+%wg_var = OpVariable %ptr_array_array_4 Workgroup
+%not_equal_var = OpVariable %ptr_struct_17 StorageBuffer
+%lid_var = OpVariable %ptr_input_int3 Input
+%gid_var = OpVariable %ptr_input_int3 Input
+
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%gid_y = OpCompositeExtract %int %gid 1
+%lid = OpLoad %int3 %lid_var
+%lid_x = OpCompositeExtract %int %lid 0
+%lid_y = OpCompositeExtract %int %lid 1
+%array_gep_0 = OpAccessChain %ptr_array_4 %wg_var %int_0
+%array_gep = OpAccessChain %ptr_array_4 %wg_var %lid_x
+%lid_y_is_1 = OpIEqual %bool %lid_y %int_1
+OpSelectionMerge %loop None
+OpBranchConditional %lid_y_is_1 %then %loop
+
+%then = OpLabel
+; Compute results for outer array
+%large_not_equal = OpPtrNotEqual %bool %array_gep %array_gep_0
+%large_not_equal_gep = OpAccessChain %ptr_int %not_equal_var %int_0 %gid_x %int_16
+%large_not_equal_int = OpSelect %int %large_not_equal %int_1 %int_0
+OpStore %large_not_equal_gep %large_not_equal_int
+;
+OpBranch %loop
+
+%loop = OpLabel
+%i = OpPhi %int %int_0 %entry %int_0 %then %inc_i %loop
+%inc_i = OpIAdd %int %i %int_1
+%i_cmp = OpIEqual %bool %inc_i %int_4
+%lid_offset = OpIMul %int %lid_y %int_4
+%out_gep_index = OpIAdd %int %i %lid_offset
+; Compute results for inner array
+%ref_gep = OpAccessChain %ptr_wg_int %array_gep %lid_y
+%cmp_gep = OpAccessChain %ptr_wg_int %array_gep %i
+%not_equal = OpPtrNotEqual %bool %ref_gep %cmp_gep
+%not_equal_int = OpSelect %int %not_equal %int_1 %int_0
+%not_equal_gep = OpAccessChain %ptr_int %not_equal_var %int_0 %gid_x %out_gep_index
+OpStore %not_equal_gep %not_equal_int
+;
+OpLoopMerge %exit %loop None
+OpBranchConditional %i_cmp %exit %loop
+
+%exit = OpLabel
+OpReturn
+OpFunctionEnd
+
+
+[test]
+# 16 x 4 x 2 = 128 work items
+# 4 x 4 = 16 bytes per invocation
+# 2048 bytes from looping
+# 16 x 2 = 32 coarse results (1 per lid)
+# 128 bytes
+# 2176 total bytes
+ssbo 0:0 2176
+
+compute entrypoint main
+compute 2 1 1
+
+#not equal var
+probe ssbo int 0:0 0 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 0
+probe ssbo int 0:0 68 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 136 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 204 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 272 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 340 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 408 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 476 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 544 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 612 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 680 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 748 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 816 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 884 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 952 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 1020 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 1088 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 0
+probe ssbo int 0:0 1156 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 1224 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 1292 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 1360 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 1428 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 1496 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 1564 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 1632 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 1700 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 1768 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 1836 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 1904 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 1972 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 2040 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+probe ssbo int 0:0 2108 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/array_select.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/array_select.amber
new file mode 100644
index 0000000..f8ae803
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/array_select.amber
@@ -0,0 +1,66 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %gid_var %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+OpDecorate %int_array ArrayStride 4
+OpDecorate %rta ArrayStride 4
+OpDecorate %rta_array ArrayStride 16
+OpDecorate %struct Block
+OpMemberDecorate %struct 0 Offset 0
+OpDecorate %out_struct Block
+OpMemberDecorate %out_struct 0 Offset 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int_3 = OpConstant %int 3
+%int_4 = OpConstant %int 4
+%int3 = OpTypeVector %int 3
+%int_array = OpTypeArray %int %int_4
+%const_array1 = OpConstantComposite %int_array %int_0 %int_1 %int_2 %int_3
+%const_array2 = OpConstantComposite %int_array %int_3 %int_2 %int_1 %int_0
+%rta_array = OpTypeRuntimeArray %int_array
+%out_struct = OpTypeStruct %rta_array
+%rta = OpTypeRuntimeArray %int
+%struct = OpTypeStruct %rta
+%ptr_input_int3 = OpTypePointer Input %int3
+%gid_var = OpVariable %ptr_input_int3 Input
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
+%ptr_ssbo_out_struct = OpTypePointer StorageBuffer %out_struct
+%ptr_ssbo_array = OpTypePointer StorageBuffer %int_array
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%in_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%out_var = OpVariable %ptr_ssbo_out_struct StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%in_gep = OpAccessChain %ptr_ssbo_int %in_var %int_0 %gid_x
+%ld = OpLoad %int %in_gep
+%eq_0 = OpIEqual %bool %ld %int_0
+%select = OpSelect %int_array %eq_0 %const_array1 %const_array2
+%out_gep = OpAccessChain %ptr_ssbo_array %out_var %int_0 %gid_x
+OpStore %out_gep %select
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 0 1 1 0
+ssbo 0:1 64
+
+compute entrypoint main
+compute 4 1 1
+
+probe ssbo uint 0:1 0 == 0 1 2 3 3 2 1 0 3 2 1 0 0 1 2 3
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/array_stride_select.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/array_stride_select.amber
new file mode 100644
index 0000000..194902a
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/array_stride_select.amber
@@ -0,0 +1,74 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %gid_var %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+OpDecorate %int_array ArrayStride 8
+OpDecorate %rta ArrayStride 4
+OpDecorate %rta_array ArrayStride 32
+OpDecorate %struct Block
+OpMemberDecorate %struct 0 Offset 0
+OpDecorate %out_struct Block
+OpMemberDecorate %out_struct 0 Offset 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int_3 = OpConstant %int 3
+%int_4 = OpConstant %int 4
+%int3 = OpTypeVector %int 3
+%int_array = OpTypeArray %int %int_4
+%const_array1 = OpConstantComposite %int_array %int_0 %int_1 %int_2 %int_3
+%const_array2 = OpConstantComposite %int_array %int_3 %int_2 %int_1 %int_0
+%rta_array = OpTypeRuntimeArray %int_array
+%out_struct = OpTypeStruct %rta_array
+%rta = OpTypeRuntimeArray %int
+%struct = OpTypeStruct %rta
+%ptr_input_int3 = OpTypePointer Input %int3
+%gid_var = OpVariable %ptr_input_int3 Input
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
+%ptr_ssbo_out_struct = OpTypePointer StorageBuffer %out_struct
+%ptr_ssbo_array = OpTypePointer StorageBuffer %int_array
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%in_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%out_var = OpVariable %ptr_ssbo_out_struct StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%in_gep = OpAccessChain %ptr_ssbo_int %in_var %int_0 %gid_x
+%ld = OpLoad %int %in_gep
+%eq_0 = OpIEqual %bool %ld %int_0
+%select = OpSelect %int_array %eq_0 %const_array1 %const_array2
+%out_gep = OpAccessChain %ptr_ssbo_array %out_var %int_0 %gid_x
+OpStore %out_gep %select
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 0 1
+ssbo 0:1 64
+
+compute entrypoint main
+compute 2 1 1
+
+probe ssbo uint 0:1 0 == 0
+probe ssbo uint 0:1 8 == 1
+probe ssbo uint 0:1 16 == 2
+probe ssbo uint 0:1 24 == 3
+probe ssbo uint 0:1 32 == 3
+probe ssbo uint 0:1 40 == 2
+probe ssbo uint 0:1 48 == 1
+probe ssbo uint 0:1 56 == 0
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/nested_array_select.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/nested_array_select.amber
new file mode 100644
index 0000000..bf26973
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/nested_array_select.amber
@@ -0,0 +1,75 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %gid_var %sel_var %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+OpDecorate %inner ArrayStride 4
+OpMemberDecorate %outer 0 Offset 0
+OpMemberDecorate %outer 1 Offset 8
+OpDecorate %rta ArrayStride 4
+OpDecorate %rta_out ArrayStride 16
+OpDecorate %block Block
+OpMemberDecorate %block 0 Offset 0
+OpDecorate %out_block Block
+OpMemberDecorate %out_block 0 Offset 0
+OpDecorate %sel_var DescriptorSet 0
+OpDecorate %sel_var Binding 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 1
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 2
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int3 = OpTypeVector %int 3
+%inner = OpTypeArray %int %int_2
+%outer = OpTypeStruct %inner %inner
+%rta_out = OpTypeRuntimeArray %outer
+%out_block = OpTypeStruct %rta_out
+%rta = OpTypeRuntimeArray %int
+%block = OpTypeStruct %rta
+%ptr_input_int3 = OpTypePointer Input %int3
+%gid_var = OpVariable %ptr_input_int3 Input
+%ptr_ssbo_block = OpTypePointer StorageBuffer %block
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%ptr_ssbo_out_block = OpTypePointer StorageBuffer %out_block
+%ptr_ssbo_outer = OpTypePointer StorageBuffer %outer
+%sel_var = OpVariable %ptr_ssbo_block StorageBuffer
+%in_var = OpVariable %ptr_ssbo_out_block StorageBuffer
+%out_var = OpVariable %ptr_ssbo_out_block StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%in_gep0 = OpAccessChain %ptr_ssbo_outer %in_var %int_0 %int_0
+%in0 = OpLoad %outer %in_gep0
+%in_gep1 = OpAccessChain %ptr_ssbo_outer %in_var %int_0 %int_1
+%in1 = OpLoad %outer %in_gep1
+%sel_gep = OpAccessChain %ptr_ssbo_int %sel_var %int_0 %gid_x
+%sel_val = OpLoad %int %sel_gep
+%eq_0 = OpIEqual %bool %sel_val %int_0
+%select = OpSelect %outer %eq_0 %in0 %in1
+%out_gep = OpAccessChain %ptr_ssbo_outer %out_var %int_0 %gid_x
+OpStore %out_gep %select
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 1 0
+ssbo 0:1 subdata uint 0 1 1 1 1 2 2 2 2
+ssbo 0:2 32
+
+compute entrypoint main
+compute 2 1 1
+
+probe ssbo uint 0:2 0 == 2 2 2 2
+probe ssbo uint 0:2 16 == 1 1 1 1
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/nested_struct_select.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/nested_struct_select.amber
new file mode 100644
index 0000000..23bcd8f
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/nested_struct_select.amber
@@ -0,0 +1,74 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %gid_var %sel_var %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+OpMemberDecorate %inner 0 Offset 0
+OpMemberDecorate %inner 1 Offset 4
+OpMemberDecorate %outer 0 Offset 0
+OpMemberDecorate %outer 1 Offset 8
+OpDecorate %rta ArrayStride 4
+OpDecorate %rta_out ArrayStride 16
+OpDecorate %block Block
+OpMemberDecorate %block 0 Offset 0
+OpDecorate %out_block Block
+OpMemberDecorate %out_block 0 Offset 0
+OpDecorate %sel_var DescriptorSet 0
+OpDecorate %sel_var Binding 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 1
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 2
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int3 = OpTypeVector %int 3
+%inner = OpTypeStruct %int %int
+%outer = OpTypeStruct %inner %inner
+%rta_out = OpTypeRuntimeArray %outer
+%out_block = OpTypeStruct %rta_out
+%rta = OpTypeRuntimeArray %int
+%block = OpTypeStruct %rta
+%ptr_input_int3 = OpTypePointer Input %int3
+%gid_var = OpVariable %ptr_input_int3 Input
+%ptr_ssbo_block = OpTypePointer StorageBuffer %block
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%ptr_ssbo_out_block = OpTypePointer StorageBuffer %out_block
+%ptr_ssbo_outer = OpTypePointer StorageBuffer %outer
+%sel_var = OpVariable %ptr_ssbo_block StorageBuffer
+%in_var = OpVariable %ptr_ssbo_out_block StorageBuffer
+%out_var = OpVariable %ptr_ssbo_out_block StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%in_gep0 = OpAccessChain %ptr_ssbo_outer %in_var %int_0 %int_0
+%in0 = OpLoad %outer %in_gep0
+%in_gep1 = OpAccessChain %ptr_ssbo_outer %in_var %int_0 %int_1
+%in1 = OpLoad %outer %in_gep1
+%sel_gep = OpAccessChain %ptr_ssbo_int %sel_var %int_0 %gid_x
+%sel_val = OpLoad %int %sel_gep
+%eq_0 = OpIEqual %bool %sel_val %int_0
+%select = OpSelect %outer %eq_0 %in0 %in1
+%out_gep = OpAccessChain %ptr_ssbo_outer %out_var %int_0 %gid_x
+OpStore %out_gep %select
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 1 0
+ssbo 0:1 subdata uint 0 1 1 1 1 2 2 2 2
+ssbo 0:2 32
+
+compute entrypoint main
+compute 2 1 1
+
+probe ssbo uint 0:2 0 == 2 2 2 2
+probe ssbo uint 0:2 16 == 1 1 1 1
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/scalar_select.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/scalar_select.amber
new file mode 100644
index 0000000..8e96ea6
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/scalar_select.amber
@@ -0,0 +1,77 @@
+[require]
+
+[compute shader spirv]
+; OpSelect among scalars. This is in SPIR-V 1.0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationID %_ %__0
+ OpExecutionMode %main LocalSize 1 1 1
+ OpSource GLSL 430
+ OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"
+ OpSourceExtension "GL_GOOGLE_include_directive"
+ OpName %main "main"
+ OpName %output_buffer "output_buffer"
+ OpMemberName %output_buffer 0 "out_SSBO"
+ OpName %_ ""
+ OpName %gl_GlobalInvocationID "gl_GlobalInvocationID"
+ OpName %input_buffer "input_buffer"
+ OpMemberName %input_buffer 0 "data_SSBO"
+ OpName %__0 ""
+ OpDecorate %_runtimearr_int ArrayStride 4
+ OpMemberDecorate %output_buffer 0 Offset 0
+ OpDecorate %output_buffer Block
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 1
+ OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
+ OpDecorate %_runtimearr_int_0 ArrayStride 4
+ OpMemberDecorate %input_buffer 0 Offset 0
+ OpDecorate %input_buffer Block
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 0
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+%_runtimearr_int = OpTypeRuntimeArray %int
+%output_buffer = OpTypeStruct %_runtimearr_int
+%_ptr_StorageBuffer_output_buffer = OpTypePointer StorageBuffer %output_buffer
+ %_ = OpVariable %_ptr_StorageBuffer_output_buffer StorageBuffer
+ %int_0 = OpConstant %int 0
+ %uint = OpTypeInt 32 0
+ %v3uint = OpTypeVector %uint 3
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
+ %uint_2 = OpConstant %uint 2
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_runtimearr_int_0 = OpTypeRuntimeArray %int
+%input_buffer = OpTypeStruct %_runtimearr_int_0
+%_ptr_StorageBuffer_input_buffer = OpTypePointer StorageBuffer %input_buffer
+ %__0 = OpVariable %_ptr_StorageBuffer_input_buffer StorageBuffer
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+ %bool = OpTypeBool
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %18 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_2
+ %19 = OpLoad %uint %18
+ %24 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_2
+ %25 = OpLoad %uint %24
+ %27 = OpAccessChain %_ptr_StorageBuffer_int %__0 %int_0 %25
+ %28 = OpLoad %int %27
+ %30 = OpIEqual %bool %28 %int_0
+ %33 = OpSelect %int %30 %int_1 %int_2
+ %34 = OpAccessChain %_ptr_StorageBuffer_int %_ %int_0 %19
+ OpStore %34 %33
+ OpReturn
+ OpFunctionEnd
+[test]
+ssbo 0:0 8
+ssbo 0:0 subdata int 0 0 1
+ssbo 0:1 8
+ssbo 0:1 subdata int 0 -1 -1
+
+compute entrypoint main
+compute 1 1 2
+
+probe ssbo int 0:1 0 == 1 2
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/ssbo_pointers_2_select.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/ssbo_pointers_2_select.amber
new file mode 100644
index 0000000..60cc75f
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/ssbo_pointers_2_select.amber
@@ -0,0 +1,83 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VariablePointerFeatures.variablePointers
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %gid_var %sel_var %in1_var %in2_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+OpMemberDecorate %inner 0 Offset 0
+OpMemberDecorate %inner 1 Offset 4
+OpMemberDecorate %outer 0 Offset 0
+OpMemberDecorate %outer 1 Offset 8
+OpDecorate %rta ArrayStride 4
+OpDecorate %rta_struct ArrayStride 16
+OpDecorate %block Block
+OpMemberDecorate %block 0 Offset 0
+OpDecorate %data_block Block
+OpMemberDecorate %data_block 0 Offset 0
+OpDecorate %sel_var DescriptorSet 0
+OpDecorate %sel_var Binding 0
+OpDecorate %in1_var DescriptorSet 0
+OpDecorate %in1_var Binding 1
+OpDecorate %in2_var DescriptorSet 0
+OpDecorate %in2_var Binding 2
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 3
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int3 = OpTypeVector %int 3
+%inner = OpTypeStruct %int %int
+%outer = OpTypeStruct %inner %inner
+%rta_struct = OpTypeRuntimeArray %outer
+%rta = OpTypeRuntimeArray %int
+%data_block = OpTypeStruct %rta_struct
+%block = OpTypeStruct %rta
+%ptr_input_int3 = OpTypePointer Input %int3
+%gid_var = OpVariable %ptr_input_int3 Input
+%ptr_ssbo_block = OpTypePointer StorageBuffer %block
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%ptr_ssbo_data_block = OpTypePointer StorageBuffer %data_block
+%ptr_ssbo_outer = OpTypePointer StorageBuffer %outer
+%sel_var = OpVariable %ptr_ssbo_block StorageBuffer
+%in1_var = OpVariable %ptr_ssbo_data_block StorageBuffer
+%in2_var = OpVariable %ptr_ssbo_data_block StorageBuffer
+%out_var = OpVariable %ptr_ssbo_data_block StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%in_gep0 = OpAccessChain %ptr_ssbo_outer %in1_var %int_0 %int_0
+%in_gep1 = OpAccessChain %ptr_ssbo_outer %in2_var %int_0 %int_0
+%sel_gep = OpAccessChain %ptr_ssbo_int %sel_var %int_0 %gid_x
+%sel_val = OpLoad %int %sel_gep
+%eq_0 = OpIEqual %bool %sel_val %int_0
+%select = OpSelect %ptr_ssbo_outer %eq_0 %in_gep0 %in_gep1
+%out_gep = OpAccessChain %ptr_ssbo_outer %out_var %int_0 %gid_x
+%ld = OpLoad %outer %select
+OpStore %out_gep %ld
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 1 0
+ssbo 0:1 subdata uint 0 1 1 1 1
+ssbo 0:2 subdata uint 0 2 2 2 2
+ssbo 0:3 32
+
+compute entrypoint main
+compute 2 1 1
+
+probe ssbo uint 0:3 0 == 2 2 2 2
+probe ssbo uint 0:3 16 == 1 1 1 1
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/ssbo_pointers_select.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/ssbo_pointers_select.amber
new file mode 100644
index 0000000..bb25bb9
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/ssbo_pointers_select.amber
@@ -0,0 +1,76 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+OpCapability Shader
+OpCapability VariablePointersStorageBuffer
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %gid_var %sel_var %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+OpMemberDecorate %inner 0 Offset 0
+OpMemberDecorate %inner 1 Offset 4
+OpMemberDecorate %outer 0 Offset 0
+OpMemberDecorate %outer 1 Offset 8
+OpDecorate %rta ArrayStride 4
+OpDecorate %rta_struct ArrayStride 16
+OpDecorate %block Block
+OpMemberDecorate %block 0 Offset 0
+OpDecorate %data_block Block
+OpMemberDecorate %data_block 0 Offset 0
+OpDecorate %sel_var DescriptorSet 0
+OpDecorate %sel_var Binding 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 1
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 2
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int3 = OpTypeVector %int 3
+%inner = OpTypeStruct %int %int
+%outer = OpTypeStruct %inner %inner
+%rta_struct = OpTypeRuntimeArray %outer
+%rta = OpTypeRuntimeArray %int
+%data_block = OpTypeStruct %rta_struct
+%block = OpTypeStruct %rta
+%ptr_input_int3 = OpTypePointer Input %int3
+%gid_var = OpVariable %ptr_input_int3 Input
+%ptr_ssbo_block = OpTypePointer StorageBuffer %block
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%ptr_ssbo_data_block = OpTypePointer StorageBuffer %data_block
+%ptr_ssbo_outer = OpTypePointer StorageBuffer %outer
+%sel_var = OpVariable %ptr_ssbo_block StorageBuffer
+%in_var = OpVariable %ptr_ssbo_data_block StorageBuffer
+%out_var = OpVariable %ptr_ssbo_data_block StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%in_gep0 = OpAccessChain %ptr_ssbo_outer %in_var %int_0 %int_0
+%in_gep1 = OpAccessChain %ptr_ssbo_outer %in_var %int_0 %int_1
+%sel_gep = OpAccessChain %ptr_ssbo_int %sel_var %int_0 %gid_x
+%sel_val = OpLoad %int %sel_gep
+%eq_0 = OpIEqual %bool %sel_val %int_0
+%select = OpSelect %ptr_ssbo_outer %eq_0 %in_gep0 %in_gep1
+%out_gep = OpAccessChain %ptr_ssbo_outer %out_var %int_0 %gid_x
+OpCopyMemory %out_gep %select
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 1 0
+ssbo 0:1 subdata uint 0 1 1 1 1 2 2 2 2
+ssbo 0:2 32
+
+compute entrypoint main
+compute 2 1 1
+
+probe ssbo uint 0:2 0 == 2 2 2 2
+probe ssbo uint 0:2 16 == 1 1 1 1
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/struct_select.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/struct_select.amber
new file mode 100644
index 0000000..1fdd8d6
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/struct_select.amber
@@ -0,0 +1,129 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; Test OpSelect with a scalar condition and composite result type.
+; Generated from the following GLSL with minor modification.
+;
+;#version 430
+;
+;struct S {int a; int b; int c;};
+;
+;layout(std430, binding = 0) buffer input_buffer
+;{
+; S data_SSBO[];
+;};
+;
+;layout(std430, binding = 1) buffer output_buffer
+;{
+; S out_SSBO[];
+;};
+;
+;void main() {
+; S one = { 1, 1, 1 };
+; S two = { 2, 2, 2 };
+;
+; out_SSBO[gl_GlobalInvocationID.z] = (data_SSBO[gl_GlobalInvocationID.z].a == 0 ? one : two);
+;}
+;
+; Applying the no signed wrap decoration
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationID %_ %__0
+ OpExecutionMode %main LocalSize 1 1 1
+ OpSource GLSL 430
+ OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"
+ OpSourceExtension "GL_GOOGLE_include_directive"
+ OpName %main "main"
+ OpName %S "S"
+ OpMemberName %S 0 "a"
+ OpMemberName %S 1 "b"
+ OpMemberName %S 2 "c"
+ OpName %one "one"
+ OpName %two "two"
+ OpName %S_0 "S"
+ OpMemberName %S_0 0 "a"
+ OpMemberName %S_0 1 "b"
+ OpMemberName %S_0 2 "c"
+ OpName %output_buffer "output_buffer"
+ OpMemberName %output_buffer 0 "out_SSBO"
+ OpName %_ ""
+ OpName %gl_GlobalInvocationID "gl_GlobalInvocationID"
+ OpName %input_buffer "input_buffer"
+ OpMemberName %input_buffer 0 "data_SSBO"
+ OpName %__0 ""
+ OpMemberDecorate %S_0 0 Offset 0
+ OpMemberDecorate %S_0 1 Offset 4
+ OpMemberDecorate %S_0 2 Offset 8
+ OpDecorate %_runtimearr_S_0 ArrayStride 12
+ OpMemberDecorate %output_buffer 0 Offset 0
+ OpDecorate %output_buffer Block
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 1
+ OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
+ OpDecorate %_runtimearr_S_0_0 ArrayStride 12
+ OpMemberDecorate %input_buffer 0 Offset 0
+ OpDecorate %input_buffer Block
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 0
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %S = OpTypeStruct %int %int %int
+%_ptr_Function_S = OpTypePointer Function %S
+ %int_1 = OpConstant %int 1
+ %11 = OpConstantComposite %S %int_1 %int_1 %int_1
+ %int_2 = OpConstant %int 2
+ %14 = OpConstantComposite %S %int_2 %int_2 %int_2
+ %S_0 = OpTypeStruct %int %int %int
+%_runtimearr_S_0 = OpTypeRuntimeArray %S_0
+%output_buffer = OpTypeStruct %_runtimearr_S_0
+%_ptr_StorageBuffer_output_buffer = OpTypePointer StorageBuffer %output_buffer
+ %_ = OpVariable %_ptr_StorageBuffer_output_buffer StorageBuffer
+ %int_0 = OpConstant %int 0
+ %uint = OpTypeInt 32 0
+ %v3uint = OpTypeVector %uint 3
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
+ %uint_2 = OpConstant %uint 2
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_runtimearr_S_0_0 = OpTypeRuntimeArray %S_0
+%input_buffer = OpTypeStruct %_runtimearr_S_0_0
+%_ptr_StorageBuffer_input_buffer = OpTypePointer StorageBuffer %input_buffer
+ %__0 = OpVariable %_ptr_StorageBuffer_input_buffer StorageBuffer
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+ %bool = OpTypeBool
+%_ptr_StorageBuffer_S_0 = OpTypePointer StorageBuffer %S_0
+%one = OpConstantComposite %S %int_1 %int_1 %int_1
+%two = OpConstantComposite %S %int_2 %int_2 %int_2
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %27 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_2
+ %28 = OpLoad %uint %27
+ %36 = OpAccessChain %_ptr_StorageBuffer_int %__0 %int_0 %28 %int_0
+ %37 = OpLoad %int %36
+ %39 = OpIEqual %bool %37 %int_0
+ %sel = OpSelect %S %39 %one %two
+ %48 = OpAccessChain %_ptr_StorageBuffer_S_0 %_ %int_0 %28
+ %49 = OpCompositeExtract %int %sel 0
+ %50 = OpAccessChain %_ptr_StorageBuffer_int %48 %int_0
+ OpStore %50 %49
+ %51 = OpCompositeExtract %int %sel 1
+ %52 = OpAccessChain %_ptr_StorageBuffer_int %48 %int_1
+ OpStore %52 %51
+ %53 = OpCompositeExtract %int %sel 2
+ %54 = OpAccessChain %_ptr_StorageBuffer_int %48 %int_2
+ OpStore %54 %53
+ OpReturn
+ OpFunctionEnd
+[test]
+ssbo 0:0 24
+ssbo 0:0 subdata int 0 0 0 0 1 1 1
+ssbo 0:1 8
+ssbo 0:1 subdata int 0 -1 -1 -1 -1 -1 -1
+
+compute entrypoint main
+compute 1 1 2
+
+probe ssbo int 0:1 0 == 1 1 1 2 2 2
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/vector_element_select.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/vector_element_select.amber
new file mode 100644
index 0000000..88d6724
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/vector_element_select.amber
@@ -0,0 +1,64 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %gid_var %sel_var %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+OpDecorate %rta ArrayStride 16
+OpDecorate %block Block
+OpMemberDecorate %block 0 Offset 0
+OpDecorate %sel_var DescriptorSet 0
+OpDecorate %sel_var Binding 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 1
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 2
+%void = OpTypeVoid
+%bool = OpTypeBool
+%bool4 = OpTypeVector %bool 4
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int3 = OpTypeVector %int 3
+%int4 = OpTypeVector %int 4
+%int4_0 = OpConstantNull %int4
+%rta = OpTypeRuntimeArray %int4
+%block = OpTypeStruct %rta
+%ptr_input_int3 = OpTypePointer Input %int3
+%gid_var = OpVariable %ptr_input_int3 Input
+%ptr_ssbo_block = OpTypePointer StorageBuffer %block
+%ptr_ssbo_int4 = OpTypePointer StorageBuffer %int4
+%sel_var = OpVariable %ptr_ssbo_block StorageBuffer
+%in_var = OpVariable %ptr_ssbo_block StorageBuffer
+%out_var = OpVariable %ptr_ssbo_block StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%in_gep0 = OpAccessChain %ptr_ssbo_int4 %in_var %int_0 %int_0
+%in0 = OpLoad %int4 %in_gep0
+%in_gep1 = OpAccessChain %ptr_ssbo_int4 %in_var %int_0 %int_1
+%in1 = OpLoad %int4 %in_gep1
+%sel_gep = OpAccessChain %ptr_ssbo_int4 %sel_var %int_0 %gid_x
+%sel_ld = OpLoad %int4 %sel_gep
+%eq_0 = OpIEqual %bool4 %sel_ld %int4_0
+%select = OpSelect %int4 %eq_0 %in0 %in1
+%out_gep = OpAccessChain %ptr_ssbo_int4 %out_var %int_0 %gid_x
+OpStore %out_gep %select
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 0 1 0 1 1 0 1 0
+ssbo 0:1 subdata uint 0 1 1 1 1 2 2 2 2
+ssbo 0:2 32
+
+compute entrypoint main
+compute 2 1 1
+
+probe ssbo uint 0:2 0 == 1 2 1 2
+probe ssbo uint 0:2 16 == 2 1 2 1
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/vector_select.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/vector_select.amber
new file mode 100644
index 0000000..3702248
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/vector_select.amber
@@ -0,0 +1,128 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; Test OpSelect with a scalar condition and vector result type.
+; Generated from the following GLSL with minor modification.
+;
+; #version 430
+;
+;
+; layout(std430, binding = 0) buffer input_buffer
+; {
+; vec4 data_SSBO[];
+; };
+;
+; layout(std430, binding = 1) buffer output_buffer
+; {
+; vec4 out_SSBO[];
+; };
+;
+; void main() {
+; bool cond = data_SSBO[gl_GlobalInvocationID.z].x == 0.0;
+; vec4 a = {1.0, 3.0, 5.0, 7.0};
+; vec4 b = {2.0, 4.0, 6.0, 8.0};
+; out_SSBO[gl_GlobalInvocationID.z] = (cond ? a : b);
+; }
+
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationID %_ %__0
+ OpExecutionMode %main LocalSize 1 1 1
+ OpSource GLSL 430
+ OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"
+ OpSourceExtension "GL_GOOGLE_include_directive"
+ OpName %main "main"
+ OpName %cond "cond"
+ OpName %input_buffer "input_buffer"
+ OpMemberName %input_buffer 0 "data_SSBO"
+ OpName %_ ""
+ OpName %gl_GlobalInvocationID "gl_GlobalInvocationID"
+ OpName %a "a"
+ OpName %b "b"
+ OpName %output_buffer "output_buffer"
+ OpMemberName %output_buffer 0 "out_SSBO"
+ OpName %__0 ""
+ OpDecorate %_runtimearr_v4float ArrayStride 16
+ OpMemberDecorate %input_buffer 0 Offset 0
+ OpDecorate %input_buffer Block
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
+ OpDecorate %_runtimearr_v4float_0 ArrayStride 16
+ OpMemberDecorate %output_buffer 0 Offset 0
+ OpDecorate %output_buffer Block
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 1
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_runtimearr_v4float = OpTypeRuntimeArray %v4float
+%input_buffer = OpTypeStruct %_runtimearr_v4float
+%_ptr_StorageBuffer_input_buffer = OpTypePointer StorageBuffer %input_buffer
+ %_ = OpVariable %_ptr_StorageBuffer_input_buffer StorageBuffer
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %uint = OpTypeInt 32 0
+ %v3uint = OpTypeVector %uint 3
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
+ %uint_2 = OpConstant %uint 2
+%_ptr_Input_uint = OpTypePointer Input %uint
+ %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
+ %float_0 = OpConstant %float 0
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+ %float_1 = OpConstant %float 1
+ %float_3 = OpConstant %float 3
+ %float_5 = OpConstant %float 5
+ %float_7 = OpConstant %float 7
+ %37 = OpConstantComposite %v4float %float_1 %float_3 %float_5 %float_7
+ %float_2 = OpConstant %float 2
+ %float_4 = OpConstant %float 4
+ %float_6 = OpConstant %float 6
+ %float_8 = OpConstant %float 8
+ %43 = OpConstantComposite %v4float %float_2 %float_4 %float_6 %float_8
+%_runtimearr_v4float_0 = OpTypeRuntimeArray %v4float
+%output_buffer = OpTypeStruct %_runtimearr_v4float_0
+%_ptr_StorageBuffer_output_buffer = OpTypePointer StorageBuffer %output_buffer
+ %__0 = OpVariable %_ptr_StorageBuffer_output_buffer StorageBuffer
+ %v4bool = OpTypeVector %bool 4
+%_ptr_StorageBuffer_v4float = OpTypePointer StorageBuffer %v4float
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %cond = OpVariable %_ptr_Function_bool Function
+ %a = OpVariable %_ptr_Function_v4float Function
+ %b = OpVariable %_ptr_Function_v4float Function
+ %23 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_2
+ %24 = OpLoad %uint %23
+ %27 = OpAccessChain %_ptr_StorageBuffer_float %_ %int_0 %24 %uint_0
+ %28 = OpLoad %float %27
+ %30 = OpFOrdEqual %bool %28 %float_0
+ OpStore %cond %30
+ OpStore %a %37
+ OpStore %b %43
+ %48 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_2
+ %49 = OpLoad %uint %48
+ %50 = OpLoad %bool %cond
+ %51 = OpLoad %v4float %a
+ %52 = OpLoad %v4float %b
+ %55 = OpSelect %v4float %50 %51 %52
+ %57 = OpAccessChain %_ptr_StorageBuffer_v4float %__0 %int_0 %49
+ OpStore %57 %55
+ OpReturn
+ OpFunctionEnd
+[test]
+ssbo 0:0 24
+ssbo 0:0 subdata float 0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0
+ssbo 0:1 8
+ssbo 0:1 subdata float 0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0
+
+compute entrypoint main
+compute 1 1 2
+
+probe ssbo float 0:1 0 == 1.0 3.0 5.0 7.0 2.0 4.0 6.0 8.0
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/wg_pointers_2_select.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/wg_pointers_2_select.amber
new file mode 100644
index 0000000..52eabd9
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/wg_pointers_2_select.amber
@@ -0,0 +1,84 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VariablePointerFeatures.variablePointers
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %gid_var %sel_var %wg1_var %wg2_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+OpMemberDecorate %inner 0 Offset 0
+OpMemberDecorate %inner 1 Offset 4
+OpMemberDecorate %outer 0 Offset 0
+OpMemberDecorate %outer 1 Offset 8
+OpDecorate %rta ArrayStride 4
+OpDecorate %rta_struct ArrayStride 16
+OpDecorate %block Block
+OpMemberDecorate %block 0 Offset 0
+OpDecorate %data_block Block
+OpMemberDecorate %data_block 0 Offset 0
+OpDecorate %sel_var DescriptorSet 0
+OpDecorate %sel_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int3 = OpTypeVector %int 3
+%inner = OpTypeStruct %int %int
+%outer = OpTypeStruct %inner %inner
+%rta_struct = OpTypeRuntimeArray %outer
+%rta = OpTypeRuntimeArray %int
+%data_block = OpTypeStruct %rta_struct
+%block = OpTypeStruct %rta
+%ptr_input_int3 = OpTypePointer Input %int3
+%gid_var = OpVariable %ptr_input_int3 Input
+%ptr_ssbo_block = OpTypePointer StorageBuffer %block
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%ptr_ssbo_data_block = OpTypePointer StorageBuffer %data_block
+%ptr_ssbo_outer = OpTypePointer StorageBuffer %outer
+%sel_var = OpVariable %ptr_ssbo_block StorageBuffer
+%ptr_wg_outer = OpTypePointer Workgroup %outer
+%wg1_var = OpVariable %ptr_wg_outer Workgroup
+%wg2_var = OpVariable %ptr_wg_outer Workgroup
+%out_var = OpVariable %ptr_ssbo_data_block StorageBuffer
+%inner_const0 = OpConstantComposite %inner %int_1 %int_1
+%inner_const1 = OpConstantComposite %inner %int_2 %int_2
+%outer_const0 = OpConstantComposite %outer %inner_const0 %inner_const0
+%outer_const1 = OpConstantComposite %outer %inner_const1 %inner_const1
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+OpStore %wg1_var %outer_const0
+OpStore %wg2_var %outer_const1
+%sel_gep = OpAccessChain %ptr_ssbo_int %sel_var %int_0 %gid_x
+%sel_val = OpLoad %int %sel_gep
+%eq_0 = OpIEqual %bool %sel_val %int_0
+%select = OpSelect %ptr_wg_outer %eq_0 %wg1_var %wg2_var
+%out_gep = OpAccessChain %ptr_ssbo_outer %out_var %int_0 %gid_x
+%ld = OpLoad %outer %select
+OpStore %out_gep %ld
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 1 0
+ssbo 0:1 32
+
+compute entrypoint main
+compute 2 1 1
+
+probe ssbo uint 0:1 0 == 2 2 2 2
+probe ssbo uint 0:1 16 == 1 1 1 1
+
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/wg_pointers_select.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/wg_pointers_select.amber
new file mode 100644
index 0000000..6731121
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/wg_pointers_select.amber
@@ -0,0 +1,86 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VariablePointerFeatures.variablePointers
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %gid_var %sel_var %wg_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+OpMemberDecorate %inner 0 Offset 0
+OpMemberDecorate %inner 1 Offset 4
+OpMemberDecorate %outer 0 Offset 0
+OpMemberDecorate %outer 1 Offset 8
+OpDecorate %rta ArrayStride 4
+OpDecorate %rta_struct ArrayStride 16
+OpDecorate %block Block
+OpMemberDecorate %block 0 Offset 0
+OpDecorate %data_block Block
+OpMemberDecorate %data_block 0 Offset 0
+OpDecorate %sel_var DescriptorSet 0
+OpDecorate %sel_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int3 = OpTypeVector %int 3
+%inner = OpTypeStruct %int %int
+%outer = OpTypeStruct %inner %inner
+%rta_struct = OpTypeRuntimeArray %outer
+%rta = OpTypeRuntimeArray %int
+%data_block = OpTypeStruct %rta_struct
+%block = OpTypeStruct %rta
+%ptr_input_int3 = OpTypePointer Input %int3
+%gid_var = OpVariable %ptr_input_int3 Input
+%ptr_ssbo_block = OpTypePointer StorageBuffer %block
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%ptr_ssbo_data_block = OpTypePointer StorageBuffer %data_block
+%ptr_ssbo_outer = OpTypePointer StorageBuffer %outer
+%wg_data = OpTypeArray %outer %int_2
+%ptr_wg_data = OpTypePointer Workgroup %wg_data
+%ptr_wg_outer = OpTypePointer Workgroup %outer
+%sel_var = OpVariable %ptr_ssbo_block StorageBuffer
+%wg_var = OpVariable %ptr_wg_data Workgroup
+%out_var = OpVariable %ptr_ssbo_data_block StorageBuffer
+%inner_const0 = OpConstantComposite %inner %int_1 %int_1
+%inner_const1 = OpConstantComposite %inner %int_2 %int_2
+%outer_const0 = OpConstantComposite %outer %inner_const0 %inner_const0
+%outer_const1 = OpConstantComposite %outer %inner_const1 %inner_const1
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%wg_gep0 = OpAccessChain %ptr_wg_outer %wg_var %int_0
+%wg_gep1 = OpAccessChain %ptr_wg_outer %wg_var %int_1
+OpStore %wg_gep0 %outer_const0
+OpStore %wg_gep1 %outer_const1
+%sel_gep = OpAccessChain %ptr_ssbo_int %sel_var %int_0 %gid_x
+%sel_val = OpLoad %int %sel_gep
+%eq_0 = OpIEqual %bool %sel_val %int_0
+%select = OpSelect %ptr_wg_outer %eq_0 %wg_gep0 %wg_gep1
+%out_gep = OpAccessChain %ptr_ssbo_outer %out_var %int_0 %gid_x
+%ld = OpLoad %outer %select
+OpStore %out_gep %ld
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 1 0
+ssbo 0:1 32
+
+compute entrypoint main
+compute 2 1 1
+
+probe ssbo uint 0:1 0 == 2 2 2 2
+probe ssbo uint 0:1 16 == 1 1 1 1
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uconvert/spec_const_opt_extend_16.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uconvert/spec_const_opt_extend_16.amber
new file mode 100644
index 0000000..b61260e
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uconvert/spec_const_opt_extend_16.amber
@@ -0,0 +1,47 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; SpecConstantOp zero extend 16-bit 16 value to 32-bit.
+ OpCapability Shader
+ OpCapability Int16
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main" %_
+ OpExecutionMode %main LocalSize 1 1 1
+ OpSource GLSL 430
+ OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"
+ OpSourceExtension "GL_GOOGLE_include_directive"
+ OpName %main "main"
+ OpName %output_buffer "output_buffer"
+ OpMemberName %output_buffer 0 "out_SSBO"
+ OpName %_ ""
+ OpMemberDecorate %output_buffer 0 Offset 0
+ OpDecorate %output_buffer Block
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 1
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint16 = OpTypeInt 16 0
+ %uint = OpTypeInt 32 0
+%output_buffer = OpTypeStruct %uint
+%_ptr_StorageBuffer_output_buffer = OpTypePointer StorageBuffer %output_buffer
+ %_ = OpVariable %_ptr_StorageBuffer_output_buffer StorageBuffer
+ %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %uint
+%spec_const = OpSpecConstant %uint16 16
+%op_spec_const = OpSpecConstantOp %uint UConvert %spec_const
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %34 = OpAccessChain %_ptr_StorageBuffer_int %_ %uint_0
+ OpStore %34 %op_spec_const
+ OpReturn
+ OpFunctionEnd
+[test]
+ssbo 0:1 8
+ssbo 0:1 subdata uint 0 0 0
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:1 0 == 16 0
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uconvert/spec_const_opt_extend_16_64_bit.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uconvert/spec_const_opt_extend_16_64_bit.amber
new file mode 100644
index 0000000..23caaf0
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uconvert/spec_const_opt_extend_16_64_bit.amber
@@ -0,0 +1,46 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; SpecConstantOp zero extend 32-bit 16 value to 64-bit.
+ OpCapability Shader
+ OpCapability Int64
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main" %_
+ OpExecutionMode %main LocalSize 1 1 1
+ OpSource GLSL 430
+ OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"
+ OpSourceExtension "GL_GOOGLE_include_directive"
+ OpName %main "main"
+ OpName %output_buffer "output_buffer"
+ OpMemberName %output_buffer 0 "out_SSBO"
+ OpName %_ ""
+ OpMemberDecorate %output_buffer 0 Offset 0
+ OpDecorate %output_buffer Block
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 1
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %uint64 = OpTypeInt 64 0
+%output_buffer = OpTypeStruct %uint64
+%_ptr_StorageBuffer_output_buffer = OpTypePointer StorageBuffer %output_buffer
+ %_ = OpVariable %_ptr_StorageBuffer_output_buffer StorageBuffer
+ %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer_int64 = OpTypePointer StorageBuffer %uint64
+%spec_const = OpSpecConstant %uint 16
+%op_spec_const = OpSpecConstantOp %uint64 UConvert %spec_const
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %34 = OpAccessChain %_ptr_StorageBuffer_int64 %_ %uint_0
+ OpStore %34 %op_spec_const
+ OpReturn
+ OpFunctionEnd
+[test]
+ssbo 0:1 subdata uint64_t 0 0 0
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint64_t 0:1 0 == 16 0
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uconvert/spec_const_opt_extend_251658240_64_bits.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uconvert/spec_const_opt_extend_251658240_64_bits.amber
new file mode 100644
index 0000000..317c1b3
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uconvert/spec_const_opt_extend_251658240_64_bits.amber
@@ -0,0 +1,46 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; SpecConstantOp zero extend 32-bit 0xF0000000 value (251,658,240) to 64-bit.
+ OpCapability Shader
+ OpCapability Int64
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main" %_
+ OpExecutionMode %main LocalSize 1 1 1
+ OpSource GLSL 430
+ OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"
+ OpSourceExtension "GL_GOOGLE_include_directive"
+ OpName %main "main"
+ OpName %output_buffer "output_buffer"
+ OpMemberName %output_buffer 0 "out_SSBO"
+ OpName %_ ""
+ OpMemberDecorate %output_buffer 0 Offset 0
+ OpDecorate %output_buffer Block
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 1
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %uint64 = OpTypeInt 64 0
+%output_buffer = OpTypeStruct %uint64
+%_ptr_StorageBuffer_output_buffer = OpTypePointer StorageBuffer %output_buffer
+ %_ = OpVariable %_ptr_StorageBuffer_output_buffer StorageBuffer
+ %uint_0 = OpConstant %uint64 0
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %uint64
+%spec_const = OpSpecConstant %uint 251658240
+%op_spec_const = OpSpecConstantOp %uint64 UConvert %spec_const
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %34 = OpAccessChain %_ptr_StorageBuffer_int %_ %uint_0
+ OpStore %34 %op_spec_const
+ OpReturn
+ OpFunctionEnd
+[test]
+ssbo 0:1 subdata uint64_t 0 0 0
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint64_t 0:1 0 == 251658240 0
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uconvert/spec_const_opt_extend_61440.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uconvert/spec_const_opt_extend_61440.amber
new file mode 100644
index 0000000..ac6f30e
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uconvert/spec_const_opt_extend_61440.amber
@@ -0,0 +1,47 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; SpecConstantOp zero extend 16-bit 0xF000 value (61,440) to 32-bit.
+ OpCapability Shader
+ OpCapability Int16
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main" %_
+ OpExecutionMode %main LocalSize 1 1 1
+ OpSource GLSL 430
+ OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"
+ OpSourceExtension "GL_GOOGLE_include_directive"
+ OpName %main "main"
+ OpName %output_buffer "output_buffer"
+ OpMemberName %output_buffer 0 "out_SSBO"
+ OpName %_ ""
+ OpMemberDecorate %output_buffer 0 Offset 0
+ OpDecorate %output_buffer Block
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 1
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint16 = OpTypeInt 16 0
+ %uint = OpTypeInt 32 0
+%output_buffer = OpTypeStruct %uint
+%_ptr_StorageBuffer_output_buffer = OpTypePointer StorageBuffer %output_buffer
+ %_ = OpVariable %_ptr_StorageBuffer_output_buffer StorageBuffer
+ %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %uint
+%spec_const = OpSpecConstant %uint16 61440
+%op_spec_const = OpSpecConstantOp %uint UConvert %spec_const
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %34 = OpAccessChain %_ptr_StorageBuffer_int %_ %uint_0
+ OpStore %34 %op_spec_const
+ OpReturn
+ OpFunctionEnd
+[test]
+ssbo 0:1 8
+ssbo 0:1 subdata uint 0 0 0
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:1 0 == 61440 0
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uconvert/spec_const_opt_truncate_16.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uconvert/spec_const_opt_truncate_16.amber
new file mode 100644
index 0000000..0763cee
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uconvert/spec_const_opt_truncate_16.amber
@@ -0,0 +1,47 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; SpecConstantOp truncate 32-bit 16 value to 16-bit.
+ OpCapability Shader
+ OpCapability Int16
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main" %_
+ OpExecutionMode %main LocalSize 1 1 1
+ OpSource GLSL 430
+ OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"
+ OpSourceExtension "GL_GOOGLE_include_directive"
+ OpName %main "main"
+ OpName %output_buffer "output_buffer"
+ OpMemberName %output_buffer 0 "out_SSBO"
+ OpName %_ ""
+ OpMemberDecorate %output_buffer 0 Offset 0
+ OpDecorate %output_buffer Block
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 1
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint16 = OpTypeInt 16 0
+ %uint = OpTypeInt 32 0
+%output_buffer = OpTypeStruct %uint16
+%_ptr_StorageBuffer_output_buffer = OpTypePointer StorageBuffer %output_buffer
+ %_ = OpVariable %_ptr_StorageBuffer_output_buffer StorageBuffer
+ %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer_uint16 = OpTypePointer StorageBuffer %uint16
+%spec_const = OpSpecConstant %uint 16
+%op_spec_const = OpSpecConstantOp %uint16 UConvert %spec_const
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %34 = OpAccessChain %_ptr_StorageBuffer_uint16 %_ %uint_0
+ OpStore %34 %op_spec_const
+ OpReturn
+ OpFunctionEnd
+[test]
+ssbo 0:1 4
+ssbo 0:1 subdata uint8_t 0 0 0
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint8_t 0:1 0 == 16 0
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uconvert/spec_const_opt_truncate_16_64_bit.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uconvert/spec_const_opt_truncate_16_64_bit.amber
new file mode 100644
index 0000000..ff88276
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uconvert/spec_const_opt_truncate_16_64_bit.amber
@@ -0,0 +1,46 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; SpecConstantOp truncate 64-bit 16 value to 32-bit.
+ OpCapability Shader
+ OpCapability Int64
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main" %_
+ OpExecutionMode %main LocalSize 1 1 1
+ OpSource GLSL 430
+ OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"
+ OpSourceExtension "GL_GOOGLE_include_directive"
+ OpName %main "main"
+ OpName %output_buffer "output_buffer"
+ OpMemberName %output_buffer 0 "out_SSBO"
+ OpName %_ ""
+ OpMemberDecorate %output_buffer 0 Offset 0
+ OpDecorate %output_buffer Block
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 1
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %uint64 = OpTypeInt 64 0
+%output_buffer = OpTypeStruct %uint
+%_ptr_StorageBuffer_output_buffer = OpTypePointer StorageBuffer %output_buffer
+ %_ = OpVariable %_ptr_StorageBuffer_output_buffer StorageBuffer
+ %uint_0 = OpConstant %uint64 0
+%_ptr_StorageBuffer_uint16 = OpTypePointer StorageBuffer %uint
+%spec_const = OpSpecConstant %uint64 16
+%op_spec_const = OpSpecConstantOp %uint UConvert %spec_const
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %34 = OpAccessChain %_ptr_StorageBuffer_uint16 %_ %uint_0
+ OpStore %34 %op_spec_const
+ OpReturn
+ OpFunctionEnd
+[test]
+ssbo 0:1 subdata uint 0 0 0
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:1 0 == 16 0
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uconvert/spec_const_opt_truncate_983040.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uconvert/spec_const_opt_truncate_983040.amber
new file mode 100644
index 0000000..0ddc592
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uconvert/spec_const_opt_truncate_983040.amber
@@ -0,0 +1,47 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; SpecConstantOp truncate 32-bit 983,041 value to 16-bit.
+ OpCapability Shader
+ OpCapability Int16
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main" %_
+ OpExecutionMode %main LocalSize 1 1 1
+ OpSource GLSL 430
+ OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"
+ OpSourceExtension "GL_GOOGLE_include_directive"
+ OpName %main "main"
+ OpName %output_buffer "output_buffer"
+ OpMemberName %output_buffer 0 "out_SSBO"
+ OpName %_ ""
+ OpMemberDecorate %output_buffer 0 Offset 0
+ OpDecorate %output_buffer Block
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 1
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint16 = OpTypeInt 16 0
+ %uint = OpTypeInt 32 0
+%output_buffer = OpTypeStruct %uint16
+%_ptr_StorageBuffer_output_buffer = OpTypePointer StorageBuffer %output_buffer
+ %_ = OpVariable %_ptr_StorageBuffer_output_buffer StorageBuffer
+ %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer_uint16 = OpTypePointer StorageBuffer %uint16
+%spec_const = OpSpecConstant %uint 983041
+%op_spec_const = OpSpecConstantOp %uint16 UConvert %spec_const
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %34 = OpAccessChain %_ptr_StorageBuffer_uint16 %_ %uint_0
+ OpStore %34 %op_spec_const
+ OpReturn
+ OpFunctionEnd
+[test]
+ssbo 0:1 4
+ssbo 0:1 subdata uint8_t 0 0 0
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint8_t 0:1 0 == 1 0
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uconvert/spec_const_opt_zero_extend_n4096.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uconvert/spec_const_opt_zero_extend_n4096.amber
new file mode 100644
index 0000000..7b228e1
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uconvert/spec_const_opt_zero_extend_n4096.amber
@@ -0,0 +1,49 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; SpecConstantOp zero extend signed 16-bit 0xF000 value (-4,096) to 32-bit.
+; A value that is produced as a signed value is passed to UConvert, but it
+; must still be interpreted as an unsigned value.
+ OpCapability Shader
+ OpCapability Int16
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main" %_
+ OpExecutionMode %main LocalSize 1 1 1
+ OpSource GLSL 430
+ OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"
+ OpSourceExtension "GL_GOOGLE_include_directive"
+ OpName %main "main"
+ OpName %output_buffer "output_buffer"
+ OpMemberName %output_buffer 0 "out_SSBO"
+ OpName %_ ""
+ OpMemberDecorate %output_buffer 0 Offset 0
+ OpDecorate %output_buffer Block
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 1
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %int16 = OpTypeInt 16 1
+ %uint = OpTypeInt 32 0
+%output_buffer = OpTypeStruct %uint
+%_ptr_StorageBuffer_output_buffer = OpTypePointer StorageBuffer %output_buffer
+ %_ = OpVariable %_ptr_StorageBuffer_output_buffer StorageBuffer
+ %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %uint
+%spec_const = OpSpecConstant %int16 -4096
+%op_spec_const = OpSpecConstantOp %uint UConvert %spec_const
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %34 = OpAccessChain %_ptr_StorageBuffer_int %_ %uint_0
+ OpStore %34 %op_spec_const
+ OpReturn
+ OpFunctionEnd
+[test]
+ssbo 0:1 8
+ssbo 0:1 subdata uint 0 0 0
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:1 0 == 61440 0
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uniformid/partially_active_uniform_id.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uniformid/partially_active_uniform_id.amber
new file mode 100644
index 0000000..e027642
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uniformid/partially_active_uniform_id.amber
@@ -0,0 +1,73 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_storage_buffer_storage_class
+
+[compute shader spirv]
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %gid_var %in_var %out_var
+OpExecutionMode %main LocalSize 8 1 1
+
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+
+OpDecorate %int_rta ArrayStride 4
+OpDecorate %struct Block
+OpMemberDecorate %struct 0 Offset 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+
+OpDecorateId %then_ld UniformId %workgroup
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_2 = OpConstant %int 2
+%workgroup = OpConstant %int 2
+%int3 = OpTypeVector %int 3
+
+%int_rta = OpTypeRuntimeArray %int
+%struct = OpTypeStruct %int_rta
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%in_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%out_var = OpVariable %ptr_ssbo_struct StorageBuffer
+
+%ptr_input_int3 = OpTypePointer Input %int3
+%gid_var = OpVariable %ptr_input_int3 Input
+
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%in_gep = OpAccessChain %ptr_ssbo_int %in_var %int_0 %gid_x
+%mod = OpUMod %int %gid_x %int_2
+%eq = OpIEqual %bool %mod %int_0
+OpSelectionMerge %merge None
+OpBranchConditional %eq %then %else
+
+%then = OpLabel
+%then_ld = OpLoad %int %in_gep
+OpBranch %merge
+
+%else = OpLabel
+%else_ld = OpLoad %int %in_gep
+OpBranch %merge
+
+%merge = OpLabel
+%phi = OpPhi %int %then_ld %then %else_ld %else
+%out_gep = OpAccessChain %ptr_ssbo_int %out_var %int_0 %gid_x
+OpStore %out_gep %phi
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9
+ssbo 0:1 64
+compute entrypoint main
+compute 2 1 1
+
+probe ssbo uint 0:1 0 == 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uniformid/subgroup_cfg_uniform_id.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uniformid/subgroup_cfg_uniform_id.amber
new file mode 100644
index 0000000..1deb559
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uniformid/subgroup_cfg_uniform_id.amber
@@ -0,0 +1,76 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_storage_buffer_storage_class
+
+[compute shader spirv]
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %gid_var %in_var %out_var
+OpExecutionMode %main LocalSize 8 1 1
+
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+
+OpDecorate %int_rta ArrayStride 4
+OpDecorate %struct Block
+OpMemberDecorate %struct 0 Offset 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+
+OpDecorateId %cmp UniformId %subgroup
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_10 = OpConstant %int 10
+%int_100 = OpConstant %int 100
+%int_50 = OpConstant %int 50
+%subgroup = OpConstant %int 3
+%int3 = OpTypeVector %int 3
+
+%int_rta = OpTypeRuntimeArray %int
+%struct = OpTypeStruct %int_rta
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%in_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%out_var = OpVariable %ptr_ssbo_struct StorageBuffer
+
+%ptr_input_int3 = OpTypePointer Input %int3
+%gid_var = OpVariable %ptr_input_int3 Input
+
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%in_gep = OpAccessChain %ptr_ssbo_int %in_var %int_0 %gid_x
+%ld = OpLoad %int %in_gep
+%cmp = OpULessThan %bool %ld %int_10
+OpSelectionMerge %merge None
+OpBranchConditional %cmp %then %else
+
+%then = OpLabel
+%then_gep = OpAccessChain %ptr_ssbo_int %out_var %int_0 %gid_x
+OpStore %then_gep %int_100
+OpBranch %merge
+
+%else = OpLabel
+%else_gep = OpAccessChain %ptr_ssbo_int %out_var %int_0 %gid_x
+OpStore %else_gep %int_50
+OpBranch %merge
+
+%merge = OpLabel
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17
+ssbo 0:1 64
+
+compute entrypoint main
+compute 2 1 1
+
+probe ssbo uint 0:1 0 == 100 100 100 100 100 100 100 100 50 50 50 50 50 50 50 50
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uniformid/subgroup_uniform.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uniformid/subgroup_uniform.amber
new file mode 100644
index 0000000..50ac895
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uniformid/subgroup_uniform.amber
@@ -0,0 +1,67 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_storage_buffer_storage_class
+
+[compute shader spirv]
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %gid_var %in_var %out_var
+OpExecutionMode %main LocalSize 8 1 1
+
+OpDecorate %lid_var BuiltIn LocalInvocationId
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+
+OpDecorate %int_rta ArrayStride 4
+OpDecorate %struct Block
+OpMemberDecorate %struct 0 Offset 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+
+OpDecorateId %in_ld UniformId %subgroup
+
+%void = OpTypeVoid
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%subgroup = OpConstant %int 3
+%int3 = OpTypeVector %int 3
+
+%int_rta = OpTypeRuntimeArray %int
+%struct = OpTypeStruct %int_rta
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
+%in_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%out_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+
+%ptr_input_int3 = OpTypePointer Input %int3
+%lid_var = OpVariable %ptr_input_int3 Input
+%gid_var = OpVariable %ptr_input_int3 Input
+
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%in_gep = OpAccessChain %ptr_ssbo_int %in_var %int_0 %gid_x
+%in_ld = OpLoad %int %in_gep
+%out_gep = OpAccessChain %ptr_ssbo_int %out_var %int_0 %gid_x
+OpStore %out_gep %in_ld
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 1 1 1 1 1 1 1 1
+ssbo 0:0 subdata uint 32 2 2 2 2 2 2 2 2
+ssbo 0:0 subdata uint 64 3 3 3 3 3 3 3 3
+ssbo 0:0 subdata uint 96 4 4 4 4 4 4 4 4
+ssbo 0:1 128
+
+compute entrypoint main
+compute 4 1 1
+
+probe ssbo uint 0:1 0 == 1 1 1 1 1 1 1 1
+probe ssbo uint 0:1 32 == 2 2 2 2 2 2 2 2
+probe ssbo uint 0:1 64 == 3 3 3 3 3 3 3 3
+probe ssbo uint 0:1 96 == 4 4 4 4 4 4 4 4
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uniformid/workgroup_cfg_uniform_id.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uniformid/workgroup_cfg_uniform_id.amber
new file mode 100644
index 0000000..b585ccb
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uniformid/workgroup_cfg_uniform_id.amber
@@ -0,0 +1,75 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_storage_buffer_storage_class
+
+[compute shader spirv]
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %gid_var %in_var %out_var
+OpExecutionMode %main LocalSize 8 1 1
+
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+
+OpDecorate %int_rta ArrayStride 4
+OpDecorate %struct Block
+OpMemberDecorate %struct 0 Offset 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+
+OpDecorateId %cmp UniformId %workgroup
+
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_10 = OpConstant %int 10
+%int_100 = OpConstant %int 100
+%int_50 = OpConstant %int 50
+%workgroup = OpConstant %int 2
+%int3 = OpTypeVector %int 3
+
+%int_rta = OpTypeRuntimeArray %int
+%struct = OpTypeStruct %int_rta
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%in_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%out_var = OpVariable %ptr_ssbo_struct StorageBuffer
+
+%ptr_input_int3 = OpTypePointer Input %int3
+%gid_var = OpVariable %ptr_input_int3 Input
+
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%in_gep = OpAccessChain %ptr_ssbo_int %in_var %int_0 %gid_x
+%ld = OpLoad %int %in_gep
+%cmp = OpULessThan %bool %ld %int_10
+OpSelectionMerge %merge None
+OpBranchConditional %cmp %then %else
+
+%then = OpLabel
+%then_gep = OpAccessChain %ptr_ssbo_int %out_var %int_0 %gid_x
+OpStore %then_gep %int_100
+OpBranch %merge
+
+%else = OpLabel
+%else_gep = OpAccessChain %ptr_ssbo_int %out_var %int_0 %gid_x
+OpStore %else_gep %int_50
+OpBranch %merge
+
+%merge = OpLabel
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17
+ssbo 0:1 64
+
+compute entrypoint main
+compute 2 1 1
+
+probe ssbo uint 0:1 0 == 100 100 100 100 100 100 100 100 50 50 50 50 50 50 50 50
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uniformid/workgroup_uniform.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uniformid/workgroup_uniform.amber
new file mode 100644
index 0000000..fe1f04d
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/uniformid/workgroup_uniform.amber
@@ -0,0 +1,66 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_storage_buffer_storage_class
+
+[compute shader spirv]
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %gid_var %in_var %out_var
+OpExecutionMode %main LocalSize 8 1 1
+
+OpDecorate %lid_var BuiltIn LocalInvocationId
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+
+OpDecorate %int_rta ArrayStride 4
+OpDecorate %struct Block
+OpMemberDecorate %struct 0 Offset 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+
+OpDecorateId %in_ld UniformId %workgroup
+
+%void = OpTypeVoid
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%workgroup = OpConstant %int 2
+%int3 = OpTypeVector %int 3
+
+%int_rta = OpTypeRuntimeArray %int
+%struct = OpTypeStruct %int_rta
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
+%in_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%out_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+
+%ptr_input_int3 = OpTypePointer Input %int3
+%lid_var = OpVariable %ptr_input_int3 Input
+%gid_var = OpVariable %ptr_input_int3 Input
+
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%in_gep = OpAccessChain %ptr_ssbo_int %in_var %int_0 %gid_x
+%in_ld = OpLoad %int %in_gep
+%out_gep = OpAccessChain %ptr_ssbo_int %out_var %int_0 %gid_x
+OpStore %out_gep %in_ld
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 1 1 1 1 1 1 1 1
+ssbo 0:0 subdata uint 32 2 2 2 2 2 2 2 2
+ssbo 0:0 subdata uint 64 3 3 3 3 3 3 3 3
+ssbo 0:0 subdata uint 96 4 4 4 4 4 4 4 4
+ssbo 0:1 128
+
+compute entrypoint main
+compute 4 1 1
+
+probe ssbo uint 0:1 0 == 1 1 1 1 1 1 1 1
+probe ssbo uint 0:1 32 == 2 2 2 2 2 2 2 2
+probe ssbo uint 0:1 64 == 3 3 3 3 3 3 3 3
+probe ssbo uint 0:1 96 == 4 4 4 4 4 4 4 4
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/wrap/no_signed_wrap.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/wrap/no_signed_wrap.amber
new file mode 100644
index 0000000..6d29dfe
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/wrap/no_signed_wrap.amber
@@ -0,0 +1,47 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; Applying the no signed wrap decoration
+
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %struct1 Block
+OpMemberDecorate %struct1 0 Offset 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+OpDecorate %out_int NoSignedWrap
+%void = OpTypeVoid
+%int = OpTypeInt 32 1
+%int_10 = OpConstant %int 10
+
+%struct1 = OpTypeStruct %int
+%ptr_struct1 = OpTypePointer StorageBuffer %struct1
+
+%in_var = OpVariable %ptr_struct1 StorageBuffer
+%out_var = OpVariable %ptr_struct1 StorageBuffer
+
+%func_ty = OpTypeFunction %void
+%main = OpFunction %void None %func_ty
+%1 = OpLabel
+%in_struct = OpLoad %struct1 %in_var
+%in_int = OpCompositeExtract %int %in_struct 0
+%out_int = OpIAdd %int %in_int %int_10
+%out_struct = OpCompositeConstruct %struct1 %out_int
+OpStore %out_var %out_struct
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 4
+ssbo 0:0 subdata int 0 0
+ssbo 0:1 4
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo int 0:1 0 == 10
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/wrap/no_unsigned_wrap.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/wrap/no_unsigned_wrap.amber
new file mode 100644
index 0000000..7d34711
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/wrap/no_unsigned_wrap.amber
@@ -0,0 +1,47 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+; Applying the no signed wrap decoration
+
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %struct1 Block
+OpMemberDecorate %struct1 0 Offset 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+OpDecorate %out_int NoUnsignedWrap
+%void = OpTypeVoid
+%int = OpTypeInt 32 0
+%int_10 = OpConstant %int 10
+
+%struct1 = OpTypeStruct %int
+%ptr_struct1 = OpTypePointer StorageBuffer %struct1
+
+%in_var = OpVariable %ptr_struct1 StorageBuffer
+%out_var = OpVariable %ptr_struct1 StorageBuffer
+
+%func_ty = OpTypeFunction %void
+%main = OpFunction %void None %func_ty
+%1 = OpLabel
+%in_struct = OpLoad %struct1 %in_var
+%in_int = OpCompositeExtract %int %in_struct 0
+%out_int = OpIAdd %int %in_int %int_10
+%out_struct = OpCompositeConstruct %struct1 %out_int
+OpStore %out_var %out_struct
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 4
+ssbo 0:0 subdata int 0 0
+ssbo 0:1 4
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo int 0:1 0 == 10
diff --git a/external/vulkancts/framework/vulkan/CMakeLists.txt b/external/vulkancts/framework/vulkan/CMakeLists.txt
index d713f91..a8273e7 100644
--- a/external/vulkancts/framework/vulkan/CMakeLists.txt
+++ b/external/vulkancts/framework/vulkan/CMakeLists.txt
@@ -71,6 +71,9 @@
vkDeviceFeatures.hpp
vkDeviceFeatures.cpp
vkDeviceFeatures.inl
+ vkDeviceProperties.hpp
+ vkDeviceProperties.cpp
+ vkDeviceProperties.inl
)
set(VKUTIL_SRCS
@@ -95,36 +98,30 @@
vkutilnoshader
)
-if (DEQP_HAVE_GLSLANG)
- include_directories(${GLSLANG_INCLUDE_PATH})
- add_definitions(-DDEQP_HAVE_GLSLANG=1)
+include_directories(${GLSLANG_INCLUDE_PATH})
- # \note Code interfacing with glslang needs to include third-party headers
- # that cause all sorts of warnings to appear.
- if (DE_COMPILER_IS_GCC OR DE_COMPILER_IS_CLANG)
- set_source_files_properties(
- FILES vkShaderToSpirV.cpp
- PROPERTIES COMPILE_FLAGS "${DE_3RD_PARTY_CXX_FLAGS}")
- endif ()
-
- set(VKUTIL_LIBS ${VKUTIL_LIBS} ${GLSLANG_LIBRARIES})
+# \note Code interfacing with glslang needs to include third-party headers
+# that cause all sorts of warnings to appear.
+if (DE_COMPILER_IS_GCC OR DE_COMPILER_IS_CLANG)
+ set_source_files_properties(
+ FILES vkShaderToSpirV.cpp
+ PROPERTIES COMPILE_FLAGS "${DE_3RD_PARTY_CXX_FLAGS}")
endif ()
-if(DEQP_HAVE_SPIRV_TOOLS)
- include_directories(${spirv-tools_SOURCE_DIR}/include)
- include_directories(${spirv-tools_SOURCE_DIR}/external/include)
+set(VKUTIL_LIBS ${VKUTIL_LIBS} ${GLSLANG_LIBRARIES})
- # \note Code interfacing with spirv-opt needs to include third-party headers
- # that cause all sorts of warnings to appear.
- if (DE_COMPILER_IS_GCC OR DE_COMPILER_IS_CLANG)
- set_source_files_properties(
- FILES vkPrograms.cpp
- PROPERTIES COMPILE_FLAGS "${DE_3RD_PARTY_CXX_FLAGS}")
- endif ()
+include_directories(${spirv-tools_SOURCE_DIR}/include)
+include_directories(${spirv-tools_SOURCE_DIR}/external/include)
- add_definitions(-DDEQP_HAVE_SPIRV_TOOLS=1)
- set(VKUTIL_LIBS ${VKUTIL_LIBS} SPIRV-Tools SPIRV-Tools-opt)
-endif()
+# \note Code interfacing with spirv-opt needs to include third-party headers
+# that cause all sorts of warnings to appear.
+if (DE_COMPILER_IS_GCC OR DE_COMPILER_IS_CLANG)
+ set_source_files_properties(
+ FILES vkPrograms.cpp
+ PROPERTIES COMPILE_FLAGS "${DE_3RD_PARTY_CXX_FLAGS}")
+endif ()
+
+set(VKUTIL_LIBS ${VKUTIL_LIBS} SPIRV-Tools SPIRV-Tools-opt)
PCH(VKUTILNOSHADER_SRCS ../../modules/vulkan/pch.cpp)
PCH(VKUTIL_SRCS ../../modules/vulkan/pch.cpp)
diff --git a/external/vulkancts/framework/vulkan/vkApiExtensionDependencyInfo.inl b/external/vulkancts/framework/vulkan/vkApiExtensionDependencyInfo.inl
index 195556d..3f74f12 100644
--- a/external/vulkancts/framework/vulkan/vkApiExtensionDependencyInfo.inl
+++ b/external/vulkancts/framework/vulkan/vkApiExtensionDependencyInfo.inl
@@ -1,139 +1,205 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos Vulkan API description (vk.xml) revision 9f2171b41192282a9957c43a37d5d8c6a982abed.
+ * Generated from Khronos Vulkan API description (vk.xml) revision 59750fe4c72a9295a94e22474060d3a1635e92c8.
*/
-static const std::pair<const char*, const char*> instanceExtensionDependencies_1_0[] =
+static const std::tuple<deUint32, deUint32, const char*, const char*> instanceExtensionDependencies[] =
{
- std::make_pair("VK_EXT_acquire_xlib_display", "VK_EXT_direct_mode_display"),
- std::make_pair("VK_EXT_direct_mode_display", "VK_KHR_display"),
- std::make_pair("VK_EXT_display_surface_counter", "VK_KHR_display"),
- std::make_pair("VK_EXT_swapchain_colorspace", "VK_KHR_surface"),
- std::make_pair("VK_KHR_android_surface", "VK_KHR_surface"),
- std::make_pair("VK_KHR_display", "VK_KHR_surface"),
- std::make_pair("VK_KHR_external_fence_capabilities", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_KHR_external_memory_capabilities", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_KHR_external_semaphore_capabilities", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_KHR_get_display_properties2", "VK_KHR_display"),
- std::make_pair("VK_KHR_get_surface_capabilities2", "VK_KHR_surface"),
- std::make_pair("VK_KHR_mir_surface", "VK_KHR_surface"),
- std::make_pair("VK_KHR_wayland_surface", "VK_KHR_surface"),
- std::make_pair("VK_KHR_win32_surface", "VK_KHR_surface"),
- std::make_pair("VK_KHR_xcb_surface", "VK_KHR_surface"),
- std::make_pair("VK_KHR_xlib_surface", "VK_KHR_surface"),
- std::make_pair("VK_MVK_ios_surface", "VK_KHR_surface"),
- std::make_pair("VK_MVK_macos_surface", "VK_KHR_surface"),
- std::make_pair("VK_NN_vi_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 0, "VK_EXT_acquire_xlib_display", "VK_EXT_direct_mode_display"),
+ std::make_tuple(1, 1, "VK_EXT_acquire_xlib_display", "VK_EXT_direct_mode_display"),
+ std::make_tuple(1, 0, "VK_EXT_direct_mode_display", "VK_KHR_display"),
+ std::make_tuple(1, 1, "VK_EXT_direct_mode_display", "VK_KHR_display"),
+ std::make_tuple(1, 0, "VK_EXT_display_surface_counter", "VK_KHR_display"),
+ std::make_tuple(1, 1, "VK_EXT_display_surface_counter", "VK_KHR_display"),
+ std::make_tuple(1, 0, "VK_EXT_headless_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 1, "VK_EXT_headless_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 0, "VK_EXT_metal_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 1, "VK_EXT_metal_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 0, "VK_EXT_swapchain_colorspace", "VK_KHR_surface"),
+ std::make_tuple(1, 1, "VK_EXT_swapchain_colorspace", "VK_KHR_surface"),
+ std::make_tuple(1, 0, "VK_FUCHSIA_imagepipe_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 1, "VK_FUCHSIA_imagepipe_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 0, "VK_GGP_stream_descriptor_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 1, "VK_GGP_stream_descriptor_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 0, "VK_KHR_android_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 1, "VK_KHR_android_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 0, "VK_KHR_display", "VK_KHR_surface"),
+ std::make_tuple(1, 1, "VK_KHR_display", "VK_KHR_surface"),
+ std::make_tuple(1, 0, "VK_KHR_external_fence_capabilities", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_KHR_external_memory_capabilities", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_KHR_external_semaphore_capabilities", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_KHR_get_display_properties2", "VK_KHR_display"),
+ std::make_tuple(1, 1, "VK_KHR_get_display_properties2", "VK_KHR_display"),
+ std::make_tuple(1, 0, "VK_KHR_get_surface_capabilities2", "VK_KHR_surface"),
+ std::make_tuple(1, 1, "VK_KHR_get_surface_capabilities2", "VK_KHR_surface"),
+ std::make_tuple(1, 1, "VK_KHR_surface_protected_capabilities", "VK_KHR_get_surface_capabilities2"),
+ std::make_tuple(1, 0, "VK_KHR_wayland_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 1, "VK_KHR_wayland_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 0, "VK_KHR_win32_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 1, "VK_KHR_win32_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 0, "VK_KHR_xcb_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 1, "VK_KHR_xcb_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 0, "VK_KHR_xlib_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 1, "VK_KHR_xlib_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 0, "VK_MVK_ios_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 1, "VK_MVK_ios_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 0, "VK_MVK_macos_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 1, "VK_MVK_macos_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 0, "VK_NN_vi_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 1, "VK_NN_vi_surface", "VK_KHR_surface"),
};
-static const std::pair<const char*, const char*> instanceExtensionDependencies_1_1[] =
+static const std::tuple<deUint32, deUint32, const char*, const char*> deviceExtensionDependencies[] =
{
- std::make_pair("VK_EXT_acquire_xlib_display", "VK_EXT_direct_mode_display"),
- std::make_pair("VK_EXT_direct_mode_display", "VK_KHR_display"),
- std::make_pair("VK_EXT_display_surface_counter", "VK_KHR_display"),
- std::make_pair("VK_EXT_swapchain_colorspace", "VK_KHR_surface"),
- std::make_pair("VK_KHR_android_surface", "VK_KHR_surface"),
- std::make_pair("VK_KHR_display", "VK_KHR_surface"),
- std::make_pair("VK_KHR_get_display_properties2", "VK_KHR_display"),
- std::make_pair("VK_KHR_get_surface_capabilities2", "VK_KHR_surface"),
- std::make_pair("VK_KHR_mir_surface", "VK_KHR_surface"),
- std::make_pair("VK_KHR_wayland_surface", "VK_KHR_surface"),
- std::make_pair("VK_KHR_win32_surface", "VK_KHR_surface"),
- std::make_pair("VK_KHR_xcb_surface", "VK_KHR_surface"),
- std::make_pair("VK_KHR_xlib_surface", "VK_KHR_surface"),
- std::make_pair("VK_MVK_ios_surface", "VK_KHR_surface"),
- std::make_pair("VK_MVK_macos_surface", "VK_KHR_surface"),
- std::make_pair("VK_NN_vi_surface", "VK_KHR_surface"),
+ std::make_tuple(1, 0, "VK_AMD_display_native_hdr", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_AMD_display_native_hdr", "VK_KHR_get_surface_capabilities2"),
+ std::make_tuple(1, 0, "VK_AMD_display_native_hdr", "VK_KHR_swapchain"),
+ std::make_tuple(1, 1, "VK_AMD_display_native_hdr", "VK_KHR_get_surface_capabilities2"),
+ std::make_tuple(1, 1, "VK_AMD_display_native_hdr", "VK_KHR_swapchain"),
+ std::make_tuple(1, 0, "VK_AMD_shader_core_properties", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_AMD_shader_core_properties2", "VK_AMD_shader_core_properties"),
+ std::make_tuple(1, 1, "VK_AMD_shader_core_properties2", "VK_AMD_shader_core_properties"),
+ std::make_tuple(1, 0, "VK_AMD_texture_gather_bias_lod", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_ANDROID_external_memory_android_hardware_buffer", "VK_KHR_sampler_ycbcr_conversion"),
+ std::make_tuple(1, 0, "VK_ANDROID_external_memory_android_hardware_buffer", "VK_KHR_external_memory"),
+ std::make_tuple(1, 0, "VK_ANDROID_external_memory_android_hardware_buffer", "VK_EXT_queue_family_foreign"),
+ std::make_tuple(1, 1, "VK_ANDROID_external_memory_android_hardware_buffer", "VK_EXT_queue_family_foreign"),
+ std::make_tuple(1, 0, "VK_EXT_astc_decode_mode", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_EXT_buffer_device_address", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_EXT_conservative_rasterization", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_EXT_debug_marker", "VK_EXT_debug_report"),
+ std::make_tuple(1, 1, "VK_EXT_debug_marker", "VK_EXT_debug_report"),
+ std::make_tuple(1, 0, "VK_EXT_descriptor_indexing", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_EXT_descriptor_indexing", "VK_KHR_maintenance3"),
+ std::make_tuple(1, 0, "VK_EXT_discard_rectangles", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_EXT_display_control", "VK_EXT_display_surface_counter"),
+ std::make_tuple(1, 0, "VK_EXT_display_control", "VK_KHR_swapchain"),
+ std::make_tuple(1, 1, "VK_EXT_display_control", "VK_EXT_display_surface_counter"),
+ std::make_tuple(1, 1, "VK_EXT_display_control", "VK_KHR_swapchain"),
+ std::make_tuple(1, 0, "VK_EXT_external_memory_dma_buf", "VK_KHR_external_memory_fd"),
+ std::make_tuple(1, 1, "VK_EXT_external_memory_dma_buf", "VK_KHR_external_memory_fd"),
+ std::make_tuple(1, 0, "VK_EXT_external_memory_host", "VK_KHR_external_memory"),
+ std::make_tuple(1, 0, "VK_EXT_filter_cubic", "VK_IMG_filter_cubic"),
+ std::make_tuple(1, 1, "VK_EXT_filter_cubic", "VK_IMG_filter_cubic"),
+ std::make_tuple(1, 0, "VK_EXT_fragment_density_map", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_EXT_fragment_shader_interlock", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_EXT_full_screen_exclusive", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_EXT_full_screen_exclusive", "VK_KHR_surface"),
+ std::make_tuple(1, 0, "VK_EXT_full_screen_exclusive", "VK_KHR_get_surface_capabilities2"),
+ std::make_tuple(1, 0, "VK_EXT_full_screen_exclusive", "VK_KHR_swapchain"),
+ std::make_tuple(1, 1, "VK_EXT_full_screen_exclusive", "VK_KHR_surface"),
+ std::make_tuple(1, 1, "VK_EXT_full_screen_exclusive", "VK_KHR_get_surface_capabilities2"),
+ std::make_tuple(1, 1, "VK_EXT_full_screen_exclusive", "VK_KHR_swapchain"),
+ std::make_tuple(1, 0, "VK_EXT_hdr_metadata", "VK_KHR_swapchain"),
+ std::make_tuple(1, 1, "VK_EXT_hdr_metadata", "VK_KHR_swapchain"),
+ std::make_tuple(1, 0, "VK_EXT_host_query_reset", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_EXT_image_drm_format_modifier", "VK_KHR_bind_memory2"),
+ std::make_tuple(1, 0, "VK_EXT_image_drm_format_modifier", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_EXT_image_drm_format_modifier", "VK_KHR_image_format_list"),
+ std::make_tuple(1, 0, "VK_EXT_image_drm_format_modifier", "VK_KHR_sampler_ycbcr_conversion"),
+ std::make_tuple(1, 1, "VK_EXT_image_drm_format_modifier", "VK_KHR_image_format_list"),
+ std::make_tuple(1, 0, "VK_EXT_inline_uniform_block", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_EXT_inline_uniform_block", "VK_KHR_maintenance1"),
+ std::make_tuple(1, 0, "VK_EXT_line_rasterization", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_EXT_memory_budget", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_EXT_memory_priority", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_EXT_pci_bus_info", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_EXT_queue_family_foreign", "VK_KHR_external_memory"),
+ std::make_tuple(1, 0, "VK_EXT_sample_locations", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_EXT_sampler_filter_minmax", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_EXT_scalar_block_layout", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_EXT_shader_demote_to_helper_invocation", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_EXT_texel_buffer_alignment", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_EXT_texture_compression_astc_hdr", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_EXT_transform_feedback", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_EXT_vertex_attribute_divisor", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_EXT_ycbcr_image_arrays", "VK_KHR_sampler_ycbcr_conversion"),
+ std::make_tuple(1, 0, "VK_GGP_frame_token", "VK_KHR_swapchain"),
+ std::make_tuple(1, 0, "VK_GGP_frame_token", "VK_GGP_stream_descriptor_surface"),
+ std::make_tuple(1, 1, "VK_GGP_frame_token", "VK_KHR_swapchain"),
+ std::make_tuple(1, 1, "VK_GGP_frame_token", "VK_GGP_stream_descriptor_surface"),
+ std::make_tuple(1, 0, "VK_GOOGLE_display_timing", "VK_KHR_swapchain"),
+ std::make_tuple(1, 1, "VK_GOOGLE_display_timing", "VK_KHR_swapchain"),
+ std::make_tuple(1, 0, "VK_INTEL_shader_integer_functions2", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_KHR_16bit_storage", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_KHR_16bit_storage", "VK_KHR_storage_buffer_storage_class"),
+ std::make_tuple(1, 0, "VK_KHR_8bit_storage", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_KHR_8bit_storage", "VK_KHR_storage_buffer_storage_class"),
+ std::make_tuple(1, 0, "VK_KHR_create_renderpass2", "VK_KHR_multiview"),
+ std::make_tuple(1, 0, "VK_KHR_create_renderpass2", "VK_KHR_maintenance2"),
+ std::make_tuple(1, 0, "VK_KHR_dedicated_allocation", "VK_KHR_get_memory_requirements2"),
+ std::make_tuple(1, 0, "VK_KHR_depth_stencil_resolve", "VK_KHR_create_renderpass2"),
+ std::make_tuple(1, 1, "VK_KHR_depth_stencil_resolve", "VK_KHR_create_renderpass2"),
+ std::make_tuple(1, 0, "VK_KHR_device_group", "VK_KHR_device_group_creation"),
+ std::make_tuple(1, 0, "VK_KHR_display_swapchain", "VK_KHR_swapchain"),
+ std::make_tuple(1, 0, "VK_KHR_display_swapchain", "VK_KHR_display"),
+ std::make_tuple(1, 1, "VK_KHR_display_swapchain", "VK_KHR_swapchain"),
+ std::make_tuple(1, 1, "VK_KHR_display_swapchain", "VK_KHR_display"),
+ std::make_tuple(1, 0, "VK_KHR_driver_properties", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_KHR_external_fence", "VK_KHR_external_fence_capabilities"),
+ std::make_tuple(1, 0, "VK_KHR_external_fence_fd", "VK_KHR_external_fence"),
+ std::make_tuple(1, 0, "VK_KHR_external_fence_win32", "VK_KHR_external_fence"),
+ std::make_tuple(1, 0, "VK_KHR_external_memory", "VK_KHR_external_memory_capabilities"),
+ std::make_tuple(1, 0, "VK_KHR_external_memory_fd", "VK_KHR_external_memory"),
+ std::make_tuple(1, 0, "VK_KHR_external_memory_win32", "VK_KHR_external_memory"),
+ std::make_tuple(1, 0, "VK_KHR_external_semaphore", "VK_KHR_external_semaphore_capabilities"),
+ std::make_tuple(1, 0, "VK_KHR_external_semaphore_fd", "VK_KHR_external_semaphore"),
+ std::make_tuple(1, 0, "VK_KHR_external_semaphore_win32", "VK_KHR_external_semaphore"),
+ std::make_tuple(1, 0, "VK_KHR_imageless_framebuffer", "VK_KHR_maintenance2"),
+ std::make_tuple(1, 0, "VK_KHR_imageless_framebuffer", "VK_KHR_image_format_list"),
+ std::make_tuple(1, 1, "VK_KHR_imageless_framebuffer", "VK_KHR_image_format_list"),
+ std::make_tuple(1, 0, "VK_KHR_incremental_present", "VK_KHR_swapchain"),
+ std::make_tuple(1, 1, "VK_KHR_incremental_present", "VK_KHR_swapchain"),
+ std::make_tuple(1, 0, "VK_KHR_maintenance3", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_KHR_multiview", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_KHR_push_descriptor", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_KHR_sampler_ycbcr_conversion", "VK_KHR_maintenance1"),
+ std::make_tuple(1, 0, "VK_KHR_sampler_ycbcr_conversion", "VK_KHR_bind_memory2"),
+ std::make_tuple(1, 0, "VK_KHR_sampler_ycbcr_conversion", "VK_KHR_get_memory_requirements2"),
+ std::make_tuple(1, 0, "VK_KHR_sampler_ycbcr_conversion", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_KHR_shader_atomic_int64", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_KHR_shader_float16_int8", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_KHR_shader_float_controls", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_KHR_shared_presentable_image", "VK_KHR_swapchain"),
+ std::make_tuple(1, 0, "VK_KHR_shared_presentable_image", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_KHR_shared_presentable_image", "VK_KHR_get_surface_capabilities2"),
+ std::make_tuple(1, 1, "VK_KHR_shared_presentable_image", "VK_KHR_swapchain"),
+ std::make_tuple(1, 1, "VK_KHR_shared_presentable_image", "VK_KHR_get_surface_capabilities2"),
+ std::make_tuple(1, 0, "VK_KHR_swapchain", "VK_KHR_surface"),
+ std::make_tuple(1, 1, "VK_KHR_swapchain", "VK_KHR_surface"),
+ std::make_tuple(1, 0, "VK_KHR_swapchain_mutable_format", "VK_KHR_swapchain"),
+ std::make_tuple(1, 0, "VK_KHR_swapchain_mutable_format", "VK_KHR_maintenance2"),
+ std::make_tuple(1, 0, "VK_KHR_swapchain_mutable_format", "VK_KHR_image_format_list"),
+ std::make_tuple(1, 1, "VK_KHR_swapchain_mutable_format", "VK_KHR_swapchain"),
+ std::make_tuple(1, 1, "VK_KHR_swapchain_mutable_format", "VK_KHR_image_format_list"),
+ std::make_tuple(1, 0, "VK_KHR_uniform_buffer_standard_layout", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_KHR_variable_pointers", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_KHR_variable_pointers", "VK_KHR_storage_buffer_storage_class"),
+ std::make_tuple(1, 0, "VK_KHR_win32_keyed_mutex", "VK_KHR_external_memory_win32"),
+ std::make_tuple(1, 1, "VK_KHR_win32_keyed_mutex", "VK_KHR_external_memory_win32"),
+ std::make_tuple(1, 0, "VK_NVX_multiview_per_view_attributes", "VK_KHR_multiview"),
+ std::make_tuple(1, 0, "VK_NV_compute_shader_derivatives", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_NV_cooperative_matrix", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_NV_corner_sampled_image", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_NV_coverage_reduction_mode", "VK_NV_framebuffer_mixed_samples"),
+ std::make_tuple(1, 1, "VK_NV_coverage_reduction_mode", "VK_NV_framebuffer_mixed_samples"),
+ std::make_tuple(1, 0, "VK_NV_dedicated_allocation_image_aliasing", "VK_KHR_dedicated_allocation"),
+ std::make_tuple(1, 0, "VK_NV_device_diagnostic_checkpoints", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_NV_external_memory", "VK_NV_external_memory_capabilities"),
+ std::make_tuple(1, 1, "VK_NV_external_memory", "VK_NV_external_memory_capabilities"),
+ std::make_tuple(1, 0, "VK_NV_external_memory_win32", "VK_NV_external_memory"),
+ std::make_tuple(1, 1, "VK_NV_external_memory_win32", "VK_NV_external_memory"),
+ std::make_tuple(1, 0, "VK_NV_fragment_shader_barycentric", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_NV_mesh_shader", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_NV_ray_tracing", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_NV_ray_tracing", "VK_KHR_get_memory_requirements2"),
+ std::make_tuple(1, 0, "VK_NV_scissor_exclusive", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_NV_shader_image_footprint", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_NV_shading_rate_image", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(1, 0, "VK_NV_win32_keyed_mutex", "VK_NV_external_memory_win32"),
+ std::make_tuple(1, 1, "VK_NV_win32_keyed_mutex", "VK_NV_external_memory_win32"),
};
-static const std::pair<const char*, const char*> deviceExtensionDependencies_1_0[] =
+static const std::tuple<deUint32, deUint32, deUint32> releasedApiVersions[] =
{
- std::make_pair("VK_AMD_shader_core_properties", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_AMD_texture_gather_bias_lod", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_ANDROID_external_memory_android_hardware_buffer", "VK_KHR_sampler_ycbcr_conversion"),
- std::make_pair("VK_ANDROID_external_memory_android_hardware_buffer", "VK_KHR_external_memory"),
- std::make_pair("VK_ANDROID_external_memory_android_hardware_buffer", "VK_EXT_queue_family_foreign"),
- std::make_pair("VK_EXT_astc_decode_mode", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_EXT_conservative_rasterization", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_EXT_debug_marker", "VK_EXT_debug_report"),
- std::make_pair("VK_EXT_descriptor_indexing", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_EXT_descriptor_indexing", "VK_KHR_maintenance3"),
- std::make_pair("VK_EXT_discard_rectangles", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_EXT_display_control", "VK_EXT_display_surface_counter"),
- std::make_pair("VK_EXT_display_control", "VK_KHR_swapchain"),
- std::make_pair("VK_EXT_external_memory_dma_buf", "VK_KHR_external_memory_fd"),
- std::make_pair("VK_EXT_external_memory_host", "VK_KHR_external_memory"),
- std::make_pair("VK_EXT_hdr_metadata", "VK_KHR_swapchain"),
- std::make_pair("VK_EXT_inline_uniform_block", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_EXT_inline_uniform_block", "VK_KHR_maintenance1"),
- std::make_pair("VK_EXT_queue_family_foreign", "VK_KHR_external_memory"),
- std::make_pair("VK_EXT_sampler_filter_minmax", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_EXT_vertex_attribute_divisor", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_GOOGLE_display_timing", "VK_KHR_swapchain"),
- std::make_pair("VK_KHR_16bit_storage", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_KHR_16bit_storage", "VK_KHR_storage_buffer_storage_class"),
- std::make_pair("VK_KHR_8bit_storage", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_KHR_8bit_storage", "VK_KHR_storage_buffer_storage_class"),
- std::make_pair("VK_KHR_create_renderpass2", "VK_KHR_multiview"),
- std::make_pair("VK_KHR_create_renderpass2", "VK_KHR_maintenance2"),
- std::make_pair("VK_KHR_dedicated_allocation", "VK_KHR_get_memory_requirements2"),
- std::make_pair("VK_KHR_device_group", "VK_KHR_device_group_creation"),
- std::make_pair("VK_KHR_display_swapchain", "VK_KHR_swapchain"),
- std::make_pair("VK_KHR_display_swapchain", "VK_KHR_display"),
- std::make_pair("VK_KHR_external_fence", "VK_KHR_external_fence_capabilities"),
- std::make_pair("VK_KHR_external_fence_fd", "VK_KHR_external_fence"),
- std::make_pair("VK_KHR_external_fence_win32", "VK_KHR_external_fence"),
- std::make_pair("VK_KHR_external_memory", "VK_KHR_external_memory_capabilities"),
- std::make_pair("VK_KHR_external_memory_fd", "VK_KHR_external_memory"),
- std::make_pair("VK_KHR_external_memory_win32", "VK_KHR_external_memory"),
- std::make_pair("VK_KHR_external_semaphore", "VK_KHR_external_semaphore_capabilities"),
- std::make_pair("VK_KHR_external_semaphore_fd", "VK_KHR_external_semaphore"),
- std::make_pair("VK_KHR_external_semaphore_win32", "VK_KHR_external_semaphore"),
- std::make_pair("VK_KHR_incremental_present", "VK_KHR_swapchain"),
- std::make_pair("VK_KHR_maintenance3", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_KHR_multiview", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_KHR_push_descriptor", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_KHR_sampler_ycbcr_conversion", "VK_KHR_maintenance1"),
- std::make_pair("VK_KHR_sampler_ycbcr_conversion", "VK_KHR_bind_memory2"),
- std::make_pair("VK_KHR_sampler_ycbcr_conversion", "VK_KHR_get_memory_requirements2"),
- std::make_pair("VK_KHR_sampler_ycbcr_conversion", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_KHR_shared_presentable_image", "VK_KHR_swapchain"),
- std::make_pair("VK_KHR_shared_presentable_image", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_KHR_shared_presentable_image", "VK_KHR_get_surface_capabilities2"),
- std::make_pair("VK_KHR_swapchain", "VK_KHR_surface"),
- std::make_pair("VK_KHR_variable_pointers", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_KHR_variable_pointers", "VK_KHR_storage_buffer_storage_class"),
- std::make_pair("VK_KHR_win32_keyed_mutex", "VK_KHR_external_memory_win32"),
- std::make_pair("VK_NVX_multiview_per_view_attributes", "VK_KHR_multiview"),
- std::make_pair("VK_NVX_raytracing", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_NVX_raytracing", "VK_KHR_get_memory_requirements2"),
- std::make_pair("VK_NV_compute_shader_derivatives", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_NV_corner_sampled_image", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_NV_device_diagnostic_checkpoints", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_NV_external_memory", "VK_NV_external_memory_capabilities"),
- std::make_pair("VK_NV_external_memory_win32", "VK_NV_external_memory"),
- std::make_pair("VK_NV_fragment_shader_barycentric", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_NV_mesh_shader", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_NV_scissor_exclusive", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_NV_shader_image_footprint", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_NV_shading_rate_image", "VK_KHR_get_physical_device_properties2"),
- std::make_pair("VK_NV_win32_keyed_mutex", "VK_NV_external_memory_win32"),
-};
-static const std::pair<const char*, const char*> deviceExtensionDependencies_1_1[] =
-{
- std::make_pair("VK_ANDROID_external_memory_android_hardware_buffer", "VK_EXT_queue_family_foreign"),
- std::make_pair("VK_EXT_debug_marker", "VK_EXT_debug_report"),
- std::make_pair("VK_EXT_display_control", "VK_EXT_display_surface_counter"),
- std::make_pair("VK_EXT_display_control", "VK_KHR_swapchain"),
- std::make_pair("VK_EXT_external_memory_dma_buf", "VK_KHR_external_memory_fd"),
- std::make_pair("VK_EXT_hdr_metadata", "VK_KHR_swapchain"),
- std::make_pair("VK_GOOGLE_display_timing", "VK_KHR_swapchain"),
- std::make_pair("VK_KHR_display_swapchain", "VK_KHR_swapchain"),
- std::make_pair("VK_KHR_display_swapchain", "VK_KHR_display"),
- std::make_pair("VK_KHR_incremental_present", "VK_KHR_swapchain"),
- std::make_pair("VK_KHR_shared_presentable_image", "VK_KHR_swapchain"),
- std::make_pair("VK_KHR_shared_presentable_image", "VK_KHR_get_surface_capabilities2"),
- std::make_pair("VK_KHR_swapchain", "VK_KHR_surface"),
- std::make_pair("VK_KHR_win32_keyed_mutex", "VK_KHR_external_memory_win32"),
- std::make_pair("VK_NV_external_memory", "VK_NV_external_memory_capabilities"),
- std::make_pair("VK_NV_external_memory_win32", "VK_NV_external_memory"),
- std::make_pair("VK_NV_win32_keyed_mutex", "VK_NV_external_memory_win32"),
+ std::make_tuple(4198400, 1, 1),
+ std::make_tuple(4194304, 1, 0),
};
diff --git a/external/vulkancts/framework/vulkan/vkBasicTypes.inl b/external/vulkancts/framework/vulkan/vkBasicTypes.inl
index fc4422e..c721ace 100644
--- a/external/vulkancts/framework/vulkan/vkBasicTypes.inl
+++ b/external/vulkancts/framework/vulkan/vkBasicTypes.inl
@@ -3,10 +3,11 @@
*/
#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_KHR (static_cast<size_t> (256))
-#define VK_MAX_DRIVER_INFO_SIZE_KHR (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))
@@ -22,45 +23,46 @@
#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_API_MAX_FRAMEWORK_VERSION VK_API_VERSION_1_1
+#define VK_API_MAX_FRAMEWORK_VERSION VK_API_VERSION_1_2
-VK_DEFINE_HANDLE (VkInstance, HANDLE_TYPE_INSTANCE);
-VK_DEFINE_HANDLE (VkPhysicalDevice, HANDLE_TYPE_PHYSICAL_DEVICE);
-VK_DEFINE_HANDLE (VkDevice, HANDLE_TYPE_DEVICE);
-VK_DEFINE_HANDLE (VkQueue, HANDLE_TYPE_QUEUE);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkSemaphore, HANDLE_TYPE_SEMAPHORE);
-VK_DEFINE_HANDLE (VkCommandBuffer, HANDLE_TYPE_COMMAND_BUFFER);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkFence, HANDLE_TYPE_FENCE);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkDeviceMemory, HANDLE_TYPE_DEVICE_MEMORY);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkBuffer, HANDLE_TYPE_BUFFER);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkImage, HANDLE_TYPE_IMAGE);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkEvent, HANDLE_TYPE_EVENT);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkQueryPool, HANDLE_TYPE_QUERY_POOL);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkBufferView, HANDLE_TYPE_BUFFER_VIEW);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkImageView, HANDLE_TYPE_IMAGE_VIEW);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkShaderModule, HANDLE_TYPE_SHADER_MODULE);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkPipelineCache, HANDLE_TYPE_PIPELINE_CACHE);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkPipelineLayout, HANDLE_TYPE_PIPELINE_LAYOUT);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkRenderPass, HANDLE_TYPE_RENDER_PASS);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkPipeline, HANDLE_TYPE_PIPELINE);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkDescriptorSetLayout, HANDLE_TYPE_DESCRIPTOR_SET_LAYOUT);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkSampler, HANDLE_TYPE_SAMPLER);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkDescriptorPool, HANDLE_TYPE_DESCRIPTOR_POOL);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkDescriptorSet, HANDLE_TYPE_DESCRIPTOR_SET);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkFramebuffer, HANDLE_TYPE_FRAMEBUFFER);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkCommandPool, HANDLE_TYPE_COMMAND_POOL);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkSamplerYcbcrConversion, HANDLE_TYPE_SAMPLER_YCBCR_CONVERSION);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkDescriptorUpdateTemplate, HANDLE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkSurfaceKHR, HANDLE_TYPE_SURFACE_KHR);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkSwapchainKHR, HANDLE_TYPE_SWAPCHAIN_KHR);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkDisplayKHR, HANDLE_TYPE_DISPLAY_KHR);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkDisplayModeKHR, HANDLE_TYPE_DISPLAY_MODE_KHR);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkDebugReportCallbackEXT, HANDLE_TYPE_DEBUG_REPORT_CALLBACK_EXT);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkObjectTableNVX, HANDLE_TYPE_OBJECT_TABLE_NVX);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkIndirectCommandsLayoutNVX, HANDLE_TYPE_INDIRECT_COMMANDS_LAYOUT_NVX);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkDebugUtilsMessengerEXT, HANDLE_TYPE_DEBUG_UTILS_MESSENGER_EXT);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkValidationCacheEXT, HANDLE_TYPE_VALIDATION_CACHE_EXT);
-VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkAccelerationStructureNV, HANDLE_TYPE_ACCELERATION_STRUCTURE_NV);
+VK_DEFINE_HANDLE (VkInstance, HANDLE_TYPE_INSTANCE);
+VK_DEFINE_HANDLE (VkPhysicalDevice, HANDLE_TYPE_PHYSICAL_DEVICE);
+VK_DEFINE_HANDLE (VkDevice, HANDLE_TYPE_DEVICE);
+VK_DEFINE_HANDLE (VkQueue, HANDLE_TYPE_QUEUE);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkSemaphore, HANDLE_TYPE_SEMAPHORE);
+VK_DEFINE_HANDLE (VkCommandBuffer, HANDLE_TYPE_COMMAND_BUFFER);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkFence, HANDLE_TYPE_FENCE);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkDeviceMemory, HANDLE_TYPE_DEVICE_MEMORY);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkBuffer, HANDLE_TYPE_BUFFER);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkImage, HANDLE_TYPE_IMAGE);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkEvent, HANDLE_TYPE_EVENT);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkQueryPool, HANDLE_TYPE_QUERY_POOL);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkBufferView, HANDLE_TYPE_BUFFER_VIEW);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkImageView, HANDLE_TYPE_IMAGE_VIEW);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkShaderModule, HANDLE_TYPE_SHADER_MODULE);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkPipelineCache, HANDLE_TYPE_PIPELINE_CACHE);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkPipelineLayout, HANDLE_TYPE_PIPELINE_LAYOUT);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkRenderPass, HANDLE_TYPE_RENDER_PASS);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkPipeline, HANDLE_TYPE_PIPELINE);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkDescriptorSetLayout, HANDLE_TYPE_DESCRIPTOR_SET_LAYOUT);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkSampler, HANDLE_TYPE_SAMPLER);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkDescriptorPool, HANDLE_TYPE_DESCRIPTOR_POOL);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkDescriptorSet, HANDLE_TYPE_DESCRIPTOR_SET);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkFramebuffer, HANDLE_TYPE_FRAMEBUFFER);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkCommandPool, HANDLE_TYPE_COMMAND_POOL);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkSamplerYcbcrConversion, HANDLE_TYPE_SAMPLER_YCBCR_CONVERSION);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkDescriptorUpdateTemplate, HANDLE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkSurfaceKHR, HANDLE_TYPE_SURFACE_KHR);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkSwapchainKHR, HANDLE_TYPE_SWAPCHAIN_KHR);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkDisplayKHR, HANDLE_TYPE_DISPLAY_KHR);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkDisplayModeKHR, HANDLE_TYPE_DISPLAY_MODE_KHR);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkDebugReportCallbackEXT, HANDLE_TYPE_DEBUG_REPORT_CALLBACK_EXT);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkObjectTableNVX, HANDLE_TYPE_OBJECT_TABLE_NVX);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkIndirectCommandsLayoutNVX, HANDLE_TYPE_INDIRECT_COMMANDS_LAYOUT_NVX);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkDebugUtilsMessengerEXT, HANDLE_TYPE_DEBUG_UTILS_MESSENGER_EXT);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkValidationCacheEXT, HANDLE_TYPE_VALIDATION_CACHE_EXT);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkAccelerationStructureNV, HANDLE_TYPE_ACCELERATION_STRUCTURE_NV);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkPerformanceConfigurationINTEL, HANDLE_TYPE_PERFORMANCE_CONFIGURATION_INTEL);
enum VkPipelineCacheHeaderVersion
{
@@ -90,6 +92,8 @@
VK_ERROR_FRAGMENTED_POOL = -12,
VK_ERROR_OUT_OF_POOL_MEMORY = -1000069000,
VK_ERROR_INVALID_EXTERNAL_HANDLE = -1000072003,
+ VK_ERROR_FRAGMENTATION = -1000161000,
+ VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS = -1000257000,
VK_ERROR_SURFACE_LOST_KHR = -1000000000,
VK_ERROR_NATIVE_WINDOW_IN_USE_KHR = -1000000001,
VK_SUBOPTIMAL_KHR = 1000001003,
@@ -98,12 +102,13 @@
VK_ERROR_VALIDATION_FAILED_EXT = -1000011001,
VK_ERROR_INVALID_SHADER_NV = -1000012000,
VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT = -1000158000,
- VK_ERROR_FRAGMENTATION_EXT = -1000161000,
VK_ERROR_NOT_PERMITTED_EXT = -1000174001,
- VK_ERROR_INVALID_DEVICE_ADDRESS_EXT = -1000244000,
VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT = -1000255000,
VK_ERROR_OUT_OF_POOL_MEMORY_KHR = VK_ERROR_OUT_OF_POOL_MEMORY,
VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR = VK_ERROR_INVALID_EXTERNAL_HANDLE,
+ VK_ERROR_FRAGMENTATION_EXT = VK_ERROR_FRAGMENTATION,
+ VK_ERROR_INVALID_DEVICE_ADDRESS_EXT = VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS,
+ VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR = VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS,
VK_RESULT_MAX_ENUM = 0x7FFFFFFF,
};
@@ -223,6 +228,56 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES = 1000168000,
VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT = 1000168001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES = 1000063000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES = 49,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES = 50,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES = 51,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES = 52,
+ VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO = 1000147000,
+ VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2 = 1000109000,
+ VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2 = 1000109001,
+ VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2 = 1000109002,
+ VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2 = 1000109003,
+ VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2 = 1000109004,
+ VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO = 1000109005,
+ VK_STRUCTURE_TYPE_SUBPASS_END_INFO = 1000109006,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES = 1000177000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES = 1000196000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES = 1000180000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES = 1000082000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES = 1000197000,
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO = 1000161000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES = 1000161001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES = 1000161002,
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO = 1000161003,
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT = 1000161004,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES = 1000199000,
+ VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE = 1000199001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES = 1000221000,
+ VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO = 1000246000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES = 1000130000,
+ VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO = 1000130001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES = 1000211000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES = 1000108000,
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO = 1000108001,
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO = 1000108002,
+ VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO = 1000108003,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES = 1000253000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES = 1000175000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES = 1000241000,
+ VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT = 1000241001,
+ VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT = 1000241002,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES = 1000261000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES = 1000207000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES = 1000207001,
+ VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO = 1000207002,
+ VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO = 1000207003,
+ VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO = 1000207004,
+ VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO = 1000207005,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES = 1000257000,
+ VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO = 1000244001,
+ VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO = 1000257002,
+ VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO = 1000257003,
+ VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO = 1000257004,
VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR = 1000001000,
VK_STRUCTURE_TYPE_PRESENT_INFO_KHR = 1000001001,
VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR = 1000060007,
@@ -261,6 +316,7 @@
VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV = 1000058000,
VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT = 1000061000,
VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN = 1000062000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT = 1000066000,
VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT = 1000067000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT = 1000067001,
VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073000,
@@ -281,7 +337,6 @@
VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT = 1000081000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT = 1000081001,
VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT = 1000081002,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR = 1000082000,
VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR = 1000084000,
VK_STRUCTURE_TYPE_OBJECT_TABLE_CREATE_INFO_NVX = 1000086000,
VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NVX = 1000086001,
@@ -305,23 +360,19 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT = 1000102000,
VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT = 1000102001,
VK_STRUCTURE_TYPE_HDR_METADATA_EXT = 1000105000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR = 1000108000,
- VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR = 1000108001,
- VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR = 1000108002,
- VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO_KHR = 1000108003,
- VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR = 1000109000,
- VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR = 1000109001,
- VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR = 1000109002,
- VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2_KHR = 1000109003,
- VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR = 1000109004,
- VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO_KHR = 1000109005,
- VK_STRUCTURE_TYPE_SUBPASS_END_INFO_KHR = 1000109006,
VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR = 1000111000,
VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR = 1000114000,
VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR = 1000114001,
VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR = 1000114002,
VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR = 1000115000,
VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR = 1000115001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR = 1000116000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR = 1000116001,
+ VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR = 1000116002,
+ VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR = 1000116003,
+ VK_STRUCTURE_TYPE_ACQUIRE_PROFILING_LOCK_INFO_KHR = 1000116004,
+ VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_KHR = 1000116005,
+ VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_DESCRIPTION_KHR = 1000116006,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR = 1000119000,
VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR = 1000119001,
VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR = 1000119002,
@@ -343,8 +394,6 @@
VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129003,
VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129004,
VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID = 1000129005,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT = 1000130000,
- VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT = 1000130001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT = 1000138000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT = 1000138001,
VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT = 1000138002,
@@ -354,12 +403,13 @@
VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT = 1000143002,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT = 1000143003,
VK_STRUCTURE_TYPE_MULTISAMPLE_PROPERTIES_EXT = 1000143004,
- VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR = 1000147000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT = 1000148000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT = 1000148001,
VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT = 1000148002,
VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV = 1000149000,
VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV = 1000152000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV = 1000154000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV = 1000154001,
VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT = 1000158000,
VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT = 1000158001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT = 1000158002,
@@ -368,11 +418,6 @@
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,
- VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT = 1000161000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT = 1000161001,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT = 1000161002,
- VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT = 1000161003,
- VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT = 1000161004,
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,
@@ -393,11 +438,9 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT = 1000170000,
VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT = 1000170001,
VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT = 1000174000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR = 1000177000,
VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT = 1000178000,
VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT = 1000178001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT = 1000178002,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR = 1000180000,
VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD = 1000183000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR = 1000181000,
VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT = 1000184000,
@@ -408,10 +451,6 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT = 1000190002,
VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP = 1000191000,
VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT = 1000192000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR = 1000196000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR = 1000197000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR = 1000199000,
- VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE_KHR = 1000199001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV = 1000201000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV = 1000202000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV = 1000202001,
@@ -421,14 +460,13 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV = 1000205002,
VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV = 1000206000,
VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV = 1000206001,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR = 1000207000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR = 1000207001,
- VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR = 1000207002,
- VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR = 1000207003,
- VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO_KHR = 1000207004,
- VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO_KHR = 1000207005,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS2_FEATURES_INTEL = 1000209000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR = 1000211000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL = 1000209000,
+ VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL = 1000210000,
+ VK_STRUCTURE_TYPE_INITIALIZE_PERFORMANCE_API_INFO_INTEL = 1000210001,
+ VK_STRUCTURE_TYPE_PERFORMANCE_MARKER_INFO_INTEL = 1000210002,
+ VK_STRUCTURE_TYPE_PERFORMANCE_STREAM_MARKER_INFO_INTEL = 1000210003,
+ VK_STRUCTURE_TYPE_PERFORMANCE_OVERRIDE_INFO_INTEL = 1000210004,
+ VK_STRUCTURE_TYPE_PERFORMANCE_CONFIGURATION_ACQUIRE_INFO_INTEL = 1000210005,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT = 1000212000,
VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD = 1000213000,
VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD = 1000213001,
@@ -437,16 +475,18 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT = 1000218000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT = 1000218001,
VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT = 1000218002,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT = 1000221000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT = 1000225000,
+ VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT = 1000225001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT = 1000225002,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD = 1000227000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD = 1000229000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT = 1000237000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT = 1000238000,
VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT = 1000238001,
VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR = 1000239000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV = 1000240000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT = 1000244000,
- VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT = 1000244001,
VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT = 1000244002,
- VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT = 1000246000,
VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT = 1000247000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV = 1000249000,
VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_NV = 1000249001,
@@ -456,20 +496,23 @@
VK_STRUCTURE_TYPE_FRAMEBUFFER_MIXED_SAMPLES_COMBINATION_NV = 1000250002,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT = 1000251000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT = 1000252000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR = 1000253000,
VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT = 1000255000,
VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT = 1000255002,
VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT = 1000255001,
VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT = 1000256000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT = 1000261000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT = 1000259000,
+ VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT = 1000259001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT = 1000259002,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT = 1000265000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT = 1000276000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR = 1000269000,
VK_STRUCTURE_TYPE_PIPELINE_INFO_KHR = 1000269001,
VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_PROPERTIES_KHR = 1000269002,
VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR = 1000269003,
VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_STATISTIC_KHR = 1000269004,
VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR = 1000269005,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT = 1000276000,
+ 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_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,
@@ -505,9 +548,22 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO,
VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES,
VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES,
VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO,
VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES2_EXT = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES,
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO,
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO,
+ VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO_KHR = VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO,
+ VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2,
+ VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,
+ VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2,
+ VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2_KHR = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2,
+ VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2,
+ VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO_KHR = VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO,
+ VK_STRUCTURE_TYPE_SUBPASS_END_INFO_KHR = VK_STRUCTURE_TYPE_SUBPASS_END_INFO,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO,
VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES,
VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO,
@@ -519,11 +575,14 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES,
VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS,
VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES,
+ VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO,
VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR = VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2,
VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2,
VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2_KHR = VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2,
VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2,
VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2_KHR = VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2,
+ VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO,
VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,
VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO_KHR = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO,
VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO_KHR = VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO,
@@ -532,9 +591,41 @@
VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES_KHR = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES,
VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO,
VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO,
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES,
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO,
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES,
VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT_KHR = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES,
+ VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE_KHR = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES,
+ VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO,
+ VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO,
+ VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO_KHR = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO,
+ VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO_KHR = VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES,
+ VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT_KHR = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT,
+ VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT_KHR = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_ADDRESS_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT,
+ VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,
+ VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES,
+ VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_KHR = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,
+ VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO,
+ VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO_KHR = VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO,
+ VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES,
VK_STRUCTURE_TYPE_MAX_ENUM = 0x7FFFFFFF,
};
@@ -785,6 +876,20 @@
VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG = 1000054005,
VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG = 1000054006,
VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG = 1000054007,
+ VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT = 1000066000,
+ VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT = 1000066001,
+ VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT = 1000066002,
+ VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT = 1000066003,
+ VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT = 1000066004,
+ VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT = 1000066005,
+ VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT = 1000066006,
+ VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT = 1000066007,
+ VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT = 1000066008,
+ VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT = 1000066009,
+ VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT = 1000066010,
+ 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_G8B8G8R8_422_UNORM_KHR = VK_FORMAT_G8B8G8R8_422_UNORM,
VK_FORMAT_B8G8R8G8_422_UNORM_KHR = VK_FORMAT_B8G8R8G8_422_UNORM,
VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR = VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM,
@@ -856,7 +961,9 @@
VK_QUERY_TYPE_PIPELINE_STATISTICS = 1,
VK_QUERY_TYPE_TIMESTAMP = 2,
VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT = 1000028004,
+ VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR = 1000116000,
VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV = 1000165000,
+ VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL = 1000210000,
VK_QUERY_TYPE_MAX_ENUM = 0x7FFFFFFF,
};
@@ -881,12 +988,20 @@
VK_IMAGE_LAYOUT_PREINITIALIZED = 8,
VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL = 1000117000,
VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL = 1000117001,
+ VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL = 1000241000,
+ VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL = 1000241001,
+ 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_SHARED_PRESENT_KHR = 1000111000,
VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV = 1000164003,
VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT = 1000218000,
VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL,
VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL,
+ VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
+ VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
+ VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL,
+ VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL,
VK_IMAGE_LAYOUT_MAX_ENUM = 0x7FFFFFFF,
};
@@ -1106,6 +1221,7 @@
VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV = 1000164004,
VK_DYNAMIC_STATE_VIEWPORT_COARSE_SAMPLE_ORDER_NV = 1000164006,
VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV = 1000205001,
+ VK_DYNAMIC_STATE_LINE_STIPPLE_EXT = 1000259000,
VK_DYNAMIC_STATE_MAX_ENUM = 0x7FFFFFFF,
};
@@ -1128,13 +1244,14 @@
enum VkSamplerAddressMode
{
- VK_SAMPLER_ADDRESS_MODE_REPEAT = 0,
- VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT = 1,
- VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE = 2,
- VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER = 3,
- VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE = 4,
+ VK_SAMPLER_ADDRESS_MODE_REPEAT = 0,
+ VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT = 1,
+ VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE = 2,
+ VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER = 3,
+ VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE = 4,
+ VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE_KHR = VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,
VK_SAMPLER_ADDRESS_MODE_LAST,
- VK_SAMPLER_ADDRESS_MODE_MAX_ENUM = 0x7FFFFFFF,
+ VK_SAMPLER_ADDRESS_MODE_MAX_ENUM = 0x7FFFFFFF,
};
enum VkBorderColor
@@ -1257,6 +1374,7 @@
VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT = 1000128000,
VK_OBJECT_TYPE_VALIDATION_CACHE_EXT = 1000160000,
VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV = 1000165000,
+ VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL = 1000210000,
VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR = VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE,
VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_KHR = VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION,
VK_OBJECT_TYPE_MAX_ENUM = 0x7FFFFFFF,
@@ -1335,6 +1453,69 @@
VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_MAX_ENUM = 0x7FFFFFFF,
};
+enum VkDriverId
+{
+ VK_DRIVER_ID_AMD_PROPRIETARY = 1,
+ VK_DRIVER_ID_AMD_OPEN_SOURCE = 2,
+ VK_DRIVER_ID_MESA_RADV = 3,
+ VK_DRIVER_ID_NVIDIA_PROPRIETARY = 4,
+ VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS = 5,
+ VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA = 6,
+ VK_DRIVER_ID_IMAGINATION_PROPRIETARY = 7,
+ VK_DRIVER_ID_QUALCOMM_PROPRIETARY = 8,
+ VK_DRIVER_ID_ARM_PROPRIETARY = 9,
+ VK_DRIVER_ID_GOOGLE_SWIFTSHADER = 10,
+ VK_DRIVER_ID_GGP_PROPRIETARY = 11,
+ VK_DRIVER_ID_BROADCOM_PROPRIETARY = 12,
+ 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,
+ VK_DRIVER_ID_NVIDIA_PROPRIETARY_KHR = VK_DRIVER_ID_NVIDIA_PROPRIETARY,
+ VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS_KHR = VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS,
+ VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA_KHR = VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA,
+ VK_DRIVER_ID_IMAGINATION_PROPRIETARY_KHR = VK_DRIVER_ID_IMAGINATION_PROPRIETARY,
+ VK_DRIVER_ID_QUALCOMM_PROPRIETARY_KHR = VK_DRIVER_ID_QUALCOMM_PROPRIETARY,
+ VK_DRIVER_ID_ARM_PROPRIETARY_KHR = VK_DRIVER_ID_ARM_PROPRIETARY,
+ VK_DRIVER_ID_GOOGLE_SWIFTSHADER_KHR = VK_DRIVER_ID_GOOGLE_SWIFTSHADER,
+ VK_DRIVER_ID_GGP_PROPRIETARY_KHR = VK_DRIVER_ID_GGP_PROPRIETARY,
+ VK_DRIVER_ID_BROADCOM_PROPRIETARY_KHR = VK_DRIVER_ID_BROADCOM_PROPRIETARY,
+ VK_DRIVER_ID_MAX_ENUM = 0x7FFFFFFF,
+};
+
+enum VkShaderFloatControlsIndependence
+{
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY = 0,
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL = 1,
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE = 2,
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY_KHR = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY,
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL_KHR = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL,
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE_KHR = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE,
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_LAST,
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_MAX_ENUM = 0x7FFFFFFF,
+};
+
+enum VkSamplerReductionMode
+{
+ VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE = 0,
+ VK_SAMPLER_REDUCTION_MODE_MIN = 1,
+ VK_SAMPLER_REDUCTION_MODE_MAX = 2,
+ VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT = VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE,
+ VK_SAMPLER_REDUCTION_MODE_MIN_EXT = VK_SAMPLER_REDUCTION_MODE_MIN,
+ VK_SAMPLER_REDUCTION_MODE_MAX_EXT = VK_SAMPLER_REDUCTION_MODE_MAX,
+ VK_SAMPLER_REDUCTION_MODE_LAST,
+ VK_SAMPLER_REDUCTION_MODE_MAX_ENUM = 0x7FFFFFFF,
+};
+
+enum VkSemaphoreType
+{
+ VK_SEMAPHORE_TYPE_BINARY = 0,
+ VK_SEMAPHORE_TYPE_TIMELINE = 1,
+ VK_SEMAPHORE_TYPE_BINARY_KHR = VK_SEMAPHORE_TYPE_BINARY,
+ VK_SEMAPHORE_TYPE_TIMELINE_KHR = VK_SEMAPHORE_TYPE_TIMELINE,
+ VK_SEMAPHORE_TYPE_LAST,
+ VK_SEMAPHORE_TYPE_MAX_ENUM = 0x7FFFFFFF,
+};
+
enum VkColorSpaceKHR
{
VK_COLOR_SPACE_SRGB_NONLINEAR_KHR = 0,
@@ -1369,20 +1550,42 @@
VK_PRESENT_MODE_MAX_ENUM_KHR = 0x7FFFFFFF,
};
-enum VkDriverIdKHR
+enum VkPerformanceCounterUnitKHR
{
- VK_DRIVER_ID_AMD_PROPRIETARY_KHR = 1,
- VK_DRIVER_ID_AMD_OPEN_SOURCE_KHR = 2,
- VK_DRIVER_ID_MESA_RADV_KHR = 3,
- VK_DRIVER_ID_NVIDIA_PROPRIETARY_KHR = 4,
- VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS_KHR = 5,
- VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA_KHR = 6,
- VK_DRIVER_ID_IMAGINATION_PROPRIETARY_KHR = 7,
- VK_DRIVER_ID_QUALCOMM_PROPRIETARY_KHR = 8,
- VK_DRIVER_ID_ARM_PROPRIETARY_KHR = 9,
- VK_DRIVER_ID_GOOGLE_PASTEL_KHR = 10,
- VK_DRIVER_ID_GGP_PROPRIETARY_KHR = 11,
- VK_DRIVER_ID_MAX_ENUM_KHR = 0x7FFFFFFF,
+ VK_PERFORMANCE_COUNTER_UNIT_GENERIC_KHR = 0,
+ VK_PERFORMANCE_COUNTER_UNIT_PERCENTAGE_KHR = 1,
+ VK_PERFORMANCE_COUNTER_UNIT_NANOSECONDS_KHR = 2,
+ VK_PERFORMANCE_COUNTER_UNIT_BYTES_KHR = 3,
+ VK_PERFORMANCE_COUNTER_UNIT_BYTES_PER_SECOND_KHR = 4,
+ VK_PERFORMANCE_COUNTER_UNIT_KELVIN_KHR = 5,
+ VK_PERFORMANCE_COUNTER_UNIT_WATTS_KHR = 6,
+ VK_PERFORMANCE_COUNTER_UNIT_VOLTS_KHR = 7,
+ VK_PERFORMANCE_COUNTER_UNIT_AMPS_KHR = 8,
+ VK_PERFORMANCE_COUNTER_UNIT_HERTZ_KHR = 9,
+ VK_PERFORMANCE_COUNTER_UNIT_CYCLES_KHR = 10,
+ VK_PERFORMANCE_COUNTER_UNIT_KHR_LAST,
+ VK_PERFORMANCE_COUNTER_UNIT_MAX_ENUM_KHR = 0x7FFFFFFF,
+};
+
+enum VkPerformanceCounterScopeKHR
+{
+ VK_QUERY_SCOPE_COMMAND_BUFFER_KHR = 0,
+ VK_QUERY_SCOPE_RENDER_PASS_KHR = 1,
+ VK_QUERY_SCOPE_COMMAND_KHR = 2,
+ VK_PERFORMANCE_COUNTER_SCOPE_KHR_LAST,
+ VK_PERFORMANCE_COUNTER_SCOPE_MAX_ENUM_KHR = 0x7FFFFFFF,
+};
+
+enum VkPerformanceCounterStorageKHR
+{
+ VK_PERFORMANCE_COUNTER_STORAGE_INT32_KHR = 0,
+ VK_PERFORMANCE_COUNTER_STORAGE_INT64_KHR = 1,
+ VK_PERFORMANCE_COUNTER_STORAGE_UINT32_KHR = 2,
+ VK_PERFORMANCE_COUNTER_STORAGE_UINT64_KHR = 3,
+ VK_PERFORMANCE_COUNTER_STORAGE_FLOAT32_KHR = 4,
+ VK_PERFORMANCE_COUNTER_STORAGE_FLOAT64_KHR = 5,
+ VK_PERFORMANCE_COUNTER_STORAGE_KHR_LAST,
+ VK_PERFORMANCE_COUNTER_STORAGE_MAX_ENUM_KHR = 0x7FFFFFFF,
};
enum VkPipelineExecutableStatisticFormatKHR
@@ -1395,14 +1598,6 @@
VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_MAX_ENUM_KHR = 0x7FFFFFFF,
};
-enum VkSemaphoreTypeKHR
-{
- VK_SEMAPHORE_TYPE_BINARY_KHR = 0,
- VK_SEMAPHORE_TYPE_TIMELINE_KHR = 1,
- VK_SEMAPHORE_TYPE_KHR_LAST,
- VK_SEMAPHORE_TYPE_MAX_ENUM_KHR = 0x7FFFFFFF,
-};
-
enum VkDebugReportObjectTypeEXT
{
VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT = 0,
@@ -1553,15 +1748,6 @@
VK_CONSERVATIVE_RASTERIZATION_MODE_MAX_ENUM_EXT = 0x7FFFFFFF,
};
-enum VkSamplerReductionModeEXT
-{
- VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT = 0,
- VK_SAMPLER_REDUCTION_MODE_MIN_EXT = 1,
- VK_SAMPLER_REDUCTION_MODE_MAX_EXT = 2,
- VK_SAMPLER_REDUCTION_MODE_EXT_LAST,
- VK_SAMPLER_REDUCTION_MODE_MAX_ENUM_EXT = 0x7FFFFFFF,
-};
-
enum VkBlendOverlapEXT
{
VK_BLEND_OVERLAP_UNCORRELATED_EXT = 0,
@@ -1615,6 +1801,14 @@
VK_COARSE_SAMPLE_ORDER_TYPE_MAX_ENUM_NV = 0x7FFFFFFF,
};
+enum VkAccelerationStructureTypeNV
+{
+ VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV = 0,
+ VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV = 1,
+ VK_ACCELERATION_STRUCTURE_TYPE_NV_LAST,
+ VK_ACCELERATION_STRUCTURE_TYPE_MAX_ENUM_NV = 0x7FFFFFFF,
+};
+
enum VkRayTracingShaderGroupTypeNV
{
VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV = 0,
@@ -1632,14 +1826,6 @@
VK_GEOMETRY_TYPE_MAX_ENUM_NV = 0x7FFFFFFF,
};
-enum VkAccelerationStructureTypeNV
-{
- VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV = 0,
- VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV = 1,
- VK_ACCELERATION_STRUCTURE_TYPE_NV_LAST,
- VK_ACCELERATION_STRUCTURE_TYPE_MAX_ENUM_NV = 0x7FFFFFFF,
-};
-
enum VkCopyAccelerationStructureModeNV
{
VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_NV = 0,
@@ -1685,10 +1871,52 @@
VK_MEMORY_OVERALLOCATION_BEHAVIOR_MAX_ENUM_AMD = 0x7FFFFFFF,
};
+enum VkPerformanceConfigurationTypeINTEL
+{
+ VK_PERFORMANCE_CONFIGURATION_TYPE_COMMAND_QUEUE_METRICS_DISCOVERY_ACTIVATED_INTEL = 0,
+ VK_PERFORMANCE_CONFIGURATION_TYPE_INTEL_LAST,
+ VK_PERFORMANCE_CONFIGURATION_TYPE_MAX_ENUM_INTEL = 0x7FFFFFFF,
+};
+
+enum VkQueryPoolSamplingModeINTEL
+{
+ VK_QUERY_POOL_SAMPLING_MODE_MANUAL_INTEL = 0,
+ VK_QUERY_POOL_SAMPLING_MODE_INTEL_LAST,
+ VK_QUERY_POOL_SAMPLING_MODE_MAX_ENUM_INTEL = 0x7FFFFFFF,
+};
+
+enum VkPerformanceOverrideTypeINTEL
+{
+ VK_PERFORMANCE_OVERRIDE_TYPE_NULL_HARDWARE_INTEL = 0,
+ VK_PERFORMANCE_OVERRIDE_TYPE_FLUSH_GPU_CACHES_INTEL = 1,
+ VK_PERFORMANCE_OVERRIDE_TYPE_INTEL_LAST,
+ VK_PERFORMANCE_OVERRIDE_TYPE_MAX_ENUM_INTEL = 0x7FFFFFFF,
+};
+
+enum VkPerformanceParameterTypeINTEL
+{
+ VK_PERFORMANCE_PARAMETER_TYPE_HW_COUNTERS_SUPPORTED_INTEL = 0,
+ VK_PERFORMANCE_PARAMETER_TYPE_STREAM_MARKER_VALID_BITS_INTEL = 1,
+ VK_PERFORMANCE_PARAMETER_TYPE_INTEL_LAST,
+ VK_PERFORMANCE_PARAMETER_TYPE_MAX_ENUM_INTEL = 0x7FFFFFFF,
+};
+
+enum VkPerformanceValueTypeINTEL
+{
+ VK_PERFORMANCE_VALUE_TYPE_UINT32_INTEL = 0,
+ VK_PERFORMANCE_VALUE_TYPE_UINT64_INTEL = 1,
+ VK_PERFORMANCE_VALUE_TYPE_FLOAT_INTEL = 2,
+ VK_PERFORMANCE_VALUE_TYPE_BOOL_INTEL = 3,
+ VK_PERFORMANCE_VALUE_TYPE_STRING_INTEL = 4,
+ VK_PERFORMANCE_VALUE_TYPE_INTEL_LAST,
+ VK_PERFORMANCE_VALUE_TYPE_MAX_ENUM_INTEL = 0x7FFFFFFF,
+};
+
enum VkValidationFeatureEnableEXT
{
VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT = 0,
VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT = 1,
+ VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT = 2,
VK_VALIDATION_FEATURE_ENABLE_EXT_LAST,
VK_VALIDATION_FEATURE_ENABLE_MAX_ENUM_EXT = 0x7FFFFFFF,
};
@@ -1740,6 +1968,16 @@
VK_COVERAGE_REDUCTION_MODE_MAX_ENUM_NV = 0x7FFFFFFF,
};
+enum VkLineRasterizationModeEXT
+{
+ VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT = 0,
+ VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT = 1,
+ VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT = 2,
+ VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT = 3,
+ VK_LINE_RASTERIZATION_MODE_EXT_LAST,
+ VK_LINE_RASTERIZATION_MODE_MAX_ENUM_EXT = 0x7FFFFFFF,
+};
+
enum VkFullScreenExclusiveEXT
{
VK_FULL_SCREEN_EXCLUSIVE_DEFAULT_EXT = 0,
@@ -1756,6 +1994,10 @@
+
+
+
+
enum VkFormatFeatureFlagBits
{
VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT = 0x00000001,
@@ -1780,11 +2022,12 @@
VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT = 0x00200000,
VK_FORMAT_FEATURE_DISJOINT_BIT = 0x00400000,
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_SAMPLED_IMAGE_FILTER_MINMAX_BIT_EXT = 0x00010000,
VK_FORMAT_FEATURE_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x01000000,
VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT,
VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR = VK_FORMAT_FEATURE_TRANSFER_DST_BIT,
+ VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT_EXT = VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT,
VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT_KHR = VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT,
VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT_KHR = VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT,
VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT_KHR = VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT,
@@ -1866,13 +2109,15 @@
enum VkMemoryPropertyFlagBits
{
- VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT = 0x00000001,
- VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT = 0x00000002,
- VK_MEMORY_PROPERTY_HOST_COHERENT_BIT = 0x00000004,
- VK_MEMORY_PROPERTY_HOST_CACHED_BIT = 0x00000008,
- VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT = 0x00000010,
- VK_MEMORY_PROPERTY_PROTECTED_BIT = 0x00000020,
- VK_MEMORY_PROPERTY_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF,
+ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT = 0x00000001,
+ VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT = 0x00000002,
+ VK_MEMORY_PROPERTY_HOST_COHERENT_BIT = 0x00000004,
+ VK_MEMORY_PROPERTY_HOST_CACHED_BIT = 0x00000008,
+ VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT = 0x00000010,
+ VK_MEMORY_PROPERTY_PROTECTED_BIT = 0x00000020,
+ VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD = 0x00000040,
+ VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD = 0x00000080,
+ VK_MEMORY_PROPERTY_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF,
};
typedef deUint32 VkMemoryPropertyFlags;
@@ -2000,7 +2245,9 @@
VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT = 0x00000002,
VK_BUFFER_CREATE_SPARSE_ALIASED_BIT = 0x00000004,
VK_BUFFER_CREATE_PROTECTED_BIT = 0x00000008,
- VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_EXT = 0x00000010,
+ VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT = 0x00000010,
+ VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_EXT = VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT,
+ VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR = VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT,
VK_BUFFER_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF,
};
typedef deUint32 VkBufferCreateFlags;
@@ -2016,11 +2263,13 @@
VK_BUFFER_USAGE_INDEX_BUFFER_BIT = 0x00000040,
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_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT = 0x00000800,
VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT = 0x00001000,
VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT = 0x00000200,
VK_BUFFER_USAGE_RAY_TRACING_BIT_NV = 0x00000400,
- VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT = 0x00020000,
+ VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
+ VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
VK_BUFFER_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF,
};
typedef deUint32 VkBufferUsageFlags;
@@ -2032,6 +2281,12 @@
};
typedef deUint32 VkImageViewCreateFlags;
+enum VkShaderModuleCreateFlagBits
+{
+ VK_SHADER_MODULE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF,
+};
+typedef deUint32 VkShaderModuleCreateFlags;
+
enum VkPipelineCreateFlagBits
{
VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT = 0x00000001,
@@ -2048,6 +2303,14 @@
};
typedef deUint32 VkPipelineCreateFlags;
+enum VkPipelineShaderStageCreateFlagBits
+{
+ VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT = 0x00000001,
+ VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT = 0x00000002,
+ VK_PIPELINE_SHADER_STAGE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF,
+};
+typedef deUint32 VkPipelineShaderStageCreateFlags;
+
enum VkShaderStageFlagBits
{
VK_SHADER_STAGE_VERTEX_BIT = 0x00000001,
@@ -2100,8 +2363,9 @@
enum VkDescriptorSetLayoutCreateFlagBits
{
+ VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT = 0x00000002,
VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR = 0x00000001,
- VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT = 0x00000002,
+ VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT,
VK_DESCRIPTOR_SET_LAYOUT_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF,
};
typedef deUint32 VkDescriptorSetLayoutCreateFlags;
@@ -2109,18 +2373,26 @@
enum VkDescriptorPoolCreateFlagBits
{
VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT = 0x00000001,
- VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT = 0x00000002,
+ VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT = 0x00000002,
+ VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT = VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT,
VK_DESCRIPTOR_POOL_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF,
};
typedef deUint32 VkDescriptorPoolCreateFlags;
enum VkFramebufferCreateFlagBits
{
- VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR = 0x00000001,
+ VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT = 0x00000001,
+ VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR = VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,
VK_FRAMEBUFFER_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF,
};
typedef deUint32 VkFramebufferCreateFlags;
+enum VkRenderPassCreateFlagBits
+{
+ VK_RENDER_PASS_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF,
+};
+typedef deUint32 VkRenderPassCreateFlags;
+
enum VkAttachmentDescriptionFlagBits
{
VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT = 0x00000001,
@@ -2224,7 +2496,8 @@
{
VK_STENCIL_FACE_FRONT_BIT = 0x00000001,
VK_STENCIL_FACE_BACK_BIT = 0x00000002,
- VK_STENCIL_FRONT_AND_BACK = 0x00000003,
+ VK_STENCIL_FACE_FRONT_AND_BACK = 0x00000003,
+ VK_STENCIL_FRONT_AND_BACK = VK_STENCIL_FACE_FRONT_AND_BACK,
VK_STENCIL_FACE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF,
};
typedef deUint32 VkStencilFaceFlags;
@@ -2260,9 +2533,13 @@
enum VkMemoryAllocateFlagBits
{
- VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT = 0x00000001,
- VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT_KHR = VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT,
- VK_MEMORY_ALLOCATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF,
+ VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT = 0x00000001,
+ VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT = 0x00000002,
+ VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT = 0x00000004,
+ VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT_KHR = VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT,
+ VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT,
+ VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT,
+ VK_MEMORY_ALLOCATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF,
};
typedef deUint32 VkMemoryAllocateFlags;
@@ -2368,6 +2645,44 @@
};
typedef deUint32 VkExternalSemaphoreFeatureFlags;
+enum VkResolveModeFlagBits
+{
+ VK_RESOLVE_MODE_NONE = 0,
+ VK_RESOLVE_MODE_SAMPLE_ZERO_BIT = 0x00000001,
+ VK_RESOLVE_MODE_AVERAGE_BIT = 0x00000002,
+ VK_RESOLVE_MODE_MIN_BIT = 0x00000004,
+ VK_RESOLVE_MODE_MAX_BIT = 0x00000008,
+ VK_RESOLVE_MODE_NONE_KHR = VK_RESOLVE_MODE_NONE,
+ VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT,
+ VK_RESOLVE_MODE_AVERAGE_BIT_KHR = VK_RESOLVE_MODE_AVERAGE_BIT,
+ VK_RESOLVE_MODE_MIN_BIT_KHR = VK_RESOLVE_MODE_MIN_BIT,
+ VK_RESOLVE_MODE_MAX_BIT_KHR = VK_RESOLVE_MODE_MAX_BIT,
+ VK_RESOLVE_MODE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF,
+};
+typedef deUint32 VkResolveModeFlags;
+
+enum VkDescriptorBindingFlagBits
+{
+ VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT = 0x00000001,
+ VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT = 0x00000002,
+ VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT = 0x00000004,
+ VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT = 0x00000008,
+ VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT = VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT,
+ VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT = VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT,
+ VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT = VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT,
+ VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT = VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT,
+ VK_DESCRIPTOR_BINDING_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF,
+};
+typedef deUint32 VkDescriptorBindingFlags;
+
+enum VkSemaphoreWaitFlagBits
+{
+ VK_SEMAPHORE_WAIT_ANY_BIT = 0x00000001,
+ VK_SEMAPHORE_WAIT_ANY_BIT_KHR = VK_SEMAPHORE_WAIT_ANY_BIT,
+ VK_SEMAPHORE_WAIT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF,
+};
+typedef deUint32 VkSemaphoreWaitFlags;
+
enum VkSurfaceTransformFlagBitsKHR
{
VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR = 0x00000001,
@@ -2422,23 +2737,19 @@
};
typedef deUint32 VkDisplayPlaneAlphaFlagsKHR;
-enum VkResolveModeFlagBitsKHR
+enum VkPerformanceCounterDescriptionFlagBitsKHR
{
- VK_RESOLVE_MODE_NONE_KHR = 0,
- VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR = 0x00000001,
- VK_RESOLVE_MODE_AVERAGE_BIT_KHR = 0x00000002,
- VK_RESOLVE_MODE_MIN_BIT_KHR = 0x00000004,
- VK_RESOLVE_MODE_MAX_BIT_KHR = 0x00000008,
- VK_RESOLVE_MODE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF,
+ VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_KHR = 0x00000001,
+ VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_KHR = 0x00000002,
+ VK_PERFORMANCE_COUNTER_DESCRIPTION_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF,
};
-typedef deUint32 VkResolveModeFlagsKHR;
+typedef deUint32 VkPerformanceCounterDescriptionFlagsKHR;
-enum VkSemaphoreWaitFlagBitsKHR
+enum VkAcquireProfilingLockFlagBitsKHR
{
- VK_SEMAPHORE_WAIT_ANY_BIT_KHR = 0x00000001,
- VK_SEMAPHORE_WAIT_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF,
+ VK_ACQUIRE_PROFILING_LOCK_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF,
};
-typedef deUint32 VkSemaphoreWaitFlagsKHR;
+typedef deUint32 VkAcquireProfilingLockFlagsKHR;
enum VkDebugReportFlagBitsEXT
{
@@ -2521,16 +2832,6 @@
};
typedef deUint32 VkDebugUtilsMessageTypeFlagsEXT;
-enum VkDescriptorBindingFlagBitsEXT
-{
- VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT = 0x00000001,
- VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT = 0x00000002,
- VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT = 0x00000004,
- VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT = 0x00000008,
- VK_DESCRIPTOR_BINDING_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF,
-};
-typedef deUint32 VkDescriptorBindingFlagsEXT;
-
enum VkGeometryFlagBitsNV
{
VK_GEOMETRY_OPAQUE_BIT_NV = 0x00000001,
@@ -2560,6 +2861,12 @@
};
typedef deUint32 VkBuildAccelerationStructureFlagsNV;
+enum VkPipelineCompilerControlFlagBitsAMD
+{
+ VK_PIPELINE_COMPILER_CONTROL_FLAG_BITS_MAX_ENUM_AMD = 0x7FFFFFFF,
+};
+typedef deUint32 VkPipelineCompilerControlFlagsAMD;
+
enum VkPipelineCreationFeedbackFlagBitsEXT
{
VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT_EXT = 0x00000001,
@@ -2569,6 +2876,12 @@
};
typedef deUint32 VkPipelineCreationFeedbackFlagsEXT;
+enum VkShaderCorePropertiesFlagBitsAMD
+{
+ VK_SHADER_CORE_PROPERTIES_FLAG_BITS_MAX_ENUM_AMD = 0x7FFFFFFF,
+};
+typedef deUint32 VkShaderCorePropertiesFlagsAMD;
+
typedef deUint32 VkInstanceCreateFlags;
typedef deUint32 VkDeviceCreateFlags;
@@ -2583,12 +2896,8 @@
typedef deUint32 VkBufferViewCreateFlags;
-typedef deUint32 VkShaderModuleCreateFlags;
-
typedef deUint32 VkPipelineCacheCreateFlags;
-typedef deUint32 VkPipelineShaderStageCreateFlags;
-
typedef deUint32 VkPipelineVertexInputStateCreateFlags;
typedef deUint32 VkPipelineInputAssemblyStateCreateFlags;
@@ -2611,8 +2920,6 @@
typedef deUint32 VkDescriptorPoolResetFlags;
-typedef deUint32 VkRenderPassCreateFlags;
-
typedef deUint32 VkCommandPoolTrimFlags;
typedef deUint32 VkDescriptorUpdateTemplateCreateFlags;
@@ -2679,6 +2986,9 @@
+
+
+
VK_DEFINE_PLATFORM_TYPE(XlibDisplayPtr, void*);
VK_DEFINE_PLATFORM_TYPE(XlibWindow, deUintptr);
VK_DEFINE_PLATFORM_TYPE(XlibVisualID, deUint32);
@@ -2703,12 +3013,12 @@
VK_DEFINE_PLATFORM_TYPE(CAMetalLayer, void*);
#define VK_KHR_SURFACE_SPEC_VERSION 25
#define VK_KHR_SWAPCHAIN_SPEC_VERSION 70
-#define VK_KHR_DISPLAY_SPEC_VERSION 21
-#define VK_KHR_DISPLAY_SWAPCHAIN_SPEC_VERSION 9
-#define VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_SPEC_VERSION 1
+#define VK_KHR_DISPLAY_SPEC_VERSION 23
+#define VK_KHR_DISPLAY_SWAPCHAIN_SPEC_VERSION 10
+#define VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_SPEC_VERSION 3
#define VK_KHR_MULTIVIEW_SPEC_VERSION 1
#define VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME "VK_KHR_get_physical_device_properties2"
-#define VK_KHR_DEVICE_GROUP_SPEC_VERSION 3
+#define VK_KHR_DEVICE_GROUP_SPEC_VERSION 4
#define VK_KHR_SHADER_DRAW_PARAMETERS_SPEC_VERSION 1
#define VK_KHR_MAINTENANCE1_SPEC_VERSION 2
#define VK_KHR_DEVICE_GROUP_CREATION_SPEC_VERSION 1
@@ -2732,6 +3042,7 @@
#define VK_KHR_EXTERNAL_FENCE_CAPABILITIES_SPEC_VERSION 1
#define VK_KHR_EXTERNAL_FENCE_SPEC_VERSION 1
#define VK_KHR_EXTERNAL_FENCE_FD_SPEC_VERSION 1
+#define VK_KHR_PERFORMANCE_QUERY_SPEC_VERSION 1
#define VK_KHR_MAINTENANCE2_SPEC_VERSION 1
#define VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME "VK_KHR_get_surface_capabilities2"
#define VK_KHR_VARIABLE_POINTERS_SPEC_VERSION 1
@@ -2741,21 +3052,27 @@
#define VK_KHR_RELAXED_BLOCK_LAYOUT_SPEC_VERSION 1
#define VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME "VK_KHR_get_memory_requirements2"
#define VK_KHR_IMAGE_FORMAT_LIST_SPEC_VERSION 1
-#define VK_KHR_SAMPLER_YCBCR_CONVERSION_SPEC_VERSION 1
+#define VK_KHR_SAMPLER_YCBCR_CONVERSION_SPEC_VERSION 14
#define VK_KHR_BIND_MEMORY_2_EXTENSION_NAME "VK_KHR_bind_memory2"
#define VK_KHR_MAINTENANCE3_SPEC_VERSION 1
#define VK_KHR_DRAW_INDIRECT_COUNT_SPEC_VERSION 1
+#define VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_SPEC_VERSION 1
#define VK_KHR_8BIT_STORAGE_SPEC_VERSION 1
#define VK_KHR_SHADER_ATOMIC_INT64_SPEC_VERSION 1
#define VK_KHR_DRIVER_PROPERTIES_SPEC_VERSION 1
-#define VK_KHR_SHADER_FLOAT_CONTROLS_SPEC_VERSION 1
+#define VK_MAX_DRIVER_NAME_SIZE_KHR VK_MAX_DRIVER_NAME_SIZE
+#define VK_MAX_DRIVER_INFO_SIZE_KHR VK_MAX_DRIVER_INFO_SIZE
+#define VK_KHR_SHADER_FLOAT_CONTROLS_SPEC_VERSION 4
#define VK_KHR_DEPTH_STENCIL_RESOLVE_SPEC_VERSION 1
#define VK_KHR_SWAPCHAIN_MUTABLE_FORMAT_SPEC_VERSION 1
-#define VK_KHR_VULKAN_MEMORY_MODEL_SPEC_VERSION 3
-#define VK_KHR_SURFACE_PROTECTED_CAPABILITIES_SPEC_VERSION 1
-#define VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_SPEC_VERSION 1
-#define VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_SPEC_VERSION 1
#define VK_KHR_TIMELINE_SEMAPHORE_SPEC_VERSION 2
+#define VK_KHR_VULKAN_MEMORY_MODEL_SPEC_VERSION 3
+#define VK_KHR_SPIRV_1_4_SPEC_VERSION 1
+#define VK_KHR_SURFACE_PROTECTED_CAPABILITIES_SPEC_VERSION 1
+#define VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_SPEC_VERSION 1
+#define VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_SPEC_VERSION 1
+#define VK_KHR_BUFFER_DEVICE_ADDRESS_SPEC_VERSION 1
+#define VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_SPEC_VERSION 1
#define VK_EXT_DEBUG_REPORT_SPEC_VERSION 9
#define VK_NV_GLSL_SHADER_SPEC_VERSION 1
#define VK_EXT_DEPTH_RANGE_UNRESTRICTED_SPEC_VERSION 1
@@ -2768,7 +3085,7 @@
#define VK_NV_DEDICATED_ALLOCATION_SPEC_VERSION 1
#define VK_EXT_TRANSFORM_FEEDBACK_SPEC_VERSION 1
#define VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION 1
-#define VK_AMD_DRAW_INDIRECT_COUNT_SPEC_VERSION 1
+#define VK_AMD_DRAW_INDIRECT_COUNT_SPEC_VERSION 2
#define VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_SPEC_VERSION 1
#define VK_AMD_GPU_SHADER_HALF_FLOAT_SPEC_VERSION 2
#define VK_AMD_SHADER_BALLOT_SPEC_VERSION 1
@@ -2779,11 +3096,12 @@
#define VK_IMG_FORMAT_PVRTC_SPEC_VERSION 1
#define VK_NV_EXTERNAL_MEMORY_CAPABILITIES_SPEC_VERSION 1
#define VK_NV_EXTERNAL_MEMORY_SPEC_VERSION 1
-#define VK_EXT_VALIDATION_FLAGS_SPEC_VERSION 1
+#define VK_EXT_VALIDATION_FLAGS_SPEC_VERSION 2
#define VK_EXT_SHADER_SUBGROUP_BALLOT_SPEC_VERSION 1
#define VK_EXT_SHADER_SUBGROUP_VOTE_SPEC_VERSION 1
+#define VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_SPEC_VERSION 1
#define VK_EXT_ASTC_DECODE_MODE_SPEC_VERSION 1
-#define VK_EXT_CONDITIONAL_RENDERING_SPEC_VERSION 1
+#define VK_EXT_CONDITIONAL_RENDERING_SPEC_VERSION 2
#define VK_NVX_DEVICE_GENERATED_COMMANDS_SPEC_VERSION 3
#define VK_NV_CLIP_SPACE_W_SCALING_SPEC_VERSION 1
#define VK_EXT_DIRECT_MODE_DISPLAY_SPEC_VERSION 1
@@ -2799,12 +3117,12 @@
#define VK_EXT_CONSERVATIVE_RASTERIZATION_SPEC_VERSION 1
#define VK_EXT_DEPTH_CLIP_ENABLE_SPEC_VERSION 1
#define VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME "VK_EXT_swapchain_colorspace"
-#define VK_EXT_HDR_METADATA_SPEC_VERSION 1
+#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_EXT_DEBUG_UTILS_SPEC_VERSION 1
-#define VK_EXT_SAMPLER_FILTER_MINMAX_SPEC_VERSION 1
+#define VK_EXT_SAMPLER_FILTER_MINMAX_SPEC_VERSION 2
#define VK_AMD_GPU_SHADER_INT16_SPEC_VERSION 2
#define VK_AMD_MIXED_ATTACHMENT_SAMPLES_SPEC_VERSION 1
#define VK_AMD_SHADER_FRAGMENT_MASK_SPEC_VERSION 1
@@ -2815,6 +3133,7 @@
#define VK_NV_FRAGMENT_COVERAGE_TO_COLOR_SPEC_VERSION 1
#define VK_NV_FRAMEBUFFER_MIXED_SAMPLES_SPEC_VERSION 1
#define VK_NV_FILL_RECTANGLE_SPEC_VERSION 1
+#define VK_NV_SHADER_SM_BUILTINS_SPEC_VERSION 1
#define VK_EXT_POST_DEPTH_COVERAGE_SPEC_VERSION 1
#define VK_KHR_SHADER_CLOCK_SPEC_VERSION 1
#define VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_SPEC_VERSION 1
@@ -2824,13 +3143,14 @@
#define VK_NV_SHADING_RATE_IMAGE_SPEC_VERSION 3
#define VK_NV_RAY_TRACING_SPEC_VERSION 3
#define VK_SHADER_UNUSED_NV (~0U)
-#define VK_NV_REPRESENTATIVE_FRAGMENT_TEST_SPEC_VERSION 1
-#define VK_EXT_FILTER_CUBIC_SPEC_VERSION 1
+#define VK_NV_REPRESENTATIVE_FRAGMENT_TEST_SPEC_VERSION 2
+#define VK_EXT_FILTER_CUBIC_SPEC_VERSION 2
#define VK_EXT_GLOBAL_PRIORITY_SPEC_VERSION 2
#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_AMD_SHADER_CORE_PROPERTIES_SPEC_VERSION 1
+#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
#define VK_EXT_PIPELINE_CREATION_FEEDBACK_SPEC_VERSION 1
@@ -2838,30 +3158,37 @@
#define VK_NV_COMPUTE_SHADER_DERIVATIVES_SPEC_VERSION 1
#define VK_NV_MESH_SHADER_SPEC_VERSION 1
#define VK_NV_FRAGMENT_SHADER_BARYCENTRIC_SPEC_VERSION 1
-#define VK_NV_SHADER_IMAGE_FOOTPRINT_SPEC_VERSION 1
+#define VK_NV_SHADER_IMAGE_FOOTPRINT_SPEC_VERSION 2
#define VK_NV_SCISSOR_EXCLUSIVE_SPEC_VERSION 1
#define VK_NV_DEVICE_DIAGNOSTIC_CHECKPOINTS_SPEC_VERSION 2
-#define VK_INTEL_SHADER_INTEGER_FUNCTIONS2_SPEC_VERSION 1
+#define VK_INTEL_SHADER_INTEGER_FUNCTIONS_2_SPEC_VERSION 1
+#define VK_INTEL_PERFORMANCE_QUERY_SPEC_VERSION 1
#define VK_EXT_PCI_BUS_INFO_SPEC_VERSION 2
#define VK_AMD_DISPLAY_NATIVE_HDR_SPEC_VERSION 1
#define VK_EXT_FRAGMENT_DENSITY_MAP_SPEC_VERSION 1
#define VK_EXT_SCALAR_BLOCK_LAYOUT_SPEC_VERSION 1
#define VK_GOOGLE_HLSL_FUNCTIONALITY1_SPEC_VERSION 1
#define VK_GOOGLE_DECORATE_STRING_SPEC_VERSION 1
+#define VK_EXT_SUBGROUP_SIZE_CONTROL_SPEC_VERSION 2
+#define VK_AMD_SHADER_CORE_PROPERTIES_2_EXTENSION_NAME "VK_AMD_shader_core_properties2"
+#define VK_AMD_DEVICE_COHERENT_MEMORY_SPEC_VERSION 1
#define VK_EXT_MEMORY_BUDGET_SPEC_VERSION 1
#define VK_EXT_MEMORY_PRIORITY_SPEC_VERSION 1
#define VK_NV_DEDICATED_ALLOCATION_IMAGE_ALIASING_SPEC_VERSION 1
#define VK_EXT_BUFFER_DEVICE_ADDRESS_SPEC_VERSION 2
#define VK_EXT_SEPARATE_STENCIL_USAGE_SPEC_VERSION 1
-#define VK_EXT_VALIDATION_FEATURES_SPEC_VERSION 1
+#define VK_EXT_VALIDATION_FEATURES_SPEC_VERSION 2
#define VK_NV_COOPERATIVE_MATRIX_SPEC_VERSION 1
#define VK_NV_COVERAGE_REDUCTION_MODE_SPEC_VERSION 1
#define VK_EXT_FRAGMENT_SHADER_INTERLOCK_SPEC_VERSION 1
#define VK_EXT_YCBCR_IMAGE_ARRAYS_SPEC_VERSION 1
-#define VK_EXT_HEADLESS_SURFACE_SPEC_VERSION 0
+#define VK_EXT_HEADLESS_SURFACE_SPEC_VERSION 1
+#define VK_EXT_LINE_RASTERIZATION_SPEC_VERSION 1
#define VK_EXT_HOST_QUERY_RESET_SPEC_VERSION 1
#define VK_EXT_INDEX_TYPE_UINT8_SPEC_VERSION 1
#define VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_SPEC_VERSION 1
+#define VK_EXT_TEXEL_BUFFER_ALIGNMENT_SPEC_VERSION 1
+#define VK_GOOGLE_USER_TYPE_SPEC_VERSION 1
#define VK_KHR_ANDROID_SURFACE_SPEC_VERSION 6
#define VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_SPEC_VERSION 3
#define VK_FUCHSIA_IMAGEPIPE_SURFACE_SPEC_VERSION 1
@@ -2878,8 +3205,8 @@
#define VK_KHR_EXTERNAL_SEMAPHORE_WIN32_SPEC_VERSION 1
#define VK_KHR_EXTERNAL_FENCE_WIN32_SPEC_VERSION 1
#define VK_NV_EXTERNAL_MEMORY_WIN32_SPEC_VERSION 1
-#define VK_NV_WIN32_KEYED_MUTEX_SPEC_VERSION 1
-#define VK_EXT_FULL_SCREEN_EXCLUSIVE_SPEC_VERSION 3
+#define VK_NV_WIN32_KEYED_MUTEX_SPEC_VERSION 2
+#define VK_EXT_FULL_SCREEN_EXCLUSIVE_SPEC_VERSION 4
#define VK_KHR_XCB_SURFACE_SPEC_VERSION 6
#define VK_KHR_XLIB_SURFACE_SPEC_VERSION 6
#define VK_EXT_ACQUIRE_XLIB_DISPLAY_SPEC_VERSION 1
diff --git a/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl b/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl
index edae3aa..c46db92 100644
--- a/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl
+++ b/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl
@@ -138,6 +138,19 @@
virtual void destroyDescriptorUpdateTemplate (VkDevice device, VkDescriptorUpdateTemplate descriptorUpdateTemplate, const VkAllocationCallbacks* pAllocator) const;
virtual void updateDescriptorSetWithTemplate (VkDevice device, VkDescriptorSet descriptorSet, VkDescriptorUpdateTemplate descriptorUpdateTemplate, const void* pData) const;
virtual void getDescriptorSetLayoutSupport (VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayoutSupport* pSupport) const;
+virtual void cmdDrawIndirectCount (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const;
+virtual void cmdDrawIndexedIndirectCount (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const;
+virtual VkResult createRenderPass2 (VkDevice device, const VkRenderPassCreateInfo2* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass) const;
+virtual void cmdBeginRenderPass2 (VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, const VkSubpassBeginInfo* pSubpassBeginInfo) const;
+virtual void cmdNextSubpass2 (VkCommandBuffer commandBuffer, const VkSubpassBeginInfo* pSubpassBeginInfo, const VkSubpassEndInfo* pSubpassEndInfo) const;
+virtual void cmdEndRenderPass2 (VkCommandBuffer commandBuffer, const VkSubpassEndInfo* pSubpassEndInfo) const;
+virtual void resetQueryPool (VkDevice device, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount) const;
+virtual VkResult getSemaphoreCounterValue (VkDevice device, VkSemaphore semaphore, deUint64* pValue) const;
+virtual VkResult waitSemaphores (VkDevice device, const VkSemaphoreWaitInfo* pWaitInfo, deUint64 timeout) const;
+virtual VkResult signalSemaphore (VkDevice device, const VkSemaphoreSignalInfo* pSignalInfo) const;
+virtual VkDeviceAddress getBufferDeviceAddress (VkDevice device, const VkBufferDeviceAddressInfo* pInfo) const;
+virtual uint64_t getBufferOpaqueCaptureAddress (VkDevice device, const VkBufferDeviceAddressInfo* pInfo) const;
+virtual uint64_t getDeviceMemoryOpaqueCaptureAddress (VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo) const;
virtual VkResult createSwapchainKHR (VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain) const;
virtual void destroySwapchainKHR (VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks* pAllocator) const;
virtual VkResult getSwapchainImagesKHR (VkDevice device, VkSwapchainKHR swapchain, deUint32* pSwapchainImageCount, VkImage* pSwapchainImages) const;
@@ -153,21 +166,14 @@
virtual VkResult getSemaphoreFdKHR (VkDevice device, const VkSemaphoreGetFdInfoKHR* pGetFdInfo, int* pFd) const;
virtual void cmdPushDescriptorSetKHR (VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, deUint32 set, deUint32 descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites) const;
virtual void cmdPushDescriptorSetWithTemplateKHR (VkCommandBuffer commandBuffer, VkDescriptorUpdateTemplate descriptorUpdateTemplate, VkPipelineLayout layout, deUint32 set, const void* pData) const;
-virtual VkResult createRenderPass2KHR (VkDevice device, const VkRenderPassCreateInfo2KHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass) const;
-virtual void cmdBeginRenderPass2KHR (VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, const VkSubpassBeginInfoKHR* pSubpassBeginInfo) const;
-virtual void cmdNextSubpass2KHR (VkCommandBuffer commandBuffer, const VkSubpassBeginInfoKHR* pSubpassBeginInfo, const VkSubpassEndInfoKHR* pSubpassEndInfo) const;
-virtual void cmdEndRenderPass2KHR (VkCommandBuffer commandBuffer, const VkSubpassEndInfoKHR* pSubpassEndInfo) const;
virtual VkResult getSwapchainStatusKHR (VkDevice device, VkSwapchainKHR swapchain) const;
virtual VkResult importFenceFdKHR (VkDevice device, const VkImportFenceFdInfoKHR* pImportFenceFdInfo) const;
virtual VkResult getFenceFdKHR (VkDevice device, const VkFenceGetFdInfoKHR* pGetFdInfo, int* pFd) const;
-virtual void cmdDrawIndirectCountKHR (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const;
-virtual void cmdDrawIndexedIndirectCountKHR (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const;
+virtual VkResult acquireProfilingLockKHR (VkDevice device, const VkAcquireProfilingLockInfoKHR* pInfo) const;
+virtual void releaseProfilingLockKHR (VkDevice device) const;
virtual VkResult getPipelineExecutablePropertiesKHR (VkDevice device, const VkPipelineInfoKHR* pPipelineInfo, deUint32* pExecutableCount, VkPipelineExecutablePropertiesKHR* pProperties) const;
virtual VkResult getPipelineExecutableStatisticsKHR (VkDevice device, const VkPipelineExecutableInfoKHR* pExecutableInfo, deUint32* pStatisticCount, VkPipelineExecutableStatisticKHR* pStatistics) const;
virtual VkResult getPipelineExecutableInternalRepresentationsKHR (VkDevice device, const VkPipelineExecutableInfoKHR* pExecutableInfo, deUint32* pInternalRepresentationCount, VkPipelineExecutableInternalRepresentationKHR* pInternalRepresentations) const;
-virtual VkResult getSemaphoreCounterValueKHR (VkDevice device, VkSemaphore semaphore, deUint64* pValue) const;
-virtual VkResult waitSemaphoresKHR (VkDevice device, const VkSemaphoreWaitInfoKHR* pWaitInfo, deUint64 timeout) const;
-virtual VkResult signalSemaphoreKHR (VkDevice device, const VkSemaphoreSignalInfoKHR* pSignalInfo) const;
virtual VkResult debugMarkerSetObjectTagEXT (VkDevice device, const VkDebugMarkerObjectTagInfoEXT* pTagInfo) const;
virtual VkResult debugMarkerSetObjectNameEXT (VkDevice device, const VkDebugMarkerObjectNameInfoEXT* pNameInfo) const;
virtual void cmdDebugMarkerBeginEXT (VkCommandBuffer commandBuffer, const VkDebugMarkerMarkerInfoEXT* pMarkerInfo) const;
@@ -240,9 +246,18 @@
virtual void cmdSetExclusiveScissorNV (VkCommandBuffer commandBuffer, deUint32 firstExclusiveScissor, deUint32 exclusiveScissorCount, const VkRect2D* pExclusiveScissors) const;
virtual void cmdSetCheckpointNV (VkCommandBuffer commandBuffer, const void* pCheckpointMarker) const;
virtual void getQueueCheckpointDataNV (VkQueue queue, deUint32* pCheckpointDataCount, VkCheckpointDataNV* pCheckpointData) const;
+virtual VkResult initializePerformanceApiINTEL (VkDevice device, const VkInitializePerformanceApiInfoINTEL* pInitializeInfo) const;
+virtual void uninitializePerformanceApiINTEL (VkDevice device) const;
+virtual VkResult cmdSetPerformanceMarkerINTEL (VkCommandBuffer commandBuffer, const VkPerformanceMarkerInfoINTEL* pMarkerInfo) const;
+virtual VkResult cmdSetPerformanceStreamMarkerINTEL (VkCommandBuffer commandBuffer, const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo) const;
+virtual VkResult cmdSetPerformanceOverrideINTEL (VkCommandBuffer commandBuffer, const VkPerformanceOverrideInfoINTEL* pOverrideInfo) const;
+virtual VkResult acquirePerformanceConfigurationINTEL (VkDevice device, const VkPerformanceConfigurationAcquireInfoINTEL* pAcquireInfo, VkPerformanceConfigurationINTEL* pConfiguration) const;
+virtual VkResult releasePerformanceConfigurationINTEL (VkDevice device, VkPerformanceConfigurationINTEL configuration) const;
+virtual VkResult queueSetPerformanceConfigurationINTEL (VkQueue queue, VkPerformanceConfigurationINTEL configuration) const;
+virtual VkResult getPerformanceParameterINTEL (VkDevice device, VkPerformanceParameterTypeINTEL parameter, VkPerformanceValueINTEL* pValue) const;
virtual void setLocalDimmingAMD (VkDevice device, VkSwapchainKHR swapChain, VkBool32 localDimmingEnable) const;
-virtual VkDeviceAddress getBufferDeviceAddressEXT (VkDevice device, const VkBufferDeviceAddressInfoEXT* pInfo) const;
-virtual void resetQueryPoolEXT (VkDevice device, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount) const;
+virtual VkDeviceAddress getBufferDeviceAddressEXT (VkDevice device, const VkBufferDeviceAddressInfo* pInfo) const;
+virtual void cmdSetLineStippleEXT (VkCommandBuffer commandBuffer, deUint32 lineStippleFactor, deUint16 lineStipplePattern) 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 getMemoryWin32HandleKHR (VkDevice device, const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle) const;
diff --git a/external/vulkancts/framework/vulkan/vkConcreteInstanceInterface.inl b/external/vulkancts/framework/vulkan/vkConcreteInstanceInterface.inl
index d27fbf9..2d40ced 100644
--- a/external/vulkancts/framework/vulkan/vkConcreteInstanceInterface.inl
+++ b/external/vulkancts/framework/vulkan/vkConcreteInstanceInterface.inl
@@ -37,6 +37,8 @@
virtual VkResult createDisplayModeKHR (VkPhysicalDevice physicalDevice, VkDisplayKHR display, const VkDisplayModeCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDisplayModeKHR* pMode) const;
virtual VkResult getDisplayPlaneCapabilitiesKHR (VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode, deUint32 planeIndex, VkDisplayPlaneCapabilitiesKHR* pCapabilities) const;
virtual VkResult createDisplayPlaneSurfaceKHR (VkInstance instance, const VkDisplaySurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const;
+virtual VkResult enumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, deUint32* pCounterCount, VkPerformanceCounterKHR* pCounters, VkPerformanceCounterDescriptionKHR* pCounterDescriptions) const;
+virtual void getPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR (VkPhysicalDevice physicalDevice, const VkQueryPoolPerformanceCreateInfoKHR* pPerformanceQueryCreateInfo, deUint32* pNumPasses) const;
virtual VkResult getPhysicalDeviceSurfaceCapabilities2KHR (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, VkSurfaceCapabilities2KHR* pSurfaceCapabilities) const;
virtual VkResult getPhysicalDeviceSurfaceFormats2KHR (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, deUint32* pSurfaceFormatCount, VkSurfaceFormat2KHR* pSurfaceFormats) const;
virtual VkResult getPhysicalDeviceDisplayProperties2KHR (VkPhysicalDevice physicalDevice, deUint32* pPropertyCount, VkDisplayProperties2KHR* pProperties) const;
diff --git a/external/vulkancts/framework/vulkan/vkCoreFunctionalities.inl b/external/vulkancts/framework/vulkan/vkCoreFunctionalities.inl
index 4513861..3d19478 100644
--- a/external/vulkancts/framework/vulkan/vkCoreFunctionalities.inl
+++ b/external/vulkancts/framework/vulkan/vkCoreFunctionalities.inl
@@ -18,6 +18,7 @@
apis.clear();
apis.insert(::std::pair<deUint32, FunctionInfosList>(VK_API_VERSION_1_0, FunctionInfosList()));
apis.insert(::std::pair<deUint32, FunctionInfosList>(VK_API_VERSION_1_1, FunctionInfosList()));
+ apis.insert(::std::pair<deUint32, FunctionInfosList>(VK_API_VERSION_1_2, FunctionInfosList()));
apis[VK_API_VERSION_1_0].push_back(FunctionInfo("vkCreateInstance", FUNCTIONORIGIN_PLATFORM));
apis[VK_API_VERSION_1_0].push_back(FunctionInfo("vkDestroyInstance", FUNCTIONORIGIN_INSTANCE));
@@ -322,5 +323,185 @@
apis[VK_API_VERSION_1_1].push_back(FunctionInfo("vkGetPhysicalDeviceExternalFenceProperties", FUNCTIONORIGIN_INSTANCE));
apis[VK_API_VERSION_1_1].push_back(FunctionInfo("vkGetPhysicalDeviceExternalSemaphoreProperties", FUNCTIONORIGIN_INSTANCE));
apis[VK_API_VERSION_1_1].push_back(FunctionInfo("vkGetDescriptorSetLayoutSupport", FUNCTIONORIGIN_DEVICE));
+
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCreateInstance", FUNCTIONORIGIN_PLATFORM));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkDestroyInstance", FUNCTIONORIGIN_INSTANCE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkEnumeratePhysicalDevices", FUNCTIONORIGIN_INSTANCE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetPhysicalDeviceFeatures", FUNCTIONORIGIN_INSTANCE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetPhysicalDeviceFormatProperties", FUNCTIONORIGIN_INSTANCE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetPhysicalDeviceImageFormatProperties", FUNCTIONORIGIN_INSTANCE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetPhysicalDeviceProperties", FUNCTIONORIGIN_INSTANCE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetPhysicalDeviceQueueFamilyProperties", FUNCTIONORIGIN_INSTANCE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetPhysicalDeviceMemoryProperties", FUNCTIONORIGIN_INSTANCE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetInstanceProcAddr", FUNCTIONORIGIN_PLATFORM));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetDeviceProcAddr", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCreateDevice", FUNCTIONORIGIN_INSTANCE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkDestroyDevice", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkEnumerateInstanceExtensionProperties", FUNCTIONORIGIN_PLATFORM));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkEnumerateDeviceExtensionProperties", FUNCTIONORIGIN_INSTANCE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkEnumerateInstanceLayerProperties", FUNCTIONORIGIN_PLATFORM));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkEnumerateDeviceLayerProperties", FUNCTIONORIGIN_INSTANCE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetDeviceQueue", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkQueueSubmit", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkQueueWaitIdle", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkDeviceWaitIdle", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkAllocateMemory", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkFreeMemory", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkMapMemory", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkUnmapMemory", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkFlushMappedMemoryRanges", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkInvalidateMappedMemoryRanges", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetDeviceMemoryCommitment", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkBindBufferMemory", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkBindImageMemory", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetBufferMemoryRequirements", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetImageMemoryRequirements", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetImageSparseMemoryRequirements", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetPhysicalDeviceSparseImageFormatProperties", FUNCTIONORIGIN_INSTANCE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkQueueBindSparse", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCreateFence", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkDestroyFence", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkResetFences", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetFenceStatus", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkWaitForFences", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCreateSemaphore", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkDestroySemaphore", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCreateEvent", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkDestroyEvent", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetEventStatus", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkSetEvent", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkResetEvent", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCreateQueryPool", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkDestroyQueryPool", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetQueryPoolResults", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCreateBuffer", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkDestroyBuffer", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCreateBufferView", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkDestroyBufferView", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCreateImage", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkDestroyImage", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetImageSubresourceLayout", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCreateImageView", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkDestroyImageView", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCreateShaderModule", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkDestroyShaderModule", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCreatePipelineCache", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkDestroyPipelineCache", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetPipelineCacheData", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkMergePipelineCaches", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCreateGraphicsPipelines", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCreateComputePipelines", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkDestroyPipeline", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCreatePipelineLayout", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkDestroyPipelineLayout", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCreateSampler", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkDestroySampler", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCreateDescriptorSetLayout", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkDestroyDescriptorSetLayout", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCreateDescriptorPool", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkDestroyDescriptorPool", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkResetDescriptorPool", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkAllocateDescriptorSets", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkFreeDescriptorSets", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkUpdateDescriptorSets", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCreateFramebuffer", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkDestroyFramebuffer", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCreateRenderPass", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkDestroyRenderPass", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetRenderAreaGranularity", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCreateCommandPool", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkDestroyCommandPool", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkResetCommandPool", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkAllocateCommandBuffers", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkFreeCommandBuffers", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkBeginCommandBuffer", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkEndCommandBuffer", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkResetCommandBuffer", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdBindPipeline", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdSetViewport", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdSetScissor", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdSetLineWidth", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdSetDepthBias", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdSetBlendConstants", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdSetDepthBounds", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdSetStencilCompareMask", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdSetStencilWriteMask", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdSetStencilReference", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdBindDescriptorSets", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdBindIndexBuffer", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdBindVertexBuffers", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdDraw", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdDrawIndexed", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdDrawIndirect", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdDrawIndexedIndirect", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdDispatch", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdDispatchIndirect", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdCopyBuffer", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdCopyImage", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdBlitImage", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdCopyBufferToImage", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdCopyImageToBuffer", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdUpdateBuffer", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdFillBuffer", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdClearColorImage", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdClearDepthStencilImage", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdClearAttachments", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdResolveImage", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdSetEvent", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdResetEvent", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdWaitEvents", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdPipelineBarrier", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdBeginQuery", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdEndQuery", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdResetQueryPool", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdWriteTimestamp", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdCopyQueryPoolResults", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdPushConstants", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdBeginRenderPass", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdNextSubpass", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdEndRenderPass", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdExecuteCommands", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkEnumerateInstanceVersion", FUNCTIONORIGIN_PLATFORM));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkBindBufferMemory2", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkBindImageMemory2", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetDeviceGroupPeerMemoryFeatures", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdSetDeviceMask", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdDispatchBase", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkEnumeratePhysicalDeviceGroups", FUNCTIONORIGIN_INSTANCE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetImageMemoryRequirements2", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetBufferMemoryRequirements2", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetImageSparseMemoryRequirements2", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetPhysicalDeviceFeatures2", FUNCTIONORIGIN_INSTANCE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetPhysicalDeviceProperties2", FUNCTIONORIGIN_INSTANCE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetPhysicalDeviceFormatProperties2", FUNCTIONORIGIN_INSTANCE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetPhysicalDeviceImageFormatProperties2", FUNCTIONORIGIN_INSTANCE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetPhysicalDeviceQueueFamilyProperties2", FUNCTIONORIGIN_INSTANCE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetPhysicalDeviceMemoryProperties2", FUNCTIONORIGIN_INSTANCE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetPhysicalDeviceSparseImageFormatProperties2", FUNCTIONORIGIN_INSTANCE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkTrimCommandPool", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetDeviceQueue2", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCreateSamplerYcbcrConversion", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkDestroySamplerYcbcrConversion", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCreateDescriptorUpdateTemplate", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkDestroyDescriptorUpdateTemplate", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkUpdateDescriptorSetWithTemplate", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetPhysicalDeviceExternalBufferProperties", FUNCTIONORIGIN_INSTANCE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetPhysicalDeviceExternalFenceProperties", FUNCTIONORIGIN_INSTANCE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetPhysicalDeviceExternalSemaphoreProperties", FUNCTIONORIGIN_INSTANCE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetDescriptorSetLayoutSupport", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdDrawIndirectCount", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdDrawIndexedIndirectCount", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCreateRenderPass2", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdBeginRenderPass2", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdNextSubpass2", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkCmdEndRenderPass2", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkResetQueryPool", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetSemaphoreCounterValue", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkWaitSemaphores", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkSignalSemaphore", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetBufferDeviceAddress", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetBufferOpaqueCaptureAddress", FUNCTIONORIGIN_DEVICE));
+ apis[VK_API_VERSION_1_2].push_back(FunctionInfo("vkGetDeviceMemoryOpaqueCaptureAddress", FUNCTIONORIGIN_DEVICE));
+
}
diff --git a/external/vulkancts/framework/vulkan/vkDefs.hpp b/external/vulkancts/framework/vulkan/vkDefs.hpp
index 8251276..8335792 100644
--- a/external/vulkancts/framework/vulkan/vkDefs.hpp
+++ b/external/vulkancts/framework/vulkan/vkDefs.hpp
@@ -107,6 +107,8 @@
SPIRV_VERSION_1_1 = 1, //!< SPIR-V 1.1
SPIRV_VERSION_1_2 = 2, //!< SPIR-V 1.2
SPIRV_VERSION_1_3 = 3, //!< SPIR-V 1.3
+ SPIRV_VERSION_1_4 = 4, //!< SPIR-V 1.4
+ SPIRV_VERSION_1_5 = 5, //!< SPIR-V 1.5
SPIRV_VERSION_LAST
};
diff --git a/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl b/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl
index 9b6c54f..298c2bf 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl
@@ -687,6 +687,71 @@
m_vk.getDescriptorSetLayoutSupport(device, pCreateInfo, pSupport);
}
+void DeviceDriver::cmdDrawIndirectCount (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const
+{
+ m_vk.cmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+}
+
+void DeviceDriver::cmdDrawIndexedIndirectCount (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const
+{
+ m_vk.cmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+}
+
+VkResult DeviceDriver::createRenderPass2 (VkDevice device, const VkRenderPassCreateInfo2* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass) const
+{
+ return m_vk.createRenderPass2(device, pCreateInfo, pAllocator, pRenderPass);
+}
+
+void DeviceDriver::cmdBeginRenderPass2 (VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, const VkSubpassBeginInfo* pSubpassBeginInfo) const
+{
+ m_vk.cmdBeginRenderPass2(commandBuffer, pRenderPassBegin, pSubpassBeginInfo);
+}
+
+void DeviceDriver::cmdNextSubpass2 (VkCommandBuffer commandBuffer, const VkSubpassBeginInfo* pSubpassBeginInfo, const VkSubpassEndInfo* pSubpassEndInfo) const
+{
+ m_vk.cmdNextSubpass2(commandBuffer, pSubpassBeginInfo, pSubpassEndInfo);
+}
+
+void DeviceDriver::cmdEndRenderPass2 (VkCommandBuffer commandBuffer, const VkSubpassEndInfo* pSubpassEndInfo) const
+{
+ m_vk.cmdEndRenderPass2(commandBuffer, pSubpassEndInfo);
+}
+
+void DeviceDriver::resetQueryPool (VkDevice device, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount) const
+{
+ m_vk.resetQueryPool(device, queryPool, firstQuery, queryCount);
+}
+
+VkResult DeviceDriver::getSemaphoreCounterValue (VkDevice device, VkSemaphore semaphore, deUint64* pValue) const
+{
+ return m_vk.getSemaphoreCounterValue(device, semaphore, pValue);
+}
+
+VkResult DeviceDriver::waitSemaphores (VkDevice device, const VkSemaphoreWaitInfo* pWaitInfo, deUint64 timeout) const
+{
+ return m_vk.waitSemaphores(device, pWaitInfo, timeout);
+}
+
+VkResult DeviceDriver::signalSemaphore (VkDevice device, const VkSemaphoreSignalInfo* pSignalInfo) const
+{
+ return m_vk.signalSemaphore(device, pSignalInfo);
+}
+
+VkDeviceAddress DeviceDriver::getBufferDeviceAddress (VkDevice device, const VkBufferDeviceAddressInfo* pInfo) const
+{
+ return m_vk.getBufferDeviceAddress(device, pInfo);
+}
+
+uint64_t DeviceDriver::getBufferOpaqueCaptureAddress (VkDevice device, const VkBufferDeviceAddressInfo* pInfo) const
+{
+ return m_vk.getBufferOpaqueCaptureAddress(device, pInfo);
+}
+
+uint64_t DeviceDriver::getDeviceMemoryOpaqueCaptureAddress (VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo) const
+{
+ return m_vk.getDeviceMemoryOpaqueCaptureAddress(device, pInfo);
+}
+
VkResult DeviceDriver::createSwapchainKHR (VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain) const
{
return m_vk.createSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
@@ -762,26 +827,6 @@
m_vk.cmdPushDescriptorSetWithTemplateKHR(commandBuffer, descriptorUpdateTemplate, layout, set, pData);
}
-VkResult DeviceDriver::createRenderPass2KHR (VkDevice device, const VkRenderPassCreateInfo2KHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass) const
-{
- return m_vk.createRenderPass2KHR(device, pCreateInfo, pAllocator, pRenderPass);
-}
-
-void DeviceDriver::cmdBeginRenderPass2KHR (VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, const VkSubpassBeginInfoKHR* pSubpassBeginInfo) const
-{
- m_vk.cmdBeginRenderPass2KHR(commandBuffer, pRenderPassBegin, pSubpassBeginInfo);
-}
-
-void DeviceDriver::cmdNextSubpass2KHR (VkCommandBuffer commandBuffer, const VkSubpassBeginInfoKHR* pSubpassBeginInfo, const VkSubpassEndInfoKHR* pSubpassEndInfo) const
-{
- m_vk.cmdNextSubpass2KHR(commandBuffer, pSubpassBeginInfo, pSubpassEndInfo);
-}
-
-void DeviceDriver::cmdEndRenderPass2KHR (VkCommandBuffer commandBuffer, const VkSubpassEndInfoKHR* pSubpassEndInfo) const
-{
- m_vk.cmdEndRenderPass2KHR(commandBuffer, pSubpassEndInfo);
-}
-
VkResult DeviceDriver::getSwapchainStatusKHR (VkDevice device, VkSwapchainKHR swapchain) const
{
return m_vk.getSwapchainStatusKHR(device, swapchain);
@@ -797,14 +842,14 @@
return m_vk.getFenceFdKHR(device, pGetFdInfo, pFd);
}
-void DeviceDriver::cmdDrawIndirectCountKHR (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const
+VkResult DeviceDriver::acquireProfilingLockKHR (VkDevice device, const VkAcquireProfilingLockInfoKHR* pInfo) const
{
- m_vk.cmdDrawIndirectCountKHR(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+ return m_vk.acquireProfilingLockKHR(device, pInfo);
}
-void DeviceDriver::cmdDrawIndexedIndirectCountKHR (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const
+void DeviceDriver::releaseProfilingLockKHR (VkDevice device) const
{
- m_vk.cmdDrawIndexedIndirectCountKHR(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+ m_vk.releaseProfilingLockKHR(device);
}
VkResult DeviceDriver::getPipelineExecutablePropertiesKHR (VkDevice device, const VkPipelineInfoKHR* pPipelineInfo, deUint32* pExecutableCount, VkPipelineExecutablePropertiesKHR* pProperties) const
@@ -822,21 +867,6 @@
return m_vk.getPipelineExecutableInternalRepresentationsKHR(device, pExecutableInfo, pInternalRepresentationCount, pInternalRepresentations);
}
-VkResult DeviceDriver::getSemaphoreCounterValueKHR (VkDevice device, VkSemaphore semaphore, deUint64* pValue) const
-{
- return m_vk.getSemaphoreCounterValueKHR(device, semaphore, pValue);
-}
-
-VkResult DeviceDriver::waitSemaphoresKHR (VkDevice device, const VkSemaphoreWaitInfoKHR* pWaitInfo, deUint64 timeout) const
-{
- return m_vk.waitSemaphoresKHR(device, pWaitInfo, timeout);
-}
-
-VkResult DeviceDriver::signalSemaphoreKHR (VkDevice device, const VkSemaphoreSignalInfoKHR* pSignalInfo) const
-{
- return m_vk.signalSemaphoreKHR(device, pSignalInfo);
-}
-
VkResult DeviceDriver::debugMarkerSetObjectTagEXT (VkDevice device, const VkDebugMarkerObjectTagInfoEXT* pTagInfo) const
{
return m_vk.debugMarkerSetObjectTagEXT(device, pTagInfo);
@@ -1197,19 +1227,64 @@
m_vk.getQueueCheckpointDataNV(queue, pCheckpointDataCount, pCheckpointData);
}
+VkResult DeviceDriver::initializePerformanceApiINTEL (VkDevice device, const VkInitializePerformanceApiInfoINTEL* pInitializeInfo) const
+{
+ return m_vk.initializePerformanceApiINTEL(device, pInitializeInfo);
+}
+
+void DeviceDriver::uninitializePerformanceApiINTEL (VkDevice device) const
+{
+ m_vk.uninitializePerformanceApiINTEL(device);
+}
+
+VkResult DeviceDriver::cmdSetPerformanceMarkerINTEL (VkCommandBuffer commandBuffer, const VkPerformanceMarkerInfoINTEL* pMarkerInfo) const
+{
+ return m_vk.cmdSetPerformanceMarkerINTEL(commandBuffer, pMarkerInfo);
+}
+
+VkResult DeviceDriver::cmdSetPerformanceStreamMarkerINTEL (VkCommandBuffer commandBuffer, const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo) const
+{
+ return m_vk.cmdSetPerformanceStreamMarkerINTEL(commandBuffer, pMarkerInfo);
+}
+
+VkResult DeviceDriver::cmdSetPerformanceOverrideINTEL (VkCommandBuffer commandBuffer, const VkPerformanceOverrideInfoINTEL* pOverrideInfo) const
+{
+ return m_vk.cmdSetPerformanceOverrideINTEL(commandBuffer, pOverrideInfo);
+}
+
+VkResult DeviceDriver::acquirePerformanceConfigurationINTEL (VkDevice device, const VkPerformanceConfigurationAcquireInfoINTEL* pAcquireInfo, VkPerformanceConfigurationINTEL* pConfiguration) const
+{
+ return m_vk.acquirePerformanceConfigurationINTEL(device, pAcquireInfo, pConfiguration);
+}
+
+VkResult DeviceDriver::releasePerformanceConfigurationINTEL (VkDevice device, VkPerformanceConfigurationINTEL configuration) const
+{
+ return m_vk.releasePerformanceConfigurationINTEL(device, configuration);
+}
+
+VkResult DeviceDriver::queueSetPerformanceConfigurationINTEL (VkQueue queue, VkPerformanceConfigurationINTEL configuration) const
+{
+ return m_vk.queueSetPerformanceConfigurationINTEL(queue, configuration);
+}
+
+VkResult DeviceDriver::getPerformanceParameterINTEL (VkDevice device, VkPerformanceParameterTypeINTEL parameter, VkPerformanceValueINTEL* pValue) const
+{
+ return m_vk.getPerformanceParameterINTEL(device, parameter, pValue);
+}
+
void DeviceDriver::setLocalDimmingAMD (VkDevice device, VkSwapchainKHR swapChain, VkBool32 localDimmingEnable) const
{
m_vk.setLocalDimmingAMD(device, swapChain, localDimmingEnable);
}
-VkDeviceAddress DeviceDriver::getBufferDeviceAddressEXT (VkDevice device, const VkBufferDeviceAddressInfoEXT* pInfo) const
+VkDeviceAddress DeviceDriver::getBufferDeviceAddressEXT (VkDevice device, const VkBufferDeviceAddressInfo* pInfo) const
{
return m_vk.getBufferDeviceAddressEXT(device, pInfo);
}
-void DeviceDriver::resetQueryPoolEXT (VkDevice device, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount) const
+void DeviceDriver::cmdSetLineStippleEXT (VkCommandBuffer commandBuffer, deUint32 lineStippleFactor, deUint16 lineStipplePattern) const
{
- m_vk.resetQueryPoolEXT(device, queryPool, firstQuery, queryCount);
+ m_vk.cmdSetLineStippleEXT(commandBuffer, lineStippleFactor, lineStipplePattern);
}
VkResult DeviceDriver::getAndroidHardwareBufferPropertiesANDROID (VkDevice device, const struct pt::AndroidHardwareBufferPtr buffer, VkAndroidHardwareBufferPropertiesANDROID* pProperties) const
diff --git a/external/vulkancts/framework/vulkan/vkDeviceExtensions.inl b/external/vulkancts/framework/vulkan/vkDeviceExtensions.inl
index 3d71271..7d37f40 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceExtensions.inl
+++ b/external/vulkancts/framework/vulkan/vkDeviceExtensions.inl
@@ -47,8 +47,18 @@
"VK_KHR_vulkan_memory_model",
"VK_KHR_uniform_buffer_standard_layout",
"VK_KHR_imageless_framebuffer",
- "VK_KHR_pipeline_executable_properties",
+ "VK_KHR_shader_subgroup_extended_types",
+ "VK_EXT_sampler_filter_minmax",
+ "VK_EXT_shader_viewport_index_layer",
+ "VK_EXT_descriptor_indexing",
+ "VK_EXT_scalar_block_layout",
+ "VK_KHR_buffer_device_address",
+ "VK_EXT_host_query_reset",
+ "VK_KHR_separate_depth_stencil_layouts",
"VK_KHR_timeline_semaphore",
+ "VK_KHR_spirv_1_4",
+ "VK_EXT_separate_stencil_usage",
+ "VK_KHR_pipeline_executable_properties",
"VK_KHR_shader_clock",
};
diff --git a/external/vulkancts/framework/vulkan/vkDeviceFeatures.cpp b/external/vulkancts/framework/vulkan/vkDeviceFeatures.cpp
index b403cb6..9eed63f 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceFeatures.cpp
+++ b/external/vulkancts/framework/vulkan/vkDeviceFeatures.cpp
@@ -26,44 +26,77 @@
namespace vk
{
-static bool isPhysicalDeviceFeatures2Supported (const deUint32 version, const std::vector<std::string>& instanceExtensions)
-{
- return isInstanceExtensionSupported(version, instanceExtensions, "VK_KHR_get_physical_device_properties2");
-}
-
DeviceFeatures::DeviceFeatures (const InstanceInterface& vki,
const deUint32 apiVersion,
const VkPhysicalDevice physicalDevice,
const std::vector<std::string>& instanceExtensions,
const std::vector<std::string>& deviceExtensions)
{
- deMemset(&m_coreFeatures2, 0, sizeof(m_coreFeatures2));
- m_coreFeatures2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
+ m_coreFeatures2 = initVulkanStructure();
+ m_vulkan11Features = initVulkanStructure();
+ m_vulkan12Features = initVulkanStructure();
- if (isPhysicalDeviceFeatures2Supported(apiVersion, instanceExtensions))
+ if (isInstanceExtensionSupported(apiVersion, instanceExtensions, "VK_KHR_get_physical_device_properties2"))
{
const std::vector<VkExtensionProperties> deviceExtensionProperties = enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
void** nextPtr = &m_coreFeatures2.pNext;
+ std::vector<FeatureStructWrapperBase*> featuresToFillFromBlob;
+ bool vk12Supported = (apiVersion >= VK_MAKE_VERSION(1, 2, 0));
- for (size_t i = 0; i < DE_LENGTH_OF_ARRAY(featureStructCreatorMap); ++i)
+ // in vk12 we have blob structures combining features of couple previously
+ // available feature structures, that now in vk12 must be removed from chain
+ if (vk12Supported)
{
- const char* featureName = featureStructCreatorMap[i].name;
+ addToChainVulkanStructure(&nextPtr, m_vulkan11Features);
+ addToChainVulkanStructure(&nextPtr, m_vulkan12Features);
+ }
- if (de::contains(deviceExtensions.begin(), deviceExtensions.end(), featureName)
- && verifyFeatureAddCriteria(featureStructCreatorMap[i], deviceExtensionProperties))
+ // iterate over data for all feature that are defined in specification
+ for (const auto& featureStructCreationData : featureStructCreationArray)
+ {
+ const char* featureName = featureStructCreationData.name;
+
+ // check if this feature is available on current device
+ if (de::contains(deviceExtensions.begin(), deviceExtensions.end(), featureName) &&
+ verifyFeatureAddCriteria(featureStructCreationData, deviceExtensionProperties))
{
- FeatureStruct* p = createFeatureStructWrapper(featureName);
+ FeatureStructWrapperBase* p = (*featureStructCreationData.creatorFunction)();
+ if (p == DE_NULL)
+ continue;
- if (p)
+ // if feature struct is part of VkPhysicalDeviceVulkan1{1,2}Features
+ // we dont add it to the chain but store and fill later from blob data
+ bool featureFilledFromBlob = false;
+ if (vk12Supported)
+ featureFilledFromBlob = isPartOfBlobFeatures(p->getFeatureDesc().sType);
+
+ if (featureFilledFromBlob)
+ featuresToFillFromBlob.push_back(p);
+ else
{
+ // add to chain
*nextPtr = p->getFeatureTypeRaw();
nextPtr = p->getFeatureTypeNext();
- m_features.push_back(p);
}
+ m_features.push_back(p);
}
}
vki.getPhysicalDeviceFeatures2(physicalDevice, &m_coreFeatures2);
+
+ // fill data from VkPhysicalDeviceVulkan1{1,2}Features
+ if (vk12Supported)
+ {
+ AllBlobs allBlobs =
+ {
+ m_vulkan11Features,
+ m_vulkan12Features,
+ // add blobs from future vulkan versions here
+ };
+
+ for (auto feature : featuresToFillFromBlob)
+ feature->initializeFromBlob(allBlobs);
+ }
}
else
m_coreFeatures2.features = getPhysicalDeviceFeatures(vki, physicalDevice);
@@ -72,67 +105,51 @@
m_coreFeatures2.features.robustBufferAccess = false;
}
-bool DeviceFeatures::verifyFeatureAddCriteria (const FeatureStructMapItem& item, const std::vector<VkExtensionProperties>& properties)
+bool DeviceFeatures::verifyFeatureAddCriteria (const FeatureStructCreationData& item, const std::vector<VkExtensionProperties>& properties)
{
- bool criteriaOK = true;
-
if (deStringEqual(item.name, VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME))
{
- const size_t propSize = properties.size();
-
- for (size_t propIdx = 0; propIdx < propSize; ++propIdx)
+ for (const auto& property : properties)
{
- if (deStringEqual(properties[propIdx].extensionName, item.name))
- {
- criteriaOK = properties[propIdx].specVersion == item.specVersion;
- break;
- }
+ if (deStringEqual(property.extensionName, item.name))
+ return (property.specVersion == item.specVersion);
}
}
- return criteriaOK;
+ return true;
}
bool DeviceFeatures::contains (const std::string& feature, bool throwIfNotExists) const
{
- const size_t typesSize = m_features.size();
-
- for (size_t typeIdx = 0; typeIdx < typesSize; ++typeIdx)
+ for (const auto f : m_features)
{
- if (deStringEqual(m_features[typeIdx]->getFeatureDesc().name, feature.c_str()))
- {
+ if (deStringEqual(f->getFeatureDesc().name, feature.c_str()))
return true;
- }
}
if (throwIfNotExists)
+ TCU_THROW(NotSupportedError, "Feature " + feature + " is not supported");
+
+ return false;
+}
+
+bool DeviceFeatures::isDeviceFeatureInitialized (VkStructureType sType) const
+{
+ for (const auto f : m_features)
{
- std::string msg("Feature " + feature + " is not supported");
-
- TCU_THROW(NotSupportedError, msg);
+ if (f->getFeatureDesc().sType == sType)
+ return true;
}
-
return false;
}
DeviceFeatures::~DeviceFeatures (void)
{
- for (size_t i = 0; i < m_features.size(); ++i)
- delete m_features[i];
+ for (auto p : m_features)
+ delete p;
m_features.clear();
}
-FeatureStruct* DeviceFeatures::createFeatureStructWrapper (const std::string& s)
-{
- for (size_t i = 0; i < DE_LENGTH_OF_ARRAY(featureStructCreatorMap); ++i)
- {
- if (deStringEqual(featureStructCreatorMap[i].name, s.c_str()))
- return (*featureStructCreatorMap[i].creator)();
- }
-
- return DE_NULL;
-}
-
} // vk
diff --git a/external/vulkancts/framework/vulkan/vkDeviceFeatures.hpp b/external/vulkancts/framework/vulkan/vkDeviceFeatures.hpp
index 966e94d..0301978 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceFeatures.hpp
+++ b/external/vulkancts/framework/vulkan/vkDeviceFeatures.hpp
@@ -34,144 +34,151 @@
namespace vk
{
+// Structure describing vulkan feature structure
struct FeatureDesc
{
- FeatureDesc (VkStructureType sType_, const char* name_, deUint32 specVersion_, deUint32 typeId_)
- : name (name_)
- , sType (sType_)
- , specVersion (specVersion_)
- , typeId (typeId_)
- {}
-
- const char* name;
VkStructureType sType;
+ const char* name;
const deUint32 specVersion;
const deUint32 typeId;
};
-struct FeatureStruct
+// Structure containg all feature blobs - this simplifies generated code
+struct AllBlobs
{
- virtual deUint32 getFeatureTypeId (void) const = 0;
- virtual FeatureDesc getFeatureDesc (void) const = 0;
- virtual void** getFeatureTypeNext (void) = 0;
- virtual void* getFeatureTypeRaw (void) = 0;
- virtual ~FeatureStruct (void) {}
+ VkPhysicalDeviceVulkan11Features& vk11;
+ VkPhysicalDeviceVulkan12Features& vk12;
+ // add blobs from future vulkan versions here
};
-
-struct FeatureStructMapItem
+// Base class for all FeatureStructWrapper specializations
+class FeatureStructWrapperBase
{
- FeatureStruct* (*creator)(void);
- const char* name;
- deUint32 specVersion;
+public:
+ virtual ~FeatureStructWrapperBase (void) {}
+ virtual void initializeFromBlob (const AllBlobs& allBlobs) = 0;
+ virtual deUint32 getFeatureTypeId (void) const = 0;
+ virtual FeatureDesc getFeatureDesc (void) const = 0;
+ virtual void** getFeatureTypeNext (void) = 0;
+ virtual void* getFeatureTypeRaw (void) = 0;
};
-template<class FeatureType> struct FeatureStructWrapper;
+using FeatureStructWrapperCreator = FeatureStructWrapperBase* (*) (void);
+struct FeatureStructCreationData
+{
+ FeatureStructWrapperCreator creatorFunction;
+ const char* name;
+ deUint32 specVersion;
+};
+
+template<class FeatureType> class FeatureStructWrapper;
template<class FeatureType> FeatureDesc makeFeatureDesc (void);
template<class FeatureType>
-FeatureStruct* createFeatureStructWrapper (void)
+FeatureStructWrapperBase* createFeatureStructWrapper (void)
{
return new FeatureStructWrapper<FeatureType>(makeFeatureDesc<FeatureType>());
}
+template<class FeatureType>
+void initFromBlob(FeatureType& featureType, const AllBlobs& allBlobs);
+
+template<class FeatureType>
+void initFromBlobWrapper(FeatureType& featureType, const AllBlobs& allBlobs)
+{
+ initFromBlob<FeatureType>(featureType, allBlobs);
+}
+
class DeviceFeatures
{
public:
- DeviceFeatures (const InstanceInterface& vki,
- const deUint32 apiVersion,
- const VkPhysicalDevice physicalDevice,
- const std::vector<std::string>& instanceExtensions,
- const std::vector<std::string>& deviceExtensions);
+ DeviceFeatures (const InstanceInterface& vki,
+ const deUint32 apiVersion,
+ const VkPhysicalDevice physicalDevice,
+ const std::vector<std::string>& instanceExtensions,
+ const std::vector<std::string>& deviceExtensions);
- ~DeviceFeatures (void);
+ ~DeviceFeatures (void);
template<class FeatureType>
- bool getFeatureType (FeatureType& featureType) const
- {
- typedef FeatureStructWrapper<FeatureType> *FeatureWrapperPtr;
+ const FeatureType& getFeatureType (void) const;
- const VkStructureType sType = makeFeatureDesc<FeatureType>().sType;
- const size_t featCount = m_features.size();
+ const VkPhysicalDeviceFeatures2& getCoreFeatures2 (void) const { return m_coreFeatures2; }
+ const VkPhysicalDeviceVulkan11Features& getVulkan11Features (void) const { return m_vulkan11Features; }
+ const VkPhysicalDeviceVulkan12Features& getVulkan12Features (void) const { return m_vulkan12Features; }
- for (size_t featIdx = 0; featIdx < featCount; ++featIdx)
- {
- if (sType == m_features[featIdx]->getFeatureDesc().sType)
- {
- featureType = static_cast<FeatureWrapperPtr>(m_features[featIdx])->getFeatureTypeRef();
- return true;
- }
- }
- return false;
- }
+ bool contains (const std::string& feature, bool throwIfNotExists = false) const;
- template<class FeatureType>
- const FeatureType& getFeatureType (void) const
- {
- typedef FeatureStructWrapper<FeatureType> *FeatureWrapperPtr;
-
- const FeatureDesc featDesc = makeFeatureDesc<FeatureType>();
- const VkStructureType sType = featDesc.sType;
- const size_t featCount = m_features.size();
-
- for (size_t featIdx = 0; featIdx < featCount; ++featIdx)
- {
- if (sType == m_features[featIdx]->getFeatureDesc().sType)
- return static_cast<FeatureWrapperPtr>(m_features[featIdx])->getFeatureTypeRef();
- }
-
- const deUint32 featureId = featDesc.typeId;
-
- for (size_t featIdx = 0; featIdx < featCount; ++featIdx)
- {
- if (featureId == m_features[featIdx]->getFeatureTypeId())
- return static_cast<FeatureWrapperPtr>(m_features[featIdx])->getFeatureTypeRef();
- }
-
- FeatureStruct* p = vk::createFeatureStructWrapper<FeatureType>();
- m_features.push_back(p);
-
- return static_cast<FeatureWrapperPtr>(p)->getFeatureTypeRef();
- }
-
- const VkPhysicalDeviceFeatures2& getCoreFeatures2 (void) const { return m_coreFeatures2; }
-
- bool contains (const std::string& feature, bool throwIfNotExists = false) const;
+ bool isDeviceFeatureInitialized (VkStructureType sType) const;
private:
- static FeatureStruct* createFeatureStructWrapper (const std::string& s);
+ static bool verifyFeatureAddCriteria (const FeatureStructCreationData& item, const std::vector<VkExtensionProperties>& properties);
- static bool verifyFeatureAddCriteria (const FeatureStructMapItem& item, const std::vector<VkExtensionProperties>& properties);
+private:
- VkPhysicalDeviceFeatures2 m_coreFeatures2;
- mutable std::vector<FeatureStruct*> m_features;
+ VkPhysicalDeviceFeatures2 m_coreFeatures2;
+ mutable std::vector<FeatureStructWrapperBase*> m_features;
+ VkPhysicalDeviceVulkan11Features m_vulkan11Features;
+ VkPhysicalDeviceVulkan12Features m_vulkan12Features;
};
template<class FeatureType>
-struct FeatureStructWrapper : FeatureStruct
+const FeatureType& DeviceFeatures::getFeatureType(void) const
{
+ typedef FeatureStructWrapper<FeatureType>* FeatureWrapperPtr;
+
+ const FeatureDesc featDesc = makeFeatureDesc<FeatureType>();
+ const VkStructureType sType = featDesc.sType;
+
+ // try to find feature by sType
+ for (auto feature : m_features)
+ {
+ if (sType == feature->getFeatureDesc().sType)
+ return static_cast<FeatureWrapperPtr>(feature)->getFeatureTypeRef();
+ }
+
+ // try to find feature by id that was assigned by gen_framework script
+ const deUint32 featureId = featDesc.typeId;
+ for (auto feature : m_features)
+ {
+ if (featureId == feature->getFeatureTypeId())
+ return static_cast<FeatureWrapperPtr>(feature)->getFeatureTypeRef();
+ }
+
+ // if initialized feature structure was not found create empty one and return it
+ m_features.push_back(vk::createFeatureStructWrapper<FeatureType>());
+ return static_cast<FeatureWrapperPtr>(m_features.back())->getFeatureTypeRef();
+}
+
+template<class FeatureType>
+class FeatureStructWrapper : public FeatureStructWrapperBase
+{
+public:
+ FeatureStructWrapper (const FeatureDesc& featureDesc)
+ : m_featureDesc(featureDesc)
+ {
+ deMemset(&m_featureType, 0, sizeof(m_featureType));
+ m_featureType.sType = featureDesc.sType;
+ }
+
+ void initializeFromBlob (const AllBlobs& allBlobs)
+ {
+ initFromBlobWrapper(m_featureType, allBlobs);
+ }
+
+ deUint32 getFeatureTypeId (void) const { return m_featureDesc.typeId; }
+ FeatureDesc getFeatureDesc (void) const { return m_featureDesc; }
+ void** getFeatureTypeNext (void) { return &m_featureType.pNext; }
+ void* getFeatureTypeRaw (void) { return &m_featureType; }
+ FeatureType& getFeatureTypeRef (void) { return m_featureType; }
+
+public:
+ // metadata about feature structure
const FeatureDesc m_featureDesc;
+
+ // actual vulkan feature structure
FeatureType m_featureType;
-
- FeatureStructWrapper (void)
- : m_featureDesc (VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2, DE_NULL, ~0u, 0u)
- {
- deMemset(&m_featureType, 0, sizeof(m_featureType));
- }
-
- FeatureStructWrapper (const FeatureDesc& featureDesc)
- : m_featureDesc (featureDesc)
- {
- deMemset(&m_featureType, 0, sizeof(m_featureType));
- m_featureType.sType = featureDesc.sType;
- }
-
- deUint32 getFeatureTypeId (void) const { return m_featureDesc.typeId; }
- FeatureDesc getFeatureDesc (void) const { return m_featureDesc; }
- void** getFeatureTypeNext (void) { return &m_featureType.pNext; }
- void* getFeatureTypeRaw (void) { return &m_featureType; }
- FeatureType& getFeatureTypeRef (void) { return m_featureType; }
};
} // vk
diff --git a/external/vulkancts/framework/vulkan/vkDeviceFeatures.inl b/external/vulkancts/framework/vulkan/vkDeviceFeatures.inl
index 4cb45d4..e6618fb 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceFeatures.inl
+++ b/external/vulkancts/framework/vulkan/vkDeviceFeatures.inl
@@ -5,138 +5,342 @@
namespace vk
{
-#define DECL_PROTECTED_MEMORY_EXTENSION_NAME "not_existent_feature"
-#define VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME "VK_KHR_shader_draw_parameters"
-#define VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME "VK_EXT_transform_feedback"
-#define VK_NV_CORNER_SAMPLED_IMAGE_EXTENSION_NAME "VK_NV_corner_sampled_image"
-#define VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME "VK_EXT_conditional_rendering"
-#define VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME "VK_KHR_shader_float16_int8"
-#define VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME "VK_EXT_depth_clip_enable"
-#define VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME "VK_KHR_imageless_framebuffer"
-#define VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME "VK_EXT_inline_uniform_block"
-#define VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME "VK_EXT_blend_operation_advanced"
-#define VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME "VK_EXT_descriptor_indexing"
-#define VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME "VK_NV_shading_rate_image"
-#define VK_NV_REPRESENTATIVE_FRAGMENT_TEST_EXTENSION_NAME "VK_NV_representative_fragment_test"
+#define VK_KHR_16BIT_STORAGE_EXTENSION_NAME "VK_KHR_16bit_storage"
#define VK_KHR_8BIT_STORAGE_EXTENSION_NAME "VK_KHR_8bit_storage"
+#define VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME "VK_EXT_blend_operation_advanced"
+#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_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"
+#define VK_NV_CORNER_SAMPLED_IMAGE_EXTENSION_NAME "VK_NV_corner_sampled_image"
+#define VK_NV_COVERAGE_REDUCTION_MODE_EXTENSION_NAME "VK_NV_coverage_reduction_mode"
+#define VK_NV_DEDICATED_ALLOCATION_IMAGE_ALIASING_EXTENSION_NAME "VK_NV_dedicated_allocation_image_aliasing"
+#define VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME "VK_EXT_depth_clip_enable"
+#define VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME "VK_EXT_descriptor_indexing"
+#define VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME "VK_NV_scissor_exclusive"
+#define VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME "VK_EXT_fragment_density_map"
+#define VK_NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME "VK_NV_fragment_shader_barycentric"
+#define VK_EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME "VK_EXT_fragment_shader_interlock"
+#define VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME "VK_EXT_host_query_reset"
+#define VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME "VK_KHR_imageless_framebuffer"
+#define VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME "VK_EXT_index_type_uint8"
+#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"
+#define VK_NV_MESH_SHADER_EXTENSION_NAME "VK_NV_mesh_shader"
+#define VK_KHR_MULTIVIEW_EXTENSION_NAME "VK_KHR_multiview"
+#define VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME "VK_KHR_performance_query"
+#define VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME "VK_KHR_pipeline_executable_properties"
+#define DECL_PROTECTED_MEMORY_EXTENSION_NAME "not_existent_feature"
+#define VK_NV_REPRESENTATIVE_FRAGMENT_TEST_EXTENSION_NAME "VK_NV_representative_fragment_test"
+#define VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME "VK_KHR_sampler_ycbcr_conversion"
+#define VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME "VK_EXT_scalar_block_layout"
+#define VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME "VK_KHR_separate_depth_stencil_layouts"
#define VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME "VK_KHR_shader_atomic_int64"
#define VK_KHR_SHADER_CLOCK_EXTENSION_NAME "VK_KHR_shader_clock"
-#define VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME "VK_EXT_vertex_attribute_divisor"
-#define VK_NV_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME "VK_NV_compute_shader_derivatives"
-#define VK_NV_MESH_SHADER_EXTENSION_NAME "VK_NV_mesh_shader"
-#define VK_NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME "VK_NV_fragment_shader_barycentric"
-#define VK_NV_SHADER_IMAGE_FOOTPRINT_EXTENSION_NAME "VK_NV_shader_image_footprint"
-#define VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME "VK_NV_scissor_exclusive"
-#define VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME "VK_KHR_timeline_semaphore"
-#define VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME "VK_KHR_vulkan_memory_model"
-#define VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME "VK_EXT_fragment_density_map"
-#define VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME "VK_EXT_scalar_block_layout"
-#define VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME "VK_EXT_memory_priority"
-#define VK_NV_DEDICATED_ALLOCATION_IMAGE_ALIASING_EXTENSION_NAME "VK_NV_dedicated_allocation_image_aliasing"
-#define VK_EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME "VK_EXT_buffer_device_address"
-#define VK_NV_COOPERATIVE_MATRIX_EXTENSION_NAME "VK_NV_cooperative_matrix"
-#define VK_NV_COVERAGE_REDUCTION_MODE_EXTENSION_NAME "VK_NV_coverage_reduction_mode"
-#define VK_EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME "VK_EXT_fragment_shader_interlock"
-#define VK_EXT_YCBCR_IMAGE_ARRAYS_EXTENSION_NAME "VK_EXT_ycbcr_image_arrays"
-#define VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME "VK_KHR_uniform_buffer_standard_layout"
-#define VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME "VK_EXT_host_query_reset"
-#define VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME "VK_EXT_index_type_uint8"
#define VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME "VK_EXT_shader_demote_to_helper_invocation"
-#define VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME "VK_KHR_pipeline_executable_properties"
-#define VK_KHR_MULTIVIEW_EXTENSION_NAME "VK_KHR_multiview"
-#define VK_KHR_16BIT_STORAGE_EXTENSION_NAME "VK_KHR_16bit_storage"
+#define VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME "VK_KHR_shader_draw_parameters"
+#define VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME "VK_KHR_shader_float16_int8"
+#define VK_NV_SHADER_IMAGE_FOOTPRINT_EXTENSION_NAME "VK_NV_shader_image_footprint"
+#define VK_INTEL_SHADER_INTEGER_FUNCTIONS_2_EXTENSION_NAME "VK_INTEL_shader_integer_functions2"
+#define VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME "VK_KHR_shader_subgroup_extended_types"
+#define VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME "VK_NV_shading_rate_image"
+#define VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME "VK_EXT_subgroup_size_control"
+#define VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME "VK_EXT_texel_buffer_alignment"
+#define VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME "VK_KHR_timeline_semaphore"
+#define VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME "VK_EXT_transform_feedback"
+#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_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME "VK_KHR_sampler_ycbcr_conversion"
+#define VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME "VK_EXT_vertex_attribute_divisor"
+#define VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME "VK_KHR_vulkan_memory_model"
+#define VK_EXT_YCBCR_IMAGE_ARRAYS_EXTENSION_NAME "VK_EXT_ycbcr_image_arrays"
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceProtectedMemoryFeatures>(void) { return FeatureDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, DECL_PROTECTED_MEMORY_EXTENSION_NAME, 0, 42); }
-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, 41); }
-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, 40); }
-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, 39); }
-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, 38); }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFloat16Int8FeaturesKHR>(void) { return FeatureDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR, VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, VK_KHR_SHADER_FLOAT16_INT8_SPEC_VERSION, 37); }
-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, 36); }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceImagelessFramebufferFeaturesKHR>(void) { return FeatureDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME, VK_KHR_IMAGELESS_FRAMEBUFFER_SPEC_VERSION, 35); }
-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, 34); }
-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, 33); }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDescriptorIndexingFeaturesEXT>(void) { return FeatureDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME, VK_EXT_DESCRIPTOR_INDEXING_SPEC_VERSION, 32); }
-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, 31); }
-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, 30); }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevice8BitStorageFeaturesKHR>(void) { return FeatureDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR, VK_KHR_8BIT_STORAGE_EXTENSION_NAME, VK_KHR_8BIT_STORAGE_SPEC_VERSION, 29); }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderAtomicInt64FeaturesKHR>(void) { return FeatureDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR, VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME, VK_KHR_SHADER_ATOMIC_INT64_SPEC_VERSION, 28); }
-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, 27); }
-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, 26); }
-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, 25); }
-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, 24); }
-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, 23); }
-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, 22); }
-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, 21); }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceTimelineSemaphoreFeaturesKHR>(void) { return FeatureDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR, VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, VK_KHR_TIMELINE_SEMAPHORE_SPEC_VERSION, 20); }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceVulkanMemoryModelFeaturesKHR>(void) { return FeatureDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR, VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME, VK_KHR_VULKAN_MEMORY_MODEL_SPEC_VERSION, 19); }
-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, 18); }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceScalarBlockLayoutFeaturesEXT>(void) { return FeatureDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT, VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME, VK_EXT_SCALAR_BLOCK_LAYOUT_SPEC_VERSION, 17); }
-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, 16); }
-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, 15); }
-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, 14); }
-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, 13); }
-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, 12); }
-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, 11); }
-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, 10); }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR>(void) { return FeatureDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR, VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME, VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_SPEC_VERSION, 9); }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceHostQueryResetFeaturesEXT>(void) { return FeatureDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT, VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME, VK_EXT_HOST_QUERY_RESET_SPEC_VERSION, 8); }
-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, 7); }
-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, 6); }
-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, 5); }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMultiviewFeatures>(void) { return FeatureDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR, VK_KHR_MULTIVIEW_EXTENSION_NAME, VK_KHR_MULTIVIEW_SPEC_VERSION, 4); }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevice16BitStorageFeatures>(void) { return FeatureDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR, VK_KHR_16BIT_STORAGE_EXTENSION_NAME, VK_KHR_16BIT_STORAGE_SPEC_VERSION, 3); }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceVariablePointersFeatures>(void) { return FeatureDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES_KHR, VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, VK_KHR_VARIABLE_POINTERS_SPEC_VERSION, 2); }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceSamplerYcbcrConversionFeatures>(void) { return FeatureDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME, VK_KHR_SAMPLER_YCBCR_CONVERSION_SPEC_VERSION, 1); }
-
-
-static const FeatureStructMapItem featureStructCreatorMap[] =
+template<> void initFromBlob<VkPhysicalDevice16BitStorageFeatures>(VkPhysicalDevice16BitStorageFeatures& featureType, const AllBlobs& allBlobs)
{
- { createFeatureStructWrapper<VkPhysicalDeviceProtectedMemoryFeatures>, DECL_PROTECTED_MEMORY_EXTENSION_NAME, 0 },
- { createFeatureStructWrapper<VkPhysicalDeviceShaderDrawParametersFeatures>, VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME, VK_KHR_SHADER_DRAW_PARAMETERS_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceTransformFeedbackFeaturesEXT>, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, VK_EXT_TRANSFORM_FEEDBACK_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceCornerSampledImageFeaturesNV>, VK_NV_CORNER_SAMPLED_IMAGE_EXTENSION_NAME, VK_NV_CORNER_SAMPLED_IMAGE_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceConditionalRenderingFeaturesEXT>, VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME, VK_EXT_CONDITIONAL_RENDERING_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceFloat16Int8FeaturesKHR>, VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, VK_KHR_SHADER_FLOAT16_INT8_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceDepthClipEnableFeaturesEXT>, VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME, VK_EXT_DEPTH_CLIP_ENABLE_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceImagelessFramebufferFeaturesKHR>, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME, VK_KHR_IMAGELESS_FRAMEBUFFER_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceInlineUniformBlockFeaturesEXT>, VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME, VK_EXT_INLINE_UNIFORM_BLOCK_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT>, VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME, VK_EXT_BLEND_OPERATION_ADVANCED_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceDescriptorIndexingFeaturesEXT>, VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME, VK_EXT_DESCRIPTOR_INDEXING_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceShadingRateImageFeaturesNV>, VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME, VK_NV_SHADING_RATE_IMAGE_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV>, VK_NV_REPRESENTATIVE_FRAGMENT_TEST_EXTENSION_NAME, VK_NV_REPRESENTATIVE_FRAGMENT_TEST_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDevice8BitStorageFeaturesKHR>, VK_KHR_8BIT_STORAGE_EXTENSION_NAME, VK_KHR_8BIT_STORAGE_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceShaderAtomicInt64FeaturesKHR>, VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME, VK_KHR_SHADER_ATOMIC_INT64_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceShaderClockFeaturesKHR>, VK_KHR_SHADER_CLOCK_EXTENSION_NAME, VK_KHR_SHADER_CLOCK_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT>, VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV>, VK_NV_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME, VK_NV_COMPUTE_SHADER_DERIVATIVES_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceMeshShaderFeaturesNV>, VK_NV_MESH_SHADER_EXTENSION_NAME, VK_NV_MESH_SHADER_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV>, VK_NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME, VK_NV_FRAGMENT_SHADER_BARYCENTRIC_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceShaderImageFootprintFeaturesNV>, VK_NV_SHADER_IMAGE_FOOTPRINT_EXTENSION_NAME, VK_NV_SHADER_IMAGE_FOOTPRINT_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceExclusiveScissorFeaturesNV>, VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME, VK_NV_SCISSOR_EXCLUSIVE_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceTimelineSemaphoreFeaturesKHR>, VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, VK_KHR_TIMELINE_SEMAPHORE_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceVulkanMemoryModelFeaturesKHR>, VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME, VK_KHR_VULKAN_MEMORY_MODEL_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceFragmentDensityMapFeaturesEXT>, VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME, VK_EXT_FRAGMENT_DENSITY_MAP_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceScalarBlockLayoutFeaturesEXT>, VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME, VK_EXT_SCALAR_BLOCK_LAYOUT_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceMemoryPriorityFeaturesEXT>, VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME, VK_EXT_MEMORY_PRIORITY_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV>, VK_NV_DEDICATED_ALLOCATION_IMAGE_ALIASING_EXTENSION_NAME, VK_NV_DEDICATED_ALLOCATION_IMAGE_ALIASING_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT>, VK_EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, VK_EXT_BUFFER_DEVICE_ADDRESS_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceCooperativeMatrixFeaturesNV>, VK_NV_COOPERATIVE_MATRIX_EXTENSION_NAME, VK_NV_COOPERATIVE_MATRIX_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceCoverageReductionModeFeaturesNV>, VK_NV_COVERAGE_REDUCTION_MODE_EXTENSION_NAME, VK_NV_COVERAGE_REDUCTION_MODE_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT>, VK_EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME, VK_EXT_FRAGMENT_SHADER_INTERLOCK_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT>, VK_EXT_YCBCR_IMAGE_ARRAYS_EXTENSION_NAME, VK_EXT_YCBCR_IMAGE_ARRAYS_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR>, VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME, VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceHostQueryResetFeaturesEXT>, VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME, VK_EXT_HOST_QUERY_RESET_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceIndexTypeUint8FeaturesEXT>, VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME, VK_EXT_INDEX_TYPE_UINT8_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT>, VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME, VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR>, VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME, VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceMultiviewFeatures>, VK_KHR_MULTIVIEW_EXTENSION_NAME, VK_KHR_MULTIVIEW_SPEC_VERSION },
+ featureType.storageBuffer16BitAccess = allBlobs.vk11.storageBuffer16BitAccess;
+ featureType.uniformAndStorageBuffer16BitAccess = allBlobs.vk11.uniformAndStorageBuffer16BitAccess;
+ featureType.storagePushConstant16 = allBlobs.vk11.storagePushConstant16;
+ featureType.storageInputOutput16 = allBlobs.vk11.storageInputOutput16;
+}
+template<> void initFromBlob<VkPhysicalDeviceMultiviewFeatures>(VkPhysicalDeviceMultiviewFeatures& featureType, const AllBlobs& allBlobs)
+{
+ featureType.multiview = allBlobs.vk11.multiview;
+ featureType.multiviewGeometryShader = allBlobs.vk11.multiviewGeometryShader;
+ featureType.multiviewTessellationShader = allBlobs.vk11.multiviewTessellationShader;
+}
+template<> void initFromBlob<VkPhysicalDeviceVariablePointersFeatures>(VkPhysicalDeviceVariablePointersFeatures& featureType, const AllBlobs& allBlobs)
+{
+ featureType.variablePointersStorageBuffer = allBlobs.vk11.variablePointersStorageBuffer;
+ featureType.variablePointers = allBlobs.vk11.variablePointers;
+}
+template<> void initFromBlob<VkPhysicalDeviceProtectedMemoryFeatures>(VkPhysicalDeviceProtectedMemoryFeatures& featureType, const AllBlobs& allBlobs)
+{
+ featureType.protectedMemory = allBlobs.vk11.protectedMemory;
+}
+template<> void initFromBlob<VkPhysicalDeviceSamplerYcbcrConversionFeatures>(VkPhysicalDeviceSamplerYcbcrConversionFeatures& featureType, const AllBlobs& allBlobs)
+{
+ featureType.samplerYcbcrConversion = allBlobs.vk11.samplerYcbcrConversion;
+}
+template<> void initFromBlob<VkPhysicalDeviceShaderDrawParametersFeatures>(VkPhysicalDeviceShaderDrawParametersFeatures& featureType, const AllBlobs& allBlobs)
+{
+ featureType.shaderDrawParameters = allBlobs.vk11.shaderDrawParameters;
+}
+template<> void initFromBlob<VkPhysicalDevice8BitStorageFeatures>(VkPhysicalDevice8BitStorageFeatures& featureType, const AllBlobs& allBlobs)
+{
+ featureType.storageBuffer8BitAccess = allBlobs.vk12.storageBuffer8BitAccess;
+ featureType.uniformAndStorageBuffer8BitAccess = allBlobs.vk12.uniformAndStorageBuffer8BitAccess;
+ featureType.storagePushConstant8 = allBlobs.vk12.storagePushConstant8;
+}
+template<> void initFromBlob<VkPhysicalDeviceShaderAtomicInt64Features>(VkPhysicalDeviceShaderAtomicInt64Features& featureType, const AllBlobs& allBlobs)
+{
+ featureType.shaderBufferInt64Atomics = allBlobs.vk12.shaderBufferInt64Atomics;
+ featureType.shaderSharedInt64Atomics = allBlobs.vk12.shaderSharedInt64Atomics;
+}
+template<> void initFromBlob<VkPhysicalDeviceShaderFloat16Int8Features>(VkPhysicalDeviceShaderFloat16Int8Features& featureType, const AllBlobs& allBlobs)
+{
+ featureType.shaderFloat16 = allBlobs.vk12.shaderFloat16;
+ featureType.shaderInt8 = allBlobs.vk12.shaderInt8;
+}
+template<> void initFromBlob<VkPhysicalDeviceDescriptorIndexingFeatures>(VkPhysicalDeviceDescriptorIndexingFeatures& featureType, const AllBlobs& allBlobs)
+{
+ featureType.shaderInputAttachmentArrayDynamicIndexing = allBlobs.vk12.shaderInputAttachmentArrayDynamicIndexing;
+ featureType.shaderUniformTexelBufferArrayDynamicIndexing = allBlobs.vk12.shaderUniformTexelBufferArrayDynamicIndexing;
+ featureType.shaderStorageTexelBufferArrayDynamicIndexing = allBlobs.vk12.shaderStorageTexelBufferArrayDynamicIndexing;
+ featureType.shaderUniformBufferArrayNonUniformIndexing = allBlobs.vk12.shaderUniformBufferArrayNonUniformIndexing;
+ featureType.shaderSampledImageArrayNonUniformIndexing = allBlobs.vk12.shaderSampledImageArrayNonUniformIndexing;
+ featureType.shaderStorageBufferArrayNonUniformIndexing = allBlobs.vk12.shaderStorageBufferArrayNonUniformIndexing;
+ featureType.shaderStorageImageArrayNonUniformIndexing = allBlobs.vk12.shaderStorageImageArrayNonUniformIndexing;
+ featureType.shaderInputAttachmentArrayNonUniformIndexing = allBlobs.vk12.shaderInputAttachmentArrayNonUniformIndexing;
+ featureType.shaderUniformTexelBufferArrayNonUniformIndexing = allBlobs.vk12.shaderUniformTexelBufferArrayNonUniformIndexing;
+ featureType.shaderStorageTexelBufferArrayNonUniformIndexing = allBlobs.vk12.shaderStorageTexelBufferArrayNonUniformIndexing;
+ featureType.descriptorBindingUniformBufferUpdateAfterBind = allBlobs.vk12.descriptorBindingUniformBufferUpdateAfterBind;
+ featureType.descriptorBindingSampledImageUpdateAfterBind = allBlobs.vk12.descriptorBindingSampledImageUpdateAfterBind;
+ featureType.descriptorBindingStorageImageUpdateAfterBind = allBlobs.vk12.descriptorBindingStorageImageUpdateAfterBind;
+ featureType.descriptorBindingStorageBufferUpdateAfterBind = allBlobs.vk12.descriptorBindingStorageBufferUpdateAfterBind;
+ featureType.descriptorBindingUniformTexelBufferUpdateAfterBind = allBlobs.vk12.descriptorBindingUniformTexelBufferUpdateAfterBind;
+ featureType.descriptorBindingStorageTexelBufferUpdateAfterBind = allBlobs.vk12.descriptorBindingStorageTexelBufferUpdateAfterBind;
+ featureType.descriptorBindingUpdateUnusedWhilePending = allBlobs.vk12.descriptorBindingUpdateUnusedWhilePending;
+ featureType.descriptorBindingPartiallyBound = allBlobs.vk12.descriptorBindingPartiallyBound;
+ featureType.descriptorBindingVariableDescriptorCount = allBlobs.vk12.descriptorBindingVariableDescriptorCount;
+ featureType.runtimeDescriptorArray = allBlobs.vk12.runtimeDescriptorArray;
+}
+template<> void initFromBlob<VkPhysicalDeviceScalarBlockLayoutFeatures>(VkPhysicalDeviceScalarBlockLayoutFeatures& featureType, const AllBlobs& allBlobs)
+{
+ featureType.scalarBlockLayout = allBlobs.vk12.scalarBlockLayout;
+}
+template<> void initFromBlob<VkPhysicalDeviceVulkanMemoryModelFeatures>(VkPhysicalDeviceVulkanMemoryModelFeatures& featureType, const AllBlobs& allBlobs)
+{
+ featureType.vulkanMemoryModel = allBlobs.vk12.vulkanMemoryModel;
+ featureType.vulkanMemoryModelDeviceScope = allBlobs.vk12.vulkanMemoryModelDeviceScope;
+ featureType.vulkanMemoryModelAvailabilityVisibilityChains = allBlobs.vk12.vulkanMemoryModelAvailabilityVisibilityChains;
+}
+template<> void initFromBlob<VkPhysicalDeviceImagelessFramebufferFeatures>(VkPhysicalDeviceImagelessFramebufferFeatures& featureType, const AllBlobs& allBlobs)
+{
+ featureType.imagelessFramebuffer = allBlobs.vk12.imagelessFramebuffer;
+}
+template<> void initFromBlob<VkPhysicalDeviceUniformBufferStandardLayoutFeatures>(VkPhysicalDeviceUniformBufferStandardLayoutFeatures& featureType, const AllBlobs& allBlobs)
+{
+ featureType.uniformBufferStandardLayout = allBlobs.vk12.uniformBufferStandardLayout;
+}
+template<> void initFromBlob<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures>(VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures& featureType, const AllBlobs& allBlobs)
+{
+ featureType.shaderSubgroupExtendedTypes = allBlobs.vk12.shaderSubgroupExtendedTypes;
+}
+template<> void initFromBlob<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures>(VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures& featureType, const AllBlobs& allBlobs)
+{
+ featureType.separateDepthStencilLayouts = allBlobs.vk12.separateDepthStencilLayouts;
+}
+template<> void initFromBlob<VkPhysicalDeviceHostQueryResetFeatures>(VkPhysicalDeviceHostQueryResetFeatures& featureType, const AllBlobs& allBlobs)
+{
+ featureType.hostQueryReset = allBlobs.vk12.hostQueryReset;
+}
+template<> void initFromBlob<VkPhysicalDeviceTimelineSemaphoreFeatures>(VkPhysicalDeviceTimelineSemaphoreFeatures& featureType, const AllBlobs& allBlobs)
+{
+ featureType.timelineSemaphore = allBlobs.vk12.timelineSemaphore;
+}
+template<> void initFromBlob<VkPhysicalDeviceBufferDeviceAddressFeatures>(VkPhysicalDeviceBufferDeviceAddressFeatures& featureType, const AllBlobs& allBlobs)
+{
+ featureType.bufferDeviceAddress = allBlobs.vk12.bufferDeviceAddress;
+ featureType.bufferDeviceAddressCaptureReplay = allBlobs.vk12.bufferDeviceAddressCaptureReplay;
+ featureType.bufferDeviceAddressMultiDevice = allBlobs.vk12.bufferDeviceAddressMultiDevice;
+}
+
+// generic template is not enough for some compilers
+template<> void initFromBlob<VkPhysicalDevicePerformanceQueryFeaturesKHR>(VkPhysicalDevicePerformanceQueryFeaturesKHR&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR>(VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceTransformFeedbackFeaturesEXT>(VkPhysicalDeviceTransformFeedbackFeaturesEXT&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceCornerSampledImageFeaturesNV>(VkPhysicalDeviceCornerSampledImageFeaturesNV&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT>(VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceASTCDecodeFeaturesEXT>(VkPhysicalDeviceASTCDecodeFeaturesEXT&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceConditionalRenderingFeaturesEXT>(VkPhysicalDeviceConditionalRenderingFeaturesEXT&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceDepthClipEnableFeaturesEXT>(VkPhysicalDeviceDepthClipEnableFeaturesEXT&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceInlineUniformBlockFeaturesEXT>(VkPhysicalDeviceInlineUniformBlockFeaturesEXT&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT>(VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV>(VkPhysicalDeviceShaderSMBuiltinsFeaturesNV&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceShaderClockFeaturesKHR>(VkPhysicalDeviceShaderClockFeaturesKHR&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceShadingRateImageFeaturesNV>(VkPhysicalDeviceShadingRateImageFeaturesNV&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV>(VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT>(VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV>(VkPhysicalDeviceComputeShaderDerivativesFeaturesNV&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceMeshShaderFeaturesNV>(VkPhysicalDeviceMeshShaderFeaturesNV&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV>(VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceShaderImageFootprintFeaturesNV>(VkPhysicalDeviceShaderImageFootprintFeaturesNV&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceExclusiveScissorFeaturesNV>(VkPhysicalDeviceExclusiveScissorFeaturesNV&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL>(VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceFragmentDensityMapFeaturesEXT>(VkPhysicalDeviceFragmentDensityMapFeaturesEXT&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT>(VkPhysicalDeviceSubgroupSizeControlFeaturesEXT&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceCoherentMemoryFeaturesAMD>(VkPhysicalDeviceCoherentMemoryFeaturesAMD&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceMemoryPriorityFeaturesEXT>(VkPhysicalDeviceMemoryPriorityFeaturesEXT&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV>(VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT>(VkPhysicalDeviceBufferDeviceAddressFeaturesEXT&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceCooperativeMatrixFeaturesNV>(VkPhysicalDeviceCooperativeMatrixFeaturesNV&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceCoverageReductionModeFeaturesNV>(VkPhysicalDeviceCoverageReductionModeFeaturesNV&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT>(VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT>(VkPhysicalDeviceYcbcrImageArraysFeaturesEXT&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceLineRasterizationFeaturesEXT>(VkPhysicalDeviceLineRasterizationFeaturesEXT&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceIndexTypeUint8FeaturesEXT>(VkPhysicalDeviceIndexTypeUint8FeaturesEXT&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT>(VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT&, const AllBlobs&) {}
+template<> void initFromBlob<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT>(VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT&, const AllBlobs&) {}
+
+
+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, 51}; }
+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, 50}; }
+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, 49}; }
+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, 48}; }
+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, 47}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceCoherentMemoryFeaturesAMD>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD, DECL_AMD_COHERENT_MEMORY_EXTENSION_NAME, 0, 46}; }
+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, 45}; }
+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, 44}; }
+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, 43}; }
+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, 42}; }
+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, 41}; }
+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, 40}; }
+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, 39}; }
+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, 38}; }
+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, 37}; }
+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, 36}; }
+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, 35}; }
+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, 34}; }
+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, 33}; }
+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, 32}; }
+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, 31}; }
+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, 30}; }
+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, 29}; }
+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, 28}; }
+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, 27}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMultiviewFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, VK_KHR_MULTIVIEW_EXTENSION_NAME, VK_KHR_MULTIVIEW_SPEC_VERSION, 26}; }
+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, 25}; }
+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, 24}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceProtectedMemoryFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, DECL_PROTECTED_MEMORY_EXTENSION_NAME, 0, 23}; }
+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, 22}; }
+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, 21}; }
+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, 20}; }
+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, 19}; }
+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, 18}; }
+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, 17}; }
+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, 16}; }
+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, 15}; }
+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, 14}; }
+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, 13}; }
+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, 12}; }
+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, 11}; }
+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, 10}; }
+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, 9}; }
+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, 8}; }
+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, 7}; }
+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, 6}; }
+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, 5}; }
+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, 4}; }
+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, 3}; }
+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, 2}; }
+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, 1}; }
+
+
+static const FeatureStructCreationData featureStructCreationArray[] =
+{
{ createFeatureStructWrapper<VkPhysicalDevice16BitStorageFeatures>, VK_KHR_16BIT_STORAGE_EXTENSION_NAME, VK_KHR_16BIT_STORAGE_SPEC_VERSION },
- { createFeatureStructWrapper<VkPhysicalDeviceVariablePointersFeatures>, VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, VK_KHR_VARIABLE_POINTERS_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDevice8BitStorageFeatures>, VK_KHR_8BIT_STORAGE_EXTENSION_NAME, VK_KHR_8BIT_STORAGE_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT>, VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME, VK_EXT_BLEND_OPERATION_ADVANCED_SPEC_VERSION },
+ { 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<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 },
+ { createFeatureStructWrapper<VkPhysicalDeviceCornerSampledImageFeaturesNV>, VK_NV_CORNER_SAMPLED_IMAGE_EXTENSION_NAME, VK_NV_CORNER_SAMPLED_IMAGE_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceCoverageReductionModeFeaturesNV>, VK_NV_COVERAGE_REDUCTION_MODE_EXTENSION_NAME, VK_NV_COVERAGE_REDUCTION_MODE_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV>, VK_NV_DEDICATED_ALLOCATION_IMAGE_ALIASING_EXTENSION_NAME, VK_NV_DEDICATED_ALLOCATION_IMAGE_ALIASING_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceDepthClipEnableFeaturesEXT>, VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME, VK_EXT_DEPTH_CLIP_ENABLE_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceDescriptorIndexingFeatures>, VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME, VK_EXT_DESCRIPTOR_INDEXING_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceExclusiveScissorFeaturesNV>, VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME, VK_NV_SCISSOR_EXCLUSIVE_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceFragmentDensityMapFeaturesEXT>, VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME, VK_EXT_FRAGMENT_DENSITY_MAP_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV>, VK_NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME, VK_NV_FRAGMENT_SHADER_BARYCENTRIC_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT>, VK_EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME, VK_EXT_FRAGMENT_SHADER_INTERLOCK_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceHostQueryResetFeatures>, VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME, VK_EXT_HOST_QUERY_RESET_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceImagelessFramebufferFeatures>, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME, VK_KHR_IMAGELESS_FRAMEBUFFER_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceIndexTypeUint8FeaturesEXT>, VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME, VK_EXT_INDEX_TYPE_UINT8_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 },
+ { createFeatureStructWrapper<VkPhysicalDeviceMeshShaderFeaturesNV>, VK_NV_MESH_SHADER_EXTENSION_NAME, VK_NV_MESH_SHADER_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceMultiviewFeatures>, VK_KHR_MULTIVIEW_EXTENSION_NAME, VK_KHR_MULTIVIEW_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDevicePerformanceQueryFeaturesKHR>, VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME, VK_KHR_PERFORMANCE_QUERY_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR>, VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME, VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceProtectedMemoryFeatures>, DECL_PROTECTED_MEMORY_EXTENSION_NAME, 0 },
+ { createFeatureStructWrapper<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV>, VK_NV_REPRESENTATIVE_FRAGMENT_TEST_EXTENSION_NAME, VK_NV_REPRESENTATIVE_FRAGMENT_TEST_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceSamplerYcbcrConversionFeatures>, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME, VK_KHR_SAMPLER_YCBCR_CONVERSION_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceScalarBlockLayoutFeatures>, VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME, VK_EXT_SCALAR_BLOCK_LAYOUT_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures>, VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME, VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceShaderAtomicInt64Features>, VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME, VK_KHR_SHADER_ATOMIC_INT64_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceShaderClockFeaturesKHR>, VK_KHR_SHADER_CLOCK_EXTENSION_NAME, VK_KHR_SHADER_CLOCK_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT>, VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME, VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceShaderDrawParametersFeatures>, VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME, VK_KHR_SHADER_DRAW_PARAMETERS_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceShaderFloat16Int8Features>, VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, VK_KHR_SHADER_FLOAT16_INT8_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceShaderImageFootprintFeaturesNV>, VK_NV_SHADER_IMAGE_FOOTPRINT_EXTENSION_NAME, VK_NV_SHADER_IMAGE_FOOTPRINT_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL>, VK_INTEL_SHADER_INTEGER_FUNCTIONS_2_EXTENSION_NAME, VK_INTEL_SHADER_INTEGER_FUNCTIONS_2_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures>, VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME, VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceShadingRateImageFeaturesNV>, VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME, VK_NV_SHADING_RATE_IMAGE_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT>, VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, VK_EXT_SUBGROUP_SIZE_CONTROL_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT>, VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME, VK_EXT_TEXEL_BUFFER_ALIGNMENT_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceTimelineSemaphoreFeatures>, VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, VK_KHR_TIMELINE_SEMAPHORE_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceTransformFeedbackFeaturesEXT>, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, VK_EXT_TRANSFORM_FEEDBACK_SPEC_VERSION },
+ { 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<VkPhysicalDeviceVulkanMemoryModelFeatures>, VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME, VK_KHR_VULKAN_MEMORY_MODEL_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT>, VK_EXT_YCBCR_IMAGE_ARRAYS_EXTENSION_NAME, VK_EXT_YCBCR_IMAGE_ARRAYS_SPEC_VERSION },
};
+
+bool isPartOfBlobFeatures (VkStructureType sType)
+{
+ const std::vector<VkStructureType> sTypeVect = {
+ // Vulkan11
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES,
+ // Vulkan12
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES,
+ };
+ return de::contains(sTypeVect.begin(), sTypeVect.end(), sType);
+}
+
} // vk
diff --git a/external/vulkancts/framework/vulkan/vkDeviceFeaturesForContextDecl.inl b/external/vulkancts/framework/vulkan/vkDeviceFeaturesForContextDecl.inl
index 274783f..b902e8c 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceFeaturesForContextDecl.inl
+++ b/external/vulkancts/framework/vulkan/vkDeviceFeaturesForContextDecl.inl
@@ -1,45 +1,54 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*/
-const vk::VkPhysicalDeviceProtectedMemoryFeatures& getProtectedMemoryFeatures (void) const;
-const vk::VkPhysicalDeviceShaderDrawParametersFeatures& getShaderDrawParametersFeatures (void) const;
-const vk::VkPhysicalDeviceTransformFeedbackFeaturesEXT& getTransformFeedbackFeatures (void) const;
-const vk::VkPhysicalDeviceCornerSampledImageFeaturesNV& getCornerSampledImageFeatures (void) const;
-const vk::VkPhysicalDeviceConditionalRenderingFeaturesEXT& getConditionalRenderingFeatures (void) const;
-const vk::VkPhysicalDeviceFloat16Int8FeaturesKHR& getFloat16Int8Features (void) const;
-const vk::VkPhysicalDeviceDepthClipEnableFeaturesEXT& getDepthClipEnableFeatures (void) const;
-const vk::VkPhysicalDeviceImagelessFramebufferFeaturesKHR& getImagelessFramebufferFeatures (void) const;
-const vk::VkPhysicalDeviceInlineUniformBlockFeaturesEXT& getInlineUniformBlockFeatures (void) const;
-const vk::VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT& getBlendOperationAdvancedFeatures (void) const;
-const vk::VkPhysicalDeviceDescriptorIndexingFeaturesEXT& getDescriptorIndexingFeatures (void) const;
-const vk::VkPhysicalDeviceShadingRateImageFeaturesNV& getShadingRateImageFeatures (void) const;
-const vk::VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV& getRepresentativeFragmentTestFeatures (void) const;
-const vk::VkPhysicalDevice8BitStorageFeaturesKHR& get8BitStorageFeatures (void) const;
-const vk::VkPhysicalDeviceShaderAtomicInt64FeaturesKHR& getShaderAtomicInt64Features (void) const;
-const vk::VkPhysicalDeviceShaderClockFeaturesKHR& getShaderClockFeatures (void) const;
-const vk::VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT& getVertexAttributeDivisorFeatures (void) const;
-const vk::VkPhysicalDeviceComputeShaderDerivativesFeaturesNV& getComputeShaderDerivativesFeatures (void) const;
-const vk::VkPhysicalDeviceMeshShaderFeaturesNV& getMeshShaderFeatures (void) const;
-const vk::VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV& getFragmentShaderBarycentricFeatures (void) const;
-const vk::VkPhysicalDeviceShaderImageFootprintFeaturesNV& getShaderImageFootprintFeatures (void) const;
-const vk::VkPhysicalDeviceExclusiveScissorFeaturesNV& getExclusiveScissorFeatures (void) const;
-const vk::VkPhysicalDeviceTimelineSemaphoreFeaturesKHR& getTimelineSemaphoreFeatures (void) const;
-const vk::VkPhysicalDeviceVulkanMemoryModelFeaturesKHR& getVulkanMemoryModelFeatures (void) const;
-const vk::VkPhysicalDeviceFragmentDensityMapFeaturesEXT& getFragmentDensityMapFeatures (void) const;
-const vk::VkPhysicalDeviceScalarBlockLayoutFeaturesEXT& getScalarBlockLayoutFeatures (void) const;
-const vk::VkPhysicalDeviceMemoryPriorityFeaturesEXT& getMemoryPriorityFeatures (void) const;
-const vk::VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV& getDedicatedAllocationImageAliasingFeatures (void) const;
-const vk::VkPhysicalDeviceBufferDeviceAddressFeaturesEXT& getBufferDeviceAddressFeatures (void) const;
-const vk::VkPhysicalDeviceCooperativeMatrixFeaturesNV& getCooperativeMatrixFeatures (void) const;
-const vk::VkPhysicalDeviceCoverageReductionModeFeaturesNV& getCoverageReductionModeFeatures (void) const;
-const vk::VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT& getFragmentShaderInterlockFeatures (void) const;
-const vk::VkPhysicalDeviceYcbcrImageArraysFeaturesEXT& getYcbcrImageArraysFeatures (void) const;
-const vk::VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR& getUniformBufferStandardLayoutFeatures (void) const;
-const vk::VkPhysicalDeviceHostQueryResetFeaturesEXT& getHostQueryResetFeatures (void) const;
-const vk::VkPhysicalDeviceIndexTypeUint8FeaturesEXT& getIndexTypeUint8Features (void) const;
-const vk::VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT& getShaderDemoteToHelperInvocationFeatures (void) const;
-const vk::VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR& getPipelineExecutablePropertiesFeatures (void) const;
-const vk::VkPhysicalDeviceMultiviewFeatures& getMultiviewFeatures (void) const;
-const vk::VkPhysicalDevice16BitStorageFeatures& get16BitStorageFeatures (void) const;
-const vk::VkPhysicalDeviceVariablePointersFeatures& getVariablePointersFeatures (void) const;
-const vk::VkPhysicalDeviceSamplerYcbcrConversionFeatures& getSamplerYcbcrConversionFeatures (void) const;
+const vk::VkPhysicalDevice16BitStorageFeatures& get16BitStorageFeatures (void) const;
+const vk::VkPhysicalDevice8BitStorageFeatures& get8BitStorageFeatures (void) const;
+const vk::VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT& getBlendOperationAdvancedFeaturesEXT (void) const;
+const vk::VkPhysicalDeviceBufferDeviceAddressFeatures& getBufferDeviceAddressFeatures (void) const;
+const vk::VkPhysicalDeviceBufferDeviceAddressFeaturesEXT& getBufferDeviceAddressFeaturesEXT (void) const;
+const vk::VkPhysicalDeviceCoherentMemoryFeaturesAMD& getCoherentMemoryFeaturesAMD (void) const;
+const vk::VkPhysicalDeviceComputeShaderDerivativesFeaturesNV& getComputeShaderDerivativesFeatures (void) const;
+const vk::VkPhysicalDeviceConditionalRenderingFeaturesEXT& getConditionalRenderingFeaturesEXT (void) const;
+const vk::VkPhysicalDeviceCooperativeMatrixFeaturesNV& getCooperativeMatrixFeatures (void) const;
+const vk::VkPhysicalDeviceCornerSampledImageFeaturesNV& getCornerSampledImageFeatures (void) const;
+const vk::VkPhysicalDeviceCoverageReductionModeFeaturesNV& getCoverageReductionModeFeatures (void) const;
+const vk::VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV& getDedicatedAllocationImageAliasingFeatures (void) const;
+const vk::VkPhysicalDeviceDepthClipEnableFeaturesEXT& getDepthClipEnableFeaturesEXT (void) const;
+const vk::VkPhysicalDeviceDescriptorIndexingFeatures& getDescriptorIndexingFeatures (void) const;
+const vk::VkPhysicalDeviceExclusiveScissorFeaturesNV& getExclusiveScissorFeatures (void) const;
+const vk::VkPhysicalDeviceFragmentDensityMapFeaturesEXT& getFragmentDensityMapFeaturesEXT (void) const;
+const vk::VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV& getFragmentShaderBarycentricFeatures (void) const;
+const vk::VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT& getFragmentShaderInterlockFeaturesEXT (void) const;
+const vk::VkPhysicalDeviceHostQueryResetFeatures& getHostQueryResetFeatures (void) const;
+const vk::VkPhysicalDeviceImagelessFramebufferFeatures& getImagelessFramebufferFeatures (void) const;
+const vk::VkPhysicalDeviceIndexTypeUint8FeaturesEXT& getIndexTypeUint8FeaturesEXT (void) const;
+const vk::VkPhysicalDeviceInlineUniformBlockFeaturesEXT& getInlineUniformBlockFeaturesEXT (void) const;
+const vk::VkPhysicalDeviceLineRasterizationFeaturesEXT& getLineRasterizationFeaturesEXT (void) const;
+const vk::VkPhysicalDeviceMemoryPriorityFeaturesEXT& getMemoryPriorityFeaturesEXT (void) const;
+const vk::VkPhysicalDeviceMeshShaderFeaturesNV& getMeshShaderFeatures (void) const;
+const vk::VkPhysicalDeviceMultiviewFeatures& getMultiviewFeatures (void) const;
+const vk::VkPhysicalDevicePerformanceQueryFeaturesKHR& getPerformanceQueryFeatures (void) const;
+const vk::VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR& getPipelineExecutablePropertiesFeatures (void) const;
+const vk::VkPhysicalDeviceProtectedMemoryFeatures& getProtectedMemoryFeatures (void) const;
+const vk::VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV& getRepresentativeFragmentTestFeatures (void) const;
+const vk::VkPhysicalDeviceSamplerYcbcrConversionFeatures& getSamplerYcbcrConversionFeatures (void) const;
+const vk::VkPhysicalDeviceScalarBlockLayoutFeatures& getScalarBlockLayoutFeatures (void) const;
+const vk::VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures& getSeparateDepthStencilLayoutsFeatures (void) const;
+const vk::VkPhysicalDeviceShaderAtomicInt64Features& getShaderAtomicInt64Features (void) const;
+const vk::VkPhysicalDeviceShaderClockFeaturesKHR& getShaderClockFeatures (void) const;
+const vk::VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT& getShaderDemoteToHelperInvocationFeaturesEXT (void) const;
+const vk::VkPhysicalDeviceShaderDrawParametersFeatures& getShaderDrawParametersFeatures (void) const;
+const vk::VkPhysicalDeviceShaderFloat16Int8Features& getShaderFloat16Int8Features (void) const;
+const vk::VkPhysicalDeviceShaderImageFootprintFeaturesNV& getShaderImageFootprintFeatures (void) const;
+const vk::VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL& getShaderIntegerFunctions2FeaturesINTEL (void) const;
+const vk::VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures& getShaderSubgroupExtendedTypesFeatures (void) const;
+const vk::VkPhysicalDeviceShadingRateImageFeaturesNV& getShadingRateImageFeatures (void) const;
+const vk::VkPhysicalDeviceSubgroupSizeControlFeaturesEXT& getSubgroupSizeControlFeaturesEXT (void) const;
+const vk::VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT& getTexelBufferAlignmentFeaturesEXT (void) const;
+const vk::VkPhysicalDeviceTimelineSemaphoreFeatures& getTimelineSemaphoreFeatures (void) const;
+const vk::VkPhysicalDeviceTransformFeedbackFeaturesEXT& getTransformFeedbackFeaturesEXT (void) const;
+const vk::VkPhysicalDeviceUniformBufferStandardLayoutFeatures& getUniformBufferStandardLayoutFeatures (void) const;
+const vk::VkPhysicalDeviceVariablePointersFeatures& getVariablePointersFeatures (void) const;
+const vk::VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT& getVertexAttributeDivisorFeaturesEXT (void) const;
+const vk::VkPhysicalDeviceVulkanMemoryModelFeatures& getVulkanMemoryModelFeatures (void) const;
+const vk::VkPhysicalDeviceYcbcrImageArraysFeaturesEXT& getYcbcrImageArraysFeaturesEXT (void) const;
diff --git a/external/vulkancts/framework/vulkan/vkDeviceFeaturesForContextDefs.inl b/external/vulkancts/framework/vulkan/vkDeviceFeaturesForContextDefs.inl
index 067d803..8a4d777 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceFeaturesForContextDefs.inl
+++ b/external/vulkancts/framework/vulkan/vkDeviceFeaturesForContextDefs.inl
@@ -1,45 +1,54 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*/
-const vk::VkPhysicalDeviceProtectedMemoryFeatures& Context::getProtectedMemoryFeatures (void) const { return m_device->getProtectedMemoryFeatures(); }
-const vk::VkPhysicalDeviceShaderDrawParametersFeatures& Context::getShaderDrawParametersFeatures (void) const { return m_device->getShaderDrawParametersFeatures(); }
-const vk::VkPhysicalDeviceTransformFeedbackFeaturesEXT& Context::getTransformFeedbackFeatures (void) const { return m_device->getTransformFeedbackFeatures(); }
-const vk::VkPhysicalDeviceCornerSampledImageFeaturesNV& Context::getCornerSampledImageFeatures (void) const { return m_device->getCornerSampledImageFeatures(); }
-const vk::VkPhysicalDeviceConditionalRenderingFeaturesEXT& Context::getConditionalRenderingFeatures (void) const { return m_device->getConditionalRenderingFeatures(); }
-const vk::VkPhysicalDeviceFloat16Int8FeaturesKHR& Context::getFloat16Int8Features (void) const { return m_device->getFloat16Int8Features(); }
-const vk::VkPhysicalDeviceDepthClipEnableFeaturesEXT& Context::getDepthClipEnableFeatures (void) const { return m_device->getDepthClipEnableFeatures(); }
-const vk::VkPhysicalDeviceImagelessFramebufferFeaturesKHR& Context::getImagelessFramebufferFeatures (void) const { return m_device->getImagelessFramebufferFeatures(); }
-const vk::VkPhysicalDeviceInlineUniformBlockFeaturesEXT& Context::getInlineUniformBlockFeatures (void) const { return m_device->getInlineUniformBlockFeatures(); }
-const vk::VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT& Context::getBlendOperationAdvancedFeatures (void) const { return m_device->getBlendOperationAdvancedFeatures(); }
-const vk::VkPhysicalDeviceDescriptorIndexingFeaturesEXT& Context::getDescriptorIndexingFeatures (void) const { return m_device->getDescriptorIndexingFeatures(); }
-const vk::VkPhysicalDeviceShadingRateImageFeaturesNV& Context::getShadingRateImageFeatures (void) const { return m_device->getShadingRateImageFeatures(); }
-const vk::VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV& Context::getRepresentativeFragmentTestFeatures (void) const { return m_device->getRepresentativeFragmentTestFeatures(); }
-const vk::VkPhysicalDevice8BitStorageFeaturesKHR& Context::get8BitStorageFeatures (void) const { return m_device->get8BitStorageFeatures(); }
-const vk::VkPhysicalDeviceShaderAtomicInt64FeaturesKHR& Context::getShaderAtomicInt64Features (void) const { return m_device->getShaderAtomicInt64Features(); }
-const vk::VkPhysicalDeviceShaderClockFeaturesKHR& Context::getShaderClockFeatures (void) const { return m_device->getShaderClockFeatures(); }
-const vk::VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT& Context::getVertexAttributeDivisorFeatures (void) const { return m_device->getVertexAttributeDivisorFeatures(); }
-const vk::VkPhysicalDeviceComputeShaderDerivativesFeaturesNV& Context::getComputeShaderDerivativesFeatures (void) const { return m_device->getComputeShaderDerivativesFeatures(); }
-const vk::VkPhysicalDeviceMeshShaderFeaturesNV& Context::getMeshShaderFeatures (void) const { return m_device->getMeshShaderFeatures(); }
-const vk::VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV& Context::getFragmentShaderBarycentricFeatures (void) const { return m_device->getFragmentShaderBarycentricFeatures(); }
-const vk::VkPhysicalDeviceShaderImageFootprintFeaturesNV& Context::getShaderImageFootprintFeatures (void) const { return m_device->getShaderImageFootprintFeatures(); }
-const vk::VkPhysicalDeviceExclusiveScissorFeaturesNV& Context::getExclusiveScissorFeatures (void) const { return m_device->getExclusiveScissorFeatures(); }
-const vk::VkPhysicalDeviceTimelineSemaphoreFeaturesKHR& Context::getTimelineSemaphoreFeatures (void) const { return m_device->getTimelineSemaphoreFeatures(); }
-const vk::VkPhysicalDeviceVulkanMemoryModelFeaturesKHR& Context::getVulkanMemoryModelFeatures (void) const { return m_device->getVulkanMemoryModelFeatures(); }
-const vk::VkPhysicalDeviceFragmentDensityMapFeaturesEXT& Context::getFragmentDensityMapFeatures (void) const { return m_device->getFragmentDensityMapFeatures(); }
-const vk::VkPhysicalDeviceScalarBlockLayoutFeaturesEXT& Context::getScalarBlockLayoutFeatures (void) const { return m_device->getScalarBlockLayoutFeatures(); }
-const vk::VkPhysicalDeviceMemoryPriorityFeaturesEXT& Context::getMemoryPriorityFeatures (void) const { return m_device->getMemoryPriorityFeatures(); }
-const vk::VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV& Context::getDedicatedAllocationImageAliasingFeatures (void) const { return m_device->getDedicatedAllocationImageAliasingFeatures(); }
-const vk::VkPhysicalDeviceBufferDeviceAddressFeaturesEXT& Context::getBufferDeviceAddressFeatures (void) const { return m_device->getBufferDeviceAddressFeatures(); }
-const vk::VkPhysicalDeviceCooperativeMatrixFeaturesNV& Context::getCooperativeMatrixFeatures (void) const { return m_device->getCooperativeMatrixFeatures(); }
-const vk::VkPhysicalDeviceCoverageReductionModeFeaturesNV& Context::getCoverageReductionModeFeatures (void) const { return m_device->getCoverageReductionModeFeatures(); }
-const vk::VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT& Context::getFragmentShaderInterlockFeatures (void) const { return m_device->getFragmentShaderInterlockFeatures(); }
-const vk::VkPhysicalDeviceYcbcrImageArraysFeaturesEXT& Context::getYcbcrImageArraysFeatures (void) const { return m_device->getYcbcrImageArraysFeatures(); }
-const vk::VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR& Context::getUniformBufferStandardLayoutFeatures (void) const { return m_device->getUniformBufferStandardLayoutFeatures(); }
-const vk::VkPhysicalDeviceHostQueryResetFeaturesEXT& Context::getHostQueryResetFeatures (void) const { return m_device->getHostQueryResetFeatures(); }
-const vk::VkPhysicalDeviceIndexTypeUint8FeaturesEXT& Context::getIndexTypeUint8Features (void) const { return m_device->getIndexTypeUint8Features(); }
-const vk::VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT& Context::getShaderDemoteToHelperInvocationFeatures (void) const { return m_device->getShaderDemoteToHelperInvocationFeatures(); }
-const vk::VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR& Context::getPipelineExecutablePropertiesFeatures (void) const { return m_device->getPipelineExecutablePropertiesFeatures(); }
-const vk::VkPhysicalDeviceMultiviewFeatures& Context::getMultiviewFeatures (void) const { return m_device->getMultiviewFeatures(); }
const vk::VkPhysicalDevice16BitStorageFeatures& Context::get16BitStorageFeatures (void) const { return m_device->get16BitStorageFeatures(); }
-const vk::VkPhysicalDeviceVariablePointersFeatures& Context::getVariablePointersFeatures (void) const { return m_device->getVariablePointersFeatures(); }
+const vk::VkPhysicalDevice8BitStorageFeatures& Context::get8BitStorageFeatures (void) const { return m_device->get8BitStorageFeatures(); }
+const vk::VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT& Context::getBlendOperationAdvancedFeaturesEXT (void) const { return m_device->getBlendOperationAdvancedFeaturesEXT(); }
+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::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(); }
+const vk::VkPhysicalDeviceCornerSampledImageFeaturesNV& Context::getCornerSampledImageFeatures (void) const { return m_device->getCornerSampledImageFeatures(); }
+const vk::VkPhysicalDeviceCoverageReductionModeFeaturesNV& Context::getCoverageReductionModeFeatures (void) const { return m_device->getCoverageReductionModeFeatures(); }
+const vk::VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV& Context::getDedicatedAllocationImageAliasingFeatures (void) const { return m_device->getDedicatedAllocationImageAliasingFeatures(); }
+const vk::VkPhysicalDeviceDepthClipEnableFeaturesEXT& Context::getDepthClipEnableFeaturesEXT (void) const { return m_device->getDepthClipEnableFeaturesEXT(); }
+const vk::VkPhysicalDeviceDescriptorIndexingFeatures& Context::getDescriptorIndexingFeatures (void) const { return m_device->getDescriptorIndexingFeatures(); }
+const vk::VkPhysicalDeviceExclusiveScissorFeaturesNV& Context::getExclusiveScissorFeatures (void) const { return m_device->getExclusiveScissorFeatures(); }
+const vk::VkPhysicalDeviceFragmentDensityMapFeaturesEXT& Context::getFragmentDensityMapFeaturesEXT (void) const { return m_device->getFragmentDensityMapFeaturesEXT(); }
+const vk::VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV& Context::getFragmentShaderBarycentricFeatures (void) const { return m_device->getFragmentShaderBarycentricFeatures(); }
+const vk::VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT& Context::getFragmentShaderInterlockFeaturesEXT (void) const { return m_device->getFragmentShaderInterlockFeaturesEXT(); }
+const vk::VkPhysicalDeviceHostQueryResetFeatures& Context::getHostQueryResetFeatures (void) const { return m_device->getHostQueryResetFeatures(); }
+const vk::VkPhysicalDeviceImagelessFramebufferFeatures& Context::getImagelessFramebufferFeatures (void) const { return m_device->getImagelessFramebufferFeatures(); }
+const vk::VkPhysicalDeviceIndexTypeUint8FeaturesEXT& Context::getIndexTypeUint8FeaturesEXT (void) const { return m_device->getIndexTypeUint8FeaturesEXT(); }
+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(); }
+const vk::VkPhysicalDeviceMeshShaderFeaturesNV& Context::getMeshShaderFeatures (void) const { return m_device->getMeshShaderFeatures(); }
+const vk::VkPhysicalDeviceMultiviewFeatures& Context::getMultiviewFeatures (void) const { return m_device->getMultiviewFeatures(); }
+const vk::VkPhysicalDevicePerformanceQueryFeaturesKHR& Context::getPerformanceQueryFeatures (void) const { return m_device->getPerformanceQueryFeatures(); }
+const vk::VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR& Context::getPipelineExecutablePropertiesFeatures (void) const { return m_device->getPipelineExecutablePropertiesFeatures(); }
+const vk::VkPhysicalDeviceProtectedMemoryFeatures& Context::getProtectedMemoryFeatures (void) const { return m_device->getProtectedMemoryFeatures(); }
+const vk::VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV& Context::getRepresentativeFragmentTestFeatures (void) const { return m_device->getRepresentativeFragmentTestFeatures(); }
const vk::VkPhysicalDeviceSamplerYcbcrConversionFeatures& Context::getSamplerYcbcrConversionFeatures (void) const { return m_device->getSamplerYcbcrConversionFeatures(); }
+const vk::VkPhysicalDeviceScalarBlockLayoutFeatures& Context::getScalarBlockLayoutFeatures (void) const { return m_device->getScalarBlockLayoutFeatures(); }
+const vk::VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures& Context::getSeparateDepthStencilLayoutsFeatures (void) const { return m_device->getSeparateDepthStencilLayoutsFeatures(); }
+const vk::VkPhysicalDeviceShaderAtomicInt64Features& Context::getShaderAtomicInt64Features (void) const { return m_device->getShaderAtomicInt64Features(); }
+const vk::VkPhysicalDeviceShaderClockFeaturesKHR& Context::getShaderClockFeatures (void) const { return m_device->getShaderClockFeatures(); }
+const vk::VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT& Context::getShaderDemoteToHelperInvocationFeaturesEXT (void) const { return m_device->getShaderDemoteToHelperInvocationFeaturesEXT(); }
+const vk::VkPhysicalDeviceShaderDrawParametersFeatures& Context::getShaderDrawParametersFeatures (void) const { return m_device->getShaderDrawParametersFeatures(); }
+const vk::VkPhysicalDeviceShaderFloat16Int8Features& Context::getShaderFloat16Int8Features (void) const { return m_device->getShaderFloat16Int8Features(); }
+const vk::VkPhysicalDeviceShaderImageFootprintFeaturesNV& Context::getShaderImageFootprintFeatures (void) const { return m_device->getShaderImageFootprintFeatures(); }
+const vk::VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL& Context::getShaderIntegerFunctions2FeaturesINTEL (void) const { return m_device->getShaderIntegerFunctions2FeaturesINTEL(); }
+const vk::VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures& Context::getShaderSubgroupExtendedTypesFeatures (void) const { return m_device->getShaderSubgroupExtendedTypesFeatures(); }
+const vk::VkPhysicalDeviceShadingRateImageFeaturesNV& Context::getShadingRateImageFeatures (void) const { return m_device->getShadingRateImageFeatures(); }
+const vk::VkPhysicalDeviceSubgroupSizeControlFeaturesEXT& Context::getSubgroupSizeControlFeaturesEXT (void) const { return m_device->getSubgroupSizeControlFeaturesEXT(); }
+const vk::VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT& Context::getTexelBufferAlignmentFeaturesEXT (void) const { return m_device->getTexelBufferAlignmentFeaturesEXT(); }
+const vk::VkPhysicalDeviceTimelineSemaphoreFeatures& Context::getTimelineSemaphoreFeatures (void) const { return m_device->getTimelineSemaphoreFeatures(); }
+const vk::VkPhysicalDeviceTransformFeedbackFeaturesEXT& Context::getTransformFeedbackFeaturesEXT (void) const { return m_device->getTransformFeedbackFeaturesEXT(); }
+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::VkPhysicalDeviceVulkanMemoryModelFeatures& Context::getVulkanMemoryModelFeatures (void) const { return m_device->getVulkanMemoryModelFeatures(); }
+const vk::VkPhysicalDeviceYcbcrImageArraysFeaturesEXT& Context::getYcbcrImageArraysFeaturesEXT (void) const { return m_device->getYcbcrImageArraysFeaturesEXT(); }
diff --git a/external/vulkancts/framework/vulkan/vkDeviceFeaturesForDefaultDeviceDefs.inl b/external/vulkancts/framework/vulkan/vkDeviceFeaturesForDefaultDeviceDefs.inl
index c86d1e8..152bca1 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceFeaturesForDefaultDeviceDefs.inl
+++ b/external/vulkancts/framework/vulkan/vkDeviceFeaturesForDefaultDeviceDefs.inl
@@ -1,45 +1,54 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*/
-const VkPhysicalDeviceProtectedMemoryFeatures& getProtectedMemoryFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceProtectedMemoryFeatures>(); }
-const VkPhysicalDeviceShaderDrawParametersFeatures& getShaderDrawParametersFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceShaderDrawParametersFeatures>(); }
-const VkPhysicalDeviceTransformFeedbackFeaturesEXT& getTransformFeedbackFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceTransformFeedbackFeaturesEXT>(); }
-const VkPhysicalDeviceCornerSampledImageFeaturesNV& getCornerSampledImageFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceCornerSampledImageFeaturesNV>(); }
-const VkPhysicalDeviceConditionalRenderingFeaturesEXT& getConditionalRenderingFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceConditionalRenderingFeaturesEXT>(); }
-const VkPhysicalDeviceFloat16Int8FeaturesKHR& getFloat16Int8Features (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceFloat16Int8FeaturesKHR>(); }
-const VkPhysicalDeviceDepthClipEnableFeaturesEXT& getDepthClipEnableFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceDepthClipEnableFeaturesEXT>(); }
-const VkPhysicalDeviceImagelessFramebufferFeaturesKHR& getImagelessFramebufferFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceImagelessFramebufferFeaturesKHR>(); }
-const VkPhysicalDeviceInlineUniformBlockFeaturesEXT& getInlineUniformBlockFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceInlineUniformBlockFeaturesEXT>(); }
-const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT& getBlendOperationAdvancedFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT>(); }
-const VkPhysicalDeviceDescriptorIndexingFeaturesEXT& getDescriptorIndexingFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceDescriptorIndexingFeaturesEXT>(); }
-const VkPhysicalDeviceShadingRateImageFeaturesNV& getShadingRateImageFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceShadingRateImageFeaturesNV>(); }
-const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV& getRepresentativeFragmentTestFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV>(); }
-const VkPhysicalDevice8BitStorageFeaturesKHR& get8BitStorageFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDevice8BitStorageFeaturesKHR>(); }
-const VkPhysicalDeviceShaderAtomicInt64FeaturesKHR& getShaderAtomicInt64Features (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceShaderAtomicInt64FeaturesKHR>(); }
-const VkPhysicalDeviceShaderClockFeaturesKHR& getShaderClockFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceShaderClockFeaturesKHR>(); }
-const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT& getVertexAttributeDivisorFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT>(); }
-const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV& getComputeShaderDerivativesFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV>(); }
-const VkPhysicalDeviceMeshShaderFeaturesNV& getMeshShaderFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceMeshShaderFeaturesNV>(); }
-const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV& getFragmentShaderBarycentricFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV>(); }
-const VkPhysicalDeviceShaderImageFootprintFeaturesNV& getShaderImageFootprintFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceShaderImageFootprintFeaturesNV>(); }
-const VkPhysicalDeviceExclusiveScissorFeaturesNV& getExclusiveScissorFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceExclusiveScissorFeaturesNV>(); }
-const VkPhysicalDeviceTimelineSemaphoreFeaturesKHR& getTimelineSemaphoreFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceTimelineSemaphoreFeaturesKHR>(); }
-const VkPhysicalDeviceVulkanMemoryModelFeaturesKHR& getVulkanMemoryModelFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceVulkanMemoryModelFeaturesKHR>(); }
-const VkPhysicalDeviceFragmentDensityMapFeaturesEXT& getFragmentDensityMapFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceFragmentDensityMapFeaturesEXT>(); }
-const VkPhysicalDeviceScalarBlockLayoutFeaturesEXT& getScalarBlockLayoutFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceScalarBlockLayoutFeaturesEXT>(); }
-const VkPhysicalDeviceMemoryPriorityFeaturesEXT& getMemoryPriorityFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceMemoryPriorityFeaturesEXT>(); }
-const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV& getDedicatedAllocationImageAliasingFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV>(); }
-const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT& getBufferDeviceAddressFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT>(); }
-const VkPhysicalDeviceCooperativeMatrixFeaturesNV& getCooperativeMatrixFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceCooperativeMatrixFeaturesNV>(); }
-const VkPhysicalDeviceCoverageReductionModeFeaturesNV& getCoverageReductionModeFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceCoverageReductionModeFeaturesNV>(); }
-const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT& getFragmentShaderInterlockFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT>(); }
-const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT& getYcbcrImageArraysFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT>(); }
-const VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR& getUniformBufferStandardLayoutFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR>(); }
-const VkPhysicalDeviceHostQueryResetFeaturesEXT& getHostQueryResetFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceHostQueryResetFeaturesEXT>(); }
-const VkPhysicalDeviceIndexTypeUint8FeaturesEXT& getIndexTypeUint8Features (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceIndexTypeUint8FeaturesEXT>(); }
-const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT& getShaderDemoteToHelperInvocationFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT>(); }
-const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR& getPipelineExecutablePropertiesFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR>(); }
-const VkPhysicalDeviceMultiviewFeatures& getMultiviewFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceMultiviewFeatures>(); }
-const VkPhysicalDevice16BitStorageFeatures& get16BitStorageFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDevice16BitStorageFeatures>(); }
-const VkPhysicalDeviceVariablePointersFeatures& getVariablePointersFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceVariablePointersFeatures>(); }
-const VkPhysicalDeviceSamplerYcbcrConversionFeatures& getSamplerYcbcrConversionFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceSamplerYcbcrConversionFeatures>(); }
+const VkPhysicalDevice16BitStorageFeatures& get16BitStorageFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDevice16BitStorageFeatures>(); }
+const VkPhysicalDevice8BitStorageFeatures& get8BitStorageFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDevice8BitStorageFeatures>(); }
+const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT& getBlendOperationAdvancedFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT>(); }
+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 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>(); }
+const VkPhysicalDeviceCornerSampledImageFeaturesNV& getCornerSampledImageFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceCornerSampledImageFeaturesNV>(); }
+const VkPhysicalDeviceCoverageReductionModeFeaturesNV& getCoverageReductionModeFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceCoverageReductionModeFeaturesNV>(); }
+const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV& getDedicatedAllocationImageAliasingFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV>(); }
+const VkPhysicalDeviceDepthClipEnableFeaturesEXT& getDepthClipEnableFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceDepthClipEnableFeaturesEXT>(); }
+const VkPhysicalDeviceDescriptorIndexingFeatures& getDescriptorIndexingFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceDescriptorIndexingFeatures>(); }
+const VkPhysicalDeviceExclusiveScissorFeaturesNV& getExclusiveScissorFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceExclusiveScissorFeaturesNV>(); }
+const VkPhysicalDeviceFragmentDensityMapFeaturesEXT& getFragmentDensityMapFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceFragmentDensityMapFeaturesEXT>(); }
+const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV& getFragmentShaderBarycentricFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV>(); }
+const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT& getFragmentShaderInterlockFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT>(); }
+const VkPhysicalDeviceHostQueryResetFeatures& getHostQueryResetFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceHostQueryResetFeatures>(); }
+const VkPhysicalDeviceImagelessFramebufferFeatures& getImagelessFramebufferFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceImagelessFramebufferFeatures>(); }
+const VkPhysicalDeviceIndexTypeUint8FeaturesEXT& getIndexTypeUint8FeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceIndexTypeUint8FeaturesEXT>(); }
+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>(); }
+const VkPhysicalDeviceMeshShaderFeaturesNV& getMeshShaderFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceMeshShaderFeaturesNV>(); }
+const VkPhysicalDeviceMultiviewFeatures& getMultiviewFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceMultiviewFeatures>(); }
+const VkPhysicalDevicePerformanceQueryFeaturesKHR& getPerformanceQueryFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDevicePerformanceQueryFeaturesKHR>(); }
+const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR& getPipelineExecutablePropertiesFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR>(); }
+const VkPhysicalDeviceProtectedMemoryFeatures& getProtectedMemoryFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceProtectedMemoryFeatures>(); }
+const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV& getRepresentativeFragmentTestFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV>(); }
+const VkPhysicalDeviceSamplerYcbcrConversionFeatures& getSamplerYcbcrConversionFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceSamplerYcbcrConversionFeatures>(); }
+const VkPhysicalDeviceScalarBlockLayoutFeatures& getScalarBlockLayoutFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceScalarBlockLayoutFeatures>(); }
+const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures& getSeparateDepthStencilLayoutsFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures>(); }
+const VkPhysicalDeviceShaderAtomicInt64Features& getShaderAtomicInt64Features (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceShaderAtomicInt64Features>(); }
+const VkPhysicalDeviceShaderClockFeaturesKHR& getShaderClockFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceShaderClockFeaturesKHR>(); }
+const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT& getShaderDemoteToHelperInvocationFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT>(); }
+const VkPhysicalDeviceShaderDrawParametersFeatures& getShaderDrawParametersFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceShaderDrawParametersFeatures>(); }
+const VkPhysicalDeviceShaderFloat16Int8Features& getShaderFloat16Int8Features (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceShaderFloat16Int8Features>(); }
+const VkPhysicalDeviceShaderImageFootprintFeaturesNV& getShaderImageFootprintFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceShaderImageFootprintFeaturesNV>(); }
+const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL& getShaderIntegerFunctions2FeaturesINTEL (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL>(); }
+const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures& getShaderSubgroupExtendedTypesFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures>(); }
+const VkPhysicalDeviceShadingRateImageFeaturesNV& getShadingRateImageFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceShadingRateImageFeaturesNV>(); }
+const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT& getSubgroupSizeControlFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT>(); }
+const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT& getTexelBufferAlignmentFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT>(); }
+const VkPhysicalDeviceTimelineSemaphoreFeatures& getTimelineSemaphoreFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceTimelineSemaphoreFeatures>(); }
+const VkPhysicalDeviceTransformFeedbackFeaturesEXT& getTransformFeedbackFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceTransformFeedbackFeaturesEXT>(); }
+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 VkPhysicalDeviceVulkanMemoryModelFeatures& getVulkanMemoryModelFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceVulkanMemoryModelFeatures>(); }
+const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT& getYcbcrImageArraysFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT>(); }
diff --git a/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl b/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl
index ab09ea5..c3acddd 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl
+++ b/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl
@@ -138,6 +138,19 @@
DestroyDescriptorUpdateTemplateFunc destroyDescriptorUpdateTemplate;
UpdateDescriptorSetWithTemplateFunc updateDescriptorSetWithTemplate;
GetDescriptorSetLayoutSupportFunc getDescriptorSetLayoutSupport;
+CmdDrawIndirectCountFunc cmdDrawIndirectCount;
+CmdDrawIndexedIndirectCountFunc cmdDrawIndexedIndirectCount;
+CreateRenderPass2Func createRenderPass2;
+CmdBeginRenderPass2Func cmdBeginRenderPass2;
+CmdNextSubpass2Func cmdNextSubpass2;
+CmdEndRenderPass2Func cmdEndRenderPass2;
+ResetQueryPoolFunc resetQueryPool;
+GetSemaphoreCounterValueFunc getSemaphoreCounterValue;
+WaitSemaphoresFunc waitSemaphores;
+SignalSemaphoreFunc signalSemaphore;
+GetBufferDeviceAddressFunc getBufferDeviceAddress;
+GetBufferOpaqueCaptureAddressFunc getBufferOpaqueCaptureAddress;
+GetDeviceMemoryOpaqueCaptureAddressFunc getDeviceMemoryOpaqueCaptureAddress;
CreateSwapchainKHRFunc createSwapchainKHR;
DestroySwapchainKHRFunc destroySwapchainKHR;
GetSwapchainImagesKHRFunc getSwapchainImagesKHR;
@@ -153,21 +166,14 @@
GetSemaphoreFdKHRFunc getSemaphoreFdKHR;
CmdPushDescriptorSetKHRFunc cmdPushDescriptorSetKHR;
CmdPushDescriptorSetWithTemplateKHRFunc cmdPushDescriptorSetWithTemplateKHR;
-CreateRenderPass2KHRFunc createRenderPass2KHR;
-CmdBeginRenderPass2KHRFunc cmdBeginRenderPass2KHR;
-CmdNextSubpass2KHRFunc cmdNextSubpass2KHR;
-CmdEndRenderPass2KHRFunc cmdEndRenderPass2KHR;
GetSwapchainStatusKHRFunc getSwapchainStatusKHR;
ImportFenceFdKHRFunc importFenceFdKHR;
GetFenceFdKHRFunc getFenceFdKHR;
-CmdDrawIndirectCountKHRFunc cmdDrawIndirectCountKHR;
-CmdDrawIndexedIndirectCountKHRFunc cmdDrawIndexedIndirectCountKHR;
+AcquireProfilingLockKHRFunc acquireProfilingLockKHR;
+ReleaseProfilingLockKHRFunc releaseProfilingLockKHR;
GetPipelineExecutablePropertiesKHRFunc getPipelineExecutablePropertiesKHR;
GetPipelineExecutableStatisticsKHRFunc getPipelineExecutableStatisticsKHR;
GetPipelineExecutableInternalRepresentationsKHRFunc getPipelineExecutableInternalRepresentationsKHR;
-GetSemaphoreCounterValueKHRFunc getSemaphoreCounterValueKHR;
-WaitSemaphoresKHRFunc waitSemaphoresKHR;
-SignalSemaphoreKHRFunc signalSemaphoreKHR;
DebugMarkerSetObjectTagEXTFunc debugMarkerSetObjectTagEXT;
DebugMarkerSetObjectNameEXTFunc debugMarkerSetObjectNameEXT;
CmdDebugMarkerBeginEXTFunc cmdDebugMarkerBeginEXT;
@@ -240,9 +246,18 @@
CmdSetExclusiveScissorNVFunc cmdSetExclusiveScissorNV;
CmdSetCheckpointNVFunc cmdSetCheckpointNV;
GetQueueCheckpointDataNVFunc getQueueCheckpointDataNV;
+InitializePerformanceApiINTELFunc initializePerformanceApiINTEL;
+UninitializePerformanceApiINTELFunc uninitializePerformanceApiINTEL;
+CmdSetPerformanceMarkerINTELFunc cmdSetPerformanceMarkerINTEL;
+CmdSetPerformanceStreamMarkerINTELFunc cmdSetPerformanceStreamMarkerINTEL;
+CmdSetPerformanceOverrideINTELFunc cmdSetPerformanceOverrideINTEL;
+AcquirePerformanceConfigurationINTELFunc acquirePerformanceConfigurationINTEL;
+ReleasePerformanceConfigurationINTELFunc releasePerformanceConfigurationINTEL;
+QueueSetPerformanceConfigurationINTELFunc queueSetPerformanceConfigurationINTEL;
+GetPerformanceParameterINTELFunc getPerformanceParameterINTEL;
SetLocalDimmingAMDFunc setLocalDimmingAMD;
GetBufferDeviceAddressEXTFunc getBufferDeviceAddressEXT;
-ResetQueryPoolEXTFunc resetQueryPoolEXT;
+CmdSetLineStippleEXTFunc cmdSetLineStippleEXT;
GetAndroidHardwareBufferPropertiesANDROIDFunc getAndroidHardwareBufferPropertiesANDROID;
GetMemoryAndroidHardwareBufferANDROIDFunc getMemoryAndroidHardwareBufferANDROID;
GetMemoryWin32HandleKHRFunc getMemoryWin32HandleKHR;
diff --git a/external/vulkancts/framework/vulkan/vkDeviceProperties.cpp b/external/vulkancts/framework/vulkan/vkDeviceProperties.cpp
new file mode 100644
index 0000000..bf90c30
--- /dev/null
+++ b/external/vulkancts/framework/vulkan/vkDeviceProperties.cpp
@@ -0,0 +1,112 @@
+/*-------------------------------------------------------------------------
+* Vulkan CTS
+* ----------
+*
+* 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.
+*/
+
+#include "deSTLUtil.hpp"
+#include "deString.h"
+#include "vkQueryUtil.hpp"
+#include "vkDeviceProperties.inl"
+#include "vkDeviceProperties.hpp"
+
+namespace vk
+{
+
+DeviceProperties::DeviceProperties (const InstanceInterface& vki,
+ const deUint32 apiVersion,
+ const VkPhysicalDevice physicalDevice,
+ const std::vector<std::string>& instanceExtensions,
+ const std::vector<std::string>& deviceExtensions)
+{
+ m_coreProperties2 = initVulkanStructure();
+
+ if (isInstanceExtensionSupported(apiVersion, instanceExtensions, "VK_KHR_get_physical_device_properties2"))
+ {
+ const std::vector<VkExtensionProperties> deviceExtensionProperties = enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
+ void** nextPtr = &m_coreProperties2.pNext;
+
+ for (size_t i = 0; i < DE_LENGTH_OF_ARRAY(propertyStructCreatorMap); ++i)
+ {
+ const char* propertyName = propertyStructCreatorMap[i].name;
+
+ if (de::contains(deviceExtensions.begin(), deviceExtensions.end(), propertyName))
+ {
+ PropertyStruct* p = createPropertyStructWrapper(propertyName);
+
+ if (p)
+ {
+ *nextPtr = p->getPropertyTypeRaw();
+ nextPtr = p->getPropertyTypeNext();
+ m_properties.push_back(p);
+ }
+ }
+ }
+
+ vki.getPhysicalDeviceProperties2(physicalDevice, &m_coreProperties2);
+ }
+ else
+ m_coreProperties2.properties = getPhysicalDeviceProperties(vki, physicalDevice);
+}
+
+bool DeviceProperties::contains (const std::string& property, bool throwIfNotExists) const
+{
+ const size_t typesSize = m_properties.size();
+
+ for (size_t typeIdx = 0; typeIdx < typesSize; ++typeIdx)
+ {
+ if (deStringEqual(m_properties[typeIdx]->getPropertyDesc().name, property.c_str()))
+ {
+ return true;
+ }
+ }
+
+ if (throwIfNotExists)
+ {
+ std::string msg("Property " + property + " is not supported");
+
+ TCU_THROW(NotSupportedError, msg);
+ }
+
+ return false;
+}
+
+bool DeviceProperties::isDevicePropertyInitialized (VkStructureType sType) const
+{
+ return findStructureInChain(&m_coreProperties2, sType) != DE_NULL;
+}
+
+DeviceProperties::~DeviceProperties (void)
+{
+ for (size_t i = 0; i < m_properties.size(); ++i)
+ delete m_properties[i];
+
+ m_properties.clear();
+}
+
+PropertyStruct* DeviceProperties::createPropertyStructWrapper (const std::string& s)
+{
+ for (size_t i = 0; i < DE_LENGTH_OF_ARRAY(propertyStructCreatorMap); ++i)
+ {
+ if (deStringEqual(propertyStructCreatorMap[i].name, s.c_str()))
+ return (*propertyStructCreatorMap[i].creator)();
+ }
+
+ return DE_NULL;
+}
+
+} // vk
+
diff --git a/external/vulkancts/framework/vulkan/vkDeviceProperties.hpp b/external/vulkancts/framework/vulkan/vkDeviceProperties.hpp
new file mode 100644
index 0000000..8254587
--- /dev/null
+++ b/external/vulkancts/framework/vulkan/vkDeviceProperties.hpp
@@ -0,0 +1,178 @@
+#ifndef _VKDEVICEPROPERTIES_HPP
+#define _VKDEVICEPROPERTIES_HPP
+/*-------------------------------------------------------------------------
+ * Vulkan CTS Framework
+ * --------------------
+ *
+ * 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 Vulkan DeviceProperties class utility.
+ *//*--------------------------------------------------------------------*/
+
+#include <map>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "deMemory.h"
+#include "vkDefs.hpp"
+
+namespace vk
+{
+
+struct PropertyDesc
+{
+ PropertyDesc (VkStructureType sType_, const char* name_, deUint32 specVersion_, deUint32 typeId_)
+ : name (name_)
+ , sType (sType_)
+ , specVersion (specVersion_)
+ , typeId (typeId_)
+ {}
+
+ const char* name;
+ VkStructureType sType;
+ const deUint32 specVersion;
+ const deUint32 typeId;
+};
+
+struct PropertyStruct
+{
+ virtual deUint32 getPropertyTypeId (void) const = 0;
+ virtual PropertyDesc getPropertyDesc (void) const = 0;
+ virtual void** getPropertyTypeNext (void) = 0;
+ virtual void* getPropertyTypeRaw (void) = 0;
+ virtual ~PropertyStruct (void) {}
+};
+
+
+struct PropertyStructMapItem
+{
+ PropertyStruct* (*creator)(void);
+ const char* name;
+ deUint32 specVersion;
+};
+
+template<class PropertyType> struct PropertyStructWrapper;
+template<class PropertyType> PropertyDesc makePropertyDesc (void);
+
+template<class PropertyType>
+PropertyStruct* createPropertyStructWrapper (void)
+{
+ return new PropertyStructWrapper<PropertyType>(makePropertyDesc<PropertyType>());
+}
+
+class DeviceProperties
+{
+public:
+ DeviceProperties (const InstanceInterface& vki,
+ const deUint32 apiVersion,
+ const VkPhysicalDevice physicalDevice,
+ const std::vector<std::string>& instanceExtensions,
+ const std::vector<std::string>& deviceExtensions);
+
+ ~DeviceProperties (void);
+
+ template<class PropertyType>
+ bool getPropertyType (PropertyType& propertyType) const
+ {
+ typedef PropertyStructWrapper<PropertyType> *PropertyWrapperPtr;
+
+ const VkStructureType sType = makePropertyDesc<PropertyType>().sType;
+ const size_t propCount = m_properties.size();
+
+ for (size_t propIdx = 0; propIdx < propCount; ++propIdx)
+ {
+ if (sType == m_properties[propIdx]->getPropertyDesc().sType)
+ {
+ propertyType = static_cast<PropertyWrapperPtr>(m_properties[propIdx])->getPropertyTypeRef();
+ return true;
+ }
+ }
+ return false;
+ }
+
+ template<class PropertyType>
+ const PropertyType& getPropertyType (void) const
+ {
+ typedef PropertyStructWrapper<PropertyType> *PropertyWrapperPtr;
+
+ const PropertyDesc propDesc = makePropertyDesc<PropertyType>();
+ const VkStructureType sType = propDesc.sType;
+ const size_t propCount = m_properties.size();
+
+ for (size_t propIdx = 0; propIdx < propCount; ++propIdx)
+ {
+ if (sType == m_properties[propIdx]->getPropertyDesc().sType)
+ return static_cast<PropertyWrapperPtr>(m_properties[propIdx])->getPropertyTypeRef();
+ }
+
+ const deUint32 propertyId = propDesc.typeId;
+
+ for (size_t propIdx = 0; propIdx < propCount; ++propIdx)
+ {
+ if (propertyId == m_properties[propIdx]->getPropertyTypeId())
+ return static_cast<PropertyWrapperPtr>(m_properties[propIdx])->getPropertyTypeRef();
+ }
+
+ PropertyStruct* p = vk::createPropertyStructWrapper<PropertyType>();
+ m_properties.push_back(p);
+
+ return static_cast<PropertyWrapperPtr>(p)->getPropertyTypeRef();
+ }
+
+ const VkPhysicalDeviceProperties2& getCoreProperties2 (void) const { return m_coreProperties2; }
+
+ bool contains (const std::string& property, bool throwIfNotExists = false) const;
+
+ bool isDevicePropertyInitialized (VkStructureType sType) const;
+
+private:
+ static PropertyStruct* createPropertyStructWrapper (const std::string& s);
+
+ VkPhysicalDeviceProperties2 m_coreProperties2;
+ mutable std::vector<PropertyStruct*> m_properties;
+};
+
+template<class PropertyType>
+struct PropertyStructWrapper : PropertyStruct
+{
+ const PropertyDesc m_propertyDesc;
+ PropertyType m_propertyType;
+
+ PropertyStructWrapper (void)
+ : m_propertyDesc (VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, DE_NULL, ~0u, 0u)
+ {
+ deMemset(&m_propertyType, 0, sizeof(m_propertyType));
+ }
+
+ PropertyStructWrapper (const PropertyDesc& propertyDesc)
+ : m_propertyDesc (propertyDesc)
+ {
+ deMemset(&m_propertyType, 0, sizeof(m_propertyType));
+ m_propertyType.sType = propertyDesc.sType;
+ }
+
+ deUint32 getPropertyTypeId (void) const { return m_propertyDesc.typeId; }
+ PropertyDesc getPropertyDesc (void) const { return m_propertyDesc; }
+ void** getPropertyTypeNext (void) { return &m_propertyType.pNext; }
+ void* getPropertyTypeRaw (void) { return &m_propertyType; }
+ PropertyType& getPropertyTypeRef (void) { return m_propertyType; }
+};
+
+} // vk
+
+#endif // _VKDEVICEPROPERTIES_HPP
diff --git a/external/vulkancts/framework/vulkan/vkDeviceProperties.inl b/external/vulkancts/framework/vulkan/vkDeviceProperties.inl
new file mode 100644
index 0000000..c982849
--- /dev/null
+++ b/external/vulkancts/framework/vulkan/vkDeviceProperties.inl
@@ -0,0 +1,115 @@
+/* WARNING: This is auto-generated file. Do not modify, since changes will
+ * be lost! Modify the generating script instead.
+ */
+#include "vkDeviceProperties.hpp"
+
+namespace vk
+{
+#define VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME "VK_EXT_blend_operation_advanced"
+#define VK_EXT_CONSERVATIVE_RASTERIZATION_EXTENSION_NAME "VK_EXT_conservative_rasterization"
+#define VK_NV_COOPERATIVE_MATRIX_EXTENSION_NAME "VK_NV_cooperative_matrix"
+#define VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME "VK_KHR_depth_stencil_resolve"
+#define VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME "VK_EXT_descriptor_indexing"
+#define VK_EXT_DISCARD_RECTANGLES_EXTENSION_NAME "VK_EXT_discard_rectangles"
+#define DECL_DRIVER_EXTENSION_NAME "not_existent_property"
+#define VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME "VK_EXT_external_memory_host"
+#define VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME "VK_KHR_shader_float_controls"
+#define VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME "VK_EXT_fragment_density_map"
+#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_KHR_MAINTENANCE3_EXTENSION_NAME "VK_KHR_maintenance3"
+#define DECL_2_MEMORY_EXTENSION_NAME "not_existent_property"
+#define VK_EXT_MEMORY_BUDGET_EXTENSION_NAME "VK_EXT_memory_budget"
+#define VK_NV_MESH_SHADER_EXTENSION_NAME "VK_NV_mesh_shader"
+#define VK_KHR_MULTIVIEW_EXTENSION_NAME "VK_KHR_multiview"
+#define VK_NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_EXTENSION_NAME "VK_NVX_multiview_per_view_attributes"
+#define VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME "VK_KHR_performance_query"
+#define DECL_POINT_CLIPPING_EXTENSION_NAME "not_existent_property"
+#define DECL_PROTECTED_MEMORY_EXTENSION_NAME "not_existent_property"
+#define VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME "VK_KHR_push_descriptor"
+#define VK_NV_RAY_TRACING_EXTENSION_NAME "VK_NV_ray_tracing"
+#define VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME "VK_EXT_sampler_filter_minmax"
+#define VK_EXT_SAMPLE_LOCATIONS_EXTENSION_NAME "VK_EXT_sample_locations"
+#define DECL_AMD_SHADER_CORE_EXTENSION_NAME "not_existent_property"
+#define VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME "VK_NV_shading_rate_image"
+#define DECL_SUBGROUP_EXTENSION_NAME "not_existent_property"
+#define VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME "VK_EXT_subgroup_size_control"
+#define VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME "VK_EXT_texel_buffer_alignment"
+#define VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME "VK_KHR_timeline_semaphore"
+#define VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME "VK_EXT_transform_feedback"
+#define VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME "VK_EXT_vertex_attribute_divisor"
+
+
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT, VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME, VK_EXT_BLEND_OPERATION_ADVANCED_SPEC_VERSION, 33); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceConservativeRasterizationPropertiesEXT>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT, VK_EXT_CONSERVATIVE_RASTERIZATION_EXTENSION_NAME, VK_EXT_CONSERVATIVE_RASTERIZATION_SPEC_VERSION, 32); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceCooperativeMatrixPropertiesNV>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV, VK_NV_COOPERATIVE_MATRIX_EXTENSION_NAME, VK_NV_COOPERATIVE_MATRIX_SPEC_VERSION, 31); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceDepthStencilResolveProperties>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES, VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME, VK_KHR_DEPTH_STENCIL_RESOLVE_SPEC_VERSION, 30); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceDescriptorIndexingProperties>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES, VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME, VK_EXT_DESCRIPTOR_INDEXING_SPEC_VERSION, 29); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceDiscardRectanglePropertiesEXT>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT, VK_EXT_DISCARD_RECTANGLES_EXTENSION_NAME, VK_EXT_DISCARD_RECTANGLES_SPEC_VERSION, 28); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceDriverProperties>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES, DECL_DRIVER_EXTENSION_NAME, 0, 27); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceExternalMemoryHostPropertiesEXT>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT, VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME, VK_EXT_EXTERNAL_MEMORY_HOST_SPEC_VERSION, 26); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceFloatControlsProperties>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES, VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME, VK_KHR_SHADER_FLOAT_CONTROLS_SPEC_VERSION, 25); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceFragmentDensityMapPropertiesEXT>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT, VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME, VK_EXT_FRAGMENT_DENSITY_MAP_SPEC_VERSION, 24); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceInlineUniformBlockPropertiesEXT>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT, VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME, VK_EXT_INLINE_UNIFORM_BLOCK_SPEC_VERSION, 23); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceLineRasterizationPropertiesEXT>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT, VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME, VK_EXT_LINE_RASTERIZATION_SPEC_VERSION, 22); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceMaintenance3Properties>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES, VK_KHR_MAINTENANCE3_EXTENSION_NAME, VK_KHR_MAINTENANCE3_SPEC_VERSION, 21); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceMemoryProperties2>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2, DECL_2_MEMORY_EXTENSION_NAME, 0, 20); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceMemoryBudgetPropertiesEXT>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT, VK_EXT_MEMORY_BUDGET_EXTENSION_NAME, VK_EXT_MEMORY_BUDGET_SPEC_VERSION, 19); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceMeshShaderPropertiesNV>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV, VK_NV_MESH_SHADER_EXTENSION_NAME, VK_NV_MESH_SHADER_SPEC_VERSION, 18); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceMultiviewProperties>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, VK_KHR_MULTIVIEW_EXTENSION_NAME, VK_KHR_MULTIVIEW_SPEC_VERSION, 17); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX, VK_NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_EXTENSION_NAME, VK_NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_SPEC_VERSION, 16); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDevicePerformanceQueryPropertiesKHR>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR, VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME, VK_KHR_PERFORMANCE_QUERY_SPEC_VERSION, 15); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDevicePointClippingProperties>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES, DECL_POINT_CLIPPING_EXTENSION_NAME, 0, 14); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceProtectedMemoryProperties>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES, DECL_PROTECTED_MEMORY_EXTENSION_NAME, 0, 13); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDevicePushDescriptorPropertiesKHR>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, VK_KHR_PUSH_DESCRIPTOR_SPEC_VERSION, 12); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceRayTracingPropertiesNV>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV, VK_NV_RAY_TRACING_EXTENSION_NAME, VK_NV_RAY_TRACING_SPEC_VERSION, 11); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceSamplerFilterMinmaxProperties>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES, VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME, VK_EXT_SAMPLER_FILTER_MINMAX_SPEC_VERSION, 10); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceSampleLocationsPropertiesEXT>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT, VK_EXT_SAMPLE_LOCATIONS_EXTENSION_NAME, VK_EXT_SAMPLE_LOCATIONS_SPEC_VERSION, 9); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceShaderCorePropertiesAMD>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD, DECL_AMD_SHADER_CORE_EXTENSION_NAME, 0, 8); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceShadingRateImagePropertiesNV>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV, VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME, VK_NV_SHADING_RATE_IMAGE_SPEC_VERSION, 7); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceSubgroupProperties>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES, DECL_SUBGROUP_EXTENSION_NAME, 0, 6); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceSubgroupSizeControlPropertiesEXT>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT, VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, VK_EXT_SUBGROUP_SIZE_CONTROL_SPEC_VERSION, 5); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT, VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME, VK_EXT_TEXEL_BUFFER_ALIGNMENT_SPEC_VERSION, 4); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceTimelineSemaphoreProperties>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES, VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, VK_KHR_TIMELINE_SEMAPHORE_SPEC_VERSION, 3); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceTransformFeedbackPropertiesEXT>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, VK_EXT_TRANSFORM_FEEDBACK_SPEC_VERSION, 2); }
+template<> PropertyDesc makePropertyDesc<VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT>(void) { return PropertyDesc(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT, VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION, 1); }
+
+
+static const PropertyStructMapItem propertyStructCreatorMap[] =
+{
+ { createPropertyStructWrapper<VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT>, VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME, VK_EXT_BLEND_OPERATION_ADVANCED_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDeviceConservativeRasterizationPropertiesEXT>, VK_EXT_CONSERVATIVE_RASTERIZATION_EXTENSION_NAME, VK_EXT_CONSERVATIVE_RASTERIZATION_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDeviceCooperativeMatrixPropertiesNV>, VK_NV_COOPERATIVE_MATRIX_EXTENSION_NAME, VK_NV_COOPERATIVE_MATRIX_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDeviceDepthStencilResolveProperties>, VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME, VK_KHR_DEPTH_STENCIL_RESOLVE_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDeviceDescriptorIndexingProperties>, VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME, VK_EXT_DESCRIPTOR_INDEXING_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDeviceDiscardRectanglePropertiesEXT>, VK_EXT_DISCARD_RECTANGLES_EXTENSION_NAME, VK_EXT_DISCARD_RECTANGLES_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDeviceDriverProperties>, DECL_DRIVER_EXTENSION_NAME, 0 },
+ { createPropertyStructWrapper<VkPhysicalDeviceExternalMemoryHostPropertiesEXT>, VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME, VK_EXT_EXTERNAL_MEMORY_HOST_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDeviceFloatControlsProperties>, VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME, VK_KHR_SHADER_FLOAT_CONTROLS_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDeviceFragmentDensityMapPropertiesEXT>, VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME, VK_EXT_FRAGMENT_DENSITY_MAP_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDeviceInlineUniformBlockPropertiesEXT>, VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME, VK_EXT_INLINE_UNIFORM_BLOCK_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDeviceLineRasterizationPropertiesEXT>, VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME, VK_EXT_LINE_RASTERIZATION_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDeviceMaintenance3Properties>, VK_KHR_MAINTENANCE3_EXTENSION_NAME, VK_KHR_MAINTENANCE3_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDeviceMemoryProperties2>, DECL_2_MEMORY_EXTENSION_NAME, 0 },
+ { createPropertyStructWrapper<VkPhysicalDeviceMemoryBudgetPropertiesEXT>, VK_EXT_MEMORY_BUDGET_EXTENSION_NAME, VK_EXT_MEMORY_BUDGET_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDeviceMeshShaderPropertiesNV>, VK_NV_MESH_SHADER_EXTENSION_NAME, VK_NV_MESH_SHADER_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDeviceMultiviewProperties>, VK_KHR_MULTIVIEW_EXTENSION_NAME, VK_KHR_MULTIVIEW_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX>, VK_NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_EXTENSION_NAME, VK_NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDevicePerformanceQueryPropertiesKHR>, VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME, VK_KHR_PERFORMANCE_QUERY_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDevicePointClippingProperties>, DECL_POINT_CLIPPING_EXTENSION_NAME, 0 },
+ { createPropertyStructWrapper<VkPhysicalDeviceProtectedMemoryProperties>, DECL_PROTECTED_MEMORY_EXTENSION_NAME, 0 },
+ { createPropertyStructWrapper<VkPhysicalDevicePushDescriptorPropertiesKHR>, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, VK_KHR_PUSH_DESCRIPTOR_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDeviceRayTracingPropertiesNV>, VK_NV_RAY_TRACING_EXTENSION_NAME, VK_NV_RAY_TRACING_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDeviceSamplerFilterMinmaxProperties>, VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME, VK_EXT_SAMPLER_FILTER_MINMAX_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDeviceSampleLocationsPropertiesEXT>, VK_EXT_SAMPLE_LOCATIONS_EXTENSION_NAME, VK_EXT_SAMPLE_LOCATIONS_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDeviceShaderCorePropertiesAMD>, DECL_AMD_SHADER_CORE_EXTENSION_NAME, 0 },
+ { createPropertyStructWrapper<VkPhysicalDeviceShadingRateImagePropertiesNV>, VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME, VK_NV_SHADING_RATE_IMAGE_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDeviceSubgroupProperties>, DECL_SUBGROUP_EXTENSION_NAME, 0 },
+ { createPropertyStructWrapper<VkPhysicalDeviceSubgroupSizeControlPropertiesEXT>, VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, VK_EXT_SUBGROUP_SIZE_CONTROL_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT>, VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME, VK_EXT_TEXEL_BUFFER_ALIGNMENT_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDeviceTimelineSemaphoreProperties>, VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, VK_KHR_TIMELINE_SEMAPHORE_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDeviceTransformFeedbackPropertiesEXT>, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, VK_EXT_TRANSFORM_FEEDBACK_SPEC_VERSION },
+ { createPropertyStructWrapper<VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT>, VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION },
+};
+} // vk
+
diff --git a/external/vulkancts/framework/vulkan/vkDevicePropertiesForContextDecl.inl b/external/vulkancts/framework/vulkan/vkDevicePropertiesForContextDecl.inl
new file mode 100644
index 0000000..5c5c70d
--- /dev/null
+++ b/external/vulkancts/framework/vulkan/vkDevicePropertiesForContextDecl.inl
@@ -0,0 +1,36 @@
+/* WARNING: This is auto-generated file. Do not modify, since changes will
+ * be lost! Modify the generating script instead.
+ */
+const vk::VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT& getBlendOperationAdvancedPropertiesEXT (void) const;
+const vk::VkPhysicalDeviceConservativeRasterizationPropertiesEXT& getConservativeRasterizationPropertiesEXT (void) const;
+const vk::VkPhysicalDeviceCooperativeMatrixPropertiesNV& getCooperativeMatrixProperties (void) const;
+const vk::VkPhysicalDeviceDepthStencilResolveProperties& getDepthStencilResolveProperties (void) const;
+const vk::VkPhysicalDeviceDescriptorIndexingProperties& getDescriptorIndexingProperties (void) const;
+const vk::VkPhysicalDeviceDiscardRectanglePropertiesEXT& getDiscardRectanglePropertiesEXT (void) const;
+const vk::VkPhysicalDeviceDriverProperties& getDriverProperties (void) const;
+const vk::VkPhysicalDeviceExternalMemoryHostPropertiesEXT& getExternalMemoryHostPropertiesEXT (void) const;
+const vk::VkPhysicalDeviceFloatControlsProperties& getFloatControlsProperties (void) const;
+const vk::VkPhysicalDeviceFragmentDensityMapPropertiesEXT& getFragmentDensityMapPropertiesEXT (void) const;
+const vk::VkPhysicalDeviceInlineUniformBlockPropertiesEXT& getInlineUniformBlockPropertiesEXT (void) const;
+const vk::VkPhysicalDeviceLineRasterizationPropertiesEXT& getLineRasterizationPropertiesEXT (void) const;
+const vk::VkPhysicalDeviceMaintenance3Properties& getMaintenance3Properties (void) const;
+const vk::VkPhysicalDeviceMemoryProperties2& getMemoryProperties2 (void) const;
+const vk::VkPhysicalDeviceMemoryBudgetPropertiesEXT& getMemoryBudgetPropertiesEXT (void) const;
+const vk::VkPhysicalDeviceMeshShaderPropertiesNV& getMeshShaderProperties (void) const;
+const vk::VkPhysicalDeviceMultiviewProperties& getMultiviewProperties (void) const;
+const vk::VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX& getMultiviewPerViewAttributesPropertiesX (void) const;
+const vk::VkPhysicalDevicePerformanceQueryPropertiesKHR& getPerformanceQueryProperties (void) const;
+const vk::VkPhysicalDevicePointClippingProperties& getPointClippingProperties (void) const;
+const vk::VkPhysicalDeviceProtectedMemoryProperties& getProtectedMemoryProperties (void) const;
+const vk::VkPhysicalDevicePushDescriptorPropertiesKHR& getPushDescriptorProperties (void) const;
+const vk::VkPhysicalDeviceRayTracingPropertiesNV& getRayTracingProperties (void) const;
+const vk::VkPhysicalDeviceSamplerFilterMinmaxProperties& getSamplerFilterMinmaxProperties (void) const;
+const vk::VkPhysicalDeviceSampleLocationsPropertiesEXT& getSampleLocationsPropertiesEXT (void) const;
+const vk::VkPhysicalDeviceShaderCorePropertiesAMD& getShaderCorePropertiesAMD (void) const;
+const vk::VkPhysicalDeviceShadingRateImagePropertiesNV& getShadingRateImageProperties (void) const;
+const vk::VkPhysicalDeviceSubgroupProperties& getSubgroupProperties (void) const;
+const vk::VkPhysicalDeviceSubgroupSizeControlPropertiesEXT& getSubgroupSizeControlPropertiesEXT (void) const;
+const vk::VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT& getTexelBufferAlignmentPropertiesEXT (void) const;
+const vk::VkPhysicalDeviceTimelineSemaphoreProperties& getTimelineSemaphoreProperties (void) const;
+const vk::VkPhysicalDeviceTransformFeedbackPropertiesEXT& getTransformFeedbackPropertiesEXT (void) const;
+const vk::VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT& getVertexAttributeDivisorPropertiesEXT (void) const;
diff --git a/external/vulkancts/framework/vulkan/vkDevicePropertiesForContextDefs.inl b/external/vulkancts/framework/vulkan/vkDevicePropertiesForContextDefs.inl
new file mode 100644
index 0000000..bc6b963
--- /dev/null
+++ b/external/vulkancts/framework/vulkan/vkDevicePropertiesForContextDefs.inl
@@ -0,0 +1,36 @@
+/* WARNING: This is auto-generated file. Do not modify, since changes will
+ * be lost! Modify the generating script instead.
+ */
+const vk::VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT& Context::getBlendOperationAdvancedPropertiesEXT (void) const { return m_device->getBlendOperationAdvancedPropertiesEXT(); }
+const vk::VkPhysicalDeviceConservativeRasterizationPropertiesEXT& Context::getConservativeRasterizationPropertiesEXT (void) const { return m_device->getConservativeRasterizationPropertiesEXT(); }
+const vk::VkPhysicalDeviceCooperativeMatrixPropertiesNV& Context::getCooperativeMatrixProperties (void) const { return m_device->getCooperativeMatrixProperties(); }
+const vk::VkPhysicalDeviceDepthStencilResolveProperties& Context::getDepthStencilResolveProperties (void) const { return m_device->getDepthStencilResolveProperties(); }
+const vk::VkPhysicalDeviceDescriptorIndexingProperties& Context::getDescriptorIndexingProperties (void) const { return m_device->getDescriptorIndexingProperties(); }
+const vk::VkPhysicalDeviceDiscardRectanglePropertiesEXT& Context::getDiscardRectanglePropertiesEXT (void) const { return m_device->getDiscardRectanglePropertiesEXT(); }
+const vk::VkPhysicalDeviceDriverProperties& Context::getDriverProperties (void) const { return m_device->getDriverProperties(); }
+const vk::VkPhysicalDeviceExternalMemoryHostPropertiesEXT& Context::getExternalMemoryHostPropertiesEXT (void) const { return m_device->getExternalMemoryHostPropertiesEXT(); }
+const vk::VkPhysicalDeviceFloatControlsProperties& Context::getFloatControlsProperties (void) const { return m_device->getFloatControlsProperties(); }
+const vk::VkPhysicalDeviceFragmentDensityMapPropertiesEXT& Context::getFragmentDensityMapPropertiesEXT (void) const { return m_device->getFragmentDensityMapPropertiesEXT(); }
+const vk::VkPhysicalDeviceInlineUniformBlockPropertiesEXT& Context::getInlineUniformBlockPropertiesEXT (void) const { return m_device->getInlineUniformBlockPropertiesEXT(); }
+const vk::VkPhysicalDeviceLineRasterizationPropertiesEXT& Context::getLineRasterizationPropertiesEXT (void) const { return m_device->getLineRasterizationPropertiesEXT(); }
+const vk::VkPhysicalDeviceMaintenance3Properties& Context::getMaintenance3Properties (void) const { return m_device->getMaintenance3Properties(); }
+const vk::VkPhysicalDeviceMemoryProperties2& Context::getMemoryProperties2 (void) const { return m_device->getMemoryProperties2(); }
+const vk::VkPhysicalDeviceMemoryBudgetPropertiesEXT& Context::getMemoryBudgetPropertiesEXT (void) const { return m_device->getMemoryBudgetPropertiesEXT(); }
+const vk::VkPhysicalDeviceMeshShaderPropertiesNV& Context::getMeshShaderProperties (void) const { return m_device->getMeshShaderProperties(); }
+const vk::VkPhysicalDeviceMultiviewProperties& Context::getMultiviewProperties (void) const { return m_device->getMultiviewProperties(); }
+const vk::VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX& Context::getMultiviewPerViewAttributesPropertiesX (void) const { return m_device->getMultiviewPerViewAttributesPropertiesX(); }
+const vk::VkPhysicalDevicePerformanceQueryPropertiesKHR& Context::getPerformanceQueryProperties (void) const { return m_device->getPerformanceQueryProperties(); }
+const vk::VkPhysicalDevicePointClippingProperties& Context::getPointClippingProperties (void) const { return m_device->getPointClippingProperties(); }
+const vk::VkPhysicalDeviceProtectedMemoryProperties& Context::getProtectedMemoryProperties (void) const { return m_device->getProtectedMemoryProperties(); }
+const vk::VkPhysicalDevicePushDescriptorPropertiesKHR& Context::getPushDescriptorProperties (void) const { return m_device->getPushDescriptorProperties(); }
+const vk::VkPhysicalDeviceRayTracingPropertiesNV& Context::getRayTracingProperties (void) const { return m_device->getRayTracingProperties(); }
+const vk::VkPhysicalDeviceSamplerFilterMinmaxProperties& Context::getSamplerFilterMinmaxProperties (void) const { return m_device->getSamplerFilterMinmaxProperties(); }
+const vk::VkPhysicalDeviceSampleLocationsPropertiesEXT& Context::getSampleLocationsPropertiesEXT (void) const { return m_device->getSampleLocationsPropertiesEXT(); }
+const vk::VkPhysicalDeviceShaderCorePropertiesAMD& Context::getShaderCorePropertiesAMD (void) const { return m_device->getShaderCorePropertiesAMD(); }
+const vk::VkPhysicalDeviceShadingRateImagePropertiesNV& Context::getShadingRateImageProperties (void) const { return m_device->getShadingRateImageProperties(); }
+const vk::VkPhysicalDeviceSubgroupProperties& Context::getSubgroupProperties (void) const { return m_device->getSubgroupProperties(); }
+const vk::VkPhysicalDeviceSubgroupSizeControlPropertiesEXT& Context::getSubgroupSizeControlPropertiesEXT (void) const { return m_device->getSubgroupSizeControlPropertiesEXT(); }
+const vk::VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT& Context::getTexelBufferAlignmentPropertiesEXT (void) const { return m_device->getTexelBufferAlignmentPropertiesEXT(); }
+const vk::VkPhysicalDeviceTimelineSemaphoreProperties& Context::getTimelineSemaphoreProperties (void) const { return m_device->getTimelineSemaphoreProperties(); }
+const vk::VkPhysicalDeviceTransformFeedbackPropertiesEXT& Context::getTransformFeedbackPropertiesEXT (void) const { return m_device->getTransformFeedbackPropertiesEXT(); }
+const vk::VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT& Context::getVertexAttributeDivisorPropertiesEXT (void) const { return m_device->getVertexAttributeDivisorPropertiesEXT(); }
diff --git a/external/vulkancts/framework/vulkan/vkDevicePropertiesForDefaultDeviceDefs.inl b/external/vulkancts/framework/vulkan/vkDevicePropertiesForDefaultDeviceDefs.inl
new file mode 100644
index 0000000..ad799a9
--- /dev/null
+++ b/external/vulkancts/framework/vulkan/vkDevicePropertiesForDefaultDeviceDefs.inl
@@ -0,0 +1,36 @@
+/* WARNING: This is auto-generated file. Do not modify, since changes will
+ * be lost! Modify the generating script instead.
+ */
+const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT& getBlendOperationAdvancedPropertiesEXT (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT>(); }
+const VkPhysicalDeviceConservativeRasterizationPropertiesEXT& getConservativeRasterizationPropertiesEXT (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceConservativeRasterizationPropertiesEXT>(); }
+const VkPhysicalDeviceCooperativeMatrixPropertiesNV& getCooperativeMatrixProperties (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceCooperativeMatrixPropertiesNV>(); }
+const VkPhysicalDeviceDepthStencilResolveProperties& getDepthStencilResolveProperties (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceDepthStencilResolveProperties>(); }
+const VkPhysicalDeviceDescriptorIndexingProperties& getDescriptorIndexingProperties (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceDescriptorIndexingProperties>(); }
+const VkPhysicalDeviceDiscardRectanglePropertiesEXT& getDiscardRectanglePropertiesEXT (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceDiscardRectanglePropertiesEXT>(); }
+const VkPhysicalDeviceDriverProperties& getDriverProperties (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceDriverProperties>(); }
+const VkPhysicalDeviceExternalMemoryHostPropertiesEXT& getExternalMemoryHostPropertiesEXT (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceExternalMemoryHostPropertiesEXT>(); }
+const VkPhysicalDeviceFloatControlsProperties& getFloatControlsProperties (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceFloatControlsProperties>(); }
+const VkPhysicalDeviceFragmentDensityMapPropertiesEXT& getFragmentDensityMapPropertiesEXT (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceFragmentDensityMapPropertiesEXT>(); }
+const VkPhysicalDeviceInlineUniformBlockPropertiesEXT& getInlineUniformBlockPropertiesEXT (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceInlineUniformBlockPropertiesEXT>(); }
+const VkPhysicalDeviceLineRasterizationPropertiesEXT& getLineRasterizationPropertiesEXT (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceLineRasterizationPropertiesEXT>(); }
+const VkPhysicalDeviceMaintenance3Properties& getMaintenance3Properties (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceMaintenance3Properties>(); }
+const VkPhysicalDeviceMemoryProperties2& getMemoryProperties2 (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceMemoryProperties2>(); }
+const VkPhysicalDeviceMemoryBudgetPropertiesEXT& getMemoryBudgetPropertiesEXT (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceMemoryBudgetPropertiesEXT>(); }
+const VkPhysicalDeviceMeshShaderPropertiesNV& getMeshShaderProperties (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceMeshShaderPropertiesNV>(); }
+const VkPhysicalDeviceMultiviewProperties& getMultiviewProperties (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceMultiviewProperties>(); }
+const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX& getMultiviewPerViewAttributesPropertiesX (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX>(); }
+const VkPhysicalDevicePerformanceQueryPropertiesKHR& getPerformanceQueryProperties (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDevicePerformanceQueryPropertiesKHR>(); }
+const VkPhysicalDevicePointClippingProperties& getPointClippingProperties (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDevicePointClippingProperties>(); }
+const VkPhysicalDeviceProtectedMemoryProperties& getProtectedMemoryProperties (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceProtectedMemoryProperties>(); }
+const VkPhysicalDevicePushDescriptorPropertiesKHR& getPushDescriptorProperties (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDevicePushDescriptorPropertiesKHR>(); }
+const VkPhysicalDeviceRayTracingPropertiesNV& getRayTracingProperties (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceRayTracingPropertiesNV>(); }
+const VkPhysicalDeviceSamplerFilterMinmaxProperties& getSamplerFilterMinmaxProperties (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceSamplerFilterMinmaxProperties>(); }
+const VkPhysicalDeviceSampleLocationsPropertiesEXT& getSampleLocationsPropertiesEXT (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceSampleLocationsPropertiesEXT>(); }
+const VkPhysicalDeviceShaderCorePropertiesAMD& getShaderCorePropertiesAMD (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceShaderCorePropertiesAMD>(); }
+const VkPhysicalDeviceShadingRateImagePropertiesNV& getShadingRateImageProperties (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceShadingRateImagePropertiesNV>(); }
+const VkPhysicalDeviceSubgroupProperties& getSubgroupProperties (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceSubgroupProperties>(); }
+const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT& getSubgroupSizeControlPropertiesEXT (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceSubgroupSizeControlPropertiesEXT>(); }
+const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT& getTexelBufferAlignmentPropertiesEXT (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT>(); }
+const VkPhysicalDeviceTimelineSemaphoreProperties& getTimelineSemaphoreProperties (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceTimelineSemaphoreProperties>(); }
+const VkPhysicalDeviceTransformFeedbackPropertiesEXT& getTransformFeedbackPropertiesEXT (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceTransformFeedbackPropertiesEXT>(); }
+const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT& getVertexAttributeDivisorPropertiesEXT (void) const { return m_devicePropertiesFull.getPropertyType<VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT>(); }
diff --git a/external/vulkancts/framework/vulkan/vkDeviceUtil.cpp b/external/vulkancts/framework/vulkan/vkDeviceUtil.cpp
index b76a208..0ffdf7e 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceUtil.cpp
+++ b/external/vulkancts/framework/vulkan/vkDeviceUtil.cpp
@@ -21,10 +21,12 @@
* \brief Instance and device initialization utilities.
*//*--------------------------------------------------------------------*/
+#include "deSTLUtil.hpp"
#include "vkDeviceUtil.hpp"
#include "vkQueryUtil.hpp"
#include "vkRefUtil.hpp"
#include "vkApiVersion.hpp"
+#include "vkDebugReportUtil.hpp"
#include "tcuCommandLine.hpp"
@@ -42,8 +44,27 @@
const vector<string>& enabledExtensions,
const VkAllocationCallbacks* pAllocator)
{
+ bool validationEnabled = (!enabledLayers.empty());
+ vector<string> actualExtensions = enabledExtensions;
+
+ if (validationEnabled)
+ {
+ // Make sure the debug report extension is enabled when validation is enabled.
+ if (!isDebugReportSupported(vkPlatform))
+ TCU_THROW(NotSupportedError, "VK_EXT_debug_report is not supported");
+
+ if (!de::contains(begin(actualExtensions), end(actualExtensions), "VK_EXT_debug_report"))
+ actualExtensions.push_back("VK_EXT_debug_report");
+ }
+
vector<const char*> layerNamePtrs (enabledLayers.size());
- vector<const char*> extensionNamePtrs (enabledExtensions.size());
+ vector<const char*> extensionNamePtrs (actualExtensions.size());
+
+ for (size_t ndx = 0; ndx < enabledLayers.size(); ++ndx)
+ layerNamePtrs[ndx] = enabledLayers[ndx].c_str();
+
+ for (size_t ndx = 0; ndx < actualExtensions.size(); ++ndx)
+ extensionNamePtrs[ndx] = actualExtensions[ndx].c_str();
const struct VkApplicationInfo appInfo =
{
@@ -62,17 +83,11 @@
(VkInstanceCreateFlags)0,
&appInfo,
(deUint32)layerNamePtrs.size(),
- layerNamePtrs.empty() ? DE_NULL : &layerNamePtrs[0],
+ (validationEnabled ? layerNamePtrs.data() : DE_NULL),
(deUint32)extensionNamePtrs.size(),
- extensionNamePtrs.empty() ? DE_NULL : &extensionNamePtrs[0],
+ (extensionNamePtrs.empty() ? DE_NULL : extensionNamePtrs.data()),
};
- for (size_t ndx = 0; ndx < enabledLayers.size(); ++ndx)
- layerNamePtrs[ndx] = enabledLayers[ndx].c_str();
-
- for (size_t ndx = 0; ndx < enabledExtensions.size(); ++ndx)
- extensionNamePtrs[ndx] = enabledExtensions[ndx].c_str();
-
return createInstance(vkPlatform, &instanceInfo, pAllocator);
}
@@ -81,31 +96,6 @@
return createDefaultInstance(vkPlatform, apiVersion, vector<string>(), vector<string>(), DE_NULL);
}
-Move<VkInstance> createInstanceWithExtensions (const PlatformInterface& vkp,
- const deUint32 version,
- const std::vector<std::string> requiredExtensions)
-{
- std::vector<std::string> extensionPtrs;
- const std::vector<VkExtensionProperties> availableExtensions = enumerateInstanceExtensionProperties(vkp, DE_NULL);
- for (size_t extensionID = 0; extensionID < requiredExtensions.size(); extensionID++)
- {
- if (!isInstanceExtensionSupported(version, availableExtensions, RequiredExtension(requiredExtensions[extensionID])))
- TCU_THROW(NotSupportedError, (requiredExtensions[extensionID] + " is not supported").c_str());
-
- if (!isCoreInstanceExtension(version, requiredExtensions[extensionID]))
- extensionPtrs.push_back(requiredExtensions[extensionID]);
- }
-
- return createDefaultInstance(vkp, version, std::vector<std::string>() /* layers */, extensionPtrs, DE_NULL);
-}
-
-Move<VkInstance> createInstanceWithExtension (const PlatformInterface& vkp,
- const deUint32 version,
- const std::string requiredExtension)
-{
- return createInstanceWithExtensions(vkp, version, std::vector<std::string>(1, requiredExtension));
-}
-
deUint32 chooseDeviceIndex (const InstanceInterface& vkInstance, const VkInstance instance, const tcu::CommandLine& cmdLine)
{
const vector<VkPhysicalDevice> devices = enumeratePhysicalDevices(vkInstance, instance);
diff --git a/external/vulkancts/framework/vulkan/vkDeviceUtil.hpp b/external/vulkancts/framework/vulkan/vkDeviceUtil.hpp
index f719202..cebdf15 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceUtil.hpp
+++ b/external/vulkancts/framework/vulkan/vkDeviceUtil.hpp
@@ -46,14 +46,6 @@
const std::vector<std::string>& enabledExtensions,
const VkAllocationCallbacks* pAllocator = DE_NULL);
-Move<VkInstance> createInstanceWithExtensions (const PlatformInterface& vkp,
- const deUint32 version,
- const std::vector<std::string> requiredExtensions);
-
-Move<VkInstance> createInstanceWithExtension (const PlatformInterface& vkp,
- const deUint32 version,
- const std::string requiredExtension);
-
deUint32 chooseDeviceIndex (const InstanceInterface& vkInstance,
const VkInstance instance,
const tcu::CommandLine& cmdLine);
diff --git a/external/vulkancts/framework/vulkan/vkExtensionFunctions.inl b/external/vulkancts/framework/vulkan/vkExtensionFunctions.inl
index db004a8..d8f2d9a 100644
--- a/external/vulkancts/framework/vulkan/vkExtensionFunctions.inl
+++ b/external/vulkancts/framework/vulkan/vkExtensionFunctions.inl
@@ -52,6 +52,11 @@
{
functions.push_back("vkGetPhysicalDeviceExternalFencePropertiesKHR");
}
+ else if (extName == "VK_KHR_performance_query")
+ {
+ functions.push_back("vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR");
+ functions.push_back("vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR");
+ }
else if (extName == "VK_KHR_get_surface_capabilities2")
{
functions.push_back("vkGetPhysicalDeviceSurfaceCapabilities2KHR");
@@ -240,6 +245,11 @@
functions.push_back("vkImportFenceFdKHR");
functions.push_back("vkGetFenceFdKHR");
}
+ else if (extName == "VK_KHR_performance_query")
+ {
+ functions.push_back("vkAcquireProfilingLockKHR");
+ functions.push_back("vkReleaseProfilingLockKHR");
+ }
else if (extName == "VK_KHR_get_memory_requirements2")
{
functions.push_back("vkGetImageMemoryRequirements2KHR");
@@ -265,18 +275,24 @@
functions.push_back("vkCmdDrawIndirectCountKHR");
functions.push_back("vkCmdDrawIndexedIndirectCountKHR");
}
- else if (extName == "VK_KHR_pipeline_executable_properties")
- {
- functions.push_back("vkGetPipelineExecutablePropertiesKHR");
- functions.push_back("vkGetPipelineExecutableStatisticsKHR");
- functions.push_back("vkGetPipelineExecutableInternalRepresentationsKHR");
- }
else if (extName == "VK_KHR_timeline_semaphore")
{
functions.push_back("vkGetSemaphoreCounterValueKHR");
functions.push_back("vkWaitSemaphoresKHR");
functions.push_back("vkSignalSemaphoreKHR");
}
+ else if (extName == "VK_KHR_buffer_device_address")
+ {
+ functions.push_back("vkGetBufferDeviceAddressKHR");
+ functions.push_back("vkGetBufferOpaqueCaptureAddressKHR");
+ functions.push_back("vkGetDeviceMemoryOpaqueCaptureAddressKHR");
+ }
+ else if (extName == "VK_KHR_pipeline_executable_properties")
+ {
+ functions.push_back("vkGetPipelineExecutablePropertiesKHR");
+ functions.push_back("vkGetPipelineExecutableStatisticsKHR");
+ functions.push_back("vkGetPipelineExecutableInternalRepresentationsKHR");
+ }
else if (extName == "VK_EXT_debug_marker")
{
functions.push_back("vkDebugMarkerSetObjectTagEXT");
@@ -421,6 +437,18 @@
functions.push_back("vkCmdSetCheckpointNV");
functions.push_back("vkGetQueueCheckpointDataNV");
}
+ else if (extName == "VK_INTEL_performance_query")
+ {
+ functions.push_back("vkInitializePerformanceApiINTEL");
+ functions.push_back("vkUninitializePerformanceApiINTEL");
+ functions.push_back("vkCmdSetPerformanceMarkerINTEL");
+ functions.push_back("vkCmdSetPerformanceStreamMarkerINTEL");
+ functions.push_back("vkCmdSetPerformanceOverrideINTEL");
+ functions.push_back("vkAcquirePerformanceConfigurationINTEL");
+ functions.push_back("vkReleasePerformanceConfigurationINTEL");
+ functions.push_back("vkQueueSetPerformanceConfigurationINTEL");
+ functions.push_back("vkGetPerformanceParameterINTEL");
+ }
else if (extName == "VK_AMD_display_native_hdr")
{
functions.push_back("vkSetLocalDimmingAMD");
@@ -429,6 +457,10 @@
{
functions.push_back("vkGetBufferDeviceAddressEXT");
}
+ else if (extName == "VK_EXT_line_rasterization")
+ {
+ functions.push_back("vkCmdSetLineStippleEXT");
+ }
else if (extName == "VK_EXT_host_query_reset")
{
functions.push_back("vkResetQueryPoolEXT");
@@ -476,6 +508,7 @@
"VK_KHR_external_memory_capabilities",
"VK_KHR_external_semaphore_capabilities",
"VK_KHR_external_fence_capabilities",
+ "VK_KHR_performance_query",
"VK_KHR_get_surface_capabilities2",
"VK_KHR_get_display_properties2",
"VK_EXT_debug_report",
@@ -519,8 +552,9 @@
"VK_KHR_bind_memory2",
"VK_KHR_maintenance3",
"VK_KHR_draw_indirect_count",
- "VK_KHR_pipeline_executable_properties",
"VK_KHR_timeline_semaphore",
+ "VK_KHR_buffer_device_address",
+ "VK_KHR_pipeline_executable_properties",
"VK_EXT_debug_marker",
"VK_EXT_transform_feedback",
"VK_NVX_image_view_handle",
@@ -544,8 +578,10 @@
"VK_NV_mesh_shader",
"VK_NV_scissor_exclusive",
"VK_NV_device_diagnostic_checkpoints",
+ "VK_INTEL_performance_query",
"VK_AMD_display_native_hdr",
"VK_EXT_buffer_device_address",
+ "VK_EXT_line_rasterization",
"VK_EXT_host_query_reset",
"VK_ANDROID_external_memory_android_hardware_buffer",
"VK_KHR_external_memory_win32",
diff --git a/external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl b/external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl
index 813b97b..1ed9659 100644
--- a/external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl
+++ b/external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl
@@ -166,6 +166,19 @@
typedef VKAPI_ATTR void (VKAPI_CALL* GetPhysicalDeviceExternalFencePropertiesFunc) (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo, VkExternalFenceProperties* pExternalFenceProperties);
typedef VKAPI_ATTR void (VKAPI_CALL* GetPhysicalDeviceExternalSemaphorePropertiesFunc) (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo, VkExternalSemaphoreProperties* pExternalSemaphoreProperties);
typedef VKAPI_ATTR void (VKAPI_CALL* GetDescriptorSetLayoutSupportFunc) (VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayoutSupport* pSupport);
+typedef VKAPI_ATTR void (VKAPI_CALL* CmdDrawIndirectCountFunc) (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride);
+typedef VKAPI_ATTR void (VKAPI_CALL* CmdDrawIndexedIndirectCountFunc) (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* CreateRenderPass2Func) (VkDevice device, const VkRenderPassCreateInfo2* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass);
+typedef VKAPI_ATTR void (VKAPI_CALL* CmdBeginRenderPass2Func) (VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, const VkSubpassBeginInfo* pSubpassBeginInfo);
+typedef VKAPI_ATTR void (VKAPI_CALL* CmdNextSubpass2Func) (VkCommandBuffer commandBuffer, const VkSubpassBeginInfo* pSubpassBeginInfo, const VkSubpassEndInfo* pSubpassEndInfo);
+typedef VKAPI_ATTR void (VKAPI_CALL* CmdEndRenderPass2Func) (VkCommandBuffer commandBuffer, const VkSubpassEndInfo* pSubpassEndInfo);
+typedef VKAPI_ATTR void (VKAPI_CALL* ResetQueryPoolFunc) (VkDevice device, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetSemaphoreCounterValueFunc) (VkDevice device, VkSemaphore semaphore, deUint64* pValue);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* WaitSemaphoresFunc) (VkDevice device, const VkSemaphoreWaitInfo* pWaitInfo, deUint64 timeout);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* SignalSemaphoreFunc) (VkDevice device, const VkSemaphoreSignalInfo* pSignalInfo);
+typedef VKAPI_ATTR VkDeviceAddress (VKAPI_CALL* GetBufferDeviceAddressFunc) (VkDevice device, const VkBufferDeviceAddressInfo* pInfo);
+typedef VKAPI_ATTR uint64_t (VKAPI_CALL* GetBufferOpaqueCaptureAddressFunc) (VkDevice device, const VkBufferDeviceAddressInfo* pInfo);
+typedef VKAPI_ATTR uint64_t (VKAPI_CALL* GetDeviceMemoryOpaqueCaptureAddressFunc) (VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo);
typedef VKAPI_ATTR void (VKAPI_CALL* DestroySurfaceKHRFunc) (VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks* pAllocator);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetPhysicalDeviceSurfaceSupportKHRFunc) (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, VkSurfaceKHR surface, VkBool32* pSupported);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetPhysicalDeviceSurfaceCapabilitiesKHRFunc) (VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR* pSurfaceCapabilities);
@@ -211,14 +224,18 @@
typedef VKAPI_ATTR VkResult (VKAPI_CALL* CreateDescriptorUpdateTemplateKHRFunc) (VkDevice device, const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate);
typedef VKAPI_ATTR void (VKAPI_CALL* DestroyDescriptorUpdateTemplateKHRFunc) (VkDevice device, VkDescriptorUpdateTemplate descriptorUpdateTemplate, const VkAllocationCallbacks* pAllocator);
typedef VKAPI_ATTR void (VKAPI_CALL* UpdateDescriptorSetWithTemplateKHRFunc) (VkDevice device, VkDescriptorSet descriptorSet, VkDescriptorUpdateTemplate descriptorUpdateTemplate, const void* pData);
-typedef VKAPI_ATTR VkResult (VKAPI_CALL* CreateRenderPass2KHRFunc) (VkDevice device, const VkRenderPassCreateInfo2KHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass);
-typedef VKAPI_ATTR void (VKAPI_CALL* CmdBeginRenderPass2KHRFunc) (VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, const VkSubpassBeginInfoKHR* pSubpassBeginInfo);
-typedef VKAPI_ATTR void (VKAPI_CALL* CmdNextSubpass2KHRFunc) (VkCommandBuffer commandBuffer, const VkSubpassBeginInfoKHR* pSubpassBeginInfo, const VkSubpassEndInfoKHR* pSubpassEndInfo);
-typedef VKAPI_ATTR void (VKAPI_CALL* CmdEndRenderPass2KHRFunc) (VkCommandBuffer commandBuffer, const VkSubpassEndInfoKHR* pSubpassEndInfo);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* CreateRenderPass2KHRFunc) (VkDevice device, const VkRenderPassCreateInfo2* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass);
+typedef VKAPI_ATTR void (VKAPI_CALL* CmdBeginRenderPass2KHRFunc) (VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, const VkSubpassBeginInfo* pSubpassBeginInfo);
+typedef VKAPI_ATTR void (VKAPI_CALL* CmdNextSubpass2KHRFunc) (VkCommandBuffer commandBuffer, const VkSubpassBeginInfo* pSubpassBeginInfo, const VkSubpassEndInfo* pSubpassEndInfo);
+typedef VKAPI_ATTR void (VKAPI_CALL* CmdEndRenderPass2KHRFunc) (VkCommandBuffer commandBuffer, const VkSubpassEndInfo* pSubpassEndInfo);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetSwapchainStatusKHRFunc) (VkDevice device, VkSwapchainKHR swapchain);
typedef VKAPI_ATTR void (VKAPI_CALL* GetPhysicalDeviceExternalFencePropertiesKHRFunc) (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo, VkExternalFenceProperties* pExternalFenceProperties);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* ImportFenceFdKHRFunc) (VkDevice device, const VkImportFenceFdInfoKHR* pImportFenceFdInfo);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetFenceFdKHRFunc) (VkDevice device, const VkFenceGetFdInfoKHR* pGetFdInfo, int* pFd);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHRFunc) (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, deUint32* pCounterCount, VkPerformanceCounterKHR* pCounters, VkPerformanceCounterDescriptionKHR* pCounterDescriptions);
+typedef VKAPI_ATTR void (VKAPI_CALL* GetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHRFunc) (VkPhysicalDevice physicalDevice, const VkQueryPoolPerformanceCreateInfoKHR* pPerformanceQueryCreateInfo, deUint32* pNumPasses);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* AcquireProfilingLockKHRFunc) (VkDevice device, const VkAcquireProfilingLockInfoKHR* pInfo);
+typedef VKAPI_ATTR void (VKAPI_CALL* ReleaseProfilingLockKHRFunc) (VkDevice device);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetPhysicalDeviceSurfaceCapabilities2KHRFunc) (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, VkSurfaceCapabilities2KHR* pSurfaceCapabilities);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetPhysicalDeviceSurfaceFormats2KHRFunc) (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, deUint32* pSurfaceFormatCount, VkSurfaceFormat2KHR* pSurfaceFormats);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetPhysicalDeviceDisplayProperties2KHRFunc) (VkPhysicalDevice physicalDevice, deUint32* pPropertyCount, VkDisplayProperties2KHR* pProperties);
@@ -235,12 +252,15 @@
typedef VKAPI_ATTR void (VKAPI_CALL* GetDescriptorSetLayoutSupportKHRFunc) (VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayoutSupport* pSupport);
typedef VKAPI_ATTR void (VKAPI_CALL* CmdDrawIndirectCountKHRFunc) (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride);
typedef VKAPI_ATTR void (VKAPI_CALL* CmdDrawIndexedIndirectCountKHRFunc) (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetSemaphoreCounterValueKHRFunc) (VkDevice device, VkSemaphore semaphore, deUint64* pValue);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* WaitSemaphoresKHRFunc) (VkDevice device, const VkSemaphoreWaitInfo* pWaitInfo, deUint64 timeout);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* SignalSemaphoreKHRFunc) (VkDevice device, const VkSemaphoreSignalInfo* pSignalInfo);
+typedef VKAPI_ATTR VkDeviceAddress (VKAPI_CALL* GetBufferDeviceAddressKHRFunc) (VkDevice device, const VkBufferDeviceAddressInfo* pInfo);
+typedef VKAPI_ATTR uint64_t (VKAPI_CALL* GetBufferOpaqueCaptureAddressKHRFunc) (VkDevice device, const VkBufferDeviceAddressInfo* pInfo);
+typedef VKAPI_ATTR uint64_t (VKAPI_CALL* GetDeviceMemoryOpaqueCaptureAddressKHRFunc) (VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetPipelineExecutablePropertiesKHRFunc) (VkDevice device, const VkPipelineInfoKHR* pPipelineInfo, deUint32* pExecutableCount, VkPipelineExecutablePropertiesKHR* pProperties);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetPipelineExecutableStatisticsKHRFunc) (VkDevice device, const VkPipelineExecutableInfoKHR* pExecutableInfo, deUint32* pStatisticCount, VkPipelineExecutableStatisticKHR* pStatistics);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetPipelineExecutableInternalRepresentationsKHRFunc) (VkDevice device, const VkPipelineExecutableInfoKHR* pExecutableInfo, deUint32* pInternalRepresentationCount, VkPipelineExecutableInternalRepresentationKHR* pInternalRepresentations);
-typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetSemaphoreCounterValueKHRFunc) (VkDevice device, VkSemaphore semaphore, deUint64* pValue);
-typedef VKAPI_ATTR VkResult (VKAPI_CALL* WaitSemaphoresKHRFunc) (VkDevice device, const VkSemaphoreWaitInfoKHR* pWaitInfo, deUint64 timeout);
-typedef VKAPI_ATTR VkResult (VKAPI_CALL* SignalSemaphoreKHRFunc) (VkDevice device, const VkSemaphoreSignalInfoKHR* pSignalInfo);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* CreateDebugReportCallbackEXTFunc) (VkInstance instance, const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugReportCallbackEXT* pCallback);
typedef VKAPI_ATTR void (VKAPI_CALL* DestroyDebugReportCallbackEXTFunc) (VkInstance instance, VkDebugReportCallbackEXT callback, const VkAllocationCallbacks* pAllocator);
typedef VKAPI_ATTR void (VKAPI_CALL* DebugReportMessageEXTFunc) (VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, deUint64 object, deUintptr location, deInt32 messageCode, const char* pLayerPrefix, const char* pMessage);
@@ -325,11 +345,21 @@
typedef VKAPI_ATTR void (VKAPI_CALL* CmdSetExclusiveScissorNVFunc) (VkCommandBuffer commandBuffer, deUint32 firstExclusiveScissor, deUint32 exclusiveScissorCount, const VkRect2D* pExclusiveScissors);
typedef VKAPI_ATTR void (VKAPI_CALL* CmdSetCheckpointNVFunc) (VkCommandBuffer commandBuffer, const void* pCheckpointMarker);
typedef VKAPI_ATTR void (VKAPI_CALL* GetQueueCheckpointDataNVFunc) (VkQueue queue, deUint32* pCheckpointDataCount, VkCheckpointDataNV* pCheckpointData);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* InitializePerformanceApiINTELFunc) (VkDevice device, const VkInitializePerformanceApiInfoINTEL* pInitializeInfo);
+typedef VKAPI_ATTR void (VKAPI_CALL* UninitializePerformanceApiINTELFunc) (VkDevice device);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* CmdSetPerformanceMarkerINTELFunc) (VkCommandBuffer commandBuffer, const VkPerformanceMarkerInfoINTEL* pMarkerInfo);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* CmdSetPerformanceStreamMarkerINTELFunc) (VkCommandBuffer commandBuffer, const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* CmdSetPerformanceOverrideINTELFunc) (VkCommandBuffer commandBuffer, const VkPerformanceOverrideInfoINTEL* pOverrideInfo);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* AcquirePerformanceConfigurationINTELFunc) (VkDevice device, const VkPerformanceConfigurationAcquireInfoINTEL* pAcquireInfo, VkPerformanceConfigurationINTEL* pConfiguration);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* ReleasePerformanceConfigurationINTELFunc) (VkDevice device, VkPerformanceConfigurationINTEL configuration);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* QueueSetPerformanceConfigurationINTELFunc) (VkQueue queue, VkPerformanceConfigurationINTEL configuration);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetPerformanceParameterINTELFunc) (VkDevice device, VkPerformanceParameterTypeINTEL parameter, VkPerformanceValueINTEL* pValue);
typedef VKAPI_ATTR void (VKAPI_CALL* SetLocalDimmingAMDFunc) (VkDevice device, VkSwapchainKHR swapChain, VkBool32 localDimmingEnable);
-typedef VKAPI_ATTR VkDeviceAddress (VKAPI_CALL* GetBufferDeviceAddressEXTFunc) (VkDevice device, const VkBufferDeviceAddressInfoEXT* pInfo);
+typedef VKAPI_ATTR VkDeviceAddress (VKAPI_CALL* GetBufferDeviceAddressEXTFunc) (VkDevice device, const VkBufferDeviceAddressInfo* pInfo);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetPhysicalDeviceCooperativeMatrixPropertiesNVFunc) (VkPhysicalDevice physicalDevice, deUint32* pPropertyCount, VkCooperativeMatrixPropertiesNV* pProperties);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNVFunc) (VkPhysicalDevice physicalDevice, deUint32* pCombinationCount, VkFramebufferMixedSamplesCombinationNV* pCombinations);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* CreateHeadlessSurfaceEXTFunc) (VkInstance instance, const VkHeadlessSurfaceCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
+typedef VKAPI_ATTR void (VKAPI_CALL* CmdSetLineStippleEXTFunc) (VkCommandBuffer commandBuffer, deUint32 lineStippleFactor, deUint16 lineStipplePattern);
typedef VKAPI_ATTR void (VKAPI_CALL* ResetQueryPoolEXTFunc) (VkDevice device, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount);
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);
diff --git a/external/vulkancts/framework/vulkan/vkGetStructureTypeImpl.inl b/external/vulkancts/framework/vulkan/vkGetStructureTypeImpl.inl
index e73e89b..b52b2c4 100644
--- a/external/vulkancts/framework/vulkan/vkGetStructureTypeImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkGetStructureTypeImpl.inl
@@ -561,6 +561,256 @@
return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES;
}
+template<> VkStructureType getStructureType<VkPhysicalDeviceVulkan11Features> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceVulkan11Properties> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceVulkan12Features> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceVulkan12Properties> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES;
+}
+
+template<> VkStructureType getStructureType<VkImageFormatListCreateInfo> (void)
+{
+ return VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO;
+}
+
+template<> VkStructureType getStructureType<VkAttachmentDescription2> (void)
+{
+ return VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2;
+}
+
+template<> VkStructureType getStructureType<VkAttachmentReference2> (void)
+{
+ return VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2;
+}
+
+template<> VkStructureType getStructureType<VkSubpassDescription2> (void)
+{
+ return VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2;
+}
+
+template<> VkStructureType getStructureType<VkSubpassDependency2> (void)
+{
+ return VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2;
+}
+
+template<> VkStructureType getStructureType<VkRenderPassCreateInfo2> (void)
+{
+ return VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2;
+}
+
+template<> VkStructureType getStructureType<VkSubpassBeginInfo> (void)
+{
+ return VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO;
+}
+
+template<> VkStructureType getStructureType<VkSubpassEndInfo> (void)
+{
+ return VK_STRUCTURE_TYPE_SUBPASS_END_INFO;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDevice8BitStorageFeatures> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceDriverProperties> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceShaderAtomicInt64Features> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceShaderFloat16Int8Features> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceFloatControlsProperties> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES;
+}
+
+template<> VkStructureType getStructureType<VkDescriptorSetLayoutBindingFlagsCreateInfo> (void)
+{
+ return VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceDescriptorIndexingFeatures> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceDescriptorIndexingProperties> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES;
+}
+
+template<> VkStructureType getStructureType<VkDescriptorSetVariableDescriptorCountAllocateInfo> (void)
+{
+ return VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO;
+}
+
+template<> VkStructureType getStructureType<VkDescriptorSetVariableDescriptorCountLayoutSupport> (void)
+{
+ return VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT;
+}
+
+template<> VkStructureType getStructureType<VkSubpassDescriptionDepthStencilResolve> (void)
+{
+ return VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceDepthStencilResolveProperties> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceScalarBlockLayoutFeatures> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES;
+}
+
+template<> VkStructureType getStructureType<VkImageStencilUsageCreateInfo> (void)
+{
+ return VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO;
+}
+
+template<> VkStructureType getStructureType<VkSamplerReductionModeCreateInfo> (void)
+{
+ return VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceSamplerFilterMinmaxProperties> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceVulkanMemoryModelFeatures> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceImagelessFramebufferFeatures> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES;
+}
+
+template<> VkStructureType getStructureType<VkFramebufferAttachmentImageInfo> (void)
+{
+ return VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO;
+}
+
+template<> VkStructureType getStructureType<VkFramebufferAttachmentsCreateInfo> (void)
+{
+ return VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO;
+}
+
+template<> VkStructureType getStructureType<VkRenderPassAttachmentBeginInfo> (void)
+{
+ return VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceUniformBufferStandardLayoutFeatures> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES;
+}
+
+template<> VkStructureType getStructureType<VkAttachmentReferenceStencilLayout> (void)
+{
+ return VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT;
+}
+
+template<> VkStructureType getStructureType<VkAttachmentDescriptionStencilLayout> (void)
+{
+ return VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceHostQueryResetFeatures> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceTimelineSemaphoreFeatures> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceTimelineSemaphoreProperties> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES;
+}
+
+template<> VkStructureType getStructureType<VkSemaphoreTypeCreateInfo> (void)
+{
+ return VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO;
+}
+
+template<> VkStructureType getStructureType<VkTimelineSemaphoreSubmitInfo> (void)
+{
+ return VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO;
+}
+
+template<> VkStructureType getStructureType<VkSemaphoreWaitInfo> (void)
+{
+ return VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO;
+}
+
+template<> VkStructureType getStructureType<VkSemaphoreSignalInfo> (void)
+{
+ return VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceBufferDeviceAddressFeatures> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES;
+}
+
+template<> VkStructureType getStructureType<VkBufferDeviceAddressInfo> (void)
+{
+ return VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO;
+}
+
+template<> VkStructureType getStructureType<VkBufferOpaqueCaptureAddressCreateInfo> (void)
+{
+ return VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO;
+}
+
+template<> VkStructureType getStructureType<VkMemoryOpaqueCaptureAddressAllocateInfo> (void)
+{
+ return VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO;
+}
+
+template<> VkStructureType getStructureType<VkDeviceMemoryOpaqueCaptureAddressInfo> (void)
+{
+ return VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO;
+}
+
template<> VkStructureType getStructureType<VkSwapchainCreateInfoKHR> (void)
{
return VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
@@ -646,71 +896,11 @@
return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR;
}
-template<> VkStructureType getStructureType<VkPhysicalDeviceFloat16Int8FeaturesKHR> (void)
-{
- return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR;
-}
-
template<> VkStructureType getStructureType<VkPresentRegionsKHR> (void)
{
return VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR;
}
-template<> VkStructureType getStructureType<VkPhysicalDeviceImagelessFramebufferFeaturesKHR> (void)
-{
- return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR;
-}
-
-template<> VkStructureType getStructureType<VkFramebufferAttachmentImageInfoKHR> (void)
-{
- return VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR;
-}
-
-template<> VkStructureType getStructureType<VkFramebufferAttachmentsCreateInfoKHR> (void)
-{
- return VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR;
-}
-
-template<> VkStructureType getStructureType<VkRenderPassAttachmentBeginInfoKHR> (void)
-{
- return VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO_KHR;
-}
-
-template<> VkStructureType getStructureType<VkAttachmentDescription2KHR> (void)
-{
- return VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR;
-}
-
-template<> VkStructureType getStructureType<VkAttachmentReference2KHR> (void)
-{
- return VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR;
-}
-
-template<> VkStructureType getStructureType<VkSubpassDescription2KHR> (void)
-{
- return VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR;
-}
-
-template<> VkStructureType getStructureType<VkSubpassDependency2KHR> (void)
-{
- return VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2_KHR;
-}
-
-template<> VkStructureType getStructureType<VkRenderPassCreateInfo2KHR> (void)
-{
- return VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR;
-}
-
-template<> VkStructureType getStructureType<VkSubpassBeginInfoKHR> (void)
-{
- return VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO_KHR;
-}
-
-template<> VkStructureType getStructureType<VkSubpassEndInfoKHR> (void)
-{
- return VK_STRUCTURE_TYPE_SUBPASS_END_INFO_KHR;
-}
-
template<> VkStructureType getStructureType<VkSharedPresentSurfaceCapabilitiesKHR> (void)
{
return VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR;
@@ -726,6 +916,41 @@
return VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR;
}
+template<> VkStructureType getStructureType<VkPhysicalDevicePerformanceQueryFeaturesKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDevicePerformanceQueryPropertiesKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR;
+}
+
+template<> VkStructureType getStructureType<VkPerformanceCounterKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_KHR;
+}
+
+template<> VkStructureType getStructureType<VkPerformanceCounterDescriptionKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_DESCRIPTION_KHR;
+}
+
+template<> VkStructureType getStructureType<VkQueryPoolPerformanceCreateInfoKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR;
+}
+
+template<> VkStructureType getStructureType<VkAcquireProfilingLockInfoKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_ACQUIRE_PROFILING_LOCK_INFO_KHR;
+}
+
+template<> VkStructureType getStructureType<VkPerformanceQuerySubmitInfoKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR;
+}
+
template<> VkStructureType getStructureType<VkPhysicalDeviceSurfaceInfo2KHR> (void)
{
return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR;
@@ -766,56 +991,11 @@
return VK_STRUCTURE_TYPE_DISPLAY_PLANE_CAPABILITIES_2_KHR;
}
-template<> VkStructureType getStructureType<VkImageFormatListCreateInfoKHR> (void)
-{
- return VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR;
-}
-
-template<> VkStructureType getStructureType<VkPhysicalDevice8BitStorageFeaturesKHR> (void)
-{
- return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR;
-}
-
-template<> VkStructureType getStructureType<VkPhysicalDeviceShaderAtomicInt64FeaturesKHR> (void)
-{
- return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR;
-}
-
-template<> VkStructureType getStructureType<VkPhysicalDeviceDriverPropertiesKHR> (void)
-{
- return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR;
-}
-
-template<> VkStructureType getStructureType<VkPhysicalDeviceFloatControlsPropertiesKHR> (void)
-{
- return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR;
-}
-
-template<> VkStructureType getStructureType<VkSubpassDescriptionDepthStencilResolveKHR> (void)
-{
- return VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE_KHR;
-}
-
-template<> VkStructureType getStructureType<VkPhysicalDeviceDepthStencilResolvePropertiesKHR> (void)
-{
- return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR;
-}
-
-template<> VkStructureType getStructureType<VkPhysicalDeviceVulkanMemoryModelFeaturesKHR> (void)
-{
- return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR;
-}
-
template<> VkStructureType getStructureType<VkSurfaceProtectedCapabilitiesKHR> (void)
{
return VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR;
}
-template<> VkStructureType getStructureType<VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR> (void)
-{
- return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR;
-}
-
template<> VkStructureType getStructureType<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR> (void)
{
return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR;
@@ -846,36 +1026,6 @@
return VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR;
}
-template<> VkStructureType getStructureType<VkPhysicalDeviceTimelineSemaphoreFeaturesKHR> (void)
-{
- return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR;
-}
-
-template<> VkStructureType getStructureType<VkPhysicalDeviceTimelineSemaphorePropertiesKHR> (void)
-{
- return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR;
-}
-
-template<> VkStructureType getStructureType<VkSemaphoreTypeCreateInfoKHR> (void)
-{
- return VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR;
-}
-
-template<> VkStructureType getStructureType<VkTimelineSemaphoreSubmitInfoKHR> (void)
-{
- return VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR;
-}
-
-template<> VkStructureType getStructureType<VkSemaphoreWaitInfoKHR> (void)
-{
- return VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO_KHR;
-}
-
-template<> VkStructureType getStructureType<VkSemaphoreSignalInfoKHR> (void)
-{
- return VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO_KHR;
-}
-
template<> VkStructureType getStructureType<VkDebugReportCallbackCreateInfoEXT> (void)
{
return VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
@@ -961,6 +1111,11 @@
return VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT;
}
+template<> VkStructureType getStructureType<VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT;
+}
+
template<> VkStructureType getStructureType<VkImageViewASTCDecodeModeEXT> (void)
{
return VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT;
@@ -1121,16 +1276,6 @@
return VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
}
-template<> VkStructureType getStructureType<VkSamplerReductionModeCreateInfoEXT> (void)
-{
- return VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT;
-}
-
-template<> VkStructureType getStructureType<VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT> (void)
-{
- return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT;
-}
-
template<> VkStructureType getStructureType<VkPhysicalDeviceInlineUniformBlockFeaturesEXT> (void)
{
return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT;
@@ -1201,6 +1346,16 @@
return VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV;
}
+template<> VkStructureType getStructureType<VkPhysicalDeviceShaderSMBuiltinsPropertiesNV> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV;
+}
+
template<> VkStructureType getStructureType<VkPhysicalDeviceShaderClockFeaturesKHR> (void)
{
return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR;
@@ -1241,31 +1396,6 @@
return VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT;
}
-template<> VkStructureType getStructureType<VkDescriptorSetLayoutBindingFlagsCreateInfoEXT> (void)
-{
- return VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT;
-}
-
-template<> VkStructureType getStructureType<VkPhysicalDeviceDescriptorIndexingFeaturesEXT> (void)
-{
- return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT;
-}
-
-template<> VkStructureType getStructureType<VkPhysicalDeviceDescriptorIndexingPropertiesEXT> (void)
-{
- return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT;
-}
-
-template<> VkStructureType getStructureType<VkDescriptorSetVariableDescriptorCountAllocateInfoEXT> (void)
-{
- return VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT;
-}
-
-template<> VkStructureType getStructureType<VkDescriptorSetVariableDescriptorCountLayoutSupportEXT> (void)
-{
- return VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT;
-}
-
template<> VkStructureType getStructureType<VkPipelineViewportShadingRateImageStateCreateInfoNV> (void)
{
return VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV;
@@ -1381,6 +1511,11 @@
return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT;
}
+template<> VkStructureType getStructureType<VkPipelineCompilerControlCreateInfoAMD> (void)
+{
+ return VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD;
+}
+
template<> VkStructureType getStructureType<VkCalibratedTimestampInfoEXT> (void)
{
return VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT;
@@ -1461,9 +1596,39 @@
return VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV;
}
-template<> VkStructureType getStructureType<VkPhysicalDeviceShaderIntegerFunctions2INTEL> (void)
+template<> VkStructureType getStructureType<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL> (void)
{
- return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS2_FEATURES_INTEL;
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL;
+}
+
+template<> VkStructureType getStructureType<VkInitializePerformanceApiInfoINTEL> (void)
+{
+ return VK_STRUCTURE_TYPE_INITIALIZE_PERFORMANCE_API_INFO_INTEL;
+}
+
+template<> VkStructureType getStructureType<VkQueryPoolCreateInfoINTEL> (void)
+{
+ return VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL;
+}
+
+template<> VkStructureType getStructureType<VkPerformanceMarkerInfoINTEL> (void)
+{
+ return VK_STRUCTURE_TYPE_PERFORMANCE_MARKER_INFO_INTEL;
+}
+
+template<> VkStructureType getStructureType<VkPerformanceStreamMarkerInfoINTEL> (void)
+{
+ return VK_STRUCTURE_TYPE_PERFORMANCE_STREAM_MARKER_INFO_INTEL;
+}
+
+template<> VkStructureType getStructureType<VkPerformanceOverrideInfoINTEL> (void)
+{
+ return VK_STRUCTURE_TYPE_PERFORMANCE_OVERRIDE_INFO_INTEL;
+}
+
+template<> VkStructureType getStructureType<VkPerformanceConfigurationAcquireInfoINTEL> (void)
+{
+ return VK_STRUCTURE_TYPE_PERFORMANCE_CONFIGURATION_ACQUIRE_INFO_INTEL;
}
template<> VkStructureType getStructureType<VkPhysicalDevicePCIBusInfoPropertiesEXT> (void)
@@ -1496,9 +1661,29 @@
return VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT;
}
-template<> VkStructureType getStructureType<VkPhysicalDeviceScalarBlockLayoutFeaturesEXT> (void)
+template<> VkStructureType getStructureType<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT> (void)
{
- return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT;
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceSubgroupSizeControlPropertiesEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT;
+}
+
+template<> VkStructureType getStructureType<VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceShaderCoreProperties2AMD> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceCoherentMemoryFeaturesAMD> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD;
}
template<> VkStructureType getStructureType<VkPhysicalDeviceMemoryBudgetPropertiesEXT> (void)
@@ -1526,21 +1711,11 @@
return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT;
}
-template<> VkStructureType getStructureType<VkBufferDeviceAddressInfoEXT> (void)
-{
- return VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT;
-}
-
template<> VkStructureType getStructureType<VkBufferDeviceAddressCreateInfoEXT> (void)
{
return VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT;
}
-template<> VkStructureType getStructureType<VkImageStencilUsageCreateInfoEXT> (void)
-{
- return VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT;
-}
-
template<> VkStructureType getStructureType<VkValidationFeaturesEXT> (void)
{
return VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
@@ -1591,9 +1766,19 @@
return VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT;
}
-template<> VkStructureType getStructureType<VkPhysicalDeviceHostQueryResetFeaturesEXT> (void)
+template<> VkStructureType getStructureType<VkPhysicalDeviceLineRasterizationFeaturesEXT> (void)
{
- return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT;
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceLineRasterizationPropertiesEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT;
+}
+
+template<> VkStructureType getStructureType<VkPipelineRasterizationLineStateCreateInfoEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT;
}
template<> VkStructureType getStructureType<VkPhysicalDeviceIndexTypeUint8FeaturesEXT> (void)
@@ -1606,6 +1791,16 @@
return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT;
}
+template<> VkStructureType getStructureType<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT;
+}
+
template<> VkStructureType getStructureType<VkAndroidSurfaceCreateInfoKHR> (void)
{
return VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR;
diff --git a/external/vulkancts/framework/vulkan/vkHandleType.inl b/external/vulkancts/framework/vulkan/vkHandleType.inl
index c822070..3075693 100644
--- a/external/vulkancts/framework/vulkan/vkHandleType.inl
+++ b/external/vulkancts/framework/vulkan/vkHandleType.inl
@@ -3,7 +3,7 @@
*/
enum HandleType
{
- HANDLE_TYPE_INSTANCE = 0,
+ HANDLE_TYPE_INSTANCE = 0,
HANDLE_TYPE_PHYSICAL_DEVICE,
HANDLE_TYPE_DEVICE,
HANDLE_TYPE_QUEUE,
@@ -40,6 +40,7 @@
HANDLE_TYPE_DEBUG_UTILS_MESSENGER_EXT,
HANDLE_TYPE_VALIDATION_CACHE_EXT,
HANDLE_TYPE_ACCELERATION_STRUCTURE_NV,
- HANDLE_TYPE_LAST = HANDLE_TYPE_ACCELERATION_STRUCTURE_NV + 1
+ HANDLE_TYPE_PERFORMANCE_CONFIGURATION_INTEL,
+ HANDLE_TYPE_LAST = HANDLE_TYPE_PERFORMANCE_CONFIGURATION_INTEL + 1
};
diff --git a/external/vulkancts/framework/vulkan/vkImageUtil.cpp b/external/vulkancts/framework/vulkan/vkImageUtil.cpp
index da0f21c..b24e432 100644
--- a/external/vulkancts/framework/vulkan/vkImageUtil.cpp
+++ b/external/vulkancts/framework/vulkan/vkImageUtil.cpp
@@ -2099,6 +2099,8 @@
case VK_FORMAT_R32G32B32A32_SINT: return TextureFormat(TextureFormat::RGBA, TextureFormat::SIGNED_INT32);
case VK_FORMAT_R32G32B32A32_SFLOAT: return TextureFormat(TextureFormat::RGBA, TextureFormat::FLOAT);
+ case VK_FORMAT_R64_UINT: return TextureFormat(TextureFormat::R, TextureFormat::UNSIGNED_INT64);
+ case VK_FORMAT_R64_SINT: return TextureFormat(TextureFormat::R, TextureFormat::SIGNED_INT64);
case VK_FORMAT_R64_SFLOAT: return TextureFormat(TextureFormat::R, TextureFormat::FLOAT64);
case VK_FORMAT_R64G64_SFLOAT: return TextureFormat(TextureFormat::RG, TextureFormat::FLOAT64);
case VK_FORMAT_R64G64B64_SFLOAT: return TextureFormat(TextureFormat::RGB, TextureFormat::FLOAT64);
@@ -2810,9 +2812,9 @@
{
case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT:
{
- const VkSamplerReductionModeCreateInfoEXT reductionModeCreateInfo = *reinterpret_cast<const VkSamplerReductionModeCreateInfoEXT*>(pNext);
+ const VkSamplerReductionModeCreateInfo reductionModeCreateInfo = *reinterpret_cast<const VkSamplerReductionModeCreateInfo*>(pNext);
reductionMode = mapVkSamplerReductionMode(reductionModeCreateInfo.reductionMode);
- pNext = reinterpret_cast<const VkSamplerReductionModeCreateInfoEXT*>(pNext)->pNext;
+ pNext = reinterpret_cast<const VkSamplerReductionModeCreateInfo*>(pNext)->pNext;
break;
}
case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO:
@@ -2909,13 +2911,13 @@
return tcu::Sampler::WRAPMODE_LAST;
}
-tcu::Sampler::ReductionMode mapVkSamplerReductionMode (VkSamplerReductionModeEXT reductionMode)
+tcu::Sampler::ReductionMode mapVkSamplerReductionMode (VkSamplerReductionMode reductionMode)
{
switch (reductionMode)
{
- case VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT: return tcu::Sampler::WEIGHTED_AVERAGE;
- case VK_SAMPLER_REDUCTION_MODE_MIN_EXT: return tcu::Sampler::MIN;
- case VK_SAMPLER_REDUCTION_MODE_MAX_EXT: return tcu::Sampler::MAX;
+ case VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE: return tcu::Sampler::WEIGHTED_AVERAGE;
+ case VK_SAMPLER_REDUCTION_MODE_MIN: return tcu::Sampler::MIN;
+ case VK_SAMPLER_REDUCTION_MODE_MAX: return tcu::Sampler::MAX;
default:
break;
}
diff --git a/external/vulkancts/framework/vulkan/vkImageUtil.hpp b/external/vulkancts/framework/vulkan/vkImageUtil.hpp
index 8b1222d..cc3af58 100644
--- a/external/vulkancts/framework/vulkan/vkImageUtil.hpp
+++ b/external/vulkancts/framework/vulkan/vkImageUtil.hpp
@@ -56,7 +56,7 @@
tcu::Sampler mapVkSampler (const VkSamplerCreateInfo& samplerCreateInfo);
tcu::Sampler::CompareMode mapVkSamplerCompareOp (VkCompareOp compareOp);
tcu::Sampler::WrapMode mapVkSamplerAddressMode (VkSamplerAddressMode addressMode);
-tcu::Sampler::ReductionMode mapVkSamplerReductionMode (VkSamplerReductionModeEXT reductionMode);
+tcu::Sampler::ReductionMode mapVkSamplerReductionMode (VkSamplerReductionMode reductionMode);
tcu::Sampler::FilterMode mapVkMinTexFilter (VkFilter filter, VkSamplerMipmapMode mipMode);
tcu::Sampler::FilterMode mapVkMagTexFilter (VkFilter filter);
diff --git a/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl b/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl
index 71bea30..cf1c172 100644
--- a/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl
+++ b/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl
@@ -168,6 +168,45 @@
m_vk.getDescriptorSetLayoutSupport = (GetDescriptorSetLayoutSupportFunc) GET_PROC_ADDR("vkGetDescriptorSetLayoutSupport");
if (!m_vk.getDescriptorSetLayoutSupport)
m_vk.getDescriptorSetLayoutSupport = (GetDescriptorSetLayoutSupportFunc) GET_PROC_ADDR("vkGetDescriptorSetLayoutSupportKHR");
+m_vk.cmdDrawIndirectCount = (CmdDrawIndirectCountFunc) GET_PROC_ADDR("vkCmdDrawIndirectCount");
+if (!m_vk.cmdDrawIndirectCount)
+ m_vk.cmdDrawIndirectCount = (CmdDrawIndirectCountFunc) GET_PROC_ADDR("vkCmdDrawIndirectCountKHR");
+m_vk.cmdDrawIndexedIndirectCount = (CmdDrawIndexedIndirectCountFunc) GET_PROC_ADDR("vkCmdDrawIndexedIndirectCount");
+if (!m_vk.cmdDrawIndexedIndirectCount)
+ m_vk.cmdDrawIndexedIndirectCount = (CmdDrawIndexedIndirectCountFunc) GET_PROC_ADDR("vkCmdDrawIndexedIndirectCountKHR");
+m_vk.createRenderPass2 = (CreateRenderPass2Func) GET_PROC_ADDR("vkCreateRenderPass2");
+if (!m_vk.createRenderPass2)
+ m_vk.createRenderPass2 = (CreateRenderPass2Func) GET_PROC_ADDR("vkCreateRenderPass2KHR");
+m_vk.cmdBeginRenderPass2 = (CmdBeginRenderPass2Func) GET_PROC_ADDR("vkCmdBeginRenderPass2");
+if (!m_vk.cmdBeginRenderPass2)
+ m_vk.cmdBeginRenderPass2 = (CmdBeginRenderPass2Func) GET_PROC_ADDR("vkCmdBeginRenderPass2KHR");
+m_vk.cmdNextSubpass2 = (CmdNextSubpass2Func) GET_PROC_ADDR("vkCmdNextSubpass2");
+if (!m_vk.cmdNextSubpass2)
+ m_vk.cmdNextSubpass2 = (CmdNextSubpass2Func) GET_PROC_ADDR("vkCmdNextSubpass2KHR");
+m_vk.cmdEndRenderPass2 = (CmdEndRenderPass2Func) GET_PROC_ADDR("vkCmdEndRenderPass2");
+if (!m_vk.cmdEndRenderPass2)
+ m_vk.cmdEndRenderPass2 = (CmdEndRenderPass2Func) GET_PROC_ADDR("vkCmdEndRenderPass2KHR");
+m_vk.resetQueryPool = (ResetQueryPoolFunc) GET_PROC_ADDR("vkResetQueryPool");
+if (!m_vk.resetQueryPool)
+ m_vk.resetQueryPool = (ResetQueryPoolFunc) GET_PROC_ADDR("vkResetQueryPoolEXT");
+m_vk.getSemaphoreCounterValue = (GetSemaphoreCounterValueFunc) GET_PROC_ADDR("vkGetSemaphoreCounterValue");
+if (!m_vk.getSemaphoreCounterValue)
+ m_vk.getSemaphoreCounterValue = (GetSemaphoreCounterValueFunc) GET_PROC_ADDR("vkGetSemaphoreCounterValueKHR");
+m_vk.waitSemaphores = (WaitSemaphoresFunc) GET_PROC_ADDR("vkWaitSemaphores");
+if (!m_vk.waitSemaphores)
+ m_vk.waitSemaphores = (WaitSemaphoresFunc) GET_PROC_ADDR("vkWaitSemaphoresKHR");
+m_vk.signalSemaphore = (SignalSemaphoreFunc) GET_PROC_ADDR("vkSignalSemaphore");
+if (!m_vk.signalSemaphore)
+ m_vk.signalSemaphore = (SignalSemaphoreFunc) GET_PROC_ADDR("vkSignalSemaphoreKHR");
+m_vk.getBufferDeviceAddress = (GetBufferDeviceAddressFunc) GET_PROC_ADDR("vkGetBufferDeviceAddress");
+if (!m_vk.getBufferDeviceAddress)
+ m_vk.getBufferDeviceAddress = (GetBufferDeviceAddressFunc) GET_PROC_ADDR("vkGetBufferDeviceAddressKHR");
+m_vk.getBufferOpaqueCaptureAddress = (GetBufferOpaqueCaptureAddressFunc) GET_PROC_ADDR("vkGetBufferOpaqueCaptureAddress");
+if (!m_vk.getBufferOpaqueCaptureAddress)
+ m_vk.getBufferOpaqueCaptureAddress = (GetBufferOpaqueCaptureAddressFunc) GET_PROC_ADDR("vkGetBufferOpaqueCaptureAddressKHR");
+m_vk.getDeviceMemoryOpaqueCaptureAddress = (GetDeviceMemoryOpaqueCaptureAddressFunc) GET_PROC_ADDR("vkGetDeviceMemoryOpaqueCaptureAddress");
+if (!m_vk.getDeviceMemoryOpaqueCaptureAddress)
+ m_vk.getDeviceMemoryOpaqueCaptureAddress = (GetDeviceMemoryOpaqueCaptureAddressFunc) GET_PROC_ADDR("vkGetDeviceMemoryOpaqueCaptureAddressKHR");
m_vk.createSwapchainKHR = (CreateSwapchainKHRFunc) GET_PROC_ADDR("vkCreateSwapchainKHR");
m_vk.destroySwapchainKHR = (DestroySwapchainKHRFunc) GET_PROC_ADDR("vkDestroySwapchainKHR");
m_vk.getSwapchainImagesKHR = (GetSwapchainImagesKHRFunc) GET_PROC_ADDR("vkGetSwapchainImagesKHR");
@@ -183,21 +222,14 @@
m_vk.getSemaphoreFdKHR = (GetSemaphoreFdKHRFunc) GET_PROC_ADDR("vkGetSemaphoreFdKHR");
m_vk.cmdPushDescriptorSetKHR = (CmdPushDescriptorSetKHRFunc) GET_PROC_ADDR("vkCmdPushDescriptorSetKHR");
m_vk.cmdPushDescriptorSetWithTemplateKHR = (CmdPushDescriptorSetWithTemplateKHRFunc) GET_PROC_ADDR("vkCmdPushDescriptorSetWithTemplateKHR");
-m_vk.createRenderPass2KHR = (CreateRenderPass2KHRFunc) GET_PROC_ADDR("vkCreateRenderPass2KHR");
-m_vk.cmdBeginRenderPass2KHR = (CmdBeginRenderPass2KHRFunc) GET_PROC_ADDR("vkCmdBeginRenderPass2KHR");
-m_vk.cmdNextSubpass2KHR = (CmdNextSubpass2KHRFunc) GET_PROC_ADDR("vkCmdNextSubpass2KHR");
-m_vk.cmdEndRenderPass2KHR = (CmdEndRenderPass2KHRFunc) GET_PROC_ADDR("vkCmdEndRenderPass2KHR");
m_vk.getSwapchainStatusKHR = (GetSwapchainStatusKHRFunc) GET_PROC_ADDR("vkGetSwapchainStatusKHR");
m_vk.importFenceFdKHR = (ImportFenceFdKHRFunc) GET_PROC_ADDR("vkImportFenceFdKHR");
m_vk.getFenceFdKHR = (GetFenceFdKHRFunc) GET_PROC_ADDR("vkGetFenceFdKHR");
-m_vk.cmdDrawIndirectCountKHR = (CmdDrawIndirectCountKHRFunc) GET_PROC_ADDR("vkCmdDrawIndirectCountKHR");
-m_vk.cmdDrawIndexedIndirectCountKHR = (CmdDrawIndexedIndirectCountKHRFunc) GET_PROC_ADDR("vkCmdDrawIndexedIndirectCountKHR");
+m_vk.acquireProfilingLockKHR = (AcquireProfilingLockKHRFunc) GET_PROC_ADDR("vkAcquireProfilingLockKHR");
+m_vk.releaseProfilingLockKHR = (ReleaseProfilingLockKHRFunc) GET_PROC_ADDR("vkReleaseProfilingLockKHR");
m_vk.getPipelineExecutablePropertiesKHR = (GetPipelineExecutablePropertiesKHRFunc) GET_PROC_ADDR("vkGetPipelineExecutablePropertiesKHR");
m_vk.getPipelineExecutableStatisticsKHR = (GetPipelineExecutableStatisticsKHRFunc) GET_PROC_ADDR("vkGetPipelineExecutableStatisticsKHR");
m_vk.getPipelineExecutableInternalRepresentationsKHR = (GetPipelineExecutableInternalRepresentationsKHRFunc) GET_PROC_ADDR("vkGetPipelineExecutableInternalRepresentationsKHR");
-m_vk.getSemaphoreCounterValueKHR = (GetSemaphoreCounterValueKHRFunc) GET_PROC_ADDR("vkGetSemaphoreCounterValueKHR");
-m_vk.waitSemaphoresKHR = (WaitSemaphoresKHRFunc) GET_PROC_ADDR("vkWaitSemaphoresKHR");
-m_vk.signalSemaphoreKHR = (SignalSemaphoreKHRFunc) GET_PROC_ADDR("vkSignalSemaphoreKHR");
m_vk.debugMarkerSetObjectTagEXT = (DebugMarkerSetObjectTagEXTFunc) GET_PROC_ADDR("vkDebugMarkerSetObjectTagEXT");
m_vk.debugMarkerSetObjectNameEXT = (DebugMarkerSetObjectNameEXTFunc) GET_PROC_ADDR("vkDebugMarkerSetObjectNameEXT");
m_vk.cmdDebugMarkerBeginEXT = (CmdDebugMarkerBeginEXTFunc) GET_PROC_ADDR("vkCmdDebugMarkerBeginEXT");
@@ -270,9 +302,18 @@
m_vk.cmdSetExclusiveScissorNV = (CmdSetExclusiveScissorNVFunc) GET_PROC_ADDR("vkCmdSetExclusiveScissorNV");
m_vk.cmdSetCheckpointNV = (CmdSetCheckpointNVFunc) GET_PROC_ADDR("vkCmdSetCheckpointNV");
m_vk.getQueueCheckpointDataNV = (GetQueueCheckpointDataNVFunc) GET_PROC_ADDR("vkGetQueueCheckpointDataNV");
+m_vk.initializePerformanceApiINTEL = (InitializePerformanceApiINTELFunc) GET_PROC_ADDR("vkInitializePerformanceApiINTEL");
+m_vk.uninitializePerformanceApiINTEL = (UninitializePerformanceApiINTELFunc) GET_PROC_ADDR("vkUninitializePerformanceApiINTEL");
+m_vk.cmdSetPerformanceMarkerINTEL = (CmdSetPerformanceMarkerINTELFunc) GET_PROC_ADDR("vkCmdSetPerformanceMarkerINTEL");
+m_vk.cmdSetPerformanceStreamMarkerINTEL = (CmdSetPerformanceStreamMarkerINTELFunc) GET_PROC_ADDR("vkCmdSetPerformanceStreamMarkerINTEL");
+m_vk.cmdSetPerformanceOverrideINTEL = (CmdSetPerformanceOverrideINTELFunc) GET_PROC_ADDR("vkCmdSetPerformanceOverrideINTEL");
+m_vk.acquirePerformanceConfigurationINTEL = (AcquirePerformanceConfigurationINTELFunc) GET_PROC_ADDR("vkAcquirePerformanceConfigurationINTEL");
+m_vk.releasePerformanceConfigurationINTEL = (ReleasePerformanceConfigurationINTELFunc) GET_PROC_ADDR("vkReleasePerformanceConfigurationINTEL");
+m_vk.queueSetPerformanceConfigurationINTEL = (QueueSetPerformanceConfigurationINTELFunc) GET_PROC_ADDR("vkQueueSetPerformanceConfigurationINTEL");
+m_vk.getPerformanceParameterINTEL = (GetPerformanceParameterINTELFunc) GET_PROC_ADDR("vkGetPerformanceParameterINTEL");
m_vk.setLocalDimmingAMD = (SetLocalDimmingAMDFunc) GET_PROC_ADDR("vkSetLocalDimmingAMD");
m_vk.getBufferDeviceAddressEXT = (GetBufferDeviceAddressEXTFunc) GET_PROC_ADDR("vkGetBufferDeviceAddressEXT");
-m_vk.resetQueryPoolEXT = (ResetQueryPoolEXTFunc) GET_PROC_ADDR("vkResetQueryPoolEXT");
+m_vk.cmdSetLineStippleEXT = (CmdSetLineStippleEXTFunc) GET_PROC_ADDR("vkCmdSetLineStippleEXT");
m_vk.getAndroidHardwareBufferPropertiesANDROID = (GetAndroidHardwareBufferPropertiesANDROIDFunc) GET_PROC_ADDR("vkGetAndroidHardwareBufferPropertiesANDROID");
m_vk.getMemoryAndroidHardwareBufferANDROID = (GetMemoryAndroidHardwareBufferANDROIDFunc) GET_PROC_ADDR("vkGetMemoryAndroidHardwareBufferANDROID");
m_vk.getMemoryWin32HandleKHR = (GetMemoryWin32HandleKHRFunc) GET_PROC_ADDR("vkGetMemoryWin32HandleKHR");
diff --git a/external/vulkancts/framework/vulkan/vkInitInstanceFunctionPointers.inl b/external/vulkancts/framework/vulkan/vkInitInstanceFunctionPointers.inl
index 8be0219..6923778 100644
--- a/external/vulkancts/framework/vulkan/vkInitInstanceFunctionPointers.inl
+++ b/external/vulkancts/framework/vulkan/vkInitInstanceFunctionPointers.inl
@@ -69,6 +69,8 @@
m_vk.getPhysicalDeviceExternalBufferPropertiesKHR = (GetPhysicalDeviceExternalBufferPropertiesKHRFunc) GET_PROC_ADDR("vkGetPhysicalDeviceExternalBufferPropertiesKHR");
m_vk.getPhysicalDeviceExternalSemaphorePropertiesKHR = (GetPhysicalDeviceExternalSemaphorePropertiesKHRFunc) GET_PROC_ADDR("vkGetPhysicalDeviceExternalSemaphorePropertiesKHR");
m_vk.getPhysicalDeviceExternalFencePropertiesKHR = (GetPhysicalDeviceExternalFencePropertiesKHRFunc) GET_PROC_ADDR("vkGetPhysicalDeviceExternalFencePropertiesKHR");
+m_vk.enumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR = (EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHRFunc) GET_PROC_ADDR("vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR");
+m_vk.getPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR = (GetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHRFunc) GET_PROC_ADDR("vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR");
m_vk.getPhysicalDeviceSurfaceCapabilities2KHR = (GetPhysicalDeviceSurfaceCapabilities2KHRFunc) GET_PROC_ADDR("vkGetPhysicalDeviceSurfaceCapabilities2KHR");
m_vk.getPhysicalDeviceSurfaceFormats2KHR = (GetPhysicalDeviceSurfaceFormats2KHRFunc) GET_PROC_ADDR("vkGetPhysicalDeviceSurfaceFormats2KHR");
m_vk.getPhysicalDeviceDisplayProperties2KHR = (GetPhysicalDeviceDisplayProperties2KHRFunc) GET_PROC_ADDR("vkGetPhysicalDeviceDisplayProperties2KHR");
diff --git a/external/vulkancts/framework/vulkan/vkInstanceDriverImpl.inl b/external/vulkancts/framework/vulkan/vkInstanceDriverImpl.inl
index aa9a88a..05b8657 100644
--- a/external/vulkancts/framework/vulkan/vkInstanceDriverImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkInstanceDriverImpl.inl
@@ -232,6 +232,16 @@
return m_vk.createDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
}
+VkResult InstanceDriver::enumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, deUint32* pCounterCount, VkPerformanceCounterKHR* pCounters, VkPerformanceCounterDescriptionKHR* pCounterDescriptions) const
+{
+ return m_vk.enumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(physicalDevice, queueFamilyIndex, pCounterCount, pCounters, pCounterDescriptions);
+}
+
+void InstanceDriver::getPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR (VkPhysicalDevice physicalDevice, const VkQueryPoolPerformanceCreateInfoKHR* pPerformanceQueryCreateInfo, deUint32* pNumPasses) const
+{
+ m_vk.getPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(physicalDevice, pPerformanceQueryCreateInfo, pNumPasses);
+}
+
VkResult InstanceDriver::getPhysicalDeviceSurfaceCapabilities2KHR (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, VkSurfaceCapabilities2KHR* pSurfaceCapabilities) const
{
return m_vk.getPhysicalDeviceSurfaceCapabilities2KHR(physicalDevice, pSurfaceInfo, pSurfaceCapabilities);
diff --git a/external/vulkancts/framework/vulkan/vkInstanceFunctionPointers.inl b/external/vulkancts/framework/vulkan/vkInstanceFunctionPointers.inl
index 45068ca..53bd10c 100644
--- a/external/vulkancts/framework/vulkan/vkInstanceFunctionPointers.inl
+++ b/external/vulkancts/framework/vulkan/vkInstanceFunctionPointers.inl
@@ -47,6 +47,8 @@
GetPhysicalDeviceExternalBufferPropertiesKHRFunc getPhysicalDeviceExternalBufferPropertiesKHR;
GetPhysicalDeviceExternalSemaphorePropertiesKHRFunc getPhysicalDeviceExternalSemaphorePropertiesKHR;
GetPhysicalDeviceExternalFencePropertiesKHRFunc getPhysicalDeviceExternalFencePropertiesKHR;
+EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHRFunc enumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR;
+GetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHRFunc getPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR;
GetPhysicalDeviceSurfaceCapabilities2KHRFunc getPhysicalDeviceSurfaceCapabilities2KHR;
GetPhysicalDeviceSurfaceFormats2KHRFunc getPhysicalDeviceSurfaceFormats2KHR;
GetPhysicalDeviceDisplayProperties2KHRFunc getPhysicalDeviceDisplayProperties2KHR;
diff --git a/external/vulkancts/framework/vulkan/vkMandatoryFeatures.inl b/external/vulkancts/framework/vulkan/vkMandatoryFeatures.inl
index 8c1031c..b2ac3f2 100644
--- a/external/vulkancts/framework/vulkan/vkMandatoryFeatures.inl
+++ b/external/vulkancts/framework/vulkan/vkMandatoryFeatures.inl
@@ -3,7 +3,7 @@
*/
bool checkMandatoryFeatures(const vkt::Context& context)
{
- if ( !vk::isInstanceExtensionSupported(context.getUsedApiVersion(), context.getInstanceExtensions(), "VK_KHR_get_physical_device_properties2") )
+ if (!context.isInstanceFunctionalitySupported("VK_KHR_get_physical_device_properties2"))
TCU_THROW(NotSupportedError, "Extension VK_KHR_get_physical_device_properties2 is not present");
VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
@@ -76,6 +76,16 @@
nextPtr = &physicalDeviceScalarBlockLayoutFeaturesEXT.pNext;
}
+ vk::VkPhysicalDeviceSubgroupSizeControlFeaturesEXT physicalDeviceSubgroupSizeControlFeaturesEXT;
+ deMemset(&physicalDeviceSubgroupSizeControlFeaturesEXT, 0, sizeof(physicalDeviceSubgroupSizeControlFeaturesEXT));
+
+ if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_EXT_subgroup_size_control")) )
+ {
+ physicalDeviceSubgroupSizeControlFeaturesEXT.sType = getStructureType<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT>();
+ *nextPtr = &physicalDeviceSubgroupSizeControlFeaturesEXT;
+ nextPtr = &physicalDeviceSubgroupSizeControlFeaturesEXT.pNext;
+ }
+
vk::VkPhysicalDeviceTimelineSemaphoreFeaturesKHR physicalDeviceTimelineSemaphoreFeaturesKHR;
deMemset(&physicalDeviceTimelineSemaphoreFeaturesKHR, 0, sizeof(physicalDeviceTimelineSemaphoreFeaturesKHR));
@@ -106,6 +116,26 @@
nextPtr = &physicalDeviceVariablePointersFeatures.pNext;
}
+ vk::VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features;
+ deMemset(&physicalDeviceVulkan11Features, 0, sizeof(physicalDeviceVulkan11Features));
+
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) )
+ {
+ physicalDeviceVulkan11Features.sType = getStructureType<VkPhysicalDeviceVulkan11Features>();
+ *nextPtr = &physicalDeviceVulkan11Features;
+ nextPtr = &physicalDeviceVulkan11Features.pNext;
+ }
+
+ vk::VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features;
+ deMemset(&physicalDeviceVulkan12Features, 0, sizeof(physicalDeviceVulkan12Features));
+
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) )
+ {
+ physicalDeviceVulkan12Features.sType = getStructureType<VkPhysicalDeviceVulkan12Features>();
+ *nextPtr = &physicalDeviceVulkan12Features;
+ nextPtr = &physicalDeviceVulkan12Features.pNext;
+ }
+
context.getInstanceInterface().getPhysicalDeviceFeatures2(context.getPhysicalDevice(), &coreFeatures);
bool result = true;
@@ -144,6 +174,15 @@
}
}
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) )
+ {
+ if ( physicalDeviceVulkan11Features.multiview == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature multiview not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
if ( context.contextSupports(vk::ApiVersion(1, 1, 0)) )
{
if ( physicalDeviceMultiviewFeatures.multiview == VK_FALSE )
@@ -333,6 +372,69 @@
}
}
+ if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_EXT_subgroup_size_control")) )
+ {
+ if ( physicalDeviceSubgroupSizeControlFeaturesEXT.subgroupSizeControl == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature subgroupSizeControl not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_EXT_subgroup_size_control")) )
+ {
+ if ( physicalDeviceSubgroupSizeControlFeaturesEXT.computeFullSubgroups == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature computeFullSubgroups not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) )
+ {
+ if ( physicalDeviceVulkan12Features.subgroupBroadcastDynamicId == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature subgroupBroadcastDynamicId not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) )
+ {
+ if ( physicalDeviceVulkan12Features.imagelessFramebuffer == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature imagelessFramebuffer not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) )
+ {
+ if ( physicalDeviceVulkan12Features.uniformBufferStandardLayout == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature uniformBufferStandardLayout not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) )
+ {
+ if ( physicalDeviceVulkan12Features.separateDepthStencilLayouts == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature separateDepthStencilLayouts not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) )
+ {
+ if ( physicalDeviceVulkan12Features.hostQueryReset == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature hostQueryReset not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_timeline_semaphore")) )
{
if ( physicalDeviceTimelineSemaphoreFeaturesKHR.timelineSemaphore == VK_FALSE )
@@ -342,6 +444,132 @@
}
}
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) )
+ {
+ if ( physicalDeviceVulkan12Features.timelineSemaphore == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature timelineSemaphore 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;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) && physicalDeviceVulkan12Features.descriptorIndexing )
+ {
+ 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)) && physicalDeviceVulkan12Features.descriptorIndexing )
+ {
+ 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)) && physicalDeviceVulkan12Features.descriptorIndexing )
+ {
+ 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)) && physicalDeviceVulkan12Features.descriptorIndexing )
+ {
+ 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)) && physicalDeviceVulkan12Features.descriptorIndexing )
+ {
+ 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)) && physicalDeviceVulkan12Features.descriptorIndexing )
+ {
+ 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)) && physicalDeviceVulkan12Features.descriptorIndexing )
+ {
+ 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)) && physicalDeviceVulkan12Features.descriptorIndexing )
+ {
+ 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)) && physicalDeviceVulkan12Features.descriptorIndexing )
+ {
+ 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)) && physicalDeviceVulkan12Features.descriptorIndexing )
+ {
+ 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)) && physicalDeviceVulkan12Features.descriptorIndexing )
+ {
+ 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)) && physicalDeviceVulkan12Features.descriptorIndexing )
+ {
+ if ( physicalDeviceVulkan12Features.runtimeDescriptorArray == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature runtimeDescriptorArray 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 f78ba10..0642cd0 100644
--- a/external/vulkancts/framework/vulkan/vkMemUtil.cpp
+++ b/external/vulkancts/framework/vulkan/vkMemUtil.cpp
@@ -124,6 +124,7 @@
const MemoryRequirement MemoryRequirement::Local = MemoryRequirement(MemoryRequirement::FLAG_LOCAL);
const MemoryRequirement MemoryRequirement::Cached = MemoryRequirement(MemoryRequirement::FLAG_CACHED);
const MemoryRequirement MemoryRequirement::NonLocal = MemoryRequirement(MemoryRequirement::FLAG_NON_LOCAL);
+const MemoryRequirement MemoryRequirement::DeviceAddress = MemoryRequirement(MemoryRequirement::FLAG_DEVICE_ADDRESS);
bool MemoryRequirement::matchesHeap (VkMemoryPropertyFlags heapFlags) const
{
@@ -218,7 +219,7 @@
MovePtr<Allocation> SimpleAllocator::allocate (const VkMemoryRequirements& memReqs, MemoryRequirement requirement)
{
const deUint32 memoryTypeNdx = selectMatchingMemoryType(m_memProps, memReqs.memoryTypeBits, requirement);
- const VkMemoryAllocateInfo allocInfo =
+ VkMemoryAllocateInfo allocInfo =
{
VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
@@ -226,6 +227,20 @@
memoryTypeNdx, // deUint32 memoryTypeIndex;
};
+ VkMemoryAllocateFlagsInfo allocFlagsInfo =
+ {
+ VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ 0, // VkMemoryAllocateFlags flags
+ 0, // uint32_t deviceMask
+ };
+
+ if (requirement & MemoryRequirement::DeviceAddress)
+ {
+ allocFlagsInfo.flags |= VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR;
+ allocInfo.pNext = &allocFlagsInfo;
+ }
+
Move<VkDeviceMemory> mem = allocateMemory(m_vk, m_device, &allocInfo);
MovePtr<HostPtr> hostPtr;
@@ -238,13 +253,13 @@
return MovePtr<Allocation>(new SimpleAllocation(mem, hostPtr));
}
-static MovePtr<Allocation> allocateDedicated (const InstanceInterface& vki,
- const DeviceInterface& vkd,
- const VkPhysicalDevice& physDevice,
- const VkDevice device,
- const VkMemoryRequirements& memReqs,
- const MemoryRequirement requirement,
- const void* pNext)
+MovePtr<Allocation> allocateExtended (const InstanceInterface& vki,
+ const DeviceInterface& vkd,
+ const VkPhysicalDevice& physDevice,
+ const VkDevice device,
+ const VkMemoryRequirements& memReqs,
+ const MemoryRequirement requirement,
+ const void* pNext)
{
const VkPhysicalDeviceMemoryProperties memoryProperties = getPhysicalDeviceMemoryProperties(vki, physDevice);
const deUint32 memoryTypeNdx = selectMatchingMemoryType(memoryProperties, memReqs.memoryTypeBits, requirement);
@@ -283,7 +298,7 @@
buffer // VkBuffer buffer
};
- return allocateDedicated(vki, vkd, physDevice, device, memoryRequirements, requirement, &dedicatedAllocationInfo);
+ return allocateExtended(vki, vkd, physDevice, device, memoryRequirements, requirement, &dedicatedAllocationInfo);
}
de::MovePtr<Allocation> allocateDedicated (const InstanceInterface& vki,
@@ -302,7 +317,7 @@
DE_NULL // VkBuffer buffer
};
- return allocateDedicated(vki, vkd, physDevice, device, memoryRequirements, requirement, &dedicatedAllocationInfo);
+ return allocateExtended(vki, vkd, physDevice, device, memoryRequirements, requirement, &dedicatedAllocationInfo);
}
void* mapMemory (const DeviceInterface& vkd, VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags)
@@ -396,4 +411,35 @@
VK_CHECK(vkd.bindImageMemory2(device, numPlanes, coreInfos.data()));
}
+MovePtr<Allocation> bindImage (const DeviceInterface& vk,
+ const VkDevice device,
+ Allocator& allocator,
+ const VkImage image,
+ const MemoryRequirement requirement)
+{
+ MovePtr<Allocation> alloc = allocator.allocate(getImageMemoryRequirements(vk, device, image), requirement);
+ VK_CHECK(vk.bindImageMemory(device, image, alloc->getMemory(), alloc->getOffset()));
+ return alloc;
+}
+
+MovePtr<Allocation> bindBuffer (const DeviceInterface& vk,
+ const VkDevice device,
+ Allocator& allocator,
+ const VkBuffer buffer,
+ const MemoryRequirement requirement)
+{
+ MovePtr<Allocation> alloc(allocator.allocate(getBufferMemoryRequirements(vk, device, buffer), requirement));
+ VK_CHECK(vk.bindBufferMemory(device, buffer, alloc->getMemory(), alloc->getOffset()));
+ return alloc;
+}
+
+void zeroBuffer (const DeviceInterface& vk,
+ const VkDevice device,
+ const Allocation& alloc,
+ const VkDeviceSize size)
+{
+ deMemset(alloc.getHostPtr(), 0, static_cast<std::size_t>(size));
+ flushAlloc(vk, device, alloc);
+}
+
} // vk
diff --git a/external/vulkancts/framework/vulkan/vkMemUtil.hpp b/external/vulkancts/framework/vulkan/vkMemUtil.hpp
index 709369c..30ae4db 100644
--- a/external/vulkancts/framework/vulkan/vkMemUtil.hpp
+++ b/external/vulkancts/framework/vulkan/vkMemUtil.hpp
@@ -89,6 +89,7 @@
static const MemoryRequirement Local;
static const MemoryRequirement Cached;
static const MemoryRequirement NonLocal;
+ static const MemoryRequirement DeviceAddress;
inline MemoryRequirement operator| (MemoryRequirement requirement) const
{
@@ -118,6 +119,7 @@
FLAG_LOCAL = 1u << 4u,
FLAG_CACHED = 1u << 5u,
FLAG_NON_LOCAL = 1u << 6u,
+ FLAG_DEVICE_ADDRESS = 1u << 7u,
};
};
@@ -147,6 +149,7 @@
const VkPhysicalDeviceMemoryProperties m_memProps;
};
+de::MovePtr<Allocation> allocateExtended (const InstanceInterface& vki, const DeviceInterface& vkd, const VkPhysicalDevice& physDevice, const VkDevice device, const VkMemoryRequirements& memReqs, const MemoryRequirement requirement, const void* pNext);
de::MovePtr<Allocation> allocateDedicated (const InstanceInterface& vki, const DeviceInterface& vkd, const VkPhysicalDevice& physDevice, const VkDevice device, const VkBuffer buffer, MemoryRequirement requirement);
de::MovePtr<Allocation> allocateDedicated (const InstanceInterface& vki, const DeviceInterface& vkd, const VkPhysicalDevice& physDevice, const VkDevice device, const VkImage image, MemoryRequirement requirement);
@@ -163,6 +166,23 @@
vk::Allocator& allocator,
const vk::MemoryRequirement requirement);
+de::MovePtr<Allocation> bindImage (const DeviceInterface& vk,
+ const VkDevice device,
+ Allocator& allocator,
+ const VkImage image,
+ const MemoryRequirement requirement);
+
+de::MovePtr<Allocation> bindBuffer (const DeviceInterface& vk,
+ const VkDevice device,
+ Allocator& allocator,
+ const VkBuffer buffer,
+ const MemoryRequirement requirement);
+
+void zeroBuffer (const DeviceInterface& vk,
+ const VkDevice device,
+ const Allocation& alloc,
+ const VkDeviceSize size);
+
} // vk
#endif // _VKMEMUTIL_HPP
diff --git a/external/vulkancts/framework/vulkan/vkNullDriver.cpp b/external/vulkancts/framework/vulkan/vkNullDriver.cpp
index 1fbc1d6..6d7133a 100644
--- a/external/vulkancts/framework/vulkan/vkNullDriver.cpp
+++ b/external/vulkancts/framework/vulkan/vkNullDriver.cpp
@@ -250,7 +250,7 @@
{
public:
RenderPass (VkDevice, const VkRenderPassCreateInfo*) {}
- RenderPass (VkDevice, const VkRenderPassCreateInfo2KHR*) {}
+ RenderPass (VkDevice, const VkRenderPassCreateInfo2*) {}
};
class SwapchainKHR
diff --git a/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl b/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl
index 5a5af9f..15078dd 100644
--- a/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl
@@ -127,6 +127,12 @@
VK_NULL_RETURN((*pDescriptorUpdateTemplate = allocateNonDispHandle<DescriptorUpdateTemplate, VkDescriptorUpdateTemplate>(device, pCreateInfo, pAllocator)));
}
+VKAPI_ATTR VkResult VKAPI_CALL createRenderPass2 (VkDevice device, const VkRenderPassCreateInfo2* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass)
+{
+ DE_UNREF(pAllocator);
+ VK_NULL_RETURN((*pRenderPass = allocateNonDispHandle<RenderPass, VkRenderPass>(device, pCreateInfo, pAllocator)));
+}
+
VKAPI_ATTR VkResult VKAPI_CALL createSwapchainKHR (VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain)
{
DE_UNREF(pAllocator);
@@ -139,12 +145,6 @@
VK_NULL_RETURN((*pSurface = allocateNonDispHandle<SurfaceKHR, VkSurfaceKHR>(instance, pCreateInfo, pAllocator)));
}
-VKAPI_ATTR VkResult VKAPI_CALL createRenderPass2KHR (VkDevice device, const VkRenderPassCreateInfo2KHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass)
-{
- DE_UNREF(pAllocator);
- VK_NULL_RETURN((*pRenderPass = allocateNonDispHandle<RenderPass, VkRenderPass>(device, pCreateInfo, pAllocator)));
-}
-
VKAPI_ATTR VkResult VKAPI_CALL createDebugReportCallbackEXT (VkInstance instance, const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugReportCallbackEXT* pCallback)
{
DE_UNREF(pAllocator);
@@ -1231,6 +1231,100 @@
DE_UNREF(pSupport);
}
+VKAPI_ATTR void VKAPI_CALL cmdDrawIndirectCount (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride)
+{
+ DE_UNREF(commandBuffer);
+ DE_UNREF(buffer);
+ DE_UNREF(offset);
+ DE_UNREF(countBuffer);
+ DE_UNREF(countBufferOffset);
+ DE_UNREF(maxDrawCount);
+ DE_UNREF(stride);
+}
+
+VKAPI_ATTR void VKAPI_CALL cmdDrawIndexedIndirectCount (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride)
+{
+ DE_UNREF(commandBuffer);
+ DE_UNREF(buffer);
+ DE_UNREF(offset);
+ DE_UNREF(countBuffer);
+ DE_UNREF(countBufferOffset);
+ DE_UNREF(maxDrawCount);
+ DE_UNREF(stride);
+}
+
+VKAPI_ATTR void VKAPI_CALL cmdBeginRenderPass2 (VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, const VkSubpassBeginInfo* pSubpassBeginInfo)
+{
+ DE_UNREF(commandBuffer);
+ DE_UNREF(pRenderPassBegin);
+ DE_UNREF(pSubpassBeginInfo);
+}
+
+VKAPI_ATTR void VKAPI_CALL cmdNextSubpass2 (VkCommandBuffer commandBuffer, const VkSubpassBeginInfo* pSubpassBeginInfo, const VkSubpassEndInfo* pSubpassEndInfo)
+{
+ DE_UNREF(commandBuffer);
+ DE_UNREF(pSubpassBeginInfo);
+ DE_UNREF(pSubpassEndInfo);
+}
+
+VKAPI_ATTR void VKAPI_CALL cmdEndRenderPass2 (VkCommandBuffer commandBuffer, const VkSubpassEndInfo* pSubpassEndInfo)
+{
+ DE_UNREF(commandBuffer);
+ DE_UNREF(pSubpassEndInfo);
+}
+
+VKAPI_ATTR void VKAPI_CALL resetQueryPool (VkDevice device, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount)
+{
+ DE_UNREF(device);
+ DE_UNREF(queryPool);
+ DE_UNREF(firstQuery);
+ DE_UNREF(queryCount);
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL getSemaphoreCounterValue (VkDevice device, VkSemaphore semaphore, deUint64* pValue)
+{
+ DE_UNREF(device);
+ DE_UNREF(semaphore);
+ DE_UNREF(pValue);
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL waitSemaphores (VkDevice device, const VkSemaphoreWaitInfo* pWaitInfo, deUint64 timeout)
+{
+ DE_UNREF(device);
+ DE_UNREF(pWaitInfo);
+ DE_UNREF(timeout);
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL signalSemaphore (VkDevice device, const VkSemaphoreSignalInfo* pSignalInfo)
+{
+ DE_UNREF(device);
+ DE_UNREF(pSignalInfo);
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkDeviceAddress VKAPI_CALL getBufferDeviceAddress (VkDevice device, const VkBufferDeviceAddressInfo* pInfo)
+{
+ DE_UNREF(device);
+ DE_UNREF(pInfo);
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR uint64_t VKAPI_CALL getBufferOpaqueCaptureAddress (VkDevice device, const VkBufferDeviceAddressInfo* pInfo)
+{
+ DE_UNREF(device);
+ DE_UNREF(pInfo);
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR uint64_t VKAPI_CALL getDeviceMemoryOpaqueCaptureAddress (VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo)
+{
+ DE_UNREF(device);
+ DE_UNREF(pInfo);
+ return VK_SUCCESS;
+}
+
VKAPI_ATTR VkResult VKAPI_CALL getPhysicalDeviceSurfaceSupportKHR (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, VkSurfaceKHR surface, VkBool32* pSupported)
{
DE_UNREF(physicalDevice);
@@ -1419,26 +1513,6 @@
DE_UNREF(pData);
}
-VKAPI_ATTR void VKAPI_CALL cmdBeginRenderPass2KHR (VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, const VkSubpassBeginInfoKHR* pSubpassBeginInfo)
-{
- DE_UNREF(commandBuffer);
- DE_UNREF(pRenderPassBegin);
- DE_UNREF(pSubpassBeginInfo);
-}
-
-VKAPI_ATTR void VKAPI_CALL cmdNextSubpass2KHR (VkCommandBuffer commandBuffer, const VkSubpassBeginInfoKHR* pSubpassBeginInfo, const VkSubpassEndInfoKHR* pSubpassEndInfo)
-{
- DE_UNREF(commandBuffer);
- DE_UNREF(pSubpassBeginInfo);
- DE_UNREF(pSubpassEndInfo);
-}
-
-VKAPI_ATTR void VKAPI_CALL cmdEndRenderPass2KHR (VkCommandBuffer commandBuffer, const VkSubpassEndInfoKHR* pSubpassEndInfo)
-{
- DE_UNREF(commandBuffer);
- DE_UNREF(pSubpassEndInfo);
-}
-
VKAPI_ATTR VkResult VKAPI_CALL getSwapchainStatusKHR (VkDevice device, VkSwapchainKHR swapchain)
{
DE_UNREF(device);
@@ -1461,6 +1535,35 @@
return VK_SUCCESS;
}
+VKAPI_ATTR VkResult VKAPI_CALL enumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, deUint32* pCounterCount, VkPerformanceCounterKHR* pCounters, VkPerformanceCounterDescriptionKHR* pCounterDescriptions)
+{
+ DE_UNREF(physicalDevice);
+ DE_UNREF(queueFamilyIndex);
+ DE_UNREF(pCounterCount);
+ DE_UNREF(pCounters);
+ DE_UNREF(pCounterDescriptions);
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR void VKAPI_CALL getPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR (VkPhysicalDevice physicalDevice, const VkQueryPoolPerformanceCreateInfoKHR* pPerformanceQueryCreateInfo, deUint32* pNumPasses)
+{
+ DE_UNREF(physicalDevice);
+ DE_UNREF(pPerformanceQueryCreateInfo);
+ DE_UNREF(pNumPasses);
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL acquireProfilingLockKHR (VkDevice device, const VkAcquireProfilingLockInfoKHR* pInfo)
+{
+ DE_UNREF(device);
+ DE_UNREF(pInfo);
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR void VKAPI_CALL releaseProfilingLockKHR (VkDevice device)
+{
+ DE_UNREF(device);
+}
+
VKAPI_ATTR VkResult VKAPI_CALL getPhysicalDeviceSurfaceCapabilities2KHR (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, VkSurfaceCapabilities2KHR* pSurfaceCapabilities)
{
DE_UNREF(physicalDevice);
@@ -1511,28 +1614,6 @@
return VK_SUCCESS;
}
-VKAPI_ATTR void VKAPI_CALL cmdDrawIndirectCountKHR (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride)
-{
- DE_UNREF(commandBuffer);
- DE_UNREF(buffer);
- DE_UNREF(offset);
- DE_UNREF(countBuffer);
- DE_UNREF(countBufferOffset);
- DE_UNREF(maxDrawCount);
- DE_UNREF(stride);
-}
-
-VKAPI_ATTR void VKAPI_CALL cmdDrawIndexedIndirectCountKHR (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride)
-{
- DE_UNREF(commandBuffer);
- DE_UNREF(buffer);
- DE_UNREF(offset);
- DE_UNREF(countBuffer);
- DE_UNREF(countBufferOffset);
- DE_UNREF(maxDrawCount);
- DE_UNREF(stride);
-}
-
VKAPI_ATTR VkResult VKAPI_CALL getPipelineExecutablePropertiesKHR (VkDevice device, const VkPipelineInfoKHR* pPipelineInfo, deUint32* pExecutableCount, VkPipelineExecutablePropertiesKHR* pProperties)
{
DE_UNREF(device);
@@ -1560,29 +1641,6 @@
return VK_SUCCESS;
}
-VKAPI_ATTR VkResult VKAPI_CALL getSemaphoreCounterValueKHR (VkDevice device, VkSemaphore semaphore, deUint64* pValue)
-{
- DE_UNREF(device);
- DE_UNREF(semaphore);
- DE_UNREF(pValue);
- return VK_SUCCESS;
-}
-
-VKAPI_ATTR VkResult VKAPI_CALL waitSemaphoresKHR (VkDevice device, const VkSemaphoreWaitInfoKHR* pWaitInfo, deUint64 timeout)
-{
- DE_UNREF(device);
- DE_UNREF(pWaitInfo);
- DE_UNREF(timeout);
- return VK_SUCCESS;
-}
-
-VKAPI_ATTR VkResult VKAPI_CALL signalSemaphoreKHR (VkDevice device, const VkSemaphoreSignalInfoKHR* pSignalInfo)
-{
- DE_UNREF(device);
- DE_UNREF(pSignalInfo);
- return VK_SUCCESS;
-}
-
VKAPI_ATTR void VKAPI_CALL debugReportMessageEXT (VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, deUint64 object, deUintptr location, deInt32 messageCode, const char* pLayerPrefix, const char* pMessage)
{
DE_UNREF(instance);
@@ -2172,6 +2230,69 @@
DE_UNREF(pCheckpointData);
}
+VKAPI_ATTR VkResult VKAPI_CALL initializePerformanceApiINTEL (VkDevice device, const VkInitializePerformanceApiInfoINTEL* pInitializeInfo)
+{
+ DE_UNREF(device);
+ DE_UNREF(pInitializeInfo);
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR void VKAPI_CALL uninitializePerformanceApiINTEL (VkDevice device)
+{
+ DE_UNREF(device);
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL cmdSetPerformanceMarkerINTEL (VkCommandBuffer commandBuffer, const VkPerformanceMarkerInfoINTEL* pMarkerInfo)
+{
+ DE_UNREF(commandBuffer);
+ DE_UNREF(pMarkerInfo);
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL cmdSetPerformanceStreamMarkerINTEL (VkCommandBuffer commandBuffer, const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo)
+{
+ DE_UNREF(commandBuffer);
+ DE_UNREF(pMarkerInfo);
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL cmdSetPerformanceOverrideINTEL (VkCommandBuffer commandBuffer, const VkPerformanceOverrideInfoINTEL* pOverrideInfo)
+{
+ DE_UNREF(commandBuffer);
+ DE_UNREF(pOverrideInfo);
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL acquirePerformanceConfigurationINTEL (VkDevice device, const VkPerformanceConfigurationAcquireInfoINTEL* pAcquireInfo, VkPerformanceConfigurationINTEL* pConfiguration)
+{
+ DE_UNREF(device);
+ DE_UNREF(pAcquireInfo);
+ DE_UNREF(pConfiguration);
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL releasePerformanceConfigurationINTEL (VkDevice device, VkPerformanceConfigurationINTEL configuration)
+{
+ DE_UNREF(device);
+ DE_UNREF(configuration);
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL queueSetPerformanceConfigurationINTEL (VkQueue queue, VkPerformanceConfigurationINTEL configuration)
+{
+ DE_UNREF(queue);
+ DE_UNREF(configuration);
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL getPerformanceParameterINTEL (VkDevice device, VkPerformanceParameterTypeINTEL parameter, VkPerformanceValueINTEL* pValue)
+{
+ DE_UNREF(device);
+ DE_UNREF(parameter);
+ DE_UNREF(pValue);
+ return VK_SUCCESS;
+}
+
VKAPI_ATTR void VKAPI_CALL setLocalDimmingAMD (VkDevice device, VkSwapchainKHR swapChain, VkBool32 localDimmingEnable)
{
DE_UNREF(device);
@@ -2179,7 +2300,7 @@
DE_UNREF(localDimmingEnable);
}
-VKAPI_ATTR VkDeviceAddress VKAPI_CALL getBufferDeviceAddressEXT (VkDevice device, const VkBufferDeviceAddressInfoEXT* pInfo)
+VKAPI_ATTR VkDeviceAddress VKAPI_CALL getBufferDeviceAddressEXT (VkDevice device, const VkBufferDeviceAddressInfo* pInfo)
{
DE_UNREF(device);
DE_UNREF(pInfo);
@@ -2202,12 +2323,11 @@
return VK_SUCCESS;
}
-VKAPI_ATTR void VKAPI_CALL resetQueryPoolEXT (VkDevice device, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount)
+VKAPI_ATTR void VKAPI_CALL cmdSetLineStippleEXT (VkCommandBuffer commandBuffer, deUint32 lineStippleFactor, deUint16 lineStipplePattern)
{
- DE_UNREF(device);
- DE_UNREF(queryPool);
- DE_UNREF(firstQuery);
- DE_UNREF(queryCount);
+ DE_UNREF(commandBuffer);
+ DE_UNREF(lineStippleFactor);
+ DE_UNREF(lineStipplePattern);
}
VKAPI_ATTR VkResult VKAPI_CALL getAndroidHardwareBufferPropertiesANDROID (VkDevice device, const struct pt::AndroidHardwareBufferPtr buffer, VkAndroidHardwareBufferPropertiesANDROID* pProperties)
@@ -2413,6 +2533,8 @@
VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceExternalBufferPropertiesKHR, getPhysicalDeviceExternalBufferProperties),
VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceExternalSemaphorePropertiesKHR, getPhysicalDeviceExternalSemaphoreProperties),
VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceExternalFencePropertiesKHR, getPhysicalDeviceExternalFenceProperties),
+ VK_NULL_FUNC_ENTRY(vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR, enumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR),
+ VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR, getPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR),
VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceSurfaceCapabilities2KHR, getPhysicalDeviceSurfaceCapabilities2KHR),
VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceSurfaceFormats2KHR, getPhysicalDeviceSurfaceFormats2KHR),
VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceDisplayProperties2KHR, getPhysicalDeviceDisplayProperties2KHR),
@@ -2593,6 +2715,19 @@
VK_NULL_FUNC_ENTRY(vkDestroyDescriptorUpdateTemplate, destroyDescriptorUpdateTemplate),
VK_NULL_FUNC_ENTRY(vkUpdateDescriptorSetWithTemplate, updateDescriptorSetWithTemplate),
VK_NULL_FUNC_ENTRY(vkGetDescriptorSetLayoutSupport, getDescriptorSetLayoutSupport),
+ VK_NULL_FUNC_ENTRY(vkCmdDrawIndirectCount, cmdDrawIndirectCount),
+ VK_NULL_FUNC_ENTRY(vkCmdDrawIndexedIndirectCount, cmdDrawIndexedIndirectCount),
+ VK_NULL_FUNC_ENTRY(vkCreateRenderPass2, createRenderPass2),
+ VK_NULL_FUNC_ENTRY(vkCmdBeginRenderPass2, cmdBeginRenderPass2),
+ VK_NULL_FUNC_ENTRY(vkCmdNextSubpass2, cmdNextSubpass2),
+ VK_NULL_FUNC_ENTRY(vkCmdEndRenderPass2, cmdEndRenderPass2),
+ VK_NULL_FUNC_ENTRY(vkResetQueryPool, resetQueryPool),
+ VK_NULL_FUNC_ENTRY(vkGetSemaphoreCounterValue, getSemaphoreCounterValue),
+ VK_NULL_FUNC_ENTRY(vkWaitSemaphores, waitSemaphores),
+ VK_NULL_FUNC_ENTRY(vkSignalSemaphore, signalSemaphore),
+ VK_NULL_FUNC_ENTRY(vkGetBufferDeviceAddress, getBufferDeviceAddress),
+ VK_NULL_FUNC_ENTRY(vkGetBufferOpaqueCaptureAddress, getBufferOpaqueCaptureAddress),
+ VK_NULL_FUNC_ENTRY(vkGetDeviceMemoryOpaqueCaptureAddress, getDeviceMemoryOpaqueCaptureAddress),
VK_NULL_FUNC_ENTRY(vkCreateSwapchainKHR, createSwapchainKHR),
VK_NULL_FUNC_ENTRY(vkDestroySwapchainKHR, destroySwapchainKHR),
VK_NULL_FUNC_ENTRY(vkGetSwapchainImagesKHR, getSwapchainImagesKHR),
@@ -2615,13 +2750,15 @@
VK_NULL_FUNC_ENTRY(vkCreateDescriptorUpdateTemplateKHR, createDescriptorUpdateTemplate),
VK_NULL_FUNC_ENTRY(vkDestroyDescriptorUpdateTemplateKHR, destroyDescriptorUpdateTemplate),
VK_NULL_FUNC_ENTRY(vkUpdateDescriptorSetWithTemplateKHR, updateDescriptorSetWithTemplate),
- VK_NULL_FUNC_ENTRY(vkCreateRenderPass2KHR, createRenderPass2KHR),
- VK_NULL_FUNC_ENTRY(vkCmdBeginRenderPass2KHR, cmdBeginRenderPass2KHR),
- VK_NULL_FUNC_ENTRY(vkCmdNextSubpass2KHR, cmdNextSubpass2KHR),
- VK_NULL_FUNC_ENTRY(vkCmdEndRenderPass2KHR, cmdEndRenderPass2KHR),
+ VK_NULL_FUNC_ENTRY(vkCreateRenderPass2KHR, createRenderPass2),
+ VK_NULL_FUNC_ENTRY(vkCmdBeginRenderPass2KHR, cmdBeginRenderPass2),
+ VK_NULL_FUNC_ENTRY(vkCmdNextSubpass2KHR, cmdNextSubpass2),
+ VK_NULL_FUNC_ENTRY(vkCmdEndRenderPass2KHR, cmdEndRenderPass2),
VK_NULL_FUNC_ENTRY(vkGetSwapchainStatusKHR, getSwapchainStatusKHR),
VK_NULL_FUNC_ENTRY(vkImportFenceFdKHR, importFenceFdKHR),
VK_NULL_FUNC_ENTRY(vkGetFenceFdKHR, getFenceFdKHR),
+ VK_NULL_FUNC_ENTRY(vkAcquireProfilingLockKHR, acquireProfilingLockKHR),
+ VK_NULL_FUNC_ENTRY(vkReleaseProfilingLockKHR, releaseProfilingLockKHR),
VK_NULL_FUNC_ENTRY(vkGetImageMemoryRequirements2KHR, getImageMemoryRequirements2),
VK_NULL_FUNC_ENTRY(vkGetBufferMemoryRequirements2KHR, getBufferMemoryRequirements2),
VK_NULL_FUNC_ENTRY(vkGetImageSparseMemoryRequirements2KHR, getImageSparseMemoryRequirements2),
@@ -2630,14 +2767,17 @@
VK_NULL_FUNC_ENTRY(vkBindBufferMemory2KHR, bindBufferMemory2),
VK_NULL_FUNC_ENTRY(vkBindImageMemory2KHR, bindImageMemory2),
VK_NULL_FUNC_ENTRY(vkGetDescriptorSetLayoutSupportKHR, getDescriptorSetLayoutSupport),
- VK_NULL_FUNC_ENTRY(vkCmdDrawIndirectCountKHR, cmdDrawIndirectCountKHR),
- VK_NULL_FUNC_ENTRY(vkCmdDrawIndexedIndirectCountKHR, cmdDrawIndexedIndirectCountKHR),
+ VK_NULL_FUNC_ENTRY(vkCmdDrawIndirectCountKHR, cmdDrawIndirectCount),
+ VK_NULL_FUNC_ENTRY(vkCmdDrawIndexedIndirectCountKHR, cmdDrawIndexedIndirectCount),
+ VK_NULL_FUNC_ENTRY(vkGetSemaphoreCounterValueKHR, getSemaphoreCounterValue),
+ VK_NULL_FUNC_ENTRY(vkWaitSemaphoresKHR, waitSemaphores),
+ VK_NULL_FUNC_ENTRY(vkSignalSemaphoreKHR, signalSemaphore),
+ VK_NULL_FUNC_ENTRY(vkGetBufferDeviceAddressKHR, getBufferDeviceAddress),
+ VK_NULL_FUNC_ENTRY(vkGetBufferOpaqueCaptureAddressKHR, getBufferOpaqueCaptureAddress),
+ VK_NULL_FUNC_ENTRY(vkGetDeviceMemoryOpaqueCaptureAddressKHR, getDeviceMemoryOpaqueCaptureAddress),
VK_NULL_FUNC_ENTRY(vkGetPipelineExecutablePropertiesKHR, getPipelineExecutablePropertiesKHR),
VK_NULL_FUNC_ENTRY(vkGetPipelineExecutableStatisticsKHR, getPipelineExecutableStatisticsKHR),
VK_NULL_FUNC_ENTRY(vkGetPipelineExecutableInternalRepresentationsKHR, getPipelineExecutableInternalRepresentationsKHR),
- VK_NULL_FUNC_ENTRY(vkGetSemaphoreCounterValueKHR, getSemaphoreCounterValueKHR),
- VK_NULL_FUNC_ENTRY(vkWaitSemaphoresKHR, waitSemaphoresKHR),
- VK_NULL_FUNC_ENTRY(vkSignalSemaphoreKHR, signalSemaphoreKHR),
VK_NULL_FUNC_ENTRY(vkDebugMarkerSetObjectTagEXT, debugMarkerSetObjectTagEXT),
VK_NULL_FUNC_ENTRY(vkDebugMarkerSetObjectNameEXT, debugMarkerSetObjectNameEXT),
VK_NULL_FUNC_ENTRY(vkCmdDebugMarkerBeginEXT, cmdDebugMarkerBeginEXT),
@@ -2710,9 +2850,19 @@
VK_NULL_FUNC_ENTRY(vkCmdSetExclusiveScissorNV, cmdSetExclusiveScissorNV),
VK_NULL_FUNC_ENTRY(vkCmdSetCheckpointNV, cmdSetCheckpointNV),
VK_NULL_FUNC_ENTRY(vkGetQueueCheckpointDataNV, getQueueCheckpointDataNV),
+ VK_NULL_FUNC_ENTRY(vkInitializePerformanceApiINTEL, initializePerformanceApiINTEL),
+ VK_NULL_FUNC_ENTRY(vkUninitializePerformanceApiINTEL, uninitializePerformanceApiINTEL),
+ VK_NULL_FUNC_ENTRY(vkCmdSetPerformanceMarkerINTEL, cmdSetPerformanceMarkerINTEL),
+ VK_NULL_FUNC_ENTRY(vkCmdSetPerformanceStreamMarkerINTEL, cmdSetPerformanceStreamMarkerINTEL),
+ VK_NULL_FUNC_ENTRY(vkCmdSetPerformanceOverrideINTEL, cmdSetPerformanceOverrideINTEL),
+ VK_NULL_FUNC_ENTRY(vkAcquirePerformanceConfigurationINTEL, acquirePerformanceConfigurationINTEL),
+ VK_NULL_FUNC_ENTRY(vkReleasePerformanceConfigurationINTEL, releasePerformanceConfigurationINTEL),
+ VK_NULL_FUNC_ENTRY(vkQueueSetPerformanceConfigurationINTEL, queueSetPerformanceConfigurationINTEL),
+ VK_NULL_FUNC_ENTRY(vkGetPerformanceParameterINTEL, getPerformanceParameterINTEL),
VK_NULL_FUNC_ENTRY(vkSetLocalDimmingAMD, setLocalDimmingAMD),
VK_NULL_FUNC_ENTRY(vkGetBufferDeviceAddressEXT, getBufferDeviceAddressEXT),
- VK_NULL_FUNC_ENTRY(vkResetQueryPoolEXT, resetQueryPoolEXT),
+ VK_NULL_FUNC_ENTRY(vkCmdSetLineStippleEXT, cmdSetLineStippleEXT),
+ VK_NULL_FUNC_ENTRY(vkResetQueryPoolEXT, resetQueryPool),
VK_NULL_FUNC_ENTRY(vkGetAndroidHardwareBufferPropertiesANDROID, getAndroidHardwareBufferPropertiesANDROID),
VK_NULL_FUNC_ENTRY(vkGetMemoryAndroidHardwareBufferANDROID, getMemoryAndroidHardwareBufferANDROID),
VK_NULL_FUNC_ENTRY(vkGetMemoryWin32HandleKHR, getMemoryWin32HandleKHR),
diff --git a/external/vulkancts/framework/vulkan/vkObjUtil.cpp b/external/vulkancts/framework/vulkan/vkObjUtil.cpp
index ee1494f..a65d9b8 100644
--- a/external/vulkancts/framework/vulkan/vkObjUtil.cpp
+++ b/external/vulkancts/framework/vulkan/vkObjUtil.cpp
@@ -622,4 +622,19 @@
return createCommandPool(vk, device, &commandPoolParams);
}
+VkBufferImageCopy makeBufferImageCopy (const VkExtent3D extent,
+ const VkImageSubresourceLayers subresourceLayers)
+{
+ const VkBufferImageCopy copyParams =
+ {
+ 0ull, // VkDeviceSize bufferOffset;
+ 0u, // deUint32 bufferRowLength;
+ 0u, // deUint32 bufferImageHeight;
+ subresourceLayers, // VkImageSubresourceLayers imageSubresource;
+ makeOffset3D(0, 0, 0), // VkOffset3D imageOffset;
+ extent, // VkExtent3D imageExtent;
+ };
+ return copyParams;
+}
+
} // vk
diff --git a/external/vulkancts/framework/vulkan/vkObjUtil.hpp b/external/vulkancts/framework/vulkan/vkObjUtil.hpp
index cf6d0b1..f072c31 100644
--- a/external/vulkancts/framework/vulkan/vkObjUtil.hpp
+++ b/external/vulkancts/framework/vulkan/vkObjUtil.hpp
@@ -25,6 +25,7 @@
#include <vector>
#include "vkRef.hpp"
+#include "vkRefUtil.hpp"
namespace vk
{
@@ -135,6 +136,32 @@
const VkDevice device,
const deUint32 queueFamilyIndex);
+inline Move<VkBuffer> makeBuffer (const DeviceInterface& vk,
+ const VkDevice device,
+ const VkDeviceSize bufferSize,
+ const VkBufferUsageFlags usage)
+{
+ const VkBufferCreateInfo bufferCreateInfo = makeBufferCreateInfo(bufferSize, usage);
+ return createBuffer(vk, device, &bufferCreateInfo);
+}
+
+inline Move<VkBuffer> makeBuffer (const vk::DeviceInterface& vk,
+ const vk::VkDevice device,
+ const vk::VkBufferCreateInfo& createInfo)
+{
+ return createBuffer(vk, device, &createInfo);
+}
+
+inline Move<VkImage> makeImage (const DeviceInterface& vk,
+ const VkDevice device,
+ const VkImageCreateInfo& createInfo)
+{
+ return createImage(vk, device, &createInfo);
+}
+
+VkBufferImageCopy makeBufferImageCopy (const VkExtent3D extent,
+ const VkImageSubresourceLayers subresourceLayers);
+
} // vk
#endif // _VKOBJUTIL_HPP
diff --git a/external/vulkancts/framework/vulkan/vkPrograms.cpp b/external/vulkancts/framework/vulkan/vkPrograms.cpp
index 916600d..95232b3 100644
--- a/external/vulkancts/framework/vulkan/vkPrograms.cpp
+++ b/external/vulkancts/framework/vulkan/vkPrograms.cpp
@@ -21,9 +21,7 @@
* \brief Program utilities.
*//*--------------------------------------------------------------------*/
-#if defined(DEQP_HAVE_SPIRV_TOOLS)
#include "spirv-tools/optimizer.hpp"
-#endif
#include "qpInfo.h"
@@ -49,7 +47,7 @@
using std::vector;
using std::map;
-#if defined(DE_DEBUG) && defined(DEQP_HAVE_SPIRV_TOOLS)
+#if defined(DE_DEBUG)
# define VALIDATE_BINARIES true
#else
# define VALIDATE_BINARIES false
@@ -100,8 +98,6 @@
return true;
}
-#if defined(DEQP_HAVE_SPIRV_TOOLS)
-
void optimizeCompiledBinary (vector<deUint32>& binary, int optimizationRecipe, const SpirvVersion spirvVersion)
{
spv_target_env targetEnv = SPV_ENV_VULKAN_1_0;
@@ -113,6 +109,8 @@
case SPIRV_VERSION_1_1:
case SPIRV_VERSION_1_2:
case SPIRV_VERSION_1_3: targetEnv = SPV_ENV_VULKAN_1_1; break;
+ case SPIRV_VERSION_1_4: targetEnv = SPV_ENV_VULKAN_1_1_SPIRV_1_4; break;
+ case SPIRV_VERSION_1_5: targetEnv = SPV_ENV_VULKAN_1_2; break;
default:
TCU_THROW(InternalError, "Unexpected SPIR-V version requested");
}
@@ -149,12 +147,8 @@
TCU_THROW(InternalError, "SPIR-V endianness translation not supported");
}
-#endif // defined(DEQP_HAVE_SPIRV_TOOLS)
-
} // anonymous
-#if defined(DEQP_HAVE_SPIRV_TOOLS)
-
void validateCompiledBinary(const vector<deUint32>& binary, glu::ShaderProgramInfo* buildInfo, const SpirvValidatorOptions& options)
{
std::ostringstream validationLog;
@@ -655,24 +649,6 @@
return res;
}
-#else // !DEQP_HAVE_SPIRV_TOOLS
-
-ProgramBinary* buildProgram (const GlslSource&, glu::ShaderProgramInfo*, const tcu::CommandLine&)
-{
- TCU_THROW(NotSupportedError, "GLSL to SPIR-V compilation not supported (DEQP_HAVE_GLSLANG not defined)");
-}
-
-ProgramBinary* buildProgram (const HlslSource&, glu::ShaderProgramInfo*, const tcu::CommandLine&)
-{
- TCU_THROW(NotSupportedError, "HLSL to SPIR-V compilation not supported (DEQP_HAVE_GLSLANG not defined)");
-}
-
-ProgramBinary* assembleProgram (const SpirVAsmSource&, SpirVProgramInfo*, const tcu::CommandLine&)
-{
- TCU_THROW(NotSupportedError, "SPIR-V assembly not supported (DEQP_HAVE_SPIRV_TOOLS not defined)");
-}
-#endif
-
void disassembleProgram (const ProgramBinary& program, std::ostream* dst)
{
if (program.getFormat() == PROGRAM_FORMAT_SPIRV)
@@ -764,40 +740,37 @@
return vk::SPIRV_VERSION_1_0;
}
-// Max supported versions for each vulkan version
-vk::SpirvVersion getMaxSpirvVersionForAsm (const deUint32 vulkanVersion)
+// Max supported versions for each Vulkan version, without requiring a Vulkan extension.
+vk::SpirvVersion getMaxSpirvVersionForVulkan (const deUint32 vulkanVersion)
{
vk::SpirvVersion result = vk::SPIRV_VERSION_LAST;
deUint32 vulkanVersionMajorMinor = VK_MAKE_VERSION(VK_VERSION_MAJOR(vulkanVersion), VK_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)
+ else if (vulkanVersionMajorMinor == VK_API_VERSION_1_1)
result = vk::SPIRV_VERSION_1_3;
+ else if (vulkanVersionMajorMinor >= VK_API_VERSION_1_2)
+ result = vk::SPIRV_VERSION_1_5;
DE_ASSERT(result < vk::SPIRV_VERSION_LAST);
return result;
}
+vk::SpirvVersion getMaxSpirvVersionForAsm (const deUint32 vulkanVersion)
+{
+ return getMaxSpirvVersionForVulkan(vulkanVersion);
+}
+
vk::SpirvVersion getMaxSpirvVersionForGlsl (const deUint32 vulkanVersion)
{
- vk::SpirvVersion result = vk::SPIRV_VERSION_LAST;
-
- deUint32 vulkanVersionMajorMinor = VK_MAKE_VERSION(VK_VERSION_MAJOR(vulkanVersion), VK_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)
- result = vk::SPIRV_VERSION_1_3;
-
- DE_ASSERT(result < vk::SPIRV_VERSION_LAST);
-
- return result;
+ return getMaxSpirvVersionForVulkan(vulkanVersion);
}
SpirvVersion extractSpirvVersion (const ProgramBinary& binary)
{
- DE_STATIC_ASSERT(SPIRV_VERSION_1_3 + 1 == SPIRV_VERSION_LAST);
+ DE_STATIC_ASSERT(SPIRV_VERSION_1_5 + 1 == SPIRV_VERSION_LAST);
if (binary.getFormat() != PROGRAM_FORMAT_SPIRV)
TCU_THROW(InternalError, "Binary is not in SPIR-V format");
@@ -809,6 +782,8 @@
const deUint32 spirvBinaryVersion11 = 0x00010100;
const deUint32 spirvBinaryVersion12 = 0x00010200;
const deUint32 spirvBinaryVersion13 = 0x00010300;
+ const deUint32 spirvBinaryVersion14 = 0x00010400;
+ const deUint32 spirvBinaryVersion15 = 0x00010500;
const SpirvBinaryHeader* header = reinterpret_cast<const SpirvBinaryHeader*>(binary.getBinary());
const deUint32 spirvVersion = isNativeSpirVBinaryEndianness()
? header->version
@@ -821,6 +796,8 @@
case spirvBinaryVersion11: result = SPIRV_VERSION_1_1; break; //!< SPIR-V 1.1
case spirvBinaryVersion12: result = SPIRV_VERSION_1_2; break; //!< SPIR-V 1.2
case spirvBinaryVersion13: result = SPIRV_VERSION_1_3; break; //!< SPIR-V 1.3
+ case spirvBinaryVersion14: result = SPIRV_VERSION_1_4; break; //!< SPIR-V 1.4
+ case spirvBinaryVersion15: result = SPIRV_VERSION_1_5; break; //!< SPIR-V 1.5
default: TCU_THROW(InternalError, "Unknown SPIR-V version detected in binary");
}
@@ -829,7 +806,7 @@
std::string getSpirvVersionName (const SpirvVersion spirvVersion)
{
- DE_STATIC_ASSERT(SPIRV_VERSION_1_3 + 1 == SPIRV_VERSION_LAST);
+ DE_STATIC_ASSERT(SPIRV_VERSION_1_5 + 1 == SPIRV_VERSION_LAST);
DE_ASSERT(spirvVersion < SPIRV_VERSION_LAST);
std::string result;
@@ -840,6 +817,8 @@
case SPIRV_VERSION_1_1: result = "1.1"; break; //!< SPIR-V 1.1
case SPIRV_VERSION_1_2: result = "1.2"; break; //!< SPIR-V 1.2
case SPIRV_VERSION_1_3: result = "1.3"; break; //!< SPIR-V 1.3
+ case SPIRV_VERSION_1_4: result = "1.4"; break; //!< SPIR-V 1.4
+ case SPIRV_VERSION_1_5: result = "1.5"; break; //!< SPIR-V 1.5
default: result = "Unknown";
}
diff --git a/external/vulkancts/framework/vulkan/vkPrograms.hpp b/external/vulkancts/framework/vulkan/vkPrograms.hpp
index cca650d..fe43469 100644
--- a/external/vulkancts/framework/vulkan/vkPrograms.hpp
+++ b/external/vulkancts/framework/vulkan/vkPrograms.hpp
@@ -218,7 +218,11 @@
glu::ShaderType getGluShaderType (VkShaderStageFlagBits shaderStage);
VkShaderStageFlagBits getVkShaderStage (glu::ShaderType shaderType);
+// Returns the max SPIR-V version usable with a given Vulkan version, without requiring an extension.
+vk::SpirvVersion getMaxSpirvVersionForVulkan (const deUint32 vulkanVersion);
+// Deprecated. Use getMaxSpirvVersionForVulkan instead.
vk::SpirvVersion getMaxSpirvVersionForAsm (const deUint32 vulkanVersion);
+// Deprecated. Use getMaxSpirvVersionForVulkan instead.
vk::SpirvVersion getMaxSpirvVersionForGlsl (const deUint32 vulkanVersion);
vk::SpirvVersion getBaselineSpirvVersion (const deUint32 vulkanVersion);
SpirvVersion extractSpirvVersion (const ProgramBinary& binary);
diff --git a/external/vulkancts/framework/vulkan/vkQueryUtil.cpp b/external/vulkancts/framework/vulkan/vkQueryUtil.cpp
index 717d889..de83fab 100644
--- a/external/vulkancts/framework/vulkan/vkQueryUtil.cpp
+++ b/external/vulkancts/framework/vulkan/vkQueryUtil.cpp
@@ -155,6 +155,43 @@
return features;
}
+VkPhysicalDeviceVulkan12Features getPhysicalDeviceVulkan12Features (const InstanceInterface& vk, VkPhysicalDevice physicalDevice)
+{
+ VkPhysicalDeviceFeatures2 features;
+ VkPhysicalDeviceVulkan12Features vulkan_12_features;
+
+ deMemset(&features, 0, sizeof(features));
+ features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
+
+ deMemset(&vulkan_12_features, 0, sizeof(vulkan_12_features));
+ vulkan_12_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES;
+
+ features.pNext = &vulkan_12_features;
+
+ vk.getPhysicalDeviceFeatures2(physicalDevice, &features);
+ return vulkan_12_features;
+}
+
+VkPhysicalDeviceVulkan11Properties getPhysicalDeviceVulkan11Properties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice)
+{
+ VkPhysicalDeviceVulkan11Properties vulkan11properties = initVulkanStructure();
+ VkPhysicalDeviceProperties2 properties = initVulkanStructure(&vulkan11properties);
+
+ vk.getPhysicalDeviceProperties2(physicalDevice, &properties);
+
+ return vulkan11properties;
+}
+
+VkPhysicalDeviceVulkan12Properties getPhysicalDeviceVulkan12Properties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice)
+{
+ VkPhysicalDeviceVulkan12Properties vulkan12properties = initVulkanStructure();
+ VkPhysicalDeviceProperties2 properties = initVulkanStructure(&vulkan12properties);
+
+ vk.getPhysicalDeviceProperties2(physicalDevice, &properties);
+
+ return vulkan12properties;
+}
+
VkPhysicalDeviceProperties getPhysicalDeviceProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice)
{
VkPhysicalDeviceProperties properties;
@@ -403,38 +440,6 @@
return true;
}
-bool isInstanceExtensionSupported (const deUint32 instanceVersion, const std::vector<std::string>& extensions, const std::string& required)
-{
- if (isCoreInstanceExtension(instanceVersion, required))
- return true;
- else
- return de::contains(extensions.begin(), extensions.end(), required);
-}
-
-bool isDeviceExtensionSupported (const deUint32 deviceVersion, const std::vector<std::string>& extensions, const std::string& required)
-{
- if (isCoreDeviceExtension(deviceVersion, required))
- return true;
- else
- return de::contains(extensions.begin(), extensions.end(), required);
-}
-
-bool isInstanceExtensionSupported (const deUint32 instanceVersion, const std::vector<VkExtensionProperties>& extensions, const RequiredExtension& required)
-{
- if (isCoreInstanceExtension(instanceVersion, required.name))
- return true;
- else
- return isExtensionSupported(extensions.begin(), extensions.end(), required);
-}
-
-bool isDeviceExtensionSupported (const deUint32 deviceVersion, const std::vector<VkExtensionProperties>& extensions, const RequiredExtension& required)
-{
- if (isCoreDeviceExtension(deviceVersion, required.name))
- return true;
- else
- return isExtensionSupported(extensions.begin(), extensions.end(), required);
-}
-
bool isExtensionSupported (const std::vector<VkExtensionProperties>& extensions, const RequiredExtension& required)
{
return isExtensionSupported(extensions.begin(), extensions.end(), required);
@@ -445,6 +450,15 @@
return de::contains(extensionStrings.begin(), extensionStrings.end(), extensionName);
}
+bool isInstanceExtensionSupported(const deUint32 instanceVersion, const std::vector<std::string>& extensions, const std::string& required)
+{
+ // NOTE: this function is only needed in few cases during creation of context,
+ // dont use it, call Context::isInstanceFunctionalitySupported instead
+ if (isCoreInstanceExtension(instanceVersion, required))
+ return true;
+ return de::contains(extensions.begin(), extensions.end(), required);
+}
+
bool isLayerSupported (const std::vector<VkLayerProperties>& layers, const RequiredLayer& required)
{
return isLayerSupported(layers.begin(), layers.end(), required);
diff --git a/external/vulkancts/framework/vulkan/vkQueryUtil.hpp b/external/vulkancts/framework/vulkan/vkQueryUtil.hpp
index 933aca1..c4843cd 100644
--- a/external/vulkancts/framework/vulkan/vkQueryUtil.hpp
+++ b/external/vulkancts/framework/vulkan/vkQueryUtil.hpp
@@ -47,6 +47,9 @@
std::vector<VkQueueFamilyProperties> getPhysicalDeviceQueueFamilyProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice);
VkPhysicalDeviceFeatures getPhysicalDeviceFeatures (const InstanceInterface& vk, VkPhysicalDevice physicalDevice);
VkPhysicalDeviceFeatures2 getPhysicalDeviceFeatures2 (const InstanceInterface& vk, VkPhysicalDevice physicalDevice);
+VkPhysicalDeviceVulkan12Features getPhysicalDeviceVulkan12Features (const InstanceInterface& vk, VkPhysicalDevice physicalDevice);
+VkPhysicalDeviceVulkan11Properties getPhysicalDeviceVulkan11Properties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice);
+VkPhysicalDeviceVulkan12Properties getPhysicalDeviceVulkan12Properties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice);
VkPhysicalDeviceProperties getPhysicalDeviceProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice);
VkPhysicalDeviceMemoryProperties getPhysicalDeviceMemoryProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice);
VkFormatProperties getPhysicalDeviceFormatProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice, VkFormat format);
@@ -112,10 +115,8 @@
template<typename ExtensionIterator>
bool isExtensionSupported (ExtensionIterator begin, ExtensionIterator end, const RequiredExtension& required);
bool isExtensionSupported (const std::vector<VkExtensionProperties>& extensions, const RequiredExtension& required);
-bool isDeviceExtensionSupported (const deUint32 deviceVersion, const std::vector<std::string>& extensions, const std::string& required);
+
bool isInstanceExtensionSupported (const deUint32 instanceVersion, const std::vector<std::string>& extensions, const std::string& required);
-bool isDeviceExtensionSupported (const deUint32 deviceVersion, const std::vector<VkExtensionProperties>& extensions, const RequiredExtension& required);
-bool isInstanceExtensionSupported (const deUint32 instanceVersion, const std::vector<VkExtensionProperties>& extensions, const RequiredExtension& required);
template<typename LayerIterator>
bool isLayerSupported (LayerIterator begin, LayerIterator end, const RequiredLayer& required);
@@ -139,6 +140,58 @@
return reinterpret_cast<StructType*>(findStructureInChain(first, getStructureType<StructType>()));
}
+struct initVulkanStructure
+{
+ initVulkanStructure (void* pNext = DE_NULL) : m_next(pNext) {};
+
+ template<class StructType>
+ operator StructType()
+ {
+ StructType result;
+
+ deMemset(&result, 0x00, sizeof(StructType));
+
+ result.sType = getStructureType<StructType>();
+ result.pNext = m_next;
+
+ return result;
+ }
+
+private:
+ void* m_next;
+};
+
+template<class StructType>
+void addToChainVulkanStructure (void*** chainPNextPtr, StructType& structType)
+{
+ DE_ASSERT(chainPNextPtr != DE_NULL);
+
+ (**chainPNextPtr) = &structType;
+
+ (*chainPNextPtr) = &structType.pNext;
+}
+
+struct initVulkanStructureConst
+{
+ initVulkanStructureConst (const void* pNext = DE_NULL) : m_next(pNext) {};
+
+ template<class StructType>
+ operator const StructType()
+ {
+ StructType result;
+
+ deMemset(&result, 0x00, sizeof(StructType));
+
+ result.sType = getStructureType<StructType>();
+ result.pNext = const_cast<void*>(m_next);
+
+ return result;
+ }
+
+private:
+ const void* m_next;
+};
+
namespace ValidateQueryBits
{
@@ -169,6 +222,30 @@
return true;
}
+template <typename Type>
+//!< Return variable initialization validation
+bool validateStructsWithGuard (const QueryMemberTableEntry* queryMemberTableEntry, Type* vec[2], const deUint8 guardValue, const deUint32 guardSize)
+{
+ const QueryMemberTableEntry *iterator;
+
+ for (iterator = queryMemberTableEntry; iterator->size != 0; iterator++)
+ {
+ if (deMemCmp(((deUint8*)(vec[0]))+iterator->offset, ((deUint8*)(vec[1]))+iterator->offset, iterator->size) != 0)
+ return false;
+ }
+
+ for (deUint32 vecNdx = 0; vecNdx < 2; ++vecNdx)
+ {
+ for (deUint32 ndx = 0; ndx < guardSize; ndx++)
+ {
+ if (((deUint8*)(vec[vecNdx]))[ndx + sizeof(Type)] != guardValue)
+ return false;
+ }
+ }
+
+ return true;
+}
+
template<typename IterT>
//! Overwrite a range of objects with an 8-bit pattern.
inline void fillBits (IterT beg, const IterT end, const deUint8 pattern = 0xdeu)
diff --git a/external/vulkancts/framework/vulkan/vkRefUtil.cpp b/external/vulkancts/framework/vulkan/vkRefUtil.cpp
index 2648dc9..0043ec9 100644
--- a/external/vulkancts/framework/vulkan/vkRefUtil.cpp
+++ b/external/vulkancts/framework/vulkan/vkRefUtil.cpp
@@ -84,14 +84,14 @@
Move<VkSemaphore> createSemaphoreType (const DeviceInterface& vk,
VkDevice device,
- VkSemaphoreTypeKHR type,
+ VkSemaphoreType type,
VkSemaphoreCreateFlags flags,
const deUint64 initialValue,
const VkAllocationCallbacks* pAllocator)
{
- const VkSemaphoreTypeCreateInfoKHR createTypeInfo =
+ const VkSemaphoreTypeCreateInfo createTypeInfo =
{
- VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR,
+ VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO,
DE_NULL,
type,
diff --git a/external/vulkancts/framework/vulkan/vkRefUtil.hpp b/external/vulkancts/framework/vulkan/vkRefUtil.hpp
index 9e4dc1c..356e804 100644
--- a/external/vulkancts/framework/vulkan/vkRefUtil.hpp
+++ b/external/vulkancts/framework/vulkan/vkRefUtil.hpp
@@ -51,7 +51,7 @@
Move<VkSemaphore> createSemaphoreType (const DeviceInterface& vk,
VkDevice device,
- VkSemaphoreTypeKHR type,
+ VkSemaphoreType type,
VkSemaphoreCreateFlags flags = (VkSemaphoreCreateFlags)0,
const deUint64 initialValue = 0,
const VkAllocationCallbacks* pAllocator = DE_NULL);
diff --git a/external/vulkancts/framework/vulkan/vkRefUtil.inl b/external/vulkancts/framework/vulkan/vkRefUtil.inl
index 78953f5..921adc7 100644
--- a/external/vulkancts/framework/vulkan/vkRefUtil.inl
+++ b/external/vulkancts/framework/vulkan/vkRefUtil.inl
@@ -23,10 +23,10 @@
Move<VkCommandPool> createCommandPool (const DeviceInterface& vk, VkDevice device, const VkCommandPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator = DE_NULL);
Move<VkSamplerYcbcrConversion> createSamplerYcbcrConversion (const DeviceInterface& vk, VkDevice device, const VkSamplerYcbcrConversionCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator = DE_NULL);
Move<VkDescriptorUpdateTemplate> createDescriptorUpdateTemplate (const DeviceInterface& vk, VkDevice device, const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator = DE_NULL);
+Move<VkRenderPass> createRenderPass2 (const DeviceInterface& vk, VkDevice device, const VkRenderPassCreateInfo2* pCreateInfo, const VkAllocationCallbacks* pAllocator = DE_NULL);
Move<VkSwapchainKHR> createSwapchainKHR (const DeviceInterface& vk, VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator = DE_NULL);
Move<VkSurfaceKHR> createDisplayPlaneSurfaceKHR (const InstanceInterface& vk, VkInstance instance, const VkDisplaySurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator = DE_NULL);
Move<VkSwapchainKHR> createSharedSwapchainsKHR (const DeviceInterface& vk, VkDevice device, deUint32 swapchainCount, const VkSwapchainCreateInfoKHR* pCreateInfos, const VkAllocationCallbacks* pAllocator = DE_NULL);
-Move<VkRenderPass> createRenderPass2KHR (const DeviceInterface& vk, VkDevice device, const VkRenderPassCreateInfo2KHR* pCreateInfo, const VkAllocationCallbacks* pAllocator = DE_NULL);
Move<VkDebugReportCallbackEXT> createDebugReportCallbackEXT (const InstanceInterface& vk, VkInstance instance, const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator = DE_NULL);
Move<VkIndirectCommandsLayoutNVX> createIndirectCommandsLayoutNVX (const DeviceInterface& vk, VkDevice device, const VkIndirectCommandsLayoutCreateInfoNVX* pCreateInfo, const VkAllocationCallbacks* pAllocator = DE_NULL);
Move<VkObjectTableNVX> createObjectTableNVX (const DeviceInterface& vk, VkDevice device, const VkObjectTableCreateInfoNVX* pCreateInfo, const VkAllocationCallbacks* pAllocator = DE_NULL);
diff --git a/external/vulkancts/framework/vulkan/vkRefUtilImpl.inl b/external/vulkancts/framework/vulkan/vkRefUtilImpl.inl
index dd75368..6eb0c48 100644
--- a/external/vulkancts/framework/vulkan/vkRefUtilImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkRefUtilImpl.inl
@@ -316,6 +316,13 @@
return Move<VkDescriptorUpdateTemplate>(check<VkDescriptorUpdateTemplate>(object), Deleter<VkDescriptorUpdateTemplate>(vk, device, pAllocator));
}
+Move<VkRenderPass> createRenderPass2 (const DeviceInterface& vk, VkDevice device, const VkRenderPassCreateInfo2* pCreateInfo, const VkAllocationCallbacks* pAllocator)
+{
+ VkRenderPass object = 0;
+ VK_CHECK(vk.createRenderPass2(device, pCreateInfo, pAllocator, &object));
+ return Move<VkRenderPass>(check<VkRenderPass>(object), Deleter<VkRenderPass>(vk, device, pAllocator));
+}
+
Move<VkSwapchainKHR> createSwapchainKHR (const DeviceInterface& vk, VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator)
{
VkSwapchainKHR object = 0;
@@ -337,13 +344,6 @@
return Move<VkSwapchainKHR>(check<VkSwapchainKHR>(object), Deleter<VkSwapchainKHR>(vk, device, pAllocator));
}
-Move<VkRenderPass> createRenderPass2KHR (const DeviceInterface& vk, VkDevice device, const VkRenderPassCreateInfo2KHR* pCreateInfo, const VkAllocationCallbacks* pAllocator)
-{
- VkRenderPass object = 0;
- VK_CHECK(vk.createRenderPass2KHR(device, pCreateInfo, pAllocator, &object));
- return Move<VkRenderPass>(check<VkRenderPass>(object), Deleter<VkRenderPass>(vk, device, pAllocator));
-}
-
Move<VkDebugReportCallbackEXT> createDebugReportCallbackEXT (const InstanceInterface& vk, VkInstance instance, const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator)
{
VkDebugReportCallbackEXT object = 0;
diff --git a/external/vulkancts/framework/vulkan/vkShaderProgram.hpp b/external/vulkancts/framework/vulkan/vkShaderProgram.hpp
index c5e6853..f0ec36c 100644
--- a/external/vulkancts/framework/vulkan/vkShaderProgram.hpp
+++ b/external/vulkancts/framework/vulkan/vkShaderProgram.hpp
@@ -50,17 +50,20 @@
deUint32 vulkanVersion;
SpirvVersion targetVersion;
deUint32 flags;
+ bool supports_VK_KHR_spirv_1_4;
- ShaderBuildOptions (deUint32 vulkanVersion_, SpirvVersion targetVersion_, deUint32 flags_)
+ ShaderBuildOptions (deUint32 vulkanVersion_, SpirvVersion targetVersion_, deUint32 flags_, bool allowSpirv14 = false)
: vulkanVersion (vulkanVersion_)
, targetVersion (targetVersion_)
, flags (flags_)
+ , supports_VK_KHR_spirv_1_4(allowSpirv14)
{}
ShaderBuildOptions (void)
: vulkanVersion (VK_MAKE_VERSION(1, 0, 0))
, targetVersion (SPIRV_VERSION_1_0)
, flags (0u)
+ , supports_VK_KHR_spirv_1_4 (false)
{}
SpirvValidatorOptions getSpirvValidatorOptions() const
@@ -80,7 +83,7 @@
rules = SpirvValidatorOptions::kRelaxedBlockLayout;
}
- return SpirvValidatorOptions(vulkanVersion, rules);
+ return SpirvValidatorOptions(vulkanVersion, rules, supports_VK_KHR_spirv_1_4);
}
};
diff --git a/external/vulkancts/framework/vulkan/vkShaderToSpirV.cpp b/external/vulkancts/framework/vulkan/vkShaderToSpirV.cpp
index e078263..ad74ff7 100644
--- a/external/vulkancts/framework/vulkan/vkShaderToSpirV.cpp
+++ b/external/vulkancts/framework/vulkan/vkShaderToSpirV.cpp
@@ -28,16 +28,14 @@
#include "deClock.h"
#include "qpDebugOut.h"
-#if defined(DEQP_HAVE_GLSLANG)
-# include "SPIRV/GlslangToSpv.h"
-# include "SPIRV/disassemble.h"
-# include "SPIRV/SPVRemapper.h"
-# include "SPIRV/doc.h"
-# include "glslang/Include/InfoSink.h"
-# include "glslang/Include/ShHandle.h"
-# include "glslang/MachineIndependent/localintermediate.h"
-# include "glslang/Public/ShaderLang.h"
-#endif
+#include "SPIRV/GlslangToSpv.h"
+#include "SPIRV/disassemble.h"
+#include "SPIRV/SPVRemapper.h"
+#include "SPIRV/doc.h"
+#include "glslang/Include/InfoSink.h"
+#include "glslang/Include/ShHandle.h"
+#include "glslang/MachineIndependent/localintermediate.h"
+#include "glslang/Public/ShaderLang.h"
namespace vk
{
@@ -45,8 +43,6 @@
using std::string;
using std::vector;
-#if defined(DEQP_HAVE_GLSLANG)
-
namespace
{
@@ -84,7 +80,7 @@
// Fail compilation if more members are added to TLimits or TBuiltInResource
struct LimitsSizeHelper_s { bool m0, m1, m2, m3, m4, m5, m6, m7, m8; };
-struct BuiltInResourceSizeHelper_s { int m[92]; LimitsSizeHelper_s l; };
+struct BuiltInResourceSizeHelper_s { int m[93]; LimitsSizeHelper_s l; };
DE_STATIC_ASSERT(sizeof(TLimits) == sizeof(LimitsSizeHelper_s));
DE_STATIC_ASSERT(sizeof(TBuiltInResource) == sizeof(BuiltInResourceSizeHelper_s));
@@ -198,6 +194,7 @@
builtin->maxTaskWorkGroupSizeY_NV = 1;
builtin->maxTaskWorkGroupSizeZ_NV = 1;
builtin->maxMeshViewCountNV = 4;
+ builtin->maxDualSourceDrawBuffersEXT = 1;
};
int getNumShaderStages (const std::vector<std::string>* sources)
@@ -291,6 +288,12 @@
case SPIRV_VERSION_1_3:
shader.setEnvTarget(glslang::EshTargetSpv, (glslang::EShTargetLanguageVersion)0x10300);
break;
+ case SPIRV_VERSION_1_4:
+ shader.setEnvTarget(glslang::EshTargetSpv, (glslang::EShTargetLanguageVersion)0x10400);
+ break;
+ case SPIRV_VERSION_1_5:
+ shader.setEnvTarget(glslang::EshTargetSpv, (glslang::EShTargetLanguageVersion)0x10500);
+ break;
default:
TCU_THROW(InternalError, "Unsupported SPIR-V target version");
}
@@ -361,23 +364,4 @@
remapper.remap(*dst, spv::spirvbin_base_t::STRIP);
}
-#else // defined(DEQP_HAVE_GLSLANG)
-
-bool compileGlslToSpirV (const GlslSource&, std::vector<deUint32>*, glu::ShaderProgramInfo*)
-{
- TCU_THROW(NotSupportedError, "GLSL to SPIR-V compilation not supported (DEQP_HAVE_GLSLANG not defined)");
-}
-
-bool compileHlslToSpirV (const HlslSource&, std::vector<deUint32>*, glu::ShaderProgramInfo*)
-{
- TCU_THROW(NotSupportedError, "HLSL to SPIR-V compilation not supported (DEQP_HAVE_GLSLANG not defined)");
-}
-
-void stripSpirVDebugInfo (const size_t, const deUint32*, std::vector<deUint32>*)
-{
- TCU_THROW(NotSupportedError, "SPIR-V stripping not supported (DEQP_HAVE_GLSLANG not defined)");
-}
-
-#endif // defined(DEQP_HAVE_GLSLANG)
-
} // vk
diff --git a/external/vulkancts/framework/vulkan/vkSpirVAsm.cpp b/external/vulkancts/framework/vulkan/vkSpirVAsm.cpp
index 28b84bd..bdcdc67 100644
--- a/external/vulkancts/framework/vulkan/vkSpirVAsm.cpp
+++ b/external/vulkancts/framework/vulkan/vkSpirVAsm.cpp
@@ -27,9 +27,7 @@
#include <algorithm>
-#if defined(DEQP_HAVE_SPIRV_TOOLS)
-# include "spirv-tools/libspirv.h"
-#endif
+#include "spirv-tools/libspirv.h"
namespace vk
{
@@ -37,15 +35,17 @@
using std::string;
using std::vector;
-#if defined(DEQP_HAVE_SPIRV_TOOLS)
-
-// Convert a Vulkan version number to a SPIRV-Tools target environment enum.
-static spv_target_env mapVulkanVersionToSpirvToolsEnv(deUint32 vulkanVersion)
+// Returns the SPIRV-Tools target environment enum for the given dEQP Spirv validator options object.
+// Do this here instead of as a method on SpirvValidatorOptions because only this file has access to
+// the SPIRV-Tools headers.
+static spv_target_env getSpirvToolsEnvForValidatorOptions(SpirvValidatorOptions opts)
{
- switch (vulkanVersion)
+ const bool allow_1_4 = opts.supports_VK_KHR_spirv_1_4;
+ switch (opts.vulkanVersion)
{
case VK_MAKE_VERSION(1, 0, 0): return SPV_ENV_VULKAN_1_0;
- case VK_MAKE_VERSION(1, 1, 0): return SPV_ENV_VULKAN_1_1;
+ case VK_MAKE_VERSION(1, 1, 0): return allow_1_4 ? SPV_ENV_VULKAN_1_1_SPIRV_1_4 : SPV_ENV_VULKAN_1_1;
+ case VK_MAKE_VERSION(1, 2, 0): return SPV_ENV_VULKAN_1_2;
default:
break;
}
@@ -63,6 +63,8 @@
case SPIRV_VERSION_1_1: result = SPV_ENV_UNIVERSAL_1_1; break; //!< SPIR-V 1.1
case SPIRV_VERSION_1_2: result = SPV_ENV_UNIVERSAL_1_2; break; //!< SPIR-V 1.2
case SPIRV_VERSION_1_3: result = SPV_ENV_UNIVERSAL_1_3; break; //!< SPIR-V 1.3
+ case SPIRV_VERSION_1_4: result = SPV_ENV_UNIVERSAL_1_4; break; //!< SPIR-V 1.4
+ case SPIRV_VERSION_1_5: result = SPV_ENV_UNIVERSAL_1_5; break; //!< SPIR-V 1.5
default: TCU_THROW(InternalError, "Unknown SPIR-V version");
}
@@ -147,7 +149,7 @@
bool validateSpirV (size_t binarySizeInWords, const deUint32* binary, std::ostream* infoLog, const SpirvValidatorOptions &val_options)
{
- const spv_context context = spvContextCreate(mapVulkanVersionToSpirvToolsEnv(val_options.vulkanVersion));
+ const spv_context context = spvContextCreate(getSpirvToolsEnvForValidatorOptions(val_options));
spv_diagnostic diagnostic = DE_NULL;
spv_validator_options options = DE_NULL;
spv_text disasmText = DE_NULL;
@@ -223,23 +225,4 @@
}
}
-#else // defined(DEQP_HAVE_SPIRV_TOOLS)
-
-bool assembleSpirV (const SpirVAsmSource*, std::vector<deUint32>*, SpirVProgramInfo*, SpirvVersion)
-{
- TCU_THROW(NotSupportedError, "SPIR-V assembly not supported (DEQP_HAVE_SPIRV_TOOLS not defined)");
-}
-
-void disassembleSpirV (size_t, const deUint32*, std::ostream*, SpirvVersion)
-{
- TCU_THROW(NotSupportedError, "SPIR-V disassembling not supported (DEQP_HAVE_SPIRV_TOOLS not defined)");
-}
-
-bool validateSpirV (size_t, const deUint32*, std::ostream*, const SpirvValidatorOptions&)
-{
- TCU_THROW(NotSupportedError, "SPIR-V validation not supported (DEQP_HAVE_SPIRV_TOOLS not defined)");
-}
-
-#endif
-
} // vk
diff --git a/external/vulkancts/framework/vulkan/vkSpirVProgram.hpp b/external/vulkancts/framework/vulkan/vkSpirVProgram.hpp
index 6f9d449..5cc2197 100644
--- a/external/vulkancts/framework/vulkan/vkSpirVProgram.hpp
+++ b/external/vulkancts/framework/vulkan/vkSpirVProgram.hpp
@@ -39,22 +39,27 @@
struct SpirVAsmBuildOptions
{
- deUint32 vulkanVersion;
+ deUint32 vulkanVersion;
SpirvVersion targetVersion;
+ bool supports_VK_KHR_spirv_1_4;
- SpirVAsmBuildOptions (deUint32 vulkanVersion_, SpirvVersion targetVersion_)
- : vulkanVersion (vulkanVersion_)
- , targetVersion (targetVersion_)
+ SpirVAsmBuildOptions (deUint32 vulkanVersion_, SpirvVersion targetVersion_, bool allowSpirv14 = false)
+ : vulkanVersion (vulkanVersion_)
+ , targetVersion (targetVersion_)
+ , supports_VK_KHR_spirv_1_4 (allowSpirv14)
{}
SpirVAsmBuildOptions (void)
- : vulkanVersion (VK_MAKE_VERSION(1, 0, 0))
- , targetVersion (SPIRV_VERSION_1_0)
+ : vulkanVersion (VK_MAKE_VERSION(1, 0, 0))
+ , targetVersion (SPIRV_VERSION_1_0)
+ , supports_VK_KHR_spirv_1_4 (false)
{}
SpirvValidatorOptions getSpirvValidatorOptions() const
{
- return SpirvValidatorOptions(vulkanVersion);
+ SpirvValidatorOptions result(vulkanVersion);
+ result.supports_VK_KHR_spirv_1_4 = supports_VK_KHR_spirv_1_4;
+ return result;
}
};
diff --git a/external/vulkancts/framework/vulkan/vkStrUtil.inl b/external/vulkancts/framework/vulkan/vkStrUtil.inl
index 3bb3e99..c6f7bbb 100644
--- a/external/vulkancts/framework/vulkan/vkStrUtil.inl
+++ b/external/vulkancts/framework/vulkan/vkStrUtil.inl
@@ -44,11 +44,16 @@
const char* getSamplerYcbcrRangeName (VkSamplerYcbcrRange value);
const char* getChromaLocationName (VkChromaLocation value);
const char* getDescriptorUpdateTemplateTypeName (VkDescriptorUpdateTemplateType value);
+const char* getDriverIdName (VkDriverId value);
+const char* getShaderFloatControlsIndependenceName (VkShaderFloatControlsIndependence value);
+const char* getSamplerReductionModeName (VkSamplerReductionMode value);
+const char* getSemaphoreTypeName (VkSemaphoreType value);
const char* getColorSpaceKHRName (VkColorSpaceKHR value);
const char* getPresentModeKHRName (VkPresentModeKHR value);
-const char* getDriverIdKHRName (VkDriverIdKHR value);
+const char* getPerformanceCounterUnitKHRName (VkPerformanceCounterUnitKHR value);
+const char* getPerformanceCounterScopeKHRName (VkPerformanceCounterScopeKHR value);
+const char* getPerformanceCounterStorageKHRName (VkPerformanceCounterStorageKHR value);
const char* getPipelineExecutableStatisticFormatKHRName (VkPipelineExecutableStatisticFormatKHR value);
-const char* getSemaphoreTypeKHRName (VkSemaphoreTypeKHR value);
const char* getDebugReportObjectTypeEXTName (VkDebugReportObjectTypeEXT value);
const char* getRasterizationOrderAMDName (VkRasterizationOrderAMD value);
const char* getShaderInfoTypeAMDName (VkShaderInfoTypeAMD value);
@@ -61,25 +66,30 @@
const char* getViewportCoordinateSwizzleNVName (VkViewportCoordinateSwizzleNV value);
const char* getDiscardRectangleModeEXTName (VkDiscardRectangleModeEXT value);
const char* getConservativeRasterizationModeEXTName (VkConservativeRasterizationModeEXT value);
-const char* getSamplerReductionModeEXTName (VkSamplerReductionModeEXT value);
const char* getBlendOverlapEXTName (VkBlendOverlapEXT value);
const char* getCoverageModulationModeNVName (VkCoverageModulationModeNV value);
const char* getValidationCacheHeaderVersionEXTName (VkValidationCacheHeaderVersionEXT value);
const char* getShadingRatePaletteEntryNVName (VkShadingRatePaletteEntryNV value);
const char* getCoarseSampleOrderTypeNVName (VkCoarseSampleOrderTypeNV value);
+const char* getAccelerationStructureTypeNVName (VkAccelerationStructureTypeNV value);
const char* getRayTracingShaderGroupTypeNVName (VkRayTracingShaderGroupTypeNV value);
const char* getGeometryTypeNVName (VkGeometryTypeNV value);
-const char* getAccelerationStructureTypeNVName (VkAccelerationStructureTypeNV value);
const char* getCopyAccelerationStructureModeNVName (VkCopyAccelerationStructureModeNV value);
const char* getAccelerationStructureMemoryRequirementsTypeNVName (VkAccelerationStructureMemoryRequirementsTypeNV value);
const char* getQueueGlobalPriorityEXTName (VkQueueGlobalPriorityEXT value);
const char* getTimeDomainEXTName (VkTimeDomainEXT value);
const char* getMemoryOverallocationBehaviorAMDName (VkMemoryOverallocationBehaviorAMD value);
+const char* getPerformanceConfigurationTypeINTELName (VkPerformanceConfigurationTypeINTEL value);
+const char* getQueryPoolSamplingModeINTELName (VkQueryPoolSamplingModeINTEL value);
+const char* getPerformanceOverrideTypeINTELName (VkPerformanceOverrideTypeINTEL value);
+const char* getPerformanceParameterTypeINTELName (VkPerformanceParameterTypeINTEL value);
+const char* getPerformanceValueTypeINTELName (VkPerformanceValueTypeINTEL value);
const char* getValidationFeatureEnableEXTName (VkValidationFeatureEnableEXT value);
const char* getValidationFeatureDisableEXTName (VkValidationFeatureDisableEXT value);
const char* getComponentTypeNVName (VkComponentTypeNV value);
const char* getScopeNVName (VkScopeNV value);
const char* getCoverageReductionModeNVName (VkCoverageReductionModeNV value);
+const char* getLineRasterizationModeEXTName (VkLineRasterizationModeEXT value);
const char* getFullScreenExclusiveEXTName (VkFullScreenExclusiveEXT value);
inline tcu::Format::Enum<VkPipelineCacheHeaderVersion> getPipelineCacheHeaderVersionStr (VkPipelineCacheHeaderVersion value) { return tcu::Format::Enum<VkPipelineCacheHeaderVersion>(getPipelineCacheHeaderVersionName, value); }
@@ -125,11 +135,16 @@
inline tcu::Format::Enum<VkSamplerYcbcrRange> getSamplerYcbcrRangeStr (VkSamplerYcbcrRange value) { return tcu::Format::Enum<VkSamplerYcbcrRange>(getSamplerYcbcrRangeName, value); }
inline tcu::Format::Enum<VkChromaLocation> getChromaLocationStr (VkChromaLocation value) { return tcu::Format::Enum<VkChromaLocation>(getChromaLocationName, value); }
inline tcu::Format::Enum<VkDescriptorUpdateTemplateType> getDescriptorUpdateTemplateTypeStr (VkDescriptorUpdateTemplateType value) { return tcu::Format::Enum<VkDescriptorUpdateTemplateType>(getDescriptorUpdateTemplateTypeName, value); }
+inline tcu::Format::Enum<VkDriverId> getDriverIdStr (VkDriverId value) { return tcu::Format::Enum<VkDriverId>(getDriverIdName, value); }
+inline tcu::Format::Enum<VkShaderFloatControlsIndependence> getShaderFloatControlsIndependenceStr (VkShaderFloatControlsIndependence value) { return tcu::Format::Enum<VkShaderFloatControlsIndependence>(getShaderFloatControlsIndependenceName, value); }
+inline tcu::Format::Enum<VkSamplerReductionMode> getSamplerReductionModeStr (VkSamplerReductionMode value) { return tcu::Format::Enum<VkSamplerReductionMode>(getSamplerReductionModeName, value); }
+inline tcu::Format::Enum<VkSemaphoreType> getSemaphoreTypeStr (VkSemaphoreType value) { return tcu::Format::Enum<VkSemaphoreType>(getSemaphoreTypeName, value); }
inline tcu::Format::Enum<VkColorSpaceKHR> getColorSpaceKHRStr (VkColorSpaceKHR value) { return tcu::Format::Enum<VkColorSpaceKHR>(getColorSpaceKHRName, value); }
inline tcu::Format::Enum<VkPresentModeKHR> getPresentModeKHRStr (VkPresentModeKHR value) { return tcu::Format::Enum<VkPresentModeKHR>(getPresentModeKHRName, value); }
-inline tcu::Format::Enum<VkDriverIdKHR> getDriverIdKHRStr (VkDriverIdKHR value) { return tcu::Format::Enum<VkDriverIdKHR>(getDriverIdKHRName, value); }
+inline tcu::Format::Enum<VkPerformanceCounterUnitKHR> getPerformanceCounterUnitKHRStr (VkPerformanceCounterUnitKHR value) { return tcu::Format::Enum<VkPerformanceCounterUnitKHR>(getPerformanceCounterUnitKHRName, value); }
+inline tcu::Format::Enum<VkPerformanceCounterScopeKHR> getPerformanceCounterScopeKHRStr (VkPerformanceCounterScopeKHR value) { return tcu::Format::Enum<VkPerformanceCounterScopeKHR>(getPerformanceCounterScopeKHRName, value); }
+inline tcu::Format::Enum<VkPerformanceCounterStorageKHR> getPerformanceCounterStorageKHRStr (VkPerformanceCounterStorageKHR value) { return tcu::Format::Enum<VkPerformanceCounterStorageKHR>(getPerformanceCounterStorageKHRName, value); }
inline tcu::Format::Enum<VkPipelineExecutableStatisticFormatKHR> getPipelineExecutableStatisticFormatKHRStr (VkPipelineExecutableStatisticFormatKHR value) { return tcu::Format::Enum<VkPipelineExecutableStatisticFormatKHR>(getPipelineExecutableStatisticFormatKHRName, value); }
-inline tcu::Format::Enum<VkSemaphoreTypeKHR> getSemaphoreTypeKHRStr (VkSemaphoreTypeKHR value) { return tcu::Format::Enum<VkSemaphoreTypeKHR>(getSemaphoreTypeKHRName, value); }
inline tcu::Format::Enum<VkDebugReportObjectTypeEXT> getDebugReportObjectTypeEXTStr (VkDebugReportObjectTypeEXT value) { return tcu::Format::Enum<VkDebugReportObjectTypeEXT>(getDebugReportObjectTypeEXTName, value); }
inline tcu::Format::Enum<VkRasterizationOrderAMD> getRasterizationOrderAMDStr (VkRasterizationOrderAMD value) { return tcu::Format::Enum<VkRasterizationOrderAMD>(getRasterizationOrderAMDName, value); }
inline tcu::Format::Enum<VkShaderInfoTypeAMD> getShaderInfoTypeAMDStr (VkShaderInfoTypeAMD value) { return tcu::Format::Enum<VkShaderInfoTypeAMD>(getShaderInfoTypeAMDName, value); }
@@ -142,25 +157,30 @@
inline tcu::Format::Enum<VkViewportCoordinateSwizzleNV> getViewportCoordinateSwizzleNVStr (VkViewportCoordinateSwizzleNV value) { return tcu::Format::Enum<VkViewportCoordinateSwizzleNV>(getViewportCoordinateSwizzleNVName, value); }
inline tcu::Format::Enum<VkDiscardRectangleModeEXT> getDiscardRectangleModeEXTStr (VkDiscardRectangleModeEXT value) { return tcu::Format::Enum<VkDiscardRectangleModeEXT>(getDiscardRectangleModeEXTName, value); }
inline tcu::Format::Enum<VkConservativeRasterizationModeEXT> getConservativeRasterizationModeEXTStr (VkConservativeRasterizationModeEXT value) { return tcu::Format::Enum<VkConservativeRasterizationModeEXT>(getConservativeRasterizationModeEXTName, value); }
-inline tcu::Format::Enum<VkSamplerReductionModeEXT> getSamplerReductionModeEXTStr (VkSamplerReductionModeEXT value) { return tcu::Format::Enum<VkSamplerReductionModeEXT>(getSamplerReductionModeEXTName, value); }
inline tcu::Format::Enum<VkBlendOverlapEXT> getBlendOverlapEXTStr (VkBlendOverlapEXT value) { return tcu::Format::Enum<VkBlendOverlapEXT>(getBlendOverlapEXTName, value); }
inline tcu::Format::Enum<VkCoverageModulationModeNV> getCoverageModulationModeNVStr (VkCoverageModulationModeNV value) { return tcu::Format::Enum<VkCoverageModulationModeNV>(getCoverageModulationModeNVName, value); }
inline tcu::Format::Enum<VkValidationCacheHeaderVersionEXT> getValidationCacheHeaderVersionEXTStr (VkValidationCacheHeaderVersionEXT value) { return tcu::Format::Enum<VkValidationCacheHeaderVersionEXT>(getValidationCacheHeaderVersionEXTName, value); }
inline tcu::Format::Enum<VkShadingRatePaletteEntryNV> getShadingRatePaletteEntryNVStr (VkShadingRatePaletteEntryNV value) { return tcu::Format::Enum<VkShadingRatePaletteEntryNV>(getShadingRatePaletteEntryNVName, value); }
inline tcu::Format::Enum<VkCoarseSampleOrderTypeNV> getCoarseSampleOrderTypeNVStr (VkCoarseSampleOrderTypeNV value) { return tcu::Format::Enum<VkCoarseSampleOrderTypeNV>(getCoarseSampleOrderTypeNVName, value); }
+inline tcu::Format::Enum<VkAccelerationStructureTypeNV> getAccelerationStructureTypeNVStr (VkAccelerationStructureTypeNV value) { return tcu::Format::Enum<VkAccelerationStructureTypeNV>(getAccelerationStructureTypeNVName, value); }
inline tcu::Format::Enum<VkRayTracingShaderGroupTypeNV> getRayTracingShaderGroupTypeNVStr (VkRayTracingShaderGroupTypeNV value) { return tcu::Format::Enum<VkRayTracingShaderGroupTypeNV>(getRayTracingShaderGroupTypeNVName, value); }
inline tcu::Format::Enum<VkGeometryTypeNV> getGeometryTypeNVStr (VkGeometryTypeNV value) { return tcu::Format::Enum<VkGeometryTypeNV>(getGeometryTypeNVName, value); }
-inline tcu::Format::Enum<VkAccelerationStructureTypeNV> getAccelerationStructureTypeNVStr (VkAccelerationStructureTypeNV value) { return tcu::Format::Enum<VkAccelerationStructureTypeNV>(getAccelerationStructureTypeNVName, value); }
inline tcu::Format::Enum<VkCopyAccelerationStructureModeNV> getCopyAccelerationStructureModeNVStr (VkCopyAccelerationStructureModeNV value) { return tcu::Format::Enum<VkCopyAccelerationStructureModeNV>(getCopyAccelerationStructureModeNVName, value); }
inline tcu::Format::Enum<VkAccelerationStructureMemoryRequirementsTypeNV> getAccelerationStructureMemoryRequirementsTypeNVStr (VkAccelerationStructureMemoryRequirementsTypeNV value) { return tcu::Format::Enum<VkAccelerationStructureMemoryRequirementsTypeNV>(getAccelerationStructureMemoryRequirementsTypeNVName, value); }
inline tcu::Format::Enum<VkQueueGlobalPriorityEXT> getQueueGlobalPriorityEXTStr (VkQueueGlobalPriorityEXT value) { return tcu::Format::Enum<VkQueueGlobalPriorityEXT>(getQueueGlobalPriorityEXTName, value); }
inline tcu::Format::Enum<VkTimeDomainEXT> getTimeDomainEXTStr (VkTimeDomainEXT value) { return tcu::Format::Enum<VkTimeDomainEXT>(getTimeDomainEXTName, value); }
inline tcu::Format::Enum<VkMemoryOverallocationBehaviorAMD> getMemoryOverallocationBehaviorAMDStr (VkMemoryOverallocationBehaviorAMD value) { return tcu::Format::Enum<VkMemoryOverallocationBehaviorAMD>(getMemoryOverallocationBehaviorAMDName, value); }
+inline tcu::Format::Enum<VkPerformanceConfigurationTypeINTEL> getPerformanceConfigurationTypeINTELStr (VkPerformanceConfigurationTypeINTEL value) { return tcu::Format::Enum<VkPerformanceConfigurationTypeINTEL>(getPerformanceConfigurationTypeINTELName, value); }
+inline tcu::Format::Enum<VkQueryPoolSamplingModeINTEL> getQueryPoolSamplingModeINTELStr (VkQueryPoolSamplingModeINTEL value) { return tcu::Format::Enum<VkQueryPoolSamplingModeINTEL>(getQueryPoolSamplingModeINTELName, value); }
+inline tcu::Format::Enum<VkPerformanceOverrideTypeINTEL> getPerformanceOverrideTypeINTELStr (VkPerformanceOverrideTypeINTEL value) { return tcu::Format::Enum<VkPerformanceOverrideTypeINTEL>(getPerformanceOverrideTypeINTELName, value); }
+inline tcu::Format::Enum<VkPerformanceParameterTypeINTEL> getPerformanceParameterTypeINTELStr (VkPerformanceParameterTypeINTEL value) { return tcu::Format::Enum<VkPerformanceParameterTypeINTEL>(getPerformanceParameterTypeINTELName, value); }
+inline tcu::Format::Enum<VkPerformanceValueTypeINTEL> getPerformanceValueTypeINTELStr (VkPerformanceValueTypeINTEL value) { return tcu::Format::Enum<VkPerformanceValueTypeINTEL>(getPerformanceValueTypeINTELName, value); }
inline tcu::Format::Enum<VkValidationFeatureEnableEXT> getValidationFeatureEnableEXTStr (VkValidationFeatureEnableEXT value) { return tcu::Format::Enum<VkValidationFeatureEnableEXT>(getValidationFeatureEnableEXTName, value); }
inline tcu::Format::Enum<VkValidationFeatureDisableEXT> getValidationFeatureDisableEXTStr (VkValidationFeatureDisableEXT value) { return tcu::Format::Enum<VkValidationFeatureDisableEXT>(getValidationFeatureDisableEXTName, value); }
inline tcu::Format::Enum<VkComponentTypeNV> getComponentTypeNVStr (VkComponentTypeNV value) { return tcu::Format::Enum<VkComponentTypeNV>(getComponentTypeNVName, value); }
inline tcu::Format::Enum<VkScopeNV> getScopeNVStr (VkScopeNV value) { return tcu::Format::Enum<VkScopeNV>(getScopeNVName, value); }
inline tcu::Format::Enum<VkCoverageReductionModeNV> getCoverageReductionModeNVStr (VkCoverageReductionModeNV value) { return tcu::Format::Enum<VkCoverageReductionModeNV>(getCoverageReductionModeNVName, value); }
+inline tcu::Format::Enum<VkLineRasterizationModeEXT> getLineRasterizationModeEXTStr (VkLineRasterizationModeEXT value) { return tcu::Format::Enum<VkLineRasterizationModeEXT>(getLineRasterizationModeEXTName, value); }
inline tcu::Format::Enum<VkFullScreenExclusiveEXT> getFullScreenExclusiveEXTStr (VkFullScreenExclusiveEXT value) { return tcu::Format::Enum<VkFullScreenExclusiveEXT>(getFullScreenExclusiveEXTName, value); }
inline std::ostream& operator<< (std::ostream& s, VkPipelineCacheHeaderVersion value) { return s << getPipelineCacheHeaderVersionStr(value); }
@@ -206,11 +226,16 @@
inline std::ostream& operator<< (std::ostream& s, VkSamplerYcbcrRange value) { return s << getSamplerYcbcrRangeStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkChromaLocation value) { return s << getChromaLocationStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkDescriptorUpdateTemplateType value) { return s << getDescriptorUpdateTemplateTypeStr(value); }
+inline std::ostream& operator<< (std::ostream& s, VkDriverId value) { return s << getDriverIdStr(value); }
+inline std::ostream& operator<< (std::ostream& s, VkShaderFloatControlsIndependence value) { return s << getShaderFloatControlsIndependenceStr(value); }
+inline std::ostream& operator<< (std::ostream& s, VkSamplerReductionMode value) { return s << getSamplerReductionModeStr(value); }
+inline std::ostream& operator<< (std::ostream& s, VkSemaphoreType value) { return s << getSemaphoreTypeStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkColorSpaceKHR value) { return s << getColorSpaceKHRStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkPresentModeKHR value) { return s << getPresentModeKHRStr(value); }
-inline std::ostream& operator<< (std::ostream& s, VkDriverIdKHR value) { return s << getDriverIdKHRStr(value); }
+inline std::ostream& operator<< (std::ostream& s, VkPerformanceCounterUnitKHR value) { return s << getPerformanceCounterUnitKHRStr(value); }
+inline std::ostream& operator<< (std::ostream& s, VkPerformanceCounterScopeKHR value) { return s << getPerformanceCounterScopeKHRStr(value); }
+inline std::ostream& operator<< (std::ostream& s, VkPerformanceCounterStorageKHR value) { return s << getPerformanceCounterStorageKHRStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkPipelineExecutableStatisticFormatKHR value) { return s << getPipelineExecutableStatisticFormatKHRStr(value); }
-inline std::ostream& operator<< (std::ostream& s, VkSemaphoreTypeKHR value) { return s << getSemaphoreTypeKHRStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkDebugReportObjectTypeEXT value) { return s << getDebugReportObjectTypeEXTStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkRasterizationOrderAMD value) { return s << getRasterizationOrderAMDStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkShaderInfoTypeAMD value) { return s << getShaderInfoTypeAMDStr(value); }
@@ -223,25 +248,30 @@
inline std::ostream& operator<< (std::ostream& s, VkViewportCoordinateSwizzleNV value) { return s << getViewportCoordinateSwizzleNVStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkDiscardRectangleModeEXT value) { return s << getDiscardRectangleModeEXTStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkConservativeRasterizationModeEXT value) { return s << getConservativeRasterizationModeEXTStr(value); }
-inline std::ostream& operator<< (std::ostream& s, VkSamplerReductionModeEXT value) { return s << getSamplerReductionModeEXTStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkBlendOverlapEXT value) { return s << getBlendOverlapEXTStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkCoverageModulationModeNV value) { return s << getCoverageModulationModeNVStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkValidationCacheHeaderVersionEXT value) { return s << getValidationCacheHeaderVersionEXTStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkShadingRatePaletteEntryNV value) { return s << getShadingRatePaletteEntryNVStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkCoarseSampleOrderTypeNV value) { return s << getCoarseSampleOrderTypeNVStr(value); }
+inline std::ostream& operator<< (std::ostream& s, VkAccelerationStructureTypeNV value) { return s << getAccelerationStructureTypeNVStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkRayTracingShaderGroupTypeNV value) { return s << getRayTracingShaderGroupTypeNVStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkGeometryTypeNV value) { return s << getGeometryTypeNVStr(value); }
-inline std::ostream& operator<< (std::ostream& s, VkAccelerationStructureTypeNV value) { return s << getAccelerationStructureTypeNVStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkCopyAccelerationStructureModeNV value) { return s << getCopyAccelerationStructureModeNVStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkAccelerationStructureMemoryRequirementsTypeNV value) { return s << getAccelerationStructureMemoryRequirementsTypeNVStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkQueueGlobalPriorityEXT value) { return s << getQueueGlobalPriorityEXTStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkTimeDomainEXT value) { return s << getTimeDomainEXTStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkMemoryOverallocationBehaviorAMD value) { return s << getMemoryOverallocationBehaviorAMDStr(value); }
+inline std::ostream& operator<< (std::ostream& s, VkPerformanceConfigurationTypeINTEL value) { return s << getPerformanceConfigurationTypeINTELStr(value); }
+inline std::ostream& operator<< (std::ostream& s, VkQueryPoolSamplingModeINTEL value) { return s << getQueryPoolSamplingModeINTELStr(value); }
+inline std::ostream& operator<< (std::ostream& s, VkPerformanceOverrideTypeINTEL value) { return s << getPerformanceOverrideTypeINTELStr(value); }
+inline std::ostream& operator<< (std::ostream& s, VkPerformanceParameterTypeINTEL value) { return s << getPerformanceParameterTypeINTELStr(value); }
+inline std::ostream& operator<< (std::ostream& s, VkPerformanceValueTypeINTEL value) { return s << getPerformanceValueTypeINTELStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkValidationFeatureEnableEXT value) { return s << getValidationFeatureEnableEXTStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkValidationFeatureDisableEXT value) { return s << getValidationFeatureDisableEXTStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkComponentTypeNV value) { return s << getComponentTypeNVStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkScopeNV value) { return s << getScopeNVStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkCoverageReductionModeNV value) { return s << getCoverageReductionModeNVStr(value); }
+inline std::ostream& operator<< (std::ostream& s, VkLineRasterizationModeEXT value) { return s << getLineRasterizationModeEXTStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkFullScreenExclusiveEXT value) { return s << getFullScreenExclusiveEXTStr(value); }
tcu::Format::Bitfield<32> getFormatFeatureFlagsStr (VkFormatFeatureFlags value);
@@ -262,7 +292,9 @@
tcu::Format::Bitfield<32> getBufferCreateFlagsStr (VkBufferCreateFlags value);
tcu::Format::Bitfield<32> getBufferUsageFlagsStr (VkBufferUsageFlags value);
tcu::Format::Bitfield<32> getImageViewCreateFlagsStr (VkImageViewCreateFlags value);
+tcu::Format::Bitfield<32> getShaderModuleCreateFlagsStr (VkShaderModuleCreateFlags value);
tcu::Format::Bitfield<32> getPipelineCreateFlagsStr (VkPipelineCreateFlags value);
+tcu::Format::Bitfield<32> getPipelineShaderStageCreateFlagsStr (VkPipelineShaderStageCreateFlags value);
tcu::Format::Bitfield<32> getShaderStageFlagsStr (VkShaderStageFlags value);
tcu::Format::Bitfield<32> getCullModeFlagsStr (VkCullModeFlags value);
tcu::Format::Bitfield<32> getColorComponentFlagsStr (VkColorComponentFlags value);
@@ -270,6 +302,7 @@
tcu::Format::Bitfield<32> getDescriptorSetLayoutCreateFlagsStr (VkDescriptorSetLayoutCreateFlags value);
tcu::Format::Bitfield<32> getDescriptorPoolCreateFlagsStr (VkDescriptorPoolCreateFlags value);
tcu::Format::Bitfield<32> getFramebufferCreateFlagsStr (VkFramebufferCreateFlags value);
+tcu::Format::Bitfield<32> getRenderPassCreateFlagsStr (VkRenderPassCreateFlags value);
tcu::Format::Bitfield<32> getAttachmentDescriptionFlagsStr (VkAttachmentDescriptionFlags value);
tcu::Format::Bitfield<32> getSubpassDescriptionFlagsStr (VkSubpassDescriptionFlags value);
tcu::Format::Bitfield<32> getAccessFlagsStr (VkAccessFlags value);
@@ -291,13 +324,16 @@
tcu::Format::Bitfield<32> getSemaphoreImportFlagsStr (VkSemaphoreImportFlags value);
tcu::Format::Bitfield<32> getExternalSemaphoreHandleTypeFlagsStr (VkExternalSemaphoreHandleTypeFlags value);
tcu::Format::Bitfield<32> getExternalSemaphoreFeatureFlagsStr (VkExternalSemaphoreFeatureFlags value);
+tcu::Format::Bitfield<32> getResolveModeFlagsStr (VkResolveModeFlags value);
+tcu::Format::Bitfield<32> getDescriptorBindingFlagsStr (VkDescriptorBindingFlags value);
+tcu::Format::Bitfield<32> getSemaphoreWaitFlagsStr (VkSemaphoreWaitFlags value);
tcu::Format::Bitfield<32> getSurfaceTransformFlagsKHRStr (VkSurfaceTransformFlagsKHR value);
tcu::Format::Bitfield<32> getCompositeAlphaFlagsKHRStr (VkCompositeAlphaFlagsKHR value);
tcu::Format::Bitfield<32> getSwapchainCreateFlagsKHRStr (VkSwapchainCreateFlagsKHR value);
tcu::Format::Bitfield<32> getDeviceGroupPresentModeFlagsKHRStr (VkDeviceGroupPresentModeFlagsKHR value);
tcu::Format::Bitfield<32> getDisplayPlaneAlphaFlagsKHRStr (VkDisplayPlaneAlphaFlagsKHR value);
-tcu::Format::Bitfield<32> getResolveModeFlagsKHRStr (VkResolveModeFlagsKHR value);
-tcu::Format::Bitfield<32> getSemaphoreWaitFlagsKHRStr (VkSemaphoreWaitFlagsKHR value);
+tcu::Format::Bitfield<32> getPerformanceCounterDescriptionFlagsKHRStr (VkPerformanceCounterDescriptionFlagsKHR value);
+tcu::Format::Bitfield<32> getAcquireProfilingLockFlagsKHRStr (VkAcquireProfilingLockFlagsKHR value);
tcu::Format::Bitfield<32> getDebugReportFlagsEXTStr (VkDebugReportFlagsEXT value);
tcu::Format::Bitfield<32> getExternalMemoryHandleTypeFlagsNVStr (VkExternalMemoryHandleTypeFlagsNV value);
tcu::Format::Bitfield<32> getExternalMemoryFeatureFlagsNVStr (VkExternalMemoryFeatureFlagsNV value);
@@ -307,11 +343,12 @@
tcu::Format::Bitfield<32> getSurfaceCounterFlagsEXTStr (VkSurfaceCounterFlagsEXT value);
tcu::Format::Bitfield<32> getDebugUtilsMessageSeverityFlagsEXTStr (VkDebugUtilsMessageSeverityFlagsEXT value);
tcu::Format::Bitfield<32> getDebugUtilsMessageTypeFlagsEXTStr (VkDebugUtilsMessageTypeFlagsEXT value);
-tcu::Format::Bitfield<32> getDescriptorBindingFlagsEXTStr (VkDescriptorBindingFlagsEXT value);
tcu::Format::Bitfield<32> getGeometryFlagsNVStr (VkGeometryFlagsNV value);
tcu::Format::Bitfield<32> getGeometryInstanceFlagsNVStr (VkGeometryInstanceFlagsNV value);
tcu::Format::Bitfield<32> getBuildAccelerationStructureFlagsNVStr (VkBuildAccelerationStructureFlagsNV value);
+tcu::Format::Bitfield<32> getPipelineCompilerControlFlagsAMDStr (VkPipelineCompilerControlFlagsAMD value);
tcu::Format::Bitfield<32> getPipelineCreationFeedbackFlagsEXTStr (VkPipelineCreationFeedbackFlagsEXT value);
+tcu::Format::Bitfield<32> getShaderCorePropertiesFlagsAMDStr (VkShaderCorePropertiesFlagsAMD value);
tcu::Format::Bitfield<32> getInstanceCreateFlagsStr (VkInstanceCreateFlags value);
tcu::Format::Bitfield<32> getDeviceCreateFlagsStr (VkDeviceCreateFlags value);
tcu::Format::Bitfield<32> getMemoryMapFlagsStr (VkMemoryMapFlags value);
@@ -319,9 +356,7 @@
tcu::Format::Bitfield<32> getEventCreateFlagsStr (VkEventCreateFlags value);
tcu::Format::Bitfield<32> getQueryPoolCreateFlagsStr (VkQueryPoolCreateFlags value);
tcu::Format::Bitfield<32> getBufferViewCreateFlagsStr (VkBufferViewCreateFlags value);
-tcu::Format::Bitfield<32> getShaderModuleCreateFlagsStr (VkShaderModuleCreateFlags value);
tcu::Format::Bitfield<32> getPipelineCacheCreateFlagsStr (VkPipelineCacheCreateFlags value);
-tcu::Format::Bitfield<32> getPipelineShaderStageCreateFlagsStr (VkPipelineShaderStageCreateFlags value);
tcu::Format::Bitfield<32> getPipelineVertexInputStateCreateFlagsStr (VkPipelineVertexInputStateCreateFlags value);
tcu::Format::Bitfield<32> getPipelineInputAssemblyStateCreateFlagsStr (VkPipelineInputAssemblyStateCreateFlags value);
tcu::Format::Bitfield<32> getPipelineTessellationStateCreateFlagsStr (VkPipelineTessellationStateCreateFlags value);
@@ -333,7 +368,6 @@
tcu::Format::Bitfield<32> getPipelineDynamicStateCreateFlagsStr (VkPipelineDynamicStateCreateFlags value);
tcu::Format::Bitfield<32> getPipelineLayoutCreateFlagsStr (VkPipelineLayoutCreateFlags value);
tcu::Format::Bitfield<32> getDescriptorPoolResetFlagsStr (VkDescriptorPoolResetFlags value);
-tcu::Format::Bitfield<32> getRenderPassCreateFlagsStr (VkRenderPassCreateFlags value);
tcu::Format::Bitfield<32> getCommandPoolTrimFlagsStr (VkCommandPoolTrimFlags value);
tcu::Format::Bitfield<32> getDescriptorUpdateTemplateCreateFlagsStr (VkDescriptorUpdateTemplateCreateFlags value);
tcu::Format::Bitfield<32> getDisplayModeCreateFlagsKHRStr (VkDisplayModeCreateFlagsKHR value);
@@ -539,6 +573,57 @@
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceMaintenance3Properties& value);
std::ostream& operator<< (std::ostream& s, const VkDescriptorSetLayoutSupport& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderDrawParametersFeatures& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceVulkan11Features& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceVulkan11Properties& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceVulkan12Features& value);
+std::ostream& operator<< (std::ostream& s, const VkConformanceVersion& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceVulkan12Properties& value);
+std::ostream& operator<< (std::ostream& s, const VkImageFormatListCreateInfo& value);
+std::ostream& operator<< (std::ostream& s, const VkAttachmentDescription2& value);
+std::ostream& operator<< (std::ostream& s, const VkAttachmentReference2& value);
+std::ostream& operator<< (std::ostream& s, const VkSubpassDescription2& value);
+std::ostream& operator<< (std::ostream& s, const VkSubpassDependency2& value);
+std::ostream& operator<< (std::ostream& s, const VkRenderPassCreateInfo2& value);
+std::ostream& operator<< (std::ostream& s, const VkSubpassBeginInfo& value);
+std::ostream& operator<< (std::ostream& s, const VkSubpassEndInfo& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDevice8BitStorageFeatures& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceDriverProperties& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderAtomicInt64Features& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderFloat16Int8Features& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceFloatControlsProperties& value);
+std::ostream& operator<< (std::ostream& s, const VkDescriptorSetLayoutBindingFlagsCreateInfo& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceDescriptorIndexingFeatures& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceDescriptorIndexingProperties& value);
+std::ostream& operator<< (std::ostream& s, const VkDescriptorSetVariableDescriptorCountAllocateInfo& value);
+std::ostream& operator<< (std::ostream& s, const VkDescriptorSetVariableDescriptorCountLayoutSupport& value);
+std::ostream& operator<< (std::ostream& s, const VkSubpassDescriptionDepthStencilResolve& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceDepthStencilResolveProperties& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceScalarBlockLayoutFeatures& value);
+std::ostream& operator<< (std::ostream& s, const VkImageStencilUsageCreateInfo& value);
+std::ostream& operator<< (std::ostream& s, const VkSamplerReductionModeCreateInfo& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceSamplerFilterMinmaxProperties& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceVulkanMemoryModelFeatures& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceImagelessFramebufferFeatures& value);
+std::ostream& operator<< (std::ostream& s, const VkFramebufferAttachmentImageInfo& value);
+std::ostream& operator<< (std::ostream& s, const VkFramebufferAttachmentsCreateInfo& value);
+std::ostream& operator<< (std::ostream& s, const VkRenderPassAttachmentBeginInfo& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceUniformBufferStandardLayoutFeatures& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures& value);
+std::ostream& operator<< (std::ostream& s, const VkAttachmentReferenceStencilLayout& value);
+std::ostream& operator<< (std::ostream& s, const VkAttachmentDescriptionStencilLayout& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceHostQueryResetFeatures& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceTimelineSemaphoreFeatures& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceTimelineSemaphoreProperties& value);
+std::ostream& operator<< (std::ostream& s, const VkSemaphoreTypeCreateInfo& value);
+std::ostream& operator<< (std::ostream& s, const VkTimelineSemaphoreSubmitInfo& value);
+std::ostream& operator<< (std::ostream& s, const VkSemaphoreWaitInfo& value);
+std::ostream& operator<< (std::ostream& s, const VkSemaphoreSignalInfo& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceBufferDeviceAddressFeatures& value);
+std::ostream& operator<< (std::ostream& s, const VkBufferDeviceAddressInfo& value);
+std::ostream& operator<< (std::ostream& s, const VkBufferOpaqueCaptureAddressCreateInfo& value);
+std::ostream& operator<< (std::ostream& s, const VkMemoryOpaqueCaptureAddressAllocateInfo& value);
+std::ostream& operator<< (std::ostream& s, const VkDeviceMemoryOpaqueCaptureAddressInfo& value);
std::ostream& operator<< (std::ostream& s, const VkSurfaceCapabilitiesKHR& value);
std::ostream& operator<< (std::ostream& s, const VkSurfaceFormatKHR& value);
std::ostream& operator<< (std::ostream& s, const VkSwapchainCreateInfoKHR& value);
@@ -563,24 +648,20 @@
std::ostream& operator<< (std::ostream& s, const VkImportSemaphoreFdInfoKHR& value);
std::ostream& operator<< (std::ostream& s, const VkSemaphoreGetFdInfoKHR& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDevicePushDescriptorPropertiesKHR& value);
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceFloat16Int8FeaturesKHR& value);
std::ostream& operator<< (std::ostream& s, const VkRectLayerKHR& value);
std::ostream& operator<< (std::ostream& s, const VkPresentRegionKHR& value);
std::ostream& operator<< (std::ostream& s, const VkPresentRegionsKHR& value);
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceImagelessFramebufferFeaturesKHR& value);
-std::ostream& operator<< (std::ostream& s, const VkFramebufferAttachmentImageInfoKHR& value);
-std::ostream& operator<< (std::ostream& s, const VkFramebufferAttachmentsCreateInfoKHR& value);
-std::ostream& operator<< (std::ostream& s, const VkRenderPassAttachmentBeginInfoKHR& value);
-std::ostream& operator<< (std::ostream& s, const VkAttachmentDescription2KHR& value);
-std::ostream& operator<< (std::ostream& s, const VkAttachmentReference2KHR& value);
-std::ostream& operator<< (std::ostream& s, const VkSubpassDescription2KHR& value);
-std::ostream& operator<< (std::ostream& s, const VkSubpassDependency2KHR& value);
-std::ostream& operator<< (std::ostream& s, const VkRenderPassCreateInfo2KHR& value);
-std::ostream& operator<< (std::ostream& s, const VkSubpassBeginInfoKHR& value);
-std::ostream& operator<< (std::ostream& s, const VkSubpassEndInfoKHR& value);
std::ostream& operator<< (std::ostream& s, const VkSharedPresentSurfaceCapabilitiesKHR& value);
std::ostream& operator<< (std::ostream& s, const VkImportFenceFdInfoKHR& value);
std::ostream& operator<< (std::ostream& s, const VkFenceGetFdInfoKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDevicePerformanceQueryFeaturesKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDevicePerformanceQueryPropertiesKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkPerformanceCounterKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkPerformanceCounterDescriptionKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkQueryPoolPerformanceCreateInfoKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkPerformanceCounterResultKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkAcquireProfilingLockInfoKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkPerformanceQuerySubmitInfoKHR& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceSurfaceInfo2KHR& value);
std::ostream& operator<< (std::ostream& s, const VkSurfaceCapabilities2KHR& value);
std::ostream& operator<< (std::ostream& s, const VkSurfaceFormat2KHR& value);
@@ -589,17 +670,7 @@
std::ostream& operator<< (std::ostream& s, const VkDisplayModeProperties2KHR& value);
std::ostream& operator<< (std::ostream& s, const VkDisplayPlaneInfo2KHR& value);
std::ostream& operator<< (std::ostream& s, const VkDisplayPlaneCapabilities2KHR& value);
-std::ostream& operator<< (std::ostream& s, const VkImageFormatListCreateInfoKHR& value);
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDevice8BitStorageFeaturesKHR& value);
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderAtomicInt64FeaturesKHR& value);
-std::ostream& operator<< (std::ostream& s, const VkConformanceVersionKHR& value);
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceDriverPropertiesKHR& value);
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceFloatControlsPropertiesKHR& value);
-std::ostream& operator<< (std::ostream& s, const VkSubpassDescriptionDepthStencilResolveKHR& value);
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceDepthStencilResolvePropertiesKHR& value);
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceVulkanMemoryModelFeaturesKHR& value);
std::ostream& operator<< (std::ostream& s, const VkSurfaceProtectedCapabilitiesKHR& value);
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR& value);
std::ostream& operator<< (std::ostream& s, const VkPipelineInfoKHR& value);
std::ostream& operator<< (std::ostream& s, const VkPipelineExecutablePropertiesKHR& value);
@@ -607,12 +678,6 @@
std::ostream& operator<< (std::ostream& s, const VkPipelineExecutableStatisticValueKHR& value);
std::ostream& operator<< (std::ostream& s, const VkPipelineExecutableStatisticKHR& value);
std::ostream& operator<< (std::ostream& s, const VkPipelineExecutableInternalRepresentationKHR& value);
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceTimelineSemaphoreFeaturesKHR& value);
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceTimelineSemaphorePropertiesKHR& value);
-std::ostream& operator<< (std::ostream& s, const VkSemaphoreTypeCreateInfoKHR& value);
-std::ostream& operator<< (std::ostream& s, const VkTimelineSemaphoreSubmitInfoKHR& value);
-std::ostream& operator<< (std::ostream& s, const VkSemaphoreWaitInfoKHR& value);
-std::ostream& operator<< (std::ostream& s, const VkSemaphoreSignalInfoKHR& value);
std::ostream& operator<< (std::ostream& s, const VkDebugReportCallbackCreateInfoEXT& value);
std::ostream& operator<< (std::ostream& s, const VkPipelineRasterizationStateRasterizationOrderAMD& value);
std::ostream& operator<< (std::ostream& s, const VkDebugMarkerObjectNameInfoEXT& value);
@@ -633,6 +698,7 @@
std::ostream& operator<< (std::ostream& s, const VkExternalMemoryImageCreateInfoNV& value);
std::ostream& operator<< (std::ostream& s, const VkExportMemoryAllocateInfoNV& value);
std::ostream& operator<< (std::ostream& s, const VkValidationFlagsEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT& value);
std::ostream& operator<< (std::ostream& s, const VkImageViewASTCDecodeModeEXT& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceASTCDecodeFeaturesEXT& value);
std::ostream& operator<< (std::ostream& s, const VkConditionalRenderingBeginInfoEXT& value);
@@ -679,8 +745,6 @@
std::ostream& operator<< (std::ostream& s, const VkDebugUtilsLabelEXT& value);
std::ostream& operator<< (std::ostream& s, const VkDebugUtilsMessengerCallbackDataEXT& value);
std::ostream& operator<< (std::ostream& s, const VkDebugUtilsMessengerCreateInfoEXT& value);
-std::ostream& operator<< (std::ostream& s, const VkSamplerReductionModeCreateInfoEXT& value);
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceInlineUniformBlockFeaturesEXT& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceInlineUniformBlockPropertiesEXT& value);
std::ostream& operator<< (std::ostream& s, const VkWriteDescriptorSetInlineUniformBlockEXT& value);
@@ -698,6 +762,8 @@
std::ostream& operator<< (std::ostream& s, const VkPipelineColorBlendAdvancedStateCreateInfoEXT& value);
std::ostream& operator<< (std::ostream& s, const VkPipelineCoverageToColorStateCreateInfoNV& value);
std::ostream& operator<< (std::ostream& s, const VkPipelineCoverageModulationStateCreateInfoNV& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderClockFeaturesKHR& value);
std::ostream& operator<< (std::ostream& s, const VkDrmFormatModifierPropertiesEXT& value);
std::ostream& operator<< (std::ostream& s, const VkDrmFormatModifierPropertiesListEXT& value);
@@ -707,11 +773,6 @@
std::ostream& operator<< (std::ostream& s, const VkImageDrmFormatModifierPropertiesEXT& value);
std::ostream& operator<< (std::ostream& s, const VkValidationCacheCreateInfoEXT& value);
std::ostream& operator<< (std::ostream& s, const VkShaderModuleValidationCacheCreateInfoEXT& value);
-std::ostream& operator<< (std::ostream& s, const VkDescriptorSetLayoutBindingFlagsCreateInfoEXT& value);
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceDescriptorIndexingFeaturesEXT& value);
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceDescriptorIndexingPropertiesEXT& value);
-std::ostream& operator<< (std::ostream& s, const VkDescriptorSetVariableDescriptorCountAllocateInfoEXT& value);
-std::ostream& operator<< (std::ostream& s, const VkDescriptorSetVariableDescriptorCountLayoutSupportEXT& value);
std::ostream& operator<< (std::ostream& s, const VkShadingRatePaletteNV& value);
std::ostream& operator<< (std::ostream& s, const VkPipelineViewportShadingRateImageStateCreateInfoNV& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShadingRateImageFeaturesNV& value);
@@ -739,6 +800,7 @@
std::ostream& operator<< (std::ostream& s, const VkImportMemoryHostPointerInfoEXT& value);
std::ostream& operator<< (std::ostream& s, const VkMemoryHostPointerPropertiesEXT& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceExternalMemoryHostPropertiesEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkPipelineCompilerControlCreateInfoAMD& value);
std::ostream& operator<< (std::ostream& s, const VkCalibratedTimestampInfoEXT& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderCorePropertiesAMD& value);
std::ostream& operator<< (std::ostream& s, const VkDeviceMemoryOverallocationCreateInfoAMD& value);
@@ -758,22 +820,32 @@
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceExclusiveScissorFeaturesNV& value);
std::ostream& operator<< (std::ostream& s, const VkQueueFamilyCheckpointPropertiesNV& value);
std::ostream& operator<< (std::ostream& s, const VkCheckpointDataNV& value);
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderIntegerFunctions2INTEL& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL& value);
+std::ostream& operator<< (std::ostream& s, const VkPerformanceValueDataINTEL& value);
+std::ostream& operator<< (std::ostream& s, const VkPerformanceValueINTEL& value);
+std::ostream& operator<< (std::ostream& s, const VkInitializePerformanceApiInfoINTEL& value);
+std::ostream& operator<< (std::ostream& s, const VkQueryPoolCreateInfoINTEL& value);
+std::ostream& operator<< (std::ostream& s, const VkPerformanceMarkerInfoINTEL& value);
+std::ostream& operator<< (std::ostream& s, const VkPerformanceStreamMarkerInfoINTEL& value);
+std::ostream& operator<< (std::ostream& s, const VkPerformanceOverrideInfoINTEL& value);
+std::ostream& operator<< (std::ostream& s, const VkPerformanceConfigurationAcquireInfoINTEL& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDevicePCIBusInfoPropertiesEXT& value);
std::ostream& operator<< (std::ostream& s, const VkDisplayNativeHdrSurfaceCapabilitiesAMD& value);
std::ostream& operator<< (std::ostream& s, const VkSwapchainDisplayNativeHdrCreateInfoAMD& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceFragmentDensityMapFeaturesEXT& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceFragmentDensityMapPropertiesEXT& value);
std::ostream& operator<< (std::ostream& s, const VkRenderPassFragmentDensityMapCreateInfoEXT& value);
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceScalarBlockLayoutFeaturesEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderCoreProperties2AMD& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceCoherentMemoryFeaturesAMD& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceMemoryBudgetPropertiesEXT& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceMemoryPriorityFeaturesEXT& value);
std::ostream& operator<< (std::ostream& s, const VkMemoryPriorityAllocateInfoEXT& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT& value);
-std::ostream& operator<< (std::ostream& s, const VkBufferDeviceAddressInfoEXT& value);
std::ostream& operator<< (std::ostream& s, const VkBufferDeviceAddressCreateInfoEXT& value);
-std::ostream& operator<< (std::ostream& s, const VkImageStencilUsageCreateInfoEXT& value);
std::ostream& operator<< (std::ostream& s, const VkValidationFeaturesEXT& value);
std::ostream& operator<< (std::ostream& s, const VkCooperativeMatrixPropertiesNV& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceCooperativeMatrixFeaturesNV& value);
@@ -784,9 +856,13 @@
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT& value);
std::ostream& operator<< (std::ostream& s, const VkHeadlessSurfaceCreateInfoEXT& value);
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceHostQueryResetFeaturesEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceLineRasterizationFeaturesEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceLineRasterizationPropertiesEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkPipelineRasterizationLineStateCreateInfoEXT& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceIndexTypeUint8FeaturesEXT& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT& 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 VkAndroidSurfaceCreateInfoKHR& value);
std::ostream& operator<< (std::ostream& s, const VkAndroidHardwareBufferUsageANDROID& value);
std::ostream& operator<< (std::ostream& s, const VkAndroidHardwareBufferPropertiesANDROID& value);
diff --git a/external/vulkancts/framework/vulkan/vkStrUtilImpl.inl b/external/vulkancts/framework/vulkan/vkStrUtilImpl.inl
index 288684e..618482b 100644
--- a/external/vulkancts/framework/vulkan/vkStrUtilImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkStrUtilImpl.inl
@@ -1,43 +1,44 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*/
-template<> const char* getTypeName<VkInstance> (void) { return "VkInstance"; }
-template<> const char* getTypeName<VkPhysicalDevice> (void) { return "VkPhysicalDevice"; }
-template<> const char* getTypeName<VkDevice> (void) { return "VkDevice"; }
-template<> const char* getTypeName<VkQueue> (void) { return "VkQueue"; }
-template<> const char* getTypeName<VkSemaphore> (void) { return "VkSemaphore"; }
-template<> const char* getTypeName<VkCommandBuffer> (void) { return "VkCommandBuffer"; }
-template<> const char* getTypeName<VkFence> (void) { return "VkFence"; }
-template<> const char* getTypeName<VkDeviceMemory> (void) { return "VkDeviceMemory"; }
-template<> const char* getTypeName<VkBuffer> (void) { return "VkBuffer"; }
-template<> const char* getTypeName<VkImage> (void) { return "VkImage"; }
-template<> const char* getTypeName<VkEvent> (void) { return "VkEvent"; }
-template<> const char* getTypeName<VkQueryPool> (void) { return "VkQueryPool"; }
-template<> const char* getTypeName<VkBufferView> (void) { return "VkBufferView"; }
-template<> const char* getTypeName<VkImageView> (void) { return "VkImageView"; }
-template<> const char* getTypeName<VkShaderModule> (void) { return "VkShaderModule"; }
-template<> const char* getTypeName<VkPipelineCache> (void) { return "VkPipelineCache"; }
-template<> const char* getTypeName<VkPipelineLayout> (void) { return "VkPipelineLayout"; }
-template<> const char* getTypeName<VkRenderPass> (void) { return "VkRenderPass"; }
-template<> const char* getTypeName<VkPipeline> (void) { return "VkPipeline"; }
-template<> const char* getTypeName<VkDescriptorSetLayout> (void) { return "VkDescriptorSetLayout"; }
-template<> const char* getTypeName<VkSampler> (void) { return "VkSampler"; }
-template<> const char* getTypeName<VkDescriptorPool> (void) { return "VkDescriptorPool"; }
-template<> const char* getTypeName<VkDescriptorSet> (void) { return "VkDescriptorSet"; }
-template<> const char* getTypeName<VkFramebuffer> (void) { return "VkFramebuffer"; }
-template<> const char* getTypeName<VkCommandPool> (void) { return "VkCommandPool"; }
-template<> const char* getTypeName<VkSamplerYcbcrConversion> (void) { return "VkSamplerYcbcrConversion"; }
-template<> const char* getTypeName<VkDescriptorUpdateTemplate> (void) { return "VkDescriptorUpdateTemplate"; }
-template<> const char* getTypeName<VkSurfaceKHR> (void) { return "VkSurfaceKHR"; }
-template<> const char* getTypeName<VkSwapchainKHR> (void) { return "VkSwapchainKHR"; }
-template<> const char* getTypeName<VkDisplayKHR> (void) { return "VkDisplayKHR"; }
-template<> const char* getTypeName<VkDisplayModeKHR> (void) { return "VkDisplayModeKHR"; }
-template<> const char* getTypeName<VkDebugReportCallbackEXT> (void) { return "VkDebugReportCallbackEXT"; }
-template<> const char* getTypeName<VkObjectTableNVX> (void) { return "VkObjectTableNVX"; }
-template<> const char* getTypeName<VkIndirectCommandsLayoutNVX> (void) { return "VkIndirectCommandsLayoutNVX"; }
-template<> const char* getTypeName<VkDebugUtilsMessengerEXT> (void) { return "VkDebugUtilsMessengerEXT"; }
-template<> const char* getTypeName<VkValidationCacheEXT> (void) { return "VkValidationCacheEXT"; }
-template<> const char* getTypeName<VkAccelerationStructureNV> (void) { return "VkAccelerationStructureNV"; }
+template<> const char* getTypeName<VkInstance> (void) { return "VkInstance"; }
+template<> const char* getTypeName<VkPhysicalDevice> (void) { return "VkPhysicalDevice"; }
+template<> const char* getTypeName<VkDevice> (void) { return "VkDevice"; }
+template<> const char* getTypeName<VkQueue> (void) { return "VkQueue"; }
+template<> const char* getTypeName<VkSemaphore> (void) { return "VkSemaphore"; }
+template<> const char* getTypeName<VkCommandBuffer> (void) { return "VkCommandBuffer"; }
+template<> const char* getTypeName<VkFence> (void) { return "VkFence"; }
+template<> const char* getTypeName<VkDeviceMemory> (void) { return "VkDeviceMemory"; }
+template<> const char* getTypeName<VkBuffer> (void) { return "VkBuffer"; }
+template<> const char* getTypeName<VkImage> (void) { return "VkImage"; }
+template<> const char* getTypeName<VkEvent> (void) { return "VkEvent"; }
+template<> const char* getTypeName<VkQueryPool> (void) { return "VkQueryPool"; }
+template<> const char* getTypeName<VkBufferView> (void) { return "VkBufferView"; }
+template<> const char* getTypeName<VkImageView> (void) { return "VkImageView"; }
+template<> const char* getTypeName<VkShaderModule> (void) { return "VkShaderModule"; }
+template<> const char* getTypeName<VkPipelineCache> (void) { return "VkPipelineCache"; }
+template<> const char* getTypeName<VkPipelineLayout> (void) { return "VkPipelineLayout"; }
+template<> const char* getTypeName<VkRenderPass> (void) { return "VkRenderPass"; }
+template<> const char* getTypeName<VkPipeline> (void) { return "VkPipeline"; }
+template<> const char* getTypeName<VkDescriptorSetLayout> (void) { return "VkDescriptorSetLayout"; }
+template<> const char* getTypeName<VkSampler> (void) { return "VkSampler"; }
+template<> const char* getTypeName<VkDescriptorPool> (void) { return "VkDescriptorPool"; }
+template<> const char* getTypeName<VkDescriptorSet> (void) { return "VkDescriptorSet"; }
+template<> const char* getTypeName<VkFramebuffer> (void) { return "VkFramebuffer"; }
+template<> const char* getTypeName<VkCommandPool> (void) { return "VkCommandPool"; }
+template<> const char* getTypeName<VkSamplerYcbcrConversion> (void) { return "VkSamplerYcbcrConversion"; }
+template<> const char* getTypeName<VkDescriptorUpdateTemplate> (void) { return "VkDescriptorUpdateTemplate"; }
+template<> const char* getTypeName<VkSurfaceKHR> (void) { return "VkSurfaceKHR"; }
+template<> const char* getTypeName<VkSwapchainKHR> (void) { return "VkSwapchainKHR"; }
+template<> const char* getTypeName<VkDisplayKHR> (void) { return "VkDisplayKHR"; }
+template<> const char* getTypeName<VkDisplayModeKHR> (void) { return "VkDisplayModeKHR"; }
+template<> const char* getTypeName<VkDebugReportCallbackEXT> (void) { return "VkDebugReportCallbackEXT"; }
+template<> const char* getTypeName<VkObjectTableNVX> (void) { return "VkObjectTableNVX"; }
+template<> const char* getTypeName<VkIndirectCommandsLayoutNVX> (void) { return "VkIndirectCommandsLayoutNVX"; }
+template<> const char* getTypeName<VkDebugUtilsMessengerEXT> (void) { return "VkDebugUtilsMessengerEXT"; }
+template<> const char* getTypeName<VkValidationCacheEXT> (void) { return "VkValidationCacheEXT"; }
+template<> const char* getTypeName<VkAccelerationStructureNV> (void) { return "VkAccelerationStructureNV"; }
+template<> const char* getTypeName<VkPerformanceConfigurationINTEL> (void) { return "VkPerformanceConfigurationINTEL"; }
namespace pt
{
@@ -99,6 +100,8 @@
case VK_ERROR_FRAGMENTED_POOL: return "VK_ERROR_FRAGMENTED_POOL";
case VK_ERROR_OUT_OF_POOL_MEMORY: return "VK_ERROR_OUT_OF_POOL_MEMORY";
case VK_ERROR_INVALID_EXTERNAL_HANDLE: return "VK_ERROR_INVALID_EXTERNAL_HANDLE";
+ case VK_ERROR_FRAGMENTATION: return "VK_ERROR_FRAGMENTATION";
+ case VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS: return "VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS";
case VK_ERROR_SURFACE_LOST_KHR: return "VK_ERROR_SURFACE_LOST_KHR";
case VK_ERROR_NATIVE_WINDOW_IN_USE_KHR: return "VK_ERROR_NATIVE_WINDOW_IN_USE_KHR";
case VK_SUBOPTIMAL_KHR: return "VK_SUBOPTIMAL_KHR";
@@ -107,9 +110,7 @@
case VK_ERROR_VALIDATION_FAILED_EXT: return "VK_ERROR_VALIDATION_FAILED_EXT";
case VK_ERROR_INVALID_SHADER_NV: return "VK_ERROR_INVALID_SHADER_NV";
case VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT: return "VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT";
- case VK_ERROR_FRAGMENTATION_EXT: return "VK_ERROR_FRAGMENTATION_EXT";
case VK_ERROR_NOT_PERMITTED_EXT: return "VK_ERROR_NOT_PERMITTED_EXT";
- case VK_ERROR_INVALID_DEVICE_ADDRESS_EXT: return "VK_ERROR_INVALID_DEVICE_ADDRESS_EXT";
case VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT: return "VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT";
case VK_RESULT_MAX_ENUM: return "VK_RESULT_MAX_ENUM";
default: return DE_NULL;
@@ -234,6 +235,56 @@
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES";
case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT: return "VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES";
+ case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO: return "VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO";
+ case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2: return "VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2";
+ case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2: return "VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2";
+ case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2: return "VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2";
+ case VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2: return "VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2";
+ case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2: return "VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2";
+ case VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO: return "VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO";
+ case VK_STRUCTURE_TYPE_SUBPASS_END_INFO: return "VK_STRUCTURE_TYPE_SUBPASS_END_INFO";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES";
+ case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO: return "VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES";
+ case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO: return "VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO";
+ case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT: return "VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES";
+ case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE: return "VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES";
+ case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO: return "VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES";
+ case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO: return "VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES";
+ case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO: return "VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO";
+ case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO: return "VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO";
+ case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO: return "VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES";
+ case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT: return "VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT";
+ case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT: return "VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES";
+ case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO: return "VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO";
+ case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO: return "VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO";
+ case VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO: return "VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO";
+ case VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO: return "VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES";
+ case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO: return "VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO";
+ case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO: return "VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO";
+ case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO: return "VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO";
+ case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO: return "VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO";
case VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR: return "VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR";
case VK_STRUCTURE_TYPE_PRESENT_INFO_KHR: return "VK_STRUCTURE_TYPE_PRESENT_INFO_KHR";
case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR: return "VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR";
@@ -272,6 +323,7 @@
case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV: return "VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV";
case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT: return "VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT";
case VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN: return "VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT";
case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT: return "VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT";
case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR: return "VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR";
@@ -292,7 +344,6 @@
case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT: return "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT";
case VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT: return "VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT";
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR";
case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR: return "VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR";
case VK_STRUCTURE_TYPE_OBJECT_TABLE_CREATE_INFO_NVX: return "VK_STRUCTURE_TYPE_OBJECT_TABLE_CREATE_INFO_NVX";
case VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NVX: return "VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NVX";
@@ -316,23 +367,19 @@
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT";
case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT";
case VK_STRUCTURE_TYPE_HDR_METADATA_EXT: return "VK_STRUCTURE_TYPE_HDR_METADATA_EXT";
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR";
- case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR: return "VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR";
- case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR: return "VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR";
- case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO_KHR: return "VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO_KHR";
- case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR: return "VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR";
- case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR: return "VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR";
- case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR: return "VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR";
- case VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2_KHR: return "VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2_KHR";
- case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR: return "VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR";
- case VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO_KHR: return "VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO_KHR";
- case VK_STRUCTURE_TYPE_SUBPASS_END_INFO_KHR: return "VK_STRUCTURE_TYPE_SUBPASS_END_INFO_KHR";
case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR: return "VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR";
case VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR: return "VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR";
case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR: return "VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR";
case VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR: return "VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR";
case VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR: return "VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR";
case VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR: return "VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR";
+ case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR: return "VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR";
+ case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR: return "VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR";
+ case VK_STRUCTURE_TYPE_ACQUIRE_PROFILING_LOCK_INFO_KHR: return "VK_STRUCTURE_TYPE_ACQUIRE_PROFILING_LOCK_INFO_KHR";
+ case VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_KHR: return "VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_KHR";
+ case VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_DESCRIPTION_KHR: return "VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_DESCRIPTION_KHR";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR";
case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR: return "VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR";
case VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR: return "VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR";
@@ -354,8 +401,6 @@
case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID: return "VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID";
case VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID: return "VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID";
case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID: return "VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID";
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT";
- case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT";
case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT: return "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT";
@@ -365,12 +410,13 @@
case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT";
case VK_STRUCTURE_TYPE_MULTISAMPLE_PROPERTIES_EXT: return "VK_STRUCTURE_TYPE_MULTISAMPLE_PROPERTIES_EXT";
- case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR: return "VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT";
case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT";
case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV: return "VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV";
case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV: return "VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV";
case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT: return "VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT";
case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT: return "VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT";
@@ -379,11 +425,6 @@
case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT: return "VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT";
case VK_STRUCTURE_TYPE_VALIDATION_CACHE_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_VALIDATION_CACHE_CREATE_INFO_EXT";
case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT";
- case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT";
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT";
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT";
- case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT: return "VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT";
- case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT: return "VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT";
case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV: return "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV";
@@ -404,11 +445,9 @@
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT";
case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT: return "VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT";
case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT";
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR";
case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT: return "VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT";
case VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT: return "VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT";
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR";
case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD: return "VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR";
case VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT: return "VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT";
@@ -419,10 +458,6 @@
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT";
case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP: return "VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP";
case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT";
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR";
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR";
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR";
- case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE_KHR: return "VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE_KHR";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV";
@@ -432,14 +467,13 @@
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV";
case VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV: return "VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV";
case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV: return "VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV";
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR";
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR";
- case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR: return "VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR";
- case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR: return "VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR";
- case VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO_KHR: return "VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO_KHR";
- case VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO_KHR: return "VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO_KHR";
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS2_FEATURES_INTEL: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS2_FEATURES_INTEL";
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL";
+ case VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL: return "VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL";
+ case VK_STRUCTURE_TYPE_INITIALIZE_PERFORMANCE_API_INFO_INTEL: return "VK_STRUCTURE_TYPE_INITIALIZE_PERFORMANCE_API_INFO_INTEL";
+ case VK_STRUCTURE_TYPE_PERFORMANCE_MARKER_INFO_INTEL: return "VK_STRUCTURE_TYPE_PERFORMANCE_MARKER_INFO_INTEL";
+ case VK_STRUCTURE_TYPE_PERFORMANCE_STREAM_MARKER_INFO_INTEL: return "VK_STRUCTURE_TYPE_PERFORMANCE_STREAM_MARKER_INFO_INTEL";
+ case VK_STRUCTURE_TYPE_PERFORMANCE_OVERRIDE_INFO_INTEL: return "VK_STRUCTURE_TYPE_PERFORMANCE_OVERRIDE_INFO_INTEL";
+ case VK_STRUCTURE_TYPE_PERFORMANCE_CONFIGURATION_ACQUIRE_INFO_INTEL: return "VK_STRUCTURE_TYPE_PERFORMANCE_CONFIGURATION_ACQUIRE_INFO_INTEL";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT";
case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD: return "VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD";
case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD: return "VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD";
@@ -448,16 +482,18 @@
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT";
case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT";
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT";
+ case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT";
case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT: return "VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT";
case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR: return "VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT";
- case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT: return "VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT";
case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT";
- case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT";
case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT: return "VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV";
case VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_NV: return "VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_NV";
@@ -467,20 +503,23 @@
case VK_STRUCTURE_TYPE_FRAMEBUFFER_MIXED_SAMPLES_COMBINATION_NV: return "VK_STRUCTURE_TYPE_FRAMEBUFFER_MIXED_SAMPLES_COMBINATION_NV";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT";
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR";
case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT: return "VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT";
case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT: return "VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT";
case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT: return "VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT";
case VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT";
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT";
+ case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT";
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR";
case VK_STRUCTURE_TYPE_PIPELINE_INFO_KHR: return "VK_STRUCTURE_TYPE_PIPELINE_INFO_KHR";
case VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_PROPERTIES_KHR: return "VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_PROPERTIES_KHR";
case VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR: return "VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR";
case VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_STATISTIC_KHR: return "VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_STATISTIC_KHR";
case VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR: return "VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT";
+ 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_MAX_ENUM: return "VK_STRUCTURE_TYPE_MAX_ENUM";
default: return DE_NULL;
}
@@ -741,6 +780,20 @@
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_MAX_ENUM: return "VK_FORMAT_MAX_ENUM";
default: return DE_NULL;
}
@@ -792,7 +845,9 @@
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_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_NV: return "VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV";
+ case VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL: return "VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL";
case VK_QUERY_TYPE_MAX_ENUM: return "VK_QUERY_TYPE_MAX_ENUM";
default: return DE_NULL;
}
@@ -824,6 +879,10 @@
case VK_IMAGE_LAYOUT_PREINITIALIZED: return "VK_IMAGE_LAYOUT_PREINITIALIZED";
case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL: return "VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL";
case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL: return "VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL";
+ case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL: return "VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL";
+ case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL: return "VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL";
+ 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_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";
@@ -1086,6 +1145,7 @@
case VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV: return "VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV";
case VK_DYNAMIC_STATE_VIEWPORT_COARSE_SAMPLE_ORDER_NV: return "VK_DYNAMIC_STATE_VIEWPORT_COARSE_SAMPLE_ORDER_NV";
case VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV: return "VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV";
+ case VK_DYNAMIC_STATE_LINE_STIPPLE_EXT: return "VK_DYNAMIC_STATE_LINE_STIPPLE_EXT";
case VK_DYNAMIC_STATE_MAX_ENUM: return "VK_DYNAMIC_STATE_MAX_ENUM";
default: return DE_NULL;
}
@@ -1239,46 +1299,47 @@
{
switch (value)
{
- case VK_OBJECT_TYPE_UNKNOWN: return "VK_OBJECT_TYPE_UNKNOWN";
- case VK_OBJECT_TYPE_INSTANCE: return "VK_OBJECT_TYPE_INSTANCE";
- case VK_OBJECT_TYPE_PHYSICAL_DEVICE: return "VK_OBJECT_TYPE_PHYSICAL_DEVICE";
- case VK_OBJECT_TYPE_DEVICE: return "VK_OBJECT_TYPE_DEVICE";
- case VK_OBJECT_TYPE_QUEUE: return "VK_OBJECT_TYPE_QUEUE";
- case VK_OBJECT_TYPE_SEMAPHORE: return "VK_OBJECT_TYPE_SEMAPHORE";
- case VK_OBJECT_TYPE_COMMAND_BUFFER: return "VK_OBJECT_TYPE_COMMAND_BUFFER";
- case VK_OBJECT_TYPE_FENCE: return "VK_OBJECT_TYPE_FENCE";
- case VK_OBJECT_TYPE_DEVICE_MEMORY: return "VK_OBJECT_TYPE_DEVICE_MEMORY";
- case VK_OBJECT_TYPE_BUFFER: return "VK_OBJECT_TYPE_BUFFER";
- case VK_OBJECT_TYPE_IMAGE: return "VK_OBJECT_TYPE_IMAGE";
- case VK_OBJECT_TYPE_EVENT: return "VK_OBJECT_TYPE_EVENT";
- case VK_OBJECT_TYPE_QUERY_POOL: return "VK_OBJECT_TYPE_QUERY_POOL";
- case VK_OBJECT_TYPE_BUFFER_VIEW: return "VK_OBJECT_TYPE_BUFFER_VIEW";
- case VK_OBJECT_TYPE_IMAGE_VIEW: return "VK_OBJECT_TYPE_IMAGE_VIEW";
- case VK_OBJECT_TYPE_SHADER_MODULE: return "VK_OBJECT_TYPE_SHADER_MODULE";
- case VK_OBJECT_TYPE_PIPELINE_CACHE: return "VK_OBJECT_TYPE_PIPELINE_CACHE";
- case VK_OBJECT_TYPE_PIPELINE_LAYOUT: return "VK_OBJECT_TYPE_PIPELINE_LAYOUT";
- case VK_OBJECT_TYPE_RENDER_PASS: return "VK_OBJECT_TYPE_RENDER_PASS";
- case VK_OBJECT_TYPE_PIPELINE: return "VK_OBJECT_TYPE_PIPELINE";
- case VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT: return "VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT";
- case VK_OBJECT_TYPE_SAMPLER: return "VK_OBJECT_TYPE_SAMPLER";
- case VK_OBJECT_TYPE_DESCRIPTOR_POOL: return "VK_OBJECT_TYPE_DESCRIPTOR_POOL";
- case VK_OBJECT_TYPE_DESCRIPTOR_SET: return "VK_OBJECT_TYPE_DESCRIPTOR_SET";
- case VK_OBJECT_TYPE_FRAMEBUFFER: return "VK_OBJECT_TYPE_FRAMEBUFFER";
- case VK_OBJECT_TYPE_COMMAND_POOL: return "VK_OBJECT_TYPE_COMMAND_POOL";
- case VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION: return "VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION";
- case VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE: return "VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE";
- case VK_OBJECT_TYPE_SURFACE_KHR: return "VK_OBJECT_TYPE_SURFACE_KHR";
- case VK_OBJECT_TYPE_SWAPCHAIN_KHR: return "VK_OBJECT_TYPE_SWAPCHAIN_KHR";
- 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_OBJECT_TABLE_NVX: return "VK_OBJECT_TYPE_OBJECT_TABLE_NVX";
- case VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NVX: return "VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NVX";
- case VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT: return "VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT";
- case VK_OBJECT_TYPE_VALIDATION_CACHE_EXT: return "VK_OBJECT_TYPE_VALIDATION_CACHE_EXT";
- case VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV: return "VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV";
- case VK_OBJECT_TYPE_MAX_ENUM: return "VK_OBJECT_TYPE_MAX_ENUM";
- default: return DE_NULL;
+ case VK_OBJECT_TYPE_UNKNOWN: return "VK_OBJECT_TYPE_UNKNOWN";
+ case VK_OBJECT_TYPE_INSTANCE: return "VK_OBJECT_TYPE_INSTANCE";
+ case VK_OBJECT_TYPE_PHYSICAL_DEVICE: return "VK_OBJECT_TYPE_PHYSICAL_DEVICE";
+ case VK_OBJECT_TYPE_DEVICE: return "VK_OBJECT_TYPE_DEVICE";
+ case VK_OBJECT_TYPE_QUEUE: return "VK_OBJECT_TYPE_QUEUE";
+ case VK_OBJECT_TYPE_SEMAPHORE: return "VK_OBJECT_TYPE_SEMAPHORE";
+ case VK_OBJECT_TYPE_COMMAND_BUFFER: return "VK_OBJECT_TYPE_COMMAND_BUFFER";
+ case VK_OBJECT_TYPE_FENCE: return "VK_OBJECT_TYPE_FENCE";
+ case VK_OBJECT_TYPE_DEVICE_MEMORY: return "VK_OBJECT_TYPE_DEVICE_MEMORY";
+ case VK_OBJECT_TYPE_BUFFER: return "VK_OBJECT_TYPE_BUFFER";
+ case VK_OBJECT_TYPE_IMAGE: return "VK_OBJECT_TYPE_IMAGE";
+ case VK_OBJECT_TYPE_EVENT: return "VK_OBJECT_TYPE_EVENT";
+ case VK_OBJECT_TYPE_QUERY_POOL: return "VK_OBJECT_TYPE_QUERY_POOL";
+ case VK_OBJECT_TYPE_BUFFER_VIEW: return "VK_OBJECT_TYPE_BUFFER_VIEW";
+ case VK_OBJECT_TYPE_IMAGE_VIEW: return "VK_OBJECT_TYPE_IMAGE_VIEW";
+ case VK_OBJECT_TYPE_SHADER_MODULE: return "VK_OBJECT_TYPE_SHADER_MODULE";
+ case VK_OBJECT_TYPE_PIPELINE_CACHE: return "VK_OBJECT_TYPE_PIPELINE_CACHE";
+ case VK_OBJECT_TYPE_PIPELINE_LAYOUT: return "VK_OBJECT_TYPE_PIPELINE_LAYOUT";
+ case VK_OBJECT_TYPE_RENDER_PASS: return "VK_OBJECT_TYPE_RENDER_PASS";
+ case VK_OBJECT_TYPE_PIPELINE: return "VK_OBJECT_TYPE_PIPELINE";
+ case VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT: return "VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT";
+ case VK_OBJECT_TYPE_SAMPLER: return "VK_OBJECT_TYPE_SAMPLER";
+ case VK_OBJECT_TYPE_DESCRIPTOR_POOL: return "VK_OBJECT_TYPE_DESCRIPTOR_POOL";
+ case VK_OBJECT_TYPE_DESCRIPTOR_SET: return "VK_OBJECT_TYPE_DESCRIPTOR_SET";
+ case VK_OBJECT_TYPE_FRAMEBUFFER: return "VK_OBJECT_TYPE_FRAMEBUFFER";
+ case VK_OBJECT_TYPE_COMMAND_POOL: return "VK_OBJECT_TYPE_COMMAND_POOL";
+ case VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION: return "VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION";
+ case VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE: return "VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE";
+ case VK_OBJECT_TYPE_SURFACE_KHR: return "VK_OBJECT_TYPE_SURFACE_KHR";
+ case VK_OBJECT_TYPE_SWAPCHAIN_KHR: return "VK_OBJECT_TYPE_SWAPCHAIN_KHR";
+ 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_OBJECT_TABLE_NVX: return "VK_OBJECT_TYPE_OBJECT_TABLE_NVX";
+ case VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NVX: return "VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NVX";
+ case VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT: return "VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT";
+ case VK_OBJECT_TYPE_VALIDATION_CACHE_EXT: return "VK_OBJECT_TYPE_VALIDATION_CACHE_EXT";
+ case VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV: return "VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV";
+ case VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL: return "VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL";
+ case VK_OBJECT_TYPE_MAX_ENUM: return "VK_OBJECT_TYPE_MAX_ENUM";
+ default: return DE_NULL;
}
}
@@ -1363,6 +1424,62 @@
}
}
+const char* getDriverIdName (VkDriverId value)
+{
+ switch (value)
+ {
+ case VK_DRIVER_ID_AMD_PROPRIETARY: return "VK_DRIVER_ID_AMD_PROPRIETARY";
+ case VK_DRIVER_ID_AMD_OPEN_SOURCE: return "VK_DRIVER_ID_AMD_OPEN_SOURCE";
+ case VK_DRIVER_ID_MESA_RADV: return "VK_DRIVER_ID_MESA_RADV";
+ case VK_DRIVER_ID_NVIDIA_PROPRIETARY: return "VK_DRIVER_ID_NVIDIA_PROPRIETARY";
+ case VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS: return "VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS";
+ case VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA: return "VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA";
+ case VK_DRIVER_ID_IMAGINATION_PROPRIETARY: return "VK_DRIVER_ID_IMAGINATION_PROPRIETARY";
+ case VK_DRIVER_ID_QUALCOMM_PROPRIETARY: return "VK_DRIVER_ID_QUALCOMM_PROPRIETARY";
+ case VK_DRIVER_ID_ARM_PROPRIETARY: return "VK_DRIVER_ID_ARM_PROPRIETARY";
+ case VK_DRIVER_ID_GOOGLE_SWIFTSHADER: return "VK_DRIVER_ID_GOOGLE_SWIFTSHADER";
+ case VK_DRIVER_ID_GGP_PROPRIETARY: return "VK_DRIVER_ID_GGP_PROPRIETARY";
+ case VK_DRIVER_ID_BROADCOM_PROPRIETARY: return "VK_DRIVER_ID_BROADCOM_PROPRIETARY";
+ case VK_DRIVER_ID_MAX_ENUM: return "VK_DRIVER_ID_MAX_ENUM";
+ default: return DE_NULL;
+ }
+}
+
+const char* getShaderFloatControlsIndependenceName (VkShaderFloatControlsIndependence value)
+{
+ switch (value)
+ {
+ case VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY: return "VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY";
+ case VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL: return "VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL";
+ case VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE: return "VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE";
+ case VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_MAX_ENUM: return "VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_MAX_ENUM";
+ default: return DE_NULL;
+ }
+}
+
+const char* getSamplerReductionModeName (VkSamplerReductionMode value)
+{
+ switch (value)
+ {
+ case VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE: return "VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE";
+ case VK_SAMPLER_REDUCTION_MODE_MIN: return "VK_SAMPLER_REDUCTION_MODE_MIN";
+ case VK_SAMPLER_REDUCTION_MODE_MAX: return "VK_SAMPLER_REDUCTION_MODE_MAX";
+ case VK_SAMPLER_REDUCTION_MODE_MAX_ENUM: return "VK_SAMPLER_REDUCTION_MODE_MAX_ENUM";
+ default: return DE_NULL;
+ }
+}
+
+const char* getSemaphoreTypeName (VkSemaphoreType value)
+{
+ switch (value)
+ {
+ case VK_SEMAPHORE_TYPE_BINARY: return "VK_SEMAPHORE_TYPE_BINARY";
+ case VK_SEMAPHORE_TYPE_TIMELINE: return "VK_SEMAPHORE_TYPE_TIMELINE";
+ case VK_SEMAPHORE_TYPE_MAX_ENUM: return "VK_SEMAPHORE_TYPE_MAX_ENUM";
+ default: return DE_NULL;
+ }
+}
+
const char* getColorSpaceKHRName (VkColorSpaceKHR value)
{
switch (value)
@@ -1403,22 +1520,49 @@
}
}
-const char* getDriverIdKHRName (VkDriverIdKHR value)
+const char* getPerformanceCounterUnitKHRName (VkPerformanceCounterUnitKHR value)
{
switch (value)
{
- case VK_DRIVER_ID_AMD_PROPRIETARY_KHR: return "VK_DRIVER_ID_AMD_PROPRIETARY_KHR";
- case VK_DRIVER_ID_AMD_OPEN_SOURCE_KHR: return "VK_DRIVER_ID_AMD_OPEN_SOURCE_KHR";
- case VK_DRIVER_ID_MESA_RADV_KHR: return "VK_DRIVER_ID_MESA_RADV_KHR";
- case VK_DRIVER_ID_NVIDIA_PROPRIETARY_KHR: return "VK_DRIVER_ID_NVIDIA_PROPRIETARY_KHR";
- case VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS_KHR: return "VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS_KHR";
- case VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA_KHR: return "VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA_KHR";
- case VK_DRIVER_ID_IMAGINATION_PROPRIETARY_KHR: return "VK_DRIVER_ID_IMAGINATION_PROPRIETARY_KHR";
- case VK_DRIVER_ID_QUALCOMM_PROPRIETARY_KHR: return "VK_DRIVER_ID_QUALCOMM_PROPRIETARY_KHR";
- case VK_DRIVER_ID_ARM_PROPRIETARY_KHR: return "VK_DRIVER_ID_ARM_PROPRIETARY_KHR";
- case VK_DRIVER_ID_GOOGLE_PASTEL_KHR: return "VK_DRIVER_ID_GOOGLE_PASTEL_KHR";
- case VK_DRIVER_ID_GGP_PROPRIETARY_KHR: return "VK_DRIVER_ID_GGP_PROPRIETARY_KHR";
- case VK_DRIVER_ID_MAX_ENUM_KHR: return "VK_DRIVER_ID_MAX_ENUM_KHR";
+ case VK_PERFORMANCE_COUNTER_UNIT_GENERIC_KHR: return "VK_PERFORMANCE_COUNTER_UNIT_GENERIC_KHR";
+ case VK_PERFORMANCE_COUNTER_UNIT_PERCENTAGE_KHR: return "VK_PERFORMANCE_COUNTER_UNIT_PERCENTAGE_KHR";
+ case VK_PERFORMANCE_COUNTER_UNIT_NANOSECONDS_KHR: return "VK_PERFORMANCE_COUNTER_UNIT_NANOSECONDS_KHR";
+ case VK_PERFORMANCE_COUNTER_UNIT_BYTES_KHR: return "VK_PERFORMANCE_COUNTER_UNIT_BYTES_KHR";
+ case VK_PERFORMANCE_COUNTER_UNIT_BYTES_PER_SECOND_KHR: return "VK_PERFORMANCE_COUNTER_UNIT_BYTES_PER_SECOND_KHR";
+ case VK_PERFORMANCE_COUNTER_UNIT_KELVIN_KHR: return "VK_PERFORMANCE_COUNTER_UNIT_KELVIN_KHR";
+ case VK_PERFORMANCE_COUNTER_UNIT_WATTS_KHR: return "VK_PERFORMANCE_COUNTER_UNIT_WATTS_KHR";
+ case VK_PERFORMANCE_COUNTER_UNIT_VOLTS_KHR: return "VK_PERFORMANCE_COUNTER_UNIT_VOLTS_KHR";
+ case VK_PERFORMANCE_COUNTER_UNIT_AMPS_KHR: return "VK_PERFORMANCE_COUNTER_UNIT_AMPS_KHR";
+ case VK_PERFORMANCE_COUNTER_UNIT_HERTZ_KHR: return "VK_PERFORMANCE_COUNTER_UNIT_HERTZ_KHR";
+ case VK_PERFORMANCE_COUNTER_UNIT_CYCLES_KHR: return "VK_PERFORMANCE_COUNTER_UNIT_CYCLES_KHR";
+ case VK_PERFORMANCE_COUNTER_UNIT_MAX_ENUM_KHR: return "VK_PERFORMANCE_COUNTER_UNIT_MAX_ENUM_KHR";
+ default: return DE_NULL;
+ }
+}
+
+const char* getPerformanceCounterScopeKHRName (VkPerformanceCounterScopeKHR value)
+{
+ switch (value)
+ {
+ case VK_QUERY_SCOPE_COMMAND_BUFFER_KHR: return "VK_QUERY_SCOPE_COMMAND_BUFFER_KHR";
+ case VK_QUERY_SCOPE_RENDER_PASS_KHR: return "VK_QUERY_SCOPE_RENDER_PASS_KHR";
+ case VK_QUERY_SCOPE_COMMAND_KHR: return "VK_QUERY_SCOPE_COMMAND_KHR";
+ case VK_PERFORMANCE_COUNTER_SCOPE_MAX_ENUM_KHR: return "VK_PERFORMANCE_COUNTER_SCOPE_MAX_ENUM_KHR";
+ default: return DE_NULL;
+ }
+}
+
+const char* getPerformanceCounterStorageKHRName (VkPerformanceCounterStorageKHR value)
+{
+ switch (value)
+ {
+ case VK_PERFORMANCE_COUNTER_STORAGE_INT32_KHR: return "VK_PERFORMANCE_COUNTER_STORAGE_INT32_KHR";
+ case VK_PERFORMANCE_COUNTER_STORAGE_INT64_KHR: return "VK_PERFORMANCE_COUNTER_STORAGE_INT64_KHR";
+ case VK_PERFORMANCE_COUNTER_STORAGE_UINT32_KHR: return "VK_PERFORMANCE_COUNTER_STORAGE_UINT32_KHR";
+ case VK_PERFORMANCE_COUNTER_STORAGE_UINT64_KHR: return "VK_PERFORMANCE_COUNTER_STORAGE_UINT64_KHR";
+ case VK_PERFORMANCE_COUNTER_STORAGE_FLOAT32_KHR: return "VK_PERFORMANCE_COUNTER_STORAGE_FLOAT32_KHR";
+ case VK_PERFORMANCE_COUNTER_STORAGE_FLOAT64_KHR: return "VK_PERFORMANCE_COUNTER_STORAGE_FLOAT64_KHR";
+ case VK_PERFORMANCE_COUNTER_STORAGE_MAX_ENUM_KHR: return "VK_PERFORMANCE_COUNTER_STORAGE_MAX_ENUM_KHR";
default: return DE_NULL;
}
}
@@ -1436,17 +1580,6 @@
}
}
-const char* getSemaphoreTypeKHRName (VkSemaphoreTypeKHR value)
-{
- switch (value)
- {
- case VK_SEMAPHORE_TYPE_BINARY_KHR: return "VK_SEMAPHORE_TYPE_BINARY_KHR";
- case VK_SEMAPHORE_TYPE_TIMELINE_KHR: return "VK_SEMAPHORE_TYPE_TIMELINE_KHR";
- case VK_SEMAPHORE_TYPE_MAX_ENUM_KHR: return "VK_SEMAPHORE_TYPE_MAX_ENUM_KHR";
- default: return DE_NULL;
- }
-}
-
const char* getDebugReportObjectTypeEXTName (VkDebugReportObjectTypeEXT value)
{
switch (value)
@@ -1630,18 +1763,6 @@
}
}
-const char* getSamplerReductionModeEXTName (VkSamplerReductionModeEXT value)
-{
- switch (value)
- {
- case VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT: return "VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT";
- case VK_SAMPLER_REDUCTION_MODE_MIN_EXT: return "VK_SAMPLER_REDUCTION_MODE_MIN_EXT";
- case VK_SAMPLER_REDUCTION_MODE_MAX_EXT: return "VK_SAMPLER_REDUCTION_MODE_MAX_EXT";
- case VK_SAMPLER_REDUCTION_MODE_MAX_ENUM_EXT: return "VK_SAMPLER_REDUCTION_MODE_MAX_ENUM_EXT";
- default: return DE_NULL;
- }
-}
-
const char* getBlendOverlapEXTName (VkBlendOverlapEXT value)
{
switch (value)
@@ -1711,6 +1832,17 @@
}
}
+const char* getAccelerationStructureTypeNVName (VkAccelerationStructureTypeNV value)
+{
+ switch (value)
+ {
+ case VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV: return "VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV";
+ case VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV: return "VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV";
+ case VK_ACCELERATION_STRUCTURE_TYPE_MAX_ENUM_NV: return "VK_ACCELERATION_STRUCTURE_TYPE_MAX_ENUM_NV";
+ default: return DE_NULL;
+ }
+}
+
const char* getRayTracingShaderGroupTypeNVName (VkRayTracingShaderGroupTypeNV value)
{
switch (value)
@@ -1734,17 +1866,6 @@
}
}
-const char* getAccelerationStructureTypeNVName (VkAccelerationStructureTypeNV value)
-{
- switch (value)
- {
- case VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV: return "VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV";
- case VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV: return "VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV";
- case VK_ACCELERATION_STRUCTURE_TYPE_MAX_ENUM_NV: return "VK_ACCELERATION_STRUCTURE_TYPE_MAX_ENUM_NV";
- default: return DE_NULL;
- }
-}
-
const char* getCopyAccelerationStructureModeNVName (VkCopyAccelerationStructureModeNV value)
{
switch (value)
@@ -1806,12 +1927,69 @@
}
}
+const char* getPerformanceConfigurationTypeINTELName (VkPerformanceConfigurationTypeINTEL value)
+{
+ switch (value)
+ {
+ case VK_PERFORMANCE_CONFIGURATION_TYPE_COMMAND_QUEUE_METRICS_DISCOVERY_ACTIVATED_INTEL: return "VK_PERFORMANCE_CONFIGURATION_TYPE_COMMAND_QUEUE_METRICS_DISCOVERY_ACTIVATED_INTEL";
+ case VK_PERFORMANCE_CONFIGURATION_TYPE_MAX_ENUM_INTEL: return "VK_PERFORMANCE_CONFIGURATION_TYPE_MAX_ENUM_INTEL";
+ default: return DE_NULL;
+ }
+}
+
+const char* getQueryPoolSamplingModeINTELName (VkQueryPoolSamplingModeINTEL value)
+{
+ switch (value)
+ {
+ case VK_QUERY_POOL_SAMPLING_MODE_MANUAL_INTEL: return "VK_QUERY_POOL_SAMPLING_MODE_MANUAL_INTEL";
+ case VK_QUERY_POOL_SAMPLING_MODE_MAX_ENUM_INTEL: return "VK_QUERY_POOL_SAMPLING_MODE_MAX_ENUM_INTEL";
+ default: return DE_NULL;
+ }
+}
+
+const char* getPerformanceOverrideTypeINTELName (VkPerformanceOverrideTypeINTEL value)
+{
+ switch (value)
+ {
+ case VK_PERFORMANCE_OVERRIDE_TYPE_NULL_HARDWARE_INTEL: return "VK_PERFORMANCE_OVERRIDE_TYPE_NULL_HARDWARE_INTEL";
+ case VK_PERFORMANCE_OVERRIDE_TYPE_FLUSH_GPU_CACHES_INTEL: return "VK_PERFORMANCE_OVERRIDE_TYPE_FLUSH_GPU_CACHES_INTEL";
+ case VK_PERFORMANCE_OVERRIDE_TYPE_MAX_ENUM_INTEL: return "VK_PERFORMANCE_OVERRIDE_TYPE_MAX_ENUM_INTEL";
+ default: return DE_NULL;
+ }
+}
+
+const char* getPerformanceParameterTypeINTELName (VkPerformanceParameterTypeINTEL value)
+{
+ switch (value)
+ {
+ case VK_PERFORMANCE_PARAMETER_TYPE_HW_COUNTERS_SUPPORTED_INTEL: return "VK_PERFORMANCE_PARAMETER_TYPE_HW_COUNTERS_SUPPORTED_INTEL";
+ case VK_PERFORMANCE_PARAMETER_TYPE_STREAM_MARKER_VALID_BITS_INTEL: return "VK_PERFORMANCE_PARAMETER_TYPE_STREAM_MARKER_VALID_BITS_INTEL";
+ case VK_PERFORMANCE_PARAMETER_TYPE_MAX_ENUM_INTEL: return "VK_PERFORMANCE_PARAMETER_TYPE_MAX_ENUM_INTEL";
+ default: return DE_NULL;
+ }
+}
+
+const char* getPerformanceValueTypeINTELName (VkPerformanceValueTypeINTEL value)
+{
+ switch (value)
+ {
+ case VK_PERFORMANCE_VALUE_TYPE_UINT32_INTEL: return "VK_PERFORMANCE_VALUE_TYPE_UINT32_INTEL";
+ case VK_PERFORMANCE_VALUE_TYPE_UINT64_INTEL: return "VK_PERFORMANCE_VALUE_TYPE_UINT64_INTEL";
+ case VK_PERFORMANCE_VALUE_TYPE_FLOAT_INTEL: return "VK_PERFORMANCE_VALUE_TYPE_FLOAT_INTEL";
+ case VK_PERFORMANCE_VALUE_TYPE_BOOL_INTEL: return "VK_PERFORMANCE_VALUE_TYPE_BOOL_INTEL";
+ case VK_PERFORMANCE_VALUE_TYPE_STRING_INTEL: return "VK_PERFORMANCE_VALUE_TYPE_STRING_INTEL";
+ case VK_PERFORMANCE_VALUE_TYPE_MAX_ENUM_INTEL: return "VK_PERFORMANCE_VALUE_TYPE_MAX_ENUM_INTEL";
+ default: return DE_NULL;
+ }
+}
+
const char* getValidationFeatureEnableEXTName (VkValidationFeatureEnableEXT value)
{
switch (value)
{
case VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT: return "VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT";
case VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT: return "VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT";
+ case VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT: return "VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT";
case VK_VALIDATION_FEATURE_ENABLE_MAX_ENUM_EXT: return "VK_VALIDATION_FEATURE_ENABLE_MAX_ENUM_EXT";
default: return DE_NULL;
}
@@ -1877,6 +2055,19 @@
}
}
+const char* getLineRasterizationModeEXTName (VkLineRasterizationModeEXT value)
+{
+ switch (value)
+ {
+ case VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT: return "VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT";
+ case VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT: return "VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT";
+ case VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT: return "VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT";
+ case VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT: return "VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT";
+ case VK_LINE_RASTERIZATION_MODE_MAX_ENUM_EXT: return "VK_LINE_RASTERIZATION_MODE_MAX_ENUM_EXT";
+ default: return DE_NULL;
+ }
+}
+
const char* getFullScreenExclusiveEXTName (VkFullScreenExclusiveEXT value)
{
switch (value)
@@ -1916,11 +2107,12 @@
tcu::Format::BitDesc(VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT, "VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT"),
tcu::Format::BitDesc(VK_FORMAT_FEATURE_DISJOINT_BIT, "VK_FORMAT_FEATURE_DISJOINT_BIT"),
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_SAMPLED_IMAGE_FILTER_MINMAX_BIT_EXT, "VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT_EXT"),
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_TRANSFER_SRC_BIT_KHR, "VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR"),
tcu::Format::BitDesc(VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR, "VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR"),
+ tcu::Format::BitDesc(VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT_EXT, "VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT_EXT"),
tcu::Format::BitDesc(VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT_KHR, "VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT_KHR"),
tcu::Format::BitDesc(VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT_KHR, "VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT_KHR"),
tcu::Format::BitDesc(VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT_KHR, "VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT_KHR"),
@@ -2017,13 +2209,15 @@
{
static const tcu::Format::BitDesc s_desc[] =
{
- tcu::Format::BitDesc(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, "VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT"),
- tcu::Format::BitDesc(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, "VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT"),
- tcu::Format::BitDesc(VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, "VK_MEMORY_PROPERTY_HOST_COHERENT_BIT"),
- tcu::Format::BitDesc(VK_MEMORY_PROPERTY_HOST_CACHED_BIT, "VK_MEMORY_PROPERTY_HOST_CACHED_BIT"),
- tcu::Format::BitDesc(VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT, "VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT"),
- tcu::Format::BitDesc(VK_MEMORY_PROPERTY_PROTECTED_BIT, "VK_MEMORY_PROPERTY_PROTECTED_BIT"),
- tcu::Format::BitDesc(VK_MEMORY_PROPERTY_FLAG_BITS_MAX_ENUM, "VK_MEMORY_PROPERTY_FLAG_BITS_MAX_ENUM"),
+ tcu::Format::BitDesc(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, "VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT"),
+ tcu::Format::BitDesc(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, "VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT"),
+ tcu::Format::BitDesc(VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, "VK_MEMORY_PROPERTY_HOST_COHERENT_BIT"),
+ tcu::Format::BitDesc(VK_MEMORY_PROPERTY_HOST_CACHED_BIT, "VK_MEMORY_PROPERTY_HOST_CACHED_BIT"),
+ tcu::Format::BitDesc(VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT, "VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT"),
+ tcu::Format::BitDesc(VK_MEMORY_PROPERTY_PROTECTED_BIT, "VK_MEMORY_PROPERTY_PROTECTED_BIT"),
+ tcu::Format::BitDesc(VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD, "VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD"),
+ tcu::Format::BitDesc(VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD, "VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD"),
+ tcu::Format::BitDesc(VK_MEMORY_PROPERTY_FLAG_BITS_MAX_ENUM, "VK_MEMORY_PROPERTY_FLAG_BITS_MAX_ENUM"),
};
return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
}
@@ -2181,7 +2375,9 @@
tcu::Format::BitDesc(VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT, "VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT"),
tcu::Format::BitDesc(VK_BUFFER_CREATE_SPARSE_ALIASED_BIT, "VK_BUFFER_CREATE_SPARSE_ALIASED_BIT"),
tcu::Format::BitDesc(VK_BUFFER_CREATE_PROTECTED_BIT, "VK_BUFFER_CREATE_PROTECTED_BIT"),
+ tcu::Format::BitDesc(VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT, "VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT"),
tcu::Format::BitDesc(VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_EXT, "VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_EXT"),
+ tcu::Format::BitDesc(VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR, "VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR"),
tcu::Format::BitDesc(VK_BUFFER_CREATE_FLAG_BITS_MAX_ENUM, "VK_BUFFER_CREATE_FLAG_BITS_MAX_ENUM"),
};
return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
@@ -2200,11 +2396,13 @@
tcu::Format::BitDesc(VK_BUFFER_USAGE_INDEX_BUFFER_BIT, "VK_BUFFER_USAGE_INDEX_BUFFER_BIT"),
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_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"),
tcu::Format::BitDesc(VK_BUFFER_USAGE_RAY_TRACING_BIT_NV, "VK_BUFFER_USAGE_RAY_TRACING_BIT_NV"),
tcu::Format::BitDesc(VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT, "VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT"),
+ tcu::Format::BitDesc(VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR, "VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR"),
tcu::Format::BitDesc(VK_BUFFER_USAGE_FLAG_BITS_MAX_ENUM, "VK_BUFFER_USAGE_FLAG_BITS_MAX_ENUM"),
};
return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
@@ -2220,6 +2418,15 @@
return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
}
+tcu::Format::Bitfield<32> getShaderModuleCreateFlagsStr (VkShaderModuleCreateFlags value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_SHADER_MODULE_CREATE_FLAG_BITS_MAX_ENUM, "VK_SHADER_MODULE_CREATE_FLAG_BITS_MAX_ENUM"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
tcu::Format::Bitfield<32> getPipelineCreateFlagsStr (VkPipelineCreateFlags value)
{
static const tcu::Format::BitDesc s_desc[] =
@@ -2239,6 +2446,17 @@
return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
}
+tcu::Format::Bitfield<32> getPipelineShaderStageCreateFlagsStr (VkPipelineShaderStageCreateFlags value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT, "VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT"),
+ tcu::Format::BitDesc(VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT, "VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT"),
+ tcu::Format::BitDesc(VK_PIPELINE_SHADER_STAGE_CREATE_FLAG_BITS_MAX_ENUM, "VK_PIPELINE_SHADER_STAGE_CREATE_FLAG_BITS_MAX_ENUM"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
tcu::Format::Bitfield<32> getShaderStageFlagsStr (VkShaderStageFlags value)
{
static const tcu::Format::BitDesc s_desc[] =
@@ -2305,6 +2523,7 @@
{
static const tcu::Format::BitDesc s_desc[] =
{
+ tcu::Format::BitDesc(VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT, "VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT"),
tcu::Format::BitDesc(VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, "VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR"),
tcu::Format::BitDesc(VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT, "VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT"),
tcu::Format::BitDesc(VK_DESCRIPTOR_SET_LAYOUT_CREATE_FLAG_BITS_MAX_ENUM, "VK_DESCRIPTOR_SET_LAYOUT_CREATE_FLAG_BITS_MAX_ENUM"),
@@ -2317,6 +2536,7 @@
static const tcu::Format::BitDesc s_desc[] =
{
tcu::Format::BitDesc(VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, "VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT"),
+ tcu::Format::BitDesc(VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT, "VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT"),
tcu::Format::BitDesc(VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT, "VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT"),
tcu::Format::BitDesc(VK_DESCRIPTOR_POOL_CREATE_FLAG_BITS_MAX_ENUM, "VK_DESCRIPTOR_POOL_CREATE_FLAG_BITS_MAX_ENUM"),
};
@@ -2327,12 +2547,22 @@
{
static const tcu::Format::BitDesc s_desc[] =
{
+ tcu::Format::BitDesc(VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, "VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT"),
tcu::Format::BitDesc(VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR, "VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR"),
tcu::Format::BitDesc(VK_FRAMEBUFFER_CREATE_FLAG_BITS_MAX_ENUM, "VK_FRAMEBUFFER_CREATE_FLAG_BITS_MAX_ENUM"),
};
return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
}
+tcu::Format::Bitfield<32> getRenderPassCreateFlagsStr (VkRenderPassCreateFlags value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_RENDER_PASS_CREATE_FLAG_BITS_MAX_ENUM, "VK_RENDER_PASS_CREATE_FLAG_BITS_MAX_ENUM"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
tcu::Format::Bitfield<32> getAttachmentDescriptionFlagsStr (VkAttachmentDescriptionFlags value)
{
static const tcu::Format::BitDesc s_desc[] =
@@ -2465,6 +2695,7 @@
{
tcu::Format::BitDesc(VK_STENCIL_FACE_FRONT_BIT, "VK_STENCIL_FACE_FRONT_BIT"),
tcu::Format::BitDesc(VK_STENCIL_FACE_BACK_BIT, "VK_STENCIL_FACE_BACK_BIT"),
+ tcu::Format::BitDesc(VK_STENCIL_FACE_FRONT_AND_BACK, "VK_STENCIL_FACE_FRONT_AND_BACK"),
tcu::Format::BitDesc(VK_STENCIL_FRONT_AND_BACK, "VK_STENCIL_FRONT_AND_BACK"),
tcu::Format::BitDesc(VK_STENCIL_FACE_FLAG_BITS_MAX_ENUM, "VK_STENCIL_FACE_FLAG_BITS_MAX_ENUM"),
};
@@ -2510,9 +2741,13 @@
{
static const tcu::Format::BitDesc s_desc[] =
{
- tcu::Format::BitDesc(VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT, "VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT"),
- tcu::Format::BitDesc(VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT_KHR, "VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT_KHR"),
- tcu::Format::BitDesc(VK_MEMORY_ALLOCATE_FLAG_BITS_MAX_ENUM, "VK_MEMORY_ALLOCATE_FLAG_BITS_MAX_ENUM"),
+ tcu::Format::BitDesc(VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT, "VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT"),
+ tcu::Format::BitDesc(VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT, "VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT"),
+ tcu::Format::BitDesc(VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT, "VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT"),
+ tcu::Format::BitDesc(VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT_KHR, "VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT_KHR"),
+ tcu::Format::BitDesc(VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR, "VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR"),
+ tcu::Format::BitDesc(VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR, "VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR"),
+ tcu::Format::BitDesc(VK_MEMORY_ALLOCATE_FLAG_BITS_MAX_ENUM, "VK_MEMORY_ALLOCATE_FLAG_BITS_MAX_ENUM"),
};
return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
}
@@ -2643,6 +2878,53 @@
return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
}
+tcu::Format::Bitfield<32> getResolveModeFlagsStr (VkResolveModeFlags value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_RESOLVE_MODE_NONE, "VK_RESOLVE_MODE_NONE"),
+ tcu::Format::BitDesc(VK_RESOLVE_MODE_SAMPLE_ZERO_BIT, "VK_RESOLVE_MODE_SAMPLE_ZERO_BIT"),
+ tcu::Format::BitDesc(VK_RESOLVE_MODE_AVERAGE_BIT, "VK_RESOLVE_MODE_AVERAGE_BIT"),
+ tcu::Format::BitDesc(VK_RESOLVE_MODE_MIN_BIT, "VK_RESOLVE_MODE_MIN_BIT"),
+ tcu::Format::BitDesc(VK_RESOLVE_MODE_MAX_BIT, "VK_RESOLVE_MODE_MAX_BIT"),
+ tcu::Format::BitDesc(VK_RESOLVE_MODE_NONE_KHR, "VK_RESOLVE_MODE_NONE_KHR"),
+ tcu::Format::BitDesc(VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR, "VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR"),
+ tcu::Format::BitDesc(VK_RESOLVE_MODE_AVERAGE_BIT_KHR, "VK_RESOLVE_MODE_AVERAGE_BIT_KHR"),
+ tcu::Format::BitDesc(VK_RESOLVE_MODE_MIN_BIT_KHR, "VK_RESOLVE_MODE_MIN_BIT_KHR"),
+ tcu::Format::BitDesc(VK_RESOLVE_MODE_MAX_BIT_KHR, "VK_RESOLVE_MODE_MAX_BIT_KHR"),
+ tcu::Format::BitDesc(VK_RESOLVE_MODE_FLAG_BITS_MAX_ENUM, "VK_RESOLVE_MODE_FLAG_BITS_MAX_ENUM"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getDescriptorBindingFlagsStr (VkDescriptorBindingFlags value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT, "VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT"),
+ tcu::Format::BitDesc(VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT, "VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT"),
+ tcu::Format::BitDesc(VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT, "VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT"),
+ tcu::Format::BitDesc(VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT, "VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT"),
+ tcu::Format::BitDesc(VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT, "VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT"),
+ tcu::Format::BitDesc(VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT, "VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT"),
+ tcu::Format::BitDesc(VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT, "VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT"),
+ tcu::Format::BitDesc(VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT, "VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT"),
+ tcu::Format::BitDesc(VK_DESCRIPTOR_BINDING_FLAG_BITS_MAX_ENUM, "VK_DESCRIPTOR_BINDING_FLAG_BITS_MAX_ENUM"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getSemaphoreWaitFlagsStr (VkSemaphoreWaitFlags value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_SEMAPHORE_WAIT_ANY_BIT, "VK_SEMAPHORE_WAIT_ANY_BIT"),
+ tcu::Format::BitDesc(VK_SEMAPHORE_WAIT_ANY_BIT_KHR, "VK_SEMAPHORE_WAIT_ANY_BIT_KHR"),
+ tcu::Format::BitDesc(VK_SEMAPHORE_WAIT_FLAG_BITS_MAX_ENUM, "VK_SEMAPHORE_WAIT_FLAG_BITS_MAX_ENUM"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
tcu::Format::Bitfield<32> getSurfaceTransformFlagsKHRStr (VkSurfaceTransformFlagsKHR value)
{
static const tcu::Format::BitDesc s_desc[] =
@@ -2712,26 +2994,22 @@
return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
}
-tcu::Format::Bitfield<32> getResolveModeFlagsKHRStr (VkResolveModeFlagsKHR value)
+tcu::Format::Bitfield<32> getPerformanceCounterDescriptionFlagsKHRStr (VkPerformanceCounterDescriptionFlagsKHR value)
{
static const tcu::Format::BitDesc s_desc[] =
{
- tcu::Format::BitDesc(VK_RESOLVE_MODE_NONE_KHR, "VK_RESOLVE_MODE_NONE_KHR"),
- tcu::Format::BitDesc(VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR, "VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR"),
- tcu::Format::BitDesc(VK_RESOLVE_MODE_AVERAGE_BIT_KHR, "VK_RESOLVE_MODE_AVERAGE_BIT_KHR"),
- tcu::Format::BitDesc(VK_RESOLVE_MODE_MIN_BIT_KHR, "VK_RESOLVE_MODE_MIN_BIT_KHR"),
- tcu::Format::BitDesc(VK_RESOLVE_MODE_MAX_BIT_KHR, "VK_RESOLVE_MODE_MAX_BIT_KHR"),
- tcu::Format::BitDesc(VK_RESOLVE_MODE_FLAG_BITS_MAX_ENUM_KHR, "VK_RESOLVE_MODE_FLAG_BITS_MAX_ENUM_KHR"),
+ tcu::Format::BitDesc(VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_KHR, "VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_KHR"),
+ tcu::Format::BitDesc(VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_KHR, "VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_KHR"),
+ tcu::Format::BitDesc(VK_PERFORMANCE_COUNTER_DESCRIPTION_FLAG_BITS_MAX_ENUM_KHR, "VK_PERFORMANCE_COUNTER_DESCRIPTION_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> getSemaphoreWaitFlagsKHRStr (VkSemaphoreWaitFlagsKHR value)
+tcu::Format::Bitfield<32> getAcquireProfilingLockFlagsKHRStr (VkAcquireProfilingLockFlagsKHR value)
{
static const tcu::Format::BitDesc s_desc[] =
{
- tcu::Format::BitDesc(VK_SEMAPHORE_WAIT_ANY_BIT_KHR, "VK_SEMAPHORE_WAIT_ANY_BIT_KHR"),
- tcu::Format::BitDesc(VK_SEMAPHORE_WAIT_FLAG_BITS_MAX_ENUM_KHR, "VK_SEMAPHORE_WAIT_FLAG_BITS_MAX_ENUM_KHR"),
+ tcu::Format::BitDesc(VK_ACQUIRE_PROFILING_LOCK_FLAG_BITS_MAX_ENUM_KHR, "VK_ACQUIRE_PROFILING_LOCK_FLAG_BITS_MAX_ENUM_KHR"),
};
return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
}
@@ -2844,19 +3122,6 @@
return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
}
-tcu::Format::Bitfield<32> getDescriptorBindingFlagsEXTStr (VkDescriptorBindingFlagsEXT value)
-{
- static const tcu::Format::BitDesc s_desc[] =
- {
- tcu::Format::BitDesc(VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT, "VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT"),
- tcu::Format::BitDesc(VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT, "VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT"),
- tcu::Format::BitDesc(VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT, "VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT"),
- tcu::Format::BitDesc(VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT, "VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT"),
- tcu::Format::BitDesc(VK_DESCRIPTOR_BINDING_FLAG_BITS_MAX_ENUM_EXT, "VK_DESCRIPTOR_BINDING_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> getGeometryFlagsNVStr (VkGeometryFlagsNV value)
{
static const tcu::Format::BitDesc s_desc[] =
@@ -2895,6 +3160,15 @@
return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
}
+tcu::Format::Bitfield<32> getPipelineCompilerControlFlagsAMDStr (VkPipelineCompilerControlFlagsAMD value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_PIPELINE_COMPILER_CONTROL_FLAG_BITS_MAX_ENUM_AMD, "VK_PIPELINE_COMPILER_CONTROL_FLAG_BITS_MAX_ENUM_AMD"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
tcu::Format::Bitfield<32> getPipelineCreationFeedbackFlagsEXTStr (VkPipelineCreationFeedbackFlagsEXT value)
{
static const tcu::Format::BitDesc s_desc[] =
@@ -2907,6 +3181,15 @@
return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
}
+tcu::Format::Bitfield<32> getShaderCorePropertiesFlagsAMDStr (VkShaderCorePropertiesFlagsAMD value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_SHADER_CORE_PROPERTIES_FLAG_BITS_MAX_ENUM_AMD, "VK_SHADER_CORE_PROPERTIES_FLAG_BITS_MAX_ENUM_AMD"),
+ };
+ 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);
@@ -2942,21 +3225,11 @@
return tcu::Format::Bitfield<32>(value, DE_NULL, DE_NULL);
}
-tcu::Format::Bitfield<32> getShaderModuleCreateFlagsStr (VkShaderModuleCreateFlags value)
-{
- return tcu::Format::Bitfield<32>(value, DE_NULL, DE_NULL);
-}
-
tcu::Format::Bitfield<32> getPipelineCacheCreateFlagsStr (VkPipelineCacheCreateFlags value)
{
return tcu::Format::Bitfield<32>(value, DE_NULL, DE_NULL);
}
-tcu::Format::Bitfield<32> getPipelineShaderStageCreateFlagsStr (VkPipelineShaderStageCreateFlags value)
-{
- return tcu::Format::Bitfield<32>(value, DE_NULL, DE_NULL);
-}
-
tcu::Format::Bitfield<32> getPipelineVertexInputStateCreateFlagsStr (VkPipelineVertexInputStateCreateFlags value)
{
return tcu::Format::Bitfield<32>(value, DE_NULL, DE_NULL);
@@ -3012,11 +3285,6 @@
return tcu::Format::Bitfield<32>(value, DE_NULL, DE_NULL);
}
-tcu::Format::Bitfield<32> getRenderPassCreateFlagsStr (VkRenderPassCreateFlags value)
-{
- return tcu::Format::Bitfield<32>(value, DE_NULL, DE_NULL);
-}
-
tcu::Format::Bitfield<32> getCommandPoolTrimFlagsStr (VkCommandPoolTrimFlags value)
{
return tcu::Format::Bitfield<32>(value, DE_NULL, DE_NULL);
@@ -5429,6 +5697,767 @@
return s;
}
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceVulkan11Features& value)
+{
+ s << "VkPhysicalDeviceVulkan11Features = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tstorageBuffer16BitAccess = " << value.storageBuffer16BitAccess << '\n';
+ s << "\tuniformAndStorageBuffer16BitAccess = " << value.uniformAndStorageBuffer16BitAccess << '\n';
+ s << "\tstoragePushConstant16 = " << value.storagePushConstant16 << '\n';
+ s << "\tstorageInputOutput16 = " << value.storageInputOutput16 << '\n';
+ s << "\tmultiview = " << value.multiview << '\n';
+ s << "\tmultiviewGeometryShader = " << value.multiviewGeometryShader << '\n';
+ s << "\tmultiviewTessellationShader = " << value.multiviewTessellationShader << '\n';
+ s << "\tvariablePointersStorageBuffer = " << value.variablePointersStorageBuffer << '\n';
+ s << "\tvariablePointers = " << value.variablePointers << '\n';
+ s << "\tprotectedMemory = " << value.protectedMemory << '\n';
+ s << "\tsamplerYcbcrConversion = " << value.samplerYcbcrConversion << '\n';
+ s << "\tshaderDrawParameters = " << value.shaderDrawParameters << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceVulkan11Properties& value)
+{
+ s << "VkPhysicalDeviceVulkan11Properties = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tdeviceUUID = " << '\n' << tcu::formatArray(tcu::Format::HexIterator<deUint8>(DE_ARRAY_BEGIN(value.deviceUUID)), tcu::Format::HexIterator<deUint8>(DE_ARRAY_END(value.deviceUUID))) << '\n';
+ s << "\tdriverUUID = " << '\n' << tcu::formatArray(tcu::Format::HexIterator<deUint8>(DE_ARRAY_BEGIN(value.driverUUID)), tcu::Format::HexIterator<deUint8>(DE_ARRAY_END(value.driverUUID))) << '\n';
+ s << "\tdeviceLUID = " << '\n' << tcu::formatArray(tcu::Format::HexIterator<deUint8>(DE_ARRAY_BEGIN(value.deviceLUID)), tcu::Format::HexIterator<deUint8>(DE_ARRAY_END(value.deviceLUID))) << '\n';
+ s << "\tdeviceNodeMask = " << value.deviceNodeMask << '\n';
+ s << "\tdeviceLUIDValid = " << value.deviceLUIDValid << '\n';
+ s << "\tsubgroupSize = " << value.subgroupSize << '\n';
+ s << "\tsubgroupSupportedStages = " << getShaderStageFlagsStr(value.subgroupSupportedStages) << '\n';
+ s << "\tsubgroupSupportedOperations = " << getSubgroupFeatureFlagsStr(value.subgroupSupportedOperations) << '\n';
+ s << "\tsubgroupQuadOperationsInAllStages = " << value.subgroupQuadOperationsInAllStages << '\n';
+ s << "\tpointClippingBehavior = " << value.pointClippingBehavior << '\n';
+ s << "\tmaxMultiviewViewCount = " << value.maxMultiviewViewCount << '\n';
+ s << "\tmaxMultiviewInstanceIndex = " << value.maxMultiviewInstanceIndex << '\n';
+ s << "\tprotectedNoFault = " << value.protectedNoFault << '\n';
+ s << "\tmaxPerSetDescriptors = " << value.maxPerSetDescriptors << '\n';
+ s << "\tmaxMemoryAllocationSize = " << value.maxMemoryAllocationSize << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceVulkan12Features& value)
+{
+ s << "VkPhysicalDeviceVulkan12Features = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tsamplerMirrorClampToEdge = " << value.samplerMirrorClampToEdge << '\n';
+ s << "\tdrawIndirectCount = " << value.drawIndirectCount << '\n';
+ s << "\tstorageBuffer8BitAccess = " << value.storageBuffer8BitAccess << '\n';
+ s << "\tuniformAndStorageBuffer8BitAccess = " << value.uniformAndStorageBuffer8BitAccess << '\n';
+ s << "\tstoragePushConstant8 = " << value.storagePushConstant8 << '\n';
+ s << "\tshaderBufferInt64Atomics = " << value.shaderBufferInt64Atomics << '\n';
+ s << "\tshaderSharedInt64Atomics = " << value.shaderSharedInt64Atomics << '\n';
+ s << "\tshaderFloat16 = " << value.shaderFloat16 << '\n';
+ s << "\tshaderInt8 = " << value.shaderInt8 << '\n';
+ s << "\tdescriptorIndexing = " << value.descriptorIndexing << '\n';
+ s << "\tshaderInputAttachmentArrayDynamicIndexing = " << value.shaderInputAttachmentArrayDynamicIndexing << '\n';
+ s << "\tshaderUniformTexelBufferArrayDynamicIndexing = " << value.shaderUniformTexelBufferArrayDynamicIndexing << '\n';
+ s << "\tshaderStorageTexelBufferArrayDynamicIndexing = " << value.shaderStorageTexelBufferArrayDynamicIndexing << '\n';
+ s << "\tshaderUniformBufferArrayNonUniformIndexing = " << value.shaderUniformBufferArrayNonUniformIndexing << '\n';
+ s << "\tshaderSampledImageArrayNonUniformIndexing = " << value.shaderSampledImageArrayNonUniformIndexing << '\n';
+ s << "\tshaderStorageBufferArrayNonUniformIndexing = " << value.shaderStorageBufferArrayNonUniformIndexing << '\n';
+ s << "\tshaderStorageImageArrayNonUniformIndexing = " << value.shaderStorageImageArrayNonUniformIndexing << '\n';
+ s << "\tshaderInputAttachmentArrayNonUniformIndexing = " << value.shaderInputAttachmentArrayNonUniformIndexing << '\n';
+ s << "\tshaderUniformTexelBufferArrayNonUniformIndexing = " << value.shaderUniformTexelBufferArrayNonUniformIndexing << '\n';
+ s << "\tshaderStorageTexelBufferArrayNonUniformIndexing = " << value.shaderStorageTexelBufferArrayNonUniformIndexing << '\n';
+ s << "\tdescriptorBindingUniformBufferUpdateAfterBind = " << value.descriptorBindingUniformBufferUpdateAfterBind << '\n';
+ s << "\tdescriptorBindingSampledImageUpdateAfterBind = " << value.descriptorBindingSampledImageUpdateAfterBind << '\n';
+ s << "\tdescriptorBindingStorageImageUpdateAfterBind = " << value.descriptorBindingStorageImageUpdateAfterBind << '\n';
+ s << "\tdescriptorBindingStorageBufferUpdateAfterBind = " << value.descriptorBindingStorageBufferUpdateAfterBind << '\n';
+ s << "\tdescriptorBindingUniformTexelBufferUpdateAfterBind = " << value.descriptorBindingUniformTexelBufferUpdateAfterBind << '\n';
+ s << "\tdescriptorBindingStorageTexelBufferUpdateAfterBind = " << value.descriptorBindingStorageTexelBufferUpdateAfterBind << '\n';
+ s << "\tdescriptorBindingUpdateUnusedWhilePending = " << value.descriptorBindingUpdateUnusedWhilePending << '\n';
+ s << "\tdescriptorBindingPartiallyBound = " << value.descriptorBindingPartiallyBound << '\n';
+ s << "\tdescriptorBindingVariableDescriptorCount = " << value.descriptorBindingVariableDescriptorCount << '\n';
+ s << "\truntimeDescriptorArray = " << value.runtimeDescriptorArray << '\n';
+ s << "\tsamplerFilterMinmax = " << value.samplerFilterMinmax << '\n';
+ s << "\tscalarBlockLayout = " << value.scalarBlockLayout << '\n';
+ s << "\timagelessFramebuffer = " << value.imagelessFramebuffer << '\n';
+ s << "\tuniformBufferStandardLayout = " << value.uniformBufferStandardLayout << '\n';
+ s << "\tshaderSubgroupExtendedTypes = " << value.shaderSubgroupExtendedTypes << '\n';
+ s << "\tseparateDepthStencilLayouts = " << value.separateDepthStencilLayouts << '\n';
+ s << "\thostQueryReset = " << value.hostQueryReset << '\n';
+ s << "\ttimelineSemaphore = " << value.timelineSemaphore << '\n';
+ s << "\tbufferDeviceAddress = " << value.bufferDeviceAddress << '\n';
+ s << "\tbufferDeviceAddressCaptureReplay = " << value.bufferDeviceAddressCaptureReplay << '\n';
+ s << "\tbufferDeviceAddressMultiDevice = " << value.bufferDeviceAddressMultiDevice << '\n';
+ s << "\tvulkanMemoryModel = " << value.vulkanMemoryModel << '\n';
+ s << "\tvulkanMemoryModelDeviceScope = " << value.vulkanMemoryModelDeviceScope << '\n';
+ s << "\tvulkanMemoryModelAvailabilityVisibilityChains = " << value.vulkanMemoryModelAvailabilityVisibilityChains << '\n';
+ s << "\tshaderOutputViewportIndex = " << value.shaderOutputViewportIndex << '\n';
+ s << "\tshaderOutputLayer = " << value.shaderOutputLayer << '\n';
+ s << "\tsubgroupBroadcastDynamicId = " << value.subgroupBroadcastDynamicId << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkConformanceVersion& value)
+{
+ s << "VkConformanceVersion = {\n";
+ s << "\tmajor = " << value.major << '\n';
+ s << "\tminor = " << value.minor << '\n';
+ s << "\tsubminor = " << value.subminor << '\n';
+ s << "\tpatch = " << value.patch << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceVulkan12Properties& value)
+{
+ s << "VkPhysicalDeviceVulkan12Properties = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tdriverID = " << value.driverID << '\n';
+ s << "\tdriverName = " << '\n' << tcu::formatArray(tcu::Format::HexIterator<char>(DE_ARRAY_BEGIN(value.driverName)), tcu::Format::HexIterator<char>(DE_ARRAY_END(value.driverName))) << '\n';
+ s << "\tdriverInfo = " << '\n' << tcu::formatArray(tcu::Format::HexIterator<char>(DE_ARRAY_BEGIN(value.driverInfo)), tcu::Format::HexIterator<char>(DE_ARRAY_END(value.driverInfo))) << '\n';
+ s << "\tconformanceVersion = " << value.conformanceVersion << '\n';
+ s << "\tdenormBehaviorIndependence = " << value.denormBehaviorIndependence << '\n';
+ s << "\troundingModeIndependence = " << value.roundingModeIndependence << '\n';
+ s << "\tshaderSignedZeroInfNanPreserveFloat16 = " << value.shaderSignedZeroInfNanPreserveFloat16 << '\n';
+ s << "\tshaderSignedZeroInfNanPreserveFloat32 = " << value.shaderSignedZeroInfNanPreserveFloat32 << '\n';
+ s << "\tshaderSignedZeroInfNanPreserveFloat64 = " << value.shaderSignedZeroInfNanPreserveFloat64 << '\n';
+ s << "\tshaderDenormPreserveFloat16 = " << value.shaderDenormPreserveFloat16 << '\n';
+ s << "\tshaderDenormPreserveFloat32 = " << value.shaderDenormPreserveFloat32 << '\n';
+ s << "\tshaderDenormPreserveFloat64 = " << value.shaderDenormPreserveFloat64 << '\n';
+ s << "\tshaderDenormFlushToZeroFloat16 = " << value.shaderDenormFlushToZeroFloat16 << '\n';
+ s << "\tshaderDenormFlushToZeroFloat32 = " << value.shaderDenormFlushToZeroFloat32 << '\n';
+ s << "\tshaderDenormFlushToZeroFloat64 = " << value.shaderDenormFlushToZeroFloat64 << '\n';
+ s << "\tshaderRoundingModeRTEFloat16 = " << value.shaderRoundingModeRTEFloat16 << '\n';
+ s << "\tshaderRoundingModeRTEFloat32 = " << value.shaderRoundingModeRTEFloat32 << '\n';
+ s << "\tshaderRoundingModeRTEFloat64 = " << value.shaderRoundingModeRTEFloat64 << '\n';
+ s << "\tshaderRoundingModeRTZFloat16 = " << value.shaderRoundingModeRTZFloat16 << '\n';
+ s << "\tshaderRoundingModeRTZFloat32 = " << value.shaderRoundingModeRTZFloat32 << '\n';
+ s << "\tshaderRoundingModeRTZFloat64 = " << value.shaderRoundingModeRTZFloat64 << '\n';
+ s << "\tmaxUpdateAfterBindDescriptorsInAllPools = " << value.maxUpdateAfterBindDescriptorsInAllPools << '\n';
+ s << "\tshaderUniformBufferArrayNonUniformIndexingNative = " << value.shaderUniformBufferArrayNonUniformIndexingNative << '\n';
+ s << "\tshaderSampledImageArrayNonUniformIndexingNative = " << value.shaderSampledImageArrayNonUniformIndexingNative << '\n';
+ s << "\tshaderStorageBufferArrayNonUniformIndexingNative = " << value.shaderStorageBufferArrayNonUniformIndexingNative << '\n';
+ s << "\tshaderStorageImageArrayNonUniformIndexingNative = " << value.shaderStorageImageArrayNonUniformIndexingNative << '\n';
+ s << "\tshaderInputAttachmentArrayNonUniformIndexingNative = " << value.shaderInputAttachmentArrayNonUniformIndexingNative << '\n';
+ s << "\trobustBufferAccessUpdateAfterBind = " << value.robustBufferAccessUpdateAfterBind << '\n';
+ s << "\tquadDivergentImplicitLod = " << value.quadDivergentImplicitLod << '\n';
+ s << "\tmaxPerStageDescriptorUpdateAfterBindSamplers = " << value.maxPerStageDescriptorUpdateAfterBindSamplers << '\n';
+ s << "\tmaxPerStageDescriptorUpdateAfterBindUniformBuffers = " << value.maxPerStageDescriptorUpdateAfterBindUniformBuffers << '\n';
+ s << "\tmaxPerStageDescriptorUpdateAfterBindStorageBuffers = " << value.maxPerStageDescriptorUpdateAfterBindStorageBuffers << '\n';
+ s << "\tmaxPerStageDescriptorUpdateAfterBindSampledImages = " << value.maxPerStageDescriptorUpdateAfterBindSampledImages << '\n';
+ s << "\tmaxPerStageDescriptorUpdateAfterBindStorageImages = " << value.maxPerStageDescriptorUpdateAfterBindStorageImages << '\n';
+ s << "\tmaxPerStageDescriptorUpdateAfterBindInputAttachments = " << value.maxPerStageDescriptorUpdateAfterBindInputAttachments << '\n';
+ s << "\tmaxPerStageUpdateAfterBindResources = " << value.maxPerStageUpdateAfterBindResources << '\n';
+ s << "\tmaxDescriptorSetUpdateAfterBindSamplers = " << value.maxDescriptorSetUpdateAfterBindSamplers << '\n';
+ s << "\tmaxDescriptorSetUpdateAfterBindUniformBuffers = " << value.maxDescriptorSetUpdateAfterBindUniformBuffers << '\n';
+ s << "\tmaxDescriptorSetUpdateAfterBindUniformBuffersDynamic = " << value.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic << '\n';
+ s << "\tmaxDescriptorSetUpdateAfterBindStorageBuffers = " << value.maxDescriptorSetUpdateAfterBindStorageBuffers << '\n';
+ s << "\tmaxDescriptorSetUpdateAfterBindStorageBuffersDynamic = " << value.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic << '\n';
+ s << "\tmaxDescriptorSetUpdateAfterBindSampledImages = " << value.maxDescriptorSetUpdateAfterBindSampledImages << '\n';
+ s << "\tmaxDescriptorSetUpdateAfterBindStorageImages = " << value.maxDescriptorSetUpdateAfterBindStorageImages << '\n';
+ s << "\tmaxDescriptorSetUpdateAfterBindInputAttachments = " << value.maxDescriptorSetUpdateAfterBindInputAttachments << '\n';
+ s << "\tsupportedDepthResolveModes = " << getResolveModeFlagsStr(value.supportedDepthResolveModes) << '\n';
+ s << "\tsupportedStencilResolveModes = " << getResolveModeFlagsStr(value.supportedStencilResolveModes) << '\n';
+ s << "\tindependentResolveNone = " << value.independentResolveNone << '\n';
+ s << "\tindependentResolve = " << value.independentResolve << '\n';
+ s << "\tfilterMinmaxSingleComponentFormats = " << value.filterMinmaxSingleComponentFormats << '\n';
+ s << "\tfilterMinmaxImageComponentMapping = " << value.filterMinmaxImageComponentMapping << '\n';
+ s << "\tmaxTimelineSemaphoreValueDifference = " << value.maxTimelineSemaphoreValueDifference << '\n';
+ s << "\tframebufferIntegerColorSampleCounts = " << getSampleCountFlagsStr(value.framebufferIntegerColorSampleCounts) << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkImageFormatListCreateInfo& value)
+{
+ s << "VkImageFormatListCreateInfo = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tviewFormatCount = " << value.viewFormatCount << '\n';
+ s << "\tpViewFormats = " << value.pViewFormats << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkAttachmentDescription2& value)
+{
+ s << "VkAttachmentDescription2 = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tflags = " << getAttachmentDescriptionFlagsStr(value.flags) << '\n';
+ s << "\tformat = " << value.format << '\n';
+ s << "\tsamples = " << value.samples << '\n';
+ s << "\tloadOp = " << value.loadOp << '\n';
+ s << "\tstoreOp = " << value.storeOp << '\n';
+ s << "\tstencilLoadOp = " << value.stencilLoadOp << '\n';
+ s << "\tstencilStoreOp = " << value.stencilStoreOp << '\n';
+ s << "\tinitialLayout = " << value.initialLayout << '\n';
+ s << "\tfinalLayout = " << value.finalLayout << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkAttachmentReference2& value)
+{
+ s << "VkAttachmentReference2 = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tattachment = " << value.attachment << '\n';
+ s << "\tlayout = " << value.layout << '\n';
+ s << "\taspectMask = " << getImageAspectFlagsStr(value.aspectMask) << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkSubpassDescription2& value)
+{
+ s << "VkSubpassDescription2 = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tflags = " << getSubpassDescriptionFlagsStr(value.flags) << '\n';
+ s << "\tpipelineBindPoint = " << value.pipelineBindPoint << '\n';
+ s << "\tviewMask = " << value.viewMask << '\n';
+ s << "\tinputAttachmentCount = " << value.inputAttachmentCount << '\n';
+ s << "\tpInputAttachments = " << value.pInputAttachments << '\n';
+ s << "\tcolorAttachmentCount = " << value.colorAttachmentCount << '\n';
+ s << "\tpColorAttachments = " << value.pColorAttachments << '\n';
+ s << "\tpResolveAttachments = " << value.pResolveAttachments << '\n';
+ s << "\tpDepthStencilAttachment = " << value.pDepthStencilAttachment << '\n';
+ s << "\tpreserveAttachmentCount = " << value.preserveAttachmentCount << '\n';
+ s << "\tpPreserveAttachments = " << value.pPreserveAttachments << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkSubpassDependency2& value)
+{
+ s << "VkSubpassDependency2 = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tsrcSubpass = " << value.srcSubpass << '\n';
+ s << "\tdstSubpass = " << value.dstSubpass << '\n';
+ s << "\tsrcStageMask = " << getPipelineStageFlagsStr(value.srcStageMask) << '\n';
+ s << "\tdstStageMask = " << getPipelineStageFlagsStr(value.dstStageMask) << '\n';
+ s << "\tsrcAccessMask = " << getAccessFlagsStr(value.srcAccessMask) << '\n';
+ s << "\tdstAccessMask = " << getAccessFlagsStr(value.dstAccessMask) << '\n';
+ s << "\tdependencyFlags = " << getDependencyFlagsStr(value.dependencyFlags) << '\n';
+ s << "\tviewOffset = " << value.viewOffset << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkRenderPassCreateInfo2& value)
+{
+ s << "VkRenderPassCreateInfo2 = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tflags = " << getRenderPassCreateFlagsStr(value.flags) << '\n';
+ s << "\tattachmentCount = " << value.attachmentCount << '\n';
+ s << "\tpAttachments = " << value.pAttachments << '\n';
+ s << "\tsubpassCount = " << value.subpassCount << '\n';
+ s << "\tpSubpasses = " << value.pSubpasses << '\n';
+ s << "\tdependencyCount = " << value.dependencyCount << '\n';
+ s << "\tpDependencies = " << value.pDependencies << '\n';
+ s << "\tcorrelatedViewMaskCount = " << value.correlatedViewMaskCount << '\n';
+ s << "\tpCorrelatedViewMasks = " << value.pCorrelatedViewMasks << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkSubpassBeginInfo& value)
+{
+ s << "VkSubpassBeginInfo = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tcontents = " << value.contents << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkSubpassEndInfo& value)
+{
+ s << "VkSubpassEndInfo = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDevice8BitStorageFeatures& value)
+{
+ s << "VkPhysicalDevice8BitStorageFeatures = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tstorageBuffer8BitAccess = " << value.storageBuffer8BitAccess << '\n';
+ s << "\tuniformAndStorageBuffer8BitAccess = " << value.uniformAndStorageBuffer8BitAccess << '\n';
+ s << "\tstoragePushConstant8 = " << value.storagePushConstant8 << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceDriverProperties& value)
+{
+ s << "VkPhysicalDeviceDriverProperties = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tdriverID = " << value.driverID << '\n';
+ s << "\tdriverName = " << '\n' << tcu::formatArray(tcu::Format::HexIterator<char>(DE_ARRAY_BEGIN(value.driverName)), tcu::Format::HexIterator<char>(DE_ARRAY_END(value.driverName))) << '\n';
+ s << "\tdriverInfo = " << '\n' << tcu::formatArray(tcu::Format::HexIterator<char>(DE_ARRAY_BEGIN(value.driverInfo)), tcu::Format::HexIterator<char>(DE_ARRAY_END(value.driverInfo))) << '\n';
+ s << "\tconformanceVersion = " << value.conformanceVersion << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderAtomicInt64Features& value)
+{
+ s << "VkPhysicalDeviceShaderAtomicInt64Features = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tshaderBufferInt64Atomics = " << value.shaderBufferInt64Atomics << '\n';
+ s << "\tshaderSharedInt64Atomics = " << value.shaderSharedInt64Atomics << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderFloat16Int8Features& value)
+{
+ s << "VkPhysicalDeviceShaderFloat16Int8Features = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tshaderFloat16 = " << value.shaderFloat16 << '\n';
+ s << "\tshaderInt8 = " << value.shaderInt8 << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceFloatControlsProperties& value)
+{
+ s << "VkPhysicalDeviceFloatControlsProperties = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tdenormBehaviorIndependence = " << value.denormBehaviorIndependence << '\n';
+ s << "\troundingModeIndependence = " << value.roundingModeIndependence << '\n';
+ s << "\tshaderSignedZeroInfNanPreserveFloat16 = " << value.shaderSignedZeroInfNanPreserveFloat16 << '\n';
+ s << "\tshaderSignedZeroInfNanPreserveFloat32 = " << value.shaderSignedZeroInfNanPreserveFloat32 << '\n';
+ s << "\tshaderSignedZeroInfNanPreserveFloat64 = " << value.shaderSignedZeroInfNanPreserveFloat64 << '\n';
+ s << "\tshaderDenormPreserveFloat16 = " << value.shaderDenormPreserveFloat16 << '\n';
+ s << "\tshaderDenormPreserveFloat32 = " << value.shaderDenormPreserveFloat32 << '\n';
+ s << "\tshaderDenormPreserveFloat64 = " << value.shaderDenormPreserveFloat64 << '\n';
+ s << "\tshaderDenormFlushToZeroFloat16 = " << value.shaderDenormFlushToZeroFloat16 << '\n';
+ s << "\tshaderDenormFlushToZeroFloat32 = " << value.shaderDenormFlushToZeroFloat32 << '\n';
+ s << "\tshaderDenormFlushToZeroFloat64 = " << value.shaderDenormFlushToZeroFloat64 << '\n';
+ s << "\tshaderRoundingModeRTEFloat16 = " << value.shaderRoundingModeRTEFloat16 << '\n';
+ s << "\tshaderRoundingModeRTEFloat32 = " << value.shaderRoundingModeRTEFloat32 << '\n';
+ s << "\tshaderRoundingModeRTEFloat64 = " << value.shaderRoundingModeRTEFloat64 << '\n';
+ s << "\tshaderRoundingModeRTZFloat16 = " << value.shaderRoundingModeRTZFloat16 << '\n';
+ s << "\tshaderRoundingModeRTZFloat32 = " << value.shaderRoundingModeRTZFloat32 << '\n';
+ s << "\tshaderRoundingModeRTZFloat64 = " << value.shaderRoundingModeRTZFloat64 << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkDescriptorSetLayoutBindingFlagsCreateInfo& value)
+{
+ s << "VkDescriptorSetLayoutBindingFlagsCreateInfo = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tbindingCount = " << value.bindingCount << '\n';
+ s << "\tpBindingFlags = " << value.pBindingFlags << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceDescriptorIndexingFeatures& value)
+{
+ s << "VkPhysicalDeviceDescriptorIndexingFeatures = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tshaderInputAttachmentArrayDynamicIndexing = " << value.shaderInputAttachmentArrayDynamicIndexing << '\n';
+ s << "\tshaderUniformTexelBufferArrayDynamicIndexing = " << value.shaderUniformTexelBufferArrayDynamicIndexing << '\n';
+ s << "\tshaderStorageTexelBufferArrayDynamicIndexing = " << value.shaderStorageTexelBufferArrayDynamicIndexing << '\n';
+ s << "\tshaderUniformBufferArrayNonUniformIndexing = " << value.shaderUniformBufferArrayNonUniformIndexing << '\n';
+ s << "\tshaderSampledImageArrayNonUniformIndexing = " << value.shaderSampledImageArrayNonUniformIndexing << '\n';
+ s << "\tshaderStorageBufferArrayNonUniformIndexing = " << value.shaderStorageBufferArrayNonUniformIndexing << '\n';
+ s << "\tshaderStorageImageArrayNonUniformIndexing = " << value.shaderStorageImageArrayNonUniformIndexing << '\n';
+ s << "\tshaderInputAttachmentArrayNonUniformIndexing = " << value.shaderInputAttachmentArrayNonUniformIndexing << '\n';
+ s << "\tshaderUniformTexelBufferArrayNonUniformIndexing = " << value.shaderUniformTexelBufferArrayNonUniformIndexing << '\n';
+ s << "\tshaderStorageTexelBufferArrayNonUniformIndexing = " << value.shaderStorageTexelBufferArrayNonUniformIndexing << '\n';
+ s << "\tdescriptorBindingUniformBufferUpdateAfterBind = " << value.descriptorBindingUniformBufferUpdateAfterBind << '\n';
+ s << "\tdescriptorBindingSampledImageUpdateAfterBind = " << value.descriptorBindingSampledImageUpdateAfterBind << '\n';
+ s << "\tdescriptorBindingStorageImageUpdateAfterBind = " << value.descriptorBindingStorageImageUpdateAfterBind << '\n';
+ s << "\tdescriptorBindingStorageBufferUpdateAfterBind = " << value.descriptorBindingStorageBufferUpdateAfterBind << '\n';
+ s << "\tdescriptorBindingUniformTexelBufferUpdateAfterBind = " << value.descriptorBindingUniformTexelBufferUpdateAfterBind << '\n';
+ s << "\tdescriptorBindingStorageTexelBufferUpdateAfterBind = " << value.descriptorBindingStorageTexelBufferUpdateAfterBind << '\n';
+ s << "\tdescriptorBindingUpdateUnusedWhilePending = " << value.descriptorBindingUpdateUnusedWhilePending << '\n';
+ s << "\tdescriptorBindingPartiallyBound = " << value.descriptorBindingPartiallyBound << '\n';
+ s << "\tdescriptorBindingVariableDescriptorCount = " << value.descriptorBindingVariableDescriptorCount << '\n';
+ s << "\truntimeDescriptorArray = " << value.runtimeDescriptorArray << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceDescriptorIndexingProperties& value)
+{
+ s << "VkPhysicalDeviceDescriptorIndexingProperties = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tmaxUpdateAfterBindDescriptorsInAllPools = " << value.maxUpdateAfterBindDescriptorsInAllPools << '\n';
+ s << "\tshaderUniformBufferArrayNonUniformIndexingNative = " << value.shaderUniformBufferArrayNonUniformIndexingNative << '\n';
+ s << "\tshaderSampledImageArrayNonUniformIndexingNative = " << value.shaderSampledImageArrayNonUniformIndexingNative << '\n';
+ s << "\tshaderStorageBufferArrayNonUniformIndexingNative = " << value.shaderStorageBufferArrayNonUniformIndexingNative << '\n';
+ s << "\tshaderStorageImageArrayNonUniformIndexingNative = " << value.shaderStorageImageArrayNonUniformIndexingNative << '\n';
+ s << "\tshaderInputAttachmentArrayNonUniformIndexingNative = " << value.shaderInputAttachmentArrayNonUniformIndexingNative << '\n';
+ s << "\trobustBufferAccessUpdateAfterBind = " << value.robustBufferAccessUpdateAfterBind << '\n';
+ s << "\tquadDivergentImplicitLod = " << value.quadDivergentImplicitLod << '\n';
+ s << "\tmaxPerStageDescriptorUpdateAfterBindSamplers = " << value.maxPerStageDescriptorUpdateAfterBindSamplers << '\n';
+ s << "\tmaxPerStageDescriptorUpdateAfterBindUniformBuffers = " << value.maxPerStageDescriptorUpdateAfterBindUniformBuffers << '\n';
+ s << "\tmaxPerStageDescriptorUpdateAfterBindStorageBuffers = " << value.maxPerStageDescriptorUpdateAfterBindStorageBuffers << '\n';
+ s << "\tmaxPerStageDescriptorUpdateAfterBindSampledImages = " << value.maxPerStageDescriptorUpdateAfterBindSampledImages << '\n';
+ s << "\tmaxPerStageDescriptorUpdateAfterBindStorageImages = " << value.maxPerStageDescriptorUpdateAfterBindStorageImages << '\n';
+ s << "\tmaxPerStageDescriptorUpdateAfterBindInputAttachments = " << value.maxPerStageDescriptorUpdateAfterBindInputAttachments << '\n';
+ s << "\tmaxPerStageUpdateAfterBindResources = " << value.maxPerStageUpdateAfterBindResources << '\n';
+ s << "\tmaxDescriptorSetUpdateAfterBindSamplers = " << value.maxDescriptorSetUpdateAfterBindSamplers << '\n';
+ s << "\tmaxDescriptorSetUpdateAfterBindUniformBuffers = " << value.maxDescriptorSetUpdateAfterBindUniformBuffers << '\n';
+ s << "\tmaxDescriptorSetUpdateAfterBindUniformBuffersDynamic = " << value.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic << '\n';
+ s << "\tmaxDescriptorSetUpdateAfterBindStorageBuffers = " << value.maxDescriptorSetUpdateAfterBindStorageBuffers << '\n';
+ s << "\tmaxDescriptorSetUpdateAfterBindStorageBuffersDynamic = " << value.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic << '\n';
+ s << "\tmaxDescriptorSetUpdateAfterBindSampledImages = " << value.maxDescriptorSetUpdateAfterBindSampledImages << '\n';
+ s << "\tmaxDescriptorSetUpdateAfterBindStorageImages = " << value.maxDescriptorSetUpdateAfterBindStorageImages << '\n';
+ s << "\tmaxDescriptorSetUpdateAfterBindInputAttachments = " << value.maxDescriptorSetUpdateAfterBindInputAttachments << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkDescriptorSetVariableDescriptorCountAllocateInfo& value)
+{
+ s << "VkDescriptorSetVariableDescriptorCountAllocateInfo = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tdescriptorSetCount = " << value.descriptorSetCount << '\n';
+ s << "\tpDescriptorCounts = " << value.pDescriptorCounts << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkDescriptorSetVariableDescriptorCountLayoutSupport& value)
+{
+ s << "VkDescriptorSetVariableDescriptorCountLayoutSupport = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tmaxVariableDescriptorCount = " << value.maxVariableDescriptorCount << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkSubpassDescriptionDepthStencilResolve& value)
+{
+ s << "VkSubpassDescriptionDepthStencilResolve = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tdepthResolveMode = " << value.depthResolveMode << '\n';
+ s << "\tstencilResolveMode = " << value.stencilResolveMode << '\n';
+ s << "\tpDepthStencilResolveAttachment = " << value.pDepthStencilResolveAttachment << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceDepthStencilResolveProperties& value)
+{
+ s << "VkPhysicalDeviceDepthStencilResolveProperties = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tsupportedDepthResolveModes = " << getResolveModeFlagsStr(value.supportedDepthResolveModes) << '\n';
+ s << "\tsupportedStencilResolveModes = " << getResolveModeFlagsStr(value.supportedStencilResolveModes) << '\n';
+ s << "\tindependentResolveNone = " << value.independentResolveNone << '\n';
+ s << "\tindependentResolve = " << value.independentResolve << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceScalarBlockLayoutFeatures& value)
+{
+ s << "VkPhysicalDeviceScalarBlockLayoutFeatures = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tscalarBlockLayout = " << value.scalarBlockLayout << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkImageStencilUsageCreateInfo& value)
+{
+ s << "VkImageStencilUsageCreateInfo = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tstencilUsage = " << getImageUsageFlagsStr(value.stencilUsage) << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkSamplerReductionModeCreateInfo& value)
+{
+ s << "VkSamplerReductionModeCreateInfo = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\treductionMode = " << value.reductionMode << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceSamplerFilterMinmaxProperties& value)
+{
+ s << "VkPhysicalDeviceSamplerFilterMinmaxProperties = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tfilterMinmaxSingleComponentFormats = " << value.filterMinmaxSingleComponentFormats << '\n';
+ s << "\tfilterMinmaxImageComponentMapping = " << value.filterMinmaxImageComponentMapping << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceVulkanMemoryModelFeatures& value)
+{
+ s << "VkPhysicalDeviceVulkanMemoryModelFeatures = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tvulkanMemoryModel = " << value.vulkanMemoryModel << '\n';
+ s << "\tvulkanMemoryModelDeviceScope = " << value.vulkanMemoryModelDeviceScope << '\n';
+ s << "\tvulkanMemoryModelAvailabilityVisibilityChains = " << value.vulkanMemoryModelAvailabilityVisibilityChains << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceImagelessFramebufferFeatures& value)
+{
+ s << "VkPhysicalDeviceImagelessFramebufferFeatures = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\timagelessFramebuffer = " << value.imagelessFramebuffer << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkFramebufferAttachmentImageInfo& value)
+{
+ s << "VkFramebufferAttachmentImageInfo = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tflags = " << getImageCreateFlagsStr(value.flags) << '\n';
+ s << "\tusage = " << getImageUsageFlagsStr(value.usage) << '\n';
+ s << "\twidth = " << value.width << '\n';
+ s << "\theight = " << value.height << '\n';
+ s << "\tlayerCount = " << value.layerCount << '\n';
+ s << "\tviewFormatCount = " << value.viewFormatCount << '\n';
+ s << "\tpViewFormats = " << value.pViewFormats << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkFramebufferAttachmentsCreateInfo& value)
+{
+ s << "VkFramebufferAttachmentsCreateInfo = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tattachmentImageInfoCount = " << value.attachmentImageInfoCount << '\n';
+ s << "\tpAttachmentImageInfos = " << value.pAttachmentImageInfos << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkRenderPassAttachmentBeginInfo& value)
+{
+ s << "VkRenderPassAttachmentBeginInfo = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tattachmentCount = " << value.attachmentCount << '\n';
+ s << "\tpAttachments = " << value.pAttachments << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceUniformBufferStandardLayoutFeatures& value)
+{
+ s << "VkPhysicalDeviceUniformBufferStandardLayoutFeatures = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tuniformBufferStandardLayout = " << value.uniformBufferStandardLayout << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures& value)
+{
+ s << "VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tshaderSubgroupExtendedTypes = " << value.shaderSubgroupExtendedTypes << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures& value)
+{
+ s << "VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tseparateDepthStencilLayouts = " << value.separateDepthStencilLayouts << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkAttachmentReferenceStencilLayout& value)
+{
+ s << "VkAttachmentReferenceStencilLayout = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tstencilLayout = " << value.stencilLayout << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkAttachmentDescriptionStencilLayout& value)
+{
+ s << "VkAttachmentDescriptionStencilLayout = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tstencilInitialLayout = " << value.stencilInitialLayout << '\n';
+ s << "\tstencilFinalLayout = " << value.stencilFinalLayout << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceHostQueryResetFeatures& value)
+{
+ s << "VkPhysicalDeviceHostQueryResetFeatures = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\thostQueryReset = " << value.hostQueryReset << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceTimelineSemaphoreFeatures& value)
+{
+ s << "VkPhysicalDeviceTimelineSemaphoreFeatures = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\ttimelineSemaphore = " << value.timelineSemaphore << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceTimelineSemaphoreProperties& value)
+{
+ s << "VkPhysicalDeviceTimelineSemaphoreProperties = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tmaxTimelineSemaphoreValueDifference = " << value.maxTimelineSemaphoreValueDifference << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkSemaphoreTypeCreateInfo& value)
+{
+ s << "VkSemaphoreTypeCreateInfo = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tsemaphoreType = " << value.semaphoreType << '\n';
+ s << "\tinitialValue = " << value.initialValue << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkTimelineSemaphoreSubmitInfo& value)
+{
+ s << "VkTimelineSemaphoreSubmitInfo = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\twaitSemaphoreValueCount = " << value.waitSemaphoreValueCount << '\n';
+ s << "\tpWaitSemaphoreValues = " << value.pWaitSemaphoreValues << '\n';
+ s << "\tsignalSemaphoreValueCount = " << value.signalSemaphoreValueCount << '\n';
+ s << "\tpSignalSemaphoreValues = " << value.pSignalSemaphoreValues << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkSemaphoreWaitInfo& value)
+{
+ s << "VkSemaphoreWaitInfo = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tflags = " << getSemaphoreWaitFlagsStr(value.flags) << '\n';
+ s << "\tsemaphoreCount = " << value.semaphoreCount << '\n';
+ s << "\tpSemaphores = " << value.pSemaphores << '\n';
+ s << "\tpValues = " << value.pValues << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkSemaphoreSignalInfo& value)
+{
+ s << "VkSemaphoreSignalInfo = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tsemaphore = " << value.semaphore << '\n';
+ s << "\tvalue = " << value.value << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceBufferDeviceAddressFeatures& value)
+{
+ s << "VkPhysicalDeviceBufferDeviceAddressFeatures = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tbufferDeviceAddress = " << value.bufferDeviceAddress << '\n';
+ s << "\tbufferDeviceAddressCaptureReplay = " << value.bufferDeviceAddressCaptureReplay << '\n';
+ s << "\tbufferDeviceAddressMultiDevice = " << value.bufferDeviceAddressMultiDevice << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkBufferDeviceAddressInfo& value)
+{
+ s << "VkBufferDeviceAddressInfo = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tbuffer = " << value.buffer << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkBufferOpaqueCaptureAddressCreateInfo& value)
+{
+ s << "VkBufferOpaqueCaptureAddressCreateInfo = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\topaqueCaptureAddress = " << value.opaqueCaptureAddress << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkMemoryOpaqueCaptureAddressAllocateInfo& value)
+{
+ s << "VkMemoryOpaqueCaptureAddressAllocateInfo = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\topaqueCaptureAddress = " << value.opaqueCaptureAddress << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkDeviceMemoryOpaqueCaptureAddressInfo& value)
+{
+ s << "VkDeviceMemoryOpaqueCaptureAddressInfo = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tmemory = " << value.memory << '\n';
+ s << '}';
+ return s;
+}
+
std::ostream& operator<< (std::ostream& s, const VkSurfaceCapabilitiesKHR& value)
{
s << "VkSurfaceCapabilitiesKHR = {\n";
@@ -5726,17 +6755,6 @@
return s;
}
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceFloat16Int8FeaturesKHR& value)
-{
- s << "VkPhysicalDeviceFloat16Int8FeaturesKHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tshaderFloat16 = " << value.shaderFloat16 << '\n';
- s << "\tshaderInt8 = " << value.shaderInt8 << '\n';
- s << '}';
- return s;
-}
-
std::ostream& operator<< (std::ostream& s, const VkRectLayerKHR& value)
{
s << "VkRectLayerKHR = {\n";
@@ -5767,158 +6785,6 @@
return s;
}
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceImagelessFramebufferFeaturesKHR& value)
-{
- s << "VkPhysicalDeviceImagelessFramebufferFeaturesKHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\timagelessFramebuffer = " << value.imagelessFramebuffer << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkFramebufferAttachmentImageInfoKHR& value)
-{
- s << "VkFramebufferAttachmentImageInfoKHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tflags = " << getImageCreateFlagsStr(value.flags) << '\n';
- s << "\tusage = " << getImageUsageFlagsStr(value.usage) << '\n';
- s << "\twidth = " << value.width << '\n';
- s << "\theight = " << value.height << '\n';
- s << "\tlayerCount = " << value.layerCount << '\n';
- s << "\tviewFormatCount = " << value.viewFormatCount << '\n';
- s << "\tpViewFormats = " << value.pViewFormats << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkFramebufferAttachmentsCreateInfoKHR& value)
-{
- s << "VkFramebufferAttachmentsCreateInfoKHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tattachmentImageInfoCount = " << value.attachmentImageInfoCount << '\n';
- s << "\tpAttachmentImageInfos = " << value.pAttachmentImageInfos << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkRenderPassAttachmentBeginInfoKHR& value)
-{
- s << "VkRenderPassAttachmentBeginInfoKHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tattachmentCount = " << value.attachmentCount << '\n';
- s << "\tpAttachments = " << value.pAttachments << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkAttachmentDescription2KHR& value)
-{
- s << "VkAttachmentDescription2KHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tflags = " << getAttachmentDescriptionFlagsStr(value.flags) << '\n';
- s << "\tformat = " << value.format << '\n';
- s << "\tsamples = " << value.samples << '\n';
- s << "\tloadOp = " << value.loadOp << '\n';
- s << "\tstoreOp = " << value.storeOp << '\n';
- s << "\tstencilLoadOp = " << value.stencilLoadOp << '\n';
- s << "\tstencilStoreOp = " << value.stencilStoreOp << '\n';
- s << "\tinitialLayout = " << value.initialLayout << '\n';
- s << "\tfinalLayout = " << value.finalLayout << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkAttachmentReference2KHR& value)
-{
- s << "VkAttachmentReference2KHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tattachment = " << value.attachment << '\n';
- s << "\tlayout = " << value.layout << '\n';
- s << "\taspectMask = " << getImageAspectFlagsStr(value.aspectMask) << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkSubpassDescription2KHR& value)
-{
- s << "VkSubpassDescription2KHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tflags = " << getSubpassDescriptionFlagsStr(value.flags) << '\n';
- s << "\tpipelineBindPoint = " << value.pipelineBindPoint << '\n';
- s << "\tviewMask = " << value.viewMask << '\n';
- s << "\tinputAttachmentCount = " << value.inputAttachmentCount << '\n';
- s << "\tpInputAttachments = " << value.pInputAttachments << '\n';
- s << "\tcolorAttachmentCount = " << value.colorAttachmentCount << '\n';
- s << "\tpColorAttachments = " << value.pColorAttachments << '\n';
- s << "\tpResolveAttachments = " << value.pResolveAttachments << '\n';
- s << "\tpDepthStencilAttachment = " << value.pDepthStencilAttachment << '\n';
- s << "\tpreserveAttachmentCount = " << value.preserveAttachmentCount << '\n';
- s << "\tpPreserveAttachments = " << value.pPreserveAttachments << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkSubpassDependency2KHR& value)
-{
- s << "VkSubpassDependency2KHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tsrcSubpass = " << value.srcSubpass << '\n';
- s << "\tdstSubpass = " << value.dstSubpass << '\n';
- s << "\tsrcStageMask = " << getPipelineStageFlagsStr(value.srcStageMask) << '\n';
- s << "\tdstStageMask = " << getPipelineStageFlagsStr(value.dstStageMask) << '\n';
- s << "\tsrcAccessMask = " << getAccessFlagsStr(value.srcAccessMask) << '\n';
- s << "\tdstAccessMask = " << getAccessFlagsStr(value.dstAccessMask) << '\n';
- s << "\tdependencyFlags = " << getDependencyFlagsStr(value.dependencyFlags) << '\n';
- s << "\tviewOffset = " << value.viewOffset << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkRenderPassCreateInfo2KHR& value)
-{
- s << "VkRenderPassCreateInfo2KHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tflags = " << getRenderPassCreateFlagsStr(value.flags) << '\n';
- s << "\tattachmentCount = " << value.attachmentCount << '\n';
- s << "\tpAttachments = " << value.pAttachments << '\n';
- s << "\tsubpassCount = " << value.subpassCount << '\n';
- s << "\tpSubpasses = " << value.pSubpasses << '\n';
- s << "\tdependencyCount = " << value.dependencyCount << '\n';
- s << "\tpDependencies = " << value.pDependencies << '\n';
- s << "\tcorrelatedViewMaskCount = " << value.correlatedViewMaskCount << '\n';
- s << "\tpCorrelatedViewMasks = " << value.pCorrelatedViewMasks << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkSubpassBeginInfoKHR& value)
-{
- s << "VkSubpassBeginInfoKHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tcontents = " << value.contents << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkSubpassEndInfoKHR& value)
-{
- s << "VkSubpassEndInfoKHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << '}';
- return s;
-}
-
std::ostream& operator<< (std::ostream& s, const VkSharedPresentSurfaceCapabilitiesKHR& value)
{
s << "VkSharedPresentSurfaceCapabilitiesKHR = {\n";
@@ -5953,6 +6819,99 @@
return s;
}
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDevicePerformanceQueryFeaturesKHR& value)
+{
+ s << "VkPhysicalDevicePerformanceQueryFeaturesKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tperformanceCounterQueryPools = " << value.performanceCounterQueryPools << '\n';
+ s << "\tperformanceCounterMultipleQueryPools = " << value.performanceCounterMultipleQueryPools << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDevicePerformanceQueryPropertiesKHR& value)
+{
+ s << "VkPhysicalDevicePerformanceQueryPropertiesKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tallowCommandBufferQueryCopies = " << value.allowCommandBufferQueryCopies << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPerformanceCounterKHR& value)
+{
+ s << "VkPerformanceCounterKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tunit = " << value.unit << '\n';
+ s << "\tscope = " << value.scope << '\n';
+ s << "\tstorage = " << value.storage << '\n';
+ s << "\tuuid = " << '\n' << tcu::formatArray(tcu::Format::HexIterator<deUint8>(DE_ARRAY_BEGIN(value.uuid)), tcu::Format::HexIterator<deUint8>(DE_ARRAY_END(value.uuid))) << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPerformanceCounterDescriptionKHR& value)
+{
+ s << "VkPerformanceCounterDescriptionKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tflags = " << getPerformanceCounterDescriptionFlagsKHRStr(value.flags) << '\n';
+ s << "\tname = " << '\n' << tcu::formatArray(tcu::Format::HexIterator<char>(DE_ARRAY_BEGIN(value.name)), tcu::Format::HexIterator<char>(DE_ARRAY_END(value.name))) << '\n';
+ s << "\tcategory = " << '\n' << tcu::formatArray(tcu::Format::HexIterator<char>(DE_ARRAY_BEGIN(value.category)), tcu::Format::HexIterator<char>(DE_ARRAY_END(value.category))) << '\n';
+ s << "\tdescription = " << (const char*)value.description << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkQueryPoolPerformanceCreateInfoKHR& value)
+{
+ s << "VkQueryPoolPerformanceCreateInfoKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tqueueFamilyIndex = " << value.queueFamilyIndex << '\n';
+ s << "\tcounterIndexCount = " << value.counterIndexCount << '\n';
+ s << "\tpCounterIndices = " << value.pCounterIndices << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPerformanceCounterResultKHR& value)
+{
+ s << "VkPerformanceCounterResultKHR = {\n";
+ s << "\tint32 = " << value.int32 << '\n';
+ s << "\tint64 = " << value.int64 << '\n';
+ s << "\tuint32 = " << value.uint32 << '\n';
+ s << "\tuint64 = " << value.uint64 << '\n';
+ s << "\tfloat32 = " << value.float32 << '\n';
+ s << "\tfloat64 = " << value.float64 << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkAcquireProfilingLockInfoKHR& value)
+{
+ s << "VkAcquireProfilingLockInfoKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tflags = " << getAcquireProfilingLockFlagsKHRStr(value.flags) << '\n';
+ s << "\ttimeout = " << value.timeout << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPerformanceQuerySubmitInfoKHR& value)
+{
+ s << "VkPerformanceQuerySubmitInfoKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tcounterPassIndex = " << value.counterPassIndex << '\n';
+ s << '}';
+ return s;
+}
+
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceSurfaceInfo2KHR& value)
{
s << "VkPhysicalDeviceSurfaceInfo2KHR = {\n";
@@ -6034,127 +6993,6 @@
return s;
}
-std::ostream& operator<< (std::ostream& s, const VkImageFormatListCreateInfoKHR& value)
-{
- s << "VkImageFormatListCreateInfoKHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tviewFormatCount = " << value.viewFormatCount << '\n';
- s << "\tpViewFormats = " << value.pViewFormats << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDevice8BitStorageFeaturesKHR& value)
-{
- s << "VkPhysicalDevice8BitStorageFeaturesKHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tstorageBuffer8BitAccess = " << value.storageBuffer8BitAccess << '\n';
- s << "\tuniformAndStorageBuffer8BitAccess = " << value.uniformAndStorageBuffer8BitAccess << '\n';
- s << "\tstoragePushConstant8 = " << value.storagePushConstant8 << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderAtomicInt64FeaturesKHR& value)
-{
- s << "VkPhysicalDeviceShaderAtomicInt64FeaturesKHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tshaderBufferInt64Atomics = " << value.shaderBufferInt64Atomics << '\n';
- s << "\tshaderSharedInt64Atomics = " << value.shaderSharedInt64Atomics << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkConformanceVersionKHR& value)
-{
- s << "VkConformanceVersionKHR = {\n";
- s << "\tmajor = " << value.major << '\n';
- s << "\tminor = " << value.minor << '\n';
- s << "\tsubminor = " << value.subminor << '\n';
- s << "\tpatch = " << value.patch << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceDriverPropertiesKHR& value)
-{
- s << "VkPhysicalDeviceDriverPropertiesKHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tdriverID = " << value.driverID << '\n';
- s << "\tdriverName = " << '\n' << tcu::formatArray(tcu::Format::HexIterator<char>(DE_ARRAY_BEGIN(value.driverName)), tcu::Format::HexIterator<char>(DE_ARRAY_END(value.driverName))) << '\n';
- s << "\tdriverInfo = " << '\n' << tcu::formatArray(tcu::Format::HexIterator<char>(DE_ARRAY_BEGIN(value.driverInfo)), tcu::Format::HexIterator<char>(DE_ARRAY_END(value.driverInfo))) << '\n';
- s << "\tconformanceVersion = " << value.conformanceVersion << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceFloatControlsPropertiesKHR& value)
-{
- s << "VkPhysicalDeviceFloatControlsPropertiesKHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tseparateDenormSettings = " << value.separateDenormSettings << '\n';
- s << "\tseparateRoundingModeSettings = " << value.separateRoundingModeSettings << '\n';
- s << "\tshaderSignedZeroInfNanPreserveFloat16 = " << value.shaderSignedZeroInfNanPreserveFloat16 << '\n';
- s << "\tshaderSignedZeroInfNanPreserveFloat32 = " << value.shaderSignedZeroInfNanPreserveFloat32 << '\n';
- s << "\tshaderSignedZeroInfNanPreserveFloat64 = " << value.shaderSignedZeroInfNanPreserveFloat64 << '\n';
- s << "\tshaderDenormPreserveFloat16 = " << value.shaderDenormPreserveFloat16 << '\n';
- s << "\tshaderDenormPreserveFloat32 = " << value.shaderDenormPreserveFloat32 << '\n';
- s << "\tshaderDenormPreserveFloat64 = " << value.shaderDenormPreserveFloat64 << '\n';
- s << "\tshaderDenormFlushToZeroFloat16 = " << value.shaderDenormFlushToZeroFloat16 << '\n';
- s << "\tshaderDenormFlushToZeroFloat32 = " << value.shaderDenormFlushToZeroFloat32 << '\n';
- s << "\tshaderDenormFlushToZeroFloat64 = " << value.shaderDenormFlushToZeroFloat64 << '\n';
- s << "\tshaderRoundingModeRTEFloat16 = " << value.shaderRoundingModeRTEFloat16 << '\n';
- s << "\tshaderRoundingModeRTEFloat32 = " << value.shaderRoundingModeRTEFloat32 << '\n';
- s << "\tshaderRoundingModeRTEFloat64 = " << value.shaderRoundingModeRTEFloat64 << '\n';
- s << "\tshaderRoundingModeRTZFloat16 = " << value.shaderRoundingModeRTZFloat16 << '\n';
- s << "\tshaderRoundingModeRTZFloat32 = " << value.shaderRoundingModeRTZFloat32 << '\n';
- s << "\tshaderRoundingModeRTZFloat64 = " << value.shaderRoundingModeRTZFloat64 << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkSubpassDescriptionDepthStencilResolveKHR& value)
-{
- s << "VkSubpassDescriptionDepthStencilResolveKHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tdepthResolveMode = " << value.depthResolveMode << '\n';
- s << "\tstencilResolveMode = " << value.stencilResolveMode << '\n';
- s << "\tpDepthStencilResolveAttachment = " << value.pDepthStencilResolveAttachment << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceDepthStencilResolvePropertiesKHR& value)
-{
- s << "VkPhysicalDeviceDepthStencilResolvePropertiesKHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tsupportedDepthResolveModes = " << getResolveModeFlagsKHRStr(value.supportedDepthResolveModes) << '\n';
- s << "\tsupportedStencilResolveModes = " << getResolveModeFlagsKHRStr(value.supportedStencilResolveModes) << '\n';
- s << "\tindependentResolveNone = " << value.independentResolveNone << '\n';
- s << "\tindependentResolve = " << value.independentResolve << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceVulkanMemoryModelFeaturesKHR& value)
-{
- s << "VkPhysicalDeviceVulkanMemoryModelFeaturesKHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tvulkanMemoryModel = " << value.vulkanMemoryModel << '\n';
- s << "\tvulkanMemoryModelDeviceScope = " << value.vulkanMemoryModelDeviceScope << '\n';
- s << "\tvulkanMemoryModelAvailabilityVisibilityChains = " << value.vulkanMemoryModelAvailabilityVisibilityChains << '\n';
- s << '}';
- return s;
-}
-
std::ostream& operator<< (std::ostream& s, const VkSurfaceProtectedCapabilitiesKHR& value)
{
s << "VkSurfaceProtectedCapabilitiesKHR = {\n";
@@ -6165,16 +7003,6 @@
return s;
}
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR& value)
-{
- s << "VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tuniformBufferStandardLayout = " << value.uniformBufferStandardLayout << '\n';
- s << '}';
- return s;
-}
-
std::ostream& operator<< (std::ostream& s, const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR& value)
{
s << "VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR = {\n";
@@ -6257,74 +7085,6 @@
return s;
}
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceTimelineSemaphoreFeaturesKHR& value)
-{
- s << "VkPhysicalDeviceTimelineSemaphoreFeaturesKHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\ttimelineSemaphore = " << value.timelineSemaphore << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceTimelineSemaphorePropertiesKHR& value)
-{
- s << "VkPhysicalDeviceTimelineSemaphorePropertiesKHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tmaxTimelineSemaphoreValueDifference = " << value.maxTimelineSemaphoreValueDifference << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkSemaphoreTypeCreateInfoKHR& value)
-{
- s << "VkSemaphoreTypeCreateInfoKHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tsemaphoreType = " << value.semaphoreType << '\n';
- s << "\tinitialValue = " << value.initialValue << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkTimelineSemaphoreSubmitInfoKHR& value)
-{
- s << "VkTimelineSemaphoreSubmitInfoKHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\twaitSemaphoreValueCount = " << value.waitSemaphoreValueCount << '\n';
- s << "\tpWaitSemaphoreValues = " << value.pWaitSemaphoreValues << '\n';
- s << "\tsignalSemaphoreValueCount = " << value.signalSemaphoreValueCount << '\n';
- s << "\tpSignalSemaphoreValues = " << value.pSignalSemaphoreValues << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkSemaphoreWaitInfoKHR& value)
-{
- s << "VkSemaphoreWaitInfoKHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tflags = " << getSemaphoreWaitFlagsKHRStr(value.flags) << '\n';
- s << "\tsemaphoreCount = " << value.semaphoreCount << '\n';
- s << "\tpSemaphores = " << value.pSemaphores << '\n';
- s << "\tpValues = " << value.pValues << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkSemaphoreSignalInfoKHR& value)
-{
- s << "VkSemaphoreSignalInfoKHR = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tsemaphore = " << value.semaphore << '\n';
- s << "\tvalue = " << value.value << '\n';
- s << '}';
- return s;
-}
-
std::ostream& operator<< (std::ostream& s, const VkDebugReportCallbackCreateInfoEXT& value)
{
s << "VkDebugReportCallbackCreateInfoEXT = {\n";
@@ -6556,6 +7316,16 @@
return s;
}
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT& value)
+{
+ s << "VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\ttextureCompressionASTC_HDR = " << value.textureCompressionASTC_HDR << '\n';
+ s << '}';
+ return s;
+}
+
std::ostream& operator<< (std::ostream& s, const VkImageViewASTCDecodeModeEXT& value)
{
s << "VkImageViewASTCDecodeModeEXT = {\n";
@@ -7102,27 +7872,6 @@
return s;
}
-std::ostream& operator<< (std::ostream& s, const VkSamplerReductionModeCreateInfoEXT& value)
-{
- s << "VkSamplerReductionModeCreateInfoEXT = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\treductionMode = " << value.reductionMode << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT& value)
-{
- s << "VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tfilterMinmaxSingleComponentFormats = " << value.filterMinmaxSingleComponentFormats << '\n';
- s << "\tfilterMinmaxImageComponentMapping = " << value.filterMinmaxImageComponentMapping << '\n';
- s << '}';
- return s;
-}
-
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceInlineUniformBlockFeaturesEXT& value)
{
s << "VkPhysicalDeviceInlineUniformBlockFeaturesEXT = {\n";
@@ -7320,6 +8069,27 @@
return s;
}
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV& value)
+{
+ s << "VkPhysicalDeviceShaderSMBuiltinsPropertiesNV = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tshaderSMCount = " << value.shaderSMCount << '\n';
+ s << "\tshaderWarpsPerSM = " << value.shaderWarpsPerSM << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV& value)
+{
+ s << "VkPhysicalDeviceShaderSMBuiltinsFeaturesNV = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tshaderSMBuiltins = " << value.shaderSMBuiltins << '\n';
+ s << '}';
+ return s;
+}
+
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderClockFeaturesKHR& value)
{
s << "VkPhysicalDeviceShaderClockFeaturesKHR = {\n";
@@ -7420,99 +8190,6 @@
return s;
}
-std::ostream& operator<< (std::ostream& s, const VkDescriptorSetLayoutBindingFlagsCreateInfoEXT& value)
-{
- s << "VkDescriptorSetLayoutBindingFlagsCreateInfoEXT = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tbindingCount = " << value.bindingCount << '\n';
- s << "\tpBindingFlags = " << value.pBindingFlags << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceDescriptorIndexingFeaturesEXT& value)
-{
- s << "VkPhysicalDeviceDescriptorIndexingFeaturesEXT = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tshaderInputAttachmentArrayDynamicIndexing = " << value.shaderInputAttachmentArrayDynamicIndexing << '\n';
- s << "\tshaderUniformTexelBufferArrayDynamicIndexing = " << value.shaderUniformTexelBufferArrayDynamicIndexing << '\n';
- s << "\tshaderStorageTexelBufferArrayDynamicIndexing = " << value.shaderStorageTexelBufferArrayDynamicIndexing << '\n';
- s << "\tshaderUniformBufferArrayNonUniformIndexing = " << value.shaderUniformBufferArrayNonUniformIndexing << '\n';
- s << "\tshaderSampledImageArrayNonUniformIndexing = " << value.shaderSampledImageArrayNonUniformIndexing << '\n';
- s << "\tshaderStorageBufferArrayNonUniformIndexing = " << value.shaderStorageBufferArrayNonUniformIndexing << '\n';
- s << "\tshaderStorageImageArrayNonUniformIndexing = " << value.shaderStorageImageArrayNonUniformIndexing << '\n';
- s << "\tshaderInputAttachmentArrayNonUniformIndexing = " << value.shaderInputAttachmentArrayNonUniformIndexing << '\n';
- s << "\tshaderUniformTexelBufferArrayNonUniformIndexing = " << value.shaderUniformTexelBufferArrayNonUniformIndexing << '\n';
- s << "\tshaderStorageTexelBufferArrayNonUniformIndexing = " << value.shaderStorageTexelBufferArrayNonUniformIndexing << '\n';
- s << "\tdescriptorBindingUniformBufferUpdateAfterBind = " << value.descriptorBindingUniformBufferUpdateAfterBind << '\n';
- s << "\tdescriptorBindingSampledImageUpdateAfterBind = " << value.descriptorBindingSampledImageUpdateAfterBind << '\n';
- s << "\tdescriptorBindingStorageImageUpdateAfterBind = " << value.descriptorBindingStorageImageUpdateAfterBind << '\n';
- s << "\tdescriptorBindingStorageBufferUpdateAfterBind = " << value.descriptorBindingStorageBufferUpdateAfterBind << '\n';
- s << "\tdescriptorBindingUniformTexelBufferUpdateAfterBind = " << value.descriptorBindingUniformTexelBufferUpdateAfterBind << '\n';
- s << "\tdescriptorBindingStorageTexelBufferUpdateAfterBind = " << value.descriptorBindingStorageTexelBufferUpdateAfterBind << '\n';
- s << "\tdescriptorBindingUpdateUnusedWhilePending = " << value.descriptorBindingUpdateUnusedWhilePending << '\n';
- s << "\tdescriptorBindingPartiallyBound = " << value.descriptorBindingPartiallyBound << '\n';
- s << "\tdescriptorBindingVariableDescriptorCount = " << value.descriptorBindingVariableDescriptorCount << '\n';
- s << "\truntimeDescriptorArray = " << value.runtimeDescriptorArray << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceDescriptorIndexingPropertiesEXT& value)
-{
- s << "VkPhysicalDeviceDescriptorIndexingPropertiesEXT = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tmaxUpdateAfterBindDescriptorsInAllPools = " << value.maxUpdateAfterBindDescriptorsInAllPools << '\n';
- s << "\tshaderUniformBufferArrayNonUniformIndexingNative = " << value.shaderUniformBufferArrayNonUniformIndexingNative << '\n';
- s << "\tshaderSampledImageArrayNonUniformIndexingNative = " << value.shaderSampledImageArrayNonUniformIndexingNative << '\n';
- s << "\tshaderStorageBufferArrayNonUniformIndexingNative = " << value.shaderStorageBufferArrayNonUniformIndexingNative << '\n';
- s << "\tshaderStorageImageArrayNonUniformIndexingNative = " << value.shaderStorageImageArrayNonUniformIndexingNative << '\n';
- s << "\tshaderInputAttachmentArrayNonUniformIndexingNative = " << value.shaderInputAttachmentArrayNonUniformIndexingNative << '\n';
- s << "\trobustBufferAccessUpdateAfterBind = " << value.robustBufferAccessUpdateAfterBind << '\n';
- s << "\tquadDivergentImplicitLod = " << value.quadDivergentImplicitLod << '\n';
- s << "\tmaxPerStageDescriptorUpdateAfterBindSamplers = " << value.maxPerStageDescriptorUpdateAfterBindSamplers << '\n';
- s << "\tmaxPerStageDescriptorUpdateAfterBindUniformBuffers = " << value.maxPerStageDescriptorUpdateAfterBindUniformBuffers << '\n';
- s << "\tmaxPerStageDescriptorUpdateAfterBindStorageBuffers = " << value.maxPerStageDescriptorUpdateAfterBindStorageBuffers << '\n';
- s << "\tmaxPerStageDescriptorUpdateAfterBindSampledImages = " << value.maxPerStageDescriptorUpdateAfterBindSampledImages << '\n';
- s << "\tmaxPerStageDescriptorUpdateAfterBindStorageImages = " << value.maxPerStageDescriptorUpdateAfterBindStorageImages << '\n';
- s << "\tmaxPerStageDescriptorUpdateAfterBindInputAttachments = " << value.maxPerStageDescriptorUpdateAfterBindInputAttachments << '\n';
- s << "\tmaxPerStageUpdateAfterBindResources = " << value.maxPerStageUpdateAfterBindResources << '\n';
- s << "\tmaxDescriptorSetUpdateAfterBindSamplers = " << value.maxDescriptorSetUpdateAfterBindSamplers << '\n';
- s << "\tmaxDescriptorSetUpdateAfterBindUniformBuffers = " << value.maxDescriptorSetUpdateAfterBindUniformBuffers << '\n';
- s << "\tmaxDescriptorSetUpdateAfterBindUniformBuffersDynamic = " << value.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic << '\n';
- s << "\tmaxDescriptorSetUpdateAfterBindStorageBuffers = " << value.maxDescriptorSetUpdateAfterBindStorageBuffers << '\n';
- s << "\tmaxDescriptorSetUpdateAfterBindStorageBuffersDynamic = " << value.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic << '\n';
- s << "\tmaxDescriptorSetUpdateAfterBindSampledImages = " << value.maxDescriptorSetUpdateAfterBindSampledImages << '\n';
- s << "\tmaxDescriptorSetUpdateAfterBindStorageImages = " << value.maxDescriptorSetUpdateAfterBindStorageImages << '\n';
- s << "\tmaxDescriptorSetUpdateAfterBindInputAttachments = " << value.maxDescriptorSetUpdateAfterBindInputAttachments << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkDescriptorSetVariableDescriptorCountAllocateInfoEXT& value)
-{
- s << "VkDescriptorSetVariableDescriptorCountAllocateInfoEXT = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tdescriptorSetCount = " << value.descriptorSetCount << '\n';
- s << "\tpDescriptorCounts = " << value.pDescriptorCounts << '\n';
- s << '}';
- return s;
-}
-
-std::ostream& operator<< (std::ostream& s, const VkDescriptorSetVariableDescriptorCountLayoutSupportEXT& value)
-{
- s << "VkDescriptorSetVariableDescriptorCountLayoutSupportEXT = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tmaxVariableDescriptorCount = " << value.maxVariableDescriptorCount << '\n';
- s << '}';
- return s;
-}
-
std::ostream& operator<< (std::ostream& s, const VkShadingRatePaletteNV& value)
{
s << "VkShadingRatePaletteNV = {\n";
@@ -7836,6 +8513,16 @@
return s;
}
+std::ostream& operator<< (std::ostream& s, const VkPipelineCompilerControlCreateInfoAMD& value)
+{
+ s << "VkPipelineCompilerControlCreateInfoAMD = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tcompilerControlFlags = " << getPipelineCompilerControlFlagsAMDStr(value.compilerControlFlags) << '\n';
+ s << '}';
+ return s;
+}
+
std::ostream& operator<< (std::ostream& s, const VkCalibratedTimestampInfoEXT& value)
{
s << "VkCalibratedTimestampInfoEXT = {\n";
@@ -8056,9 +8743,9 @@
return s;
}
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderIntegerFunctions2INTEL& value)
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL& value)
{
- s << "VkPhysicalDeviceShaderIntegerFunctions2INTEL = {\n";
+ s << "VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL = {\n";
s << "\tsType = " << value.sType << '\n';
s << "\tpNext = " << value.pNext << '\n';
s << "\tshaderIntegerFunctions2 = " << value.shaderIntegerFunctions2 << '\n';
@@ -8066,6 +8753,89 @@
return s;
}
+std::ostream& operator<< (std::ostream& s, const VkPerformanceValueDataINTEL& value)
+{
+ s << "VkPerformanceValueDataINTEL = {\n";
+ s << "\tvalue32 = " << value.value32 << '\n';
+ s << "\tvalue64 = " << value.value64 << '\n';
+ s << "\tvalueFloat = " << value.valueFloat << '\n';
+ s << "\tvalueBool = " << value.valueBool << '\n';
+ s << "\tvalueString = " << getCharPtrStr(value.valueString) << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPerformanceValueINTEL& value)
+{
+ s << "VkPerformanceValueINTEL = {\n";
+ s << "\ttype = " << value.type << '\n';
+ s << "\tdata = " << value.data << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkInitializePerformanceApiInfoINTEL& value)
+{
+ s << "VkInitializePerformanceApiInfoINTEL = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tpUserData = " << value.pUserData << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkQueryPoolCreateInfoINTEL& value)
+{
+ s << "VkQueryPoolCreateInfoINTEL = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tperformanceCountersSampling = " << value.performanceCountersSampling << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPerformanceMarkerInfoINTEL& value)
+{
+ s << "VkPerformanceMarkerInfoINTEL = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tmarker = " << value.marker << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPerformanceStreamMarkerInfoINTEL& value)
+{
+ s << "VkPerformanceStreamMarkerInfoINTEL = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tmarker = " << value.marker << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPerformanceOverrideInfoINTEL& value)
+{
+ s << "VkPerformanceOverrideInfoINTEL = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\ttype = " << value.type << '\n';
+ s << "\tenable = " << value.enable << '\n';
+ s << "\tparameter = " << value.parameter << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPerformanceConfigurationAcquireInfoINTEL& value)
+{
+ s << "VkPerformanceConfigurationAcquireInfoINTEL = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\ttype = " << value.type << '\n';
+ s << '}';
+ return s;
+}
+
std::ostream& operator<< (std::ostream& s, const VkPhysicalDevicePCIBusInfoPropertiesEXT& value)
{
s << "VkPhysicalDevicePCIBusInfoPropertiesEXT = {\n";
@@ -8133,12 +8903,57 @@
return s;
}
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceScalarBlockLayoutFeaturesEXT& value)
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT& value)
{
- s << "VkPhysicalDeviceScalarBlockLayoutFeaturesEXT = {\n";
+ s << "VkPhysicalDeviceSubgroupSizeControlFeaturesEXT = {\n";
s << "\tsType = " << value.sType << '\n';
s << "\tpNext = " << value.pNext << '\n';
- s << "\tscalarBlockLayout = " << value.scalarBlockLayout << '\n';
+ s << "\tsubgroupSizeControl = " << value.subgroupSizeControl << '\n';
+ s << "\tcomputeFullSubgroups = " << value.computeFullSubgroups << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT& value)
+{
+ s << "VkPhysicalDeviceSubgroupSizeControlPropertiesEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tminSubgroupSize = " << value.minSubgroupSize << '\n';
+ s << "\tmaxSubgroupSize = " << value.maxSubgroupSize << '\n';
+ s << "\tmaxComputeWorkgroupSubgroups = " << value.maxComputeWorkgroupSubgroups << '\n';
+ s << "\trequiredSubgroupSizeStages = " << getShaderStageFlagsStr(value.requiredSubgroupSizeStages) << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT& value)
+{
+ s << "VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\trequiredSubgroupSize = " << value.requiredSubgroupSize << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderCoreProperties2AMD& value)
+{
+ s << "VkPhysicalDeviceShaderCoreProperties2AMD = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tshaderCoreFeatures = " << getShaderCorePropertiesFlagsAMDStr(value.shaderCoreFeatures) << '\n';
+ s << "\tactiveComputeUnitCount = " << value.activeComputeUnitCount << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceCoherentMemoryFeaturesAMD& value)
+{
+ s << "VkPhysicalDeviceCoherentMemoryFeaturesAMD = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tdeviceCoherentMemory = " << value.deviceCoherentMemory << '\n';
s << '}';
return s;
}
@@ -8196,16 +9011,6 @@
return s;
}
-std::ostream& operator<< (std::ostream& s, const VkBufferDeviceAddressInfoEXT& value)
-{
- s << "VkBufferDeviceAddressInfoEXT = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tbuffer = " << value.buffer << '\n';
- s << '}';
- return s;
-}
-
std::ostream& operator<< (std::ostream& s, const VkBufferDeviceAddressCreateInfoEXT& value)
{
s << "VkBufferDeviceAddressCreateInfoEXT = {\n";
@@ -8216,16 +9021,6 @@
return s;
}
-std::ostream& operator<< (std::ostream& s, const VkImageStencilUsageCreateInfoEXT& value)
-{
- s << "VkImageStencilUsageCreateInfoEXT = {\n";
- s << "\tsType = " << value.sType << '\n';
- s << "\tpNext = " << value.pNext << '\n';
- s << "\tstencilUsage = " << getImageUsageFlagsStr(value.stencilUsage) << '\n';
- s << '}';
- return s;
-}
-
std::ostream& operator<< (std::ostream& s, const VkValidationFeaturesEXT& value)
{
s << "VkValidationFeaturesEXT = {\n";
@@ -8343,12 +9138,40 @@
return s;
}
-std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceHostQueryResetFeaturesEXT& value)
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceLineRasterizationFeaturesEXT& value)
{
- s << "VkPhysicalDeviceHostQueryResetFeaturesEXT = {\n";
+ s << "VkPhysicalDeviceLineRasterizationFeaturesEXT = {\n";
s << "\tsType = " << value.sType << '\n';
s << "\tpNext = " << value.pNext << '\n';
- s << "\thostQueryReset = " << value.hostQueryReset << '\n';
+ s << "\trectangularLines = " << value.rectangularLines << '\n';
+ s << "\tbresenhamLines = " << value.bresenhamLines << '\n';
+ s << "\tsmoothLines = " << value.smoothLines << '\n';
+ s << "\tstippledRectangularLines = " << value.stippledRectangularLines << '\n';
+ s << "\tstippledBresenhamLines = " << value.stippledBresenhamLines << '\n';
+ s << "\tstippledSmoothLines = " << value.stippledSmoothLines << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceLineRasterizationPropertiesEXT& value)
+{
+ s << "VkPhysicalDeviceLineRasterizationPropertiesEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tlineSubPixelPrecisionBits = " << value.lineSubPixelPrecisionBits << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPipelineRasterizationLineStateCreateInfoEXT& value)
+{
+ s << "VkPipelineRasterizationLineStateCreateInfoEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tlineRasterizationMode = " << value.lineRasterizationMode << '\n';
+ s << "\tstippledLineEnable = " << value.stippledLineEnable << '\n';
+ s << "\tlineStippleFactor = " << value.lineStippleFactor << '\n';
+ s << "\tlineStipplePattern = " << value.lineStipplePattern << '\n';
s << '}';
return s;
}
@@ -8373,6 +9196,29 @@
return s;
}
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT& value)
+{
+ s << "VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\ttexelBufferAlignment = " << value.texelBufferAlignment << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT& value)
+{
+ s << "VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tstorageTexelBufferOffsetAlignmentBytes = " << value.storageTexelBufferOffsetAlignmentBytes << '\n';
+ s << "\tstorageTexelBufferOffsetSingleTexelAlignment = " << value.storageTexelBufferOffsetSingleTexelAlignment << '\n';
+ s << "\tuniformTexelBufferOffsetAlignmentBytes = " << value.uniformTexelBufferOffsetAlignmentBytes << '\n';
+ s << "\tuniformTexelBufferOffsetSingleTexelAlignment = " << value.uniformTexelBufferOffsetSingleTexelAlignment << '\n';
+ s << '}';
+ return s;
+}
+
std::ostream& operator<< (std::ostream& s, const VkAndroidSurfaceCreateInfoKHR& value)
{
s << "VkAndroidSurfaceCreateInfoKHR = {\n";
diff --git a/external/vulkancts/framework/vulkan/vkStructTypes.inl b/external/vulkancts/framework/vulkan/vkStructTypes.inl
index 9074333..ca72f30 100644
--- a/external/vulkancts/framework/vulkan/vkStructTypes.inl
+++ b/external/vulkancts/framework/vulkan/vkStructTypes.inl
@@ -1747,6 +1747,614 @@
VkBool32 shaderDrawParameters;
};
+struct VkPhysicalDeviceVulkan11Features
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 storageBuffer16BitAccess;
+ VkBool32 uniformAndStorageBuffer16BitAccess;
+ VkBool32 storagePushConstant16;
+ VkBool32 storageInputOutput16;
+ VkBool32 multiview;
+ VkBool32 multiviewGeometryShader;
+ VkBool32 multiviewTessellationShader;
+ VkBool32 variablePointersStorageBuffer;
+ VkBool32 variablePointers;
+ VkBool32 protectedMemory;
+ VkBool32 samplerYcbcrConversion;
+ VkBool32 shaderDrawParameters;
+};
+
+struct VkPhysicalDeviceVulkan11Properties
+{
+ VkStructureType sType;
+ void* pNext;
+ deUint8 deviceUUID[VK_UUID_SIZE];
+ deUint8 driverUUID[VK_UUID_SIZE];
+ deUint8 deviceLUID[VK_LUID_SIZE];
+ deUint32 deviceNodeMask;
+ VkBool32 deviceLUIDValid;
+ deUint32 subgroupSize;
+ VkShaderStageFlags subgroupSupportedStages;
+ VkSubgroupFeatureFlags subgroupSupportedOperations;
+ VkBool32 subgroupQuadOperationsInAllStages;
+ VkPointClippingBehavior pointClippingBehavior;
+ deUint32 maxMultiviewViewCount;
+ deUint32 maxMultiviewInstanceIndex;
+ VkBool32 protectedNoFault;
+ deUint32 maxPerSetDescriptors;
+ VkDeviceSize maxMemoryAllocationSize;
+};
+
+struct VkPhysicalDeviceVulkan12Features
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 samplerMirrorClampToEdge;
+ VkBool32 drawIndirectCount;
+ VkBool32 storageBuffer8BitAccess;
+ VkBool32 uniformAndStorageBuffer8BitAccess;
+ VkBool32 storagePushConstant8;
+ VkBool32 shaderBufferInt64Atomics;
+ VkBool32 shaderSharedInt64Atomics;
+ VkBool32 shaderFloat16;
+ VkBool32 shaderInt8;
+ VkBool32 descriptorIndexing;
+ VkBool32 shaderInputAttachmentArrayDynamicIndexing;
+ VkBool32 shaderUniformTexelBufferArrayDynamicIndexing;
+ VkBool32 shaderStorageTexelBufferArrayDynamicIndexing;
+ VkBool32 shaderUniformBufferArrayNonUniformIndexing;
+ VkBool32 shaderSampledImageArrayNonUniformIndexing;
+ VkBool32 shaderStorageBufferArrayNonUniformIndexing;
+ VkBool32 shaderStorageImageArrayNonUniformIndexing;
+ VkBool32 shaderInputAttachmentArrayNonUniformIndexing;
+ VkBool32 shaderUniformTexelBufferArrayNonUniformIndexing;
+ VkBool32 shaderStorageTexelBufferArrayNonUniformIndexing;
+ VkBool32 descriptorBindingUniformBufferUpdateAfterBind;
+ VkBool32 descriptorBindingSampledImageUpdateAfterBind;
+ VkBool32 descriptorBindingStorageImageUpdateAfterBind;
+ VkBool32 descriptorBindingStorageBufferUpdateAfterBind;
+ VkBool32 descriptorBindingUniformTexelBufferUpdateAfterBind;
+ VkBool32 descriptorBindingStorageTexelBufferUpdateAfterBind;
+ VkBool32 descriptorBindingUpdateUnusedWhilePending;
+ VkBool32 descriptorBindingPartiallyBound;
+ VkBool32 descriptorBindingVariableDescriptorCount;
+ VkBool32 runtimeDescriptorArray;
+ VkBool32 samplerFilterMinmax;
+ VkBool32 scalarBlockLayout;
+ VkBool32 imagelessFramebuffer;
+ VkBool32 uniformBufferStandardLayout;
+ VkBool32 shaderSubgroupExtendedTypes;
+ VkBool32 separateDepthStencilLayouts;
+ VkBool32 hostQueryReset;
+ VkBool32 timelineSemaphore;
+ VkBool32 bufferDeviceAddress;
+ VkBool32 bufferDeviceAddressCaptureReplay;
+ VkBool32 bufferDeviceAddressMultiDevice;
+ VkBool32 vulkanMemoryModel;
+ VkBool32 vulkanMemoryModelDeviceScope;
+ VkBool32 vulkanMemoryModelAvailabilityVisibilityChains;
+ VkBool32 shaderOutputViewportIndex;
+ VkBool32 shaderOutputLayer;
+ VkBool32 subgroupBroadcastDynamicId;
+};
+
+struct VkConformanceVersion
+{
+ deUint8 major;
+ deUint8 minor;
+ deUint8 subminor;
+ deUint8 patch;
+};
+
+struct VkPhysicalDeviceVulkan12Properties
+{
+ VkStructureType sType;
+ void* pNext;
+ VkDriverId driverID;
+ char driverName[VK_MAX_DRIVER_NAME_SIZE];
+ char driverInfo[VK_MAX_DRIVER_INFO_SIZE];
+ VkConformanceVersion conformanceVersion;
+ VkShaderFloatControlsIndependence denormBehaviorIndependence;
+ VkShaderFloatControlsIndependence roundingModeIndependence;
+ VkBool32 shaderSignedZeroInfNanPreserveFloat16;
+ VkBool32 shaderSignedZeroInfNanPreserveFloat32;
+ VkBool32 shaderSignedZeroInfNanPreserveFloat64;
+ VkBool32 shaderDenormPreserveFloat16;
+ VkBool32 shaderDenormPreserveFloat32;
+ VkBool32 shaderDenormPreserveFloat64;
+ VkBool32 shaderDenormFlushToZeroFloat16;
+ VkBool32 shaderDenormFlushToZeroFloat32;
+ VkBool32 shaderDenormFlushToZeroFloat64;
+ VkBool32 shaderRoundingModeRTEFloat16;
+ VkBool32 shaderRoundingModeRTEFloat32;
+ VkBool32 shaderRoundingModeRTEFloat64;
+ VkBool32 shaderRoundingModeRTZFloat16;
+ VkBool32 shaderRoundingModeRTZFloat32;
+ VkBool32 shaderRoundingModeRTZFloat64;
+ deUint32 maxUpdateAfterBindDescriptorsInAllPools;
+ VkBool32 shaderUniformBufferArrayNonUniformIndexingNative;
+ VkBool32 shaderSampledImageArrayNonUniformIndexingNative;
+ VkBool32 shaderStorageBufferArrayNonUniformIndexingNative;
+ VkBool32 shaderStorageImageArrayNonUniformIndexingNative;
+ VkBool32 shaderInputAttachmentArrayNonUniformIndexingNative;
+ VkBool32 robustBufferAccessUpdateAfterBind;
+ VkBool32 quadDivergentImplicitLod;
+ deUint32 maxPerStageDescriptorUpdateAfterBindSamplers;
+ deUint32 maxPerStageDescriptorUpdateAfterBindUniformBuffers;
+ deUint32 maxPerStageDescriptorUpdateAfterBindStorageBuffers;
+ deUint32 maxPerStageDescriptorUpdateAfterBindSampledImages;
+ deUint32 maxPerStageDescriptorUpdateAfterBindStorageImages;
+ deUint32 maxPerStageDescriptorUpdateAfterBindInputAttachments;
+ deUint32 maxPerStageUpdateAfterBindResources;
+ deUint32 maxDescriptorSetUpdateAfterBindSamplers;
+ deUint32 maxDescriptorSetUpdateAfterBindUniformBuffers;
+ deUint32 maxDescriptorSetUpdateAfterBindUniformBuffersDynamic;
+ deUint32 maxDescriptorSetUpdateAfterBindStorageBuffers;
+ deUint32 maxDescriptorSetUpdateAfterBindStorageBuffersDynamic;
+ deUint32 maxDescriptorSetUpdateAfterBindSampledImages;
+ deUint32 maxDescriptorSetUpdateAfterBindStorageImages;
+ deUint32 maxDescriptorSetUpdateAfterBindInputAttachments;
+ VkResolveModeFlags supportedDepthResolveModes;
+ VkResolveModeFlags supportedStencilResolveModes;
+ VkBool32 independentResolveNone;
+ VkBool32 independentResolve;
+ VkBool32 filterMinmaxSingleComponentFormats;
+ VkBool32 filterMinmaxImageComponentMapping;
+ deUint64 maxTimelineSemaphoreValueDifference;
+ VkSampleCountFlags framebufferIntegerColorSampleCounts;
+};
+
+struct VkImageFormatListCreateInfo
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 viewFormatCount;
+ const VkFormat* pViewFormats;
+};
+
+struct VkAttachmentDescription2
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkAttachmentDescriptionFlags flags;
+ VkFormat format;
+ VkSampleCountFlagBits samples;
+ VkAttachmentLoadOp loadOp;
+ VkAttachmentStoreOp storeOp;
+ VkAttachmentLoadOp stencilLoadOp;
+ VkAttachmentStoreOp stencilStoreOp;
+ VkImageLayout initialLayout;
+ VkImageLayout finalLayout;
+};
+
+struct VkAttachmentReference2
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 attachment;
+ VkImageLayout layout;
+ VkImageAspectFlags aspectMask;
+};
+
+struct VkSubpassDescription2
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkSubpassDescriptionFlags flags;
+ VkPipelineBindPoint pipelineBindPoint;
+ deUint32 viewMask;
+ deUint32 inputAttachmentCount;
+ const VkAttachmentReference2* pInputAttachments;
+ deUint32 colorAttachmentCount;
+ const VkAttachmentReference2* pColorAttachments;
+ const VkAttachmentReference2* pResolveAttachments;
+ const VkAttachmentReference2* pDepthStencilAttachment;
+ deUint32 preserveAttachmentCount;
+ const deUint32* pPreserveAttachments;
+};
+
+struct VkSubpassDependency2
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 srcSubpass;
+ deUint32 dstSubpass;
+ VkPipelineStageFlags srcStageMask;
+ VkPipelineStageFlags dstStageMask;
+ VkAccessFlags srcAccessMask;
+ VkAccessFlags dstAccessMask;
+ VkDependencyFlags dependencyFlags;
+ deInt32 viewOffset;
+};
+
+struct VkRenderPassCreateInfo2
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkRenderPassCreateFlags flags;
+ deUint32 attachmentCount;
+ const VkAttachmentDescription2* pAttachments;
+ deUint32 subpassCount;
+ const VkSubpassDescription2* pSubpasses;
+ deUint32 dependencyCount;
+ const VkSubpassDependency2* pDependencies;
+ deUint32 correlatedViewMaskCount;
+ const deUint32* pCorrelatedViewMasks;
+};
+
+struct VkSubpassBeginInfo
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkSubpassContents contents;
+};
+
+struct VkSubpassEndInfo
+{
+ VkStructureType sType;
+ const void* pNext;
+};
+
+struct VkPhysicalDevice8BitStorageFeatures
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 storageBuffer8BitAccess;
+ VkBool32 uniformAndStorageBuffer8BitAccess;
+ VkBool32 storagePushConstant8;
+};
+
+struct VkPhysicalDeviceDriverProperties
+{
+ VkStructureType sType;
+ void* pNext;
+ VkDriverId driverID;
+ char driverName[VK_MAX_DRIVER_NAME_SIZE];
+ char driverInfo[VK_MAX_DRIVER_INFO_SIZE];
+ VkConformanceVersion conformanceVersion;
+};
+
+struct VkPhysicalDeviceShaderAtomicInt64Features
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 shaderBufferInt64Atomics;
+ VkBool32 shaderSharedInt64Atomics;
+};
+
+struct VkPhysicalDeviceShaderFloat16Int8Features
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 shaderFloat16;
+ VkBool32 shaderInt8;
+};
+
+struct VkPhysicalDeviceFloatControlsProperties
+{
+ VkStructureType sType;
+ void* pNext;
+ VkShaderFloatControlsIndependence denormBehaviorIndependence;
+ VkShaderFloatControlsIndependence roundingModeIndependence;
+ VkBool32 shaderSignedZeroInfNanPreserveFloat16;
+ VkBool32 shaderSignedZeroInfNanPreserveFloat32;
+ VkBool32 shaderSignedZeroInfNanPreserveFloat64;
+ VkBool32 shaderDenormPreserveFloat16;
+ VkBool32 shaderDenormPreserveFloat32;
+ VkBool32 shaderDenormPreserveFloat64;
+ VkBool32 shaderDenormFlushToZeroFloat16;
+ VkBool32 shaderDenormFlushToZeroFloat32;
+ VkBool32 shaderDenormFlushToZeroFloat64;
+ VkBool32 shaderRoundingModeRTEFloat16;
+ VkBool32 shaderRoundingModeRTEFloat32;
+ VkBool32 shaderRoundingModeRTEFloat64;
+ VkBool32 shaderRoundingModeRTZFloat16;
+ VkBool32 shaderRoundingModeRTZFloat32;
+ VkBool32 shaderRoundingModeRTZFloat64;
+};
+
+struct VkDescriptorSetLayoutBindingFlagsCreateInfo
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 bindingCount;
+ const VkDescriptorBindingFlags* pBindingFlags;
+};
+
+struct VkPhysicalDeviceDescriptorIndexingFeatures
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 shaderInputAttachmentArrayDynamicIndexing;
+ VkBool32 shaderUniformTexelBufferArrayDynamicIndexing;
+ VkBool32 shaderStorageTexelBufferArrayDynamicIndexing;
+ VkBool32 shaderUniformBufferArrayNonUniformIndexing;
+ VkBool32 shaderSampledImageArrayNonUniformIndexing;
+ VkBool32 shaderStorageBufferArrayNonUniformIndexing;
+ VkBool32 shaderStorageImageArrayNonUniformIndexing;
+ VkBool32 shaderInputAttachmentArrayNonUniformIndexing;
+ VkBool32 shaderUniformTexelBufferArrayNonUniformIndexing;
+ VkBool32 shaderStorageTexelBufferArrayNonUniformIndexing;
+ VkBool32 descriptorBindingUniformBufferUpdateAfterBind;
+ VkBool32 descriptorBindingSampledImageUpdateAfterBind;
+ VkBool32 descriptorBindingStorageImageUpdateAfterBind;
+ VkBool32 descriptorBindingStorageBufferUpdateAfterBind;
+ VkBool32 descriptorBindingUniformTexelBufferUpdateAfterBind;
+ VkBool32 descriptorBindingStorageTexelBufferUpdateAfterBind;
+ VkBool32 descriptorBindingUpdateUnusedWhilePending;
+ VkBool32 descriptorBindingPartiallyBound;
+ VkBool32 descriptorBindingVariableDescriptorCount;
+ VkBool32 runtimeDescriptorArray;
+};
+
+struct VkPhysicalDeviceDescriptorIndexingProperties
+{
+ VkStructureType sType;
+ void* pNext;
+ deUint32 maxUpdateAfterBindDescriptorsInAllPools;
+ VkBool32 shaderUniformBufferArrayNonUniformIndexingNative;
+ VkBool32 shaderSampledImageArrayNonUniformIndexingNative;
+ VkBool32 shaderStorageBufferArrayNonUniformIndexingNative;
+ VkBool32 shaderStorageImageArrayNonUniformIndexingNative;
+ VkBool32 shaderInputAttachmentArrayNonUniformIndexingNative;
+ VkBool32 robustBufferAccessUpdateAfterBind;
+ VkBool32 quadDivergentImplicitLod;
+ deUint32 maxPerStageDescriptorUpdateAfterBindSamplers;
+ deUint32 maxPerStageDescriptorUpdateAfterBindUniformBuffers;
+ deUint32 maxPerStageDescriptorUpdateAfterBindStorageBuffers;
+ deUint32 maxPerStageDescriptorUpdateAfterBindSampledImages;
+ deUint32 maxPerStageDescriptorUpdateAfterBindStorageImages;
+ deUint32 maxPerStageDescriptorUpdateAfterBindInputAttachments;
+ deUint32 maxPerStageUpdateAfterBindResources;
+ deUint32 maxDescriptorSetUpdateAfterBindSamplers;
+ deUint32 maxDescriptorSetUpdateAfterBindUniformBuffers;
+ deUint32 maxDescriptorSetUpdateAfterBindUniformBuffersDynamic;
+ deUint32 maxDescriptorSetUpdateAfterBindStorageBuffers;
+ deUint32 maxDescriptorSetUpdateAfterBindStorageBuffersDynamic;
+ deUint32 maxDescriptorSetUpdateAfterBindSampledImages;
+ deUint32 maxDescriptorSetUpdateAfterBindStorageImages;
+ deUint32 maxDescriptorSetUpdateAfterBindInputAttachments;
+};
+
+struct VkDescriptorSetVariableDescriptorCountAllocateInfo
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 descriptorSetCount;
+ const deUint32* pDescriptorCounts;
+};
+
+struct VkDescriptorSetVariableDescriptorCountLayoutSupport
+{
+ VkStructureType sType;
+ void* pNext;
+ deUint32 maxVariableDescriptorCount;
+};
+
+struct VkSubpassDescriptionDepthStencilResolve
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkResolveModeFlagBits depthResolveMode;
+ VkResolveModeFlagBits stencilResolveMode;
+ const VkAttachmentReference2* pDepthStencilResolveAttachment;
+};
+
+struct VkPhysicalDeviceDepthStencilResolveProperties
+{
+ VkStructureType sType;
+ void* pNext;
+ VkResolveModeFlags supportedDepthResolveModes;
+ VkResolveModeFlags supportedStencilResolveModes;
+ VkBool32 independentResolveNone;
+ VkBool32 independentResolve;
+};
+
+struct VkPhysicalDeviceScalarBlockLayoutFeatures
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 scalarBlockLayout;
+};
+
+struct VkImageStencilUsageCreateInfo
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkImageUsageFlags stencilUsage;
+};
+
+struct VkSamplerReductionModeCreateInfo
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkSamplerReductionMode reductionMode;
+};
+
+struct VkPhysicalDeviceSamplerFilterMinmaxProperties
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 filterMinmaxSingleComponentFormats;
+ VkBool32 filterMinmaxImageComponentMapping;
+};
+
+struct VkPhysicalDeviceVulkanMemoryModelFeatures
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 vulkanMemoryModel;
+ VkBool32 vulkanMemoryModelDeviceScope;
+ VkBool32 vulkanMemoryModelAvailabilityVisibilityChains;
+};
+
+struct VkPhysicalDeviceImagelessFramebufferFeatures
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 imagelessFramebuffer;
+};
+
+struct VkFramebufferAttachmentImageInfo
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkImageCreateFlags flags;
+ VkImageUsageFlags usage;
+ deUint32 width;
+ deUint32 height;
+ deUint32 layerCount;
+ deUint32 viewFormatCount;
+ const VkFormat* pViewFormats;
+};
+
+struct VkFramebufferAttachmentsCreateInfo
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 attachmentImageInfoCount;
+ const VkFramebufferAttachmentImageInfo* pAttachmentImageInfos;
+};
+
+struct VkRenderPassAttachmentBeginInfo
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 attachmentCount;
+ const VkImageView* pAttachments;
+};
+
+struct VkPhysicalDeviceUniformBufferStandardLayoutFeatures
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 uniformBufferStandardLayout;
+};
+
+struct VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 shaderSubgroupExtendedTypes;
+};
+
+struct VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 separateDepthStencilLayouts;
+};
+
+struct VkAttachmentReferenceStencilLayout
+{
+ VkStructureType sType;
+ void* pNext;
+ VkImageLayout stencilLayout;
+};
+
+struct VkAttachmentDescriptionStencilLayout
+{
+ VkStructureType sType;
+ void* pNext;
+ VkImageLayout stencilInitialLayout;
+ VkImageLayout stencilFinalLayout;
+};
+
+struct VkPhysicalDeviceHostQueryResetFeatures
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 hostQueryReset;
+};
+
+struct VkPhysicalDeviceTimelineSemaphoreFeatures
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 timelineSemaphore;
+};
+
+struct VkPhysicalDeviceTimelineSemaphoreProperties
+{
+ VkStructureType sType;
+ void* pNext;
+ deUint64 maxTimelineSemaphoreValueDifference;
+};
+
+struct VkSemaphoreTypeCreateInfo
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkSemaphoreType semaphoreType;
+ deUint64 initialValue;
+};
+
+struct VkTimelineSemaphoreSubmitInfo
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 waitSemaphoreValueCount;
+ const deUint64* pWaitSemaphoreValues;
+ deUint32 signalSemaphoreValueCount;
+ const deUint64* pSignalSemaphoreValues;
+};
+
+struct VkSemaphoreWaitInfo
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkSemaphoreWaitFlags flags;
+ deUint32 semaphoreCount;
+ const VkSemaphore* pSemaphores;
+ const deUint64* pValues;
+};
+
+struct VkSemaphoreSignalInfo
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkSemaphore semaphore;
+ deUint64 value;
+};
+
+struct VkPhysicalDeviceBufferDeviceAddressFeatures
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 bufferDeviceAddress;
+ VkBool32 bufferDeviceAddressCaptureReplay;
+ VkBool32 bufferDeviceAddressMultiDevice;
+};
+
+struct VkBufferDeviceAddressInfo
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkBuffer buffer;
+};
+
+struct VkBufferOpaqueCaptureAddressCreateInfo
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint64 opaqueCaptureAddress;
+};
+
+struct VkMemoryOpaqueCaptureAddressAllocateInfo
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint64 opaqueCaptureAddress;
+};
+
+struct VkDeviceMemoryOpaqueCaptureAddressInfo
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkDeviceMemory memory;
+};
+
struct VkSurfaceCapabilitiesKHR
{
deUint32 minImageCount;
@@ -1972,14 +2580,6 @@
deUint32 maxPushDescriptors;
};
-struct VkPhysicalDeviceFloat16Int8FeaturesKHR
-{
- VkStructureType sType;
- void* pNext;
- VkBool32 shaderFloat16;
- VkBool32 shaderInt8;
-};
-
struct VkRectLayerKHR
{
VkOffset2D offset;
@@ -2001,125 +2601,6 @@
const VkPresentRegionKHR* pRegions;
};
-struct VkPhysicalDeviceImagelessFramebufferFeaturesKHR
-{
- VkStructureType sType;
- void* pNext;
- VkBool32 imagelessFramebuffer;
-};
-
-struct VkFramebufferAttachmentImageInfoKHR
-{
- VkStructureType sType;
- const void* pNext;
- VkImageCreateFlags flags;
- VkImageUsageFlags usage;
- deUint32 width;
- deUint32 height;
- deUint32 layerCount;
- deUint32 viewFormatCount;
- const VkFormat* pViewFormats;
-};
-
-struct VkFramebufferAttachmentsCreateInfoKHR
-{
- VkStructureType sType;
- const void* pNext;
- deUint32 attachmentImageInfoCount;
- const VkFramebufferAttachmentImageInfoKHR* pAttachmentImageInfos;
-};
-
-struct VkRenderPassAttachmentBeginInfoKHR
-{
- VkStructureType sType;
- const void* pNext;
- deUint32 attachmentCount;
- const VkImageView* pAttachments;
-};
-
-struct VkAttachmentDescription2KHR
-{
- VkStructureType sType;
- const void* pNext;
- VkAttachmentDescriptionFlags flags;
- VkFormat format;
- VkSampleCountFlagBits samples;
- VkAttachmentLoadOp loadOp;
- VkAttachmentStoreOp storeOp;
- VkAttachmentLoadOp stencilLoadOp;
- VkAttachmentStoreOp stencilStoreOp;
- VkImageLayout initialLayout;
- VkImageLayout finalLayout;
-};
-
-struct VkAttachmentReference2KHR
-{
- VkStructureType sType;
- const void* pNext;
- deUint32 attachment;
- VkImageLayout layout;
- VkImageAspectFlags aspectMask;
-};
-
-struct VkSubpassDescription2KHR
-{
- VkStructureType sType;
- const void* pNext;
- VkSubpassDescriptionFlags flags;
- VkPipelineBindPoint pipelineBindPoint;
- deUint32 viewMask;
- deUint32 inputAttachmentCount;
- const VkAttachmentReference2KHR* pInputAttachments;
- deUint32 colorAttachmentCount;
- const VkAttachmentReference2KHR* pColorAttachments;
- const VkAttachmentReference2KHR* pResolveAttachments;
- const VkAttachmentReference2KHR* pDepthStencilAttachment;
- deUint32 preserveAttachmentCount;
- const deUint32* pPreserveAttachments;
-};
-
-struct VkSubpassDependency2KHR
-{
- VkStructureType sType;
- const void* pNext;
- deUint32 srcSubpass;
- deUint32 dstSubpass;
- VkPipelineStageFlags srcStageMask;
- VkPipelineStageFlags dstStageMask;
- VkAccessFlags srcAccessMask;
- VkAccessFlags dstAccessMask;
- VkDependencyFlags dependencyFlags;
- deInt32 viewOffset;
-};
-
-struct VkRenderPassCreateInfo2KHR
-{
- VkStructureType sType;
- const void* pNext;
- VkRenderPassCreateFlags flags;
- deUint32 attachmentCount;
- const VkAttachmentDescription2KHR* pAttachments;
- deUint32 subpassCount;
- const VkSubpassDescription2KHR* pSubpasses;
- deUint32 dependencyCount;
- const VkSubpassDependency2KHR* pDependencies;
- deUint32 correlatedViewMaskCount;
- const deUint32* pCorrelatedViewMasks;
-};
-
-struct VkSubpassBeginInfoKHR
-{
- VkStructureType sType;
- const void* pNext;
- VkSubpassContents contents;
-};
-
-struct VkSubpassEndInfoKHR
-{
- VkStructureType sType;
- const void* pNext;
-};
-
struct VkSharedPresentSurfaceCapabilitiesKHR
{
VkStructureType sType;
@@ -2145,6 +2626,75 @@
VkExternalFenceHandleTypeFlagBits handleType;
};
+struct VkPhysicalDevicePerformanceQueryFeaturesKHR
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 performanceCounterQueryPools;
+ VkBool32 performanceCounterMultipleQueryPools;
+};
+
+struct VkPhysicalDevicePerformanceQueryPropertiesKHR
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 allowCommandBufferQueryCopies;
+};
+
+struct VkPerformanceCounterKHR
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkPerformanceCounterUnitKHR unit;
+ VkPerformanceCounterScopeKHR scope;
+ VkPerformanceCounterStorageKHR storage;
+ deUint8 uuid[VK_UUID_SIZE];
+};
+
+struct VkPerformanceCounterDescriptionKHR
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkPerformanceCounterDescriptionFlagsKHR flags;
+ char name[VK_MAX_DESCRIPTION_SIZE];
+ char category[VK_MAX_DESCRIPTION_SIZE];
+ char description[VK_MAX_DESCRIPTION_SIZE];
+};
+
+struct VkQueryPoolPerformanceCreateInfoKHR
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 queueFamilyIndex;
+ deUint32 counterIndexCount;
+ const deUint32* pCounterIndices;
+};
+
+union VkPerformanceCounterResultKHR
+{
+ deInt32 int32;
+ deInt64 int64;
+ deUint32 uint32;
+ deUint64 uint64;
+ float float32;
+ double float64;
+};
+
+struct VkAcquireProfilingLockInfoKHR
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkAcquireProfilingLockFlagsKHR flags;
+ deUint64 timeout;
+};
+
+struct VkPerformanceQuerySubmitInfoKHR
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 counterPassIndex;
+};
+
struct VkPhysicalDeviceSurfaceInfo2KHR
{
VkStructureType sType;
@@ -2202,100 +2752,6 @@
VkDisplayPlaneCapabilitiesKHR capabilities;
};
-struct VkImageFormatListCreateInfoKHR
-{
- VkStructureType sType;
- const void* pNext;
- deUint32 viewFormatCount;
- const VkFormat* pViewFormats;
-};
-
-struct VkPhysicalDevice8BitStorageFeaturesKHR
-{
- VkStructureType sType;
- void* pNext;
- VkBool32 storageBuffer8BitAccess;
- VkBool32 uniformAndStorageBuffer8BitAccess;
- VkBool32 storagePushConstant8;
-};
-
-struct VkPhysicalDeviceShaderAtomicInt64FeaturesKHR
-{
- VkStructureType sType;
- void* pNext;
- VkBool32 shaderBufferInt64Atomics;
- VkBool32 shaderSharedInt64Atomics;
-};
-
-struct VkConformanceVersionKHR
-{
- deUint8 major;
- deUint8 minor;
- deUint8 subminor;
- deUint8 patch;
-};
-
-struct VkPhysicalDeviceDriverPropertiesKHR
-{
- VkStructureType sType;
- void* pNext;
- VkDriverIdKHR driverID;
- char driverName[VK_MAX_DRIVER_NAME_SIZE_KHR];
- char driverInfo[VK_MAX_DRIVER_INFO_SIZE_KHR];
- VkConformanceVersionKHR conformanceVersion;
-};
-
-struct VkPhysicalDeviceFloatControlsPropertiesKHR
-{
- VkStructureType sType;
- void* pNext;
- VkBool32 separateDenormSettings;
- VkBool32 separateRoundingModeSettings;
- VkBool32 shaderSignedZeroInfNanPreserveFloat16;
- VkBool32 shaderSignedZeroInfNanPreserveFloat32;
- VkBool32 shaderSignedZeroInfNanPreserveFloat64;
- VkBool32 shaderDenormPreserveFloat16;
- VkBool32 shaderDenormPreserveFloat32;
- VkBool32 shaderDenormPreserveFloat64;
- VkBool32 shaderDenormFlushToZeroFloat16;
- VkBool32 shaderDenormFlushToZeroFloat32;
- VkBool32 shaderDenormFlushToZeroFloat64;
- VkBool32 shaderRoundingModeRTEFloat16;
- VkBool32 shaderRoundingModeRTEFloat32;
- VkBool32 shaderRoundingModeRTEFloat64;
- VkBool32 shaderRoundingModeRTZFloat16;
- VkBool32 shaderRoundingModeRTZFloat32;
- VkBool32 shaderRoundingModeRTZFloat64;
-};
-
-struct VkSubpassDescriptionDepthStencilResolveKHR
-{
- VkStructureType sType;
- const void* pNext;
- VkResolveModeFlagBitsKHR depthResolveMode;
- VkResolveModeFlagBitsKHR stencilResolveMode;
- const VkAttachmentReference2KHR* pDepthStencilResolveAttachment;
-};
-
-struct VkPhysicalDeviceDepthStencilResolvePropertiesKHR
-{
- VkStructureType sType;
- void* pNext;
- VkResolveModeFlagsKHR supportedDepthResolveModes;
- VkResolveModeFlagsKHR supportedStencilResolveModes;
- VkBool32 independentResolveNone;
- VkBool32 independentResolve;
-};
-
-struct VkPhysicalDeviceVulkanMemoryModelFeaturesKHR
-{
- VkStructureType sType;
- void* pNext;
- VkBool32 vulkanMemoryModel;
- VkBool32 vulkanMemoryModelDeviceScope;
- VkBool32 vulkanMemoryModelAvailabilityVisibilityChains;
-};
-
struct VkSurfaceProtectedCapabilitiesKHR
{
VkStructureType sType;
@@ -2303,13 +2759,6 @@
VkBool32 supportsProtected;
};
-struct VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR
-{
- VkStructureType sType;
- void* pNext;
- VkBool32 uniformBufferStandardLayout;
-};
-
struct VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR
{
VkStructureType sType;
@@ -2371,56 +2820,6 @@
void* pData;
};
-struct VkPhysicalDeviceTimelineSemaphoreFeaturesKHR
-{
- VkStructureType sType;
- void* pNext;
- VkBool32 timelineSemaphore;
-};
-
-struct VkPhysicalDeviceTimelineSemaphorePropertiesKHR
-{
- VkStructureType sType;
- void* pNext;
- deUint64 maxTimelineSemaphoreValueDifference;
-};
-
-struct VkSemaphoreTypeCreateInfoKHR
-{
- VkStructureType sType;
- const void* pNext;
- VkSemaphoreTypeKHR semaphoreType;
- deUint64 initialValue;
-};
-
-struct VkTimelineSemaphoreSubmitInfoKHR
-{
- VkStructureType sType;
- const void* pNext;
- deUint32 waitSemaphoreValueCount;
- const deUint64* pWaitSemaphoreValues;
- deUint32 signalSemaphoreValueCount;
- const deUint64* pSignalSemaphoreValues;
-};
-
-struct VkSemaphoreWaitInfoKHR
-{
- VkStructureType sType;
- const void* pNext;
- VkSemaphoreWaitFlagsKHR flags;
- deUint32 semaphoreCount;
- const VkSemaphore* pSemaphores;
- const deUint64* pValues;
-};
-
-struct VkSemaphoreSignalInfoKHR
-{
- VkStructureType sType;
- const void* pNext;
- VkSemaphore semaphore;
- deUint64 value;
-};
-
struct VkDebugReportCallbackCreateInfoEXT
{
VkStructureType sType;
@@ -2592,6 +2991,13 @@
const VkValidationCheckEXT* pDisabledValidationChecks;
};
+struct VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkBool32 textureCompressionASTC_HDR;
+};
+
struct VkImageViewASTCDecodeModeEXT
{
VkStructureType sType;
@@ -3000,21 +3406,6 @@
void* pUserData;
};
-struct VkSamplerReductionModeCreateInfoEXT
-{
- VkStructureType sType;
- const void* pNext;
- VkSamplerReductionModeEXT reductionMode;
-};
-
-struct VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT
-{
- VkStructureType sType;
- void* pNext;
- VkBool32 filterMinmaxSingleComponentFormats;
- VkBool32 filterMinmaxImageComponentMapping;
-};
-
struct VkPhysicalDeviceInlineUniformBlockFeaturesEXT
{
VkStructureType sType;
@@ -3161,6 +3552,21 @@
const float* pCoverageModulationTable;
};
+struct VkPhysicalDeviceShaderSMBuiltinsPropertiesNV
+{
+ VkStructureType sType;
+ void* pNext;
+ deUint32 shaderSMCount;
+ deUint32 shaderWarpsPerSM;
+};
+
+struct VkPhysicalDeviceShaderSMBuiltinsFeaturesNV
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 shaderSMBuiltins;
+};
+
struct VkPhysicalDeviceShaderClockFeaturesKHR
{
VkStructureType sType;
@@ -3234,84 +3640,6 @@
VkValidationCacheEXT validationCache;
};
-struct VkDescriptorSetLayoutBindingFlagsCreateInfoEXT
-{
- VkStructureType sType;
- const void* pNext;
- deUint32 bindingCount;
- const VkDescriptorBindingFlagsEXT* pBindingFlags;
-};
-
-struct VkPhysicalDeviceDescriptorIndexingFeaturesEXT
-{
- VkStructureType sType;
- void* pNext;
- VkBool32 shaderInputAttachmentArrayDynamicIndexing;
- VkBool32 shaderUniformTexelBufferArrayDynamicIndexing;
- VkBool32 shaderStorageTexelBufferArrayDynamicIndexing;
- VkBool32 shaderUniformBufferArrayNonUniformIndexing;
- VkBool32 shaderSampledImageArrayNonUniformIndexing;
- VkBool32 shaderStorageBufferArrayNonUniformIndexing;
- VkBool32 shaderStorageImageArrayNonUniformIndexing;
- VkBool32 shaderInputAttachmentArrayNonUniformIndexing;
- VkBool32 shaderUniformTexelBufferArrayNonUniformIndexing;
- VkBool32 shaderStorageTexelBufferArrayNonUniformIndexing;
- VkBool32 descriptorBindingUniformBufferUpdateAfterBind;
- VkBool32 descriptorBindingSampledImageUpdateAfterBind;
- VkBool32 descriptorBindingStorageImageUpdateAfterBind;
- VkBool32 descriptorBindingStorageBufferUpdateAfterBind;
- VkBool32 descriptorBindingUniformTexelBufferUpdateAfterBind;
- VkBool32 descriptorBindingStorageTexelBufferUpdateAfterBind;
- VkBool32 descriptorBindingUpdateUnusedWhilePending;
- VkBool32 descriptorBindingPartiallyBound;
- VkBool32 descriptorBindingVariableDescriptorCount;
- VkBool32 runtimeDescriptorArray;
-};
-
-struct VkPhysicalDeviceDescriptorIndexingPropertiesEXT
-{
- VkStructureType sType;
- void* pNext;
- deUint32 maxUpdateAfterBindDescriptorsInAllPools;
- VkBool32 shaderUniformBufferArrayNonUniformIndexingNative;
- VkBool32 shaderSampledImageArrayNonUniformIndexingNative;
- VkBool32 shaderStorageBufferArrayNonUniformIndexingNative;
- VkBool32 shaderStorageImageArrayNonUniformIndexingNative;
- VkBool32 shaderInputAttachmentArrayNonUniformIndexingNative;
- VkBool32 robustBufferAccessUpdateAfterBind;
- VkBool32 quadDivergentImplicitLod;
- deUint32 maxPerStageDescriptorUpdateAfterBindSamplers;
- deUint32 maxPerStageDescriptorUpdateAfterBindUniformBuffers;
- deUint32 maxPerStageDescriptorUpdateAfterBindStorageBuffers;
- deUint32 maxPerStageDescriptorUpdateAfterBindSampledImages;
- deUint32 maxPerStageDescriptorUpdateAfterBindStorageImages;
- deUint32 maxPerStageDescriptorUpdateAfterBindInputAttachments;
- deUint32 maxPerStageUpdateAfterBindResources;
- deUint32 maxDescriptorSetUpdateAfterBindSamplers;
- deUint32 maxDescriptorSetUpdateAfterBindUniformBuffers;
- deUint32 maxDescriptorSetUpdateAfterBindUniformBuffersDynamic;
- deUint32 maxDescriptorSetUpdateAfterBindStorageBuffers;
- deUint32 maxDescriptorSetUpdateAfterBindStorageBuffersDynamic;
- deUint32 maxDescriptorSetUpdateAfterBindSampledImages;
- deUint32 maxDescriptorSetUpdateAfterBindStorageImages;
- deUint32 maxDescriptorSetUpdateAfterBindInputAttachments;
-};
-
-struct VkDescriptorSetVariableDescriptorCountAllocateInfoEXT
-{
- VkStructureType sType;
- const void* pNext;
- deUint32 descriptorSetCount;
- const deUint32* pDescriptorCounts;
-};
-
-struct VkDescriptorSetVariableDescriptorCountLayoutSupportEXT
-{
- VkStructureType sType;
- void* pNext;
- deUint32 maxVariableDescriptorCount;
-};
-
struct VkShadingRatePaletteNV
{
deUint32 shadingRatePaletteEntryCount;
@@ -3554,6 +3882,13 @@
VkDeviceSize minImportedHostPointerAlignment;
};
+struct VkPipelineCompilerControlCreateInfoAMD
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkPipelineCompilerControlFlagsAMD compilerControlFlags;
+};
+
struct VkCalibratedTimestampInfoEXT
{
VkStructureType sType;
@@ -3717,13 +4052,72 @@
void* pCheckpointMarker;
};
-struct VkPhysicalDeviceShaderIntegerFunctions2INTEL
+struct VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL
{
VkStructureType sType;
void* pNext;
VkBool32 shaderIntegerFunctions2;
};
+union VkPerformanceValueDataINTEL
+{
+ deUint32 value32;
+ deUint64 value64;
+ float valueFloat;
+ VkBool32 valueBool;
+ const char* valueString;
+};
+
+struct VkPerformanceValueINTEL
+{
+ VkPerformanceValueTypeINTEL type;
+ VkPerformanceValueDataINTEL data;
+};
+
+struct VkInitializePerformanceApiInfoINTEL
+{
+ VkStructureType sType;
+ const void* pNext;
+ void* pUserData;
+};
+
+struct VkQueryPoolCreateInfoINTEL
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkQueryPoolSamplingModeINTEL performanceCountersSampling;
+};
+
+struct VkPerformanceMarkerInfoINTEL
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint64 marker;
+};
+
+struct VkPerformanceStreamMarkerInfoINTEL
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 marker;
+};
+
+struct VkPerformanceOverrideInfoINTEL
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkPerformanceOverrideTypeINTEL type;
+ VkBool32 enable;
+ deUint64 parameter;
+};
+
+struct VkPerformanceConfigurationAcquireInfoINTEL
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkPerformanceConfigurationTypeINTEL type;
+};
+
struct VkPhysicalDevicePCIBusInfoPropertiesEXT
{
VkStructureType sType;
@@ -3773,11 +4167,44 @@
VkAttachmentReference fragmentDensityMapAttachment;
};
-struct VkPhysicalDeviceScalarBlockLayoutFeaturesEXT
+struct VkPhysicalDeviceSubgroupSizeControlFeaturesEXT
{
VkStructureType sType;
void* pNext;
- VkBool32 scalarBlockLayout;
+ VkBool32 subgroupSizeControl;
+ VkBool32 computeFullSubgroups;
+};
+
+struct VkPhysicalDeviceSubgroupSizeControlPropertiesEXT
+{
+ VkStructureType sType;
+ void* pNext;
+ deUint32 minSubgroupSize;
+ deUint32 maxSubgroupSize;
+ deUint32 maxComputeWorkgroupSubgroups;
+ VkShaderStageFlags requiredSubgroupSizeStages;
+};
+
+struct VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT
+{
+ VkStructureType sType;
+ void* pNext;
+ deUint32 requiredSubgroupSize;
+};
+
+struct VkPhysicalDeviceShaderCoreProperties2AMD
+{
+ VkStructureType sType;
+ void* pNext;
+ VkShaderCorePropertiesFlagsAMD shaderCoreFeatures;
+ deUint32 activeComputeUnitCount;
+};
+
+struct VkPhysicalDeviceCoherentMemoryFeaturesAMD
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 deviceCoherentMemory;
};
struct VkPhysicalDeviceMemoryBudgetPropertiesEXT
@@ -3818,13 +4245,6 @@
VkBool32 bufferDeviceAddressMultiDevice;
};
-struct VkBufferDeviceAddressInfoEXT
-{
- VkStructureType sType;
- const void* pNext;
- VkBuffer buffer;
-};
-
struct VkBufferDeviceAddressCreateInfoEXT
{
VkStructureType sType;
@@ -3832,13 +4252,6 @@
VkDeviceAddress deviceAddress;
};
-struct VkImageStencilUsageCreateInfoEXT
-{
- VkStructureType sType;
- const void* pNext;
- VkImageUsageFlags stencilUsage;
-};
-
struct VkValidationFeaturesEXT
{
VkStructureType sType;
@@ -3926,11 +4339,33 @@
VkHeadlessSurfaceCreateFlagsEXT flags;
};
-struct VkPhysicalDeviceHostQueryResetFeaturesEXT
+struct VkPhysicalDeviceLineRasterizationFeaturesEXT
{
VkStructureType sType;
void* pNext;
- VkBool32 hostQueryReset;
+ VkBool32 rectangularLines;
+ VkBool32 bresenhamLines;
+ VkBool32 smoothLines;
+ VkBool32 stippledRectangularLines;
+ VkBool32 stippledBresenhamLines;
+ VkBool32 stippledSmoothLines;
+};
+
+struct VkPhysicalDeviceLineRasterizationPropertiesEXT
+{
+ VkStructureType sType;
+ void* pNext;
+ deUint32 lineSubPixelPrecisionBits;
+};
+
+struct VkPipelineRasterizationLineStateCreateInfoEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkLineRasterizationModeEXT lineRasterizationMode;
+ VkBool32 stippledLineEnable;
+ deUint32 lineStippleFactor;
+ deUint16 lineStipplePattern;
};
struct VkPhysicalDeviceIndexTypeUint8FeaturesEXT
@@ -3947,6 +4382,23 @@
VkBool32 shaderDemoteToHelperInvocation;
};
+struct VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 texelBufferAlignment;
+};
+
+struct VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT
+{
+ VkStructureType sType;
+ void* pNext;
+ VkDeviceSize storageTexelBufferOffsetAlignmentBytes;
+ VkBool32 storageTexelBufferOffsetSingleTexelAlignment;
+ VkDeviceSize uniformTexelBufferOffsetAlignmentBytes;
+ VkBool32 uniformTexelBufferOffsetSingleTexelAlignment;
+};
+
struct VkAndroidSurfaceCreateInfoKHR
{
VkStructureType sType;
@@ -4382,5 +4834,95 @@
typedef VkPhysicalDeviceShaderDrawParametersFeatures VkPhysicalDeviceShaderDrawParameterFeatures;
+typedef VkConformanceVersion VkConformanceVersionKHR;
+
+typedef VkImageFormatListCreateInfo VkImageFormatListCreateInfoKHR;
+
+typedef VkAttachmentDescription2 VkAttachmentDescription2KHR;
+
+typedef VkAttachmentReference2 VkAttachmentReference2KHR;
+
+typedef VkSubpassDescription2 VkSubpassDescription2KHR;
+
+typedef VkSubpassDependency2 VkSubpassDependency2KHR;
+
+typedef VkRenderPassCreateInfo2 VkRenderPassCreateInfo2KHR;
+
+typedef VkSubpassBeginInfo VkSubpassBeginInfoKHR;
+
+typedef VkSubpassEndInfo VkSubpassEndInfoKHR;
+
+typedef VkPhysicalDevice8BitStorageFeatures VkPhysicalDevice8BitStorageFeaturesKHR;
+
+typedef VkPhysicalDeviceDriverProperties VkPhysicalDeviceDriverPropertiesKHR;
+
+typedef VkPhysicalDeviceShaderAtomicInt64Features VkPhysicalDeviceShaderAtomicInt64FeaturesKHR;
+
+typedef VkPhysicalDeviceFloatControlsProperties VkPhysicalDeviceFloatControlsPropertiesKHR;
+
+typedef VkDescriptorSetLayoutBindingFlagsCreateInfo VkDescriptorSetLayoutBindingFlagsCreateInfoEXT;
+
+typedef VkPhysicalDeviceDescriptorIndexingFeatures VkPhysicalDeviceDescriptorIndexingFeaturesEXT;
+
+typedef VkPhysicalDeviceDescriptorIndexingProperties VkPhysicalDeviceDescriptorIndexingPropertiesEXT;
+
+typedef VkDescriptorSetVariableDescriptorCountAllocateInfo VkDescriptorSetVariableDescriptorCountAllocateInfoEXT;
+
+typedef VkDescriptorSetVariableDescriptorCountLayoutSupport VkDescriptorSetVariableDescriptorCountLayoutSupportEXT;
+
+typedef VkSubpassDescriptionDepthStencilResolve VkSubpassDescriptionDepthStencilResolveKHR;
+
+typedef VkPhysicalDeviceDepthStencilResolveProperties VkPhysicalDeviceDepthStencilResolvePropertiesKHR;
+
+typedef VkPhysicalDeviceScalarBlockLayoutFeatures VkPhysicalDeviceScalarBlockLayoutFeaturesEXT;
+
+typedef VkImageStencilUsageCreateInfo VkImageStencilUsageCreateInfoEXT;
+
+typedef VkSamplerReductionModeCreateInfo VkSamplerReductionModeCreateInfoEXT;
+
+typedef VkPhysicalDeviceSamplerFilterMinmaxProperties VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT;
+
+typedef VkPhysicalDeviceVulkanMemoryModelFeatures VkPhysicalDeviceVulkanMemoryModelFeaturesKHR;
+
+typedef VkPhysicalDeviceImagelessFramebufferFeatures VkPhysicalDeviceImagelessFramebufferFeaturesKHR;
+
+typedef VkFramebufferAttachmentImageInfo VkFramebufferAttachmentImageInfoKHR;
+
+typedef VkFramebufferAttachmentsCreateInfo VkFramebufferAttachmentsCreateInfoKHR;
+
+typedef VkRenderPassAttachmentBeginInfo VkRenderPassAttachmentBeginInfoKHR;
+
+typedef VkPhysicalDeviceUniformBufferStandardLayoutFeatures VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR;
+
+typedef VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR;
+
+typedef VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR;
+
+typedef VkAttachmentReferenceStencilLayout VkAttachmentReferenceStencilLayoutKHR;
+
+typedef VkAttachmentDescriptionStencilLayout VkAttachmentDescriptionStencilLayoutKHR;
+
+typedef VkPhysicalDeviceHostQueryResetFeatures VkPhysicalDeviceHostQueryResetFeaturesEXT;
+
+typedef VkPhysicalDeviceTimelineSemaphoreFeatures VkPhysicalDeviceTimelineSemaphoreFeaturesKHR;
+
+typedef VkPhysicalDeviceTimelineSemaphoreProperties VkPhysicalDeviceTimelineSemaphorePropertiesKHR;
+
+typedef VkSemaphoreTypeCreateInfo VkSemaphoreTypeCreateInfoKHR;
+
+typedef VkTimelineSemaphoreSubmitInfo VkTimelineSemaphoreSubmitInfoKHR;
+
+typedef VkSemaphoreWaitInfo VkSemaphoreWaitInfoKHR;
+
+typedef VkSemaphoreSignalInfo VkSemaphoreSignalInfoKHR;
+
+typedef VkPhysicalDeviceBufferDeviceAddressFeatures VkPhysicalDeviceBufferDeviceAddressFeaturesKHR;
+
+typedef VkBufferOpaqueCaptureAddressCreateInfo VkBufferOpaqueCaptureAddressCreateInfoKHR;
+
+typedef VkMemoryOpaqueCaptureAddressAllocateInfo VkMemoryOpaqueCaptureAddressAllocateInfoKHR;
+
+typedef VkDeviceMemoryOpaqueCaptureAddressInfo VkDeviceMemoryOpaqueCaptureAddressInfoKHR;
+
typedef VkPhysicalDeviceBufferDeviceAddressFeaturesEXT VkPhysicalDeviceBufferAddressFeaturesEXT;
diff --git a/external/vulkancts/framework/vulkan/vkSupportedExtensions.inl b/external/vulkancts/framework/vulkan/vkSupportedExtensions.inl
index 85d2bc5..0b50966 100644
--- a/external/vulkancts/framework/vulkan/vkSupportedExtensions.inl
+++ b/external/vulkancts/framework/vulkan/vkSupportedExtensions.inl
@@ -4,6 +4,33 @@
void getCoreDeviceExtensionsImpl (deUint32 coreVersion, ::std::vector<const char*>& dst)
{
+ if (coreVersion >= VK_API_VERSION_1_2)
+ {
+ dst.push_back("VK_KHR_sampler_mirror_clamp_to_edge");
+ dst.push_back("VK_KHR_shader_float16_int8");
+ dst.push_back("VK_KHR_imageless_framebuffer");
+ dst.push_back("VK_KHR_create_renderpass2");
+ dst.push_back("VK_KHR_image_format_list");
+ dst.push_back("VK_KHR_draw_indirect_count");
+ dst.push_back("VK_KHR_shader_subgroup_extended_types");
+ dst.push_back("VK_KHR_8bit_storage");
+ dst.push_back("VK_KHR_shader_atomic_int64");
+ dst.push_back("VK_KHR_driver_properties");
+ dst.push_back("VK_KHR_shader_float_controls");
+ dst.push_back("VK_KHR_depth_stencil_resolve");
+ dst.push_back("VK_KHR_timeline_semaphore");
+ dst.push_back("VK_KHR_vulkan_memory_model");
+ dst.push_back("VK_KHR_spirv_1_4");
+ dst.push_back("VK_KHR_separate_depth_stencil_layouts");
+ dst.push_back("VK_KHR_uniform_buffer_standard_layout");
+ dst.push_back("VK_KHR_buffer_device_address");
+ dst.push_back("VK_EXT_sampler_filter_minmax");
+ dst.push_back("VK_EXT_descriptor_indexing");
+ dst.push_back("VK_EXT_shader_viewport_index_layer");
+ dst.push_back("VK_EXT_scalar_block_layout");
+ dst.push_back("VK_EXT_separate_stencil_usage");
+ dst.push_back("VK_EXT_host_query_reset");
+ }
if (coreVersion >= VK_API_VERSION_1_1)
{
dst.push_back("VK_KHR_multiview");
diff --git a/external/vulkancts/framework/vulkan/vkTypeUtil.inl b/external/vulkancts/framework/vulkan/vkTypeUtil.inl
index c817527..980d114 100644
--- a/external/vulkancts/framework/vulkan/vkTypeUtil.inl
+++ b/external/vulkancts/framework/vulkan/vkTypeUtil.inl
@@ -398,6 +398,16 @@
return res;
}
+inline VkConformanceVersion makeConformanceVersion (deUint8 major, deUint8 minor, deUint8 subminor, deUint8 patch)
+{
+ VkConformanceVersion res;
+ res.major = major;
+ res.minor = minor;
+ res.subminor = subminor;
+ res.patch = patch;
+ return res;
+}
+
inline VkSurfaceFormatKHR makeSurfaceFormatKHR (VkFormat format, VkColorSpaceKHR colorSpace)
{
VkSurfaceFormatKHR res;
@@ -422,16 +432,6 @@
return res;
}
-inline VkConformanceVersionKHR makeConformanceVersionKHR (deUint8 major, deUint8 minor, deUint8 subminor, deUint8 patch)
-{
- VkConformanceVersionKHR res;
- res.major = major;
- res.minor = minor;
- res.subminor = subminor;
- res.patch = patch;
- return res;
-}
-
inline VkShaderResourceUsageAMD makeShaderResourceUsageAMD (deUint32 numUsedVgprs, deUint32 numUsedSgprs, deUint32 ldsSizePerLocalWorkGroup, deUintptr ldsUsageSizeInBytes, deUintptr scratchMemUsageInBytes)
{
VkShaderResourceUsageAMD res;
diff --git a/external/vulkancts/framework/vulkan/vkValidatorOptions.hpp b/external/vulkancts/framework/vulkan/vkValidatorOptions.hpp
index 5364946..f593913 100644
--- a/external/vulkancts/framework/vulkan/vkValidatorOptions.hpp
+++ b/external/vulkancts/framework/vulkan/vkValidatorOptions.hpp
@@ -44,8 +44,8 @@
kScalarBlockLayout
};
- SpirvValidatorOptions(deUint32 the_vulkan_version = VK_MAKE_VERSION(1, 0, 0), BlockLayoutRules the_layout = kDefaultBlockLayout)
- : vulkanVersion(the_vulkan_version), blockLayout(the_layout) {}
+ SpirvValidatorOptions(deUint32 the_vulkan_version = VK_MAKE_VERSION(1, 0, 0), BlockLayoutRules the_layout = kDefaultBlockLayout, bool allowSpirv14 = false)
+ : vulkanVersion(the_vulkan_version), blockLayout(the_layout), supports_VK_KHR_spirv_1_4(allowSpirv14) {}
// The target Vulkan version. This determines the SPIR-V environment rules to
// be checked. The bit pattern is as produced by VK_MAKE_VERSION.
@@ -53,6 +53,10 @@
// The block layout rules to enforce.
BlockLayoutRules blockLayout;
+
+ // Does the device support VK_KHR_spirv_1_4?
+ // (Camelcase would just be wrong here.)
+ bool supports_VK_KHR_spirv_1_4;
};
} // namespace vk
diff --git a/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl b/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl
index cdb59da..b570bde 100644
--- a/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl
+++ b/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl
@@ -138,6 +138,19 @@
virtual void destroyDescriptorUpdateTemplate (VkDevice device, VkDescriptorUpdateTemplate descriptorUpdateTemplate, const VkAllocationCallbacks* pAllocator) const = 0;
virtual void updateDescriptorSetWithTemplate (VkDevice device, VkDescriptorSet descriptorSet, VkDescriptorUpdateTemplate descriptorUpdateTemplate, const void* pData) const = 0;
virtual void getDescriptorSetLayoutSupport (VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayoutSupport* pSupport) const = 0;
+virtual void cmdDrawIndirectCount (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const = 0;
+virtual void cmdDrawIndexedIndirectCount (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const = 0;
+virtual VkResult createRenderPass2 (VkDevice device, const VkRenderPassCreateInfo2* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass) const = 0;
+virtual void cmdBeginRenderPass2 (VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, const VkSubpassBeginInfo* pSubpassBeginInfo) const = 0;
+virtual void cmdNextSubpass2 (VkCommandBuffer commandBuffer, const VkSubpassBeginInfo* pSubpassBeginInfo, const VkSubpassEndInfo* pSubpassEndInfo) const = 0;
+virtual void cmdEndRenderPass2 (VkCommandBuffer commandBuffer, const VkSubpassEndInfo* pSubpassEndInfo) const = 0;
+virtual void resetQueryPool (VkDevice device, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount) const = 0;
+virtual VkResult getSemaphoreCounterValue (VkDevice device, VkSemaphore semaphore, deUint64* pValue) const = 0;
+virtual VkResult waitSemaphores (VkDevice device, const VkSemaphoreWaitInfo* pWaitInfo, deUint64 timeout) const = 0;
+virtual VkResult signalSemaphore (VkDevice device, const VkSemaphoreSignalInfo* pSignalInfo) const = 0;
+virtual VkDeviceAddress getBufferDeviceAddress (VkDevice device, const VkBufferDeviceAddressInfo* pInfo) const = 0;
+virtual uint64_t getBufferOpaqueCaptureAddress (VkDevice device, const VkBufferDeviceAddressInfo* pInfo) const = 0;
+virtual uint64_t getDeviceMemoryOpaqueCaptureAddress (VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo) const = 0;
virtual VkResult createSwapchainKHR (VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain) const = 0;
virtual void destroySwapchainKHR (VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks* pAllocator) const = 0;
virtual VkResult getSwapchainImagesKHR (VkDevice device, VkSwapchainKHR swapchain, deUint32* pSwapchainImageCount, VkImage* pSwapchainImages) const = 0;
@@ -153,21 +166,14 @@
virtual VkResult getSemaphoreFdKHR (VkDevice device, const VkSemaphoreGetFdInfoKHR* pGetFdInfo, int* pFd) const = 0;
virtual void cmdPushDescriptorSetKHR (VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, deUint32 set, deUint32 descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites) const = 0;
virtual void cmdPushDescriptorSetWithTemplateKHR (VkCommandBuffer commandBuffer, VkDescriptorUpdateTemplate descriptorUpdateTemplate, VkPipelineLayout layout, deUint32 set, const void* pData) const = 0;
-virtual VkResult createRenderPass2KHR (VkDevice device, const VkRenderPassCreateInfo2KHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass) const = 0;
-virtual void cmdBeginRenderPass2KHR (VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, const VkSubpassBeginInfoKHR* pSubpassBeginInfo) const = 0;
-virtual void cmdNextSubpass2KHR (VkCommandBuffer commandBuffer, const VkSubpassBeginInfoKHR* pSubpassBeginInfo, const VkSubpassEndInfoKHR* pSubpassEndInfo) const = 0;
-virtual void cmdEndRenderPass2KHR (VkCommandBuffer commandBuffer, const VkSubpassEndInfoKHR* pSubpassEndInfo) const = 0;
virtual VkResult getSwapchainStatusKHR (VkDevice device, VkSwapchainKHR swapchain) const = 0;
virtual VkResult importFenceFdKHR (VkDevice device, const VkImportFenceFdInfoKHR* pImportFenceFdInfo) const = 0;
virtual VkResult getFenceFdKHR (VkDevice device, const VkFenceGetFdInfoKHR* pGetFdInfo, int* pFd) const = 0;
-virtual void cmdDrawIndirectCountKHR (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const = 0;
-virtual void cmdDrawIndexedIndirectCountKHR (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const = 0;
+virtual VkResult acquireProfilingLockKHR (VkDevice device, const VkAcquireProfilingLockInfoKHR* pInfo) const = 0;
+virtual void releaseProfilingLockKHR (VkDevice device) const = 0;
virtual VkResult getPipelineExecutablePropertiesKHR (VkDevice device, const VkPipelineInfoKHR* pPipelineInfo, deUint32* pExecutableCount, VkPipelineExecutablePropertiesKHR* pProperties) const = 0;
virtual VkResult getPipelineExecutableStatisticsKHR (VkDevice device, const VkPipelineExecutableInfoKHR* pExecutableInfo, deUint32* pStatisticCount, VkPipelineExecutableStatisticKHR* pStatistics) const = 0;
virtual VkResult getPipelineExecutableInternalRepresentationsKHR (VkDevice device, const VkPipelineExecutableInfoKHR* pExecutableInfo, deUint32* pInternalRepresentationCount, VkPipelineExecutableInternalRepresentationKHR* pInternalRepresentations) const = 0;
-virtual VkResult getSemaphoreCounterValueKHR (VkDevice device, VkSemaphore semaphore, deUint64* pValue) const = 0;
-virtual VkResult waitSemaphoresKHR (VkDevice device, const VkSemaphoreWaitInfoKHR* pWaitInfo, deUint64 timeout) const = 0;
-virtual VkResult signalSemaphoreKHR (VkDevice device, const VkSemaphoreSignalInfoKHR* pSignalInfo) const = 0;
virtual VkResult debugMarkerSetObjectTagEXT (VkDevice device, const VkDebugMarkerObjectTagInfoEXT* pTagInfo) const = 0;
virtual VkResult debugMarkerSetObjectNameEXT (VkDevice device, const VkDebugMarkerObjectNameInfoEXT* pNameInfo) const = 0;
virtual void cmdDebugMarkerBeginEXT (VkCommandBuffer commandBuffer, const VkDebugMarkerMarkerInfoEXT* pMarkerInfo) const = 0;
@@ -240,9 +246,18 @@
virtual void cmdSetExclusiveScissorNV (VkCommandBuffer commandBuffer, deUint32 firstExclusiveScissor, deUint32 exclusiveScissorCount, const VkRect2D* pExclusiveScissors) const = 0;
virtual void cmdSetCheckpointNV (VkCommandBuffer commandBuffer, const void* pCheckpointMarker) const = 0;
virtual void getQueueCheckpointDataNV (VkQueue queue, deUint32* pCheckpointDataCount, VkCheckpointDataNV* pCheckpointData) const = 0;
+virtual VkResult initializePerformanceApiINTEL (VkDevice device, const VkInitializePerformanceApiInfoINTEL* pInitializeInfo) const = 0;
+virtual void uninitializePerformanceApiINTEL (VkDevice device) const = 0;
+virtual VkResult cmdSetPerformanceMarkerINTEL (VkCommandBuffer commandBuffer, const VkPerformanceMarkerInfoINTEL* pMarkerInfo) const = 0;
+virtual VkResult cmdSetPerformanceStreamMarkerINTEL (VkCommandBuffer commandBuffer, const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo) const = 0;
+virtual VkResult cmdSetPerformanceOverrideINTEL (VkCommandBuffer commandBuffer, const VkPerformanceOverrideInfoINTEL* pOverrideInfo) const = 0;
+virtual VkResult acquirePerformanceConfigurationINTEL (VkDevice device, const VkPerformanceConfigurationAcquireInfoINTEL* pAcquireInfo, VkPerformanceConfigurationINTEL* pConfiguration) const = 0;
+virtual VkResult releasePerformanceConfigurationINTEL (VkDevice device, VkPerformanceConfigurationINTEL configuration) const = 0;
+virtual VkResult queueSetPerformanceConfigurationINTEL (VkQueue queue, VkPerformanceConfigurationINTEL configuration) const = 0;
+virtual VkResult getPerformanceParameterINTEL (VkDevice device, VkPerformanceParameterTypeINTEL parameter, VkPerformanceValueINTEL* pValue) const = 0;
virtual void setLocalDimmingAMD (VkDevice device, VkSwapchainKHR swapChain, VkBool32 localDimmingEnable) const = 0;
-virtual VkDeviceAddress getBufferDeviceAddressEXT (VkDevice device, const VkBufferDeviceAddressInfoEXT* pInfo) const = 0;
-virtual void resetQueryPoolEXT (VkDevice device, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount) const = 0;
+virtual VkDeviceAddress getBufferDeviceAddressEXT (VkDevice device, const VkBufferDeviceAddressInfo* pInfo) const = 0;
+virtual void cmdSetLineStippleEXT (VkCommandBuffer commandBuffer, deUint32 lineStippleFactor, deUint16 lineStipplePattern) 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 getMemoryWin32HandleKHR (VkDevice device, const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle) const = 0;
diff --git a/external/vulkancts/framework/vulkan/vkVirtualInstanceInterface.inl b/external/vulkancts/framework/vulkan/vkVirtualInstanceInterface.inl
index 55f469c..078a169 100644
--- a/external/vulkancts/framework/vulkan/vkVirtualInstanceInterface.inl
+++ b/external/vulkancts/framework/vulkan/vkVirtualInstanceInterface.inl
@@ -37,6 +37,8 @@
virtual VkResult createDisplayModeKHR (VkPhysicalDevice physicalDevice, VkDisplayKHR display, const VkDisplayModeCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDisplayModeKHR* pMode) const = 0;
virtual VkResult getDisplayPlaneCapabilitiesKHR (VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode, deUint32 planeIndex, VkDisplayPlaneCapabilitiesKHR* pCapabilities) const = 0;
virtual VkResult createDisplayPlaneSurfaceKHR (VkInstance instance, const VkDisplaySurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const = 0;
+virtual VkResult enumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, deUint32* pCounterCount, VkPerformanceCounterKHR* pCounters, VkPerformanceCounterDescriptionKHR* pCounterDescriptions) const = 0;
+virtual void getPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR (VkPhysicalDevice physicalDevice, const VkQueryPoolPerformanceCreateInfoKHR* pPerformanceQueryCreateInfo, deUint32* pNumPasses) const = 0;
virtual VkResult getPhysicalDeviceSurfaceCapabilities2KHR (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, VkSurfaceCapabilities2KHR* pSurfaceCapabilities) const = 0;
virtual VkResult getPhysicalDeviceSurfaceFormats2KHR (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, deUint32* pSurfaceFormatCount, VkSurfaceFormat2KHR* pSurfaceFormats) const = 0;
virtual VkResult getPhysicalDeviceDisplayProperties2KHR (VkPhysicalDevice physicalDevice, deUint32* pPropertyCount, VkDisplayProperties2KHR* pProperties) const = 0;
diff --git a/external/vulkancts/framework/vulkan/vkVulkan_c.inl b/external/vulkancts/framework/vulkan/vkVulkan_c.inl
index d966065..15cb69f 100644
--- a/external/vulkancts/framework/vulkan/vkVulkan_c.inl
+++ b/external/vulkancts/framework/vulkan/vkVulkan_c.inl
@@ -4,10 +4,6 @@
#ifndef VULKAN_CORE_H_
#define VULKAN_CORE_H_ 1
-#ifdef __cplusplus
-extern "C" {
-#endif
-
/*
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
@@ -30,6 +26,11 @@
*/
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
#define VK_VERSION_1_0 1
@@ -46,7 +47,7 @@
#define VK_VERSION_MINOR(version) (((deUint32)(version) >> 12) & 0x3ff)
#define VK_VERSION_PATCH(version) ((deUint32)(version) & 0xfff)
// Version of this file
-#define VK_HEADER_VERSION 108
+#define VK_HEADER_VERSION 123
#define VK_NULL_HANDLE 0
@@ -137,6 +138,8 @@
VK_ERROR_FRAGMENTED_POOL = -12,
VK_ERROR_OUT_OF_POOL_MEMORY = -1000069000,
VK_ERROR_INVALID_EXTERNAL_HANDLE = -1000072003,
+ VK_ERROR_FRAGMENTATION = -1000161000,
+ VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS = -1000257000,
VK_ERROR_SURFACE_LOST_KHR = -1000000000,
VK_ERROR_NATIVE_WINDOW_IN_USE_KHR = -1000000001,
VK_SUBOPTIMAL_KHR = 1000001003,
@@ -145,12 +148,13 @@
VK_ERROR_VALIDATION_FAILED_EXT = -1000011001,
VK_ERROR_INVALID_SHADER_NV = -1000012000,
VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT = -1000158000,
- VK_ERROR_FRAGMENTATION_EXT = -1000161000,
VK_ERROR_NOT_PERMITTED_EXT = -1000174001,
- VK_ERROR_INVALID_DEVICE_ADDRESS_EXT = -1000244000,
VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT = -1000255000,
VK_ERROR_OUT_OF_POOL_MEMORY_KHR = VK_ERROR_OUT_OF_POOL_MEMORY,
VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR = VK_ERROR_INVALID_EXTERNAL_HANDLE,
+ VK_ERROR_FRAGMENTATION_EXT = VK_ERROR_FRAGMENTATION,
+ VK_ERROR_INVALID_DEVICE_ADDRESS_EXT = VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS,
+ VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR = VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS,
VK_RESULT_BEGIN_RANGE = VK_ERROR_FRAGMENTED_POOL,
VK_RESULT_END_RANGE = VK_INCOMPLETE,
VK_RESULT_RANGE_SIZE = (VK_INCOMPLETE - VK_ERROR_FRAGMENTED_POOL + 1),
@@ -272,6 +276,56 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES = 1000168000,
VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT = 1000168001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES = 1000063000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES = 49,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES = 50,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES = 51,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES = 52,
+ VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO = 1000147000,
+ VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2 = 1000109000,
+ VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2 = 1000109001,
+ VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2 = 1000109002,
+ VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2 = 1000109003,
+ VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2 = 1000109004,
+ VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO = 1000109005,
+ VK_STRUCTURE_TYPE_SUBPASS_END_INFO = 1000109006,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES = 1000177000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES = 1000196000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES = 1000180000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES = 1000082000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES = 1000197000,
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO = 1000161000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES = 1000161001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES = 1000161002,
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO = 1000161003,
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT = 1000161004,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES = 1000199000,
+ VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE = 1000199001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES = 1000221000,
+ VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO = 1000246000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES = 1000130000,
+ VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO = 1000130001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES = 1000211000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES = 1000108000,
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO = 1000108001,
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO = 1000108002,
+ VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO = 1000108003,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES = 1000253000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES = 1000175000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES = 1000241000,
+ VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT = 1000241001,
+ VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT = 1000241002,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES = 1000261000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES = 1000207000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES = 1000207001,
+ VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO = 1000207002,
+ VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO = 1000207003,
+ VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO = 1000207004,
+ VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO = 1000207005,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES = 1000257000,
+ VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO = 1000244001,
+ VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO = 1000257002,
+ VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO = 1000257003,
+ VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO = 1000257004,
VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR = 1000001000,
VK_STRUCTURE_TYPE_PRESENT_INFO_KHR = 1000001001,
VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR = 1000060007,
@@ -310,6 +364,7 @@
VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV = 1000058000,
VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT = 1000061000,
VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN = 1000062000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT = 1000066000,
VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT = 1000067000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT = 1000067001,
VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073000,
@@ -330,7 +385,6 @@
VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT = 1000081000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT = 1000081001,
VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT = 1000081002,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR = 1000082000,
VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR = 1000084000,
VK_STRUCTURE_TYPE_OBJECT_TABLE_CREATE_INFO_NVX = 1000086000,
VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NVX = 1000086001,
@@ -354,23 +408,19 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT = 1000102000,
VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT = 1000102001,
VK_STRUCTURE_TYPE_HDR_METADATA_EXT = 1000105000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR = 1000108000,
- VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR = 1000108001,
- VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR = 1000108002,
- VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO_KHR = 1000108003,
- VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR = 1000109000,
- VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR = 1000109001,
- VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR = 1000109002,
- VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2_KHR = 1000109003,
- VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR = 1000109004,
- VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO_KHR = 1000109005,
- VK_STRUCTURE_TYPE_SUBPASS_END_INFO_KHR = 1000109006,
VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR = 1000111000,
VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR = 1000114000,
VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR = 1000114001,
VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR = 1000114002,
VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR = 1000115000,
VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR = 1000115001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR = 1000116000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR = 1000116001,
+ VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR = 1000116002,
+ VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR = 1000116003,
+ VK_STRUCTURE_TYPE_ACQUIRE_PROFILING_LOCK_INFO_KHR = 1000116004,
+ VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_KHR = 1000116005,
+ VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_DESCRIPTION_KHR = 1000116006,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR = 1000119000,
VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR = 1000119001,
VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR = 1000119002,
@@ -392,8 +442,6 @@
VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129003,
VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129004,
VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID = 1000129005,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT = 1000130000,
- VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT = 1000130001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT = 1000138000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT = 1000138001,
VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT = 1000138002,
@@ -403,12 +451,13 @@
VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT = 1000143002,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT = 1000143003,
VK_STRUCTURE_TYPE_MULTISAMPLE_PROPERTIES_EXT = 1000143004,
- VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR = 1000147000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT = 1000148000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT = 1000148001,
VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT = 1000148002,
VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV = 1000149000,
VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV = 1000152000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV = 1000154000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV = 1000154001,
VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT = 1000158000,
VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT = 1000158001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT = 1000158002,
@@ -417,11 +466,6 @@
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,
- VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT = 1000161000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT = 1000161001,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT = 1000161002,
- VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT = 1000161003,
- VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT = 1000161004,
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,
@@ -442,11 +486,9 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT = 1000170000,
VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT = 1000170001,
VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT = 1000174000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR = 1000177000,
VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT = 1000178000,
VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT = 1000178001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT = 1000178002,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR = 1000180000,
VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD = 1000183000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR = 1000181000,
VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT = 1000184000,
@@ -457,10 +499,6 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT = 1000190002,
VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP = 1000191000,
VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT = 1000192000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR = 1000196000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR = 1000197000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR = 1000199000,
- VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE_KHR = 1000199001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV = 1000201000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV = 1000202000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV = 1000202001,
@@ -470,14 +508,13 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV = 1000205002,
VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV = 1000206000,
VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV = 1000206001,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR = 1000207000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR = 1000207001,
- VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR = 1000207002,
- VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR = 1000207003,
- VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO_KHR = 1000207004,
- VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO_KHR = 1000207005,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS2_FEATURES_INTEL = 1000209000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR = 1000211000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL = 1000209000,
+ VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL = 1000210000,
+ VK_STRUCTURE_TYPE_INITIALIZE_PERFORMANCE_API_INFO_INTEL = 1000210001,
+ VK_STRUCTURE_TYPE_PERFORMANCE_MARKER_INFO_INTEL = 1000210002,
+ VK_STRUCTURE_TYPE_PERFORMANCE_STREAM_MARKER_INFO_INTEL = 1000210003,
+ VK_STRUCTURE_TYPE_PERFORMANCE_OVERRIDE_INFO_INTEL = 1000210004,
+ VK_STRUCTURE_TYPE_PERFORMANCE_CONFIGURATION_ACQUIRE_INFO_INTEL = 1000210005,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT = 1000212000,
VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD = 1000213000,
VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD = 1000213001,
@@ -486,16 +523,18 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT = 1000218000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT = 1000218001,
VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT = 1000218002,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT = 1000221000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT = 1000225000,
+ VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT = 1000225001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT = 1000225002,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD = 1000227000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD = 1000229000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT = 1000237000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT = 1000238000,
VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT = 1000238001,
VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR = 1000239000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV = 1000240000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT = 1000244000,
- VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT = 1000244001,
VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT = 1000244002,
- VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT = 1000246000,
VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT = 1000247000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV = 1000249000,
VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_NV = 1000249001,
@@ -505,20 +544,23 @@
VK_STRUCTURE_TYPE_FRAMEBUFFER_MIXED_SAMPLES_COMBINATION_NV = 1000250002,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT = 1000251000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT = 1000252000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR = 1000253000,
VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT = 1000255000,
VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT = 1000255002,
VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT = 1000255001,
VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT = 1000256000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT = 1000261000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT = 1000259000,
+ VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT = 1000259001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT = 1000259002,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT = 1000265000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT = 1000276000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR = 1000269000,
VK_STRUCTURE_TYPE_PIPELINE_INFO_KHR = 1000269001,
VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_PROPERTIES_KHR = 1000269002,
VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR = 1000269003,
VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_STATISTIC_KHR = 1000269004,
VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR = 1000269005,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT = 1000276000,
+ 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_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,
@@ -554,9 +596,22 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO,
VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES,
VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES,
VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO,
VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES2_EXT = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES,
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO,
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO,
+ VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO_KHR = VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO,
+ VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2,
+ VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,
+ VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2,
+ VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2_KHR = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2,
+ VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2,
+ VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO_KHR = VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO,
+ VK_STRUCTURE_TYPE_SUBPASS_END_INFO_KHR = VK_STRUCTURE_TYPE_SUBPASS_END_INFO,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO,
VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES,
VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO,
@@ -568,11 +623,14 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES,
VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS,
VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES,
+ VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO,
VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR = VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2,
VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2,
VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2_KHR = VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2,
VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2,
VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2_KHR = VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2,
+ VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO,
VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,
VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO_KHR = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO,
VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO_KHR = VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO,
@@ -581,9 +639,41 @@
VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES_KHR = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES,
VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO,
VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO,
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES,
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO,
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES,
VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT_KHR = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES,
+ VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE_KHR = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES,
+ VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO,
+ VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO,
+ VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO_KHR = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO,
+ VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO_KHR = VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES,
+ VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT_KHR = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT,
+ VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT_KHR = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_ADDRESS_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT,
+ VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,
+ VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES,
+ VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_KHR = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,
+ VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO,
+ VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO_KHR = VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO,
+ VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES,
VK_STRUCTURE_TYPE_BEGIN_RANGE = VK_STRUCTURE_TYPE_APPLICATION_INFO,
VK_STRUCTURE_TYPE_END_RANGE = VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO,
VK_STRUCTURE_TYPE_RANGE_SIZE = (VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO - VK_STRUCTURE_TYPE_APPLICATION_INFO + 1),
@@ -838,6 +928,20 @@
VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG = 1000054005,
VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG = 1000054006,
VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG = 1000054007,
+ VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT = 1000066000,
+ VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT = 1000066001,
+ VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT = 1000066002,
+ VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT = 1000066003,
+ VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT = 1000066004,
+ VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT = 1000066005,
+ VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT = 1000066006,
+ VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT = 1000066007,
+ VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT = 1000066008,
+ VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT = 1000066009,
+ VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT = 1000066010,
+ 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_G8B8G8R8_422_UNORM_KHR = VK_FORMAT_G8B8G8R8_422_UNORM,
VK_FORMAT_B8G8R8G8_422_UNORM_KHR = VK_FORMAT_B8G8R8G8_422_UNORM,
VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR = VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM,
@@ -915,7 +1019,9 @@
VK_QUERY_TYPE_PIPELINE_STATISTICS = 1,
VK_QUERY_TYPE_TIMESTAMP = 2,
VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT = 1000028004,
+ VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR = 1000116000,
VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV = 1000165000,
+ VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL = 1000210000,
VK_QUERY_TYPE_BEGIN_RANGE = VK_QUERY_TYPE_OCCLUSION,
VK_QUERY_TYPE_END_RANGE = VK_QUERY_TYPE_TIMESTAMP,
VK_QUERY_TYPE_RANGE_SIZE = (VK_QUERY_TYPE_TIMESTAMP - VK_QUERY_TYPE_OCCLUSION + 1),
@@ -943,12 +1049,20 @@
VK_IMAGE_LAYOUT_PREINITIALIZED = 8,
VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL = 1000117000,
VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL = 1000117001,
+ VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL = 1000241000,
+ VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL = 1000241001,
+ 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_SHARED_PRESENT_KHR = 1000111000,
VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV = 1000164003,
VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT = 1000218000,
VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL,
VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL,
+ VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
+ VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
+ VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL,
+ VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL,
VK_IMAGE_LAYOUT_BEGIN_RANGE = VK_IMAGE_LAYOUT_UNDEFINED,
VK_IMAGE_LAYOUT_END_RANGE = VK_IMAGE_LAYOUT_PREINITIALIZED,
VK_IMAGE_LAYOUT_RANGE_SIZE = (VK_IMAGE_LAYOUT_PREINITIALIZED - VK_IMAGE_LAYOUT_UNDEFINED + 1),
@@ -1183,6 +1297,7 @@
VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV = 1000164004,
VK_DYNAMIC_STATE_VIEWPORT_COARSE_SAMPLE_ORDER_NV = 1000164006,
VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV = 1000205001,
+ VK_DYNAMIC_STATE_LINE_STIPPLE_EXT = 1000259000,
VK_DYNAMIC_STATE_BEGIN_RANGE = VK_DYNAMIC_STATE_VIEWPORT,
VK_DYNAMIC_STATE_END_RANGE = VK_DYNAMIC_STATE_STENCIL_REFERENCE,
VK_DYNAMIC_STATE_RANGE_SIZE = (VK_DYNAMIC_STATE_STENCIL_REFERENCE - VK_DYNAMIC_STATE_VIEWPORT + 1),
@@ -1215,6 +1330,7 @@
VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE = 2,
VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER = 3,
VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE = 4,
+ VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE_KHR = VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,
VK_SAMPLER_ADDRESS_MODE_BEGIN_RANGE = VK_SAMPLER_ADDRESS_MODE_REPEAT,
VK_SAMPLER_ADDRESS_MODE_END_RANGE = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,
VK_SAMPLER_ADDRESS_MODE_RANGE_SIZE = (VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER - VK_SAMPLER_ADDRESS_MODE_REPEAT + 1),
@@ -1351,6 +1467,7 @@
VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT = 1000128000,
VK_OBJECT_TYPE_VALIDATION_CACHE_EXT = 1000160000,
VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV = 1000165000,
+ VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL = 1000210000,
VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR = VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE,
VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_KHR = VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION,
VK_OBJECT_TYPE_BEGIN_RANGE = VK_OBJECT_TYPE_UNKNOWN,
@@ -1393,11 +1510,12 @@
VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT = 0x00200000,
VK_FORMAT_FEATURE_DISJOINT_BIT = 0x00400000,
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_SAMPLED_IMAGE_FILTER_MINMAX_BIT_EXT = 0x00010000,
VK_FORMAT_FEATURE_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x01000000,
VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT,
VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR = VK_FORMAT_FEATURE_TRANSFER_DST_BIT,
+ VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT_EXT = VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT,
VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT_KHR = VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT,
VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT_KHR = VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT,
VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT_KHR = VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT,
@@ -1480,6 +1598,8 @@
VK_MEMORY_PROPERTY_HOST_CACHED_BIT = 0x00000008,
VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT = 0x00000010,
VK_MEMORY_PROPERTY_PROTECTED_BIT = 0x00000020,
+ VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD = 0x00000040,
+ VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD = 0x00000080,
VK_MEMORY_PROPERTY_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkMemoryPropertyFlagBits;
typedef VkFlags VkMemoryPropertyFlags;
@@ -1603,7 +1723,9 @@
VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT = 0x00000002,
VK_BUFFER_CREATE_SPARSE_ALIASED_BIT = 0x00000004,
VK_BUFFER_CREATE_PROTECTED_BIT = 0x00000008,
- VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_EXT = 0x00000010,
+ VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT = 0x00000010,
+ VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_EXT = VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT,
+ VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR = VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT,
VK_BUFFER_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkBufferCreateFlagBits;
typedef VkFlags VkBufferCreateFlags;
@@ -1618,11 +1740,13 @@
VK_BUFFER_USAGE_INDEX_BUFFER_BIT = 0x00000040,
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_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT = 0x00000800,
VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT = 0x00001000,
VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT = 0x00000200,
VK_BUFFER_USAGE_RAY_TRACING_BIT_NV = 0x00000400,
- VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT = 0x00020000,
+ VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
+ VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
VK_BUFFER_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkBufferUsageFlagBits;
typedef VkFlags VkBufferUsageFlags;
@@ -1633,6 +1757,10 @@
VK_IMAGE_VIEW_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkImageViewCreateFlagBits;
typedef VkFlags VkImageViewCreateFlags;
+
+typedef enum VkShaderModuleCreateFlagBits {
+ VK_SHADER_MODULE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
+} VkShaderModuleCreateFlagBits;
typedef VkFlags VkShaderModuleCreateFlags;
typedef VkFlags VkPipelineCacheCreateFlags;
@@ -1650,6 +1778,12 @@
VK_PIPELINE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkPipelineCreateFlagBits;
typedef VkFlags VkPipelineCreateFlags;
+
+typedef enum VkPipelineShaderStageCreateFlagBits {
+ VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT = 0x00000001,
+ VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT = 0x00000002,
+ VK_PIPELINE_SHADER_STAGE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
+} VkPipelineShaderStageCreateFlagBits;
typedef VkFlags VkPipelineShaderStageCreateFlags;
typedef enum VkShaderStageFlagBits {
@@ -1709,25 +1843,32 @@
typedef VkFlags VkSamplerCreateFlags;
typedef enum VkDescriptorSetLayoutCreateFlagBits {
+ VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT = 0x00000002,
VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR = 0x00000001,
- VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT = 0x00000002,
+ VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT,
VK_DESCRIPTOR_SET_LAYOUT_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkDescriptorSetLayoutCreateFlagBits;
typedef VkFlags VkDescriptorSetLayoutCreateFlags;
typedef enum VkDescriptorPoolCreateFlagBits {
VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT = 0x00000001,
- VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT = 0x00000002,
+ VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT = 0x00000002,
+ VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT = VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT,
VK_DESCRIPTOR_POOL_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkDescriptorPoolCreateFlagBits;
typedef VkFlags VkDescriptorPoolCreateFlags;
typedef VkFlags VkDescriptorPoolResetFlags;
typedef enum VkFramebufferCreateFlagBits {
- VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR = 0x00000001,
+ VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT = 0x00000001,
+ VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR = VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,
VK_FRAMEBUFFER_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkFramebufferCreateFlagBits;
typedef VkFlags VkFramebufferCreateFlags;
+
+typedef enum VkRenderPassCreateFlagBits {
+ VK_RENDER_PASS_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
+} VkRenderPassCreateFlagBits;
typedef VkFlags VkRenderPassCreateFlags;
typedef enum VkAttachmentDescriptionFlagBits {
@@ -1823,7 +1964,8 @@
typedef enum VkStencilFaceFlagBits {
VK_STENCIL_FACE_FRONT_BIT = 0x00000001,
VK_STENCIL_FACE_BACK_BIT = 0x00000002,
- VK_STENCIL_FRONT_AND_BACK = 0x00000003,
+ VK_STENCIL_FACE_FRONT_AND_BACK = 0x00000003,
+ VK_STENCIL_FRONT_AND_BACK = VK_STENCIL_FACE_FRONT_AND_BACK,
VK_STENCIL_FACE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkStencilFaceFlagBits;
typedef VkFlags VkStencilFaceFlags;
@@ -3990,7 +4132,11 @@
typedef enum VkMemoryAllocateFlagBits {
VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT = 0x00000001,
+ VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT = 0x00000002,
+ VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT = 0x00000004,
VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT_KHR = VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT,
+ VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT,
+ VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT,
VK_MEMORY_ALLOCATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkMemoryAllocateFlagBits;
typedef VkFlags VkMemoryAllocateFlags;
@@ -4757,6 +4903,760 @@
#endif
+#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
+
+typedef deUint64 VkDeviceAddress;
+#define VK_MAX_DRIVER_NAME_SIZE 256
+#define VK_MAX_DRIVER_INFO_SIZE 256
+
+typedef enum VkDriverId {
+ VK_DRIVER_ID_AMD_PROPRIETARY = 1,
+ VK_DRIVER_ID_AMD_OPEN_SOURCE = 2,
+ VK_DRIVER_ID_MESA_RADV = 3,
+ VK_DRIVER_ID_NVIDIA_PROPRIETARY = 4,
+ VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS = 5,
+ VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA = 6,
+ VK_DRIVER_ID_IMAGINATION_PROPRIETARY = 7,
+ VK_DRIVER_ID_QUALCOMM_PROPRIETARY = 8,
+ VK_DRIVER_ID_ARM_PROPRIETARY = 9,
+ VK_DRIVER_ID_GOOGLE_SWIFTSHADER = 10,
+ VK_DRIVER_ID_GGP_PROPRIETARY = 11,
+ VK_DRIVER_ID_BROADCOM_PROPRIETARY = 12,
+ 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,
+ VK_DRIVER_ID_NVIDIA_PROPRIETARY_KHR = VK_DRIVER_ID_NVIDIA_PROPRIETARY,
+ VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS_KHR = VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS,
+ VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA_KHR = VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA,
+ VK_DRIVER_ID_IMAGINATION_PROPRIETARY_KHR = VK_DRIVER_ID_IMAGINATION_PROPRIETARY,
+ VK_DRIVER_ID_QUALCOMM_PROPRIETARY_KHR = VK_DRIVER_ID_QUALCOMM_PROPRIETARY,
+ VK_DRIVER_ID_ARM_PROPRIETARY_KHR = VK_DRIVER_ID_ARM_PROPRIETARY,
+ VK_DRIVER_ID_GOOGLE_SWIFTSHADER_KHR = VK_DRIVER_ID_GOOGLE_SWIFTSHADER,
+ VK_DRIVER_ID_GGP_PROPRIETARY_KHR = VK_DRIVER_ID_GGP_PROPRIETARY,
+ VK_DRIVER_ID_BROADCOM_PROPRIETARY_KHR = VK_DRIVER_ID_BROADCOM_PROPRIETARY,
+ VK_DRIVER_ID_BEGIN_RANGE = VK_DRIVER_ID_AMD_PROPRIETARY,
+ VK_DRIVER_ID_END_RANGE = VK_DRIVER_ID_BROADCOM_PROPRIETARY,
+ VK_DRIVER_ID_RANGE_SIZE = (VK_DRIVER_ID_BROADCOM_PROPRIETARY - VK_DRIVER_ID_AMD_PROPRIETARY + 1),
+ VK_DRIVER_ID_MAX_ENUM = 0x7FFFFFFF
+} VkDriverId;
+
+typedef enum VkShaderFloatControlsIndependence {
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY = 0,
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL = 1,
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE = 2,
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY_KHR = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY,
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL_KHR = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL,
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE_KHR = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE,
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_BEGIN_RANGE = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY,
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_END_RANGE = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE,
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_RANGE_SIZE = (VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE - VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY + 1),
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_MAX_ENUM = 0x7FFFFFFF
+} VkShaderFloatControlsIndependence;
+
+typedef enum VkSamplerReductionMode {
+ VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE = 0,
+ VK_SAMPLER_REDUCTION_MODE_MIN = 1,
+ VK_SAMPLER_REDUCTION_MODE_MAX = 2,
+ VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT = VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE,
+ VK_SAMPLER_REDUCTION_MODE_MIN_EXT = VK_SAMPLER_REDUCTION_MODE_MIN,
+ VK_SAMPLER_REDUCTION_MODE_MAX_EXT = VK_SAMPLER_REDUCTION_MODE_MAX,
+ VK_SAMPLER_REDUCTION_MODE_BEGIN_RANGE = VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE,
+ VK_SAMPLER_REDUCTION_MODE_END_RANGE = VK_SAMPLER_REDUCTION_MODE_MAX,
+ VK_SAMPLER_REDUCTION_MODE_RANGE_SIZE = (VK_SAMPLER_REDUCTION_MODE_MAX - VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE + 1),
+ VK_SAMPLER_REDUCTION_MODE_MAX_ENUM = 0x7FFFFFFF
+} VkSamplerReductionMode;
+
+typedef enum VkSemaphoreType {
+ VK_SEMAPHORE_TYPE_BINARY = 0,
+ VK_SEMAPHORE_TYPE_TIMELINE = 1,
+ VK_SEMAPHORE_TYPE_BINARY_KHR = VK_SEMAPHORE_TYPE_BINARY,
+ VK_SEMAPHORE_TYPE_TIMELINE_KHR = VK_SEMAPHORE_TYPE_TIMELINE,
+ VK_SEMAPHORE_TYPE_BEGIN_RANGE = VK_SEMAPHORE_TYPE_BINARY,
+ VK_SEMAPHORE_TYPE_END_RANGE = VK_SEMAPHORE_TYPE_TIMELINE,
+ VK_SEMAPHORE_TYPE_RANGE_SIZE = (VK_SEMAPHORE_TYPE_TIMELINE - VK_SEMAPHORE_TYPE_BINARY + 1),
+ VK_SEMAPHORE_TYPE_MAX_ENUM = 0x7FFFFFFF
+} VkSemaphoreType;
+
+typedef enum VkResolveModeFlagBits {
+ VK_RESOLVE_MODE_NONE = 0,
+ VK_RESOLVE_MODE_SAMPLE_ZERO_BIT = 0x00000001,
+ VK_RESOLVE_MODE_AVERAGE_BIT = 0x00000002,
+ VK_RESOLVE_MODE_MIN_BIT = 0x00000004,
+ VK_RESOLVE_MODE_MAX_BIT = 0x00000008,
+ VK_RESOLVE_MODE_NONE_KHR = VK_RESOLVE_MODE_NONE,
+ VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT,
+ VK_RESOLVE_MODE_AVERAGE_BIT_KHR = VK_RESOLVE_MODE_AVERAGE_BIT,
+ VK_RESOLVE_MODE_MIN_BIT_KHR = VK_RESOLVE_MODE_MIN_BIT,
+ VK_RESOLVE_MODE_MAX_BIT_KHR = VK_RESOLVE_MODE_MAX_BIT,
+ VK_RESOLVE_MODE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
+} VkResolveModeFlagBits;
+typedef VkFlags VkResolveModeFlags;
+
+typedef enum VkDescriptorBindingFlagBits {
+ VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT = 0x00000001,
+ VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT = 0x00000002,
+ VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT = 0x00000004,
+ VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT = 0x00000008,
+ VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT = VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT,
+ VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT = VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT,
+ VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT = VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT,
+ VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT = VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT,
+ VK_DESCRIPTOR_BINDING_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
+} VkDescriptorBindingFlagBits;
+typedef VkFlags VkDescriptorBindingFlags;
+
+typedef enum VkSemaphoreWaitFlagBits {
+ VK_SEMAPHORE_WAIT_ANY_BIT = 0x00000001,
+ VK_SEMAPHORE_WAIT_ANY_BIT_KHR = VK_SEMAPHORE_WAIT_ANY_BIT,
+ VK_SEMAPHORE_WAIT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
+} VkSemaphoreWaitFlagBits;
+typedef VkFlags VkSemaphoreWaitFlags;
+typedef struct VkPhysicalDeviceVulkan11Features {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 storageBuffer16BitAccess;
+ VkBool32 uniformAndStorageBuffer16BitAccess;
+ VkBool32 storagePushConstant16;
+ VkBool32 storageInputOutput16;
+ VkBool32 multiview;
+ VkBool32 multiviewGeometryShader;
+ VkBool32 multiviewTessellationShader;
+ VkBool32 variablePointersStorageBuffer;
+ VkBool32 variablePointers;
+ VkBool32 protectedMemory;
+ VkBool32 samplerYcbcrConversion;
+ VkBool32 shaderDrawParameters;
+} VkPhysicalDeviceVulkan11Features;
+
+typedef struct VkPhysicalDeviceVulkan11Properties {
+ VkStructureType sType;
+ void* pNext;
+ deUint8 deviceUUID[VK_UUID_SIZE];
+ deUint8 driverUUID[VK_UUID_SIZE];
+ deUint8 deviceLUID[VK_LUID_SIZE];
+ deUint32 deviceNodeMask;
+ VkBool32 deviceLUIDValid;
+ deUint32 subgroupSize;
+ VkShaderStageFlags subgroupSupportedStages;
+ VkSubgroupFeatureFlags subgroupSupportedOperations;
+ VkBool32 subgroupQuadOperationsInAllStages;
+ VkPointClippingBehavior pointClippingBehavior;
+ deUint32 maxMultiviewViewCount;
+ deUint32 maxMultiviewInstanceIndex;
+ VkBool32 protectedNoFault;
+ deUint32 maxPerSetDescriptors;
+ VkDeviceSize maxMemoryAllocationSize;
+} VkPhysicalDeviceVulkan11Properties;
+
+typedef struct VkPhysicalDeviceVulkan12Features {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 samplerMirrorClampToEdge;
+ VkBool32 drawIndirectCount;
+ VkBool32 storageBuffer8BitAccess;
+ VkBool32 uniformAndStorageBuffer8BitAccess;
+ VkBool32 storagePushConstant8;
+ VkBool32 shaderBufferInt64Atomics;
+ VkBool32 shaderSharedInt64Atomics;
+ VkBool32 shaderFloat16;
+ VkBool32 shaderInt8;
+ VkBool32 descriptorIndexing;
+ VkBool32 shaderInputAttachmentArrayDynamicIndexing;
+ VkBool32 shaderUniformTexelBufferArrayDynamicIndexing;
+ VkBool32 shaderStorageTexelBufferArrayDynamicIndexing;
+ VkBool32 shaderUniformBufferArrayNonUniformIndexing;
+ VkBool32 shaderSampledImageArrayNonUniformIndexing;
+ VkBool32 shaderStorageBufferArrayNonUniformIndexing;
+ VkBool32 shaderStorageImageArrayNonUniformIndexing;
+ VkBool32 shaderInputAttachmentArrayNonUniformIndexing;
+ VkBool32 shaderUniformTexelBufferArrayNonUniformIndexing;
+ VkBool32 shaderStorageTexelBufferArrayNonUniformIndexing;
+ VkBool32 descriptorBindingUniformBufferUpdateAfterBind;
+ VkBool32 descriptorBindingSampledImageUpdateAfterBind;
+ VkBool32 descriptorBindingStorageImageUpdateAfterBind;
+ VkBool32 descriptorBindingStorageBufferUpdateAfterBind;
+ VkBool32 descriptorBindingUniformTexelBufferUpdateAfterBind;
+ VkBool32 descriptorBindingStorageTexelBufferUpdateAfterBind;
+ VkBool32 descriptorBindingUpdateUnusedWhilePending;
+ VkBool32 descriptorBindingPartiallyBound;
+ VkBool32 descriptorBindingVariableDescriptorCount;
+ VkBool32 runtimeDescriptorArray;
+ VkBool32 samplerFilterMinmax;
+ VkBool32 scalarBlockLayout;
+ VkBool32 imagelessFramebuffer;
+ VkBool32 uniformBufferStandardLayout;
+ VkBool32 shaderSubgroupExtendedTypes;
+ VkBool32 separateDepthStencilLayouts;
+ VkBool32 hostQueryReset;
+ VkBool32 timelineSemaphore;
+ VkBool32 bufferDeviceAddress;
+ VkBool32 bufferDeviceAddressCaptureReplay;
+ VkBool32 bufferDeviceAddressMultiDevice;
+ VkBool32 vulkanMemoryModel;
+ VkBool32 vulkanMemoryModelDeviceScope;
+ VkBool32 vulkanMemoryModelAvailabilityVisibilityChains;
+ VkBool32 shaderOutputViewportIndex;
+ VkBool32 shaderOutputLayer;
+ VkBool32 subgroupBroadcastDynamicId;
+} VkPhysicalDeviceVulkan12Features;
+
+typedef struct VkConformanceVersion {
+ deUint8 major;
+ deUint8 minor;
+ deUint8 subminor;
+ deUint8 patch;
+} VkConformanceVersion;
+
+typedef struct VkPhysicalDeviceVulkan12Properties {
+ VkStructureType sType;
+ void* pNext;
+ VkDriverId driverID;
+ char driverName[VK_MAX_DRIVER_NAME_SIZE];
+ char driverInfo[VK_MAX_DRIVER_INFO_SIZE];
+ VkConformanceVersion conformanceVersion;
+ VkShaderFloatControlsIndependence denormBehaviorIndependence;
+ VkShaderFloatControlsIndependence roundingModeIndependence;
+ VkBool32 shaderSignedZeroInfNanPreserveFloat16;
+ VkBool32 shaderSignedZeroInfNanPreserveFloat32;
+ VkBool32 shaderSignedZeroInfNanPreserveFloat64;
+ VkBool32 shaderDenormPreserveFloat16;
+ VkBool32 shaderDenormPreserveFloat32;
+ VkBool32 shaderDenormPreserveFloat64;
+ VkBool32 shaderDenormFlushToZeroFloat16;
+ VkBool32 shaderDenormFlushToZeroFloat32;
+ VkBool32 shaderDenormFlushToZeroFloat64;
+ VkBool32 shaderRoundingModeRTEFloat16;
+ VkBool32 shaderRoundingModeRTEFloat32;
+ VkBool32 shaderRoundingModeRTEFloat64;
+ VkBool32 shaderRoundingModeRTZFloat16;
+ VkBool32 shaderRoundingModeRTZFloat32;
+ VkBool32 shaderRoundingModeRTZFloat64;
+ deUint32 maxUpdateAfterBindDescriptorsInAllPools;
+ VkBool32 shaderUniformBufferArrayNonUniformIndexingNative;
+ VkBool32 shaderSampledImageArrayNonUniformIndexingNative;
+ VkBool32 shaderStorageBufferArrayNonUniformIndexingNative;
+ VkBool32 shaderStorageImageArrayNonUniformIndexingNative;
+ VkBool32 shaderInputAttachmentArrayNonUniformIndexingNative;
+ VkBool32 robustBufferAccessUpdateAfterBind;
+ VkBool32 quadDivergentImplicitLod;
+ deUint32 maxPerStageDescriptorUpdateAfterBindSamplers;
+ deUint32 maxPerStageDescriptorUpdateAfterBindUniformBuffers;
+ deUint32 maxPerStageDescriptorUpdateAfterBindStorageBuffers;
+ deUint32 maxPerStageDescriptorUpdateAfterBindSampledImages;
+ deUint32 maxPerStageDescriptorUpdateAfterBindStorageImages;
+ deUint32 maxPerStageDescriptorUpdateAfterBindInputAttachments;
+ deUint32 maxPerStageUpdateAfterBindResources;
+ deUint32 maxDescriptorSetUpdateAfterBindSamplers;
+ deUint32 maxDescriptorSetUpdateAfterBindUniformBuffers;
+ deUint32 maxDescriptorSetUpdateAfterBindUniformBuffersDynamic;
+ deUint32 maxDescriptorSetUpdateAfterBindStorageBuffers;
+ deUint32 maxDescriptorSetUpdateAfterBindStorageBuffersDynamic;
+ deUint32 maxDescriptorSetUpdateAfterBindSampledImages;
+ deUint32 maxDescriptorSetUpdateAfterBindStorageImages;
+ deUint32 maxDescriptorSetUpdateAfterBindInputAttachments;
+ VkResolveModeFlags supportedDepthResolveModes;
+ VkResolveModeFlags supportedStencilResolveModes;
+ VkBool32 independentResolveNone;
+ VkBool32 independentResolve;
+ VkBool32 filterMinmaxSingleComponentFormats;
+ VkBool32 filterMinmaxImageComponentMapping;
+ deUint64 maxTimelineSemaphoreValueDifference;
+ VkSampleCountFlags framebufferIntegerColorSampleCounts;
+} VkPhysicalDeviceVulkan12Properties;
+
+typedef struct VkImageFormatListCreateInfo {
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 viewFormatCount;
+ const VkFormat* pViewFormats;
+} VkImageFormatListCreateInfo;
+
+typedef struct VkAttachmentDescription2 {
+ VkStructureType sType;
+ const void* pNext;
+ VkAttachmentDescriptionFlags flags;
+ VkFormat format;
+ VkSampleCountFlagBits samples;
+ VkAttachmentLoadOp loadOp;
+ VkAttachmentStoreOp storeOp;
+ VkAttachmentLoadOp stencilLoadOp;
+ VkAttachmentStoreOp stencilStoreOp;
+ VkImageLayout initialLayout;
+ VkImageLayout finalLayout;
+} VkAttachmentDescription2;
+
+typedef struct VkAttachmentReference2 {
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 attachment;
+ VkImageLayout layout;
+ VkImageAspectFlags aspectMask;
+} VkAttachmentReference2;
+
+typedef struct VkSubpassDescription2 {
+ VkStructureType sType;
+ const void* pNext;
+ VkSubpassDescriptionFlags flags;
+ VkPipelineBindPoint pipelineBindPoint;
+ deUint32 viewMask;
+ deUint32 inputAttachmentCount;
+ const VkAttachmentReference2* pInputAttachments;
+ deUint32 colorAttachmentCount;
+ const VkAttachmentReference2* pColorAttachments;
+ const VkAttachmentReference2* pResolveAttachments;
+ const VkAttachmentReference2* pDepthStencilAttachment;
+ deUint32 preserveAttachmentCount;
+ const deUint32* pPreserveAttachments;
+} VkSubpassDescription2;
+
+typedef struct VkSubpassDependency2 {
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 srcSubpass;
+ deUint32 dstSubpass;
+ VkPipelineStageFlags srcStageMask;
+ VkPipelineStageFlags dstStageMask;
+ VkAccessFlags srcAccessMask;
+ VkAccessFlags dstAccessMask;
+ VkDependencyFlags dependencyFlags;
+ deInt32 viewOffset;
+} VkSubpassDependency2;
+
+typedef struct VkRenderPassCreateInfo2 {
+ VkStructureType sType;
+ const void* pNext;
+ VkRenderPassCreateFlags flags;
+ deUint32 attachmentCount;
+ const VkAttachmentDescription2* pAttachments;
+ deUint32 subpassCount;
+ const VkSubpassDescription2* pSubpasses;
+ deUint32 dependencyCount;
+ const VkSubpassDependency2* pDependencies;
+ deUint32 correlatedViewMaskCount;
+ const deUint32* pCorrelatedViewMasks;
+} VkRenderPassCreateInfo2;
+
+typedef struct VkSubpassBeginInfo {
+ VkStructureType sType;
+ const void* pNext;
+ VkSubpassContents contents;
+} VkSubpassBeginInfo;
+
+typedef struct VkSubpassEndInfo {
+ VkStructureType sType;
+ const void* pNext;
+} VkSubpassEndInfo;
+
+typedef struct VkPhysicalDevice8BitStorageFeatures {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 storageBuffer8BitAccess;
+ VkBool32 uniformAndStorageBuffer8BitAccess;
+ VkBool32 storagePushConstant8;
+} VkPhysicalDevice8BitStorageFeatures;
+
+typedef struct VkPhysicalDeviceDriverProperties {
+ VkStructureType sType;
+ void* pNext;
+ VkDriverId driverID;
+ char driverName[VK_MAX_DRIVER_NAME_SIZE];
+ char driverInfo[VK_MAX_DRIVER_INFO_SIZE];
+ VkConformanceVersion conformanceVersion;
+} VkPhysicalDeviceDriverProperties;
+
+typedef struct VkPhysicalDeviceShaderAtomicInt64Features {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 shaderBufferInt64Atomics;
+ VkBool32 shaderSharedInt64Atomics;
+} VkPhysicalDeviceShaderAtomicInt64Features;
+
+typedef struct VkPhysicalDeviceShaderFloat16Int8Features {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 shaderFloat16;
+ VkBool32 shaderInt8;
+} VkPhysicalDeviceShaderFloat16Int8Features;
+
+typedef struct VkPhysicalDeviceFloatControlsProperties {
+ VkStructureType sType;
+ void* pNext;
+ VkShaderFloatControlsIndependence denormBehaviorIndependence;
+ VkShaderFloatControlsIndependence roundingModeIndependence;
+ VkBool32 shaderSignedZeroInfNanPreserveFloat16;
+ VkBool32 shaderSignedZeroInfNanPreserveFloat32;
+ VkBool32 shaderSignedZeroInfNanPreserveFloat64;
+ VkBool32 shaderDenormPreserveFloat16;
+ VkBool32 shaderDenormPreserveFloat32;
+ VkBool32 shaderDenormPreserveFloat64;
+ VkBool32 shaderDenormFlushToZeroFloat16;
+ VkBool32 shaderDenormFlushToZeroFloat32;
+ VkBool32 shaderDenormFlushToZeroFloat64;
+ VkBool32 shaderRoundingModeRTEFloat16;
+ VkBool32 shaderRoundingModeRTEFloat32;
+ VkBool32 shaderRoundingModeRTEFloat64;
+ VkBool32 shaderRoundingModeRTZFloat16;
+ VkBool32 shaderRoundingModeRTZFloat32;
+ VkBool32 shaderRoundingModeRTZFloat64;
+} VkPhysicalDeviceFloatControlsProperties;
+
+typedef struct VkDescriptorSetLayoutBindingFlagsCreateInfo {
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 bindingCount;
+ const VkDescriptorBindingFlags* pBindingFlags;
+} VkDescriptorSetLayoutBindingFlagsCreateInfo;
+
+typedef struct VkPhysicalDeviceDescriptorIndexingFeatures {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 shaderInputAttachmentArrayDynamicIndexing;
+ VkBool32 shaderUniformTexelBufferArrayDynamicIndexing;
+ VkBool32 shaderStorageTexelBufferArrayDynamicIndexing;
+ VkBool32 shaderUniformBufferArrayNonUniformIndexing;
+ VkBool32 shaderSampledImageArrayNonUniformIndexing;
+ VkBool32 shaderStorageBufferArrayNonUniformIndexing;
+ VkBool32 shaderStorageImageArrayNonUniformIndexing;
+ VkBool32 shaderInputAttachmentArrayNonUniformIndexing;
+ VkBool32 shaderUniformTexelBufferArrayNonUniformIndexing;
+ VkBool32 shaderStorageTexelBufferArrayNonUniformIndexing;
+ VkBool32 descriptorBindingUniformBufferUpdateAfterBind;
+ VkBool32 descriptorBindingSampledImageUpdateAfterBind;
+ VkBool32 descriptorBindingStorageImageUpdateAfterBind;
+ VkBool32 descriptorBindingStorageBufferUpdateAfterBind;
+ VkBool32 descriptorBindingUniformTexelBufferUpdateAfterBind;
+ VkBool32 descriptorBindingStorageTexelBufferUpdateAfterBind;
+ VkBool32 descriptorBindingUpdateUnusedWhilePending;
+ VkBool32 descriptorBindingPartiallyBound;
+ VkBool32 descriptorBindingVariableDescriptorCount;
+ VkBool32 runtimeDescriptorArray;
+} VkPhysicalDeviceDescriptorIndexingFeatures;
+
+typedef struct VkPhysicalDeviceDescriptorIndexingProperties {
+ VkStructureType sType;
+ void* pNext;
+ deUint32 maxUpdateAfterBindDescriptorsInAllPools;
+ VkBool32 shaderUniformBufferArrayNonUniformIndexingNative;
+ VkBool32 shaderSampledImageArrayNonUniformIndexingNative;
+ VkBool32 shaderStorageBufferArrayNonUniformIndexingNative;
+ VkBool32 shaderStorageImageArrayNonUniformIndexingNative;
+ VkBool32 shaderInputAttachmentArrayNonUniformIndexingNative;
+ VkBool32 robustBufferAccessUpdateAfterBind;
+ VkBool32 quadDivergentImplicitLod;
+ deUint32 maxPerStageDescriptorUpdateAfterBindSamplers;
+ deUint32 maxPerStageDescriptorUpdateAfterBindUniformBuffers;
+ deUint32 maxPerStageDescriptorUpdateAfterBindStorageBuffers;
+ deUint32 maxPerStageDescriptorUpdateAfterBindSampledImages;
+ deUint32 maxPerStageDescriptorUpdateAfterBindStorageImages;
+ deUint32 maxPerStageDescriptorUpdateAfterBindInputAttachments;
+ deUint32 maxPerStageUpdateAfterBindResources;
+ deUint32 maxDescriptorSetUpdateAfterBindSamplers;
+ deUint32 maxDescriptorSetUpdateAfterBindUniformBuffers;
+ deUint32 maxDescriptorSetUpdateAfterBindUniformBuffersDynamic;
+ deUint32 maxDescriptorSetUpdateAfterBindStorageBuffers;
+ deUint32 maxDescriptorSetUpdateAfterBindStorageBuffersDynamic;
+ deUint32 maxDescriptorSetUpdateAfterBindSampledImages;
+ deUint32 maxDescriptorSetUpdateAfterBindStorageImages;
+ deUint32 maxDescriptorSetUpdateAfterBindInputAttachments;
+} VkPhysicalDeviceDescriptorIndexingProperties;
+
+typedef struct VkDescriptorSetVariableDescriptorCountAllocateInfo {
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 descriptorSetCount;
+ const deUint32* pDescriptorCounts;
+} VkDescriptorSetVariableDescriptorCountAllocateInfo;
+
+typedef struct VkDescriptorSetVariableDescriptorCountLayoutSupport {
+ VkStructureType sType;
+ void* pNext;
+ deUint32 maxVariableDescriptorCount;
+} VkDescriptorSetVariableDescriptorCountLayoutSupport;
+
+typedef struct VkSubpassDescriptionDepthStencilResolve {
+ VkStructureType sType;
+ const void* pNext;
+ VkResolveModeFlagBits depthResolveMode;
+ VkResolveModeFlagBits stencilResolveMode;
+ const VkAttachmentReference2* pDepthStencilResolveAttachment;
+} VkSubpassDescriptionDepthStencilResolve;
+
+typedef struct VkPhysicalDeviceDepthStencilResolveProperties {
+ VkStructureType sType;
+ void* pNext;
+ VkResolveModeFlags supportedDepthResolveModes;
+ VkResolveModeFlags supportedStencilResolveModes;
+ VkBool32 independentResolveNone;
+ VkBool32 independentResolve;
+} VkPhysicalDeviceDepthStencilResolveProperties;
+
+typedef struct VkPhysicalDeviceScalarBlockLayoutFeatures {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 scalarBlockLayout;
+} VkPhysicalDeviceScalarBlockLayoutFeatures;
+
+typedef struct VkImageStencilUsageCreateInfo {
+ VkStructureType sType;
+ const void* pNext;
+ VkImageUsageFlags stencilUsage;
+} VkImageStencilUsageCreateInfo;
+
+typedef struct VkSamplerReductionModeCreateInfo {
+ VkStructureType sType;
+ const void* pNext;
+ VkSamplerReductionMode reductionMode;
+} VkSamplerReductionModeCreateInfo;
+
+typedef struct VkPhysicalDeviceSamplerFilterMinmaxProperties {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 filterMinmaxSingleComponentFormats;
+ VkBool32 filterMinmaxImageComponentMapping;
+} VkPhysicalDeviceSamplerFilterMinmaxProperties;
+
+typedef struct VkPhysicalDeviceVulkanMemoryModelFeatures {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 vulkanMemoryModel;
+ VkBool32 vulkanMemoryModelDeviceScope;
+ VkBool32 vulkanMemoryModelAvailabilityVisibilityChains;
+} VkPhysicalDeviceVulkanMemoryModelFeatures;
+
+typedef struct VkPhysicalDeviceImagelessFramebufferFeatures {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 imagelessFramebuffer;
+} VkPhysicalDeviceImagelessFramebufferFeatures;
+
+typedef struct VkFramebufferAttachmentImageInfo {
+ VkStructureType sType;
+ const void* pNext;
+ VkImageCreateFlags flags;
+ VkImageUsageFlags usage;
+ deUint32 width;
+ deUint32 height;
+ deUint32 layerCount;
+ deUint32 viewFormatCount;
+ const VkFormat* pViewFormats;
+} VkFramebufferAttachmentImageInfo;
+
+typedef struct VkFramebufferAttachmentsCreateInfo {
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 attachmentImageInfoCount;
+ const VkFramebufferAttachmentImageInfo* pAttachmentImageInfos;
+} VkFramebufferAttachmentsCreateInfo;
+
+typedef struct VkRenderPassAttachmentBeginInfo {
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 attachmentCount;
+ const VkImageView* pAttachments;
+} VkRenderPassAttachmentBeginInfo;
+
+typedef struct VkPhysicalDeviceUniformBufferStandardLayoutFeatures {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 uniformBufferStandardLayout;
+} VkPhysicalDeviceUniformBufferStandardLayoutFeatures;
+
+typedef struct VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 shaderSubgroupExtendedTypes;
+} VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures;
+
+typedef struct VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 separateDepthStencilLayouts;
+} VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures;
+
+typedef struct VkAttachmentReferenceStencilLayout {
+ VkStructureType sType;
+ void* pNext;
+ VkImageLayout stencilLayout;
+} VkAttachmentReferenceStencilLayout;
+
+typedef struct VkAttachmentDescriptionStencilLayout {
+ VkStructureType sType;
+ void* pNext;
+ VkImageLayout stencilInitialLayout;
+ VkImageLayout stencilFinalLayout;
+} VkAttachmentDescriptionStencilLayout;
+
+typedef struct VkPhysicalDeviceHostQueryResetFeatures {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 hostQueryReset;
+} VkPhysicalDeviceHostQueryResetFeatures;
+
+typedef struct VkPhysicalDeviceTimelineSemaphoreFeatures {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 timelineSemaphore;
+} VkPhysicalDeviceTimelineSemaphoreFeatures;
+
+typedef struct VkPhysicalDeviceTimelineSemaphoreProperties {
+ VkStructureType sType;
+ void* pNext;
+ deUint64 maxTimelineSemaphoreValueDifference;
+} VkPhysicalDeviceTimelineSemaphoreProperties;
+
+typedef struct VkSemaphoreTypeCreateInfo {
+ VkStructureType sType;
+ const void* pNext;
+ VkSemaphoreType semaphoreType;
+ deUint64 initialValue;
+} VkSemaphoreTypeCreateInfo;
+
+typedef struct VkTimelineSemaphoreSubmitInfo {
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 waitSemaphoreValueCount;
+ const deUint64* pWaitSemaphoreValues;
+ deUint32 signalSemaphoreValueCount;
+ const deUint64* pSignalSemaphoreValues;
+} VkTimelineSemaphoreSubmitInfo;
+
+typedef struct VkSemaphoreWaitInfo {
+ VkStructureType sType;
+ const void* pNext;
+ VkSemaphoreWaitFlags flags;
+ deUint32 semaphoreCount;
+ const VkSemaphore* pSemaphores;
+ const deUint64* pValues;
+} VkSemaphoreWaitInfo;
+
+typedef struct VkSemaphoreSignalInfo {
+ VkStructureType sType;
+ const void* pNext;
+ VkSemaphore semaphore;
+ deUint64 value;
+} VkSemaphoreSignalInfo;
+
+typedef struct VkPhysicalDeviceBufferDeviceAddressFeatures {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 bufferDeviceAddress;
+ VkBool32 bufferDeviceAddressCaptureReplay;
+ VkBool32 bufferDeviceAddressMultiDevice;
+} VkPhysicalDeviceBufferDeviceAddressFeatures;
+
+typedef struct VkBufferDeviceAddressInfo {
+ VkStructureType sType;
+ const void* pNext;
+ VkBuffer buffer;
+} VkBufferDeviceAddressInfo;
+
+typedef struct VkBufferOpaqueCaptureAddressCreateInfo {
+ VkStructureType sType;
+ const void* pNext;
+ deUint64 opaqueCaptureAddress;
+} VkBufferOpaqueCaptureAddressCreateInfo;
+
+typedef struct VkMemoryOpaqueCaptureAddressAllocateInfo {
+ VkStructureType sType;
+ const void* pNext;
+ deUint64 opaqueCaptureAddress;
+} VkMemoryOpaqueCaptureAddressAllocateInfo;
+
+typedef struct VkDeviceMemoryOpaqueCaptureAddressInfo {
+ VkStructureType sType;
+ const void* pNext;
+ VkDeviceMemory memory;
+} VkDeviceMemoryOpaqueCaptureAddressInfo;
+
+typedef void (VKAPI_PTR *PFN_vkCmdDrawIndirectCount)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride);
+typedef void (VKAPI_PTR *PFN_vkCmdDrawIndexedIndirectCount)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride);
+typedef VkResult (VKAPI_PTR *PFN_vkCreateRenderPass2)(VkDevice device, const VkRenderPassCreateInfo2* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass);
+typedef void (VKAPI_PTR *PFN_vkCmdBeginRenderPass2)(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, const VkSubpassBeginInfo* pSubpassBeginInfo);
+typedef void (VKAPI_PTR *PFN_vkCmdNextSubpass2)(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo* pSubpassBeginInfo, const VkSubpassEndInfo* pSubpassEndInfo);
+typedef void (VKAPI_PTR *PFN_vkCmdEndRenderPass2)(VkCommandBuffer commandBuffer, const VkSubpassEndInfo* pSubpassEndInfo);
+typedef void (VKAPI_PTR *PFN_vkResetQueryPool)(VkDevice device, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount);
+typedef VkResult (VKAPI_PTR *PFN_vkGetSemaphoreCounterValue)(VkDevice device, VkSemaphore semaphore, deUint64* pValue);
+typedef VkResult (VKAPI_PTR *PFN_vkWaitSemaphores)(VkDevice device, const VkSemaphoreWaitInfo* pWaitInfo, deUint64 timeout);
+typedef VkResult (VKAPI_PTR *PFN_vkSignalSemaphore)(VkDevice device, const VkSemaphoreSignalInfo* pSignalInfo);
+typedef VkDeviceAddress (VKAPI_PTR *PFN_vkGetBufferDeviceAddress)(VkDevice device, const VkBufferDeviceAddressInfo* pInfo);
+typedef deUint64 (VKAPI_PTR *PFN_vkGetBufferOpaqueCaptureAddress)(VkDevice device, const VkBufferDeviceAddressInfo* pInfo);
+typedef deUint64 (VKAPI_PTR *PFN_vkGetDeviceMemoryOpaqueCaptureAddress)(VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirectCount(
+ VkCommandBuffer commandBuffer,
+ VkBuffer buffer,
+ VkDeviceSize offset,
+ VkBuffer countBuffer,
+ VkDeviceSize countBufferOffset,
+ deUint32 maxDrawCount,
+ deUint32 stride);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirectCount(
+ VkCommandBuffer commandBuffer,
+ VkBuffer buffer,
+ VkDeviceSize offset,
+ VkBuffer countBuffer,
+ VkDeviceSize countBufferOffset,
+ deUint32 maxDrawCount,
+ deUint32 stride);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass2(
+ VkDevice device,
+ const VkRenderPassCreateInfo2* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkRenderPass* pRenderPass);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdBeginRenderPass2(
+ VkCommandBuffer commandBuffer,
+ const VkRenderPassBeginInfo* pRenderPassBegin,
+ const VkSubpassBeginInfo* pSubpassBeginInfo);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass2(
+ VkCommandBuffer commandBuffer,
+ const VkSubpassBeginInfo* pSubpassBeginInfo,
+ const VkSubpassEndInfo* pSubpassEndInfo);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass2(
+ VkCommandBuffer commandBuffer,
+ const VkSubpassEndInfo* pSubpassEndInfo);
+
+VKAPI_ATTR void VKAPI_CALL vkResetQueryPool(
+ VkDevice device,
+ VkQueryPool queryPool,
+ deUint32 firstQuery,
+ deUint32 queryCount);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreCounterValue(
+ VkDevice device,
+ VkSemaphore semaphore,
+ deUint64* pValue);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkWaitSemaphores(
+ VkDevice device,
+ const VkSemaphoreWaitInfo* pWaitInfo,
+ deUint64 timeout);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkSignalSemaphore(
+ VkDevice device,
+ const VkSemaphoreSignalInfo* pSignalInfo);
+
+VKAPI_ATTR VkDeviceAddress VKAPI_CALL vkGetBufferDeviceAddress(
+ VkDevice device,
+ const VkBufferDeviceAddressInfo* pInfo);
+
+VKAPI_ATTR deUint64 VKAPI_CALL vkGetBufferOpaqueCaptureAddress(
+ VkDevice device,
+ const VkBufferDeviceAddressInfo* pInfo);
+
+VKAPI_ATTR deUint64 VKAPI_CALL vkGetDeviceMemoryOpaqueCaptureAddress(
+ VkDevice device,
+ const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo);
+#endif
+
+
#define VK_KHR_surface 1
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSurfaceKHR)
#define VK_KHR_SURFACE_SPEC_VERSION 25
@@ -5039,7 +5939,7 @@
#define VK_KHR_display 1
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDisplayKHR)
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDisplayModeKHR)
-#define VK_KHR_DISPLAY_SPEC_VERSION 21
+#define VK_KHR_DISPLAY_SPEC_VERSION 23
#define VK_KHR_DISPLAY_EXTENSION_NAME "VK_KHR_display"
typedef enum VkDisplayPlaneAlphaFlagBitsKHR {
@@ -5162,7 +6062,7 @@
#define VK_KHR_display_swapchain 1
-#define VK_KHR_DISPLAY_SWAPCHAIN_SPEC_VERSION 9
+#define VK_KHR_DISPLAY_SWAPCHAIN_SPEC_VERSION 10
#define VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME "VK_KHR_display_swapchain"
typedef struct VkDisplayPresentInfoKHR {
VkStructureType sType;
@@ -5185,7 +6085,7 @@
#define VK_KHR_sampler_mirror_clamp_to_edge 1
-#define VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_SPEC_VERSION 1
+#define VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_SPEC_VERSION 3
#define VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME "VK_KHR_sampler_mirror_clamp_to_edge"
@@ -5201,7 +6101,7 @@
#define VK_KHR_get_physical_device_properties2 1
-#define VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION 1
+#define VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION 2
#define VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME "VK_KHR_get_physical_device_properties2"
typedef VkPhysicalDeviceFeatures2 VkPhysicalDeviceFeatures2KHR;
@@ -5266,7 +6166,7 @@
#define VK_KHR_device_group 1
-#define VK_KHR_DEVICE_GROUP_SPEC_VERSION 3
+#define VK_KHR_DEVICE_GROUP_SPEC_VERSION 4
#define VK_KHR_DEVICE_GROUP_EXTENSION_NAME "VK_KHR_device_group"
typedef VkPeerMemoryFeatureFlags VkPeerMemoryFeatureFlagsKHR;
@@ -5544,12 +6444,9 @@
#define VK_KHR_shader_float16_int8 1
#define VK_KHR_SHADER_FLOAT16_INT8_SPEC_VERSION 1
#define VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME "VK_KHR_shader_float16_int8"
-typedef struct VkPhysicalDeviceFloat16Int8FeaturesKHR {
- VkStructureType sType;
- void* pNext;
- VkBool32 shaderFloat16;
- VkBool32 shaderInt8;
-} VkPhysicalDeviceFloat16Int8FeaturesKHR;
+typedef VkPhysicalDeviceShaderFloat16Int8Features VkPhysicalDeviceShaderFloat16Int8FeaturesKHR;
+
+typedef VkPhysicalDeviceShaderFloat16Int8Features VkPhysicalDeviceFloat16Int8FeaturesKHR;
@@ -5619,148 +6516,62 @@
const void* pData);
#endif
+
#define VK_KHR_imageless_framebuffer 1
#define VK_KHR_IMAGELESS_FRAMEBUFFER_SPEC_VERSION 1
#define VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME "VK_KHR_imageless_framebuffer"
+typedef VkPhysicalDeviceImagelessFramebufferFeatures VkPhysicalDeviceImagelessFramebufferFeaturesKHR;
-typedef struct VkPhysicalDeviceImagelessFramebufferFeaturesKHR {
- VkStructureType sType;
- void* pNext;
- VkBool32 imagelessFramebuffer;
-} VkPhysicalDeviceImagelessFramebufferFeaturesKHR;
+typedef VkFramebufferAttachmentsCreateInfo VkFramebufferAttachmentsCreateInfoKHR;
-typedef struct VkFramebufferAttachmentImageInfoKHR {
- VkStructureType sType;
- const void* pNext;
- VkImageCreateFlags flags;
- VkImageUsageFlags usage;
- deUint32 width;
- deUint32 height;
- deUint32 layerCount;
- deUint32 viewFormatCount;
- const VkFormat* pViewFormats;
-} VkFramebufferAttachmentImageInfoKHR;
+typedef VkFramebufferAttachmentImageInfo VkFramebufferAttachmentImageInfoKHR;
-typedef struct VkFramebufferAttachmentsCreateInfoKHR {
- VkStructureType sType;
- const void* pNext;
- deUint32 attachmentImageInfoCount;
- const VkFramebufferAttachmentImageInfoKHR* pAttachmentImageInfos;
-} VkFramebufferAttachmentsCreateInfoKHR;
-
-typedef struct VkRenderPassAttachmentBeginInfoKHR {
- VkStructureType sType;
- const void* pNext;
- deUint32 attachmentCount;
- const VkImageView* pAttachments;
-} VkRenderPassAttachmentBeginInfoKHR;
+typedef VkRenderPassAttachmentBeginInfo VkRenderPassAttachmentBeginInfoKHR;
#define VK_KHR_create_renderpass2 1
#define VK_KHR_CREATE_RENDERPASS_2_SPEC_VERSION 1
#define VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME "VK_KHR_create_renderpass2"
-typedef struct VkAttachmentDescription2KHR {
- VkStructureType sType;
- const void* pNext;
- VkAttachmentDescriptionFlags flags;
- VkFormat format;
- VkSampleCountFlagBits samples;
- VkAttachmentLoadOp loadOp;
- VkAttachmentStoreOp storeOp;
- VkAttachmentLoadOp stencilLoadOp;
- VkAttachmentStoreOp stencilStoreOp;
- VkImageLayout initialLayout;
- VkImageLayout finalLayout;
-} VkAttachmentDescription2KHR;
+typedef VkRenderPassCreateInfo2 VkRenderPassCreateInfo2KHR;
-typedef struct VkAttachmentReference2KHR {
- VkStructureType sType;
- const void* pNext;
- deUint32 attachment;
- VkImageLayout layout;
- VkImageAspectFlags aspectMask;
-} VkAttachmentReference2KHR;
+typedef VkAttachmentDescription2 VkAttachmentDescription2KHR;
-typedef struct VkSubpassDescription2KHR {
- VkStructureType sType;
- const void* pNext;
- VkSubpassDescriptionFlags flags;
- VkPipelineBindPoint pipelineBindPoint;
- deUint32 viewMask;
- deUint32 inputAttachmentCount;
- const VkAttachmentReference2KHR* pInputAttachments;
- deUint32 colorAttachmentCount;
- const VkAttachmentReference2KHR* pColorAttachments;
- const VkAttachmentReference2KHR* pResolveAttachments;
- const VkAttachmentReference2KHR* pDepthStencilAttachment;
- deUint32 preserveAttachmentCount;
- const deUint32* pPreserveAttachments;
-} VkSubpassDescription2KHR;
+typedef VkAttachmentReference2 VkAttachmentReference2KHR;
-typedef struct VkSubpassDependency2KHR {
- VkStructureType sType;
- const void* pNext;
- deUint32 srcSubpass;
- deUint32 dstSubpass;
- VkPipelineStageFlags srcStageMask;
- VkPipelineStageFlags dstStageMask;
- VkAccessFlags srcAccessMask;
- VkAccessFlags dstAccessMask;
- VkDependencyFlags dependencyFlags;
- deInt32 viewOffset;
-} VkSubpassDependency2KHR;
+typedef VkSubpassDescription2 VkSubpassDescription2KHR;
-typedef struct VkRenderPassCreateInfo2KHR {
- VkStructureType sType;
- const void* pNext;
- VkRenderPassCreateFlags flags;
- deUint32 attachmentCount;
- const VkAttachmentDescription2KHR* pAttachments;
- deUint32 subpassCount;
- const VkSubpassDescription2KHR* pSubpasses;
- deUint32 dependencyCount;
- const VkSubpassDependency2KHR* pDependencies;
- deUint32 correlatedViewMaskCount;
- const deUint32* pCorrelatedViewMasks;
-} VkRenderPassCreateInfo2KHR;
+typedef VkSubpassDependency2 VkSubpassDependency2KHR;
-typedef struct VkSubpassBeginInfoKHR {
- VkStructureType sType;
- const void* pNext;
- VkSubpassContents contents;
-} VkSubpassBeginInfoKHR;
+typedef VkSubpassBeginInfo VkSubpassBeginInfoKHR;
-typedef struct VkSubpassEndInfoKHR {
- VkStructureType sType;
- const void* pNext;
-} VkSubpassEndInfoKHR;
+typedef VkSubpassEndInfo VkSubpassEndInfoKHR;
-typedef VkResult (VKAPI_PTR *PFN_vkCreateRenderPass2KHR)(VkDevice device, const VkRenderPassCreateInfo2KHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass);
-typedef void (VKAPI_PTR *PFN_vkCmdBeginRenderPass2KHR)(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, const VkSubpassBeginInfoKHR* pSubpassBeginInfo);
-typedef void (VKAPI_PTR *PFN_vkCmdNextSubpass2KHR)(VkCommandBuffer commandBuffer, const VkSubpassBeginInfoKHR* pSubpassBeginInfo, const VkSubpassEndInfoKHR* pSubpassEndInfo);
-typedef void (VKAPI_PTR *PFN_vkCmdEndRenderPass2KHR)(VkCommandBuffer commandBuffer, const VkSubpassEndInfoKHR* pSubpassEndInfo);
+typedef VkResult (VKAPI_PTR *PFN_vkCreateRenderPass2KHR)(VkDevice device, const VkRenderPassCreateInfo2* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass);
+typedef void (VKAPI_PTR *PFN_vkCmdBeginRenderPass2KHR)(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, const VkSubpassBeginInfo* pSubpassBeginInfo);
+typedef void (VKAPI_PTR *PFN_vkCmdNextSubpass2KHR)(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo* pSubpassBeginInfo, const VkSubpassEndInfo* pSubpassEndInfo);
+typedef void (VKAPI_PTR *PFN_vkCmdEndRenderPass2KHR)(VkCommandBuffer commandBuffer, const VkSubpassEndInfo* pSubpassEndInfo);
#ifndef VK_NO_PROTOTYPES
VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass2KHR(
VkDevice device,
- const VkRenderPassCreateInfo2KHR* pCreateInfo,
+ const VkRenderPassCreateInfo2* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkRenderPass* pRenderPass);
VKAPI_ATTR void VKAPI_CALL vkCmdBeginRenderPass2KHR(
VkCommandBuffer commandBuffer,
const VkRenderPassBeginInfo* pRenderPassBegin,
- const VkSubpassBeginInfoKHR* pSubpassBeginInfo);
+ const VkSubpassBeginInfo* pSubpassBeginInfo);
VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass2KHR(
VkCommandBuffer commandBuffer,
- const VkSubpassBeginInfoKHR* pSubpassBeginInfo,
- const VkSubpassEndInfoKHR* pSubpassEndInfo);
+ const VkSubpassBeginInfo* pSubpassBeginInfo,
+ const VkSubpassEndInfo* pSubpassEndInfo);
VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass2KHR(
VkCommandBuffer commandBuffer,
- const VkSubpassEndInfoKHR* pSubpassEndInfo);
+ const VkSubpassEndInfo* pSubpassEndInfo);
#endif
@@ -5852,6 +6663,150 @@
#endif
+#define VK_KHR_performance_query 1
+#define VK_KHR_PERFORMANCE_QUERY_SPEC_VERSION 1
+#define VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME "VK_KHR_performance_query"
+
+typedef enum VkPerformanceCounterUnitKHR {
+ VK_PERFORMANCE_COUNTER_UNIT_GENERIC_KHR = 0,
+ VK_PERFORMANCE_COUNTER_UNIT_PERCENTAGE_KHR = 1,
+ VK_PERFORMANCE_COUNTER_UNIT_NANOSECONDS_KHR = 2,
+ VK_PERFORMANCE_COUNTER_UNIT_BYTES_KHR = 3,
+ VK_PERFORMANCE_COUNTER_UNIT_BYTES_PER_SECOND_KHR = 4,
+ VK_PERFORMANCE_COUNTER_UNIT_KELVIN_KHR = 5,
+ VK_PERFORMANCE_COUNTER_UNIT_WATTS_KHR = 6,
+ VK_PERFORMANCE_COUNTER_UNIT_VOLTS_KHR = 7,
+ VK_PERFORMANCE_COUNTER_UNIT_AMPS_KHR = 8,
+ VK_PERFORMANCE_COUNTER_UNIT_HERTZ_KHR = 9,
+ VK_PERFORMANCE_COUNTER_UNIT_CYCLES_KHR = 10,
+ VK_PERFORMANCE_COUNTER_UNIT_BEGIN_RANGE_KHR = VK_PERFORMANCE_COUNTER_UNIT_GENERIC_KHR,
+ VK_PERFORMANCE_COUNTER_UNIT_END_RANGE_KHR = VK_PERFORMANCE_COUNTER_UNIT_CYCLES_KHR,
+ VK_PERFORMANCE_COUNTER_UNIT_RANGE_SIZE_KHR = (VK_PERFORMANCE_COUNTER_UNIT_CYCLES_KHR - VK_PERFORMANCE_COUNTER_UNIT_GENERIC_KHR + 1),
+ VK_PERFORMANCE_COUNTER_UNIT_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkPerformanceCounterUnitKHR;
+
+typedef enum VkPerformanceCounterScopeKHR {
+ VK_QUERY_SCOPE_COMMAND_BUFFER_KHR = 0,
+ VK_QUERY_SCOPE_RENDER_PASS_KHR = 1,
+ VK_QUERY_SCOPE_COMMAND_KHR = 2,
+ VK_PERFORMANCE_COUNTER_SCOPE_BEGIN_RANGE_KHR = VK_QUERY_SCOPE_COMMAND_BUFFER_KHR,
+ VK_PERFORMANCE_COUNTER_SCOPE_END_RANGE_KHR = VK_QUERY_SCOPE_COMMAND_KHR,
+ VK_PERFORMANCE_COUNTER_SCOPE_RANGE_SIZE_KHR = (VK_QUERY_SCOPE_COMMAND_KHR - VK_QUERY_SCOPE_COMMAND_BUFFER_KHR + 1),
+ VK_PERFORMANCE_COUNTER_SCOPE_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkPerformanceCounterScopeKHR;
+
+typedef enum VkPerformanceCounterStorageKHR {
+ VK_PERFORMANCE_COUNTER_STORAGE_INT32_KHR = 0,
+ VK_PERFORMANCE_COUNTER_STORAGE_INT64_KHR = 1,
+ VK_PERFORMANCE_COUNTER_STORAGE_UINT32_KHR = 2,
+ VK_PERFORMANCE_COUNTER_STORAGE_UINT64_KHR = 3,
+ VK_PERFORMANCE_COUNTER_STORAGE_FLOAT32_KHR = 4,
+ VK_PERFORMANCE_COUNTER_STORAGE_FLOAT64_KHR = 5,
+ VK_PERFORMANCE_COUNTER_STORAGE_BEGIN_RANGE_KHR = VK_PERFORMANCE_COUNTER_STORAGE_INT32_KHR,
+ VK_PERFORMANCE_COUNTER_STORAGE_END_RANGE_KHR = VK_PERFORMANCE_COUNTER_STORAGE_FLOAT64_KHR,
+ VK_PERFORMANCE_COUNTER_STORAGE_RANGE_SIZE_KHR = (VK_PERFORMANCE_COUNTER_STORAGE_FLOAT64_KHR - VK_PERFORMANCE_COUNTER_STORAGE_INT32_KHR + 1),
+ VK_PERFORMANCE_COUNTER_STORAGE_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkPerformanceCounterStorageKHR;
+
+typedef enum VkPerformanceCounterDescriptionFlagBitsKHR {
+ VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_KHR = 0x00000001,
+ VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_KHR = 0x00000002,
+ VK_PERFORMANCE_COUNTER_DESCRIPTION_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkPerformanceCounterDescriptionFlagBitsKHR;
+typedef VkFlags VkPerformanceCounterDescriptionFlagsKHR;
+
+typedef enum VkAcquireProfilingLockFlagBitsKHR {
+ VK_ACQUIRE_PROFILING_LOCK_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkAcquireProfilingLockFlagBitsKHR;
+typedef VkFlags VkAcquireProfilingLockFlagsKHR;
+typedef struct VkPhysicalDevicePerformanceQueryFeaturesKHR {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 performanceCounterQueryPools;
+ VkBool32 performanceCounterMultipleQueryPools;
+} VkPhysicalDevicePerformanceQueryFeaturesKHR;
+
+typedef struct VkPhysicalDevicePerformanceQueryPropertiesKHR {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 allowCommandBufferQueryCopies;
+} VkPhysicalDevicePerformanceQueryPropertiesKHR;
+
+typedef struct VkPerformanceCounterKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkPerformanceCounterUnitKHR unit;
+ VkPerformanceCounterScopeKHR scope;
+ VkPerformanceCounterStorageKHR storage;
+ deUint8 uuid[VK_UUID_SIZE];
+} VkPerformanceCounterKHR;
+
+typedef struct VkPerformanceCounterDescriptionKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkPerformanceCounterDescriptionFlagsKHR flags;
+ char name[VK_MAX_DESCRIPTION_SIZE];
+ char category[VK_MAX_DESCRIPTION_SIZE];
+ char description[VK_MAX_DESCRIPTION_SIZE];
+} VkPerformanceCounterDescriptionKHR;
+
+typedef struct VkQueryPoolPerformanceCreateInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 queueFamilyIndex;
+ deUint32 counterIndexCount;
+ const deUint32* pCounterIndices;
+} VkQueryPoolPerformanceCreateInfoKHR;
+
+typedef union VkPerformanceCounterResultKHR {
+ deInt32 int32;
+ deInt64 int64;
+ deUint32 uint32;
+ deUint64 uint64;
+ float float32;
+ double float64;
+} VkPerformanceCounterResultKHR;
+
+typedef struct VkAcquireProfilingLockInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkAcquireProfilingLockFlagsKHR flags;
+ deUint64 timeout;
+} VkAcquireProfilingLockInfoKHR;
+
+typedef struct VkPerformanceQuerySubmitInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 counterPassIndex;
+} VkPerformanceQuerySubmitInfoKHR;
+
+typedef VkResult (VKAPI_PTR *PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR)(VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, deUint32* pCounterCount, VkPerformanceCounterKHR* pCounters, VkPerformanceCounterDescriptionKHR* pCounterDescriptions);
+typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR)(VkPhysicalDevice physicalDevice, const VkQueryPoolPerformanceCreateInfoKHR* pPerformanceQueryCreateInfo, deUint32* pNumPasses);
+typedef VkResult (VKAPI_PTR *PFN_vkAcquireProfilingLockKHR)(VkDevice device, const VkAcquireProfilingLockInfoKHR* pInfo);
+typedef void (VKAPI_PTR *PFN_vkReleaseProfilingLockKHR)(VkDevice device);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
+ VkPhysicalDevice physicalDevice,
+ deUint32 queueFamilyIndex,
+ deUint32* pCounterCount,
+ VkPerformanceCounterKHR* pCounters,
+ VkPerformanceCounterDescriptionKHR* pCounterDescriptions);
+
+VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(
+ VkPhysicalDevice physicalDevice,
+ const VkQueryPoolPerformanceCreateInfoKHR* pPerformanceQueryCreateInfo,
+ deUint32* pNumPasses);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkAcquireProfilingLockKHR(
+ VkDevice device,
+ const VkAcquireProfilingLockInfoKHR* pInfo);
+
+VKAPI_ATTR void VKAPI_CALL vkReleaseProfilingLockKHR(
+ VkDevice device);
+#endif
+
+
#define VK_KHR_maintenance2 1
#define VK_KHR_MAINTENANCE2_SPEC_VERSION 1
#define VK_KHR_MAINTENANCE2_EXTENSION_NAME "VK_KHR_maintenance2"
@@ -6037,19 +6992,14 @@
#define VK_KHR_image_format_list 1
#define VK_KHR_IMAGE_FORMAT_LIST_SPEC_VERSION 1
#define VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME "VK_KHR_image_format_list"
-typedef struct VkImageFormatListCreateInfoKHR {
- VkStructureType sType;
- const void* pNext;
- deUint32 viewFormatCount;
- const VkFormat* pViewFormats;
-} VkImageFormatListCreateInfoKHR;
+typedef VkImageFormatListCreateInfo VkImageFormatListCreateInfoKHR;
#define VK_KHR_sampler_ycbcr_conversion 1
typedef VkSamplerYcbcrConversion VkSamplerYcbcrConversionKHR;
-#define VK_KHR_SAMPLER_YCBCR_CONVERSION_SPEC_VERSION 1
+#define VK_KHR_SAMPLER_YCBCR_CONVERSION_SPEC_VERSION 14
#define VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME "VK_KHR_sampler_ycbcr_conversion"
typedef VkSamplerYcbcrModelConversion VkSamplerYcbcrModelConversionKHR;
@@ -6153,128 +7103,59 @@
#endif
+#define VK_KHR_shader_subgroup_extended_types 1
+#define VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_SPEC_VERSION 1
+#define VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME "VK_KHR_shader_subgroup_extended_types"
+typedef VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR;
+
+
+
#define VK_KHR_8bit_storage 1
#define VK_KHR_8BIT_STORAGE_SPEC_VERSION 1
#define VK_KHR_8BIT_STORAGE_EXTENSION_NAME "VK_KHR_8bit_storage"
-typedef struct VkPhysicalDevice8BitStorageFeaturesKHR {
- VkStructureType sType;
- void* pNext;
- VkBool32 storageBuffer8BitAccess;
- VkBool32 uniformAndStorageBuffer8BitAccess;
- VkBool32 storagePushConstant8;
-} VkPhysicalDevice8BitStorageFeaturesKHR;
+typedef VkPhysicalDevice8BitStorageFeatures VkPhysicalDevice8BitStorageFeaturesKHR;
#define VK_KHR_shader_atomic_int64 1
#define VK_KHR_SHADER_ATOMIC_INT64_SPEC_VERSION 1
#define VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME "VK_KHR_shader_atomic_int64"
-typedef struct VkPhysicalDeviceShaderAtomicInt64FeaturesKHR {
- VkStructureType sType;
- void* pNext;
- VkBool32 shaderBufferInt64Atomics;
- VkBool32 shaderSharedInt64Atomics;
-} VkPhysicalDeviceShaderAtomicInt64FeaturesKHR;
+typedef VkPhysicalDeviceShaderAtomicInt64Features VkPhysicalDeviceShaderAtomicInt64FeaturesKHR;
#define VK_KHR_driver_properties 1
-#define VK_MAX_DRIVER_NAME_SIZE_KHR 256
-#define VK_MAX_DRIVER_INFO_SIZE_KHR 256
#define VK_KHR_DRIVER_PROPERTIES_SPEC_VERSION 1
#define VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME "VK_KHR_driver_properties"
+#define VK_MAX_DRIVER_NAME_SIZE_KHR VK_MAX_DRIVER_NAME_SIZE
+#define VK_MAX_DRIVER_INFO_SIZE_KHR VK_MAX_DRIVER_INFO_SIZE
+typedef VkDriverId VkDriverIdKHR;
-typedef enum VkDriverIdKHR {
- VK_DRIVER_ID_AMD_PROPRIETARY_KHR = 1,
- VK_DRIVER_ID_AMD_OPEN_SOURCE_KHR = 2,
- VK_DRIVER_ID_MESA_RADV_KHR = 3,
- VK_DRIVER_ID_NVIDIA_PROPRIETARY_KHR = 4,
- VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS_KHR = 5,
- VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA_KHR = 6,
- VK_DRIVER_ID_IMAGINATION_PROPRIETARY_KHR = 7,
- VK_DRIVER_ID_QUALCOMM_PROPRIETARY_KHR = 8,
- VK_DRIVER_ID_ARM_PROPRIETARY_KHR = 9,
- VK_DRIVER_ID_GOOGLE_PASTEL_KHR = 10,
- VK_DRIVER_ID_GGP_PROPRIETARY_KHR = 11,
- VK_DRIVER_ID_BEGIN_RANGE_KHR = VK_DRIVER_ID_AMD_PROPRIETARY_KHR,
- VK_DRIVER_ID_END_RANGE_KHR = VK_DRIVER_ID_GGP_PROPRIETARY_KHR,
- VK_DRIVER_ID_RANGE_SIZE_KHR = (VK_DRIVER_ID_GGP_PROPRIETARY_KHR - VK_DRIVER_ID_AMD_PROPRIETARY_KHR + 1),
- VK_DRIVER_ID_MAX_ENUM_KHR = 0x7FFFFFFF
-} VkDriverIdKHR;
-typedef struct VkConformanceVersionKHR {
- deUint8 major;
- deUint8 minor;
- deUint8 subminor;
- deUint8 patch;
-} VkConformanceVersionKHR;
+typedef VkConformanceVersion VkConformanceVersionKHR;
-typedef struct VkPhysicalDeviceDriverPropertiesKHR {
- VkStructureType sType;
- void* pNext;
- VkDriverIdKHR driverID;
- char driverName[VK_MAX_DRIVER_NAME_SIZE_KHR];
- char driverInfo[VK_MAX_DRIVER_INFO_SIZE_KHR];
- VkConformanceVersionKHR conformanceVersion;
-} VkPhysicalDeviceDriverPropertiesKHR;
+typedef VkPhysicalDeviceDriverProperties VkPhysicalDeviceDriverPropertiesKHR;
#define VK_KHR_shader_float_controls 1
-#define VK_KHR_SHADER_FLOAT_CONTROLS_SPEC_VERSION 1
+#define VK_KHR_SHADER_FLOAT_CONTROLS_SPEC_VERSION 4
#define VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME "VK_KHR_shader_float_controls"
-typedef struct VkPhysicalDeviceFloatControlsPropertiesKHR {
- VkStructureType sType;
- void* pNext;
- VkBool32 separateDenormSettings;
- VkBool32 separateRoundingModeSettings;
- VkBool32 shaderSignedZeroInfNanPreserveFloat16;
- VkBool32 shaderSignedZeroInfNanPreserveFloat32;
- VkBool32 shaderSignedZeroInfNanPreserveFloat64;
- VkBool32 shaderDenormPreserveFloat16;
- VkBool32 shaderDenormPreserveFloat32;
- VkBool32 shaderDenormPreserveFloat64;
- VkBool32 shaderDenormFlushToZeroFloat16;
- VkBool32 shaderDenormFlushToZeroFloat32;
- VkBool32 shaderDenormFlushToZeroFloat64;
- VkBool32 shaderRoundingModeRTEFloat16;
- VkBool32 shaderRoundingModeRTEFloat32;
- VkBool32 shaderRoundingModeRTEFloat64;
- VkBool32 shaderRoundingModeRTZFloat16;
- VkBool32 shaderRoundingModeRTZFloat32;
- VkBool32 shaderRoundingModeRTZFloat64;
-} VkPhysicalDeviceFloatControlsPropertiesKHR;
+typedef VkShaderFloatControlsIndependence VkShaderFloatControlsIndependenceKHR;
+
+typedef VkPhysicalDeviceFloatControlsProperties VkPhysicalDeviceFloatControlsPropertiesKHR;
#define VK_KHR_depth_stencil_resolve 1
#define VK_KHR_DEPTH_STENCIL_RESOLVE_SPEC_VERSION 1
#define VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME "VK_KHR_depth_stencil_resolve"
+typedef VkResolveModeFlagBits VkResolveModeFlagBitsKHR;
-typedef enum VkResolveModeFlagBitsKHR {
- VK_RESOLVE_MODE_NONE_KHR = 0,
- VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR = 0x00000001,
- VK_RESOLVE_MODE_AVERAGE_BIT_KHR = 0x00000002,
- VK_RESOLVE_MODE_MIN_BIT_KHR = 0x00000004,
- VK_RESOLVE_MODE_MAX_BIT_KHR = 0x00000008,
- VK_RESOLVE_MODE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
-} VkResolveModeFlagBitsKHR;
-typedef VkFlags VkResolveModeFlagsKHR;
-typedef struct VkSubpassDescriptionDepthStencilResolveKHR {
- VkStructureType sType;
- const void* pNext;
- VkResolveModeFlagBitsKHR depthResolveMode;
- VkResolveModeFlagBitsKHR stencilResolveMode;
- const VkAttachmentReference2KHR* pDepthStencilResolveAttachment;
-} VkSubpassDescriptionDepthStencilResolveKHR;
+typedef VkResolveModeFlags VkResolveModeFlagsKHR;
-typedef struct VkPhysicalDeviceDepthStencilResolvePropertiesKHR {
- VkStructureType sType;
- void* pNext;
- VkResolveModeFlagsKHR supportedDepthResolveModes;
- VkResolveModeFlagsKHR supportedStencilResolveModes;
- VkBool32 independentResolveNone;
- VkBool32 independentResolve;
-} VkPhysicalDeviceDepthStencilResolvePropertiesKHR;
+typedef VkSubpassDescriptionDepthStencilResolve VkSubpassDescriptionDepthStencilResolveKHR;
+
+typedef VkPhysicalDeviceDepthStencilResolveProperties VkPhysicalDeviceDepthStencilResolvePropertiesKHR;
@@ -6283,19 +7164,60 @@
#define VK_KHR_SWAPCHAIN_MUTABLE_FORMAT_EXTENSION_NAME "VK_KHR_swapchain_mutable_format"
+#define VK_KHR_timeline_semaphore 1
+#define VK_KHR_TIMELINE_SEMAPHORE_SPEC_VERSION 2
+#define VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME "VK_KHR_timeline_semaphore"
+typedef VkSemaphoreType VkSemaphoreTypeKHR;
+
+typedef VkSemaphoreWaitFlagBits VkSemaphoreWaitFlagBitsKHR;
+
+typedef VkSemaphoreWaitFlags VkSemaphoreWaitFlagsKHR;
+
+typedef VkPhysicalDeviceTimelineSemaphoreFeatures VkPhysicalDeviceTimelineSemaphoreFeaturesKHR;
+
+typedef VkPhysicalDeviceTimelineSemaphoreProperties VkPhysicalDeviceTimelineSemaphorePropertiesKHR;
+
+typedef VkSemaphoreTypeCreateInfo VkSemaphoreTypeCreateInfoKHR;
+
+typedef VkTimelineSemaphoreSubmitInfo VkTimelineSemaphoreSubmitInfoKHR;
+
+typedef VkSemaphoreWaitInfo VkSemaphoreWaitInfoKHR;
+
+typedef VkSemaphoreSignalInfo VkSemaphoreSignalInfoKHR;
+
+typedef VkResult (VKAPI_PTR *PFN_vkGetSemaphoreCounterValueKHR)(VkDevice device, VkSemaphore semaphore, deUint64* pValue);
+typedef VkResult (VKAPI_PTR *PFN_vkWaitSemaphoresKHR)(VkDevice device, const VkSemaphoreWaitInfo* pWaitInfo, deUint64 timeout);
+typedef VkResult (VKAPI_PTR *PFN_vkSignalSemaphoreKHR)(VkDevice device, const VkSemaphoreSignalInfo* pSignalInfo);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreCounterValueKHR(
+ VkDevice device,
+ VkSemaphore semaphore,
+ deUint64* pValue);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkWaitSemaphoresKHR(
+ VkDevice device,
+ const VkSemaphoreWaitInfo* pWaitInfo,
+ deUint64 timeout);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkSignalSemaphoreKHR(
+ VkDevice device,
+ const VkSemaphoreSignalInfo* pSignalInfo);
+#endif
+
+
#define VK_KHR_vulkan_memory_model 1
#define VK_KHR_VULKAN_MEMORY_MODEL_SPEC_VERSION 3
#define VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME "VK_KHR_vulkan_memory_model"
-typedef struct VkPhysicalDeviceVulkanMemoryModelFeaturesKHR {
- VkStructureType sType;
- void* pNext;
- VkBool32 vulkanMemoryModel;
- VkBool32 vulkanMemoryModelDeviceScope;
- VkBool32 vulkanMemoryModelAvailabilityVisibilityChains;
-} VkPhysicalDeviceVulkanMemoryModelFeaturesKHR;
+typedef VkPhysicalDeviceVulkanMemoryModelFeatures VkPhysicalDeviceVulkanMemoryModelFeaturesKHR;
+#define VK_KHR_spirv_1_4 1
+#define VK_KHR_SPIRV_1_4_SPEC_VERSION 1
+#define VK_KHR_SPIRV_1_4_EXTENSION_NAME "VK_KHR_spirv_1_4"
+
+
#define VK_KHR_surface_protected_capabilities 1
#define VK_KHR_SURFACE_PROTECTED_CAPABILITIES_SPEC_VERSION 1
#define VK_KHR_SURFACE_PROTECTED_CAPABILITIES_EXTENSION_NAME "VK_KHR_surface_protected_capabilities"
@@ -6307,17 +7229,56 @@
+#define VK_KHR_separate_depth_stencil_layouts 1
+#define VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_SPEC_VERSION 1
+#define VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME "VK_KHR_separate_depth_stencil_layouts"
+typedef VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR;
+
+typedef VkAttachmentReferenceStencilLayout VkAttachmentReferenceStencilLayoutKHR;
+
+typedef VkAttachmentDescriptionStencilLayout VkAttachmentDescriptionStencilLayoutKHR;
+
+
+
#define VK_KHR_uniform_buffer_standard_layout 1
#define VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_SPEC_VERSION 1
#define VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME "VK_KHR_uniform_buffer_standard_layout"
-typedef struct VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR {
- VkStructureType sType;
- void* pNext;
- VkBool32 uniformBufferStandardLayout;
-} VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR;
+typedef VkPhysicalDeviceUniformBufferStandardLayoutFeatures VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR;
+#define VK_KHR_buffer_device_address 1
+#define VK_KHR_BUFFER_DEVICE_ADDRESS_SPEC_VERSION 1
+#define VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME "VK_KHR_buffer_device_address"
+typedef VkPhysicalDeviceBufferDeviceAddressFeatures VkPhysicalDeviceBufferDeviceAddressFeaturesKHR;
+
+typedef VkBufferDeviceAddressInfo VkBufferDeviceAddressInfoKHR;
+
+typedef VkBufferOpaqueCaptureAddressCreateInfo VkBufferOpaqueCaptureAddressCreateInfoKHR;
+
+typedef VkMemoryOpaqueCaptureAddressAllocateInfo VkMemoryOpaqueCaptureAddressAllocateInfoKHR;
+
+typedef VkDeviceMemoryOpaqueCaptureAddressInfo VkDeviceMemoryOpaqueCaptureAddressInfoKHR;
+
+typedef VkDeviceAddress (VKAPI_PTR *PFN_vkGetBufferDeviceAddressKHR)(VkDevice device, const VkBufferDeviceAddressInfo* pInfo);
+typedef deUint64 (VKAPI_PTR *PFN_vkGetBufferOpaqueCaptureAddressKHR)(VkDevice device, const VkBufferDeviceAddressInfo* pInfo);
+typedef deUint64 (VKAPI_PTR *PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR)(VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR VkDeviceAddress VKAPI_CALL vkGetBufferDeviceAddressKHR(
+ VkDevice device,
+ const VkBufferDeviceAddressInfo* pInfo);
+
+VKAPI_ATTR deUint64 VKAPI_CALL vkGetBufferOpaqueCaptureAddressKHR(
+ VkDevice device,
+ const VkBufferDeviceAddressInfo* pInfo);
+
+VKAPI_ATTR deUint64 VKAPI_CALL vkGetDeviceMemoryOpaqueCaptureAddressKHR(
+ VkDevice device,
+ const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo);
+#endif
+
+
#define VK_KHR_pipeline_executable_properties 1
#define VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_SPEC_VERSION 1
#define VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME "VK_KHR_pipeline_executable_properties"
@@ -6411,89 +7372,6 @@
#endif
-#define VK_KHR_timeline_semaphore 1
-#define VK_KHR_TIMELINE_SEMAPHORE_SPEC_VERSION 2
-#define VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME "VK_KHR_timeline_semaphore"
-
-typedef enum VkSemaphoreTypeKHR {
- VK_SEMAPHORE_TYPE_BINARY_KHR = 0,
- VK_SEMAPHORE_TYPE_TIMELINE_KHR = 1,
- VK_SEMAPHORE_TYPE_BEGIN_RANGE_KHR = VK_SEMAPHORE_TYPE_BINARY_KHR,
- VK_SEMAPHORE_TYPE_END_RANGE_KHR = VK_SEMAPHORE_TYPE_TIMELINE_KHR,
- VK_SEMAPHORE_TYPE_RANGE_SIZE_KHR = (VK_SEMAPHORE_TYPE_TIMELINE_KHR - VK_SEMAPHORE_TYPE_BINARY_KHR + 1),
- VK_SEMAPHORE_TYPE_MAX_ENUM_KHR = 0x7FFFFFFF
-} VkSemaphoreTypeKHR;
-
-typedef enum VkSemaphoreWaitFlagBitsKHR {
- VK_SEMAPHORE_WAIT_ANY_BIT_KHR = 0x00000001,
- VK_SEMAPHORE_WAIT_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
-} VkSemaphoreWaitFlagBitsKHR;
-typedef VkFlags VkSemaphoreWaitFlagsKHR;
-typedef struct VkPhysicalDeviceTimelineSemaphoreFeaturesKHR {
- VkStructureType sType;
- void* pNext;
- VkBool32 timelineSemaphore;
-} VkPhysicalDeviceTimelineSemaphoreFeaturesKHR;
-
-typedef struct VkPhysicalDeviceTimelineSemaphorePropertiesKHR {
- VkStructureType sType;
- void* pNext;
- deUint64 maxTimelineSemaphoreValueDifference;
-} VkPhysicalDeviceTimelineSemaphorePropertiesKHR;
-
-typedef struct VkSemaphoreTypeCreateInfoKHR {
- VkStructureType sType;
- const void* pNext;
- VkSemaphoreTypeKHR semaphoreType;
- deUint64 initialValue;
-} VkSemaphoreTypeCreateInfoKHR;
-
-typedef struct VkTimelineSemaphoreSubmitInfoKHR {
- VkStructureType sType;
- const void* pNext;
- deUint32 waitSemaphoreValueCount;
- const deUint64* pWaitSemaphoreValues;
- deUint32 signalSemaphoreValueCount;
- const deUint64* pSignalSemaphoreValues;
-} VkTimelineSemaphoreSubmitInfoKHR;
-
-typedef struct VkSemaphoreWaitInfoKHR {
- VkStructureType sType;
- const void* pNext;
- VkSemaphoreWaitFlagsKHR flags;
- deUint32 semaphoreCount;
- const VkSemaphore* pSemaphores;
- const deUint64* pValues;
-} VkSemaphoreWaitInfoKHR;
-
-typedef struct VkSemaphoreSignalInfoKHR {
- VkStructureType sType;
- const void* pNext;
- VkSemaphore semaphore;
- deUint64 value;
-} VkSemaphoreSignalInfoKHR;
-
-typedef VkResult (VKAPI_PTR *PFN_vkGetSemaphoreCounterValueKHR)(VkDevice device, VkSemaphore semaphore, deUint64* pValue);
-typedef VkResult (VKAPI_PTR *PFN_vkWaitSemaphoresKHR)(VkDevice device, const VkSemaphoreWaitInfoKHR* pWaitInfo, deUint64 timeout);
-typedef VkResult (VKAPI_PTR *PFN_vkSignalSemaphoreKHR)(VkDevice device, const VkSemaphoreSignalInfoKHR* pSignalInfo);
-
-#ifndef VK_NO_PROTOTYPES
-VKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreCounterValueKHR(
- VkDevice device,
- VkSemaphore semaphore,
- deUint64* pValue);
-
-VKAPI_ATTR VkResult VKAPI_CALL vkWaitSemaphoresKHR(
- VkDevice device,
- const VkSemaphoreWaitInfoKHR* pWaitInfo,
- deUint64 timeout);
-
-VKAPI_ATTR VkResult VKAPI_CALL vkSignalSemaphoreKHR(
- VkDevice device,
- const VkSemaphoreSignalInfoKHR* pSignalInfo);
-#endif
-
-
#define VK_EXT_debug_report 1
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDebugReportCallbackEXT)
#define VK_EXT_DEBUG_REPORT_SPEC_VERSION 9
@@ -6840,7 +7718,7 @@
#define VK_AMD_draw_indirect_count 1
-#define VK_AMD_DRAW_INDIRECT_COUNT_SPEC_VERSION 1
+#define VK_AMD_DRAW_INDIRECT_COUNT_SPEC_VERSION 2
#define VK_AMD_DRAW_INDIRECT_COUNT_EXTENSION_NAME "VK_AMD_draw_indirect_count"
typedef void (VKAPI_PTR *PFN_vkCmdDrawIndirectCountAMD)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride);
typedef void (VKAPI_PTR *PFN_vkCmdDrawIndexedIndirectCountAMD)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride);
@@ -7017,7 +7895,7 @@
#define VK_EXT_validation_flags 1
-#define VK_EXT_VALIDATION_FLAGS_SPEC_VERSION 1
+#define VK_EXT_VALIDATION_FLAGS_SPEC_VERSION 2
#define VK_EXT_VALIDATION_FLAGS_EXTENSION_NAME "VK_EXT_validation_flags"
typedef enum VkValidationCheckEXT {
@@ -7047,6 +7925,17 @@
#define VK_EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME "VK_EXT_shader_subgroup_vote"
+#define VK_EXT_texture_compression_astc_hdr 1
+#define VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_SPEC_VERSION 1
+#define VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_EXTENSION_NAME "VK_EXT_texture_compression_astc_hdr"
+typedef struct VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT {
+ VkStructureType sType;
+ const void* pNext;
+ VkBool32 textureCompressionASTC_HDR;
+} VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT;
+
+
+
#define VK_EXT_astc_decode_mode 1
#define VK_EXT_ASTC_DECODE_MODE_SPEC_VERSION 1
#define VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME "VK_EXT_astc_decode_mode"
@@ -7065,7 +7954,7 @@
#define VK_EXT_conditional_rendering 1
-#define VK_EXT_CONDITIONAL_RENDERING_SPEC_VERSION 1
+#define VK_EXT_CONDITIONAL_RENDERING_SPEC_VERSION 2
#define VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME "VK_EXT_conditional_rendering"
typedef enum VkConditionalRenderingFlagBitsEXT {
@@ -7697,7 +8586,7 @@
#define VK_EXT_hdr_metadata 1
-#define VK_EXT_HDR_METADATA_SPEC_VERSION 1
+#define VK_EXT_HDR_METADATA_SPEC_VERSION 2
#define VK_EXT_HDR_METADATA_EXTENSION_NAME "VK_EXT_hdr_metadata"
typedef struct VkXYColorEXT {
float x;
@@ -7881,30 +8770,13 @@
#define VK_EXT_sampler_filter_minmax 1
-#define VK_EXT_SAMPLER_FILTER_MINMAX_SPEC_VERSION 1
+#define VK_EXT_SAMPLER_FILTER_MINMAX_SPEC_VERSION 2
#define VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME "VK_EXT_sampler_filter_minmax"
+typedef VkSamplerReductionMode VkSamplerReductionModeEXT;
-typedef enum VkSamplerReductionModeEXT {
- VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT = 0,
- VK_SAMPLER_REDUCTION_MODE_MIN_EXT = 1,
- VK_SAMPLER_REDUCTION_MODE_MAX_EXT = 2,
- VK_SAMPLER_REDUCTION_MODE_BEGIN_RANGE_EXT = VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT,
- VK_SAMPLER_REDUCTION_MODE_END_RANGE_EXT = VK_SAMPLER_REDUCTION_MODE_MAX_EXT,
- VK_SAMPLER_REDUCTION_MODE_RANGE_SIZE_EXT = (VK_SAMPLER_REDUCTION_MODE_MAX_EXT - VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT + 1),
- VK_SAMPLER_REDUCTION_MODE_MAX_ENUM_EXT = 0x7FFFFFFF
-} VkSamplerReductionModeEXT;
-typedef struct VkSamplerReductionModeCreateInfoEXT {
- VkStructureType sType;
- const void* pNext;
- VkSamplerReductionModeEXT reductionMode;
-} VkSamplerReductionModeCreateInfoEXT;
+typedef VkSamplerReductionModeCreateInfo VkSamplerReductionModeCreateInfoEXT;
-typedef struct VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT {
- VkStructureType sType;
- void* pNext;
- VkBool32 filterMinmaxSingleComponentFormats;
- VkBool32 filterMinmaxImageComponentMapping;
-} VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT;
+typedef VkPhysicalDeviceSamplerFilterMinmaxProperties VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT;
@@ -8121,6 +8993,24 @@
#define VK_NV_FILL_RECTANGLE_EXTENSION_NAME "VK_NV_fill_rectangle"
+#define VK_NV_shader_sm_builtins 1
+#define VK_NV_SHADER_SM_BUILTINS_SPEC_VERSION 1
+#define VK_NV_SHADER_SM_BUILTINS_EXTENSION_NAME "VK_NV_shader_sm_builtins"
+typedef struct VkPhysicalDeviceShaderSMBuiltinsPropertiesNV {
+ VkStructureType sType;
+ void* pNext;
+ deUint32 shaderSMCount;
+ deUint32 shaderWarpsPerSM;
+} VkPhysicalDeviceShaderSMBuiltinsPropertiesNV;
+
+typedef struct VkPhysicalDeviceShaderSMBuiltinsFeaturesNV {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 shaderSMBuiltins;
+} VkPhysicalDeviceShaderSMBuiltinsFeaturesNV;
+
+
+
#define VK_EXT_post_depth_coverage 1
#define VK_EXT_POST_DEPTH_COVERAGE_SPEC_VERSION 1
#define VK_EXT_POST_DEPTH_COVERAGE_EXTENSION_NAME "VK_EXT_post_depth_coverage"
@@ -8253,87 +9143,19 @@
#define VK_EXT_descriptor_indexing 1
#define VK_EXT_DESCRIPTOR_INDEXING_SPEC_VERSION 2
#define VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME "VK_EXT_descriptor_indexing"
+typedef VkDescriptorBindingFlagBits VkDescriptorBindingFlagBitsEXT;
-typedef enum VkDescriptorBindingFlagBitsEXT {
- VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT = 0x00000001,
- VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT = 0x00000002,
- VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT = 0x00000004,
- VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT = 0x00000008,
- VK_DESCRIPTOR_BINDING_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF
-} VkDescriptorBindingFlagBitsEXT;
-typedef VkFlags VkDescriptorBindingFlagsEXT;
-typedef struct VkDescriptorSetLayoutBindingFlagsCreateInfoEXT {
- VkStructureType sType;
- const void* pNext;
- deUint32 bindingCount;
- const VkDescriptorBindingFlagsEXT* pBindingFlags;
-} VkDescriptorSetLayoutBindingFlagsCreateInfoEXT;
+typedef VkDescriptorBindingFlags VkDescriptorBindingFlagsEXT;
-typedef struct VkPhysicalDeviceDescriptorIndexingFeaturesEXT {
- VkStructureType sType;
- void* pNext;
- VkBool32 shaderInputAttachmentArrayDynamicIndexing;
- VkBool32 shaderUniformTexelBufferArrayDynamicIndexing;
- VkBool32 shaderStorageTexelBufferArrayDynamicIndexing;
- VkBool32 shaderUniformBufferArrayNonUniformIndexing;
- VkBool32 shaderSampledImageArrayNonUniformIndexing;
- VkBool32 shaderStorageBufferArrayNonUniformIndexing;
- VkBool32 shaderStorageImageArrayNonUniformIndexing;
- VkBool32 shaderInputAttachmentArrayNonUniformIndexing;
- VkBool32 shaderUniformTexelBufferArrayNonUniformIndexing;
- VkBool32 shaderStorageTexelBufferArrayNonUniformIndexing;
- VkBool32 descriptorBindingUniformBufferUpdateAfterBind;
- VkBool32 descriptorBindingSampledImageUpdateAfterBind;
- VkBool32 descriptorBindingStorageImageUpdateAfterBind;
- VkBool32 descriptorBindingStorageBufferUpdateAfterBind;
- VkBool32 descriptorBindingUniformTexelBufferUpdateAfterBind;
- VkBool32 descriptorBindingStorageTexelBufferUpdateAfterBind;
- VkBool32 descriptorBindingUpdateUnusedWhilePending;
- VkBool32 descriptorBindingPartiallyBound;
- VkBool32 descriptorBindingVariableDescriptorCount;
- VkBool32 runtimeDescriptorArray;
-} VkPhysicalDeviceDescriptorIndexingFeaturesEXT;
+typedef VkDescriptorSetLayoutBindingFlagsCreateInfo VkDescriptorSetLayoutBindingFlagsCreateInfoEXT;
-typedef struct VkPhysicalDeviceDescriptorIndexingPropertiesEXT {
- VkStructureType sType;
- void* pNext;
- deUint32 maxUpdateAfterBindDescriptorsInAllPools;
- VkBool32 shaderUniformBufferArrayNonUniformIndexingNative;
- VkBool32 shaderSampledImageArrayNonUniformIndexingNative;
- VkBool32 shaderStorageBufferArrayNonUniformIndexingNative;
- VkBool32 shaderStorageImageArrayNonUniformIndexingNative;
- VkBool32 shaderInputAttachmentArrayNonUniformIndexingNative;
- VkBool32 robustBufferAccessUpdateAfterBind;
- VkBool32 quadDivergentImplicitLod;
- deUint32 maxPerStageDescriptorUpdateAfterBindSamplers;
- deUint32 maxPerStageDescriptorUpdateAfterBindUniformBuffers;
- deUint32 maxPerStageDescriptorUpdateAfterBindStorageBuffers;
- deUint32 maxPerStageDescriptorUpdateAfterBindSampledImages;
- deUint32 maxPerStageDescriptorUpdateAfterBindStorageImages;
- deUint32 maxPerStageDescriptorUpdateAfterBindInputAttachments;
- deUint32 maxPerStageUpdateAfterBindResources;
- deUint32 maxDescriptorSetUpdateAfterBindSamplers;
- deUint32 maxDescriptorSetUpdateAfterBindUniformBuffers;
- deUint32 maxDescriptorSetUpdateAfterBindUniformBuffersDynamic;
- deUint32 maxDescriptorSetUpdateAfterBindStorageBuffers;
- deUint32 maxDescriptorSetUpdateAfterBindStorageBuffersDynamic;
- deUint32 maxDescriptorSetUpdateAfterBindSampledImages;
- deUint32 maxDescriptorSetUpdateAfterBindStorageImages;
- deUint32 maxDescriptorSetUpdateAfterBindInputAttachments;
-} VkPhysicalDeviceDescriptorIndexingPropertiesEXT;
+typedef VkPhysicalDeviceDescriptorIndexingFeatures VkPhysicalDeviceDescriptorIndexingFeaturesEXT;
-typedef struct VkDescriptorSetVariableDescriptorCountAllocateInfoEXT {
- VkStructureType sType;
- const void* pNext;
- deUint32 descriptorSetCount;
- const deUint32* pDescriptorCounts;
-} VkDescriptorSetVariableDescriptorCountAllocateInfoEXT;
+typedef VkPhysicalDeviceDescriptorIndexingProperties VkPhysicalDeviceDescriptorIndexingPropertiesEXT;
-typedef struct VkDescriptorSetVariableDescriptorCountLayoutSupportEXT {
- VkStructureType sType;
- void* pNext;
- deUint32 maxVariableDescriptorCount;
-} VkDescriptorSetVariableDescriptorCountLayoutSupportEXT;
+typedef VkDescriptorSetVariableDescriptorCountAllocateInfo VkDescriptorSetVariableDescriptorCountAllocateInfoEXT;
+
+typedef VkDescriptorSetVariableDescriptorCountLayoutSupport VkDescriptorSetVariableDescriptorCountLayoutSupportEXT;
@@ -8454,6 +9276,15 @@
#define VK_NV_RAY_TRACING_EXTENSION_NAME "VK_NV_ray_tracing"
#define VK_SHADER_UNUSED_NV (~0U)
+typedef enum VkAccelerationStructureTypeNV {
+ VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV = 0,
+ VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV = 1,
+ VK_ACCELERATION_STRUCTURE_TYPE_BEGIN_RANGE_NV = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV,
+ VK_ACCELERATION_STRUCTURE_TYPE_END_RANGE_NV = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV,
+ VK_ACCELERATION_STRUCTURE_TYPE_RANGE_SIZE_NV = (VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV - VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV + 1),
+ VK_ACCELERATION_STRUCTURE_TYPE_MAX_ENUM_NV = 0x7FFFFFFF
+} VkAccelerationStructureTypeNV;
+
typedef enum VkRayTracingShaderGroupTypeNV {
VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV = 0,
VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_NV = 1,
@@ -8473,15 +9304,6 @@
VK_GEOMETRY_TYPE_MAX_ENUM_NV = 0x7FFFFFFF
} VkGeometryTypeNV;
-typedef enum VkAccelerationStructureTypeNV {
- VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV = 0,
- VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV = 1,
- VK_ACCELERATION_STRUCTURE_TYPE_BEGIN_RANGE_NV = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV,
- VK_ACCELERATION_STRUCTURE_TYPE_END_RANGE_NV = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV,
- VK_ACCELERATION_STRUCTURE_TYPE_RANGE_SIZE_NV = (VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV - VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV + 1),
- VK_ACCELERATION_STRUCTURE_TYPE_MAX_ENUM_NV = 0x7FFFFFFF
-} VkAccelerationStructureTypeNV;
-
typedef enum VkCopyAccelerationStructureModeNV {
VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_NV = 0,
VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_NV = 1,
@@ -8749,7 +9571,7 @@
#define VK_NV_representative_fragment_test 1
-#define VK_NV_REPRESENTATIVE_FRAGMENT_TEST_SPEC_VERSION 1
+#define VK_NV_REPRESENTATIVE_FRAGMENT_TEST_SPEC_VERSION 2
#define VK_NV_REPRESENTATIVE_FRAGMENT_TEST_EXTENSION_NAME "VK_NV_representative_fragment_test"
typedef struct VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV {
VkStructureType sType;
@@ -8766,7 +9588,7 @@
#define VK_EXT_filter_cubic 1
-#define VK_EXT_FILTER_CUBIC_SPEC_VERSION 1
+#define VK_EXT_FILTER_CUBIC_SPEC_VERSION 2
#define VK_EXT_FILTER_CUBIC_EXTENSION_NAME "VK_EXT_filter_cubic"
typedef struct VkPhysicalDeviceImageViewImageFormatInfoEXT {
VkStructureType sType;
@@ -8778,7 +9600,7 @@
VkStructureType sType;
void* pNext;
VkBool32 filterCubic;
- VkBool32 filterCubicMinmax ;
+ VkBool32 filterCubicMinmax;
} VkFilterCubicImageViewImageFormatPropertiesEXT;
@@ -8853,6 +9675,22 @@
#endif
+#define VK_AMD_pipeline_compiler_control 1
+#define VK_AMD_PIPELINE_COMPILER_CONTROL_SPEC_VERSION 1
+#define VK_AMD_PIPELINE_COMPILER_CONTROL_EXTENSION_NAME "VK_AMD_pipeline_compiler_control"
+
+typedef enum VkPipelineCompilerControlFlagBitsAMD {
+ VK_PIPELINE_COMPILER_CONTROL_FLAG_BITS_MAX_ENUM_AMD = 0x7FFFFFFF
+} VkPipelineCompilerControlFlagBitsAMD;
+typedef VkFlags VkPipelineCompilerControlFlagsAMD;
+typedef struct VkPipelineCompilerControlCreateInfoAMD {
+ VkStructureType sType;
+ const void* pNext;
+ VkPipelineCompilerControlFlagsAMD compilerControlFlags;
+} VkPipelineCompilerControlCreateInfoAMD;
+
+
+
#define VK_EXT_calibrated_timestamps 1
#define VK_EXT_CALIBRATED_TIMESTAMPS_SPEC_VERSION 1
#define VK_EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME "VK_EXT_calibrated_timestamps"
@@ -8892,7 +9730,7 @@
#define VK_AMD_shader_core_properties 1
-#define VK_AMD_SHADER_CORE_PROPERTIES_SPEC_VERSION 1
+#define VK_AMD_SHADER_CORE_PROPERTIES_SPEC_VERSION 2
#define VK_AMD_SHADER_CORE_PROPERTIES_EXTENSION_NAME "VK_AMD_shader_core_properties"
typedef struct VkPhysicalDeviceShaderCorePropertiesAMD {
VkStructureType sType;
@@ -9082,7 +9920,7 @@
#define VK_NV_shader_image_footprint 1
-#define VK_NV_SHADER_IMAGE_FOOTPRINT_SPEC_VERSION 1
+#define VK_NV_SHADER_IMAGE_FOOTPRINT_SPEC_VERSION 2
#define VK_NV_SHADER_IMAGE_FOOTPRINT_EXTENSION_NAME "VK_NV_shader_image_footprint"
typedef struct VkPhysicalDeviceShaderImageFootprintFeaturesNV {
VkStructureType sType;
@@ -9151,16 +9989,167 @@
#define VK_INTEL_shader_integer_functions2 1
-#define VK_INTEL_SHADER_INTEGER_FUNCTIONS2_SPEC_VERSION 1
-#define VK_INTEL_SHADER_INTEGER_FUNCTIONS2_EXTENSION_NAME "VK_INTEL_shader_integer_functions2"
-typedef struct VkPhysicalDeviceShaderIntegerFunctions2INTEL {
+#define VK_INTEL_SHADER_INTEGER_FUNCTIONS_2_SPEC_VERSION 1
+#define VK_INTEL_SHADER_INTEGER_FUNCTIONS_2_EXTENSION_NAME "VK_INTEL_shader_integer_functions2"
+typedef struct VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL {
VkStructureType sType;
void* pNext;
VkBool32 shaderIntegerFunctions2;
-} VkPhysicalDeviceShaderIntegerFunctions2INTEL;
+} VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL;
+#define VK_INTEL_performance_query 1
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPerformanceConfigurationINTEL)
+#define VK_INTEL_PERFORMANCE_QUERY_SPEC_VERSION 1
+#define VK_INTEL_PERFORMANCE_QUERY_EXTENSION_NAME "VK_INTEL_performance_query"
+
+typedef enum VkPerformanceConfigurationTypeINTEL {
+ VK_PERFORMANCE_CONFIGURATION_TYPE_COMMAND_QUEUE_METRICS_DISCOVERY_ACTIVATED_INTEL = 0,
+ VK_PERFORMANCE_CONFIGURATION_TYPE_BEGIN_RANGE_INTEL = VK_PERFORMANCE_CONFIGURATION_TYPE_COMMAND_QUEUE_METRICS_DISCOVERY_ACTIVATED_INTEL,
+ VK_PERFORMANCE_CONFIGURATION_TYPE_END_RANGE_INTEL = VK_PERFORMANCE_CONFIGURATION_TYPE_COMMAND_QUEUE_METRICS_DISCOVERY_ACTIVATED_INTEL,
+ VK_PERFORMANCE_CONFIGURATION_TYPE_RANGE_SIZE_INTEL = (VK_PERFORMANCE_CONFIGURATION_TYPE_COMMAND_QUEUE_METRICS_DISCOVERY_ACTIVATED_INTEL - VK_PERFORMANCE_CONFIGURATION_TYPE_COMMAND_QUEUE_METRICS_DISCOVERY_ACTIVATED_INTEL + 1),
+ VK_PERFORMANCE_CONFIGURATION_TYPE_MAX_ENUM_INTEL = 0x7FFFFFFF
+} VkPerformanceConfigurationTypeINTEL;
+
+typedef enum VkQueryPoolSamplingModeINTEL {
+ VK_QUERY_POOL_SAMPLING_MODE_MANUAL_INTEL = 0,
+ VK_QUERY_POOL_SAMPLING_MODE_BEGIN_RANGE_INTEL = VK_QUERY_POOL_SAMPLING_MODE_MANUAL_INTEL,
+ VK_QUERY_POOL_SAMPLING_MODE_END_RANGE_INTEL = VK_QUERY_POOL_SAMPLING_MODE_MANUAL_INTEL,
+ VK_QUERY_POOL_SAMPLING_MODE_RANGE_SIZE_INTEL = (VK_QUERY_POOL_SAMPLING_MODE_MANUAL_INTEL - VK_QUERY_POOL_SAMPLING_MODE_MANUAL_INTEL + 1),
+ VK_QUERY_POOL_SAMPLING_MODE_MAX_ENUM_INTEL = 0x7FFFFFFF
+} VkQueryPoolSamplingModeINTEL;
+
+typedef enum VkPerformanceOverrideTypeINTEL {
+ VK_PERFORMANCE_OVERRIDE_TYPE_NULL_HARDWARE_INTEL = 0,
+ VK_PERFORMANCE_OVERRIDE_TYPE_FLUSH_GPU_CACHES_INTEL = 1,
+ VK_PERFORMANCE_OVERRIDE_TYPE_BEGIN_RANGE_INTEL = VK_PERFORMANCE_OVERRIDE_TYPE_NULL_HARDWARE_INTEL,
+ VK_PERFORMANCE_OVERRIDE_TYPE_END_RANGE_INTEL = VK_PERFORMANCE_OVERRIDE_TYPE_FLUSH_GPU_CACHES_INTEL,
+ VK_PERFORMANCE_OVERRIDE_TYPE_RANGE_SIZE_INTEL = (VK_PERFORMANCE_OVERRIDE_TYPE_FLUSH_GPU_CACHES_INTEL - VK_PERFORMANCE_OVERRIDE_TYPE_NULL_HARDWARE_INTEL + 1),
+ VK_PERFORMANCE_OVERRIDE_TYPE_MAX_ENUM_INTEL = 0x7FFFFFFF
+} VkPerformanceOverrideTypeINTEL;
+
+typedef enum VkPerformanceParameterTypeINTEL {
+ VK_PERFORMANCE_PARAMETER_TYPE_HW_COUNTERS_SUPPORTED_INTEL = 0,
+ VK_PERFORMANCE_PARAMETER_TYPE_STREAM_MARKER_VALID_BITS_INTEL = 1,
+ VK_PERFORMANCE_PARAMETER_TYPE_BEGIN_RANGE_INTEL = VK_PERFORMANCE_PARAMETER_TYPE_HW_COUNTERS_SUPPORTED_INTEL,
+ VK_PERFORMANCE_PARAMETER_TYPE_END_RANGE_INTEL = VK_PERFORMANCE_PARAMETER_TYPE_STREAM_MARKER_VALID_BITS_INTEL,
+ VK_PERFORMANCE_PARAMETER_TYPE_RANGE_SIZE_INTEL = (VK_PERFORMANCE_PARAMETER_TYPE_STREAM_MARKER_VALID_BITS_INTEL - VK_PERFORMANCE_PARAMETER_TYPE_HW_COUNTERS_SUPPORTED_INTEL + 1),
+ VK_PERFORMANCE_PARAMETER_TYPE_MAX_ENUM_INTEL = 0x7FFFFFFF
+} VkPerformanceParameterTypeINTEL;
+
+typedef enum VkPerformanceValueTypeINTEL {
+ VK_PERFORMANCE_VALUE_TYPE_UINT32_INTEL = 0,
+ VK_PERFORMANCE_VALUE_TYPE_UINT64_INTEL = 1,
+ VK_PERFORMANCE_VALUE_TYPE_FLOAT_INTEL = 2,
+ VK_PERFORMANCE_VALUE_TYPE_BOOL_INTEL = 3,
+ VK_PERFORMANCE_VALUE_TYPE_STRING_INTEL = 4,
+ VK_PERFORMANCE_VALUE_TYPE_BEGIN_RANGE_INTEL = VK_PERFORMANCE_VALUE_TYPE_UINT32_INTEL,
+ VK_PERFORMANCE_VALUE_TYPE_END_RANGE_INTEL = VK_PERFORMANCE_VALUE_TYPE_STRING_INTEL,
+ VK_PERFORMANCE_VALUE_TYPE_RANGE_SIZE_INTEL = (VK_PERFORMANCE_VALUE_TYPE_STRING_INTEL - VK_PERFORMANCE_VALUE_TYPE_UINT32_INTEL + 1),
+ VK_PERFORMANCE_VALUE_TYPE_MAX_ENUM_INTEL = 0x7FFFFFFF
+} VkPerformanceValueTypeINTEL;
+typedef union VkPerformanceValueDataINTEL {
+ deUint32 value32;
+ deUint64 value64;
+ float valueFloat;
+ VkBool32 valueBool;
+ const char* valueString;
+} VkPerformanceValueDataINTEL;
+
+typedef struct VkPerformanceValueINTEL {
+ VkPerformanceValueTypeINTEL type;
+ VkPerformanceValueDataINTEL data;
+} VkPerformanceValueINTEL;
+
+typedef struct VkInitializePerformanceApiInfoINTEL {
+ VkStructureType sType;
+ const void* pNext;
+ void* pUserData;
+} VkInitializePerformanceApiInfoINTEL;
+
+typedef struct VkQueryPoolCreateInfoINTEL {
+ VkStructureType sType;
+ const void* pNext;
+ VkQueryPoolSamplingModeINTEL performanceCountersSampling;
+} VkQueryPoolCreateInfoINTEL;
+
+typedef struct VkPerformanceMarkerInfoINTEL {
+ VkStructureType sType;
+ const void* pNext;
+ deUint64 marker;
+} VkPerformanceMarkerInfoINTEL;
+
+typedef struct VkPerformanceStreamMarkerInfoINTEL {
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 marker;
+} VkPerformanceStreamMarkerInfoINTEL;
+
+typedef struct VkPerformanceOverrideInfoINTEL {
+ VkStructureType sType;
+ const void* pNext;
+ VkPerformanceOverrideTypeINTEL type;
+ VkBool32 enable;
+ deUint64 parameter;
+} VkPerformanceOverrideInfoINTEL;
+
+typedef struct VkPerformanceConfigurationAcquireInfoINTEL {
+ VkStructureType sType;
+ const void* pNext;
+ VkPerformanceConfigurationTypeINTEL type;
+} VkPerformanceConfigurationAcquireInfoINTEL;
+
+typedef VkResult (VKAPI_PTR *PFN_vkInitializePerformanceApiINTEL)(VkDevice device, const VkInitializePerformanceApiInfoINTEL* pInitializeInfo);
+typedef void (VKAPI_PTR *PFN_vkUninitializePerformanceApiINTEL)(VkDevice device);
+typedef VkResult (VKAPI_PTR *PFN_vkCmdSetPerformanceMarkerINTEL)(VkCommandBuffer commandBuffer, const VkPerformanceMarkerInfoINTEL* pMarkerInfo);
+typedef VkResult (VKAPI_PTR *PFN_vkCmdSetPerformanceStreamMarkerINTEL)(VkCommandBuffer commandBuffer, const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo);
+typedef VkResult (VKAPI_PTR *PFN_vkCmdSetPerformanceOverrideINTEL)(VkCommandBuffer commandBuffer, const VkPerformanceOverrideInfoINTEL* pOverrideInfo);
+typedef VkResult (VKAPI_PTR *PFN_vkAcquirePerformanceConfigurationINTEL)(VkDevice device, const VkPerformanceConfigurationAcquireInfoINTEL* pAcquireInfo, VkPerformanceConfigurationINTEL* pConfiguration);
+typedef VkResult (VKAPI_PTR *PFN_vkReleasePerformanceConfigurationINTEL)(VkDevice device, VkPerformanceConfigurationINTEL configuration);
+typedef VkResult (VKAPI_PTR *PFN_vkQueueSetPerformanceConfigurationINTEL)(VkQueue queue, VkPerformanceConfigurationINTEL configuration);
+typedef VkResult (VKAPI_PTR *PFN_vkGetPerformanceParameterINTEL)(VkDevice device, VkPerformanceParameterTypeINTEL parameter, VkPerformanceValueINTEL* pValue);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR VkResult VKAPI_CALL vkInitializePerformanceApiINTEL(
+ VkDevice device,
+ const VkInitializePerformanceApiInfoINTEL* pInitializeInfo);
+
+VKAPI_ATTR void VKAPI_CALL vkUninitializePerformanceApiINTEL(
+ VkDevice device);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkCmdSetPerformanceMarkerINTEL(
+ VkCommandBuffer commandBuffer,
+ const VkPerformanceMarkerInfoINTEL* pMarkerInfo);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkCmdSetPerformanceStreamMarkerINTEL(
+ VkCommandBuffer commandBuffer,
+ const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkCmdSetPerformanceOverrideINTEL(
+ VkCommandBuffer commandBuffer,
+ const VkPerformanceOverrideInfoINTEL* pOverrideInfo);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkAcquirePerformanceConfigurationINTEL(
+ VkDevice device,
+ const VkPerformanceConfigurationAcquireInfoINTEL* pAcquireInfo,
+ VkPerformanceConfigurationINTEL* pConfiguration);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkReleasePerformanceConfigurationINTEL(
+ VkDevice device,
+ VkPerformanceConfigurationINTEL configuration);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkQueueSetPerformanceConfigurationINTEL(
+ VkQueue queue,
+ VkPerformanceConfigurationINTEL configuration);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkGetPerformanceParameterINTEL(
+ VkDevice device,
+ VkPerformanceParameterTypeINTEL parameter,
+ VkPerformanceValueINTEL* pValue);
+#endif
+
+
#define VK_EXT_pci_bus_info 1
#define VK_EXT_PCI_BUS_INFO_SPEC_VERSION 2
#define VK_EXT_PCI_BUS_INFO_EXTENSION_NAME "VK_EXT_pci_bus_info"
@@ -9230,11 +10219,7 @@
#define VK_EXT_scalar_block_layout 1
#define VK_EXT_SCALAR_BLOCK_LAYOUT_SPEC_VERSION 1
#define VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME "VK_EXT_scalar_block_layout"
-typedef struct VkPhysicalDeviceScalarBlockLayoutFeaturesEXT {
- VkStructureType sType;
- void* pNext;
- VkBool32 scalarBlockLayout;
-} VkPhysicalDeviceScalarBlockLayoutFeaturesEXT;
+typedef VkPhysicalDeviceScalarBlockLayoutFeatures VkPhysicalDeviceScalarBlockLayoutFeaturesEXT;
@@ -9248,6 +10233,61 @@
#define VK_GOOGLE_DECORATE_STRING_EXTENSION_NAME "VK_GOOGLE_decorate_string"
+#define VK_EXT_subgroup_size_control 1
+#define VK_EXT_SUBGROUP_SIZE_CONTROL_SPEC_VERSION 2
+#define VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME "VK_EXT_subgroup_size_control"
+typedef struct VkPhysicalDeviceSubgroupSizeControlFeaturesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 subgroupSizeControl;
+ VkBool32 computeFullSubgroups;
+} VkPhysicalDeviceSubgroupSizeControlFeaturesEXT;
+
+typedef struct VkPhysicalDeviceSubgroupSizeControlPropertiesEXT {
+ VkStructureType sType;
+ void* pNext;
+ deUint32 minSubgroupSize;
+ deUint32 maxSubgroupSize;
+ deUint32 maxComputeWorkgroupSubgroups;
+ VkShaderStageFlags requiredSubgroupSizeStages;
+} VkPhysicalDeviceSubgroupSizeControlPropertiesEXT;
+
+typedef struct VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT {
+ VkStructureType sType;
+ void* pNext;
+ deUint32 requiredSubgroupSize;
+} VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT;
+
+
+
+#define VK_AMD_shader_core_properties2 1
+#define VK_AMD_SHADER_CORE_PROPERTIES_2_SPEC_VERSION 1
+#define VK_AMD_SHADER_CORE_PROPERTIES_2_EXTENSION_NAME "VK_AMD_shader_core_properties2"
+
+typedef enum VkShaderCorePropertiesFlagBitsAMD {
+ VK_SHADER_CORE_PROPERTIES_FLAG_BITS_MAX_ENUM_AMD = 0x7FFFFFFF
+} VkShaderCorePropertiesFlagBitsAMD;
+typedef VkFlags VkShaderCorePropertiesFlagsAMD;
+typedef struct VkPhysicalDeviceShaderCoreProperties2AMD {
+ VkStructureType sType;
+ void* pNext;
+ VkShaderCorePropertiesFlagsAMD shaderCoreFeatures;
+ deUint32 activeComputeUnitCount;
+} VkPhysicalDeviceShaderCoreProperties2AMD;
+
+
+
+#define VK_AMD_device_coherent_memory 1
+#define VK_AMD_DEVICE_COHERENT_MEMORY_SPEC_VERSION 1
+#define VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME "VK_AMD_device_coherent_memory"
+typedef struct VkPhysicalDeviceCoherentMemoryFeaturesAMD {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 deviceCoherentMemory;
+} VkPhysicalDeviceCoherentMemoryFeaturesAMD;
+
+
+
#define VK_EXT_memory_budget 1
#define VK_EXT_MEMORY_BUDGET_SPEC_VERSION 1
#define VK_EXT_MEMORY_BUDGET_EXTENSION_NAME "VK_EXT_memory_budget"
@@ -9289,7 +10329,6 @@
#define VK_EXT_buffer_device_address 1
-typedef deUint64 VkDeviceAddress;
#define VK_EXT_BUFFER_DEVICE_ADDRESS_SPEC_VERSION 2
#define VK_EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME "VK_EXT_buffer_device_address"
typedef struct VkPhysicalDeviceBufferDeviceAddressFeaturesEXT {
@@ -9302,11 +10341,7 @@
typedef VkPhysicalDeviceBufferDeviceAddressFeaturesEXT VkPhysicalDeviceBufferAddressFeaturesEXT;
-typedef struct VkBufferDeviceAddressInfoEXT {
- VkStructureType sType;
- const void* pNext;
- VkBuffer buffer;
-} VkBufferDeviceAddressInfoEXT;
+typedef VkBufferDeviceAddressInfo VkBufferDeviceAddressInfoEXT;
typedef struct VkBufferDeviceAddressCreateInfoEXT {
VkStructureType sType;
@@ -9314,36 +10349,33 @@
VkDeviceAddress deviceAddress;
} VkBufferDeviceAddressCreateInfoEXT;
-typedef VkDeviceAddress (VKAPI_PTR *PFN_vkGetBufferDeviceAddressEXT)(VkDevice device, const VkBufferDeviceAddressInfoEXT* pInfo);
+typedef VkDeviceAddress (VKAPI_PTR *PFN_vkGetBufferDeviceAddressEXT)(VkDevice device, const VkBufferDeviceAddressInfo* pInfo);
#ifndef VK_NO_PROTOTYPES
VKAPI_ATTR VkDeviceAddress VKAPI_CALL vkGetBufferDeviceAddressEXT(
VkDevice device,
- const VkBufferDeviceAddressInfoEXT* pInfo);
+ const VkBufferDeviceAddressInfo* pInfo);
#endif
#define VK_EXT_separate_stencil_usage 1
#define VK_EXT_SEPARATE_STENCIL_USAGE_SPEC_VERSION 1
#define VK_EXT_SEPARATE_STENCIL_USAGE_EXTENSION_NAME "VK_EXT_separate_stencil_usage"
+typedef VkImageStencilUsageCreateInfo VkImageStencilUsageCreateInfoEXT;
-typedef struct VkImageStencilUsageCreateInfoEXT {
- VkStructureType sType;
- const void* pNext;
- VkImageUsageFlags stencilUsage;
-} VkImageStencilUsageCreateInfoEXT;
#define VK_EXT_validation_features 1
-#define VK_EXT_VALIDATION_FEATURES_SPEC_VERSION 1
+#define VK_EXT_VALIDATION_FEATURES_SPEC_VERSION 2
#define VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME "VK_EXT_validation_features"
typedef enum VkValidationFeatureEnableEXT {
VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT = 0,
VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT = 1,
+ VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT = 2,
VK_VALIDATION_FEATURE_ENABLE_BEGIN_RANGE_EXT = VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT,
- VK_VALIDATION_FEATURE_ENABLE_END_RANGE_EXT = VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT,
- VK_VALIDATION_FEATURE_ENABLE_RANGE_SIZE_EXT = (VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT - VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT + 1),
+ VK_VALIDATION_FEATURE_ENABLE_END_RANGE_EXT = VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT,
+ VK_VALIDATION_FEATURE_ENABLE_RANGE_SIZE_EXT = (VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT - VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT + 1),
VK_VALIDATION_FEATURE_ENABLE_MAX_ENUM_EXT = 0x7FFFFFFF
} VkValidationFeatureEnableEXT;
@@ -9370,6 +10402,7 @@
} VkValidationFeaturesEXT;
+
#define VK_NV_cooperative_matrix 1
#define VK_NV_COOPERATIVE_MATRIX_SPEC_VERSION 1
#define VK_NV_COOPERATIVE_MATRIX_EXTENSION_NAME "VK_NV_cooperative_matrix"
@@ -9495,6 +10528,7 @@
} VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT;
+
#define VK_EXT_ycbcr_image_arrays 1
#define VK_EXT_YCBCR_IMAGE_ARRAYS_SPEC_VERSION 1
#define VK_EXT_YCBCR_IMAGE_ARRAYS_EXTENSION_NAME "VK_EXT_ycbcr_image_arrays"
@@ -9507,7 +10541,7 @@
#define VK_EXT_headless_surface 1
-#define VK_EXT_HEADLESS_SURFACE_SPEC_VERSION 0
+#define VK_EXT_HEADLESS_SURFACE_SPEC_VERSION 1
#define VK_EXT_HEADLESS_SURFACE_EXTENSION_NAME "VK_EXT_headless_surface"
typedef VkFlags VkHeadlessSurfaceCreateFlagsEXT;
typedef struct VkHeadlessSurfaceCreateInfoEXT {
@@ -9527,14 +10561,60 @@
#endif
+#define VK_EXT_line_rasterization 1
+#define VK_EXT_LINE_RASTERIZATION_SPEC_VERSION 1
+#define VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME "VK_EXT_line_rasterization"
+
+typedef enum VkLineRasterizationModeEXT {
+ VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT = 0,
+ VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT = 1,
+ VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT = 2,
+ VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT = 3,
+ VK_LINE_RASTERIZATION_MODE_BEGIN_RANGE_EXT = VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT,
+ VK_LINE_RASTERIZATION_MODE_END_RANGE_EXT = VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT,
+ VK_LINE_RASTERIZATION_MODE_RANGE_SIZE_EXT = (VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT - VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT + 1),
+ VK_LINE_RASTERIZATION_MODE_MAX_ENUM_EXT = 0x7FFFFFFF
+} VkLineRasterizationModeEXT;
+typedef struct VkPhysicalDeviceLineRasterizationFeaturesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 rectangularLines;
+ VkBool32 bresenhamLines;
+ VkBool32 smoothLines;
+ VkBool32 stippledRectangularLines;
+ VkBool32 stippledBresenhamLines;
+ VkBool32 stippledSmoothLines;
+} VkPhysicalDeviceLineRasterizationFeaturesEXT;
+
+typedef struct VkPhysicalDeviceLineRasterizationPropertiesEXT {
+ VkStructureType sType;
+ void* pNext;
+ deUint32 lineSubPixelPrecisionBits;
+} VkPhysicalDeviceLineRasterizationPropertiesEXT;
+
+typedef struct VkPipelineRasterizationLineStateCreateInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ VkLineRasterizationModeEXT lineRasterizationMode;
+ VkBool32 stippledLineEnable;
+ deUint32 lineStippleFactor;
+ deUint16 lineStipplePattern;
+} VkPipelineRasterizationLineStateCreateInfoEXT;
+
+typedef void (VKAPI_PTR *PFN_vkCmdSetLineStippleEXT)(VkCommandBuffer commandBuffer, deUint32 lineStippleFactor, deUint16 lineStipplePattern);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR void VKAPI_CALL vkCmdSetLineStippleEXT(
+ VkCommandBuffer commandBuffer,
+ deUint32 lineStippleFactor,
+ deUint16 lineStipplePattern);
+#endif
+
+
#define VK_EXT_host_query_reset 1
#define VK_EXT_HOST_QUERY_RESET_SPEC_VERSION 1
#define VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME "VK_EXT_host_query_reset"
-typedef struct VkPhysicalDeviceHostQueryResetFeaturesEXT {
- VkStructureType sType;
- void* pNext;
- VkBool32 hostQueryReset;
-} VkPhysicalDeviceHostQueryResetFeaturesEXT;
+typedef VkPhysicalDeviceHostQueryResetFeatures VkPhysicalDeviceHostQueryResetFeaturesEXT;
typedef void (VKAPI_PTR *PFN_vkResetQueryPoolEXT)(VkDevice device, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount);
@@ -9546,6 +10626,7 @@
deUint32 queryCount);
#endif
+
#define VK_EXT_index_type_uint8 1
#define VK_EXT_INDEX_TYPE_UINT8_SPEC_VERSION 1
#define VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME "VK_EXT_index_type_uint8"
@@ -9556,6 +10637,7 @@
} VkPhysicalDeviceIndexTypeUint8FeaturesEXT;
+
#define VK_EXT_shader_demote_to_helper_invocation 1
#define VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_SPEC_VERSION 1
#define VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME "VK_EXT_shader_demote_to_helper_invocation"
@@ -9566,6 +10648,31 @@
} VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT;
+
+#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"
+typedef struct VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 texelBufferAlignment;
+} VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT;
+
+typedef struct VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkDeviceSize storageTexelBufferOffsetAlignmentBytes;
+ VkBool32 storageTexelBufferOffsetSingleTexelAlignment;
+ VkDeviceSize uniformTexelBufferOffsetAlignmentBytes;
+ VkBool32 uniformTexelBufferOffsetSingleTexelAlignment;
+} VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT;
+
+
+
+#define VK_GOOGLE_user_type 1
+#define VK_GOOGLE_USER_TYPE_SPEC_VERSION 1
+#define VK_GOOGLE_USER_TYPE_EXTENSION_NAME "VK_GOOGLE_user_type"
+
#ifdef __cplusplus
}
#endif
diff --git a/external/vulkancts/modules/vulkan/CMakeLists.txt b/external/vulkancts/modules/vulkan/CMakeLists.txt
index 96902c8..a65120a 100644
--- a/external/vulkancts/modules/vulkan/CMakeLists.txt
+++ b/external/vulkancts/modules/vulkan/CMakeLists.txt
@@ -35,8 +35,8 @@
add_subdirectory(transform_feedback)
add_subdirectory(util)
add_subdirectory(amber)
-add_subdirectory(descriptor_indexing)
add_subdirectory(imageless_framebuffer)
+add_subdirectory(descriptor_indexing)
add_subdirectory(fragment_shader_interlock)
include_directories(
@@ -75,8 +75,8 @@
transform_feedback
util
amber
- descriptor_indexing
imageless_framebuffer
+ descriptor_indexing
fragment_shader_interlock
)
@@ -94,6 +94,8 @@
vktTestGroupUtil.hpp
vktInfoTests.cpp
vktInfoTests.hpp
+ vktCustomInstancesDevices.cpp
+ vktCustomInstancesDevices.hpp
)
set(DEQP_VK_LIBS
@@ -133,9 +135,9 @@
deqp-vk-protected-memory
deqp-vk-memory-model
deqp-vk-amber
+ deqp-vk-imageless-framebuffer
deqp-vk-transform-feedback
deqp-vk-descriptor-indexing
- deqp-vk-imageless-framebuffer
deqp-vk-fragment-shader-interlock
)
diff --git a/external/vulkancts/modules/vulkan/amber/vktAmberGraphicsFuzzTests.cpp b/external/vulkancts/modules/vulkan/amber/vktAmberGraphicsFuzzTests.cpp
index be973d2..b9be33b 100644
--- a/external/vulkancts/modules/vulkan/amber/vktAmberGraphicsFuzzTests.cpp
+++ b/external/vulkancts/modules/vulkan/amber/vktAmberGraphicsFuzzTests.cpp
@@ -46,15 +46,23 @@
}
tests[] =
{
+ { "barrier-in-loop-with-break.amber", "barrier-in-loop-with-break", "A compute shader with a barrier in a loop with a break" },
+ { "color-write-in-loop.amber", "color-write-in-loop", "A fragment shader that writes to color in a loop" },
{ "continue-and-merge.amber", "continue-and-merge", "A fragment shader with two nested loops" },
{ "control-flow-switch.amber", "control-flow-switch", "A fragment shader with somewhat complex control flow and a switch" },
+ { "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" },
+ { "early-return-and-barrier.amber", "early-return-and-barrier", "A compute shader with an early return and a barrier" },
{ "fragcoord-control-flow.amber", "fragcoord-control-flow", "A fragment shader that uses FragCoord and somewhat complex control flow" },
{ "fragcoord-control-flow-2.amber", "fragcoord-control-flow-2", "A fragment shader that uses FragCoord and somewhat complex control flow" },
+ { "if-and-switch.amber", "if-and-switch", "A fragment shader with a switch and some data flow" },
{ "mat-array-deep-control-flow.amber", "mat-array-deep-control-flow", "A fragment shader that uses an array of matrices and has deep control flow" },
{ "mat-array-distance.amber", "mat-array-distance", "A fragment shader that uses an array of matrices and distance" },
+ { "matrices-and-return-in-loop.amber", "matrices-and-return-in-loop", "A fragment shader with matrices and a return in a loop" },
{ "pow-vec4.amber", "pow-vec4", "A fragment shader that uses pow" },
+ { "return-in-loop-in-function.amber", "return-in-loop-in-function", "A fragment shader with early return from loop in function" },
{ "swizzle-struct-init-min.amber", "swizzle-struct-init-min", "A fragment shader that uses vector swizzles, struct initializers, and min" },
+ { "unreachable-loops-in-switch.amber", "unreachable-loops-in-switch", "A fragment shader with unreachable loops in a switch" },
{ "while-inside-switch.amber", "while-inside-switch", "A fragment shader that uses a while loop inside a switch" },
};
diff --git a/external/vulkancts/modules/vulkan/amber/vktAmberTestCase.cpp b/external/vulkancts/modules/vulkan/amber/vktAmberTestCase.cpp
index 51c5441..5586bb7 100644
--- a/external/vulkancts/modules/vulkan/amber/vktAmberTestCase.cpp
+++ b/external/vulkancts/modules/vulkan/amber/vktAmberTestCase.cpp
@@ -36,6 +36,7 @@
#include "vktAmberHelper.hpp"
#include "tcuResource.hpp"
#include "tcuTestLog.hpp"
+#include "vkSpirVProgram.hpp"
namespace vkt
{
@@ -214,7 +215,7 @@
if (shader.format == amber::kShaderFormatSpirvAsm)
{
- programCollection.spirvAsmSources.add(shader.shader_name) << shader.shader_source;
+ programCollection.spirvAsmSources.add(shader.shader_name) << shader.shader_source << m_asm_options;
}
else if (shader.format == amber::kShaderFormatGlsl)
{
@@ -306,6 +307,11 @@
return r.IsSuccess() ? tcu::TestStatus::pass("Pass") :tcu::TestStatus::fail("Fail");
}
+void AmberTestCase::setSpirVAsmBuildOptions(const vk::SpirVAsmBuildOptions& asm_options)
+{
+ m_asm_options = asm_options;
+}
+
void AmberTestCase::addRequirement(const std::string& requirement)
{
if (requirement.find(".") != std::string::npos)
diff --git a/external/vulkancts/modules/vulkan/amber/vktAmberTestCase.hpp b/external/vulkancts/modules/vulkan/amber/vktAmberTestCase.hpp
index 0d7a768..18519cd 100644
--- a/external/vulkancts/modules/vulkan/amber/vktAmberTestCase.hpp
+++ b/external/vulkancts/modules/vulkan/amber/vktAmberTestCase.hpp
@@ -28,6 +28,7 @@
#include <set>
#include "tcuDefs.hpp"
#include "tcuTestCase.hpp"
+#include "vkSpirVProgram.hpp"
#include "vktTestCase.hpp"
namespace amber { class Recipe; }
@@ -75,6 +76,9 @@
bool parse(const char* category, const std::string& filename);
void initPrograms(vk::SourceCollections& programCollection) const;
+ // 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);
// Add a required instance extension, device extension, or feature bit.
// A feature bit is represented by a string of form "<structure>.<feature>", where
@@ -85,6 +89,7 @@
private:
amber::Recipe* m_recipe;
+ vk::SpirVAsmBuildOptions m_asm_options;
// Instance and device extensions required by the test.
// We don't differentiate between the two: We consider the requirement
diff --git a/external/vulkancts/modules/vulkan/api/vktApiBufferAndImageAllocationUtil.cpp b/external/vulkancts/modules/vulkan/api/vktApiBufferAndImageAllocationUtil.cpp
index 80ce33a..75c89e6 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiBufferAndImageAllocationUtil.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiBufferAndImageAllocationUtil.cpp
@@ -75,12 +75,8 @@
de::MovePtr<Allocation>& memory) const
{
DE_UNREF(allocator);
- const std::vector<std::string>& extensions = context.getDeviceExtensions();
- const deBool isSupported = isDeviceExtensionSupported(context.getUsedApiVersion(), extensions, "VK_KHR_dedicated_allocation");
- if (!isSupported)
- {
+ if (!context.isDeviceFunctionalitySupported("VK_KHR_dedicated_allocation"))
TCU_THROW(NotSupportedError, "Not supported");
- }
const InstanceInterface& vkInstance = context.getInstanceInterface();
const VkDevice vkDevice = context.getDevice();
@@ -153,9 +149,7 @@
VkImageTiling tiling) const
{
DE_UNREF(allocator);
- const std::vector<std::string>& extensions = context.getDeviceExtensions();
- const deBool isSupported = isDeviceExtensionSupported(context.getUsedApiVersion(), extensions, "VK_KHR_dedicated_allocation");
- if (!isSupported)
+ if (!context.isDeviceFunctionalitySupported("VK_KHR_dedicated_allocation"))
{
TCU_THROW(NotSupportedError, "Not supported");
}
diff --git a/external/vulkancts/modules/vulkan/api/vktApiBufferTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiBufferTests.cpp
index df8b4aa..af1a4d6 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiBufferTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiBufferTests.cpp
@@ -94,7 +94,6 @@
BufferCaseParameters testCase)
: TestInstance (ctx)
, m_testCase (testCase)
- , m_sparseContext (createSparseContext())
{
}
virtual tcu::TestStatus iterate (void);
@@ -102,129 +101,6 @@
protected:
BufferCaseParameters m_testCase;
-
- // Wrapper functions around m_context calls to support sparse cases.
- VkPhysicalDevice getPhysicalDevice (void) const
- {
- // Same in sparse and regular case
- return m_context.getPhysicalDevice();
- }
-
- VkDevice getDevice (void) const
- {
- if (m_sparseContext)
- {
- return *(m_sparseContext->m_device);
- }
- return m_context.getDevice();
- }
-
- const InstanceInterface& getInstanceInterface (void) const
- {
- // Same in sparse and regular case
- return m_context.getInstanceInterface();
- }
-
- const DeviceInterface& getDeviceInterface (void) const
- {
- if (m_sparseContext)
- {
- return m_sparseContext->m_deviceInterface;
- }
- return m_context.getDeviceInterface();
- }
-
- deUint32 getUniversalQueueFamilyIndex (void) const
- {
- if (m_sparseContext)
- {
- return m_sparseContext->m_queueFamilyIndex;
- }
- return m_context.getUniversalQueueFamilyIndex();
- }
-
-private:
- // Custom context for sparse cases
- struct SparseContext
- {
- SparseContext (Move<VkDevice>& device,
- const deUint32 queueFamilyIndex,
- const PlatformInterface& platformInterface,
- VkInstance instance)
- : m_device (device)
- , m_queueFamilyIndex (queueFamilyIndex)
- , m_deviceInterface (platformInterface, instance, *m_device)
- {
- }
-
- Unique<VkDevice> m_device;
- const deUint32 m_queueFamilyIndex;
- DeviceDriver m_deviceInterface;
- };
-
- de::UniquePtr<SparseContext> m_sparseContext;
-
- static deUint32 findQueueFamilyIndexWithCaps (const InstanceInterface& vkInstance,
- VkPhysicalDevice physicalDevice,
- VkQueueFlags requiredCaps)
- {
- const std::vector<vk::VkQueueFamilyProperties>
- queueProps = getPhysicalDeviceQueueFamilyProperties(vkInstance, physicalDevice);
-
- for (size_t queueNdx = 0; queueNdx < queueProps.size(); queueNdx++)
- {
- if ((queueProps[queueNdx].queueFlags & requiredCaps) == requiredCaps)
- {
- return (deUint32)queueNdx;
- }
- }
-
- TCU_THROW(NotSupportedError, "No matching queue found");
- }
-
- // Create the sparseContext
- SparseContext* createSparseContext (void) const
- {
- if ((m_testCase.flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT)
- || (m_testCase.flags & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT)
- || (m_testCase.flags & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT))
- {
- const InstanceInterface& vk = getInstanceInterface();
- const VkPhysicalDevice physicalDevice = getPhysicalDevice();
- const vk::VkPhysicalDeviceFeatures
- deviceFeatures = getPhysicalDeviceFeatures(vk, physicalDevice);
- const deUint32 queueIndex = findQueueFamilyIndexWithCaps(vk, physicalDevice, VK_QUEUE_GRAPHICS_BIT|VK_QUEUE_SPARSE_BINDING_BIT);
- const float queuePriority = 1.0f;
- VkDeviceQueueCreateInfo queueInfo =
- {
- VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
- DE_NULL,
- static_cast<VkDeviceQueueCreateFlags>(0u),
- queueIndex,
- 1u,
- &queuePriority
- };
- VkDeviceCreateInfo deviceInfo =
- {
- VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
- DE_NULL,
- static_cast<VkDeviceQueueCreateFlags>(0u),
- 1u,
- &queueInfo,
- 0u,
- DE_NULL,
- 0u,
- DE_NULL,
- &deviceFeatures
- };
-
- Move<VkDevice> device = createDevice(m_context.getPlatformInterface(), m_context.getInstance(), vk, physicalDevice, &deviceInfo);
-
- return new SparseContext(device, queueIndex, m_context.getPlatformInterface(), m_context.getInstance());
- }
-
- return DE_NULL;
- }
};
class DedicatedAllocationBufferTestInstance : public BufferTestInstance
@@ -307,12 +183,8 @@
virtual void checkSupport (Context& ctx) const
{
- const std::vector<std::string>& extensions = ctx.getDeviceExtensions();
- const deBool isSupported = isDeviceExtensionSupported(ctx.getUsedApiVersion(), extensions, "VK_KHR_dedicated_allocation");
- if (!isSupported)
- {
+ if (!ctx.isDeviceFunctionalitySupported("VK_KHR_dedicated_allocation"))
TCU_THROW(NotSupportedError, "Not supported");
- }
}
private:
BufferCaseParameters m_testCase;
@@ -320,11 +192,11 @@
tcu::TestStatus BufferTestInstance::bufferCreateAndAllocTest (VkDeviceSize size)
{
- const VkPhysicalDevice vkPhysicalDevice = getPhysicalDevice();
- const InstanceInterface& vkInstance = getInstanceInterface();
- const VkDevice vkDevice = getDevice();
- const DeviceInterface& vk = getDeviceInterface();
- const deUint32 queueFamilyIndex = getUniversalQueueFamilyIndex();
+ const VkPhysicalDevice vkPhysicalDevice = m_context.getPhysicalDevice();
+ const InstanceInterface& vkInstance = m_context.getInstanceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const deUint32 queueFamilyIndex = m_context.getSparseQueueFamilyIndex();
const VkPhysicalDeviceMemoryProperties
memoryProperties = getPhysicalDeviceMemoryProperties(vkInstance, vkPhysicalDevice);
const VkPhysicalDeviceLimits limits = getPhysicalDeviceProperties(vkInstance, vkPhysicalDevice).limits;
@@ -446,7 +318,7 @@
// Bind the memory
if ((m_testCase.flags & (VK_BUFFER_CREATE_SPARSE_BINDING_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_ALIASED_BIT)) != 0)
{
- const VkQueue queue = getDeviceQueue(vk, vkDevice, queueFamilyIndex, 0);
+ const VkQueue queue = m_context.getSparseQueue();
const VkSparseMemoryBind sparseMemoryBind =
{
@@ -519,11 +391,11 @@
tcu::TestStatus DedicatedAllocationBufferTestInstance::bufferCreateAndAllocTest
(VkDeviceSize size)
{
- const VkPhysicalDevice vkPhysicalDevice = getPhysicalDevice();
- const InstanceInterface& vkInstance = getInstanceInterface();
- const VkDevice vkDevice = getDevice();
- const DeviceInterface& vk = getDeviceInterface();
- const deUint32 queueFamilyIndex = getUniversalQueueFamilyIndex();
+ const VkPhysicalDevice vkPhysicalDevice = m_context.getPhysicalDevice();
+ const InstanceInterface& vkInstance = m_context.getInstanceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
const VkPhysicalDeviceMemoryProperties
memoryProperties = getPhysicalDeviceMemoryProperties(vkInstance, vkPhysicalDevice);
const VkPhysicalDeviceLimits limits = getPhysicalDeviceProperties(vkInstance, vkPhysicalDevice).limits;
diff --git a/external/vulkancts/modules/vulkan/api/vktApiBufferViewCreateTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiBufferViewCreateTests.cpp
index 490ee8f..f25ca0d 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiBufferViewCreateTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiBufferViewCreateTests.cpp
@@ -132,9 +132,7 @@
TCU_THROW(NotSupportedError, "Format not supported");
if (m_testCase.bufferAllocationKind == ALLOCATION_KIND_DEDICATED)
{
- const std::vector<std::string>& extensions = ctx.getDeviceExtensions();
- const deBool isSupported = isDeviceExtensionSupported(ctx.getUsedApiVersion(), extensions, "VK_KHR_dedicated_allocation");
- if (!isSupported)
+ if (!ctx.isDeviceFunctionalitySupported("VK_KHR_dedicated_allocation"))
TCU_THROW(NotSupportedError, "Dedicated allocation not supported");
}
}
diff --git a/external/vulkancts/modules/vulkan/api/vktApiCommandBuffersTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiCommandBuffersTests.cpp
index 3596e2a..602a214 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiCommandBuffersTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiCommandBuffersTests.cpp
@@ -962,7 +962,7 @@
tcu::TestStatus trimCommandPoolTest (Context& context, const VkCommandBufferLevel cmdBufferLevel)
{
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_maintenance1"))
+ if (!context.isDeviceFunctionalitySupported("VK_KHR_maintenance1"))
TCU_THROW(NotSupportedError, "Extension VK_KHR_maintenance1 not supported");
const VkDevice vkDevice = context.getDevice();
diff --git a/external/vulkancts/modules/vulkan/api/vktApiCopiesAndBlittingTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiCopiesAndBlittingTests.cpp
index 5b40017..2b03a78 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiCopiesAndBlittingTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiCopiesAndBlittingTests.cpp
@@ -170,12 +170,14 @@
deUint32 mipLevels;
deBool singleCommand;
deUint32 barrierCount;
+ deBool separateDepthStencilLayouts;
TestParams (void)
{
- mipLevels = 1u;
- singleCommand = DE_TRUE;
- barrierCount = 1u;
+ mipLevels = 1u;
+ singleCommand = DE_TRUE;
+ barrierCount = 1u;
+ separateDepthStencilLayouts = DE_FALSE;
}
};
@@ -504,9 +506,10 @@
bufferSize // VkDeviceSize size;
};
- const VkImageAspectFlags formatAspect = getAspectFlags(parms.format);
- const bool skipPreImageBarrier = formatAspect == (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT) &&
- getAspectFlags(imageAccess.getFormat()) == VK_IMAGE_ASPECT_STENCIL_BIT;
+ const VkImageAspectFlags formatAspect = (m_params.separateDepthStencilLayouts) ? getAspectFlags(imageAccess.getFormat()) : getAspectFlags(parms.format);
+ const bool skipPreImageBarrier = (m_params.separateDepthStencilLayouts) ? false : ((formatAspect == (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT) &&
+ getAspectFlags(imageAccess.getFormat()) == VK_IMAGE_ASPECT_STENCIL_BIT));
+
const VkImageMemoryBarrier preImageBarrier =
{
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
@@ -1162,14 +1165,18 @@
{
if (m_params.allocationKind == ALLOCATION_KIND_DEDICATED)
{
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_dedicated_allocation"))
+ if (!context.isDeviceFunctionalitySupported("VK_KHR_dedicated_allocation"))
TCU_THROW(NotSupportedError, "VK_KHR_dedicated_allocation is not supported");
}
+ if (m_params.separateDepthStencilLayouts)
+ if (!context.isDeviceFunctionalitySupported("VK_KHR_separate_depth_stencil_layouts"))
+ TCU_THROW(NotSupportedError, "VK_KHR_separate_depth_stencil_layouts is not supported");
+
if ((m_params.dst.image.imageType == VK_IMAGE_TYPE_3D && m_params.src.image.imageType == VK_IMAGE_TYPE_2D) ||
(m_params.dst.image.imageType == VK_IMAGE_TYPE_2D && m_params.src.image.imageType == VK_IMAGE_TYPE_3D))
{
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_maintenance1"))
+ if (!context.isDeviceFunctionalitySupported("VK_KHR_maintenance1"))
TCU_THROW(NotSupportedError, "Extension VK_KHR_maintenance1 not supported");
}
@@ -4723,6 +4730,10 @@
params.src.image.tiling = VK_IMAGE_TILING_OPTIMAL;
params.dst.image.tiling = VK_IMAGE_TILING_OPTIMAL;
params.allocationKind = allocationKind;
+ params.separateDepthStencilLayouts = DE_FALSE;
+
+ bool hasDepth = tcu::hasDepthComponent(mapVkFormat(params.src.image.format).order);
+ bool hasStencil = tcu::hasStencilComponent(mapVkFormat(params.src.image.format).order);
const VkImageSubresourceLayers defaultDepthSourceLayer = { VK_IMAGE_ASPECT_DEPTH_BIT, 0u, 0u, 1u };
const VkImageSubresourceLayers defaultStencilSourceLayer = { VK_IMAGE_ASPECT_STENCIL_BIT, 0u, 0u, 1u };
@@ -4734,7 +4745,7 @@
const VkOffset3D dstOffset = {i, defaultSize - i - defaultFourthSize, 0};
const VkExtent3D extent = {defaultFourthSize, defaultFourthSize, 1};
- if (tcu::hasDepthComponent(mapVkFormat(params.src.image.format).order))
+ if (hasDepth)
{
const VkImageCopy testCopy =
{
@@ -4748,7 +4759,7 @@
copyRegion.imageCopy = testCopy;
params.regions.push_back(copyRegion);
}
- if (tcu::hasStencilComponent(mapVkFormat(params.src.image.format).order))
+ if (hasStencil)
{
const VkImageCopy testCopy =
{
@@ -4767,6 +4778,14 @@
const std::string testName = getFormatCaseName(params.src.image.format) + "_" + getFormatCaseName(params.dst.image.format);
const std::string description = "Copy from " + getFormatCaseName(params.src.image.format) + " to " + getFormatCaseName(params.dst.image.format);
addTestGroup(group, testName, description, addImageToImageAllFormatsDepthStencilFormatsTests, params);
+
+ if (hasDepth && hasStencil)
+ {
+ params.separateDepthStencilLayouts = DE_TRUE;
+ const std::string testName2 = getFormatCaseName(params.src.image.format) + "_" + getFormatCaseName(params.dst.image.format) + "_separate_layouts";
+ const std::string description2 = "Copy from " + getFormatCaseName(params.src.image.format) + " to " + getFormatCaseName(params.dst.image.format) + " with separate depth/stencil layouts";
+ addTestGroup(group, testName2, description2, addImageToImageAllFormatsDepthStencilFormatsTests, params);
+ }
}
}
@@ -6745,6 +6764,7 @@
params.dst.image.format = params.src.image.format;
params.dst.image.tiling = VK_IMAGE_TILING_OPTIMAL;
params.allocationKind = allocationKind;
+ params.separateDepthStencilLayouts = DE_FALSE;
bool hasDepth = tcu::hasDepthComponent(mapVkFormat(params.src.image.format).order);
bool hasStencil = tcu::hasStencilComponent(mapVkFormat(params.src.image.format).order);
@@ -6834,6 +6854,16 @@
const std::string description = "Blit from " + getFormatCaseName(params.src.image.format) +
" to " + getFormatCaseName(params.dst.image.format);
addTestGroup(group, testName, description, addBlittingImageAllFormatsDepthStencilFormatsTests, params);
+
+ if (hasDepth && hasStencil)
+ {
+ params.separateDepthStencilLayouts = DE_TRUE;
+ const std::string testName2 = getFormatCaseName(params.src.image.format) + "_" +
+ getFormatCaseName(params.dst.image.format) + "_separate_layouts";
+ const std::string description2 = "Blit from " + getFormatCaseName(params.src.image.format) +
+ " to " + getFormatCaseName(params.dst.image.format) + " with separate depth/stencil layouts";
+ addTestGroup(group, testName2, description2, addBlittingImageAllFormatsDepthStencilFormatsTests, params);
+ }
}
}
diff --git a/external/vulkancts/modules/vulkan/api/vktApiDescriptorPoolTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiDescriptorPoolTests.cpp
index 03d7c57..96518db 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiDescriptorPoolTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiDescriptorPoolTests.cpp
@@ -162,7 +162,7 @@
{
const DeviceInterface& vkd = context.getDeviceInterface();
const VkDevice device = context.getDevice();
- const bool expectOutOfPoolMemoryError = isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_maintenance1");
+ const bool expectOutOfPoolMemoryError = context.isDeviceFunctionalitySupported("VK_KHR_maintenance1");
deUint32 numErrorsReturned = 0;
const struct FailureCase
diff --git a/external/vulkancts/modules/vulkan/api/vktApiDescriptorSetTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiDescriptorSetTests.cpp
index 288fc01..5ce7529 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiDescriptorSetTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiDescriptorSetTests.cpp
@@ -225,7 +225,7 @@
const VkDevice device = context.getDevice();
if (descriptorSetLayoutCreateFlags == VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR)
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_push_descriptor"))
+ if (!context.isDeviceFunctionalitySupported("VK_KHR_push_descriptor"))
TCU_THROW(NotSupportedError, "VK_KHR_push_descriptor extension not supported");
const VkDescriptorSetLayoutCreateInfo descriptorSetLayoutCreateInfo =
diff --git a/external/vulkancts/modules/vulkan/api/vktApiDeviceInitializationTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiDeviceInitializationTests.cpp
index eff193d..41adc97 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiDeviceInitializationTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiDeviceInitializationTests.cpp
@@ -23,6 +23,7 @@
#include "vktApiDeviceInitializationTests.hpp"
#include "vktTestCaseUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkDefs.hpp"
#include "vkPlatform.hpp"
@@ -65,7 +66,6 @@
const int patchNumbers[] = { 0, 1, 2, 3, 4, 5, 13, 4094, 4095 };
const deUint32 appVersions[] = { 0, 1, (deUint32)-1 };
const deUint32 engineVersions[] = { 0, 1, (deUint32)-1 };
- const PlatformInterface& platformInterface = context.getPlatformInterface();
const deUint32 apiVersion = context.getUsedApiVersion();
vector<VkApplicationInfo> appInfos;
@@ -192,7 +192,7 @@
try
{
- const Unique<VkInstance> instance(createInstance(platformInterface, &instanceCreateInfo));
+ CustomInstance instance = createCustomInstanceFromInfo(context, &instanceCreateInfo);
log << TestLog::Message << "Succeeded" << TestLog::EndMessage;
}
catch (const vk::Error& err)
@@ -211,7 +211,7 @@
const PlatformInterface& platformInterface = context.getPlatformInterface();
deUint32 instanceApiVersion = 0u;
- context.getPlatformInterface().enumerateInstanceVersion(&instanceApiVersion);
+ platformInterface.enumerateInstanceVersion(&instanceApiVersion);
const ApiVersion apiVersion = unpackVersion(instanceApiVersion);
@@ -234,7 +234,7 @@
0u, // deUint32 engineVersion;
pack(invalidApiVersions[apiVersionNdx]), // deUint32 apiVersion;
};
- const VkInstanceCreateInfo instanceCreateInfo =
+ const VkInstanceCreateInfo instanceCreateInfo =
{
VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
@@ -246,28 +246,20 @@
DE_NULL, // const char*const* ppEnabledExtensionNames;
};
-
log << TestLog::Message
<< "API version reported by enumerateInstanceVersion: " << apiVersion
<< ", api version used to create instance: " << invalidApiVersions[apiVersionNdx]
<< TestLog::EndMessage;
{
- VkInstance instance = (VkInstance)0;
- const VkResult result = platformInterface.createInstance(&instanceCreateInfo, DE_NULL/*pAllocator*/, &instance);
- const bool gotInstance = !!instance;
-
- if (instance)
- {
- const InstanceDriver instanceIface(platformInterface, instance);
- instanceIface.destroyInstance(instance, DE_NULL/*pAllocator*/);
- }
+ UncheckedInstance instance;
+ const VkResult result = createUncheckedInstance(context, &instanceCreateInfo, DE_NULL, &instance);
if (apiVersion.majorNum == 1 && apiVersion.minorNum == 0)
{
if (result == VK_ERROR_INCOMPATIBLE_DRIVER)
{
- TCU_CHECK(!gotInstance);
+ TCU_CHECK(!static_cast<bool>(instance));
log << TestLog::Message << "Pass, instance creation with invalid apiVersion is rejected" << TestLog::EndMessage;
}
else
@@ -277,7 +269,7 @@
{
if (result == VK_SUCCESS)
{
- TCU_CHECK(gotInstance);
+ TCU_CHECK(static_cast<bool>(instance));
log << TestLog::Message << "Pass, instance creation with nonstandard apiVersion succeeds for Vulkan 1.1" << TestLog::EndMessage;
}
else if (result == VK_ERROR_INCOMPATIBLE_DRIVER)
@@ -301,9 +293,8 @@
{
tcu::TestLog& log = context.getTestContext().getLog();
tcu::ResultCollector resultCollector (log);
- const PlatformInterface& platformInterface = context.getPlatformInterface();
- const VkInstanceCreateInfo instanceCreateInfo =
+ const VkInstanceCreateInfo instanceCreateInfo =
{
VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
@@ -319,7 +310,7 @@
try
{
- const Unique<VkInstance> instance(createInstance(platformInterface, &instanceCreateInfo));
+ CustomInstance instance = createCustomInstanceFromInfo(context, &instanceCreateInfo);
log << TestLog::Message << "Succeeded" << TestLog::EndMessage;
}
catch (const vk::Error& err)
@@ -333,7 +324,6 @@
tcu::TestStatus createInstanceWithUnsupportedExtensionsTest (Context& context)
{
tcu::TestLog& log = context.getTestContext().getLog();
- const PlatformInterface& platformInterface = context.getPlatformInterface();
const char* enabledExtensions[] = {"VK_UNSUPPORTED_EXTENSION", "THIS_IS_NOT_AN_EXTENSION"};
const deUint32 apiVersion = context.getUsedApiVersion();
const VkApplicationInfo appInfo =
@@ -346,6 +336,7 @@
0u, // deUint32 engineVersion;
apiVersion, // deUint32 apiVersion;
};
+
const VkInstanceCreateInfo instanceCreateInfo =
{
VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // VkStructureType sType;
@@ -364,19 +355,12 @@
log << TestLog::Message << enabledExtensions[ndx] << TestLog::EndMessage;
{
- VkInstance instance = (VkInstance)0;
- const VkResult result = platformInterface.createInstance(&instanceCreateInfo, DE_NULL/*pAllocator*/, &instance);
- const bool gotInstance = !!instance;
-
- if (instance)
- {
- const InstanceDriver instanceIface (platformInterface, instance);
- instanceIface.destroyInstance(instance, DE_NULL/*pAllocator*/);
- }
+ UncheckedInstance instance;
+ const VkResult result = createUncheckedInstance(context, &instanceCreateInfo, DE_NULL, &instance);
if (result == VK_ERROR_EXTENSION_NOT_PRESENT)
{
- TCU_CHECK(!gotInstance);
+ TCU_CHECK(!static_cast<bool>(instance));
return tcu::TestStatus::pass("Pass, creating instance with unsupported extension was rejected.");
}
else
@@ -463,7 +447,6 @@
tcu::TestStatus createInstanceWithExtensionNameAbuseTest (Context& context)
{
- const PlatformInterface& platformInterface = context.getPlatformInterface();
const char* extensionList[1] = { 0 };
const deUint32 apiVersion = context.getUsedApiVersion();
deUint32 failCount = 0;
@@ -497,20 +480,13 @@
};
{
- VkInstance instance = (VkInstance)0;
- const VkResult result = platformInterface.createInstance(&instanceCreateInfo, DE_NULL/*pAllocator*/, &instance);
- const bool gotInstance = !!instance;
-
- if (instance)
- {
- const InstanceDriver instanceIface(platformInterface, instance);
- instanceIface.destroyInstance(instance, DE_NULL/*pAllocator*/);
- }
+ UncheckedInstance instance;
+ const VkResult result = createUncheckedInstance(context, &instanceCreateInfo, DE_NULL, &instance);
if (result != VK_ERROR_EXTENSION_NOT_PRESENT)
failCount++;
- TCU_CHECK(!gotInstance);
+ TCU_CHECK(!static_cast<bool>(instance));
}
}
@@ -582,9 +558,9 @@
tcu::TestStatus createDeviceTest (Context& context)
{
const PlatformInterface& platformInterface = context.getPlatformInterface();
- const Unique<VkInstance> instance (createDefaultInstance(platformInterface, context.getUsedApiVersion()));
- const InstanceDriver instanceDriver (platformInterface, instance.get());
- const VkPhysicalDevice physicalDevice = chooseDevice(instanceDriver, instance.get(), context.getTestContext().getCommandLine());
+ const CustomInstance instance (createCustomInstanceFromContext(context));
+ const InstanceDriver& instanceDriver (instance.getDriver());
+ const VkPhysicalDevice physicalDevice = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
const deUint32 queueFamilyIndex = 0;
const deUint32 queueCount = 1;
const deUint32 queueIndex = 0;
@@ -601,6 +577,7 @@
queueCount, //queueCount;
&queuePriority, //pQueuePriorities;
};
+
const VkDeviceCreateInfo deviceCreateInfo =
{
VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, //sType;
@@ -615,8 +592,8 @@
DE_NULL, //pEnabledFeatures;
};
- const Unique<VkDevice> device (createDevice(platformInterface, *instance, instanceDriver, physicalDevice, &deviceCreateInfo));
- const DeviceDriver deviceDriver (platformInterface, instance.get(), device.get());
+ const Unique<VkDevice> device (createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), platformInterface, instance, instanceDriver, physicalDevice, &deviceCreateInfo));
+ const DeviceDriver deviceDriver (platformInterface, instance, device.get());
const VkQueue queue = getDeviceQueue(deviceDriver, *device, queueFamilyIndex, queueIndex);
VK_CHECK(deviceDriver.queueWaitIdle(queue));
@@ -630,9 +607,9 @@
tcu::ResultCollector resultCollector (log);
const int numDevices = 5;
const PlatformInterface& platformInterface = context.getPlatformInterface();
- const Unique<VkInstance> instance (createDefaultInstance(platformInterface, context.getUsedApiVersion()));
- const InstanceDriver instanceDriver (platformInterface, instance.get());
- const VkPhysicalDevice physicalDevice = chooseDevice(instanceDriver, instance.get(), context.getTestContext().getCommandLine());
+ const CustomInstance instance (createCustomInstanceFromContext(context));
+ const InstanceDriver& instanceDriver (instance.getDriver());
+ const VkPhysicalDevice physicalDevice = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
const vector<VkQueueFamilyProperties> queueFamilyProperties = getPhysicalDeviceQueueFamilyProperties(instanceDriver, physicalDevice);
const deUint32 queueFamilyIndex = 0;
const deUint32 queueCount = 1;
@@ -647,6 +624,7 @@
queueCount, //queueCount;
&queuePriority, //pQueuePriorities;
};
+
const VkDeviceCreateInfo deviceCreateInfo =
{
VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, //sType;
@@ -660,13 +638,14 @@
DE_NULL, //ppEnabledExtensionNames;
DE_NULL, //pEnabledFeatures;
};
+
vector<VkDevice> devices(numDevices, (VkDevice)DE_NULL);
try
{
for (int deviceNdx = 0; deviceNdx < numDevices; deviceNdx++)
{
- const VkResult result = instanceDriver.createDevice(physicalDevice, &deviceCreateInfo, DE_NULL/*pAllocator*/, &devices[deviceNdx]);
+ const VkResult result = createUncheckedDevice(context.getTestContext().getCommandLine().isValidationEnabled(), instanceDriver, physicalDevice, &deviceCreateInfo, DE_NULL/*pAllocator*/, &devices[deviceNdx]);
if (result != VK_SUCCESS)
{
@@ -675,7 +654,7 @@
}
{
- const DeviceDriver deviceDriver (platformInterface, instance.get(), devices[deviceNdx]);
+ const DeviceDriver deviceDriver (platformInterface, instance, devices[deviceNdx]);
const VkQueue queue = getDeviceQueue(deviceDriver, devices[deviceNdx], queueFamilyIndex, queueIndex);
VK_CHECK(deviceDriver.queueWaitIdle(queue));
@@ -692,7 +671,7 @@
{
if (devices[deviceNdx] != (VkDevice)DE_NULL)
{
- DeviceDriver deviceDriver(platformInterface, instance.get(), devices[deviceNdx]);
+ DeviceDriver deviceDriver(platformInterface, instance, devices[deviceNdx]);
deviceDriver.destroyDevice(devices[deviceNdx], DE_NULL/*pAllocator*/);
}
}
@@ -704,7 +683,7 @@
{
if (devices[deviceNdx] != (VkDevice)DE_NULL)
{
- DeviceDriver deviceDriver(platformInterface, instance.get(), devices[deviceNdx]);
+ DeviceDriver deviceDriver(platformInterface, instance, devices[deviceNdx]);
deviceDriver.destroyDevice(devices[deviceNdx], DE_NULL/*pAllocator*/);
}
}
@@ -716,10 +695,10 @@
{
tcu::TestLog& log = context.getTestContext().getLog();
const PlatformInterface& platformInterface = context.getPlatformInterface();
- const Unique<VkInstance> instance (createDefaultInstance(platformInterface, context.getUsedApiVersion()));
- const InstanceDriver instanceDriver (platformInterface, instance.get());
+ const CustomInstance instance (createCustomInstanceFromContext(context, DE_NULL, false));
+ const InstanceDriver& instanceDriver (instance.getDriver());
const char* enabledExtensions[] = {"VK_UNSUPPORTED_EXTENSION", "THIS_IS_NOT_AN_EXTENSION", "VK_DONT_SUPPORT_ME"};
- const VkPhysicalDevice physicalDevice = chooseDevice(instanceDriver, instance.get(), context.getTestContext().getCommandLine());
+ const VkPhysicalDevice physicalDevice = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
const float queuePriority = 1.0f;
const VkDeviceQueueCreateInfo deviceQueueCreateInfo =
{
@@ -730,6 +709,7 @@
1, //queueCount;
&queuePriority, //pQueuePriorities;
};
+
const VkDeviceCreateInfo deviceCreateInfo =
{
VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, //sType;
@@ -751,12 +731,12 @@
{
VkDevice device = (VkDevice)0;
- const VkResult result = instanceDriver.createDevice(physicalDevice, &deviceCreateInfo, DE_NULL/*pAllocator*/, &device);
+ const VkResult result = createUncheckedDevice(context.getTestContext().getCommandLine().isValidationEnabled(), instanceDriver, physicalDevice, &deviceCreateInfo, DE_NULL/*pAllocator*/, &device);
const bool gotDevice = !!device;
if (device)
{
- const DeviceDriver deviceIface (platformInterface, instance.get(), device);
+ const DeviceDriver deviceIface (platformInterface, instance, device);
deviceIface.destroyDevice(device, DE_NULL/*pAllocator*/);
}
@@ -787,9 +767,9 @@
tcu::TestLog& log = context.getTestContext().getLog();
const int queueCountDiff = 1;
const PlatformInterface& platformInterface = context.getPlatformInterface();
- const Unique<VkInstance> instance (createDefaultInstance(platformInterface, context.getUsedApiVersion()));
- const InstanceDriver instanceDriver (platformInterface, instance.get());
- const VkPhysicalDevice physicalDevice = chooseDevice(instanceDriver, instance.get(), context.getTestContext().getCommandLine());
+ const CustomInstance instance (createCustomInstanceFromContext(context));
+ const InstanceDriver& instanceDriver (instance.getDriver());
+ const VkPhysicalDevice physicalDevice = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
const vector<VkQueueFamilyProperties> queueFamilyProperties = getPhysicalDeviceQueueFamilyProperties(instanceDriver, physicalDevice);
const vector<float> queuePriorities (getGlobalMaxQueueCount(queueFamilyProperties), 1.0f);
vector<VkDeviceQueueCreateInfo> deviceQueueCreateInfos;
@@ -830,8 +810,9 @@
DE_NULL, //ppEnabledExtensionNames;
DE_NULL, //pEnabledFeatures;
};
- const Unique<VkDevice> device (createDevice(platformInterface, *instance, instanceDriver, physicalDevice, &deviceCreateInfo));
- const DeviceDriver deviceDriver (platformInterface, instance.get(), device.get());
+
+ const Unique<VkDevice> device (createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), platformInterface, instance, instanceDriver, physicalDevice, &deviceCreateInfo));
+ const DeviceDriver deviceDriver (platformInterface, instance, device.get());
const deUint32 queueFamilyIndex = deviceCreateInfo.pQueueCreateInfos->queueFamilyIndex;
const deUint32 queueCount = deviceCreateInfo.pQueueCreateInfos->queueCount;
@@ -860,17 +841,15 @@
tcu::TestStatus createDeviceFeatures2Test (Context& context)
{
- const PlatformInterface& vkp = context.getPlatformInterface();
- const Unique<VkInstance> instance (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_get_physical_device_properties2"));
- const InstanceDriver vki (vkp, instance.get());
- const VkPhysicalDevice physicalDevice = chooseDevice(vki, instance.get(), context.getTestContext().getCommandLine());
- const deUint32 queueFamilyIndex = 0;
- const deUint32 queueCount = 1;
- const deUint32 queueIndex = 0;
- const float queuePriority = 1.0f;
-
- const InstanceDriver instanceDriver (vkp, instance.get());
- const vector<VkQueueFamilyProperties> queueFamilyProperties = getPhysicalDeviceQueueFamilyProperties(instanceDriver, physicalDevice);
+ const PlatformInterface& vkp = context.getPlatformInterface();
+ const CustomInstance instance (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+ const InstanceDriver& vki (instance.getDriver());
+ const VkPhysicalDevice physicalDevice = chooseDevice(vki, instance, context.getTestContext().getCommandLine());
+ const deUint32 queueFamilyIndex = 0;
+ const deUint32 queueCount = 1;
+ const deUint32 queueIndex = 0;
+ const float queuePriority = 1.0f;
+ const vector<VkQueueFamilyProperties> queueFamilyProperties = getPhysicalDeviceQueueFamilyProperties(vki, physicalDevice);
VkPhysicalDeviceFeatures2 enabledFeatures;
const VkDeviceQueueCreateInfo deviceQueueCreateInfo =
@@ -882,6 +861,7 @@
queueCount,
&queuePriority,
};
+
const VkDeviceCreateInfo deviceCreateInfo =
{
VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
@@ -889,7 +869,7 @@
(VkDeviceCreateFlags)0u,
1,
&deviceQueueCreateInfo,
- 0,
+ 0u,
DE_NULL,
0,
DE_NULL,
@@ -903,8 +883,8 @@
vki.getPhysicalDeviceFeatures2(physicalDevice, &enabledFeatures);
{
- const Unique<VkDevice> device (createDevice(vkp, *instance, vki, physicalDevice, &deviceCreateInfo));
- const DeviceDriver vkd (vkp, instance.get(), device.get());
+ const Unique<VkDevice> device (createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), vkp, instance, vki, physicalDevice, &deviceCreateInfo));
+ const DeviceDriver vkd (vkp, instance, device.get());
const VkQueue queue = getDeviceQueue(vkd, *device, queueFamilyIndex, queueIndex);
VK_CHECK(vkd.queueWaitIdle(queue));
@@ -925,10 +905,9 @@
{
tcu::TestLog& log = context.getTestContext().getLog();
tcu::ResultCollector resultCollector (log);
- const PlatformInterface& platformInterface = context.getPlatformInterface();
- const Move<VkInstance> instance (createDefaultInstance(platformInterface, context.getUsedApiVersion()));
- const InstanceDriver instanceDriver (platformInterface, instance.get());
- const VkPhysicalDevice physicalDevice = chooseDevice(instanceDriver, instance.get(), context.getTestContext().getCommandLine());
+ const CustomInstance instance (createCustomInstanceFromContext(context, DE_NULL, false));
+ const InstanceDriver& instanceDriver (instance.getDriver());
+ const VkPhysicalDevice physicalDevice = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
const deUint32 queueFamilyIndex = 0;
const deUint32 queueCount = 1;
const float queuePriority = 1.0f;
@@ -1027,7 +1006,7 @@
(VkDeviceCreateFlags)0u,
1,
&deviceQueueCreateInfo,
- 0,
+ 0u,
DE_NULL,
0,
DE_NULL,
@@ -1035,7 +1014,7 @@
};
VkDevice device;
- const VkResult res = instanceDriver.createDevice(physicalDevice, &deviceCreateInfo, DE_NULL, &device);
+ const VkResult res = createUncheckedDevice(false, instanceDriver, physicalDevice, &deviceCreateInfo, DE_NULL, &device);
if (res != VK_ERROR_FEATURE_NOT_PRESENT)
{
@@ -1058,7 +1037,7 @@
const PlatformInterface& platformInterface = context.getPlatformInterface();
const VkInstance instance = context.getInstance();
- const InstanceDriver instanceDriver (platformInterface, instance);
+ const InstanceInterface& instanceDriver = context.getInstanceInterface();
const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
const deUint32 queueCount = 1;
@@ -1103,6 +1082,7 @@
DE_NULL, // const char* const* ppEnabledExtensionNames;
DE_NULL, // const VkPhysicalDeviceFeatures* pEnabledFeatures;
};
+
const VkDeviceQueueInfo2 deviceQueueInfo2 =
{
VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2, // VkStructureType sType;
@@ -1113,7 +1093,7 @@
};
{
- const Unique<VkDevice> device (createDevice(platformInterface, instance, instanceDriver, physicalDevice, &deviceCreateInfo));
+ const Unique<VkDevice> device (createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), platformInterface, instance, instanceDriver, physicalDevice, &deviceCreateInfo));
const DeviceDriver deviceDriver (platformInterface, instance, device.get());
const VkQueue queue2 = getDeviceQueue2(deviceDriver, *device, &deviceQueueInfo2);
@@ -1130,7 +1110,7 @@
const PlatformInterface& platformInterface = context.getPlatformInterface();
const VkInstance instance = context.getInstance();
- const InstanceDriver instanceDriver (platformInterface, instance);
+ const InstanceInterface& instanceDriver = context.getInstanceInterface();
const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
// Check if VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT flag can be used.
@@ -1193,6 +1173,7 @@
DE_NULL, // const char* const* ppEnabledExtensionNames;
DE_NULL, // const VkPhysicalDeviceFeatures* pEnabledFeatures;
};
+
const VkDeviceQueueInfo2 deviceQueueInfo2 =
{
VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2, // VkStructureType sType;
@@ -1203,7 +1184,7 @@
};
{
- const Unique<VkDevice> device (createDevice(platformInterface, instance, instanceDriver, physicalDevice, &deviceCreateInfo));
+ const Unique<VkDevice> device (createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), platformInterface, instance, instanceDriver, physicalDevice, &deviceCreateInfo));
const DeviceDriver deviceDriver (platformInterface, instance, device.get());
const VkQueue queue2 = getDeviceQueue2(deviceDriver, *device, &deviceQueueInfo2);
@@ -1414,6 +1395,7 @@
0u, // engineVersion
VK_API_VERSION_1_0 // apiVersion
};
+
const VkInstanceCreateInfo instanceCreateInfo =
{
VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // sType
@@ -1425,6 +1407,7 @@
0u, // enabledExtensionCount
DE_NULL // ppEnabledExtensionNames
};
+
deUint32 failIndex = 0;
VkResult result = VK_SUCCESS;
size_t max_allowed_alloc = 0;
@@ -1530,6 +1513,7 @@
1u, // queueCount
&queuePriority // pQueuePriorities
};
+
const VkDeviceCreateInfo deviceCreateInfo =
{
VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, // sType
@@ -1544,7 +1528,7 @@
DE_NULL // pEnabledFeatures
};
- result = vki.createDevice(physicalDevices[chosenDevice], &deviceCreateInfo, &allocationCallbacks, &device);
+ result = createUncheckedDevice(context.getTestContext().getCommandLine().isValidationEnabled(), vki, physicalDevices[chosenDevice], &deviceCreateInfo, &allocationCallbacks, &device);
if (result == VK_ERROR_OUT_OF_HOST_MEMORY)
{
diff --git a/external/vulkancts/modules/vulkan/api/vktApiDriverPropertiesTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiDriverPropertiesTests.cpp
index f0bba3a..b37e297 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiDriverPropertiesTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiDriverPropertiesTests.cpp
@@ -65,26 +65,31 @@
static const VkConformanceVersionKHR knownConformanceVersions[] =
{
- makeConformanceVersionKHR(1, 1, 5, 2),
- makeConformanceVersionKHR(1, 1, 5, 1),
- makeConformanceVersionKHR(1, 1, 5, 0),
- makeConformanceVersionKHR(1, 1, 4, 3),
- makeConformanceVersionKHR(1, 1, 4, 2),
- makeConformanceVersionKHR(1, 1, 4, 1),
- makeConformanceVersionKHR(1, 1, 4, 0),
- makeConformanceVersionKHR(1, 1, 3, 3),
- makeConformanceVersionKHR(1, 1, 3, 2),
- makeConformanceVersionKHR(1, 1, 3, 1),
- makeConformanceVersionKHR(1, 1, 3, 0),
- makeConformanceVersionKHR(1, 1, 2, 3),
- makeConformanceVersionKHR(1, 1, 2, 2),
- makeConformanceVersionKHR(1, 1, 2, 1),
- makeConformanceVersionKHR(1, 1, 2, 0),
- makeConformanceVersionKHR(1, 1, 1, 3),
- makeConformanceVersionKHR(1, 1, 1, 2),
- makeConformanceVersionKHR(1, 1, 1, 1),
- makeConformanceVersionKHR(1, 1, 1, 0),
- makeConformanceVersionKHR(1, 1, 0, 3),
+ makeConformanceVersion(1, 2, 0, 2),
+ makeConformanceVersion(1, 2, 0, 1),
+ makeConformanceVersion(1, 2, 0, 0),
+ makeConformanceVersion(1, 1, 6, 1),
+ makeConformanceVersion(1, 1, 6, 0),
+ makeConformanceVersion(1, 1, 5, 2),
+ makeConformanceVersion(1, 1, 5, 1),
+ makeConformanceVersion(1, 1, 5, 0),
+ makeConformanceVersion(1, 1, 4, 3),
+ makeConformanceVersion(1, 1, 4, 2),
+ makeConformanceVersion(1, 1, 4, 1),
+ makeConformanceVersion(1, 1, 4, 0),
+ makeConformanceVersion(1, 1, 3, 3),
+ makeConformanceVersion(1, 1, 3, 2),
+ makeConformanceVersion(1, 1, 3, 1),
+ makeConformanceVersion(1, 1, 3, 0),
+ makeConformanceVersion(1, 1, 2, 3),
+ makeConformanceVersion(1, 1, 2, 2),
+ makeConformanceVersion(1, 1, 2, 1),
+ makeConformanceVersion(1, 1, 2, 0),
+ makeConformanceVersion(1, 1, 1, 3),
+ makeConformanceVersion(1, 1, 1, 2),
+ makeConformanceVersion(1, 1, 1, 1),
+ makeConformanceVersion(1, 1, 1, 0),
+ makeConformanceVersion(1, 1, 0, 3),
};
DE_INLINE bool isNullTerminated(const char* str, const deUint32 maxSize)
@@ -92,7 +97,7 @@
return deStrnlen(str, maxSize) < maxSize;
}
-DE_INLINE bool operator==(const VkConformanceVersionKHR& a, const VkConformanceVersionKHR& b)
+DE_INLINE bool operator==(const VkConformanceVersion& a, const VkConformanceVersion& b)
{
return ((a.major == b.major) &&
(a.minor == b.minor) &&
@@ -103,7 +108,7 @@
void checkSupport (Context& context, const TestType config)
{
DE_UNREF(config);
- context.requireDeviceExtension("VK_KHR_driver_properties");
+ context.requireDeviceFunctionality("VK_KHR_driver_properties");
}
void testDriverMatch (const VkPhysicalDeviceDriverPropertiesKHR& deviceDriverProperties)
@@ -154,7 +159,7 @@
const VkPhysicalDevice physDevice = context.getPhysicalDevice();
const int memsetPattern = 0xaa;
VkPhysicalDeviceProperties2 deviceProperties2;
- VkPhysicalDeviceDriverPropertiesKHR deviceDriverProperties;
+ VkPhysicalDeviceDriverProperties deviceDriverProperties;
deMemset(&deviceDriverProperties, memsetPattern, sizeof(deviceDriverProperties));
deviceDriverProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR;
diff --git a/external/vulkancts/modules/vulkan/api/vktApiExternalMemoryTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiExternalMemoryTests.cpp
index 409e872..5425125 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiExternalMemoryTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiExternalMemoryTests.cpp
@@ -20,6 +20,7 @@
*//*--------------------------------------------------------------------*/
#include "vktApiExternalMemoryTests.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vktTestCaseUtil.hpp"
#include "vkRefUtil.hpp"
@@ -30,6 +31,7 @@
#include "vkApiVersion.hpp"
#include "tcuTestLog.hpp"
+#include "tcuCommandLine.hpp"
#include "deUniquePtr.hpp"
#include "deStringUtil.hpp"
@@ -211,15 +213,14 @@
return instanceExtensions;
}
-vk::Move<vk::VkInstance> createInstance (const vk::PlatformInterface& vkp,
- const deUint32 version,
- const vk::VkExternalSemaphoreHandleTypeFlags externalSemaphoreTypes,
- const vk::VkExternalMemoryHandleTypeFlags externalMemoryTypes,
- const vk::VkExternalFenceHandleTypeFlags externalFenceTypes)
+CustomInstance createTestInstance (Context& context,
+ const vk::VkExternalSemaphoreHandleTypeFlags externalSemaphoreTypes,
+ const vk::VkExternalMemoryHandleTypeFlags externalMemoryTypes,
+ const vk::VkExternalFenceHandleTypeFlags externalFenceTypes)
{
try
{
- return vk::createDefaultInstance(vkp, version, std::vector<std::string>(), getInstanceExtensions(version, externalSemaphoreTypes, externalMemoryTypes, externalFenceTypes));
+ return vkt::createCustomInstanceWithExtensions(context, getInstanceExtensions(context.getUsedApiVersion(), externalSemaphoreTypes, externalMemoryTypes, externalFenceTypes));
}
catch (const vk::Error& error)
{
@@ -230,20 +231,21 @@
}
}
-vk::Move<vk::VkDevice> createDevice (const deUint32 apiVersion,
- const vk::PlatformInterface& vkp,
- vk::VkInstance instance,
- const vk::InstanceInterface& vki,
- vk::VkPhysicalDevice physicalDevice,
- const vk::VkExternalSemaphoreHandleTypeFlags externalSemaphoreTypes,
- const vk::VkExternalMemoryHandleTypeFlags externalMemoryTypes,
- const vk::VkExternalFenceHandleTypeFlags externalFenceTypes,
- deUint32 queueFamilyIndex,
- bool useDedicatedAllocs = false)
+vk::Move<vk::VkDevice> createTestDevice (const Context& context,
+ const vk::PlatformInterface& vkp,
+ vk::VkInstance instance,
+ const vk::InstanceInterface& vki,
+ vk::VkPhysicalDevice physicalDevice,
+ const vk::VkExternalSemaphoreHandleTypeFlags externalSemaphoreTypes,
+ const vk::VkExternalMemoryHandleTypeFlags externalMemoryTypes,
+ const vk::VkExternalFenceHandleTypeFlags externalFenceTypes,
+ deUint32 queueFamilyIndex,
+ bool useDedicatedAllocs = false)
{
- bool useExternalSemaphore = false;
- bool useExternalFence = false;
- bool useExternalMemory = false;
+ const deUint32 apiVersion = context.getUsedApiVersion();
+ bool useExternalSemaphore = false;
+ bool useExternalFence = false;
+ bool useExternalMemory = false;
std::vector<const char*> deviceExtensions;
if ((externalSemaphoreTypes
@@ -374,7 +376,7 @@
try
{
- return vk::createDevice(vkp, instance, vki, physicalDevice, &deviceCreateInfo);
+ return createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), vkp, instance, vki, physicalDevice, &deviceCreateInfo);
}
catch (const vk::Error& error)
{
@@ -748,10 +750,9 @@
tcu::TestStatus testSemaphoreQueries (Context& context, vk::VkExternalSemaphoreHandleTypeFlagBits externalType)
{
- const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), externalType, 0u, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice device (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, externalType, 0u, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice device (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
TestLog& log = context.getTestContext().getLog();
@@ -798,16 +799,16 @@
#if (DE_OS == DE_OS_WIN32)
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, config.externalType, 0u, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkSemaphoreSupport(vki, physicalDevice, config.externalType);
{
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
const vk::VkExportSemaphoreWin32HandleInfoKHR win32ExportInfo =
{
@@ -869,16 +870,16 @@
{
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, config.externalType, 0u, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkSemaphoreSupport(vki, physicalDevice, config.externalType);
{
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
const vk::Unique<vk::VkSemaphore> semaphore (createExportableSemaphore(vkd, *device, config.externalType));
NativeHandle handleA;
@@ -916,16 +917,16 @@
{
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, config.externalType, 0u, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkSemaphoreSupport(vki, physicalDevice, config.externalType);
{
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
const vk::Unique<vk::VkSemaphore> semaphoreA (createExportableSemaphore(vkd, *device, config.externalType));
@@ -962,16 +963,16 @@
const SemaphoreTestConfig config)
{
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, config.externalType, 0u, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkSemaphoreSupport(vki, physicalDevice, config.externalType);
{
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
const vk::Unique<vk::VkSemaphore> semaphoreA (createExportableSemaphore(vkd, *device, config.externalType));
{
@@ -996,9 +997,9 @@
const SemaphoreTestConfig config)
{
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, config.externalType, 0u, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
const vk::VkSemaphoreImportFlags flags = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT : (vk::VkSemaphoreImportFlagBits)0u;
@@ -1006,8 +1007,8 @@
checkSemaphoreSupport(vki, physicalDevice, config.externalType);
{
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
const vk::Unique<vk::VkSemaphore> semaphoreA (createExportableSemaphore(vkd, *device, config.externalType));
@@ -1033,9 +1034,9 @@
const SemaphoreTestConfig config)
{
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, config.externalType, 0u, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
DE_ASSERT(getHandelTypeTransferences(config.externalType) == TRANSFERENCE_REFERENCE);
@@ -1043,8 +1044,8 @@
{
const vk::VkSemaphoreImportFlags flags = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT : (vk::VkSemaphoreImportFlagBits)0u;
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
const vk::Unique<vk::VkSemaphore> semaphoreA (createExportableSemaphore(vkd, *device, config.externalType));
@@ -1068,17 +1069,17 @@
{
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, config.externalType, 0u, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkSemaphoreSupport(vki, physicalDevice, config.externalType);
{
const vk::VkSemaphoreImportFlags flags = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT : (vk::VkSemaphoreImportFlagBits)0u;
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
const vk::Unique<vk::VkSemaphore> semaphoreA (createExportableSemaphore(vkd, *device, config.externalType));
@@ -1116,17 +1117,17 @@
{
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, config.externalType, 0u, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkSemaphoreSupport(vki, physicalDevice, config.externalType);
{
const vk::VkSemaphoreImportFlags flags = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT : (vk::VkSemaphoreImportFlagBits)0u;
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
const vk::Unique<vk::VkSemaphore> semaphoreA (createExportableSemaphore(vkd, *device, config.externalType));
@@ -1167,16 +1168,16 @@
const size_t exportCount = 4 * 1024;
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, config.externalType, 0u, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkSemaphoreSupport(vki, physicalDevice, config.externalType);
{
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
const vk::Unique<vk::VkSemaphore> semaphore (createExportableSemaphore(vkd, *device, config.externalType));
@@ -1205,17 +1206,17 @@
const size_t importCount = 4 * 1024;
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, config.externalType, 0u, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkSemaphoreSupport(vki, physicalDevice, config.externalType);
{
const vk::VkSemaphoreImportFlags flags = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT : (vk::VkSemaphoreImportFlagBits)0u;
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
const vk::Unique<vk::VkSemaphore> semaphoreA (createExportableSemaphore(vkd, *device, config.externalType));
NativeHandle handleA;
@@ -1255,17 +1256,17 @@
{
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, config.externalType, 0u, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkSemaphoreSupport(vki, physicalDevice, config.externalType);
{
const vk::VkSemaphoreImportFlags flags = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT : (vk::VkSemaphoreImportFlagBits)0u;
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
const vk::Unique<vk::VkSemaphore> semaphoreA (createExportableSemaphore(vkd, *device, config.externalType));
@@ -1348,17 +1349,17 @@
#if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, config.externalType, 0u, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkSemaphoreSupport(vki, physicalDevice, config.externalType);
{
const vk::VkSemaphoreImportFlags flags = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT : (vk::VkSemaphoreImportFlagBits)0u;
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
TestLog& log = context.getTestContext().getLog();
@@ -1411,17 +1412,17 @@
#if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, config.externalType, 0u, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkSemaphoreSupport(vki, physicalDevice, config.externalType);
{
const vk::VkSemaphoreImportFlags flags = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT : (vk::VkSemaphoreImportFlagBits)0u;
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
TestLog& log = context.getTestContext().getLog();
@@ -1481,16 +1482,16 @@
#if (DE_OS == DE_OS_UNIX) && defined(_GNU_SOURCE)
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, config.externalType, 0u, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkSemaphoreSupport(vki, physicalDevice, config.externalType);
{
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
TestLog& log = context.getTestContext().getLog();
@@ -1551,16 +1552,16 @@
#if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, config.externalType, 0u, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkSemaphoreSupport(vki, physicalDevice, config.externalType);
{
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
TestLog& log = context.getTestContext().getLog();
@@ -1687,10 +1688,9 @@
tcu::TestStatus testFenceQueries (Context& context, vk::VkExternalFenceHandleTypeFlagBits externalType)
{
- const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, externalType));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice device (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, 0u, externalType));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice device (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
TestLog& log = context.getTestContext().getLog();
@@ -1738,16 +1738,16 @@
#if (DE_OS == DE_OS_WIN32)
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, 0u, config.externalType));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkFenceSupport(vki, physicalDevice, config.externalType);
{
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
const vk::VkExportFenceWin32HandleInfoKHR win32ExportInfo =
{
@@ -1809,16 +1809,16 @@
{
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, 0u, config.externalType));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkFenceSupport(vki, physicalDevice, config.externalType);
{
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
const vk::Unique<vk::VkFence> fence (createExportableFence(vkd, *device, config.externalType));
NativeHandle handleA;
@@ -1856,16 +1856,16 @@
{
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, 0u, config.externalType));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkFenceSupport(vki, physicalDevice, config.externalType);
{
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
const vk::Unique<vk::VkFence> fenceA (createExportableFence(vkd, *device, config.externalType));
@@ -1902,16 +1902,16 @@
const FenceTestConfig config)
{
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, 0u, config.externalType));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkFenceSupport(vki, physicalDevice, config.externalType);
{
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
const vk::Unique<vk::VkFence> fenceA (createExportableFence(vkd, *device, config.externalType));
@@ -1937,9 +1937,9 @@
const FenceTestConfig config)
{
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, 0u, config.externalType));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
const vk::VkFenceImportFlags flags = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT : (vk::VkFenceImportFlagBits)0u;
@@ -1947,8 +1947,8 @@
checkFenceSupport(vki, physicalDevice, config.externalType);
{
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
const vk::Unique<vk::VkFence> fenceA (createExportableFence(vkd, *device, config.externalType));
@@ -1974,9 +1974,9 @@
const FenceTestConfig config)
{
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, 0u, config.externalType));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
DE_ASSERT(getHandelTypeTransferences(config.externalType) == TRANSFERENCE_REFERENCE);
@@ -1984,8 +1984,8 @@
{
const vk::VkFenceImportFlags flags = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT : (vk::VkFenceImportFlagBits)0u;
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
const vk::Unique<vk::VkFence> fenceA (createExportableFence(vkd, *device, config.externalType));
@@ -2009,17 +2009,17 @@
{
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, 0u, config.externalType));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkFenceSupport(vki, physicalDevice, config.externalType);
{
const vk::VkFenceImportFlags flags = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT : (vk::VkFenceImportFlagBits)0u;
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
const vk::Unique<vk::VkFence> fenceA (createExportableFence(vkd, *device, config.externalType));
@@ -2057,17 +2057,17 @@
{
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, 0u, config.externalType));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkFenceSupport(vki, physicalDevice, config.externalType);
{
const vk::VkFenceImportFlags flags = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT : (vk::VkFenceImportFlagBits)0u;
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
const vk::Unique<vk::VkFence> fenceA (createExportableFence(vkd, *device, config.externalType));
@@ -2122,17 +2122,17 @@
{
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, 0u, config.externalType));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkFenceSupport(vki, physicalDevice, config.externalType);
{
const vk::VkFenceImportFlags flags = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT : (vk::VkFenceImportFlagBits)0u;
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
const vk::Unique<vk::VkFence> fenceA (createExportableFence(vkd, *device, config.externalType));
@@ -2173,16 +2173,16 @@
const size_t exportCount = 4 * 1024;
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, 0u, config.externalType));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkFenceSupport(vki, physicalDevice, config.externalType);
{
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
const vk::Unique<vk::VkFence> fence (createExportableFence(vkd, *device, config.externalType));
@@ -2211,17 +2211,17 @@
const size_t importCount = 4 * 1024;
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, 0u, config.externalType));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkFenceSupport(vki, physicalDevice, config.externalType);
{
const vk::VkFenceImportFlags flags = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT : (vk::VkFenceImportFlagBits)0u;
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
const vk::Unique<vk::VkFence> fenceA (createExportableFence(vkd, *device, config.externalType));
NativeHandle handleA;
@@ -2261,17 +2261,17 @@
{
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, 0u, config.externalType));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkFenceSupport(vki, physicalDevice, config.externalType);
{
const vk::VkFenceImportFlags flags = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT : (vk::VkFenceImportFlagBits)0u;
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
const vk::Unique<vk::VkFence> fenceA (createExportableFence(vkd, *device, config.externalType));
@@ -2360,17 +2360,17 @@
#if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, 0u, config.externalType));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkFenceSupport(vki, physicalDevice, config.externalType);
{
const vk::VkFenceImportFlags flags = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT : (vk::VkFenceImportFlagBits)0u;
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
TestLog& log = context.getTestContext().getLog();
@@ -2423,17 +2423,17 @@
#if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, 0u, config.externalType));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkFenceSupport(vki, physicalDevice, config.externalType);
{
const vk::VkFenceImportFlags flags = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT : (vk::VkFenceImportFlagBits)0u;
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
TestLog& log = context.getTestContext().getLog();
@@ -2493,16 +2493,16 @@
#if (DE_OS == DE_OS_UNIX) && defined(_GNU_SOURCE)
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, 0u, config.externalType));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkFenceSupport(vki, physicalDevice, config.externalType);
{
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
TestLog& log = context.getTestContext().getLog();
@@ -2563,16 +2563,16 @@
#if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
const Transference transference (getHandelTypeTransferences(config.externalType));
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, 0u, config.externalType));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
checkFenceSupport(vki, physicalDevice, config.externalType);
{
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkQueue queue (getQueue(vkd, *device, queueFamilyIndex));
TestLog& log = context.getTestContext().getLog();
@@ -2719,9 +2719,9 @@
vk::VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT
};
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, externalType, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, externalType, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const vk::VkPhysicalDeviceFeatures deviceFeatures (vk::getPhysicalDeviceFeatures(vki, physicalDevice));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
@@ -2781,8 +2781,8 @@
// \note We need to re-create with dedicated mem extensions if previous device instance didn't have them
try
{
- device = createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, externalType, 0u, queueFamilyIndex, requiresDedicated);
- vkd = de::MovePtr<vk::DeviceDriver>(new vk::DeviceDriver(vkp, *instance, *device));
+ device = createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, externalType, 0u, queueFamilyIndex, requiresDedicated);
+ vkd = de::MovePtr<vk::DeviceDriver>(new vk::DeviceDriver(vkp, instance, *device));
deviceHasDedicated = requiresDedicated;
}
catch (const tcu::NotSupportedError& e)
@@ -2852,12 +2852,12 @@
{
#if (DE_OS == DE_OS_WIN32)
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, config.externalType, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkBufferUsageFlags usage = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
const deUint32 seed = 1261033864u;
const vk::VkDeviceSize bufferSize = 1024;
@@ -2934,12 +2934,12 @@
tcu::TestStatus testMemoryImportTwice (Context& context, MemoryTestConfig config)
{
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, config.externalType, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkBufferUsageFlags usage = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
const deUint32 seed = 1261033864u;
const vk::VkDeviceSize bufferSize = 1024;
@@ -2993,12 +2993,12 @@
{
const size_t count = 4 * 1024;
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, config.externalType, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkBufferUsageFlags usage = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
const vk::VkDeviceSize bufferSize = 1024;
@@ -3029,12 +3029,12 @@
{
const size_t count = 4 * 1024;
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, config.externalType, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkBufferUsageFlags usage = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
const vk::VkDeviceSize bufferSize = 1024;
@@ -3058,12 +3058,12 @@
tcu::TestStatus testMemoryFdProperties (Context& context, MemoryTestConfig config)
{
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, config.externalType, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkBufferUsageFlags usage = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
const vk::VkDeviceSize bufferSize = 1024;
@@ -3079,6 +3079,7 @@
NativeHandle handle;
getMemoryNative(vkd, *device, *memory, config.externalType, handle);
+ properties.sType = vk::VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR;
vk::VkResult res = vkd.getMemoryFdPropertiesKHR(*device, config.externalType, handle.getFd(), &properties);
switch (config.externalType)
@@ -3099,14 +3100,14 @@
{
#if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, config.externalType, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
{
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
TestLog& log = context.getTestContext().getLog();
const vk::VkBufferUsageFlags usage = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
@@ -3163,14 +3164,14 @@
{
#if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, config.externalType, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
{
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
TestLog& log = context.getTestContext().getLog();
const vk::VkBufferUsageFlags usage = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
@@ -3228,14 +3229,14 @@
{
#if (DE_OS == DE_OS_UNIX) && defined(_GNU_SOURCE)
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, config.externalType, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
{
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
TestLog& log = context.getTestContext().getLog();
const vk::VkBufferUsageFlags usage = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
@@ -3293,14 +3294,14 @@
{
#if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, config.externalType, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
{
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
TestLog& log = context.getTestContext().getLog();
const vk::VkBufferUsageFlags usage = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
@@ -3451,12 +3452,12 @@
const BufferTestConfig config)
{
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, config.externalType, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkBufferUsageFlags usage = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
const vk::VkDeviceSize bufferSize = 1024;
@@ -3489,12 +3490,12 @@
const BufferTestConfig config)
{
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, config.externalType, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkBufferUsageFlags usage = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
const vk::VkDeviceSize bufferSize = 1024;
@@ -3526,12 +3527,12 @@
const BufferTestConfig config)
{
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, config.externalType, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkBufferUsageFlags usage = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
const vk::VkDeviceSize bufferSize = 1024;
@@ -3584,9 +3585,9 @@
vk::VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
};
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, externalType, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, externalType, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const vk::VkPhysicalDeviceFeatures deviceFeatures (vk::getPhysicalDeviceFeatures(vki, physicalDevice));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
@@ -3669,8 +3670,8 @@
// \note We need to re-create with dedicated mem extensions if previous device instance didn't have them
try
{
- device = createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, externalType, 0u, queueFamilyIndex, requiresDedicated);
- vkd = de::MovePtr<vk::DeviceDriver>(new vk::DeviceDriver(vkp, *instance, *device));
+ device = createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, externalType, 0u, queueFamilyIndex, requiresDedicated);
+ vkd = de::MovePtr<vk::DeviceDriver>(new vk::DeviceDriver(vkp, instance, *device));
deviceHasDedicated = requiresDedicated;
}
catch (const tcu::NotSupportedError& e)
@@ -3727,12 +3728,12 @@
const ImageTestConfig config)
{
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, config.externalType, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkImageUsageFlags usage = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
const vk::VkFormat format = vk::VK_FORMAT_R8G8B8A8_UNORM;
const deUint32 width = 64u;
@@ -3767,12 +3768,12 @@
const ImageTestConfig config)
{
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, config.externalType, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkImageUsageFlags usage = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
const vk::VkFormat format = vk::VK_FORMAT_R8G8B8A8_UNORM;
const deUint32 width = 64u;
@@ -3806,12 +3807,12 @@
const ImageTestConfig config)
{
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, 0u, config.externalType, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
const vk::VkImageUsageFlags usage = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
const vk::VkFormat format = vk::VK_FORMAT_R8G8B8A8_UNORM;
const deUint32 width = 64u;
@@ -3971,12 +3972,12 @@
const vk::VkExternalMemoryHandleTypeFlagBits externalMemoryType = vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
const vk::PlatformInterface& vkp (context.getPlatformInterface());
- const vk::Unique<vk::VkInstance> instance (createInstance(vkp, context.getUsedApiVersion(), externalMemoryType, 0u, 0u));
- const vk::InstanceDriver vki (vkp, *instance);
- const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+ const CustomInstance instance (createTestInstance(context, externalMemoryType, 0u, 0u));
+ const vk::InstanceDriver& vki (instance.getDriver());
+ const vk::VkPhysicalDevice physicalDevice (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
const deUint32 queueFamilyIndex (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
- const vk::Unique<vk::VkDevice> device (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, externalMemoryType, 0u, queueFamilyIndex));
- const vk::DeviceDriver vkd (vkp, *instance, *device);
+ const vk::Unique<vk::VkDevice> device (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, externalMemoryType, 0u, queueFamilyIndex));
+ const vk::DeviceDriver vkd (vkp, instance, *device);
TestLog& log = context.getTestContext().getLog();
const vk::VkPhysicalDeviceLimits limits = getPhysicalDeviceProperties(vki, physicalDevice).limits;
@@ -4333,7 +4334,6 @@
dedicatedGroup->addChild(bufferGroup.release());
}
- if (externalType != vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT)
{
de::MovePtr<tcu::TestCaseGroup> imageGroup (new tcu::TestCaseGroup(testCtx, "image", ""));
const ImageTestConfig imageConfig (externalType, dedicated);
diff --git a/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp b/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp
index 97ccf5f..85f727e 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp
@@ -25,6 +25,7 @@
#include "vktTestCaseUtil.hpp"
#include "vktTestGroupUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkPlatform.hpp"
#include "vkStrUtil.hpp"
@@ -509,6 +510,1287 @@
return limitsOk;
}
+void validateLimitsCheckSupport (Context& context)
+{
+ if (!context.contextSupports(vk::ApiVersion(1, 2, 0)))
+ TCU_THROW(NotSupportedError, "At least Vulkan 1.2 required to run test");
+}
+
+typedef struct FeatureLimitTableItem_
+{
+ const void* cond;
+ const char* condName;
+ const void* ptr;
+ const char* name;
+ deUint32 uintVal; //!< Format is UNSIGNED_INT
+ deInt32 intVal; //!< Format is SIGNED_INT
+ deUint64 deviceSizeVal; //!< Format is DEVICE_SIZE
+ float floatVal; //!< Format is FLOAT
+ LimitFormat format;
+ LimitType type;
+} FeatureLimitTableItem;
+
+template<typename T>
+bool validateNumericLimit (const T limitToCheck, const T reportedValue, const LimitType limitType, const char* limitName, TestLog& log)
+{
+ if (limitType == LIMIT_TYPE_MIN)
+ {
+ if (reportedValue < limitToCheck)
+ {
+ log << TestLog::Message << "Limit validation failed " << limitName
+ << " reported value is " << reportedValue
+ << " expected MIN " << limitToCheck
+ << TestLog::EndMessage;
+
+ return false;
+ }
+
+ log << TestLog::Message << limitName
+ << "=" << reportedValue
+ << " (>=" << limitToCheck << ")"
+ << TestLog::EndMessage;
+ }
+ else if (limitType == LIMIT_TYPE_MAX)
+ {
+ if (reportedValue > limitToCheck)
+ {
+ log << TestLog::Message << "Limit validation failed " << limitName
+ << " reported value is " << reportedValue
+ << " expected MAX " << limitToCheck
+ << TestLog::EndMessage;
+
+ return false;
+ }
+
+ log << TestLog::Message << limitName
+ << "=" << reportedValue
+ << " (<=" << limitToCheck << ")"
+ << TestLog::EndMessage;
+ }
+
+ return true;
+}
+
+template<typename T>
+bool validateBitmaskLimit (const T limitToCheck, const T reportedValue, const LimitType limitType, const char* limitName, TestLog& log)
+{
+ if (limitType == LIMIT_TYPE_MIN)
+ {
+ if ((reportedValue & limitToCheck) != limitToCheck)
+ {
+ log << TestLog::Message << "Limit validation failed " << limitName
+ << " reported value is " << reportedValue
+ << " expected MIN " << limitToCheck
+ << TestLog::EndMessage;
+
+ return false;
+ }
+
+ log << TestLog::Message << limitName
+ << "=" << tcu::toHex(reportedValue)
+ << " (contains " << tcu::toHex(limitToCheck) << ")"
+ << TestLog::EndMessage;
+ }
+
+ return true;
+}
+
+bool validateLimit (FeatureLimitTableItem limit, TestLog& log)
+{
+ if (*((VkBool32*)limit.cond) == DE_FALSE)
+ {
+ log << TestLog::Message
+ << "Limit validation skipped '" << limit.name << "' due to "
+ << limit.condName << " == false'"
+ << TestLog::EndMessage;
+
+ return true;
+ }
+
+ switch (limit.format)
+ {
+ case LIMIT_FORMAT_UNSIGNED_INT:
+ {
+ const deUint32 limitToCheck = limit.uintVal;
+ const deUint32 reportedValue = *(deUint32*)limit.ptr;
+
+ return validateNumericLimit(limitToCheck, reportedValue, limit.type, limit.name, log);
+ }
+
+ case LIMIT_FORMAT_FLOAT:
+ {
+ const float limitToCheck = limit.floatVal;
+ const float reportedValue = *(float*)limit.ptr;
+
+ return validateNumericLimit(limitToCheck, reportedValue, limit.type, limit.name, log);
+ }
+
+ case LIMIT_FORMAT_SIGNED_INT:
+ {
+ const deInt32 limitToCheck = limit.intVal;
+ const deInt32 reportedValue = *(deInt32*)limit.ptr;
+
+ return validateNumericLimit(limitToCheck, reportedValue, limit.type, limit.name, log);
+ }
+
+ case LIMIT_FORMAT_DEVICE_SIZE:
+ {
+ const deUint64 limitToCheck = limit.deviceSizeVal;
+ const deUint64 reportedValue = *(deUint64*)limit.ptr;
+
+ return validateNumericLimit(limitToCheck, reportedValue, limit.type, limit.name, log);
+ }
+
+ case LIMIT_FORMAT_BITMASK:
+ {
+ const deUint32 limitToCheck = limit.uintVal;
+ const deUint32 reportedValue = *(deUint32*)limit.ptr;
+
+ return validateBitmaskLimit(limitToCheck, reportedValue, limit.type, limit.name, log);
+ }
+
+ default:
+ TCU_THROW(InternalError, "Unknown LimitFormat specified");
+ }
+}
+
+#ifdef PN
+#error PN defined
+#else
+#define PN(_X_) &(_X_), (const char*)(#_X_)
+#endif
+
+#define LIM_MIN_UINT32(X) deUint32(X), 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN
+#define LIM_MAX_UINT32(X) deUint32(X), 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MAX
+#define LIM_NONE_UINT32 0, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_NONE
+#define LIM_MIN_INT32(X) 0, deInt32(X), 0, 0.0f, LIMIT_FORMAT_SIGNED_INT, LIMIT_TYPE_MIN
+#define LIM_MAX_INT32(X) 0, deInt32(X), 0, 0.0f, LIMIT_FORMAT_SIGNED_INT, LIMIT_TYPE_MAX
+#define LIM_NONE_INT32 0, 0, 0, 0.0f, LIMIT_FORMAT_SIGNED_INT, LIMIT_TYPE_NONE
+#define LIM_MIN_DEVSIZE(X) 0, 0, VkDeviceSize(X), 0.0f, LIMIT_FORMAT_DEVICE_SIZE, LIMIT_TYPE_MIN
+#define LIM_MAX_DEVSIZE(X) 0, 0, VkDeviceSize(X), 0.0f, LIMIT_FORMAT_DEVICE_SIZE, LIMIT_TYPE_MAX
+#define LIM_NONE_DEVSIZE 0, 0, 0, 0.0f, LIMIT_FORMAT_DEVICE_SIZE, LIMIT_TYPE_NONE
+#define LIM_MIN_FLOAT(X) 0, 0, 0, float(X), LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MIN
+#define LIM_MAX_FLOAT(X) 0, 0, 0, float(X), LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MAX
+#define LIM_NONE_FLOAT 0, 0, 0, 0.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_NONE
+#define LIM_MIN_BITI32(X) deUint32(X), 0, 0, 0.0f, LIMIT_FORMAT_BITMASK, LIMIT_TYPE_MIN
+#define LIM_MAX_BITI32(X) deUint32(X), 0, 0, 0.0f, LIMIT_FORMAT_BITMASK, LIMIT_TYPE_MAX
+#define LIM_NONE_BITI32 0, 0, 0, 0.0f, LIMIT_FORMAT_BITMASK, LIMIT_TYPE_NONE
+
+tcu::TestStatus validateLimits12 (Context& context)
+{
+ const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
+ const InstanceInterface& vki = context.getInstanceInterface();
+ TestLog& log = context.getTestContext().getLog();
+ bool limitsOk = true;
+
+ const VkPhysicalDeviceFeatures2& features2 = context.getDeviceFeatures2();
+ const VkPhysicalDeviceFeatures& features = features2.features;
+ const VkPhysicalDeviceVulkan12Features features12 = getPhysicalDeviceVulkan12Features(vki, physicalDevice);
+
+ const VkPhysicalDeviceProperties2& properties2 = context.getDeviceProperties2();
+ const VkPhysicalDeviceVulkan12Properties vulkan12Properties = getPhysicalDeviceVulkan12Properties(vki, physicalDevice);
+ const VkPhysicalDeviceVulkan11Properties vulkan11Properties = getPhysicalDeviceVulkan11Properties(vki, physicalDevice);
+ const VkPhysicalDeviceLimits& limits = properties2.properties.limits;
+
+ const VkBool32 checkAlways = VK_TRUE;
+ const VkBool32 checkVulkan12Limit = VK_TRUE;
+
+ deUint32 shaderStages = 3;
+ deUint32 maxPerStageResourcesMin = deMin32(128, limits.maxPerStageDescriptorUniformBuffers +
+ limits.maxPerStageDescriptorStorageBuffers +
+ limits.maxPerStageDescriptorSampledImages +
+ limits.maxPerStageDescriptorStorageImages +
+ limits.maxPerStageDescriptorInputAttachments +
+ limits.maxColorAttachments);
+
+ if (features.tessellationShader)
+ {
+ shaderStages += 2;
+ }
+
+ if (features.geometryShader)
+ {
+ shaderStages++;
+ }
+
+ FeatureLimitTableItem featureLimitTable[] =
+ {
+ { PN(checkAlways), PN(limits.maxImageDimension1D), LIM_MIN_UINT32(4096) },
+ { PN(checkAlways), PN(limits.maxImageDimension2D), LIM_MIN_UINT32(4096) },
+ { PN(checkAlways), PN(limits.maxImageDimension3D), LIM_MIN_UINT32(256) },
+ { PN(checkAlways), PN(limits.maxImageDimensionCube), LIM_MIN_UINT32(4096) },
+ { PN(checkAlways), PN(limits.maxImageArrayLayers), LIM_MIN_UINT32(256) },
+ { PN(checkAlways), PN(limits.maxTexelBufferElements), LIM_MIN_UINT32(65536) },
+ { PN(checkAlways), PN(limits.maxUniformBufferRange), LIM_MIN_UINT32(16384) },
+ { PN(checkAlways), PN(limits.maxStorageBufferRange), LIM_MIN_UINT32((1<<27)) },
+ { PN(checkAlways), PN(limits.maxPushConstantsSize), LIM_MIN_UINT32(128) },
+ { PN(checkAlways), PN(limits.maxMemoryAllocationCount), LIM_MIN_UINT32(4096) },
+ { PN(checkAlways), PN(limits.maxSamplerAllocationCount), LIM_MIN_UINT32(4000) },
+ { PN(checkAlways), PN(limits.bufferImageGranularity), LIM_MIN_DEVSIZE(1) },
+ { PN(checkAlways), PN(limits.bufferImageGranularity), LIM_MAX_DEVSIZE(131072) },
+ { PN(features.sparseBinding), PN(limits.sparseAddressSpaceSize), LIM_MIN_DEVSIZE((1ull<<31)) },
+ { PN(checkAlways), PN(limits.maxBoundDescriptorSets), LIM_MIN_UINT32(4) },
+ { PN(checkAlways), PN(limits.maxPerStageDescriptorSamplers), LIM_MIN_UINT32(16) },
+ { PN(checkAlways), PN(limits.maxPerStageDescriptorUniformBuffers), LIM_MIN_UINT32(12) },
+ { PN(checkAlways), PN(limits.maxPerStageDescriptorStorageBuffers), LIM_MIN_UINT32(4) },
+ { PN(checkAlways), PN(limits.maxPerStageDescriptorSampledImages), LIM_MIN_UINT32(16) },
+ { PN(checkAlways), PN(limits.maxPerStageDescriptorStorageImages), LIM_MIN_UINT32(4) },
+ { PN(checkAlways), PN(limits.maxPerStageDescriptorInputAttachments), LIM_MIN_UINT32(4) },
+ { PN(checkAlways), PN(limits.maxPerStageResources), LIM_MIN_UINT32(maxPerStageResourcesMin) },
+ { PN(checkAlways), PN(limits.maxDescriptorSetSamplers), LIM_MIN_UINT32(shaderStages * 16) },
+ { PN(checkAlways), PN(limits.maxDescriptorSetUniformBuffers), LIM_MIN_UINT32(shaderStages * 12) },
+ { PN(checkAlways), PN(limits.maxDescriptorSetUniformBuffersDynamic), LIM_MIN_UINT32(8) },
+ { PN(checkAlways), PN(limits.maxDescriptorSetStorageBuffers), LIM_MIN_UINT32(shaderStages * 4) },
+ { PN(checkAlways), PN(limits.maxDescriptorSetStorageBuffersDynamic), LIM_MIN_UINT32(4) },
+ { PN(checkAlways), PN(limits.maxDescriptorSetSampledImages), LIM_MIN_UINT32(shaderStages * 16) },
+ { PN(checkAlways), PN(limits.maxDescriptorSetStorageImages), LIM_MIN_UINT32(shaderStages * 4) },
+ { PN(checkAlways), PN(limits.maxDescriptorSetInputAttachments), LIM_MIN_UINT32(4) },
+ { PN(checkAlways), PN(limits.maxVertexInputAttributes), LIM_MIN_UINT32(16) },
+ { PN(checkAlways), PN(limits.maxVertexInputBindings), LIM_MIN_UINT32(16) },
+ { PN(checkAlways), PN(limits.maxVertexInputAttributeOffset), LIM_MIN_UINT32(2047) },
+ { PN(checkAlways), PN(limits.maxVertexInputBindingStride), LIM_MIN_UINT32(2048) },
+ { PN(checkAlways), PN(limits.maxVertexOutputComponents), LIM_MIN_UINT32(64) },
+ { PN(features.tessellationShader), PN(limits.maxTessellationGenerationLevel), LIM_MIN_UINT32(64) },
+ { PN(features.tessellationShader), PN(limits.maxTessellationPatchSize), LIM_MIN_UINT32(32) },
+ { PN(features.tessellationShader), PN(limits.maxTessellationControlPerVertexInputComponents), LIM_MIN_UINT32(64) },
+ { PN(features.tessellationShader), PN(limits.maxTessellationControlPerVertexOutputComponents), LIM_MIN_UINT32(64) },
+ { PN(features.tessellationShader), PN(limits.maxTessellationControlPerPatchOutputComponents), LIM_MIN_UINT32(120) },
+ { PN(features.tessellationShader), PN(limits.maxTessellationControlTotalOutputComponents), LIM_MIN_UINT32(2048) },
+ { PN(features.tessellationShader), PN(limits.maxTessellationEvaluationInputComponents), LIM_MIN_UINT32(64) },
+ { PN(features.tessellationShader), PN(limits.maxTessellationEvaluationOutputComponents), LIM_MIN_UINT32(64) },
+ { PN(features.geometryShader), PN(limits.maxGeometryShaderInvocations), LIM_MIN_UINT32(32) },
+ { PN(features.geometryShader), PN(limits.maxGeometryInputComponents), LIM_MIN_UINT32(64) },
+ { PN(features.geometryShader), PN(limits.maxGeometryOutputComponents), LIM_MIN_UINT32(64) },
+ { PN(features.geometryShader), PN(limits.maxGeometryOutputVertices), LIM_MIN_UINT32(256) },
+ { PN(features.geometryShader), PN(limits.maxGeometryTotalOutputComponents), LIM_MIN_UINT32(1024) },
+ { PN(checkAlways), PN(limits.maxFragmentInputComponents), LIM_MIN_UINT32(64) },
+ { PN(checkAlways), PN(limits.maxFragmentOutputAttachments), LIM_MIN_UINT32(4) },
+ { PN(features.dualSrcBlend), PN(limits.maxFragmentDualSrcAttachments), LIM_MIN_UINT32(1) },
+ { PN(checkAlways), PN(limits.maxFragmentCombinedOutputResources), LIM_MIN_UINT32(4) },
+ { PN(checkAlways), PN(limits.maxComputeSharedMemorySize), LIM_MIN_UINT32(16384) },
+ { PN(checkAlways), PN(limits.maxComputeWorkGroupCount[0]), LIM_MIN_UINT32(65535) },
+ { PN(checkAlways), PN(limits.maxComputeWorkGroupCount[1]), LIM_MIN_UINT32(65535) },
+ { PN(checkAlways), PN(limits.maxComputeWorkGroupCount[2]), LIM_MIN_UINT32(65535) },
+ { PN(checkAlways), PN(limits.maxComputeWorkGroupInvocations), LIM_MIN_UINT32(128) },
+ { PN(checkAlways), PN(limits.maxComputeWorkGroupSize[0]), LIM_MIN_UINT32(128) },
+ { PN(checkAlways), PN(limits.maxComputeWorkGroupSize[1]), LIM_MIN_UINT32(128) },
+ { PN(checkAlways), PN(limits.maxComputeWorkGroupSize[2]), LIM_MIN_UINT32(64) },
+ { PN(checkAlways), PN(limits.subPixelPrecisionBits), LIM_MIN_UINT32(4) },
+ { PN(checkAlways), PN(limits.subTexelPrecisionBits), LIM_MIN_UINT32(4) },
+ { PN(checkAlways), PN(limits.mipmapPrecisionBits), LIM_MIN_UINT32(4) },
+ { PN(features.fullDrawIndexUint32), PN(limits.maxDrawIndexedIndexValue), LIM_MIN_UINT32((deUint32)~0) },
+ { PN(features.multiDrawIndirect), PN(limits.maxDrawIndirectCount), LIM_MIN_UINT32(65535) },
+ { PN(checkAlways), PN(limits.maxSamplerLodBias), LIM_MIN_FLOAT(2.0f) },
+ { PN(features.samplerAnisotropy), PN(limits.maxSamplerAnisotropy), LIM_MIN_FLOAT(16.0f) },
+ { PN(features.multiViewport), PN(limits.maxViewports), LIM_MIN_UINT32(16) },
+ { PN(checkAlways), PN(limits.maxViewportDimensions[0]), LIM_MIN_UINT32(4096) },
+ { PN(checkAlways), PN(limits.maxViewportDimensions[1]), LIM_MIN_UINT32(4096) },
+ { PN(checkAlways), PN(limits.viewportBoundsRange[0]), LIM_MAX_FLOAT(-8192.0f) },
+ { PN(checkAlways), PN(limits.viewportBoundsRange[1]), LIM_MIN_FLOAT(8191.0f) },
+ { PN(checkAlways), PN(limits.viewportSubPixelBits), LIM_MIN_UINT32(0) },
+ { PN(checkAlways), PN(limits.minMemoryMapAlignment), LIM_MIN_UINT32(64) },
+ { PN(checkAlways), PN(limits.minTexelBufferOffsetAlignment), LIM_MIN_DEVSIZE(1) },
+ { PN(checkAlways), PN(limits.minTexelBufferOffsetAlignment), LIM_MAX_DEVSIZE(256) },
+ { PN(checkAlways), PN(limits.minUniformBufferOffsetAlignment), LIM_MIN_DEVSIZE(1) },
+ { PN(checkAlways), PN(limits.minUniformBufferOffsetAlignment), LIM_MAX_DEVSIZE(256) },
+ { PN(checkAlways), PN(limits.minStorageBufferOffsetAlignment), LIM_MIN_DEVSIZE(1) },
+ { PN(checkAlways), PN(limits.minStorageBufferOffsetAlignment), LIM_MAX_DEVSIZE(256) },
+ { PN(checkAlways), PN(limits.minTexelOffset), LIM_MAX_INT32(-8) },
+ { PN(checkAlways), PN(limits.maxTexelOffset), LIM_MIN_INT32(7) },
+ { PN(features.shaderImageGatherExtended), PN(limits.minTexelGatherOffset), LIM_MAX_INT32(-8) },
+ { PN(features.shaderImageGatherExtended), PN(limits.maxTexelGatherOffset), LIM_MIN_INT32(7) },
+ { PN(features.sampleRateShading), PN(limits.minInterpolationOffset), LIM_MAX_FLOAT(-0.5f) },
+ { PN(features.sampleRateShading), PN(limits.maxInterpolationOffset), LIM_MIN_FLOAT(0.5f - (1.0f/deFloatPow(2.0f, (float)limits.subPixelInterpolationOffsetBits))) },
+ { PN(features.sampleRateShading), PN(limits.subPixelInterpolationOffsetBits), LIM_MIN_UINT32(4) },
+ { PN(checkAlways), PN(limits.maxFramebufferWidth), LIM_MIN_UINT32(4096) },
+ { PN(checkAlways), PN(limits.maxFramebufferHeight), LIM_MIN_UINT32(4096) },
+ { PN(checkAlways), PN(limits.maxFramebufferLayers), LIM_MIN_UINT32(256) },
+ { PN(checkAlways), PN(limits.framebufferColorSampleCounts), LIM_MIN_BITI32(VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT) },
+ { PN(checkVulkan12Limit), PN(vulkan12Properties.framebufferIntegerColorSampleCounts), LIM_MIN_BITI32(VK_SAMPLE_COUNT_1_BIT) },
+ { PN(checkAlways), PN(limits.framebufferDepthSampleCounts), LIM_MIN_BITI32(VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT) },
+ { PN(checkAlways), PN(limits.framebufferStencilSampleCounts), LIM_MIN_BITI32(VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT) },
+ { PN(checkAlways), PN(limits.framebufferNoAttachmentsSampleCounts), LIM_MIN_BITI32(VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT) },
+ { PN(checkAlways), PN(limits.maxColorAttachments), LIM_MIN_UINT32(4) },
+ { PN(checkAlways), PN(limits.sampledImageColorSampleCounts), LIM_MIN_BITI32(VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT) },
+ { PN(checkAlways), PN(limits.sampledImageIntegerSampleCounts), LIM_MIN_BITI32(VK_SAMPLE_COUNT_1_BIT) },
+ { PN(checkAlways), PN(limits.sampledImageDepthSampleCounts), LIM_MIN_BITI32(VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT) },
+ { PN(checkAlways), PN(limits.sampledImageStencilSampleCounts), LIM_MIN_BITI32(VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT) },
+ { PN(features.shaderStorageImageMultisample), PN(limits.storageImageSampleCounts), LIM_MIN_BITI32(VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT) },
+ { PN(checkAlways), PN(limits.maxSampleMaskWords), LIM_MIN_UINT32(1) },
+ { PN(checkAlways), PN(limits.timestampComputeAndGraphics), LIM_NONE_UINT32 },
+ { PN(checkAlways), PN(limits.timestampPeriod), LIM_NONE_UINT32 },
+ { PN(features.shaderClipDistance), PN(limits.maxClipDistances), LIM_MIN_UINT32(8) },
+ { PN(features.shaderClipDistance), PN(limits.maxCullDistances), LIM_MIN_UINT32(8) },
+ { PN(features.shaderClipDistance), PN(limits.maxCombinedClipAndCullDistances), LIM_MIN_UINT32(8) },
+ { PN(checkAlways), PN(limits.discreteQueuePriorities), LIM_MIN_UINT32(2) },
+ { PN(features.largePoints), PN(limits.pointSizeRange[0]), LIM_MIN_FLOAT(0.0f) },
+ { PN(features.largePoints), PN(limits.pointSizeRange[0]), LIM_MAX_FLOAT(1.0f) },
+ { PN(features.largePoints), PN(limits.pointSizeRange[1]), LIM_MIN_FLOAT(64.0f - limits.pointSizeGranularity) },
+ { PN(features.wideLines), PN(limits.lineWidthRange[0]), LIM_MIN_FLOAT(0.0f) },
+ { PN(features.wideLines), PN(limits.lineWidthRange[0]), LIM_MAX_FLOAT(1.0f) },
+ { PN(features.wideLines), PN(limits.lineWidthRange[1]), LIM_MIN_FLOAT(8.0f - limits.lineWidthGranularity) },
+ { PN(features.largePoints), PN(limits.pointSizeGranularity), LIM_MIN_FLOAT(0.0f) },
+ { PN(features.largePoints), PN(limits.pointSizeGranularity), LIM_MAX_FLOAT(1.0f) },
+ { PN(features.wideLines), PN(limits.lineWidthGranularity), LIM_MIN_FLOAT(0.0f) },
+ { PN(features.wideLines), PN(limits.lineWidthGranularity), LIM_MAX_FLOAT(1.0f) },
+ { PN(checkAlways), PN(limits.strictLines), LIM_NONE_UINT32 },
+ { PN(checkAlways), PN(limits.standardSampleLocations), LIM_NONE_UINT32 },
+ { PN(checkAlways), PN(limits.optimalBufferCopyOffsetAlignment), LIM_NONE_DEVSIZE },
+ { PN(checkAlways), PN(limits.optimalBufferCopyRowPitchAlignment), LIM_NONE_DEVSIZE },
+ { PN(checkAlways), PN(limits.nonCoherentAtomSize), LIM_MIN_DEVSIZE(1) },
+ { PN(checkAlways), PN(limits.nonCoherentAtomSize), LIM_MAX_DEVSIZE(256) },
+
+ // VK_KHR_multiview
+ { PN(checkVulkan12Limit), PN(vulkan11Properties.maxMultiviewViewCount), LIM_MIN_UINT32(6) },
+ { PN(checkVulkan12Limit), PN(vulkan11Properties.maxMultiviewInstanceIndex), LIM_MIN_UINT32((1<<27) - 1) },
+
+ // VK_KHR_maintenance3
+ { PN(checkVulkan12Limit), PN(vulkan11Properties.maxPerSetDescriptors), LIM_MIN_UINT32(1024) },
+ { PN(checkVulkan12Limit), PN(vulkan11Properties.maxMemoryAllocationSize), LIM_MIN_DEVSIZE(1<<30) },
+
+ // VK_EXT_descriptor_indexing
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxUpdateAfterBindDescriptorsInAllPools), LIM_MIN_UINT32(500000) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxPerStageDescriptorUpdateAfterBindSamplers), LIM_MIN_UINT32(500000) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxPerStageDescriptorUpdateAfterBindUniformBuffers), LIM_MIN_UINT32(12) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxPerStageDescriptorUpdateAfterBindStorageBuffers), LIM_MIN_UINT32(500000) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxPerStageDescriptorUpdateAfterBindSampledImages), LIM_MIN_UINT32(500000) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxPerStageDescriptorUpdateAfterBindStorageImages), LIM_MIN_UINT32(500000) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxPerStageDescriptorUpdateAfterBindInputAttachments), LIM_MIN_UINT32(4) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxPerStageUpdateAfterBindResources), LIM_MIN_UINT32(500000) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxDescriptorSetUpdateAfterBindSamplers), LIM_MIN_UINT32(500000) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxDescriptorSetUpdateAfterBindUniformBuffers), LIM_MIN_UINT32(shaderStages * 12) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic), LIM_MIN_UINT32(8) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxDescriptorSetUpdateAfterBindStorageBuffers), LIM_MIN_UINT32(500000) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic), LIM_MIN_UINT32(4) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxDescriptorSetUpdateAfterBindSampledImages), LIM_MIN_UINT32(500000) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxDescriptorSetUpdateAfterBindStorageImages), LIM_MIN_UINT32(500000) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxDescriptorSetUpdateAfterBindInputAttachments), LIM_MIN_UINT32(4) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxPerStageDescriptorUpdateAfterBindSamplers), LIM_MIN_UINT32(limits.maxPerStageDescriptorSamplers) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxPerStageDescriptorUpdateAfterBindUniformBuffers), LIM_MIN_UINT32(limits.maxPerStageDescriptorUniformBuffers) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxPerStageDescriptorUpdateAfterBindStorageBuffers), LIM_MIN_UINT32(limits.maxPerStageDescriptorStorageBuffers) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxPerStageDescriptorUpdateAfterBindSampledImages), LIM_MIN_UINT32(limits.maxPerStageDescriptorSampledImages) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxPerStageDescriptorUpdateAfterBindStorageImages), LIM_MIN_UINT32(limits.maxPerStageDescriptorStorageImages) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxPerStageDescriptorUpdateAfterBindInputAttachments), LIM_MIN_UINT32(limits.maxPerStageDescriptorInputAttachments) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxPerStageUpdateAfterBindResources), LIM_MIN_UINT32(limits.maxPerStageResources) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxDescriptorSetUpdateAfterBindSamplers), LIM_MIN_UINT32(limits.maxDescriptorSetSamplers) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxDescriptorSetUpdateAfterBindUniformBuffers), LIM_MIN_UINT32(limits.maxDescriptorSetUniformBuffers) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic), LIM_MIN_UINT32(limits.maxDescriptorSetUniformBuffersDynamic) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxDescriptorSetUpdateAfterBindStorageBuffers), LIM_MIN_UINT32(limits.maxDescriptorSetStorageBuffers) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic), LIM_MIN_UINT32(limits.maxDescriptorSetStorageBuffersDynamic) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxDescriptorSetUpdateAfterBindSampledImages), LIM_MIN_UINT32(limits.maxDescriptorSetSampledImages) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxDescriptorSetUpdateAfterBindStorageImages), LIM_MIN_UINT32(limits.maxDescriptorSetStorageImages) },
+ { PN(features12.descriptorIndexing), PN(vulkan12Properties.maxDescriptorSetUpdateAfterBindInputAttachments), LIM_MIN_UINT32(limits.maxDescriptorSetInputAttachments) },
+
+ // timelineSemaphore
+ { PN(checkVulkan12Limit), PN(vulkan12Properties.maxTimelineSemaphoreValueDifference), LIM_MIN_DEVSIZE((1ull<<31) - 1) },
+ };
+
+ log << TestLog::Message << limits << TestLog::EndMessage;
+
+ for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(featureLimitTable); ndx++)
+ limitsOk = validateLimit(featureLimitTable[ndx], log) && limitsOk;
+
+ if (limits.maxFramebufferWidth > limits.maxViewportDimensions[0] ||
+ limits.maxFramebufferHeight > limits.maxViewportDimensions[1])
+ {
+ log << TestLog::Message << "limit validation failed, maxFramebufferDimension of "
+ << "[" << limits.maxFramebufferWidth << ", " << limits.maxFramebufferHeight << "] "
+ << "is larger than maxViewportDimension of "
+ << "[" << limits.maxViewportDimensions[0] << ", " << limits.maxViewportDimensions[1] << "]" << TestLog::EndMessage;
+ limitsOk = false;
+ }
+
+ if (limits.viewportBoundsRange[0] > float(-2 * limits.maxViewportDimensions[0]))
+ {
+ log << TestLog::Message << "limit validation failed, viewPortBoundsRange[0] of " << limits.viewportBoundsRange[0]
+ << "is larger than -2*maxViewportDimension[0] of " << -2*limits.maxViewportDimensions[0] << TestLog::EndMessage;
+ limitsOk = false;
+ }
+
+ if (limits.viewportBoundsRange[1] < float(2 * limits.maxViewportDimensions[1] - 1))
+ {
+ log << TestLog::Message << "limit validation failed, viewportBoundsRange[1] of " << limits.viewportBoundsRange[1]
+ << "is less than 2*maxViewportDimension[1] of " << 2*limits.maxViewportDimensions[1] << TestLog::EndMessage;
+ limitsOk = false;
+ }
+
+ if (limitsOk)
+ return tcu::TestStatus::pass("pass");
+ else
+ return tcu::TestStatus::fail("fail");
+}
+
+void checkSupportKhrPushDescriptor (Context& context)
+{
+ context.requireDeviceFunctionality("VK_KHR_push_descriptor");
+}
+
+tcu::TestStatus validateLimitsKhrPushDescriptor (Context& context)
+{
+ const VkBool32 checkAlways = VK_TRUE;
+ const VkPhysicalDevicePushDescriptorPropertiesKHR& pushDescriptorPropertiesKHR = context.getPushDescriptorProperties();
+ TestLog& log = context.getTestContext().getLog();
+ bool limitsOk = true;
+
+ FeatureLimitTableItem featureLimitTable[] =
+ {
+ { PN(checkAlways), PN(pushDescriptorPropertiesKHR.maxPushDescriptors), LIM_MIN_UINT32(32) },
+ };
+
+ log << TestLog::Message << pushDescriptorPropertiesKHR << TestLog::EndMessage;
+
+ for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(featureLimitTable); ndx++)
+ limitsOk = validateLimit(featureLimitTable[ndx], log) && limitsOk;
+
+ if (limitsOk)
+ return tcu::TestStatus::pass("pass");
+ else
+ return tcu::TestStatus::fail("fail");
+}
+
+void checkSupportKhrMultiview (Context& context)
+{
+ context.requireDeviceFunctionality("VK_KHR_multiview");
+}
+
+tcu::TestStatus validateLimitsKhrMultiview (Context& context)
+{
+ const VkBool32 checkAlways = VK_TRUE;
+ const VkPhysicalDeviceMultiviewProperties& multiviewProperties = context.getMultiviewProperties();
+ TestLog& log = context.getTestContext().getLog();
+ bool limitsOk = true;
+
+ FeatureLimitTableItem featureLimitTable[] =
+ {
+ // VK_KHR_multiview
+ { PN(checkAlways), PN(multiviewProperties.maxMultiviewViewCount), LIM_MIN_UINT32(6) },
+ { PN(checkAlways), PN(multiviewProperties.maxMultiviewInstanceIndex), LIM_MIN_UINT32((1<<27) - 1) },
+ };
+
+ log << TestLog::Message << multiviewProperties << TestLog::EndMessage;
+
+ for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(featureLimitTable); ndx++)
+ limitsOk = validateLimit(featureLimitTable[ndx], log) && limitsOk;
+
+ if (limitsOk)
+ return tcu::TestStatus::pass("pass");
+ else
+ return tcu::TestStatus::fail("fail");
+}
+
+void checkSupportExtDiscardRectangles (Context& context)
+{
+ context.requireDeviceFunctionality("VK_EXT_discard_rectangles");
+}
+
+tcu::TestStatus validateLimitsExtDiscardRectangles (Context& context)
+{
+ const VkBool32 checkAlways = VK_TRUE;
+ const VkPhysicalDeviceDiscardRectanglePropertiesEXT& discardRectanglePropertiesEXT = context.getDiscardRectanglePropertiesEXT();
+ TestLog& log = context.getTestContext().getLog();
+ bool limitsOk = true;
+
+ FeatureLimitTableItem featureLimitTable[] =
+ {
+ { PN(checkAlways), PN(discardRectanglePropertiesEXT.maxDiscardRectangles), LIM_MIN_UINT32(4) },
+ };
+
+ log << TestLog::Message << discardRectanglePropertiesEXT << TestLog::EndMessage;
+
+ for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(featureLimitTable); ndx++)
+ limitsOk = validateLimit(featureLimitTable[ndx], log) && limitsOk;
+
+ if (limitsOk)
+ return tcu::TestStatus::pass("pass");
+ else
+ return tcu::TestStatus::fail("fail");
+}
+
+void checkSupportExtSampleLocations (Context& context)
+{
+ context.requireDeviceFunctionality("VK_EXT_sample_locations");
+}
+
+tcu::TestStatus validateLimitsExtSampleLocations (Context& context)
+{
+ const VkBool32 checkAlways = VK_TRUE;
+ const VkPhysicalDeviceSampleLocationsPropertiesEXT& sampleLocationsPropertiesEXT = context.getSampleLocationsPropertiesEXT();
+ TestLog& log = context.getTestContext().getLog();
+ bool limitsOk = true;
+
+ FeatureLimitTableItem featureLimitTable[] =
+ {
+ { PN(checkAlways), PN(sampleLocationsPropertiesEXT.sampleLocationSampleCounts), LIM_MIN_BITI32(VK_SAMPLE_COUNT_4_BIT) },
+ { PN(checkAlways), PN(sampleLocationsPropertiesEXT.maxSampleLocationGridSize.width), LIM_MIN_FLOAT(0.0f) },
+ { PN(checkAlways), PN(sampleLocationsPropertiesEXT.maxSampleLocationGridSize.height), LIM_MIN_FLOAT(0.0f) },
+ { PN(checkAlways), PN(sampleLocationsPropertiesEXT.sampleLocationCoordinateRange[0]), LIM_MAX_FLOAT(0.0f) },
+ { PN(checkAlways), PN(sampleLocationsPropertiesEXT.sampleLocationCoordinateRange[1]), LIM_MIN_FLOAT(0.9375f) },
+ { PN(checkAlways), PN(sampleLocationsPropertiesEXT.sampleLocationSubPixelBits), LIM_MIN_UINT32(4) },
+ };
+
+ log << TestLog::Message << sampleLocationsPropertiesEXT << TestLog::EndMessage;
+
+ for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(featureLimitTable); ndx++)
+ limitsOk = validateLimit(featureLimitTable[ndx], log) && limitsOk;
+
+ if (limitsOk)
+ return tcu::TestStatus::pass("pass");
+ else
+ return tcu::TestStatus::fail("fail");
+}
+
+void checkSupportExtExternalMemoryHost (Context& context)
+{
+ context.requireDeviceFunctionality("VK_EXT_external_memory_host");
+}
+
+tcu::TestStatus validateLimitsExtExternalMemoryHost (Context& context)
+{
+ const VkBool32 checkAlways = VK_TRUE;
+ const VkPhysicalDeviceExternalMemoryHostPropertiesEXT& externalMemoryHostPropertiesEXT = context.getExternalMemoryHostPropertiesEXT();
+ TestLog& log = context.getTestContext().getLog();
+ bool limitsOk = true;
+
+ FeatureLimitTableItem featureLimitTable[] =
+ {
+ { PN(checkAlways), PN(externalMemoryHostPropertiesEXT.minImportedHostPointerAlignment), LIM_MAX_DEVSIZE(65536) },
+ };
+
+ log << TestLog::Message << externalMemoryHostPropertiesEXT << TestLog::EndMessage;
+
+ for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(featureLimitTable); ndx++)
+ limitsOk = validateLimit(featureLimitTable[ndx], log) && limitsOk;
+
+ if (limitsOk)
+ return tcu::TestStatus::pass("pass");
+ else
+ return tcu::TestStatus::fail("fail");
+}
+
+void checkSupportExtBlendOperationAdvanced (Context& context)
+{
+ context.requireDeviceFunctionality("VK_EXT_blend_operation_advanced");
+}
+
+tcu::TestStatus validateLimitsExtBlendOperationAdvanced (Context& context)
+{
+ const VkBool32 checkAlways = VK_TRUE;
+ const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT& blendOperationAdvancedPropertiesEXT = context.getBlendOperationAdvancedPropertiesEXT();
+ TestLog& log = context.getTestContext().getLog();
+ bool limitsOk = true;
+
+ FeatureLimitTableItem featureLimitTable[] =
+ {
+ { PN(checkAlways), PN(blendOperationAdvancedPropertiesEXT.advancedBlendMaxColorAttachments), LIM_MIN_UINT32(1) },
+ };
+
+ log << TestLog::Message << blendOperationAdvancedPropertiesEXT << TestLog::EndMessage;
+
+ for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(featureLimitTable); ndx++)
+ limitsOk = validateLimit(featureLimitTable[ndx], log) && limitsOk;
+
+ if (limitsOk)
+ return tcu::TestStatus::pass("pass");
+ else
+ return tcu::TestStatus::fail("fail");
+}
+
+void checkSupportKhrMaintenance3 (Context& context)
+{
+ context.requireDeviceFunctionality("VK_KHR_maintenance3");
+}
+
+tcu::TestStatus validateLimitsKhrMaintenance3 (Context& context)
+{
+ const VkBool32 checkAlways = VK_TRUE;
+ const VkPhysicalDeviceMaintenance3Properties& maintenance3Properties = context.getMaintenance3Properties();
+ TestLog& log = context.getTestContext().getLog();
+ bool limitsOk = true;
+
+ FeatureLimitTableItem featureLimitTable[] =
+ {
+ { PN(checkAlways), PN(maintenance3Properties.maxPerSetDescriptors), LIM_MIN_UINT32(1024) },
+ { PN(checkAlways), PN(maintenance3Properties.maxMemoryAllocationSize), LIM_MIN_DEVSIZE(1<<30) },
+ };
+
+ log << TestLog::Message << maintenance3Properties << TestLog::EndMessage;
+
+ for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(featureLimitTable); ndx++)
+ limitsOk = validateLimit(featureLimitTable[ndx], log) && limitsOk;
+
+ if (limitsOk)
+ return tcu::TestStatus::pass("pass");
+ else
+ return tcu::TestStatus::fail("fail");
+}
+
+void checkSupportExtConservativeRasterization (Context& context)
+{
+ context.requireDeviceFunctionality("VK_EXT_conservative_rasterization");
+}
+
+tcu::TestStatus validateLimitsExtConservativeRasterization (Context& context)
+{
+ const VkBool32 checkAlways = VK_TRUE;
+ const VkPhysicalDeviceConservativeRasterizationPropertiesEXT& conservativeRasterizationPropertiesEXT = context.getConservativeRasterizationPropertiesEXT();
+ TestLog& log = context.getTestContext().getLog();
+ bool limitsOk = true;
+
+ FeatureLimitTableItem featureLimitTable[] =
+ {
+ { PN(checkAlways), PN(conservativeRasterizationPropertiesEXT.primitiveOverestimationSize), LIM_MIN_FLOAT(0.0f) },
+ { PN(checkAlways), PN(conservativeRasterizationPropertiesEXT.maxExtraPrimitiveOverestimationSize), LIM_MIN_FLOAT(0.0f) },
+ { PN(checkAlways), PN(conservativeRasterizationPropertiesEXT.extraPrimitiveOverestimationSizeGranularity), LIM_MIN_FLOAT(0.0f) },
+ };
+
+ log << TestLog::Message << conservativeRasterizationPropertiesEXT << TestLog::EndMessage;
+
+ for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(featureLimitTable); ndx++)
+ limitsOk = validateLimit(featureLimitTable[ndx], log) && limitsOk;
+
+ if (limitsOk)
+ return tcu::TestStatus::pass("pass");
+ else
+ return tcu::TestStatus::fail("fail");
+}
+
+void checkSupportExtDescriptorIndexing (Context& context)
+{
+ const std::string& requiredDeviceExtension = "VK_EXT_descriptor_indexing";
+ const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
+ const InstanceInterface& vki = context.getInstanceInterface();
+ const std::vector<VkExtensionProperties> deviceExtensionProperties = enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
+
+ if (!isExtensionSupported(deviceExtensionProperties, RequiredExtension(requiredDeviceExtension)))
+ TCU_THROW(NotSupportedError, requiredDeviceExtension + " is not supported");
+
+ // Extension string is present, then extension is really supported and should have been added into chain in DefaultDevice properties and features
+}
+
+tcu::TestStatus validateLimitsExtDescriptorIndexing (Context& context)
+{
+ const VkBool32 checkAlways = VK_TRUE;
+ const VkPhysicalDeviceProperties2& properties2 = context.getDeviceProperties2();
+ const VkPhysicalDeviceLimits& limits = properties2.properties.limits;
+ const VkPhysicalDeviceDescriptorIndexingPropertiesEXT& descriptorIndexingPropertiesEXT = context.getDescriptorIndexingProperties();
+ const VkPhysicalDeviceFeatures& features = context.getDeviceFeatures();
+ const deUint32 tessellationShaderCount = (features.tessellationShader) ? 2 : 0;
+ const deUint32 geometryShaderCount = (features.geometryShader) ? 1 : 0;
+ const deUint32 shaderStages = 3 + tessellationShaderCount + geometryShaderCount;
+ TestLog& log = context.getTestContext().getLog();
+ bool limitsOk = true;
+
+ FeatureLimitTableItem featureLimitTable[] =
+ {
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxUpdateAfterBindDescriptorsInAllPools), LIM_MIN_UINT32(500000) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxPerStageDescriptorUpdateAfterBindSamplers), LIM_MIN_UINT32(500000) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxPerStageDescriptorUpdateAfterBindUniformBuffers), LIM_MIN_UINT32(12) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxPerStageDescriptorUpdateAfterBindStorageBuffers), LIM_MIN_UINT32(500000) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxPerStageDescriptorUpdateAfterBindSampledImages), LIM_MIN_UINT32(500000) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxPerStageDescriptorUpdateAfterBindStorageImages), LIM_MIN_UINT32(500000) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxPerStageDescriptorUpdateAfterBindInputAttachments), LIM_MIN_UINT32(4) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxPerStageUpdateAfterBindResources), LIM_MIN_UINT32(500000) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxDescriptorSetUpdateAfterBindSamplers), LIM_MIN_UINT32(500000) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxDescriptorSetUpdateAfterBindUniformBuffers), LIM_MIN_UINT32(shaderStages * 12) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic), LIM_MIN_UINT32(8) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxDescriptorSetUpdateAfterBindStorageBuffers), LIM_MIN_UINT32(500000) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic), LIM_MIN_UINT32(4) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxDescriptorSetUpdateAfterBindSampledImages), LIM_MIN_UINT32(500000) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxDescriptorSetUpdateAfterBindStorageImages), LIM_MIN_UINT32(500000) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxDescriptorSetUpdateAfterBindInputAttachments), LIM_MIN_UINT32(4) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxPerStageDescriptorUpdateAfterBindSamplers), LIM_MIN_UINT32(limits.maxPerStageDescriptorSamplers) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxPerStageDescriptorUpdateAfterBindUniformBuffers), LIM_MIN_UINT32(limits.maxPerStageDescriptorUniformBuffers) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxPerStageDescriptorUpdateAfterBindStorageBuffers), LIM_MIN_UINT32(limits.maxPerStageDescriptorStorageBuffers) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxPerStageDescriptorUpdateAfterBindSampledImages), LIM_MIN_UINT32(limits.maxPerStageDescriptorSampledImages) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxPerStageDescriptorUpdateAfterBindStorageImages), LIM_MIN_UINT32(limits.maxPerStageDescriptorStorageImages) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxPerStageDescriptorUpdateAfterBindInputAttachments), LIM_MIN_UINT32(limits.maxPerStageDescriptorInputAttachments) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxPerStageUpdateAfterBindResources), LIM_MIN_UINT32(limits.maxPerStageResources) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxDescriptorSetUpdateAfterBindSamplers), LIM_MIN_UINT32(limits.maxDescriptorSetSamplers) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxDescriptorSetUpdateAfterBindUniformBuffers), LIM_MIN_UINT32(limits.maxDescriptorSetUniformBuffers) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic), LIM_MIN_UINT32(limits.maxDescriptorSetUniformBuffersDynamic) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxDescriptorSetUpdateAfterBindStorageBuffers), LIM_MIN_UINT32(limits.maxDescriptorSetStorageBuffers) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic), LIM_MIN_UINT32(limits.maxDescriptorSetStorageBuffersDynamic) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxDescriptorSetUpdateAfterBindSampledImages), LIM_MIN_UINT32(limits.maxDescriptorSetSampledImages) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxDescriptorSetUpdateAfterBindStorageImages), LIM_MIN_UINT32(limits.maxDescriptorSetStorageImages) },
+ { PN(checkAlways), PN(descriptorIndexingPropertiesEXT.maxDescriptorSetUpdateAfterBindInputAttachments), LIM_MIN_UINT32(limits.maxDescriptorSetInputAttachments) },
+ };
+
+ log << TestLog::Message << descriptorIndexingPropertiesEXT << TestLog::EndMessage;
+
+ for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(featureLimitTable); ndx++)
+ limitsOk = validateLimit(featureLimitTable[ndx], log) && limitsOk;
+
+ if (limitsOk)
+ return tcu::TestStatus::pass("pass");
+ else
+ return tcu::TestStatus::fail("fail");
+}
+
+void checkSupportExtInlineUniformBlock (Context& context)
+{
+ context.requireDeviceFunctionality("VK_EXT_inline_uniform_block");
+}
+
+tcu::TestStatus validateLimitsExtInlineUniformBlock (Context& context)
+{
+ const VkBool32 checkAlways = VK_TRUE;
+ const VkPhysicalDeviceInlineUniformBlockPropertiesEXT& inlineUniformBlockPropertiesEXT = context.getInlineUniformBlockPropertiesEXT();
+ TestLog& log = context.getTestContext().getLog();
+ bool limitsOk = true;
+
+ FeatureLimitTableItem featureLimitTable[] =
+ {
+ { PN(checkAlways), PN(inlineUniformBlockPropertiesEXT.maxInlineUniformBlockSize), LIM_MIN_UINT32(256) },
+ { PN(checkAlways), PN(inlineUniformBlockPropertiesEXT.maxPerStageDescriptorInlineUniformBlocks), LIM_MIN_UINT32(4) },
+ { PN(checkAlways), PN(inlineUniformBlockPropertiesEXT.maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks), LIM_MIN_UINT32(4) },
+ { PN(checkAlways), PN(inlineUniformBlockPropertiesEXT.maxDescriptorSetInlineUniformBlocks), LIM_MIN_UINT32(4) },
+ { PN(checkAlways), PN(inlineUniformBlockPropertiesEXT.maxDescriptorSetUpdateAfterBindInlineUniformBlocks), LIM_MIN_UINT32(4) },
+ };
+
+ log << TestLog::Message << inlineUniformBlockPropertiesEXT << TestLog::EndMessage;
+
+ for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(featureLimitTable); ndx++)
+ limitsOk = validateLimit(featureLimitTable[ndx], log) && limitsOk;
+
+ if (limitsOk)
+ return tcu::TestStatus::pass("pass");
+ else
+ return tcu::TestStatus::fail("fail");
+}
+
+void checkSupportExtVertexAttributeDivisor (Context& context)
+{
+ context.requireDeviceFunctionality("VK_EXT_vertex_attribute_divisor");
+}
+
+tcu::TestStatus validateLimitsExtVertexAttributeDivisor (Context& context)
+{
+ const VkBool32 checkAlways = VK_TRUE;
+ const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT& vertexAttributeDivisorPropertiesEXT = context.getVertexAttributeDivisorPropertiesEXT();
+ TestLog& log = context.getTestContext().getLog();
+ bool limitsOk = true;
+
+ FeatureLimitTableItem featureLimitTable[] =
+ {
+ { PN(checkAlways), PN(vertexAttributeDivisorPropertiesEXT.maxVertexAttribDivisor), LIM_MIN_UINT32((1<<16) - 1) },
+ };
+
+ log << TestLog::Message << vertexAttributeDivisorPropertiesEXT << TestLog::EndMessage;
+
+ for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(featureLimitTable); ndx++)
+ limitsOk = validateLimit(featureLimitTable[ndx], log) && limitsOk;
+
+ if (limitsOk)
+ return tcu::TestStatus::pass("pass");
+ else
+ return tcu::TestStatus::fail("fail");
+}
+
+void checkSupportNvMeshShader (Context& context)
+{
+ const std::string& requiredDeviceExtension = "VK_NV_mesh_shader";
+ const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
+ const InstanceInterface& vki = context.getInstanceInterface();
+ const std::vector<VkExtensionProperties> deviceExtensionProperties = enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
+
+ if (!isExtensionSupported(deviceExtensionProperties, RequiredExtension(requiredDeviceExtension)))
+ TCU_THROW(NotSupportedError, requiredDeviceExtension + " is not supported");
+}
+
+tcu::TestStatus validateLimitsNvMeshShader (Context& context)
+{
+ const VkBool32 checkAlways = VK_TRUE;
+ const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
+ const InstanceInterface& vki = context.getInstanceInterface();
+ TestLog& log = context.getTestContext().getLog();
+ bool limitsOk = true;
+ VkPhysicalDeviceMeshShaderPropertiesNV meshShaderPropertiesNV = initVulkanStructure();
+ VkPhysicalDeviceProperties2 properties2 = initVulkanStructure(&meshShaderPropertiesNV);
+
+ vki.getPhysicalDeviceProperties2(physicalDevice, &properties2);
+
+ FeatureLimitTableItem featureLimitTable[] =
+ {
+ { PN(checkAlways), PN(meshShaderPropertiesNV.maxDrawMeshTasksCount), LIM_MIN_UINT32(deUint32((1ull<<16) - 1)) },
+ { PN(checkAlways), PN(meshShaderPropertiesNV.maxTaskWorkGroupInvocations), LIM_MIN_UINT32(32) },
+ { PN(checkAlways), PN(meshShaderPropertiesNV.maxTaskWorkGroupSize[0]), LIM_MIN_UINT32(32) },
+ { PN(checkAlways), PN(meshShaderPropertiesNV.maxTaskWorkGroupSize[1]), LIM_MIN_UINT32(1) },
+ { PN(checkAlways), PN(meshShaderPropertiesNV.maxTaskWorkGroupSize[2]), LIM_MIN_UINT32(1) },
+ { PN(checkAlways), PN(meshShaderPropertiesNV.maxTaskTotalMemorySize), LIM_MIN_UINT32(16384) },
+ { PN(checkAlways), PN(meshShaderPropertiesNV.maxTaskOutputCount), LIM_MIN_UINT32((1<<16) - 1) },
+ { PN(checkAlways), PN(meshShaderPropertiesNV.maxMeshWorkGroupInvocations), LIM_MIN_UINT32(32) },
+ { PN(checkAlways), PN(meshShaderPropertiesNV.maxMeshWorkGroupSize[0]), LIM_MIN_UINT32(32) },
+ { PN(checkAlways), PN(meshShaderPropertiesNV.maxMeshWorkGroupSize[1]), LIM_MIN_UINT32(1) },
+ { PN(checkAlways), PN(meshShaderPropertiesNV.maxMeshWorkGroupSize[2]), LIM_MIN_UINT32(1) },
+ { PN(checkAlways), PN(meshShaderPropertiesNV.maxMeshTotalMemorySize), LIM_MIN_UINT32(16384) },
+ { PN(checkAlways), PN(meshShaderPropertiesNV.maxMeshOutputVertices), LIM_MIN_UINT32(256) },
+ { PN(checkAlways), PN(meshShaderPropertiesNV.maxMeshOutputPrimitives), LIM_MIN_UINT32(256) },
+ { PN(checkAlways), PN(meshShaderPropertiesNV.maxMeshMultiviewViewCount), LIM_MIN_UINT32(1) },
+ };
+
+ log << TestLog::Message << meshShaderPropertiesNV << TestLog::EndMessage;
+
+ for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(featureLimitTable); ndx++)
+ limitsOk = validateLimit(featureLimitTable[ndx], log) && limitsOk;
+
+ if (limitsOk)
+ return tcu::TestStatus::pass("pass");
+ else
+ return tcu::TestStatus::fail("fail");
+}
+
+void checkSupportExtTransformFeedback (Context& context)
+{
+ context.requireDeviceFunctionality("VK_EXT_transform_feedback");
+}
+
+tcu::TestStatus validateLimitsExtTransformFeedback (Context& context)
+{
+ const VkBool32 checkAlways = VK_TRUE;
+ const VkPhysicalDeviceTransformFeedbackPropertiesEXT& transformFeedbackPropertiesEXT = context.getTransformFeedbackPropertiesEXT();
+ TestLog& log = context.getTestContext().getLog();
+ bool limitsOk = true;
+
+ FeatureLimitTableItem featureLimitTable[] =
+ {
+ { PN(checkAlways), PN(transformFeedbackPropertiesEXT.maxTransformFeedbackStreams), LIM_MIN_UINT32(1) },
+ { PN(checkAlways), PN(transformFeedbackPropertiesEXT.maxTransformFeedbackBuffers), LIM_MIN_UINT32(1) },
+ { PN(checkAlways), PN(transformFeedbackPropertiesEXT.maxTransformFeedbackBufferSize), LIM_MIN_DEVSIZE(1ull<<27) },
+ { PN(checkAlways), PN(transformFeedbackPropertiesEXT.maxTransformFeedbackStreamDataSize), LIM_MIN_UINT32(512) },
+ { PN(checkAlways), PN(transformFeedbackPropertiesEXT.maxTransformFeedbackBufferDataSize), LIM_MIN_UINT32(512) },
+ { PN(checkAlways), PN(transformFeedbackPropertiesEXT.maxTransformFeedbackBufferDataStride), LIM_MIN_UINT32(512) },
+ };
+
+ log << TestLog::Message << transformFeedbackPropertiesEXT << TestLog::EndMessage;
+
+ for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(featureLimitTable); ndx++)
+ limitsOk = validateLimit(featureLimitTable[ndx], log) && limitsOk;
+
+ if (limitsOk)
+ return tcu::TestStatus::pass("pass");
+ else
+ return tcu::TestStatus::fail("fail");
+}
+
+void checkSupportExtFragmentDensityMap (Context& context)
+{
+ context.requireDeviceFunctionality("VK_EXT_fragment_density_map");
+}
+
+tcu::TestStatus validateLimitsExtFragmentDensityMap (Context& context)
+{
+ const VkBool32 checkAlways = VK_TRUE;
+ const VkPhysicalDeviceFragmentDensityMapPropertiesEXT& fragmentDensityMapPropertiesEXT = context.getFragmentDensityMapPropertiesEXT();
+ TestLog& log = context.getTestContext().getLog();
+ bool limitsOk = true;
+
+ FeatureLimitTableItem featureLimitTable[] =
+ {
+ { PN(checkAlways), PN(fragmentDensityMapPropertiesEXT.minFragmentDensityTexelSize.width), LIM_MIN_UINT32(1) },
+ { PN(checkAlways), PN(fragmentDensityMapPropertiesEXT.minFragmentDensityTexelSize.height), LIM_MIN_UINT32(1) },
+ { PN(checkAlways), PN(fragmentDensityMapPropertiesEXT.maxFragmentDensityTexelSize.width), LIM_MIN_UINT32(1) },
+ { PN(checkAlways), PN(fragmentDensityMapPropertiesEXT.maxFragmentDensityTexelSize.height), LIM_MIN_UINT32(1) },
+ };
+
+ log << TestLog::Message << fragmentDensityMapPropertiesEXT << TestLog::EndMessage;
+
+ for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(featureLimitTable); ndx++)
+ limitsOk = validateLimit(featureLimitTable[ndx], log) && limitsOk;
+
+ if (limitsOk)
+ return tcu::TestStatus::pass("pass");
+ else
+ return tcu::TestStatus::fail("fail");
+}
+
+void checkSupportNvRayTracing (Context& context)
+{
+ const std::string& requiredDeviceExtension = "VK_NV_ray_tracing";
+ const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
+ const InstanceInterface& vki = context.getInstanceInterface();
+ const std::vector<VkExtensionProperties> deviceExtensionProperties = enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
+
+ if (!isExtensionSupported(deviceExtensionProperties, RequiredExtension(requiredDeviceExtension)))
+ TCU_THROW(NotSupportedError, requiredDeviceExtension + " is not supported");
+}
+
+tcu::TestStatus validateLimitsNvRayTracing (Context& context)
+{
+ const VkBool32 checkAlways = VK_TRUE;
+ const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
+ const InstanceInterface& vki = context.getInstanceInterface();
+ TestLog& log = context.getTestContext().getLog();
+ bool limitsOk = true;
+ VkPhysicalDeviceRayTracingPropertiesNV rayTracingPropertiesNV = initVulkanStructure();
+ VkPhysicalDeviceProperties2 properties2 = initVulkanStructure(&rayTracingPropertiesNV);
+
+ vki.getPhysicalDeviceProperties2(physicalDevice, &properties2);
+
+ FeatureLimitTableItem featureLimitTable[] =
+ {
+ { PN(checkAlways), PN(rayTracingPropertiesNV.shaderGroupHandleSize), LIM_MIN_UINT32(16) },
+ { PN(checkAlways), PN(rayTracingPropertiesNV.maxRecursionDepth), LIM_MIN_UINT32(31) },
+ { PN(checkAlways), PN(rayTracingPropertiesNV.shaderGroupBaseAlignment), LIM_MIN_UINT32(64) },
+ { PN(checkAlways), PN(rayTracingPropertiesNV.maxGeometryCount), LIM_MIN_UINT32((1<<24) - 1) },
+ { PN(checkAlways), PN(rayTracingPropertiesNV.maxInstanceCount), LIM_MIN_UINT32((1<<24) - 1) },
+ { PN(checkAlways), PN(rayTracingPropertiesNV.maxTriangleCount), LIM_MIN_UINT32((1<<29) - 1) },
+ { PN(checkAlways), PN(rayTracingPropertiesNV.maxDescriptorSetAccelerationStructures), LIM_MIN_UINT32(16) },
+ };
+
+ log << TestLog::Message << rayTracingPropertiesNV << TestLog::EndMessage;
+
+ for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(featureLimitTable); ndx++)
+ limitsOk = validateLimit(featureLimitTable[ndx], log) && limitsOk;
+
+ if (limitsOk)
+ return tcu::TestStatus::pass("pass");
+ else
+ return tcu::TestStatus::fail("fail");
+}
+
+void checkSupportKhrTimelineSemaphore (Context& context)
+{
+ context.requireDeviceFunctionality("VK_KHR_timeline_semaphore");
+}
+
+tcu::TestStatus validateLimitsKhrTimelineSemaphore (Context& context)
+{
+ const VkBool32 checkAlways = VK_TRUE;
+ const VkPhysicalDeviceTimelineSemaphorePropertiesKHR& timelineSemaphorePropertiesKHR = context.getTimelineSemaphoreProperties();
+ bool limitsOk = true;
+ TestLog& log = context.getTestContext().getLog();
+
+ FeatureLimitTableItem featureLimitTable[] =
+ {
+ { PN(checkAlways), PN(timelineSemaphorePropertiesKHR.maxTimelineSemaphoreValueDifference), LIM_MIN_DEVSIZE((1ull<<31) - 1) },
+ };
+
+ log << TestLog::Message << timelineSemaphorePropertiesKHR << TestLog::EndMessage;
+
+ for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(featureLimitTable); ndx++)
+ limitsOk = validateLimit(featureLimitTable[ndx], log) && limitsOk;
+
+ if (limitsOk)
+ return tcu::TestStatus::pass("pass");
+ else
+ return tcu::TestStatus::fail("fail");
+}
+
+void checkSupportExtLineRasterization (Context& context)
+{
+ context.requireDeviceFunctionality("VK_EXT_line_rasterization");
+}
+
+tcu::TestStatus validateLimitsExtLineRasterization (Context& context)
+{
+ const VkBool32 checkAlways = VK_TRUE;
+ const VkPhysicalDeviceLineRasterizationPropertiesEXT& lineRasterizationPropertiesEXT = context.getLineRasterizationPropertiesEXT();
+ TestLog& log = context.getTestContext().getLog();
+ bool limitsOk = true;
+
+ FeatureLimitTableItem featureLimitTable[] =
+ {
+ { PN(checkAlways), PN(lineRasterizationPropertiesEXT.lineSubPixelPrecisionBits), LIM_MIN_UINT32(4) },
+ };
+
+ log << TestLog::Message << lineRasterizationPropertiesEXT << TestLog::EndMessage;
+
+ for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(featureLimitTable); ndx++)
+ limitsOk = validateLimit(featureLimitTable[ndx], log) && limitsOk;
+
+ if (limitsOk)
+ return tcu::TestStatus::pass("pass");
+ else
+ return tcu::TestStatus::fail("fail");
+}
+
+void checkSupportFeatureBitInfluence (Context& context)
+{
+ if (!context.contextSupports(vk::ApiVersion(1, 2, 0)))
+ TCU_THROW(NotSupportedError, "At least Vulkan 1.2 required to run test");
+}
+
+void createDevice (Context& context, void* pNext, const char* const* ppEnabledExtensionNames, deUint32 enabledExtensionCount)
+{
+ const PlatformInterface& platformInterface = context.getPlatformInterface();
+ const Unique<VkInstance> instance (createDefaultInstance(platformInterface, context.getUsedApiVersion()));
+ const InstanceDriver instanceDriver (platformInterface, instance.get());
+ const VkPhysicalDevice physicalDevice = chooseDevice(instanceDriver, instance.get(), context.getTestContext().getCommandLine());
+ const deUint32 queueFamilyIndex = 0;
+ const deUint32 queueCount = 1;
+ const deUint32 queueIndex = 0;
+ const float queuePriority = 1.0f;
+ const vector<VkQueueFamilyProperties> queueFamilyProperties = getPhysicalDeviceQueueFamilyProperties(instanceDriver, physicalDevice);
+ const VkDeviceQueueCreateInfo deviceQueueCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ (VkDeviceQueueCreateFlags)0u, // VkDeviceQueueCreateFlags flags;
+ queueFamilyIndex, // deUint32 queueFamilyIndex;
+ queueCount, // deUint32 queueCount;
+ &queuePriority, // const float* pQueuePriorities;
+ };
+ const VkDeviceCreateInfo deviceCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, // VkStructureType sType;
+ pNext, // const void* pNext;
+ (VkDeviceCreateFlags)0u, // VkDeviceCreateFlags flags;
+ 1, // deUint32 queueCreateInfoCount;
+ &deviceQueueCreateInfo, // const VkDeviceQueueCreateInfo* pQueueCreateInfos;
+ 0, // deUint32 enabledLayerCount;
+ DE_NULL, // const char* const* ppEnabledLayerNames;
+ enabledExtensionCount, // deUint32 enabledExtensionCount;
+ ppEnabledExtensionNames, // const char* const* ppEnabledExtensionNames;
+ DE_NULL, // const VkPhysicalDeviceFeatures* pEnabledFeatures;
+ };
+ const Unique<VkDevice> device (createDevice(platformInterface, *instance, instanceDriver, physicalDevice, &deviceCreateInfo));
+ const DeviceDriver deviceDriver (platformInterface, instance.get(), device.get());
+ const VkQueue queue = getDeviceQueue(deviceDriver, *device, queueFamilyIndex, queueIndex);
+
+ VK_CHECK(deviceDriver.queueWaitIdle(queue));
+}
+
+void cleanVulkanStruct (void* structPtr, size_t structSize)
+{
+ struct StructureBase
+ {
+ VkStructureType sType;
+ void* pNext;
+ };
+
+ VkStructureType sType = ((StructureBase*)structPtr)->sType;
+
+ deMemset(structPtr, 0, structSize);
+
+ ((StructureBase*)structPtr)->sType = sType;
+}
+
+tcu::TestStatus featureBitInfluenceOnDeviceCreate (Context& context)
+{
+#define FEATURE_TABLE_ITEM(CORE, EXT, FIELD, STR) { &(CORE), sizeof(CORE), &(CORE.FIELD), #CORE "." #FIELD, &(EXT), sizeof(EXT), &(EXT.FIELD), #EXT "." #FIELD, STR }
+#define DEPENDENCY_DUAL_ITEM(CORE, EXT, FIELD, PARENT) { &(CORE.FIELD), &(CORE.PARENT) }, { &(EXT.FIELD), &(EXT.PARENT) }
+#define DEPENDENCY_SINGLE_ITEM(CORE, FIELD, PARENT) { &(CORE.FIELD), &(CORE.PARENT) }
+
+ const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
+ const InstanceInterface& vki = context.getInstanceInterface();
+ TestLog& log = context.getTestContext().getLog();
+ const std::vector<VkExtensionProperties> deviceExtensionProperties = enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
+
+ VkPhysicalDeviceFeatures2 features2 = initVulkanStructure();
+ VkPhysicalDeviceVulkan11Features vulkan11Features = initVulkanStructure();
+ VkPhysicalDeviceVulkan12Features vulkan12Features = initVulkanStructure();
+ VkPhysicalDevice16BitStorageFeaturesKHR sixteenBitStorageFeatures = initVulkanStructure();
+ VkPhysicalDeviceMultiviewFeatures multiviewFeatures = initVulkanStructure();
+ VkPhysicalDeviceVariablePointersFeatures variablePointersFeatures = initVulkanStructure();
+ VkPhysicalDeviceProtectedMemoryFeatures protectedMemoryFeatures = initVulkanStructure();
+ VkPhysicalDeviceSamplerYcbcrConversionFeatures samplerYcbcrConversionFeatures = initVulkanStructure();
+ VkPhysicalDeviceShaderDrawParametersFeatures shaderDrawParametersFeatures = initVulkanStructure();
+ VkPhysicalDevice8BitStorageFeatures eightBitStorageFeatures = initVulkanStructure();
+ VkPhysicalDeviceShaderAtomicInt64Features shaderAtomicInt64Features = initVulkanStructure();
+ VkPhysicalDeviceShaderFloat16Int8Features shaderFloat16Int8Features = initVulkanStructure();
+ VkPhysicalDeviceDescriptorIndexingFeatures descriptorIndexingFeatures = initVulkanStructure();
+ VkPhysicalDeviceScalarBlockLayoutFeatures scalarBlockLayoutFeatures = initVulkanStructure();
+ VkPhysicalDeviceImagelessFramebufferFeatures imagelessFramebufferFeatures = initVulkanStructure();
+ VkPhysicalDeviceUniformBufferStandardLayoutFeatures uniformBufferStandardLayoutFeatures = initVulkanStructure();
+ VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures shaderSubgroupExtendedTypesFeatures = initVulkanStructure();
+ VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures separateDepthStencilLayoutsFeatures = initVulkanStructure();
+ VkPhysicalDeviceHostQueryResetFeatures hostQueryResetFeatures = initVulkanStructure();
+ VkPhysicalDeviceTimelineSemaphoreFeatures timelineSemaphoreFeatures = initVulkanStructure();
+ VkPhysicalDeviceBufferDeviceAddressFeatures bufferDeviceAddressFeatures = initVulkanStructure();
+ VkPhysicalDeviceVulkanMemoryModelFeatures vulkanMemoryModelFeatures = initVulkanStructure();
+
+ struct DummyExtensionFeatures
+ {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 descriptorIndexing;
+ VkBool32 samplerFilterMinmax;
+ } dummyExtensionFeatures;
+
+ struct FeatureTable
+ {
+ void* coreStructPtr;
+ size_t coreStructSize;
+ VkBool32* coreFieldPtr;
+ const char* coreFieldName;
+ void* extStructPtr;
+ size_t extStructSize;
+ VkBool32* extFieldPtr;
+ const char* extFieldName;
+ const char* extString;
+ }
+ featureTable[] =
+ {
+ FEATURE_TABLE_ITEM(vulkan11Features, sixteenBitStorageFeatures, storageBuffer16BitAccess, "VK_KHR_16bit_storage"),
+ FEATURE_TABLE_ITEM(vulkan11Features, sixteenBitStorageFeatures, uniformAndStorageBuffer16BitAccess, "VK_KHR_16bit_storage"),
+ FEATURE_TABLE_ITEM(vulkan11Features, sixteenBitStorageFeatures, storagePushConstant16, "VK_KHR_16bit_storage"),
+ FEATURE_TABLE_ITEM(vulkan11Features, sixteenBitStorageFeatures, storageInputOutput16, "VK_KHR_16bit_storage"),
+ FEATURE_TABLE_ITEM(vulkan11Features, multiviewFeatures, multiview, "VK_KHR_multiview"),
+ FEATURE_TABLE_ITEM(vulkan11Features, multiviewFeatures, multiviewGeometryShader, "VK_KHR_multiview"),
+ FEATURE_TABLE_ITEM(vulkan11Features, multiviewFeatures, multiviewTessellationShader, "VK_KHR_multiview"),
+ FEATURE_TABLE_ITEM(vulkan11Features, variablePointersFeatures, variablePointersStorageBuffer, "VK_KHR_variable_pointers"),
+ FEATURE_TABLE_ITEM(vulkan11Features, variablePointersFeatures, variablePointers, "VK_KHR_variable_pointers"),
+ FEATURE_TABLE_ITEM(vulkan11Features, protectedMemoryFeatures, protectedMemory, DE_NULL),
+ FEATURE_TABLE_ITEM(vulkan11Features, samplerYcbcrConversionFeatures, samplerYcbcrConversion, "VK_KHR_sampler_ycbcr_conversion"),
+ FEATURE_TABLE_ITEM(vulkan11Features, shaderDrawParametersFeatures, shaderDrawParameters, DE_NULL),
+ FEATURE_TABLE_ITEM(vulkan12Features, eightBitStorageFeatures, storageBuffer8BitAccess, "VK_KHR_8bit_storage"),
+ FEATURE_TABLE_ITEM(vulkan12Features, eightBitStorageFeatures, uniformAndStorageBuffer8BitAccess, "VK_KHR_8bit_storage"),
+ FEATURE_TABLE_ITEM(vulkan12Features, eightBitStorageFeatures, storagePushConstant8, "VK_KHR_8bit_storage"),
+ FEATURE_TABLE_ITEM(vulkan12Features, shaderAtomicInt64Features, shaderBufferInt64Atomics, "VK_KHR_shader_atomic_int64"),
+ FEATURE_TABLE_ITEM(vulkan12Features, shaderAtomicInt64Features, shaderSharedInt64Atomics, "VK_KHR_shader_atomic_int64"),
+ FEATURE_TABLE_ITEM(vulkan12Features, shaderFloat16Int8Features, shaderFloat16, "VK_KHR_shader_float16_int8"),
+ FEATURE_TABLE_ITEM(vulkan12Features, shaderFloat16Int8Features, shaderInt8, "VK_KHR_shader_float16_int8"),
+ FEATURE_TABLE_ITEM(vulkan12Features, dummyExtensionFeatures, descriptorIndexing, DE_NULL),
+ FEATURE_TABLE_ITEM(vulkan12Features, descriptorIndexingFeatures, shaderInputAttachmentArrayDynamicIndexing, "VK_EXT_descriptor_indexing"),
+ FEATURE_TABLE_ITEM(vulkan12Features, descriptorIndexingFeatures, shaderUniformTexelBufferArrayDynamicIndexing, "VK_EXT_descriptor_indexing"),
+ FEATURE_TABLE_ITEM(vulkan12Features, descriptorIndexingFeatures, shaderStorageTexelBufferArrayDynamicIndexing, "VK_EXT_descriptor_indexing"),
+ FEATURE_TABLE_ITEM(vulkan12Features, descriptorIndexingFeatures, shaderUniformBufferArrayNonUniformIndexing, "VK_EXT_descriptor_indexing"),
+ FEATURE_TABLE_ITEM(vulkan12Features, descriptorIndexingFeatures, shaderSampledImageArrayNonUniformIndexing, "VK_EXT_descriptor_indexing"),
+ FEATURE_TABLE_ITEM(vulkan12Features, descriptorIndexingFeatures, shaderStorageBufferArrayNonUniformIndexing, "VK_EXT_descriptor_indexing"),
+ FEATURE_TABLE_ITEM(vulkan12Features, descriptorIndexingFeatures, shaderStorageImageArrayNonUniformIndexing, "VK_EXT_descriptor_indexing"),
+ FEATURE_TABLE_ITEM(vulkan12Features, descriptorIndexingFeatures, shaderInputAttachmentArrayNonUniformIndexing, "VK_EXT_descriptor_indexing"),
+ FEATURE_TABLE_ITEM(vulkan12Features, descriptorIndexingFeatures, shaderUniformTexelBufferArrayNonUniformIndexing, "VK_EXT_descriptor_indexing"),
+ FEATURE_TABLE_ITEM(vulkan12Features, descriptorIndexingFeatures, shaderStorageTexelBufferArrayNonUniformIndexing, "VK_EXT_descriptor_indexing"),
+ FEATURE_TABLE_ITEM(vulkan12Features, descriptorIndexingFeatures, descriptorBindingUniformBufferUpdateAfterBind, "VK_EXT_descriptor_indexing"),
+ FEATURE_TABLE_ITEM(vulkan12Features, descriptorIndexingFeatures, descriptorBindingSampledImageUpdateAfterBind, "VK_EXT_descriptor_indexing"),
+ FEATURE_TABLE_ITEM(vulkan12Features, descriptorIndexingFeatures, descriptorBindingStorageImageUpdateAfterBind, "VK_EXT_descriptor_indexing"),
+ FEATURE_TABLE_ITEM(vulkan12Features, descriptorIndexingFeatures, descriptorBindingStorageBufferUpdateAfterBind, "VK_EXT_descriptor_indexing"),
+ FEATURE_TABLE_ITEM(vulkan12Features, descriptorIndexingFeatures, descriptorBindingUniformTexelBufferUpdateAfterBind, "VK_EXT_descriptor_indexing"),
+ FEATURE_TABLE_ITEM(vulkan12Features, descriptorIndexingFeatures, descriptorBindingStorageTexelBufferUpdateAfterBind, "VK_EXT_descriptor_indexing"),
+ FEATURE_TABLE_ITEM(vulkan12Features, descriptorIndexingFeatures, descriptorBindingUpdateUnusedWhilePending, "VK_EXT_descriptor_indexing"),
+ FEATURE_TABLE_ITEM(vulkan12Features, descriptorIndexingFeatures, descriptorBindingPartiallyBound, "VK_EXT_descriptor_indexing"),
+ FEATURE_TABLE_ITEM(vulkan12Features, descriptorIndexingFeatures, descriptorBindingVariableDescriptorCount, "VK_EXT_descriptor_indexing"),
+ FEATURE_TABLE_ITEM(vulkan12Features, descriptorIndexingFeatures, runtimeDescriptorArray, "VK_EXT_descriptor_indexing"),
+ FEATURE_TABLE_ITEM(vulkan12Features, dummyExtensionFeatures, samplerFilterMinmax, "VK_EXT_sampler_filter_minmax"),
+ FEATURE_TABLE_ITEM(vulkan12Features, scalarBlockLayoutFeatures, scalarBlockLayout, "VK_EXT_scalar_block_layout"),
+ FEATURE_TABLE_ITEM(vulkan12Features, imagelessFramebufferFeatures, imagelessFramebuffer, "VK_KHR_imageless_framebuffer"),
+ FEATURE_TABLE_ITEM(vulkan12Features, uniformBufferStandardLayoutFeatures, uniformBufferStandardLayout, "VK_KHR_uniform_buffer_standard_layout"),
+ FEATURE_TABLE_ITEM(vulkan12Features, shaderSubgroupExtendedTypesFeatures, shaderSubgroupExtendedTypes, "VK_KHR_shader_subgroup_extended_types"),
+ FEATURE_TABLE_ITEM(vulkan12Features, separateDepthStencilLayoutsFeatures, separateDepthStencilLayouts, "VK_KHR_separate_depth_stencil_layouts"),
+ FEATURE_TABLE_ITEM(vulkan12Features, hostQueryResetFeatures, hostQueryReset, "VK_EXT_host_query_reset"),
+ FEATURE_TABLE_ITEM(vulkan12Features, timelineSemaphoreFeatures, timelineSemaphore, "VK_KHR_timeline_semaphore"),
+ FEATURE_TABLE_ITEM(vulkan12Features, bufferDeviceAddressFeatures, bufferDeviceAddress, "VK_EXT_buffer_device_address"),
+ FEATURE_TABLE_ITEM(vulkan12Features, bufferDeviceAddressFeatures, bufferDeviceAddressCaptureReplay, "VK_EXT_buffer_device_address"),
+ FEATURE_TABLE_ITEM(vulkan12Features, bufferDeviceAddressFeatures, bufferDeviceAddressMultiDevice, "VK_EXT_buffer_device_address"),
+ FEATURE_TABLE_ITEM(vulkan12Features, vulkanMemoryModelFeatures, vulkanMemoryModel, "VK_KHR_vulkan_memory_model"),
+ FEATURE_TABLE_ITEM(vulkan12Features, vulkanMemoryModelFeatures, vulkanMemoryModelDeviceScope, "VK_KHR_vulkan_memory_model"),
+ FEATURE_TABLE_ITEM(vulkan12Features, vulkanMemoryModelFeatures, vulkanMemoryModelAvailabilityVisibilityChains, "VK_KHR_vulkan_memory_model"),
+ };
+ struct FeatureDependencyTable
+ {
+ VkBool32* featurePtr;
+ VkBool32* dependOnPtr;
+ }
+ featureDependencyTable[] =
+ {
+ DEPENDENCY_DUAL_ITEM (vulkan11Features, multiviewFeatures, multiviewGeometryShader, multiview),
+ DEPENDENCY_DUAL_ITEM (vulkan11Features, multiviewFeatures, multiviewTessellationShader, multiview),
+ DEPENDENCY_SINGLE_ITEM (vulkan12Features, shaderInputAttachmentArrayDynamicIndexing, descriptorIndexing),
+ DEPENDENCY_SINGLE_ITEM (vulkan12Features, shaderUniformTexelBufferArrayDynamicIndexing, descriptorIndexing),
+ DEPENDENCY_SINGLE_ITEM (vulkan12Features, shaderStorageTexelBufferArrayDynamicIndexing, descriptorIndexing),
+ DEPENDENCY_SINGLE_ITEM (vulkan12Features, shaderUniformBufferArrayNonUniformIndexing, descriptorIndexing),
+ DEPENDENCY_SINGLE_ITEM (vulkan12Features, shaderSampledImageArrayNonUniformIndexing, descriptorIndexing),
+ DEPENDENCY_SINGLE_ITEM (vulkan12Features, shaderStorageBufferArrayNonUniformIndexing, descriptorIndexing),
+ DEPENDENCY_SINGLE_ITEM (vulkan12Features, shaderStorageImageArrayNonUniformIndexing, descriptorIndexing),
+ DEPENDENCY_SINGLE_ITEM (vulkan12Features, shaderInputAttachmentArrayNonUniformIndexing, descriptorIndexing),
+ DEPENDENCY_SINGLE_ITEM (vulkan12Features, shaderUniformTexelBufferArrayNonUniformIndexing, descriptorIndexing),
+ DEPENDENCY_SINGLE_ITEM (vulkan12Features, shaderStorageTexelBufferArrayNonUniformIndexing, descriptorIndexing),
+ DEPENDENCY_SINGLE_ITEM (vulkan12Features, descriptorBindingUniformBufferUpdateAfterBind, descriptorIndexing),
+ DEPENDENCY_SINGLE_ITEM (vulkan12Features, descriptorBindingSampledImageUpdateAfterBind, descriptorIndexing),
+ DEPENDENCY_SINGLE_ITEM (vulkan12Features, descriptorBindingStorageImageUpdateAfterBind, descriptorIndexing),
+ DEPENDENCY_SINGLE_ITEM (vulkan12Features, descriptorBindingStorageBufferUpdateAfterBind, descriptorIndexing),
+ DEPENDENCY_SINGLE_ITEM (vulkan12Features, descriptorBindingUniformTexelBufferUpdateAfterBind, descriptorIndexing),
+ DEPENDENCY_SINGLE_ITEM (vulkan12Features, descriptorBindingStorageTexelBufferUpdateAfterBind, descriptorIndexing),
+ DEPENDENCY_SINGLE_ITEM (vulkan12Features, descriptorBindingUpdateUnusedWhilePending, descriptorIndexing),
+ DEPENDENCY_SINGLE_ITEM (vulkan12Features, descriptorBindingPartiallyBound, descriptorIndexing),
+ DEPENDENCY_SINGLE_ITEM (vulkan12Features, descriptorBindingVariableDescriptorCount, descriptorIndexing),
+ DEPENDENCY_SINGLE_ITEM (vulkan12Features, runtimeDescriptorArray, descriptorIndexing),
+ DEPENDENCY_DUAL_ITEM (vulkan12Features, bufferDeviceAddressFeatures, bufferDeviceAddressCaptureReplay, bufferDeviceAddress),
+ DEPENDENCY_DUAL_ITEM (vulkan12Features, bufferDeviceAddressFeatures, bufferDeviceAddressMultiDevice, bufferDeviceAddress),
+ DEPENDENCY_DUAL_ITEM (vulkan12Features, vulkanMemoryModelFeatures, vulkanMemoryModelDeviceScope, vulkanMemoryModel),
+ DEPENDENCY_DUAL_ITEM (vulkan12Features, vulkanMemoryModelFeatures, vulkanMemoryModelAvailabilityVisibilityChains, vulkanMemoryModel),
+ };
+
+ deMemset(&dummyExtensionFeatures, 0, sizeof(dummyExtensionFeatures));
+
+ for (size_t featureTableNdx = 0; featureTableNdx < DE_LENGTH_OF_ARRAY(featureTable); ++featureTableNdx)
+ {
+ FeatureTable& testedFeature = featureTable[featureTableNdx];
+ VkBool32 coreFeatureState= DE_FALSE;
+ VkBool32 extFeatureState = DE_FALSE;
+
+ // Core test
+ {
+ void* structPtr = testedFeature.coreStructPtr;
+ size_t structSize = testedFeature.coreStructSize;
+ VkBool32* featurePtr = testedFeature.coreFieldPtr;
+
+ if (structPtr != &dummyExtensionFeatures)
+ features2.pNext = structPtr;
+
+ vki.getPhysicalDeviceFeatures2(physicalDevice, &features2);
+
+ coreFeatureState = featurePtr[0];
+
+ log << TestLog::Message
+ << "Feature status "
+ << testedFeature.coreFieldName << "=" << coreFeatureState
+ << TestLog::EndMessage;
+
+ if (coreFeatureState)
+ {
+ cleanVulkanStruct(structPtr, structSize);
+
+ featurePtr[0] = DE_TRUE;
+
+ for (size_t featureDependencyTableNdx = 0; featureDependencyTableNdx < DE_LENGTH_OF_ARRAY(featureDependencyTable); ++featureDependencyTableNdx)
+ if (featureDependencyTable[featureDependencyTableNdx].featurePtr == featurePtr)
+ featureDependencyTable[featureDependencyTableNdx].dependOnPtr[0] = DE_TRUE;
+
+ createDevice(context, &features2, DE_NULL, 0u);
+ }
+ }
+
+ // ext test
+ {
+ void* structPtr = testedFeature.extStructPtr;
+ size_t structSize = testedFeature.extStructSize;
+ VkBool32* featurePtr = testedFeature.extFieldPtr;
+ const char* extStringPtr = testedFeature.extString;
+
+ if (structPtr != &dummyExtensionFeatures)
+ features2.pNext = structPtr;
+
+ if (extStringPtr == DE_NULL || isExtensionSupported(deviceExtensionProperties, RequiredExtension(extStringPtr)))
+ {
+ vki.getPhysicalDeviceFeatures2(physicalDevice, &features2);
+
+ extFeatureState = *featurePtr;
+
+ log << TestLog::Message
+ << "Feature status "
+ << testedFeature.extFieldName << "=" << extFeatureState
+ << TestLog::EndMessage;
+
+ if (extFeatureState)
+ {
+ cleanVulkanStruct(structPtr, structSize);
+
+ featurePtr[0] = DE_TRUE;
+
+ for (size_t featureDependencyTableNdx = 0; featureDependencyTableNdx < DE_LENGTH_OF_ARRAY(featureDependencyTable); ++featureDependencyTableNdx)
+ if (featureDependencyTable[featureDependencyTableNdx].featurePtr == featurePtr)
+ featureDependencyTable[featureDependencyTableNdx].dependOnPtr[0] = DE_TRUE;
+
+ createDevice(context, &features2, &extStringPtr, (extStringPtr == DE_NULL) ? 0u : 1u );
+ }
+ }
+ }
+ }
+
+ return tcu::TestStatus::pass("pass");
+}
+
template<typename T>
class CheckIncompleteResult
{
@@ -619,10 +1901,9 @@
{
TestLog& log = context.getTestContext().getLog();
tcu::ResultCollector results (log);
- const PlatformInterface& vkp = context.getPlatformInterface();
- const Unique<VkInstance> instance (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_device_group_creation"));
- const InstanceDriver vki (vkp, *instance);
- const vector<VkPhysicalDeviceGroupProperties> devicegroups = enumeratePhysicalDeviceGroups(vki, *instance);
+ const CustomInstance instance (createCustomInstanceWithExtension(context, "VK_KHR_device_group_creation"));
+ const InstanceDriver& vki (instance.getDriver());
+ const vector<VkPhysicalDeviceGroupProperties> devicegroups = enumeratePhysicalDeviceGroups(vki, instance);
log << TestLog::Integer("NumDevices", "Number of device groups", "", QP_KEY_TAG_NONE, deInt64(devicegroups.size()));
@@ -706,34 +1987,50 @@
checkDuplicateExtensions(results, extensions);
}
-void checkInstanceExtensionDependencies(tcu::ResultCollector& results,
- int dependencyLength,
- const std::pair<const char*, const char*>* dependencies,
- const vector<VkExtensionProperties>& extensionProperties)
+void checkInstanceExtensionDependencies(tcu::ResultCollector& results,
+ int dependencyLength,
+ const std::tuple<deUint32, deUint32, const char*, const char*>* dependencies,
+ deUint32 versionMajor,
+ deUint32 versionMinor,
+ const vector<VkExtensionProperties>& extensionProperties)
{
for (int ndx = 0; ndx < dependencyLength; ndx++)
{
- if (isExtensionSupported(extensionProperties, RequiredExtension(dependencies[ndx].first)) &&
- !isExtensionSupported(extensionProperties, RequiredExtension(dependencies[ndx].second)))
+ deUint32 currentVersionMajor, currentVersionMinor;
+ const char* extensionFirst;
+ const char* extensionSecond;
+ std::tie(currentVersionMajor, currentVersionMinor, extensionFirst, extensionSecond) = dependencies[ndx];
+ if (currentVersionMajor != versionMajor || currentVersionMinor != versionMinor)
+ continue;
+ if (isExtensionSupported(extensionProperties, RequiredExtension(extensionFirst)) &&
+ !isExtensionSupported(extensionProperties, RequiredExtension(extensionSecond)))
{
- results.fail("Extension " + string(dependencies[ndx].first) + " is missing dependency: " + string(dependencies[ndx].second));
+ results.fail("Extension " + string(extensionFirst) + " is missing dependency: " + string(extensionSecond));
}
}
}
-void checkDeviceExtensionDependencies(tcu::ResultCollector& results,
- int dependencyLength,
- const std::pair<const char*, const char*>* dependencies,
- const vector<VkExtensionProperties>& instanceExtensionProperties,
- const vector<VkExtensionProperties>& deviceExtensionProperties)
+void checkDeviceExtensionDependencies(tcu::ResultCollector& results,
+ int dependencyLength,
+ const std::tuple<deUint32, deUint32, const char*, const char*>* dependencies,
+ deUint32 versionMajor,
+ deUint32 versionMinor,
+ const vector<VkExtensionProperties>& instanceExtensionProperties,
+ const vector<VkExtensionProperties>& deviceExtensionProperties)
{
for (int ndx = 0; ndx < dependencyLength; ndx++)
{
- if (isExtensionSupported(deviceExtensionProperties, RequiredExtension(dependencies[ndx].first)) &&
- !isExtensionSupported(deviceExtensionProperties, RequiredExtension(dependencies[ndx].second)) &&
- !isExtensionSupported(instanceExtensionProperties, RequiredExtension(dependencies[ndx].second)))
+ deUint32 currentVersionMajor, currentVersionMinor;
+ const char* extensionFirst;
+ const char* extensionSecond;
+ std::tie(currentVersionMajor, currentVersionMinor, extensionFirst, extensionSecond) = dependencies[ndx];
+ if (currentVersionMajor != versionMajor || currentVersionMinor != versionMinor)
+ continue;
+ if (isExtensionSupported(deviceExtensionProperties, RequiredExtension(extensionFirst)) &&
+ !isExtensionSupported(deviceExtensionProperties, RequiredExtension(extensionSecond)) &&
+ !isExtensionSupported(instanceExtensionProperties, RequiredExtension(extensionSecond)))
{
- results.fail("Extension " + string(dependencies[ndx].first) + " is missing dependency: " + string(dependencies[ndx].second));
+ results.fail("Extension " + string(extensionFirst) + " is missing dependency: " + string(extensionSecond));
}
}
}
@@ -778,17 +2075,20 @@
checkInstanceExtensions(results, extensionNames);
CheckEnumerateInstanceExtensionPropertiesIncompleteResult()(context, results, properties.size());
- if (context.contextSupports(vk::ApiVersion(1, 1, 0)))
+ for (const auto& version : releasedApiVersions)
{
- checkInstanceExtensionDependencies(results,
- DE_LENGTH_OF_ARRAY(instanceExtensionDependencies_1_1),
- instanceExtensionDependencies_1_1, properties);
- }
- else if (context.contextSupports(vk::ApiVersion(1, 0, 0)))
- {
- checkInstanceExtensionDependencies(results,
- DE_LENGTH_OF_ARRAY(instanceExtensionDependencies_1_0),
- instanceExtensionDependencies_1_0, properties);
+ deUint32 versionMajor, versionMinor;
+ std::tie(std::ignore, versionMajor, versionMinor) = version;
+ if (context.contextSupports(vk::ApiVersion(versionMajor, versionMinor, 0)))
+ {
+ checkInstanceExtensionDependencies(results,
+ DE_LENGTH_OF_ARRAY(instanceExtensionDependencies),
+ instanceExtensionDependencies,
+ versionMajor,
+ versionMinor,
+ properties);
+ break;
+ }
}
}
@@ -899,21 +2199,21 @@
checkDeviceExtensions(results, deviceExtensionNames);
CheckEnumerateDeviceExtensionPropertiesIncompleteResult()(context, results, deviceExtensionProperties.size());
- if (context.contextSupports(vk::ApiVersion(1, 1, 0)))
+ for (const auto& version : releasedApiVersions)
{
- checkDeviceExtensionDependencies(results,
- DE_LENGTH_OF_ARRAY(deviceExtensionDependencies_1_1),
- deviceExtensionDependencies_1_1,
- instanceExtensionProperties,
- deviceExtensionProperties);
- }
- else if (context.contextSupports(vk::ApiVersion(1, 0, 0)))
- {
- checkDeviceExtensionDependencies(results,
- DE_LENGTH_OF_ARRAY(deviceExtensionDependencies_1_0),
- deviceExtensionDependencies_1_0,
- instanceExtensionProperties,
- deviceExtensionProperties);
+ deUint32 versionMajor, versionMinor;
+ std::tie(std::ignore, versionMajor, versionMinor) = version;
+ if (context.contextSupports(vk::ApiVersion(versionMajor, versionMinor, 0)))
+ {
+ checkDeviceExtensionDependencies(results,
+ DE_LENGTH_OF_ARRAY(instanceExtensionDependencies),
+ instanceExtensionDependencies,
+ versionMajor,
+ versionMinor,
+ instanceExtensionProperties,
+ deviceExtensionProperties);
+ break;
+ }
}
}
@@ -1216,7 +2516,7 @@
{
const ApiVersion deviceVersion = unpackVersion(props->apiVersion);
- const ApiVersion deqpVersion = unpackVersion(VK_API_VERSION_1_1);
+ const ApiVersion deqpVersion = unpackVersion(VK_API_VERSION_1_2);
if (deviceVersion.majorNum != deqpVersion.majorNum)
{
@@ -1367,11 +2667,11 @@
{
TestLog& log = context.getTestContext().getLog();
const PlatformInterface& vkp = context.getPlatformInterface();
- const Unique<VkInstance> instance (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_device_group_creation"));
- const InstanceDriver vki (vkp, *instance);
+ const CustomInstance instance (createCustomInstanceWithExtension(context, "VK_KHR_device_group_creation"));
+ const InstanceDriver& vki (instance.getDriver());
const tcu::CommandLine& cmdLine = context.getTestContext().getCommandLine();
const deUint32 devGroupIdx = cmdLine.getVKDeviceGroupId() - 1;
- const deUint32 deviceIdx = vk::chooseDeviceIndex(context.getInstanceInterface(), *instance, cmdLine);
+ const deUint32 deviceIdx = vk::chooseDeviceIndex(context.getInstanceInterface(), instance, cmdLine);
const float queuePriority = 1.0f;
VkPhysicalDeviceMemoryProperties memProps;
VkPeerMemoryFeatureFlags* peerMemFeatures;
@@ -1379,7 +2679,7 @@
deUint32 numPhysicalDevices = 0;
deUint32 queueFamilyIndex = 0;
- const vector<VkPhysicalDeviceGroupProperties> deviceGroupProps = enumeratePhysicalDeviceGroups(vki, *instance);
+ const vector<VkPhysicalDeviceGroupProperties> deviceGroupProps = enumeratePhysicalDeviceGroups(vki, instance);
std::vector<const char*> deviceExtensions;
deviceExtensions.push_back("VK_KHR_device_group");
@@ -1415,6 +2715,7 @@
deviceGroupProps[devGroupIdx].physicalDeviceCount, //physicalDeviceCount
deviceGroupProps[devGroupIdx].physicalDevices //physicalDevices
};
+
const VkDeviceCreateInfo deviceCreateInfo =
{
VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, //sType;
@@ -1429,8 +2730,8 @@
DE_NULL, //pEnabledFeatures;
};
- Move<VkDevice> deviceGroup = createDevice(vkp, *instance, vki, deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx], &deviceCreateInfo);
- const DeviceDriver vk (vkp, *instance, *deviceGroup);
+ Move<VkDevice> deviceGroup = createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), vkp, instance, vki, deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx], &deviceCreateInfo);
+ const DeviceDriver vk (vkp, instance, *deviceGroup);
context.getInstanceInterface().getPhysicalDeviceMemoryProperties(deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx], &memProps);
peerMemFeatures = reinterpret_cast<VkPeerMemoryFeatureFlags*>(buffer);
@@ -1481,7 +2782,7 @@
TestLog& log = context.getTestContext().getLog();
deUint8 buffer[sizeof(VkPhysicalDeviceMemoryBudgetPropertiesEXT) + GUARD_SIZE];
- if (!vk::isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_EXT_memory_budget"))
+ if (!context.isDeviceFunctionalitySupported("VK_EXT_memory_budget"))
TCU_THROW(NotSupportedError, "VK_EXT_memory_budget is not supported");
VkPhysicalDeviceMemoryBudgetPropertiesEXT *budgetProps = reinterpret_cast<VkPhysicalDeviceMemoryBudgetPropertiesEXT *>(buffer);
@@ -1660,7 +2961,7 @@
{
if (de::contains(DE_ARRAY_BEGIN(s_requiredSampledImageFilterMinMaxFormats), DE_ARRAY_END(s_requiredSampledImageFilterMinMaxFormats), format))
{
- VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT physicalDeviceSamplerMinMaxProperties =
+ VkPhysicalDeviceSamplerFilterMinmaxProperties physicalDeviceSamplerMinMaxProperties =
{
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT,
DE_NULL,
@@ -1905,7 +3206,7 @@
if (!vk::isCoreDeviceExtension(context.getUsedApiVersion(), "VK_KHR_sampler_ycbcr_conversion"))
{
- if (!vk::isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_sampler_ycbcr_conversion"))
+ if (!context.isDeviceFunctionalitySupported("VK_KHR_sampler_ycbcr_conversion"))
TCU_THROW(NotSupportedError, "VK_KHR_sampler_ycbcr_conversion is not supported");
// Hard dependency for ycbcr
@@ -2486,7 +3787,7 @@
const VkPhysicalDeviceFeatures& deviceFeatures = context.getDeviceFeatures();
const VkPhysicalDeviceLimits& deviceLimits = context.getDeviceProperties().limits;
const VkFormatProperties formatProperties = getPhysicalDeviceFormatProperties(context.getInstanceInterface(), context.getPhysicalDevice(), format);
- const bool hasKhrMaintenance1 = isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_maintenance1");
+ const bool hasKhrMaintenance1 = context.isDeviceFunctionalitySupported("VK_KHR_maintenance1");
const VkFormatFeatureFlags supportedFeatures = tiling == VK_IMAGE_TILING_LINEAR ? formatProperties.linearTilingFeatures : formatProperties.optimalTilingFeatures;
const VkImageUsageFlags usageFlagSet = getValidImageUsageFlags(supportedFeatures, hasKhrMaintenance1);
@@ -2642,7 +3943,7 @@
{
for (size_t ndx = 0; ndx < properties.size(); ++ndx)
{
- if (strcmp(properties[ndx].extensionName, extension) == 0)
+ if (strncmp(properties[ndx].extensionName, extension, VK_MAX_EXTENSION_NAME_SIZE) == 0)
return true;
}
return false;
@@ -2650,10 +3951,9 @@
tcu::TestStatus deviceFeatures2 (Context& context)
{
- const PlatformInterface& vkp = context.getPlatformInterface();
const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
- const Unique<VkInstance> instance (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_get_physical_device_properties2"));
- const InstanceDriver vki (vkp, *instance);
+ const CustomInstance instance (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+ const InstanceDriver& vki (instance.getDriver());
TestLog& log = context.getTestContext().getLog();
VkPhysicalDeviceFeatures coreFeatures;
VkPhysicalDeviceFeatures2 extFeatures;
@@ -2676,166 +3976,262 @@
log << TestLog::Message << extFeatures << TestLog::EndMessage;
- vector<VkExtensionProperties> properties = enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
- const bool khr_8bit_storage = checkExtension(properties,"VK_KHR_8bit_storage");
- const bool ext_conditional_rendering = checkExtension(properties,"VK_EXT_conditional_rendering");
- const bool scalar_block_layout = checkExtension(properties,"VK_EXT_scalar_block_layout");
- bool khr_16bit_storage = true;
- bool khr_multiview = true;
- bool deviceProtectedMemory = true;
- bool sampler_ycbcr_conversion = true;
- bool variable_pointers = true;
- if (getPhysicalDeviceProperties(vki, physicalDevice).apiVersion < VK_API_VERSION_1_1)
- {
- khr_16bit_storage = checkExtension(properties,"VK_KHR_16bit_storage");
- khr_multiview = checkExtension(properties,"VK_KHR_multiview");
- deviceProtectedMemory = false;
- sampler_ycbcr_conversion = checkExtension(properties,"VK_KHR_sampler_ycbcr_conversion");
- variable_pointers = checkExtension(properties,"VK_KHR_variable_pointers");
- }
+ vector<VkExtensionProperties> properties = enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
+ const bool ext_conditional_rendering = checkExtension(properties, "VK_EXT_conditional_rendering");
+ const bool ext_scalar_block_layout = checkExtension(properties, "VK_EXT_scalar_block_layout");
+ const bool khr_performance_counter = checkExtension(properties, "VK_KHR_performance_query");
+ const bool khr_16bit_storage = checkExtension(properties, "VK_KHR_16bit_storage") || context.contextSupports(vk::ApiVersion(1, 1, 0));
+ const bool khr_multiview = checkExtension(properties, "VK_KHR_multiview") || context.contextSupports(vk::ApiVersion(1, 1, 0));
+ const bool khr_device_protected_memory = context.contextSupports(vk::ApiVersion(1, 1, 0));
+ const bool khr_sampler_ycbcr_conversion = checkExtension(properties, "VK_KHR_sampler_ycbcr_conversion") || context.contextSupports(vk::ApiVersion(1, 1, 0));
+ const bool khr_variable_pointers = checkExtension(properties, "VK_KHR_variable_pointers") || context.contextSupports(vk::ApiVersion(1, 1, 0));
+ const bool khr_8bit_storage = checkExtension(properties, "VK_KHR_8bit_storage") || context.contextSupports(vk::ApiVersion(1, 2, 0));
+ const bool khr_shader_atomic_int64 = checkExtension(properties, "VK_KHR_shader_atomic_int64") || context.contextSupports(vk::ApiVersion(1, 2, 0));
+ const bool khr_shader_float16_int8 = checkExtension(properties, "VK_KHR_shader_float16_int8") || context.contextSupports(vk::ApiVersion(1, 2, 0));
+ const bool khr_buffer_device_address = checkExtension(properties, "VK_KHR_buffer_device_address") || context.contextSupports(vk::ApiVersion(1, 2, 0));
+ const bool ext_descriptor_indexing = checkExtension(properties, "VK_EXT_descriptor_indexing") || context.contextSupports(vk::ApiVersion(1, 2, 0));
+ const bool ext_buffer_device_address = checkExtension(properties, "VK_EXT_buffer_device_address");
const int count = 2u;
- VkPhysicalDevice8BitStorageFeaturesKHR device8BitStorageFeatures[count];
- VkPhysicalDeviceConditionalRenderingFeaturesEXT deviceConditionalRenderingFeatures[count];
- VkPhysicalDevice16BitStorageFeatures device16BitStorageFeatures[count];
- VkPhysicalDeviceMultiviewFeatures deviceMultiviewFeatures[count];
- VkPhysicalDeviceProtectedMemoryFeatures protectedMemoryFeatures[count];
- VkPhysicalDeviceSamplerYcbcrConversionFeatures samplerYcbcrConversionFeatures[count];
- VkPhysicalDeviceVariablePointersFeatures variablePointerFeatures[count];
- VkPhysicalDeviceScalarBlockLayoutFeaturesEXT scalarBlockLayoutFeatures[count];
- VkPhysicalDeviceTimelineSemaphoreFeaturesKHR timelineSemaphoreFeatures[count];
-
+ VkPhysicalDeviceConditionalRenderingFeaturesEXT deviceConditionalRenderingFeatures[count];
+ VkPhysicalDeviceScalarBlockLayoutFeatures scalarBlockLayoutFeatures[count];
+ VkPhysicalDevicePerformanceQueryFeaturesKHR performanceQueryFeatures[count];
+ VkPhysicalDevice16BitStorageFeatures device16BitStorageFeatures[count];
+ VkPhysicalDeviceMultiviewFeatures deviceMultiviewFeatures[count];
+ VkPhysicalDeviceProtectedMemoryFeatures protectedMemoryFeatures[count];
+ VkPhysicalDeviceSamplerYcbcrConversionFeatures samplerYcbcrConversionFeatures[count];
+ VkPhysicalDeviceVariablePointersFeatures variablePointerFeatures[count];
+ VkPhysicalDevice8BitStorageFeatures device8BitStorageFeatures[count];
+ VkPhysicalDeviceShaderAtomicInt64Features deviceShaderAtomicInt64Features[count];
+ VkPhysicalDeviceShaderFloat16Int8Features deviceShaderFloat16Int8Features[count];
+ VkPhysicalDeviceBufferDeviceAddressFeaturesEXT deviceBufferDeviceAddressFeaturesEXT[count];
+ VkPhysicalDeviceBufferDeviceAddressFeatures deviceBufferDeviceAddressFeatures[count];
+ VkPhysicalDeviceDescriptorIndexingFeatures deviceDescriptorIndexingFeatures[count];
+ VkPhysicalDeviceTimelineSemaphoreFeatures timelineSemaphoreFeatures[count];
for (int ndx = 0; ndx < count; ++ndx)
{
- deMemset(&device8BitStorageFeatures[ndx], 0xFF*ndx, sizeof(VkPhysicalDevice8BitStorageFeaturesKHR));
- deMemset(&deviceConditionalRenderingFeatures[ndx], 0xFF*ndx, sizeof(VkPhysicalDeviceConditionalRenderingFeaturesEXT));
- deMemset(&device16BitStorageFeatures[ndx], 0xFF*ndx, sizeof(VkPhysicalDevice16BitStorageFeatures));
- deMemset(&deviceMultiviewFeatures[ndx], 0xFF*ndx, sizeof(VkPhysicalDeviceMultiviewFeatures));
- deMemset(&protectedMemoryFeatures[ndx], 0xFF*ndx, sizeof(VkPhysicalDeviceProtectedMemoryFeatures));
- deMemset(&samplerYcbcrConversionFeatures[ndx], 0xFF*ndx, sizeof(VkPhysicalDeviceSamplerYcbcrConversionFeatures));
- deMemset(&variablePointerFeatures[ndx], 0xFF*ndx, sizeof(VkPhysicalDeviceVariablePointersFeatures));
- deMemset(&scalarBlockLayoutFeatures[ndx], 0xFF*ndx, sizeof(VkPhysicalDeviceScalarBlockLayoutFeaturesEXT));
+ deMemset(&deviceConditionalRenderingFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceConditionalRenderingFeaturesEXT));
+ deMemset(&scalarBlockLayoutFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceScalarBlockLayoutFeatures));
+ deMemset(&performanceQueryFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDevicePerformanceQueryFeaturesKHR));
+ deMemset(&device16BitStorageFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDevice16BitStorageFeatures));
+ deMemset(&deviceMultiviewFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceMultiviewFeatures));
+ deMemset(&protectedMemoryFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceProtectedMemoryFeatures));
+ deMemset(&samplerYcbcrConversionFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceSamplerYcbcrConversionFeatures));
+ deMemset(&variablePointerFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceVariablePointersFeatures));
+ deMemset(&device8BitStorageFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDevice8BitStorageFeaturesKHR));
+ deMemset(&deviceShaderAtomicInt64Features[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceShaderAtomicInt64Features));
+ deMemset(&deviceShaderFloat16Int8Features[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceShaderFloat16Int8Features));
+ deMemset(&deviceBufferDeviceAddressFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceBufferDeviceAddressFeatures));
+ deMemset(&deviceBufferDeviceAddressFeaturesEXT[ndx],0xFF * ndx, sizeof(VkPhysicalDeviceBufferDeviceAddressFeaturesEXT));
+ deMemset(&deviceDescriptorIndexingFeatures[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceDescriptorIndexingFeatures));
- device8BitStorageFeatures[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR;
- device8BitStorageFeatures[ndx].pNext = &deviceConditionalRenderingFeatures[ndx];
+ deviceConditionalRenderingFeatures[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT;
+ deviceConditionalRenderingFeatures[ndx].pNext = &scalarBlockLayoutFeatures[ndx];
- deviceConditionalRenderingFeatures[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT;
- deviceConditionalRenderingFeatures[ndx].pNext = &device16BitStorageFeatures[ndx];
+ scalarBlockLayoutFeatures[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT;
+ scalarBlockLayoutFeatures[ndx].pNext = &performanceQueryFeatures[ndx];
- device16BitStorageFeatures[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES;
- device16BitStorageFeatures[ndx].pNext = &deviceMultiviewFeatures[ndx];
+ performanceQueryFeatures[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR;
+ performanceQueryFeatures[ndx].pNext = &device16BitStorageFeatures[ndx];
- deviceMultiviewFeatures[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES;
- deviceMultiviewFeatures[ndx].pNext = &protectedMemoryFeatures[ndx];
+ device16BitStorageFeatures[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES;
+ device16BitStorageFeatures[ndx].pNext = &deviceMultiviewFeatures[ndx];
- protectedMemoryFeatures[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES;
- protectedMemoryFeatures[ndx].pNext = &samplerYcbcrConversionFeatures[ndx];
+ deviceMultiviewFeatures[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES;
+ deviceMultiviewFeatures[ndx].pNext = &protectedMemoryFeatures[ndx];
- samplerYcbcrConversionFeatures[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES;
- samplerYcbcrConversionFeatures[ndx].pNext = &variablePointerFeatures[ndx];
+ protectedMemoryFeatures[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES;
+ protectedMemoryFeatures[ndx].pNext = &samplerYcbcrConversionFeatures[ndx];
- variablePointerFeatures[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES;
- variablePointerFeatures[ndx].pNext = &scalarBlockLayoutFeatures[ndx];
+ samplerYcbcrConversionFeatures[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES;
+ samplerYcbcrConversionFeatures[ndx].pNext = &variablePointerFeatures[ndx];
- scalarBlockLayoutFeatures[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT;
- scalarBlockLayoutFeatures[ndx].pNext = &timelineSemaphoreFeatures;
+ variablePointerFeatures[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES;
+ variablePointerFeatures[ndx].pNext = &device8BitStorageFeatures[ndx];
- timelineSemaphoreFeatures[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR;
+ device8BitStorageFeatures[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR;
+ device8BitStorageFeatures[ndx].pNext = &deviceShaderAtomicInt64Features[ndx];
+
+ deviceShaderAtomicInt64Features[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES;
+ deviceShaderAtomicInt64Features[ndx].pNext = &deviceShaderFloat16Int8Features[ndx];
+
+ deviceShaderFloat16Int8Features[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES;
+ deviceShaderFloat16Int8Features[ndx].pNext = &deviceBufferDeviceAddressFeatures[ndx];
+
+ deviceBufferDeviceAddressFeatures[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES;
+ deviceBufferDeviceAddressFeatures[ndx].pNext = &deviceBufferDeviceAddressFeaturesEXT[ndx];
+
+ deviceBufferDeviceAddressFeaturesEXT[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT;
+ deviceBufferDeviceAddressFeaturesEXT[ndx].pNext = &deviceDescriptorIndexingFeatures[ndx];
+
+ deviceDescriptorIndexingFeatures[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES;
+ deviceDescriptorIndexingFeatures[ndx].pNext = &timelineSemaphoreFeatures[ndx];
+
+ timelineSemaphoreFeatures[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES;
timelineSemaphoreFeatures[ndx].pNext = DE_NULL;
deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
- extFeatures.pNext = &device8BitStorageFeatures[ndx];
+ extFeatures.pNext = &deviceConditionalRenderingFeatures[ndx];
vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
}
- if ( khr_8bit_storage &&
- (device8BitStorageFeatures[0].storageBuffer8BitAccess != device8BitStorageFeatures[1].storageBuffer8BitAccess ||
- device8BitStorageFeatures[0].uniformAndStorageBuffer8BitAccess != device8BitStorageFeatures[1].uniformAndStorageBuffer8BitAccess ||
- device8BitStorageFeatures[0].storagePushConstant8 != device8BitStorageFeatures[1].storagePushConstant8 )
- )
- {
- TCU_FAIL("Mismatch between VkPhysicalDevice8BitStorageFeatures");
- }
+ if (ext_conditional_rendering)
+ log << TestLog::Message << deviceConditionalRenderingFeatures[0] << TestLog::EndMessage;
+ if (ext_scalar_block_layout)
+ log << TestLog::Message << scalarBlockLayoutFeatures[0] << TestLog::EndMessage;
+ if (khr_performance_counter)
+ log << TestLog::Message << performanceQueryFeatures[0] << TestLog::EndMessage;
+ if (khr_16bit_storage)
+ log << TestLog::Message << device16BitStorageFeatures[0] << TestLog::EndMessage;
+ if (khr_multiview)
+ log << TestLog::Message << deviceMultiviewFeatures[0] << TestLog::EndMessage;
+ if (khr_device_protected_memory)
+ log << TestLog::Message << protectedMemoryFeatures[0] << TestLog::EndMessage;
+ if (khr_sampler_ycbcr_conversion)
+ log << TestLog::Message << samplerYcbcrConversionFeatures[0] << TestLog::EndMessage;
+ if (khr_variable_pointers)
+ log << TestLog::Message << variablePointerFeatures[0] << TestLog::EndMessage;
+ if (khr_8bit_storage)
+ log << TestLog::Message << device8BitStorageFeatures[0] << TestLog::EndMessage;
+ if (khr_shader_atomic_int64)
+ log << TestLog::Message << deviceShaderAtomicInt64Features[0] << TestLog::EndMessage;
+ if (khr_shader_float16_int8)
+ log << TestLog::Message << deviceShaderFloat16Int8Features[0] << TestLog::EndMessage;
+ if (khr_buffer_device_address)
+ log << TestLog::Message << deviceBufferDeviceAddressFeatures[0] << TestLog::EndMessage;
+ if (ext_buffer_device_address)
+ log << TestLog::Message << deviceBufferDeviceAddressFeaturesEXT[0] << TestLog::EndMessage;
+ if (ext_descriptor_indexing)
+ log << TestLog::Message << deviceDescriptorIndexingFeatures[0] << TestLog::EndMessage;
if ( ext_conditional_rendering &&
- (deviceConditionalRenderingFeatures[0].conditionalRendering != deviceConditionalRenderingFeatures[1].conditionalRendering ||
- deviceConditionalRenderingFeatures[0].inheritedConditionalRendering != deviceConditionalRenderingFeatures[1].inheritedConditionalRendering )
- )
+ ( deviceConditionalRenderingFeatures[0].conditionalRendering != deviceConditionalRenderingFeatures[1].conditionalRendering ||
+ deviceConditionalRenderingFeatures[0].inheritedConditionalRendering != deviceConditionalRenderingFeatures[1].inheritedConditionalRendering ))
{
TCU_FAIL("Mismatch between VkPhysicalDeviceConditionalRenderingFeaturesEXT");
}
+ if ( ext_scalar_block_layout &&
+ ( scalarBlockLayoutFeatures[0].scalarBlockLayout != scalarBlockLayoutFeatures[1].scalarBlockLayout ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceScalarBlockLayoutFeatures");
+ }
+
+ if ( khr_performance_counter &&
+ ( performanceQueryFeatures[0].performanceCounterQueryPools != performanceQueryFeatures[1].performanceCounterQueryPools ||
+ performanceQueryFeatures[0].performanceCounterMultipleQueryPools != performanceQueryFeatures[1].performanceCounterMultipleQueryPools ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDevicePerformancQueryFeaturesKHR");
+ }
+
if ( khr_16bit_storage &&
- (device16BitStorageFeatures[0].storageBuffer16BitAccess != device16BitStorageFeatures[1].storageBuffer16BitAccess ||
- device16BitStorageFeatures[0].uniformAndStorageBuffer16BitAccess != device16BitStorageFeatures[1].uniformAndStorageBuffer16BitAccess ||
- device16BitStorageFeatures[0].storagePushConstant16 != device16BitStorageFeatures[1].storagePushConstant16 ||
- device16BitStorageFeatures[0].storageInputOutput16 != device16BitStorageFeatures[1].storageInputOutput16)
- )
+ ( device16BitStorageFeatures[0].storageBuffer16BitAccess != device16BitStorageFeatures[1].storageBuffer16BitAccess ||
+ device16BitStorageFeatures[0].uniformAndStorageBuffer16BitAccess != device16BitStorageFeatures[1].uniformAndStorageBuffer16BitAccess ||
+ device16BitStorageFeatures[0].storagePushConstant16 != device16BitStorageFeatures[1].storagePushConstant16 ||
+ device16BitStorageFeatures[0].storageInputOutput16 != device16BitStorageFeatures[1].storageInputOutput16 ))
{
TCU_FAIL("Mismatch between VkPhysicalDevice16BitStorageFeatures");
}
- if (khr_multiview &&
- (deviceMultiviewFeatures[0].multiview != deviceMultiviewFeatures[1].multiview ||
- deviceMultiviewFeatures[0].multiviewGeometryShader != deviceMultiviewFeatures[1].multiviewGeometryShader ||
- deviceMultiviewFeatures[0].multiviewTessellationShader != deviceMultiviewFeatures[1].multiviewTessellationShader)
- )
+ if ( khr_multiview &&
+ ( deviceMultiviewFeatures[0].multiview != deviceMultiviewFeatures[1].multiview ||
+ deviceMultiviewFeatures[0].multiviewGeometryShader != deviceMultiviewFeatures[1].multiviewGeometryShader ||
+ deviceMultiviewFeatures[0].multiviewTessellationShader != deviceMultiviewFeatures[1].multiviewTessellationShader ))
{
TCU_FAIL("Mismatch between VkPhysicalDeviceMultiviewFeatures");
}
- if (deviceProtectedMemory && protectedMemoryFeatures[0].protectedMemory != protectedMemoryFeatures[1].protectedMemory)
+ if ( khr_device_protected_memory && protectedMemoryFeatures[0].protectedMemory != protectedMemoryFeatures[1].protectedMemory )
{
TCU_FAIL("Mismatch between VkPhysicalDeviceProtectedMemoryFeatures");
}
- if (sampler_ycbcr_conversion && samplerYcbcrConversionFeatures[0].samplerYcbcrConversion != samplerYcbcrConversionFeatures[1].samplerYcbcrConversion)
+ if ( khr_sampler_ycbcr_conversion && samplerYcbcrConversionFeatures[0].samplerYcbcrConversion != samplerYcbcrConversionFeatures[1].samplerYcbcrConversion )
{
TCU_FAIL("Mismatch between VkPhysicalDeviceSamplerYcbcrConversionFeatures");
}
- if (variable_pointers &&
- (variablePointerFeatures[0].variablePointersStorageBuffer != variablePointerFeatures[1].variablePointersStorageBuffer ||
- variablePointerFeatures[0].variablePointers != variablePointerFeatures[1].variablePointers)
- )
+ if ( khr_variable_pointers &&
+ ( variablePointerFeatures[0].variablePointersStorageBuffer != variablePointerFeatures[1].variablePointersStorageBuffer ||
+ variablePointerFeatures[0].variablePointers != variablePointerFeatures[1].variablePointers))
{
TCU_FAIL("Mismatch between VkPhysicalDeviceVariablePointersFeatures");
}
- if (scalar_block_layout &&
- (scalarBlockLayoutFeatures[0].scalarBlockLayout != scalarBlockLayoutFeatures[1].scalarBlockLayout))
+
+ if ( khr_8bit_storage &&
+ ( device8BitStorageFeatures[0].storageBuffer8BitAccess != device8BitStorageFeatures[1].storageBuffer8BitAccess ||
+ device8BitStorageFeatures[0].uniformAndStorageBuffer8BitAccess != device8BitStorageFeatures[1].uniformAndStorageBuffer8BitAccess ||
+ device8BitStorageFeatures[0].storagePushConstant8 != device8BitStorageFeatures[1].storagePushConstant8 ))
{
- TCU_FAIL("Mismatch between VkPhysicalDeviceScalarBlockLayoutFeaturesEXT");
+ TCU_FAIL("Mismatch between VkPhysicalDevice8BitStorageFeatures");
}
- if (khr_8bit_storage)
- log << TestLog::Message << device8BitStorageFeatures[0] << TestLog::EndMessage;
- if (ext_conditional_rendering)
- log << TestLog::Message << deviceConditionalRenderingFeatures[0] << TestLog::EndMessage;
- if (khr_16bit_storage)
- log << TestLog::Message << device16BitStorageFeatures[0] << TestLog::EndMessage;
- if (khr_multiview)
- log << TestLog::Message << deviceMultiviewFeatures[0] << TestLog::EndMessage;
- if (deviceProtectedMemory)
- log << TestLog::Message << protectedMemoryFeatures[0] << TestLog::EndMessage;
- if (sampler_ycbcr_conversion)
- log << TestLog::Message << samplerYcbcrConversionFeatures[0] << TestLog::EndMessage;
- if (variable_pointers)
- log << TestLog::Message << variablePointerFeatures[0] << TestLog::EndMessage;
- if (scalar_block_layout)
- log << TestLog::Message << scalarBlockLayoutFeatures[0] << TestLog::EndMessage;
+
+ if ( khr_shader_atomic_int64 &&
+ ( deviceShaderAtomicInt64Features[0].shaderBufferInt64Atomics != deviceShaderAtomicInt64Features[1].shaderBufferInt64Atomics ||
+ deviceShaderAtomicInt64Features[0].shaderSharedInt64Atomics != deviceShaderAtomicInt64Features[1].shaderSharedInt64Atomics ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceShaderAtomicInt64Features");
+ }
+
+ if ( khr_shader_float16_int8 &&
+ ( deviceShaderFloat16Int8Features[0].shaderFloat16 != deviceShaderFloat16Int8Features[1].shaderFloat16 ||
+ deviceShaderFloat16Int8Features[0].shaderInt8 != deviceShaderFloat16Int8Features[1].shaderInt8 ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceShaderFloat16Int8Features");
+ }
+
+ if ( khr_buffer_device_address &&
+ ( deviceBufferDeviceAddressFeatures[0].bufferDeviceAddress != deviceBufferDeviceAddressFeatures[1].bufferDeviceAddress ||
+ deviceBufferDeviceAddressFeatures[0].bufferDeviceAddressCaptureReplay != deviceBufferDeviceAddressFeatures[1].bufferDeviceAddressCaptureReplay ||
+ deviceBufferDeviceAddressFeatures[0].bufferDeviceAddressMultiDevice != deviceBufferDeviceAddressFeatures[1].bufferDeviceAddressMultiDevice ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceBufferDeviceAddressFeatures");
+ }
+
+ if ( ext_buffer_device_address &&
+ ( deviceBufferDeviceAddressFeaturesEXT[0].bufferDeviceAddress != deviceBufferDeviceAddressFeaturesEXT[1].bufferDeviceAddress ||
+ deviceBufferDeviceAddressFeaturesEXT[0].bufferDeviceAddressCaptureReplay != deviceBufferDeviceAddressFeaturesEXT[1].bufferDeviceAddressCaptureReplay ||
+ deviceBufferDeviceAddressFeaturesEXT[0].bufferDeviceAddressMultiDevice != deviceBufferDeviceAddressFeaturesEXT[1].bufferDeviceAddressMultiDevice ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceBufferDeviceAddressFeaturesEXT");
+ }
+
+ if ( ext_descriptor_indexing &&
+ ( deviceDescriptorIndexingFeatures[0].shaderInputAttachmentArrayDynamicIndexing != deviceDescriptorIndexingFeatures[1].shaderInputAttachmentArrayDynamicIndexing ||
+ deviceDescriptorIndexingFeatures[0].shaderUniformTexelBufferArrayDynamicIndexing != deviceDescriptorIndexingFeatures[1].shaderUniformTexelBufferArrayDynamicIndexing ||
+ deviceDescriptorIndexingFeatures[0].shaderStorageTexelBufferArrayDynamicIndexing != deviceDescriptorIndexingFeatures[1].shaderStorageTexelBufferArrayDynamicIndexing ||
+ deviceDescriptorIndexingFeatures[0].shaderUniformBufferArrayNonUniformIndexing != deviceDescriptorIndexingFeatures[1].shaderUniformBufferArrayNonUniformIndexing ||
+ deviceDescriptorIndexingFeatures[0].shaderSampledImageArrayNonUniformIndexing != deviceDescriptorIndexingFeatures[1].shaderSampledImageArrayNonUniformIndexing ||
+ deviceDescriptorIndexingFeatures[0].shaderStorageBufferArrayNonUniformIndexing != deviceDescriptorIndexingFeatures[1].shaderStorageBufferArrayNonUniformIndexing ||
+ deviceDescriptorIndexingFeatures[0].shaderStorageImageArrayNonUniformIndexing != deviceDescriptorIndexingFeatures[1].shaderStorageImageArrayNonUniformIndexing ||
+ deviceDescriptorIndexingFeatures[0].shaderInputAttachmentArrayNonUniformIndexing != deviceDescriptorIndexingFeatures[1].shaderInputAttachmentArrayNonUniformIndexing ||
+ deviceDescriptorIndexingFeatures[0].shaderUniformTexelBufferArrayNonUniformIndexing != deviceDescriptorIndexingFeatures[1].shaderUniformTexelBufferArrayNonUniformIndexing ||
+ deviceDescriptorIndexingFeatures[0].shaderStorageTexelBufferArrayNonUniformIndexing != deviceDescriptorIndexingFeatures[1].shaderStorageTexelBufferArrayNonUniformIndexing ||
+ deviceDescriptorIndexingFeatures[0].descriptorBindingUniformBufferUpdateAfterBind != deviceDescriptorIndexingFeatures[1].descriptorBindingUniformBufferUpdateAfterBind ||
+ deviceDescriptorIndexingFeatures[0].descriptorBindingSampledImageUpdateAfterBind != deviceDescriptorIndexingFeatures[1].descriptorBindingSampledImageUpdateAfterBind ||
+ deviceDescriptorIndexingFeatures[0].descriptorBindingStorageImageUpdateAfterBind != deviceDescriptorIndexingFeatures[1].descriptorBindingStorageImageUpdateAfterBind ||
+ deviceDescriptorIndexingFeatures[0].descriptorBindingStorageBufferUpdateAfterBind != deviceDescriptorIndexingFeatures[1].descriptorBindingStorageBufferUpdateAfterBind ||
+ deviceDescriptorIndexingFeatures[0].descriptorBindingUniformTexelBufferUpdateAfterBind != deviceDescriptorIndexingFeatures[1].descriptorBindingUniformTexelBufferUpdateAfterBind ||
+ deviceDescriptorIndexingFeatures[0].descriptorBindingStorageTexelBufferUpdateAfterBind != deviceDescriptorIndexingFeatures[1].descriptorBindingStorageTexelBufferUpdateAfterBind ||
+ deviceDescriptorIndexingFeatures[0].descriptorBindingUpdateUnusedWhilePending != deviceDescriptorIndexingFeatures[1].descriptorBindingUpdateUnusedWhilePending ||
+ deviceDescriptorIndexingFeatures[0].descriptorBindingPartiallyBound != deviceDescriptorIndexingFeatures[1].descriptorBindingPartiallyBound ||
+ deviceDescriptorIndexingFeatures[0].descriptorBindingVariableDescriptorCount != deviceDescriptorIndexingFeatures[1].descriptorBindingVariableDescriptorCount ||
+ deviceDescriptorIndexingFeatures[0].runtimeDescriptorArray != deviceDescriptorIndexingFeatures[1].runtimeDescriptorArray ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceDescriptorIndexingFeatures");
+ }
return tcu::TestStatus::pass("Querying device features succeeded");
}
-
tcu::TestStatus deviceProperties2 (Context& context)
{
- const PlatformInterface& vkp = context.getPlatformInterface();
const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
- const Unique<VkInstance> instance (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_get_physical_device_properties2"));
- const InstanceDriver vki (vkp, *instance);
+ const CustomInstance instance (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+ const InstanceDriver& vki (instance.getDriver());
TestLog& log = context.getTestContext().getLog();
VkPhysicalDeviceProperties coreProperties;
VkPhysicalDeviceProperties2 extProperties;
@@ -2868,142 +4264,238 @@
const int count = 2u;
- bool khr_external_memory_capabilities = true;
- bool khr_multiview = true;
- bool khr_maintenance2 = true;
- bool khr_maintenance3 = true;
- bool apiVersionSmallerThen_1_1 = (getPhysicalDeviceProperties(vki, physicalDevice).apiVersion < VK_API_VERSION_1_1);
- if (apiVersionSmallerThen_1_1)
- {
- vector<VkExtensionProperties> properties = enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
- khr_external_memory_capabilities = checkExtension(properties,"VK_KHR_external_memory_capabilities");
- khr_multiview = checkExtension(properties,"VK_KHR_multiview");
- khr_maintenance2 = checkExtension(properties,"VK_KHR_maintenance2");
- khr_maintenance3 = checkExtension(properties,"VK_KHR_maintenance3");
- }
+ vector<VkExtensionProperties> properties = enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
+ const bool khr_external_fence_capabilities = checkExtension(properties, "VK_KHR_external_fence_capabilities") || context.contextSupports(vk::ApiVersion(1, 1, 0));
+ const bool khr_external_memory_capabilities = checkExtension(properties, "VK_KHR_external_memory_capabilities") || context.contextSupports(vk::ApiVersion(1, 1, 0));
+ const bool khr_external_semaphore_capabilities = checkExtension(properties, "VK_KHR_external_semaphore_capabilities") || context.contextSupports(vk::ApiVersion(1, 1, 0));
+ const bool khr_multiview = checkExtension(properties, "VK_KHR_multiview") || context.contextSupports(vk::ApiVersion(1, 1, 0));
+ const bool khr_device_protected_memory = context.contextSupports(vk::ApiVersion(1, 1, 0));
+ const bool khr_device_subgroup = context.contextSupports(vk::ApiVersion(1, 1, 0));
+ const bool khr_maintenance2 = checkExtension(properties, "VK_KHR_maintenance2") || context.contextSupports(vk::ApiVersion(1, 1, 0));
+ const bool khr_maintenance3 = checkExtension(properties, "VK_KHR_maintenance3") || context.contextSupports(vk::ApiVersion(1, 1, 0));
+ const bool khr_depth_stencil_resolve = checkExtension(properties, "VK_KHR_depth_stencil_resolve") || context.contextSupports(vk::ApiVersion(1, 2, 0));
+ const bool khr_driver_properties = checkExtension(properties, "VK_KHR_driver_properties") || context.contextSupports(vk::ApiVersion(1, 2, 0));
+ const bool khr_shader_float_controls = checkExtension(properties, "VK_KHR_shader_float_controls") || context.contextSupports(vk::ApiVersion(1, 2, 0));
+ const bool khr_descriptor_indexing = checkExtension(properties, "VK_EXT_descriptor_indexing") || context.contextSupports(vk::ApiVersion(1, 2, 0));
+ const bool khr_sampler_filter_minmax = checkExtension(properties, "VK_EXT_sampler_filter_minmax") || context.contextSupports(vk::ApiVersion(1, 2, 0));
- VkPhysicalDeviceIDProperties IDProperties[count];
- VkPhysicalDeviceMaintenance3Properties maintenance3Properties[count];
- VkPhysicalDeviceMultiviewProperties multiviewProperties[count];
- VkPhysicalDevicePointClippingProperties pointClippingProperties[count];
- VkPhysicalDeviceProtectedMemoryProperties protectedMemoryPropertiesKHR[count];
- VkPhysicalDeviceSubgroupProperties subgroupProperties[count];
+ VkPhysicalDeviceIDProperties idProperties[count];
+ VkPhysicalDeviceMultiviewProperties multiviewProperties[count];
+ VkPhysicalDeviceProtectedMemoryProperties protectedMemoryPropertiesKHR[count];
+ VkPhysicalDeviceSubgroupProperties subgroupProperties[count];
+ VkPhysicalDevicePointClippingProperties pointClippingProperties[count];
+ VkPhysicalDeviceMaintenance3Properties maintenance3Properties[count];
+ VkPhysicalDeviceDepthStencilResolveProperties depthStencilResolveProperties[count];
+ VkPhysicalDeviceDriverProperties driverProperties[count];
+ VkPhysicalDeviceFloatControlsProperties floatControlsProperties[count];
+ VkPhysicalDeviceDescriptorIndexingProperties descriptorIndexingProperties[count];
+ VkPhysicalDeviceSamplerFilterMinmaxProperties samplerFilterMinmaxProperties[count];
for (int ndx = 0; ndx < count; ++ndx)
{
- deMemset(&IDProperties[ndx], 0xFF*ndx, sizeof(VkPhysicalDeviceIDProperties ));
- deMemset(&maintenance3Properties[ndx], 0xFF*ndx, sizeof(VkPhysicalDeviceMaintenance3Properties ));
- deMemset(&multiviewProperties[ndx], 0xFF*ndx, sizeof(VkPhysicalDeviceMultiviewProperties ));
- deMemset(&pointClippingProperties[ndx], 0xFF*ndx, sizeof(VkPhysicalDevicePointClippingProperties ));
- deMemset(&protectedMemoryPropertiesKHR[ndx], 0xFF*ndx, sizeof(VkPhysicalDeviceProtectedMemoryProperties ));
- deMemset(&subgroupProperties[ndx], 0xFF*ndx, sizeof(VkPhysicalDeviceSubgroupProperties ));
+ deMemset(&idProperties[ndx], 0xFF*ndx, sizeof(VkPhysicalDeviceIDProperties ));
+ deMemset(&multiviewProperties[ndx], 0xFF*ndx, sizeof(VkPhysicalDeviceMultiviewProperties ));
+ deMemset(&protectedMemoryPropertiesKHR[ndx], 0xFF*ndx, sizeof(VkPhysicalDeviceProtectedMemoryProperties ));
+ deMemset(&subgroupProperties[ndx], 0xFF*ndx, sizeof(VkPhysicalDeviceSubgroupProperties ));
+ deMemset(&pointClippingProperties[ndx], 0xFF*ndx, sizeof(VkPhysicalDevicePointClippingProperties ));
+ deMemset(&maintenance3Properties[ndx], 0xFF*ndx, sizeof(VkPhysicalDeviceMaintenance3Properties ));
+ deMemset(&depthStencilResolveProperties[ndx], 0xFF*ndx, sizeof(VkPhysicalDeviceDepthStencilResolveProperties ));
+ deMemset(&driverProperties[ndx], 0xFF*ndx, sizeof(VkPhysicalDeviceDriverProperties ));
+ deMemset(&floatControlsProperties[ndx], 0xFF*ndx, sizeof(VkPhysicalDeviceFloatControlsProperties ));
+ deMemset(&descriptorIndexingProperties[ndx], 0xFF*ndx, sizeof(VkPhysicalDeviceDescriptorIndexingProperties ));
+ deMemset(&samplerFilterMinmaxProperties[ndx], 0xFF*ndx, sizeof(VkPhysicalDeviceSamplerFilterMinmaxProperties ));
- IDProperties[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES;
- IDProperties[ndx].pNext = &maintenance3Properties[ndx];
+ idProperties[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES;
+ idProperties[ndx].pNext = &multiviewProperties[ndx];
- maintenance3Properties[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES;
- maintenance3Properties[ndx].pNext = &multiviewProperties[ndx];
+ multiviewProperties[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES;
+ multiviewProperties[ndx].pNext = &protectedMemoryPropertiesKHR[ndx];
- multiviewProperties[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES;
- multiviewProperties[ndx].pNext = &pointClippingProperties[ndx];
+ protectedMemoryPropertiesKHR[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES;
+ protectedMemoryPropertiesKHR[ndx].pNext = &subgroupProperties[ndx];
- pointClippingProperties[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES;
- pointClippingProperties[ndx].pNext = &protectedMemoryPropertiesKHR[ndx];
+ subgroupProperties[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
+ subgroupProperties[ndx].pNext = &pointClippingProperties[ndx];
- protectedMemoryPropertiesKHR[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES;
- protectedMemoryPropertiesKHR[ndx].pNext = &subgroupProperties[ndx];
+ pointClippingProperties[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES;
+ pointClippingProperties[ndx].pNext = &maintenance3Properties[ndx];
- subgroupProperties[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
- subgroupProperties[ndx].pNext = DE_NULL;
+ maintenance3Properties[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES;
+ maintenance3Properties[ndx].pNext = &depthStencilResolveProperties[ndx];
- extProperties.pNext = &IDProperties[ndx];
+ depthStencilResolveProperties[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES;
+ depthStencilResolveProperties[ndx].pNext = &driverProperties[ndx];
+
+ driverProperties[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES;
+ driverProperties[ndx].pNext = &floatControlsProperties[ndx];
+
+ floatControlsProperties[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR;
+ floatControlsProperties[ndx].pNext = &descriptorIndexingProperties[ndx];
+
+ descriptorIndexingProperties[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES;
+ descriptorIndexingProperties[ndx].pNext = &samplerFilterMinmaxProperties[ndx];
+
+ samplerFilterMinmaxProperties[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES;
+ samplerFilterMinmaxProperties[ndx].pNext = DE_NULL;
+
+ extProperties.pNext = &idProperties[ndx];
vki.getPhysicalDeviceProperties2(physicalDevice, &extProperties);
-
- IDProperties[ndx].pNext = DE_NULL;
- maintenance3Properties[ndx].pNext = DE_NULL;
- multiviewProperties[ndx].pNext = DE_NULL;
- pointClippingProperties[ndx].pNext = DE_NULL;
- protectedMemoryPropertiesKHR[ndx].pNext = DE_NULL;
- subgroupProperties[ndx].pNext = DE_NULL;
}
- if (khr_external_memory_capabilities)
+ if ( khr_external_fence_capabilities || khr_external_memory_capabilities || khr_external_semaphore_capabilities )
+ log << TestLog::Message << idProperties[0] << TestLog::EndMessage;
+ if (khr_multiview)
+ log << TestLog::Message << multiviewProperties[0] << TestLog::EndMessage;
+ if (khr_device_protected_memory)
+ log << TestLog::Message << protectedMemoryPropertiesKHR[0] << TestLog::EndMessage;
+ if (khr_device_subgroup)
+ log << TestLog::Message << subgroupProperties[0] << TestLog::EndMessage;
+ if (khr_maintenance2)
+ log << TestLog::Message << pointClippingProperties[0] << TestLog::EndMessage;
+ if (khr_maintenance3)
+ log << TestLog::Message << maintenance3Properties[0] << TestLog::EndMessage;
+ if (khr_depth_stencil_resolve)
+ log << TestLog::Message << depthStencilResolveProperties[0] << TestLog::EndMessage;
+ if (khr_driver_properties)
+ log << TestLog::Message << driverProperties[0] << TestLog::EndMessage;
+ if (khr_shader_float_controls)
+ log << TestLog::Message << floatControlsProperties[0] << TestLog::EndMessage;
+ if (khr_descriptor_indexing)
+ log << TestLog::Message << descriptorIndexingProperties[0] << TestLog::EndMessage;
+ if (khr_sampler_filter_minmax)
+ log << TestLog::Message << samplerFilterMinmaxProperties[0] << TestLog::EndMessage;
+
+ if ( khr_external_fence_capabilities || khr_external_memory_capabilities || khr_external_semaphore_capabilities )
{
- if ((deMemCmp(IDProperties[0].deviceUUID, IDProperties[1].deviceUUID, VK_UUID_SIZE) != 0) ||
- (deMemCmp(IDProperties[0].driverUUID, IDProperties[1].driverUUID, VK_UUID_SIZE) != 0) ||
- (IDProperties[0].deviceLUIDValid != IDProperties[1].deviceLUIDValid))
+ if ((deMemCmp(idProperties[0].deviceUUID, idProperties[1].deviceUUID, VK_UUID_SIZE) != 0) ||
+ (deMemCmp(idProperties[0].driverUUID, idProperties[1].driverUUID, VK_UUID_SIZE) != 0) ||
+ (idProperties[0].deviceLUIDValid != idProperties[1].deviceLUIDValid))
{
TCU_FAIL("Mismatch between VkPhysicalDeviceIDProperties");
}
- else if (IDProperties[0].deviceLUIDValid)
+ else if (idProperties[0].deviceLUIDValid)
{
// If deviceLUIDValid is VK_FALSE, the contents of deviceLUID and deviceNodeMask are undefined
// so thay can only be compared when deviceLUIDValid is VK_TRUE.
- if ((deMemCmp(IDProperties[0].deviceLUID, IDProperties[1].deviceLUID, VK_UUID_SIZE) != 0) ||
- (IDProperties[0].deviceNodeMask != IDProperties[1].deviceNodeMask))
+ if ((deMemCmp(idProperties[0].deviceLUID, idProperties[1].deviceLUID, VK_UUID_SIZE) != 0) ||
+ (idProperties[0].deviceNodeMask != idProperties[1].deviceNodeMask))
{
TCU_FAIL("Mismatch between VkPhysicalDeviceIDProperties");
}
}
}
- if (khr_maintenance3 &&
- ((maintenance3Properties[0].maxPerSetDescriptors != maintenance3Properties[1].maxPerSetDescriptors) ||
- (maintenance3Properties[0].maxMemoryAllocationSize != maintenance3Properties[1].maxMemoryAllocationSize))
- )
- {
- TCU_FAIL("Mismatch between VkPhysicalDeviceMaintenance3Properties");
- }
if (khr_multiview &&
- ((multiviewProperties[0].maxMultiviewViewCount != multiviewProperties[1].maxMultiviewViewCount) ||
- (multiviewProperties[0].maxMultiviewInstanceIndex != multiviewProperties[1].maxMultiviewInstanceIndex))
- )
+ (multiviewProperties[0].maxMultiviewViewCount != multiviewProperties[1].maxMultiviewViewCount ||
+ multiviewProperties[0].maxMultiviewInstanceIndex != multiviewProperties[1].maxMultiviewInstanceIndex))
{
TCU_FAIL("Mismatch between VkPhysicalDeviceMultiviewProperties");
}
+ if (khr_device_protected_memory &&
+ (protectedMemoryPropertiesKHR[0].protectedNoFault != protectedMemoryPropertiesKHR[1].protectedNoFault))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceProtectedMemoryProperties");
+ }
+ if (khr_device_subgroup &&
+ (subgroupProperties[0].subgroupSize != subgroupProperties[1].subgroupSize ||
+ subgroupProperties[0].supportedStages != subgroupProperties[1].supportedStages ||
+ subgroupProperties[0].supportedOperations != subgroupProperties[1].supportedOperations ||
+ subgroupProperties[0].quadOperationsInAllStages != subgroupProperties[1].quadOperationsInAllStages ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceSubgroupProperties");
+ }
if (khr_maintenance2 &&
- (pointClippingProperties[0].pointClippingBehavior != pointClippingProperties[1].pointClippingBehavior))
+ (pointClippingProperties[0].pointClippingBehavior != pointClippingProperties[1].pointClippingBehavior))
{
TCU_FAIL("Mismatch between VkPhysicalDevicePointClippingProperties");
}
- if (!apiVersionSmallerThen_1_1)
+ if (khr_maintenance3 &&
+ (maintenance3Properties[0].maxPerSetDescriptors != maintenance3Properties[1].maxPerSetDescriptors ||
+ maintenance3Properties[0].maxMemoryAllocationSize != maintenance3Properties[1].maxMemoryAllocationSize))
{
- if(protectedMemoryPropertiesKHR[0].protectedNoFault != protectedMemoryPropertiesKHR[1].protectedNoFault)
- {
- TCU_FAIL("Mismatch between VkPhysicalDeviceProtectedMemoryProperties");
- }
- if ((subgroupProperties[0].subgroupSize != subgroupProperties[1].subgroupSize) ||
- (subgroupProperties[0].supportedStages != subgroupProperties[1].supportedStages) ||
- (subgroupProperties[0].supportedOperations != subgroupProperties[1].supportedOperations) ||
- (subgroupProperties[0].quadOperationsInAllStages != subgroupProperties[1].quadOperationsInAllStages))
- {
- TCU_FAIL("Mismatch between VkPhysicalDeviceSubgroupProperties");
- }
+ TCU_FAIL("Mismatch between VkPhysicalDeviceMaintenance3Properties");
+ }
+ if (khr_depth_stencil_resolve &&
+ (depthStencilResolveProperties[0].supportedDepthResolveModes != depthStencilResolveProperties[1].supportedDepthResolveModes ||
+ depthStencilResolveProperties[0].supportedStencilResolveModes != depthStencilResolveProperties[1].supportedStencilResolveModes ||
+ depthStencilResolveProperties[0].independentResolveNone != depthStencilResolveProperties[1].independentResolveNone ||
+ depthStencilResolveProperties[0].independentResolve != depthStencilResolveProperties[1].independentResolve))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceDepthStencilResolveProperties");
+ }
+ if (khr_driver_properties &&
+ (driverProperties[0].driverID != driverProperties[1].driverID ||
+ strncmp(driverProperties[0].driverName, driverProperties[1].driverName, VK_MAX_DRIVER_NAME_SIZE) != 0 ||
+ strncmp(driverProperties[0].driverInfo, driverProperties[1].driverInfo, VK_MAX_DRIVER_INFO_SIZE) != 0 ||
+ driverProperties[0].conformanceVersion.major != driverProperties[1].conformanceVersion.major ||
+ driverProperties[0].conformanceVersion.minor != driverProperties[1].conformanceVersion.minor ||
+ driverProperties[0].conformanceVersion.subminor != driverProperties[1].conformanceVersion.subminor ||
+ driverProperties[0].conformanceVersion.patch != driverProperties[1].conformanceVersion.patch))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceDriverProperties");
+ }
+ if (khr_shader_float_controls &&
+ (floatControlsProperties[0].denormBehaviorIndependence != floatControlsProperties[1].denormBehaviorIndependence ||
+ floatControlsProperties[0].roundingModeIndependence != floatControlsProperties[1].roundingModeIndependence ||
+ floatControlsProperties[0].shaderSignedZeroInfNanPreserveFloat16 != floatControlsProperties[1].shaderSignedZeroInfNanPreserveFloat16 ||
+ floatControlsProperties[0].shaderSignedZeroInfNanPreserveFloat32 != floatControlsProperties[1].shaderSignedZeroInfNanPreserveFloat32 ||
+ floatControlsProperties[0].shaderSignedZeroInfNanPreserveFloat64 != floatControlsProperties[1].shaderSignedZeroInfNanPreserveFloat64 ||
+ floatControlsProperties[0].shaderDenormPreserveFloat16 != floatControlsProperties[1].shaderDenormPreserveFloat16 ||
+ floatControlsProperties[0].shaderDenormPreserveFloat32 != floatControlsProperties[1].shaderDenormPreserveFloat32 ||
+ floatControlsProperties[0].shaderDenormPreserveFloat64 != floatControlsProperties[1].shaderDenormPreserveFloat64 ||
+ floatControlsProperties[0].shaderDenormFlushToZeroFloat16 != floatControlsProperties[1].shaderDenormFlushToZeroFloat16 ||
+ floatControlsProperties[0].shaderDenormFlushToZeroFloat32 != floatControlsProperties[1].shaderDenormFlushToZeroFloat32 ||
+ floatControlsProperties[0].shaderDenormFlushToZeroFloat64 != floatControlsProperties[1].shaderDenormFlushToZeroFloat64 ||
+ floatControlsProperties[0].shaderRoundingModeRTEFloat16 != floatControlsProperties[1].shaderRoundingModeRTEFloat16 ||
+ floatControlsProperties[0].shaderRoundingModeRTEFloat32 != floatControlsProperties[1].shaderRoundingModeRTEFloat32 ||
+ floatControlsProperties[0].shaderRoundingModeRTEFloat64 != floatControlsProperties[1].shaderRoundingModeRTEFloat64 ||
+ floatControlsProperties[0].shaderRoundingModeRTZFloat16 != floatControlsProperties[1].shaderRoundingModeRTZFloat16 ||
+ floatControlsProperties[0].shaderRoundingModeRTZFloat32 != floatControlsProperties[1].shaderRoundingModeRTZFloat32 ||
+ floatControlsProperties[0].shaderRoundingModeRTZFloat64 != floatControlsProperties[1].shaderRoundingModeRTZFloat64 ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceFloatControlsProperties");
+ }
+ if (khr_descriptor_indexing &&
+ (descriptorIndexingProperties[0].maxUpdateAfterBindDescriptorsInAllPools != descriptorIndexingProperties[1].maxUpdateAfterBindDescriptorsInAllPools ||
+ descriptorIndexingProperties[0].shaderUniformBufferArrayNonUniformIndexingNative != descriptorIndexingProperties[1].shaderUniformBufferArrayNonUniformIndexingNative ||
+ descriptorIndexingProperties[0].shaderSampledImageArrayNonUniformIndexingNative != descriptorIndexingProperties[1].shaderSampledImageArrayNonUniformIndexingNative ||
+ descriptorIndexingProperties[0].shaderStorageBufferArrayNonUniformIndexingNative != descriptorIndexingProperties[1].shaderStorageBufferArrayNonUniformIndexingNative ||
+ descriptorIndexingProperties[0].shaderStorageImageArrayNonUniformIndexingNative != descriptorIndexingProperties[1].shaderStorageImageArrayNonUniformIndexingNative ||
+ descriptorIndexingProperties[0].shaderInputAttachmentArrayNonUniformIndexingNative != descriptorIndexingProperties[1].shaderInputAttachmentArrayNonUniformIndexingNative ||
+ descriptorIndexingProperties[0].robustBufferAccessUpdateAfterBind != descriptorIndexingProperties[1].robustBufferAccessUpdateAfterBind ||
+ descriptorIndexingProperties[0].quadDivergentImplicitLod != descriptorIndexingProperties[1].quadDivergentImplicitLod ||
+ descriptorIndexingProperties[0].maxPerStageDescriptorUpdateAfterBindSamplers != descriptorIndexingProperties[1].maxPerStageDescriptorUpdateAfterBindSamplers ||
+ descriptorIndexingProperties[0].maxPerStageDescriptorUpdateAfterBindUniformBuffers != descriptorIndexingProperties[1].maxPerStageDescriptorUpdateAfterBindUniformBuffers ||
+ descriptorIndexingProperties[0].maxPerStageDescriptorUpdateAfterBindStorageBuffers != descriptorIndexingProperties[1].maxPerStageDescriptorUpdateAfterBindStorageBuffers ||
+ descriptorIndexingProperties[0].maxPerStageDescriptorUpdateAfterBindSampledImages != descriptorIndexingProperties[1].maxPerStageDescriptorUpdateAfterBindSampledImages ||
+ descriptorIndexingProperties[0].maxPerStageDescriptorUpdateAfterBindStorageImages != descriptorIndexingProperties[1].maxPerStageDescriptorUpdateAfterBindStorageImages ||
+ descriptorIndexingProperties[0].maxPerStageDescriptorUpdateAfterBindInputAttachments != descriptorIndexingProperties[1].maxPerStageDescriptorUpdateAfterBindInputAttachments ||
+ descriptorIndexingProperties[0].maxPerStageUpdateAfterBindResources != descriptorIndexingProperties[1].maxPerStageUpdateAfterBindResources ||
+ descriptorIndexingProperties[0].maxDescriptorSetUpdateAfterBindSamplers != descriptorIndexingProperties[1].maxDescriptorSetUpdateAfterBindSamplers ||
+ descriptorIndexingProperties[0].maxDescriptorSetUpdateAfterBindUniformBuffers != descriptorIndexingProperties[1].maxDescriptorSetUpdateAfterBindUniformBuffers ||
+ descriptorIndexingProperties[0].maxDescriptorSetUpdateAfterBindUniformBuffersDynamic != descriptorIndexingProperties[1].maxDescriptorSetUpdateAfterBindUniformBuffersDynamic ||
+ descriptorIndexingProperties[0].maxDescriptorSetUpdateAfterBindStorageBuffers != descriptorIndexingProperties[1].maxDescriptorSetUpdateAfterBindStorageBuffers ||
+ descriptorIndexingProperties[0].maxDescriptorSetUpdateAfterBindStorageBuffersDynamic != descriptorIndexingProperties[1].maxDescriptorSetUpdateAfterBindStorageBuffersDynamic ||
+ descriptorIndexingProperties[0].maxDescriptorSetUpdateAfterBindSampledImages != descriptorIndexingProperties[1].maxDescriptorSetUpdateAfterBindSampledImages ||
+ descriptorIndexingProperties[0].maxDescriptorSetUpdateAfterBindStorageImages != descriptorIndexingProperties[1].maxDescriptorSetUpdateAfterBindStorageImages ||
+ descriptorIndexingProperties[0].maxDescriptorSetUpdateAfterBindInputAttachments != descriptorIndexingProperties[1].maxDescriptorSetUpdateAfterBindInputAttachments ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceDescriptorIndexingProperties");
+ }
+ if (khr_sampler_filter_minmax &&
+ (samplerFilterMinmaxProperties[0].filterMinmaxSingleComponentFormats != samplerFilterMinmaxProperties[1].filterMinmaxSingleComponentFormats ||
+ samplerFilterMinmaxProperties[0].filterMinmaxImageComponentMapping != samplerFilterMinmaxProperties[1].filterMinmaxImageComponentMapping))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceSamplerFilterMinmaxProperties");
}
- if (khr_external_memory_capabilities)
- log << TestLog::Message << IDProperties[0] << TestLog::EndMessage;
- if (khr_maintenance3)
- log << TestLog::Message << maintenance3Properties[0] << TestLog::EndMessage;
- if (khr_multiview)
- log << TestLog::Message << multiviewProperties[0] << TestLog::EndMessage;
- if (khr_maintenance2)
- log << TestLog::Message << pointClippingProperties[0] << TestLog::EndMessage;
- if (!apiVersionSmallerThen_1_1)
- {
- log << TestLog::Message << protectedMemoryPropertiesKHR[0] << TestLog::EndMessage
- << TestLog::Message << subgroupProperties[0] << TestLog::EndMessage;
- }
-
- const vector<VkExtensionProperties> extensions = enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
-
- if (isExtensionSupported(extensions, RequiredExtension("VK_KHR_push_descriptor")))
+ if (isExtensionSupported(properties, RequiredExtension("VK_KHR_push_descriptor")))
{
VkPhysicalDevicePushDescriptorPropertiesKHR pushDescriptorProperties[count];
for (int ndx = 0; ndx < count; ++ndx)
{
- deMemset(&pushDescriptorProperties[ndx], 0, sizeof(VkPhysicalDevicePushDescriptorPropertiesKHR));
+ deMemset(&pushDescriptorProperties[ndx], 0xFF * ndx, sizeof(VkPhysicalDevicePushDescriptorPropertiesKHR));
pushDescriptorProperties[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR;
pushDescriptorProperties[ndx].pNext = DE_NULL;
@@ -3015,65 +4507,42 @@
pushDescriptorProperties[ndx].pNext = DE_NULL;
}
- if (deMemCmp(&pushDescriptorProperties[0], &pushDescriptorProperties[1], sizeof(VkPhysicalDevicePushDescriptorPropertiesKHR)) != 0)
- {
- TCU_FAIL("Mismatch in vkGetPhysicalDeviceProperties2 in VkPhysicalDevicePushDescriptorPropertiesKHR ");
- }
-
log << TestLog::Message << pushDescriptorProperties[0] << TestLog::EndMessage;
+ if ( pushDescriptorProperties[0].maxPushDescriptors != pushDescriptorProperties[1].maxPushDescriptors )
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDevicePushDescriptorPropertiesKHR ");
+ }
if (pushDescriptorProperties[0].maxPushDescriptors < 32)
{
TCU_FAIL("VkPhysicalDevicePushDescriptorPropertiesKHR.maxPushDescriptors must be at least 32");
}
}
- if (isExtensionSupported(extensions, RequiredExtension("VK_KHR_shader_float_controls")))
+
+ if (isExtensionSupported(properties, RequiredExtension("VK_KHR_performance_query")))
{
- VkPhysicalDeviceFloatControlsPropertiesKHR floatControlsProperties[count];
+ VkPhysicalDevicePerformanceQueryPropertiesKHR performanceQueryProperties[count];
for (int ndx = 0; ndx < count; ++ndx)
{
- deMemset(&floatControlsProperties[ndx], 0xFF, sizeof(VkPhysicalDeviceFloatControlsPropertiesKHR));
- floatControlsProperties[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR;
- floatControlsProperties[ndx].pNext = DE_NULL;
+ deMemset(&performanceQueryProperties[ndx], 0xFF * ndx, sizeof(VkPhysicalDevicePerformanceQueryPropertiesKHR));
+ performanceQueryProperties[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR;
+ performanceQueryProperties[ndx].pNext = DE_NULL;
- extProperties.pNext = &floatControlsProperties[ndx];
+ extProperties.pNext = &performanceQueryProperties[ndx];
vki.getPhysicalDeviceProperties2(physicalDevice, &extProperties);
}
- if (deMemCmp(&floatControlsProperties[0], &floatControlsProperties[1], sizeof(VkPhysicalDeviceFloatControlsPropertiesKHR)) != 0)
- {
- TCU_FAIL("Mismatch in VkPhysicalDeviceFloatControlsPropertiesKHR");
- }
+ log << TestLog::Message << performanceQueryProperties[0] << TestLog::EndMessage;
- log << TestLog::Message << floatControlsProperties[0] << TestLog::EndMessage;
+ if (performanceQueryProperties[0].allowCommandBufferQueryCopies != performanceQueryProperties[0].allowCommandBufferQueryCopies)
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDevicePerformanceQueryPropertiesKHR");
+ }
}
- if (isExtensionSupported(extensions, RequiredExtension("VK_KHR_depth_stencil_resolve")))
- {
- VkPhysicalDeviceDepthStencilResolvePropertiesKHR dsResolveProperties[count];
-
- for (int ndx = 0; ndx < count; ++ndx)
- {
- deMemset(&dsResolveProperties[ndx], 0xFF, sizeof(VkPhysicalDeviceDepthStencilResolvePropertiesKHR));
- dsResolveProperties[ndx].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR;
- dsResolveProperties[ndx].pNext = DE_NULL;
-
- extProperties.pNext = &dsResolveProperties[ndx];
-
- vki.getPhysicalDeviceProperties2(physicalDevice, &extProperties);
- }
-
- if (deMemCmp(&dsResolveProperties[0], &dsResolveProperties[1], sizeof(VkPhysicalDeviceDepthStencilResolvePropertiesKHR)) != 0)
- {
- TCU_FAIL("Mismatch in VkPhysicalDeviceDepthStencilResolvePropertiesKHR");
- }
-
- log << TestLog::Message << dsResolveProperties[0] << TestLog::EndMessage;
- }
-
- if (isExtensionSupported(extensions, RequiredExtension("VK_EXT_pci_bus_info", 2, 2)))
+ if (isExtensionSupported(properties, RequiredExtension("VK_EXT_pci_bus_info", 2, 2)))
{
VkPhysicalDevicePCIBusInfoPropertiesEXT pciBusInfoProperties[count];
@@ -3092,7 +4561,7 @@
//
// [1] https://en.wikipedia.org/wiki/PCI_configuration_space
// [2] PCI Express Base Specification Revision 3.0, section 2.2.4.2.
- deMemset(pciBusInfoProperties + ndx, 0, sizeof(pciBusInfoProperties[ndx]));
+ deMemset(pciBusInfoProperties + ndx, 0xFF * ndx, sizeof(pciBusInfoProperties[ndx]));
pciBusInfoProperties[ndx].pciDomain = DEUINT32_MAX;
pciBusInfoProperties[ndx].pciBus = DEUINT32_MAX;
pciBusInfoProperties[ndx].pciDevice = DEUINT32_MAX;
@@ -3105,13 +4574,15 @@
vki.getPhysicalDeviceProperties2(physicalDevice, &extProperties);
}
- if (deMemCmp(pciBusInfoProperties + 0, pciBusInfoProperties + 1, sizeof(pciBusInfoProperties[0])) != 0)
- {
- TCU_FAIL("Mismatch in VkPhysicalDevicePCIBusInfoPropertiesEXT");
- }
-
log << TestLog::Message << toString(pciBusInfoProperties[0]) << TestLog::EndMessage;
+ if (pciBusInfoProperties[0].pciDomain != pciBusInfoProperties[1].pciDomain ||
+ pciBusInfoProperties[0].pciBus != pciBusInfoProperties[1].pciBus ||
+ pciBusInfoProperties[0].pciDevice != pciBusInfoProperties[1].pciDevice ||
+ pciBusInfoProperties[0].pciFunction != pciBusInfoProperties[1].pciFunction)
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDevicePCIBusInfoPropertiesEXT");
+ }
if (pciBusInfoProperties[0].pciDomain == DEUINT32_MAX ||
pciBusInfoProperties[0].pciBus == DEUINT32_MAX ||
pciBusInfoProperties[0].pciDevice == DEUINT32_MAX ||
@@ -3140,10 +4611,9 @@
tcu::TestStatus deviceFormatProperties2 (Context& context)
{
- const PlatformInterface& vkp = context.getPlatformInterface();
const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
- const Unique<VkInstance> instance (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_get_physical_device_properties2"));
- const InstanceDriver vki (vkp, *instance);
+ const CustomInstance instance (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+ const InstanceDriver& vki (instance.getDriver());
TestLog& log = context.getTestContext().getLog();
for (int formatNdx = 0; formatNdx < VK_CORE_FORMAT_LAST; ++formatNdx)
@@ -3175,10 +4645,9 @@
tcu::TestStatus deviceQueueFamilyProperties2 (Context& context)
{
- const PlatformInterface& vkp = context.getPlatformInterface();
const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
- const Unique<VkInstance> instance (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_get_physical_device_properties2"));
- const InstanceDriver vki (vkp, *instance);
+ const CustomInstance instance (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+ const InstanceDriver& vki (instance.getDriver());
TestLog& log = context.getTestContext().getLog();
deUint32 numCoreQueueFamilies = ~0u;
deUint32 numExtQueueFamilies = ~0u;
@@ -3227,10 +4696,9 @@
tcu::TestStatus deviceMemoryProperties2 (Context& context)
{
- const PlatformInterface& vkp = context.getPlatformInterface();
const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
- const Unique<VkInstance> instance (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_get_physical_device_properties2"));
- const InstanceDriver vki (vkp, *instance);
+ const CustomInstance instance (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+ const InstanceDriver& vki (instance.getDriver());
TestLog& log = context.getTestContext().getLog();
VkPhysicalDeviceMemoryProperties coreProperties;
VkPhysicalDeviceMemoryProperties2 extProperties;
@@ -3255,6 +4723,722 @@
return tcu::TestStatus::pass("Querying device memory properties succeeded");
}
+tcu::TestStatus deviceFeaturesVulkan12 (Context& context)
+{
+ using namespace ValidateQueryBits;
+
+ const QueryMemberTableEntry feature11OffsetTable[] =
+ {
+ // VkPhysicalDevice16BitStorageFeatures
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Features, storageBuffer16BitAccess),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Features, uniformAndStorageBuffer16BitAccess),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Features, storagePushConstant16),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Features, storageInputOutput16),
+
+ // VkPhysicalDeviceMultiviewFeatures
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Features, multiview),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Features, multiviewGeometryShader),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Features, multiviewTessellationShader),
+
+ // VkPhysicalDeviceVariablePointersFeatures
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Features, variablePointersStorageBuffer),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Features, variablePointers),
+
+ // VkPhysicalDeviceProtectedMemoryFeatures
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Features, protectedMemory),
+
+ // VkPhysicalDeviceSamplerYcbcrConversionFeatures
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Features, samplerYcbcrConversion),
+
+ // VkPhysicalDeviceShaderDrawParametersFeatures
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Features, shaderDrawParameters),
+ { 0, 0 }
+ };
+ const QueryMemberTableEntry feature12OffsetTable[] =
+ {
+ // None
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, samplerMirrorClampToEdge),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, drawIndirectCount),
+
+ // VkPhysicalDevice8BitStorageFeatures
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, storageBuffer8BitAccess),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, uniformAndStorageBuffer8BitAccess),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, storagePushConstant8),
+
+ // VkPhysicalDeviceShaderAtomicInt64Features
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, shaderBufferInt64Atomics),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, shaderSharedInt64Atomics),
+
+ // VkPhysicalDeviceShaderFloat16Int8Features
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, shaderFloat16),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, shaderInt8),
+
+ // VkPhysicalDeviceDescriptorIndexingFeatures
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, descriptorIndexing),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, shaderInputAttachmentArrayDynamicIndexing),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, shaderUniformTexelBufferArrayDynamicIndexing),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, shaderStorageTexelBufferArrayDynamicIndexing),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, shaderUniformBufferArrayNonUniformIndexing),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, shaderSampledImageArrayNonUniformIndexing),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, shaderStorageBufferArrayNonUniformIndexing),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, shaderStorageImageArrayNonUniformIndexing),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, shaderInputAttachmentArrayNonUniformIndexing),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, shaderUniformTexelBufferArrayNonUniformIndexing),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, shaderStorageTexelBufferArrayNonUniformIndexing),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, descriptorBindingUniformBufferUpdateAfterBind),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, descriptorBindingSampledImageUpdateAfterBind),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, descriptorBindingStorageImageUpdateAfterBind),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, descriptorBindingStorageBufferUpdateAfterBind),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, descriptorBindingUniformTexelBufferUpdateAfterBind),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, descriptorBindingStorageTexelBufferUpdateAfterBind),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, descriptorBindingUpdateUnusedWhilePending),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, descriptorBindingPartiallyBound),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, descriptorBindingVariableDescriptorCount),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, runtimeDescriptorArray),
+
+ // None
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, samplerFilterMinmax),
+
+ // VkPhysicalDeviceScalarBlockLayoutFeatures
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, scalarBlockLayout),
+
+ // VkPhysicalDeviceImagelessFramebufferFeatures
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, imagelessFramebuffer),
+
+ // VkPhysicalDeviceUniformBufferStandardLayoutFeatures
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, uniformBufferStandardLayout),
+
+ // VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, shaderSubgroupExtendedTypes),
+
+ // VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, separateDepthStencilLayouts),
+
+ // VkPhysicalDeviceHostQueryResetFeatures
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, hostQueryReset),
+
+ // VkPhysicalDeviceTimelineSemaphoreFeatures
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, timelineSemaphore),
+
+ // VkPhysicalDeviceBufferDeviceAddressFeatures
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, bufferDeviceAddress),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, bufferDeviceAddressCaptureReplay),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, bufferDeviceAddressMultiDevice),
+
+ // VkPhysicalDeviceVulkanMemoryModelFeatures
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, vulkanMemoryModel),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, vulkanMemoryModelDeviceScope),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, vulkanMemoryModelAvailabilityVisibilityChains),
+
+ // None
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, shaderOutputViewportIndex),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, shaderOutputLayer),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Features, subgroupBroadcastDynamicId),
+ { 0, 0 }
+ };
+ TestLog& log = context.getTestContext().getLog();
+ const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
+ const CustomInstance instance (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+ const InstanceDriver& vki = instance.getDriver();
+ const deUint32 vulkan11FeaturesBufferSize = sizeof(VkPhysicalDeviceVulkan11Features) + GUARD_SIZE;
+ const deUint32 vulkan12FeaturesBufferSize = sizeof(VkPhysicalDeviceVulkan12Features) + GUARD_SIZE;
+ VkPhysicalDeviceFeatures2 extFeatures;
+ deUint8 buffer11a[vulkan11FeaturesBufferSize];
+ deUint8 buffer11b[vulkan11FeaturesBufferSize];
+ deUint8 buffer12a[vulkan12FeaturesBufferSize];
+ deUint8 buffer12b[vulkan12FeaturesBufferSize];
+ const int count = 2u;
+ VkPhysicalDeviceVulkan11Features* vulkan11Features[count] = { (VkPhysicalDeviceVulkan11Features*)(buffer11a), (VkPhysicalDeviceVulkan11Features*)(buffer11b)};
+ VkPhysicalDeviceVulkan12Features* vulkan12Features[count] = { (VkPhysicalDeviceVulkan12Features*)(buffer12a), (VkPhysicalDeviceVulkan12Features*)(buffer12b)};
+
+ if (!context.contextSupports(vk::ApiVersion(1, 2, 0)))
+ TCU_THROW(NotSupportedError, "At least Vulkan 1.2 required to run test");
+
+ deMemset(buffer11b, GUARD_VALUE, sizeof(buffer11b));
+ deMemset(buffer12a, GUARD_VALUE, sizeof(buffer12a));
+ deMemset(buffer12b, GUARD_VALUE, sizeof(buffer12b));
+ deMemset(buffer11a, GUARD_VALUE, sizeof(buffer11a));
+
+ // Validate all fields initialized
+ for (int ndx = 0; ndx < count; ++ndx)
+ {
+ deMemset(&extFeatures.features, 0x00, sizeof(extFeatures.features));
+ extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
+ extFeatures.pNext = vulkan11Features[ndx];
+
+ deMemset(vulkan11Features[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceVulkan11Features));
+ vulkan11Features[ndx]->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES;
+ vulkan11Features[ndx]->pNext = vulkan12Features[ndx];
+
+ deMemset(vulkan12Features[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceVulkan12Features));
+ vulkan12Features[ndx]->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES;
+ vulkan12Features[ndx]->pNext = DE_NULL;
+
+ vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
+ }
+
+ log << TestLog::Message << *vulkan11Features[0] << TestLog::EndMessage;
+ log << TestLog::Message << *vulkan12Features[0] << TestLog::EndMessage;
+
+ if (!validateStructsWithGuard(feature11OffsetTable, vulkan11Features, GUARD_VALUE, GUARD_SIZE))
+ {
+ log << TestLog::Message << "deviceFeatures - VkPhysicalDeviceVulkan11Features initialization failure" << TestLog::EndMessage;
+
+ return tcu::TestStatus::fail("VkPhysicalDeviceVulkan11Features initialization failure");
+ }
+
+ if (!validateStructsWithGuard(feature12OffsetTable, vulkan12Features, GUARD_VALUE, GUARD_SIZE))
+ {
+ log << TestLog::Message << "deviceFeatures - VkPhysicalDeviceVulkan12Features initialization failure" << TestLog::EndMessage;
+
+ return tcu::TestStatus::fail("VkPhysicalDeviceVulkan12Features initialization failure");
+ }
+
+ return tcu::TestStatus::pass("Querying Vulkan 1.2 device features succeeded");
+}
+
+tcu::TestStatus devicePropertiesVulkan12 (Context& context)
+{
+ using namespace ValidateQueryBits;
+
+ const QueryMemberTableEntry properties11OffsetTable[] =
+ {
+ // VkPhysicalDeviceIDProperties
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Properties, deviceUUID),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Properties, driverUUID),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Properties, deviceLUID),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Properties, deviceNodeMask),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Properties, deviceLUIDValid),
+
+ // VkPhysicalDeviceSubgroupProperties
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Properties, subgroupSize),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Properties, subgroupSupportedStages),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Properties, subgroupSupportedOperations),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Properties, subgroupQuadOperationsInAllStages),
+
+ // VkPhysicalDevicePointClippingProperties
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Properties, pointClippingBehavior),
+
+ // VkPhysicalDeviceMultiviewProperties
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Properties, maxMultiviewViewCount),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Properties, maxMultiviewInstanceIndex),
+
+ // VkPhysicalDeviceProtectedMemoryProperties
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Properties, protectedNoFault),
+
+ // VkPhysicalDeviceMaintenance3Properties
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Properties, maxPerSetDescriptors),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan11Properties, maxMemoryAllocationSize),
+ { 0, 0 }
+ };
+ const QueryMemberTableEntry properties12OffsetTable[] =
+ {
+ // VkPhysicalDeviceDriverProperties
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, driverID),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, conformanceVersion),
+
+ // VkPhysicalDeviceFloatControlsProperties
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, denormBehaviorIndependence),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, roundingModeIndependence),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, shaderSignedZeroInfNanPreserveFloat16),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, shaderSignedZeroInfNanPreserveFloat32),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, shaderSignedZeroInfNanPreserveFloat64),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, shaderDenormPreserveFloat16),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, shaderDenormPreserveFloat32),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, shaderDenormPreserveFloat64),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, shaderDenormFlushToZeroFloat16),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, shaderDenormFlushToZeroFloat32),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, shaderDenormFlushToZeroFloat64),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, shaderRoundingModeRTEFloat16),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, shaderRoundingModeRTEFloat32),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, shaderRoundingModeRTEFloat64),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, shaderRoundingModeRTZFloat16),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, shaderRoundingModeRTZFloat32),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, shaderRoundingModeRTZFloat64),
+
+ // VkPhysicalDeviceDescriptorIndexingProperties
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, maxUpdateAfterBindDescriptorsInAllPools),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, shaderUniformBufferArrayNonUniformIndexingNative),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, shaderSampledImageArrayNonUniformIndexingNative),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, shaderStorageBufferArrayNonUniformIndexingNative),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, shaderStorageImageArrayNonUniformIndexingNative),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, shaderInputAttachmentArrayNonUniformIndexingNative),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, robustBufferAccessUpdateAfterBind),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, quadDivergentImplicitLod),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, maxPerStageDescriptorUpdateAfterBindSamplers),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, maxPerStageDescriptorUpdateAfterBindUniformBuffers),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, maxPerStageDescriptorUpdateAfterBindStorageBuffers),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, maxPerStageDescriptorUpdateAfterBindSampledImages),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, maxPerStageDescriptorUpdateAfterBindStorageImages),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, maxPerStageDescriptorUpdateAfterBindInputAttachments),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, maxPerStageUpdateAfterBindResources),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, maxDescriptorSetUpdateAfterBindSamplers),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, maxDescriptorSetUpdateAfterBindUniformBuffers),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, maxDescriptorSetUpdateAfterBindUniformBuffersDynamic),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, maxDescriptorSetUpdateAfterBindStorageBuffers),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, maxDescriptorSetUpdateAfterBindStorageBuffersDynamic),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, maxDescriptorSetUpdateAfterBindSampledImages),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, maxDescriptorSetUpdateAfterBindStorageImages),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, maxDescriptorSetUpdateAfterBindInputAttachments),
+
+ // VkPhysicalDeviceDepthStencilResolveProperties
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, supportedDepthResolveModes),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, supportedStencilResolveModes),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, independentResolveNone),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, independentResolve),
+
+ // VkPhysicalDeviceSamplerFilterMinmaxProperties
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, filterMinmaxSingleComponentFormats),
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, filterMinmaxImageComponentMapping),
+
+ // VkPhysicalDeviceTimelineSemaphoreProperties
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, maxTimelineSemaphoreValueDifference),
+
+ // None
+ OFFSET_TABLE_ENTRY(VkPhysicalDeviceVulkan12Properties, framebufferIntegerColorSampleCounts),
+ { 0, 0 }
+ };
+ TestLog& log = context.getTestContext().getLog();
+ const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
+ const CustomInstance instance (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+ const InstanceDriver& vki = instance.getDriver();
+ const deUint32 vulkan11PropertiesBufferSize = sizeof(VkPhysicalDeviceVulkan11Properties) + GUARD_SIZE;
+ const deUint32 vulkan12PropertiesBufferSize = sizeof(VkPhysicalDeviceVulkan12Properties) + GUARD_SIZE;
+ VkPhysicalDeviceProperties2 extProperties;
+ deUint8 buffer11a[vulkan11PropertiesBufferSize];
+ deUint8 buffer11b[vulkan11PropertiesBufferSize];
+ deUint8 buffer12a[vulkan12PropertiesBufferSize];
+ deUint8 buffer12b[vulkan12PropertiesBufferSize];
+ const int count = 2u;
+ VkPhysicalDeviceVulkan11Properties* vulkan11Properties[count] = { (VkPhysicalDeviceVulkan11Properties*)(buffer11a), (VkPhysicalDeviceVulkan11Properties*)(buffer11b)};
+ VkPhysicalDeviceVulkan12Properties* vulkan12Properties[count] = { (VkPhysicalDeviceVulkan12Properties*)(buffer12a), (VkPhysicalDeviceVulkan12Properties*)(buffer12b)};
+
+ if (!context.contextSupports(vk::ApiVersion(1, 2, 0)))
+ TCU_THROW(NotSupportedError, "At least Vulkan 1.2 required to run test");
+
+ deMemset(buffer11a, GUARD_VALUE, sizeof(buffer11a));
+ deMemset(buffer11b, GUARD_VALUE, sizeof(buffer11b));
+ deMemset(buffer12a, GUARD_VALUE, sizeof(buffer12a));
+ deMemset(buffer12b, GUARD_VALUE, sizeof(buffer12b));
+
+ for (int ndx = 0; ndx < count; ++ndx)
+ {
+ deMemset(&extProperties.properties, 0x00, sizeof(extProperties.properties));
+ extProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
+ extProperties.pNext = vulkan11Properties[ndx];
+
+ deMemset(vulkan11Properties[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceVulkan11Properties));
+ vulkan11Properties[ndx]->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES;
+ vulkan11Properties[ndx]->pNext = vulkan12Properties[ndx];
+
+ deMemset(vulkan12Properties[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceVulkan12Properties));
+ vulkan12Properties[ndx]->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES;
+ vulkan12Properties[ndx]->pNext = DE_NULL;
+
+ vki.getPhysicalDeviceProperties2(physicalDevice, &extProperties);
+ }
+
+ log << TestLog::Message << *vulkan11Properties[0] << TestLog::EndMessage;
+ log << TestLog::Message << *vulkan12Properties[0] << TestLog::EndMessage;
+
+ if (!validateStructsWithGuard(properties11OffsetTable, vulkan11Properties, GUARD_VALUE, GUARD_SIZE))
+ {
+ log << TestLog::Message << "deviceProperties - VkPhysicalDeviceVulkan11Properties initialization failure" << TestLog::EndMessage;
+
+ return tcu::TestStatus::fail("VkPhysicalDeviceVulkan11Properties initialization failure");
+ }
+
+ if (!validateStructsWithGuard(properties12OffsetTable, vulkan12Properties, GUARD_VALUE, GUARD_SIZE) ||
+ strncmp(vulkan12Properties[0]->driverName, vulkan12Properties[1]->driverName, VK_MAX_DRIVER_NAME_SIZE) != 0 ||
+ strncmp(vulkan12Properties[0]->driverInfo, vulkan12Properties[1]->driverInfo, VK_MAX_DRIVER_INFO_SIZE) != 0 )
+ {
+ log << TestLog::Message << "deviceProperties - VkPhysicalDeviceVulkan12Properties initialization failure" << TestLog::EndMessage;
+
+ return tcu::TestStatus::fail("VkPhysicalDeviceVulkan12Properties initialization failure");
+ }
+
+ return tcu::TestStatus::pass("Querying Vulkan 1.2 device properties succeeded");
+}
+
+tcu::TestStatus deviceFeatureExtensionsConsistencyVulkan12(Context& context)
+{
+ TestLog& log = context.getTestContext().getLog();
+ const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
+ const CustomInstance instance (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+ const InstanceDriver& vki = instance.getDriver();
+
+ if (!context.contextSupports(vk::ApiVersion(1, 2, 0)))
+ TCU_THROW(NotSupportedError, "At least Vulkan 1.2 required to run test");
+
+ VkPhysicalDeviceVulkan12Features vulkan12Features = initVulkanStructure();
+ VkPhysicalDeviceVulkan11Features vulkan11Features = initVulkanStructure(&vulkan12Features);
+ VkPhysicalDeviceFeatures2 extFeatures = initVulkanStructure(&vulkan11Features);
+
+ vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
+
+ log << TestLog::Message << vulkan11Features << TestLog::EndMessage;
+ log << TestLog::Message << vulkan12Features << TestLog::EndMessage;
+
+ // Validate if proper VkPhysicalDeviceVulkanXXFeatures fields are set when corresponding extensions are present
+ std::pair<std::pair<const char*,const char*>, VkBool32> extensions2validate[] =
+ {
+ { { "VK_KHR_sampler_mirror_clamp_to_edge", "VkPhysicalDeviceVulkan12Features.samplerMirrorClampToEdge" }, vulkan12Features.samplerMirrorClampToEdge },
+ { { "VK_KHR_draw_indirect_count", "VkPhysicalDeviceVulkan12Features.drawIndirectCount" }, vulkan12Features.drawIndirectCount },
+ { { "VK_EXT_descriptor_indexing", "VkPhysicalDeviceVulkan12Features.descriptorIndexing" }, vulkan12Features.descriptorIndexing },
+ { { "VK_EXT_sampler_filter_minmax", "VkPhysicalDeviceVulkan12Features.samplerFilterMinmax" }, vulkan12Features.samplerFilterMinmax },
+ { { "VK_EXT_shader_viewport_index_layer", "VkPhysicalDeviceVulkan12Features.shaderOutputViewportIndex" }, vulkan12Features.shaderOutputViewportIndex },
+ { { "VK_EXT_shader_viewport_index_layer", "VkPhysicalDeviceVulkan12Features.shaderOutputLayer" }, vulkan12Features.shaderOutputLayer }
+ };
+ vector<VkExtensionProperties> extensionProperties = enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
+ for (const auto& ext : extensions2validate)
+ if (checkExtension(extensionProperties, ext.first.first) && !ext.second)
+ TCU_FAIL(string("Mismatch between extension ") + ext.first.first + " and " + ext.first.second);
+
+ // collect all extension features
+ {
+ VkPhysicalDevice16BitStorageFeatures device16BitStorageFeatures = initVulkanStructure();
+ VkPhysicalDeviceMultiviewFeatures deviceMultiviewFeatures = initVulkanStructure(&device16BitStorageFeatures);
+ VkPhysicalDeviceProtectedMemoryFeatures protectedMemoryFeatures = initVulkanStructure(&deviceMultiviewFeatures);
+ VkPhysicalDeviceSamplerYcbcrConversionFeatures samplerYcbcrConversionFeatures = initVulkanStructure(&protectedMemoryFeatures);
+ VkPhysicalDeviceShaderDrawParametersFeatures shaderDrawParametersFeatures = initVulkanStructure(&samplerYcbcrConversionFeatures);
+ VkPhysicalDeviceVariablePointersFeatures variablePointerFeatures = initVulkanStructure(&shaderDrawParametersFeatures);
+ VkPhysicalDevice8BitStorageFeatures device8BitStorageFeatures = initVulkanStructure(&variablePointerFeatures);
+ VkPhysicalDeviceShaderAtomicInt64Features shaderAtomicInt64Features = initVulkanStructure(&device8BitStorageFeatures);
+ VkPhysicalDeviceShaderFloat16Int8Features shaderFloat16Int8Features = initVulkanStructure(&shaderAtomicInt64Features);
+ VkPhysicalDeviceDescriptorIndexingFeatures descriptorIndexingFeatures = initVulkanStructure(&shaderFloat16Int8Features);
+ VkPhysicalDeviceScalarBlockLayoutFeatures scalarBlockLayoutFeatures = initVulkanStructure(&descriptorIndexingFeatures);
+ VkPhysicalDeviceImagelessFramebufferFeatures imagelessFramebufferFeatures = initVulkanStructure(&scalarBlockLayoutFeatures);
+ VkPhysicalDeviceUniformBufferStandardLayoutFeatures uniformBufferStandardLayoutFeatures = initVulkanStructure(&imagelessFramebufferFeatures);
+ VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures shaderSubgroupExtendedTypesFeatures = initVulkanStructure(&uniformBufferStandardLayoutFeatures);
+ VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures separateDepthStencilLayoutsFeatures = initVulkanStructure(&shaderSubgroupExtendedTypesFeatures);
+ VkPhysicalDeviceHostQueryResetFeatures hostQueryResetFeatures = initVulkanStructure(&separateDepthStencilLayoutsFeatures);
+ VkPhysicalDeviceTimelineSemaphoreFeatures timelineSemaphoreFeatures = initVulkanStructure(&hostQueryResetFeatures);
+ VkPhysicalDeviceBufferDeviceAddressFeatures bufferDeviceAddressFeatures = initVulkanStructure(&timelineSemaphoreFeatures);
+ VkPhysicalDeviceVulkanMemoryModelFeatures vulkanMemoryModelFeatures = initVulkanStructure(&bufferDeviceAddressFeatures);
+ extFeatures = initVulkanStructure(&vulkanMemoryModelFeatures);
+
+ vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
+
+ log << TestLog::Message << extFeatures << TestLog::EndMessage;
+ log << TestLog::Message << device16BitStorageFeatures << TestLog::EndMessage;
+ log << TestLog::Message << deviceMultiviewFeatures << TestLog::EndMessage;
+ log << TestLog::Message << protectedMemoryFeatures << TestLog::EndMessage;
+ log << TestLog::Message << samplerYcbcrConversionFeatures << TestLog::EndMessage;
+ log << TestLog::Message << shaderDrawParametersFeatures << TestLog::EndMessage;
+ log << TestLog::Message << variablePointerFeatures << TestLog::EndMessage;
+ log << TestLog::Message << device8BitStorageFeatures << TestLog::EndMessage;
+ log << TestLog::Message << shaderAtomicInt64Features << TestLog::EndMessage;
+ log << TestLog::Message << shaderFloat16Int8Features << TestLog::EndMessage;
+ log << TestLog::Message << descriptorIndexingFeatures << TestLog::EndMessage;
+ log << TestLog::Message << scalarBlockLayoutFeatures << TestLog::EndMessage;
+ log << TestLog::Message << imagelessFramebufferFeatures << TestLog::EndMessage;
+ log << TestLog::Message << uniformBufferStandardLayoutFeatures << TestLog::EndMessage;
+ log << TestLog::Message << shaderSubgroupExtendedTypesFeatures << TestLog::EndMessage;
+ log << TestLog::Message << separateDepthStencilLayoutsFeatures << TestLog::EndMessage;
+ log << TestLog::Message << hostQueryResetFeatures << TestLog::EndMessage;
+ log << TestLog::Message << timelineSemaphoreFeatures << TestLog::EndMessage;
+ log << TestLog::Message << bufferDeviceAddressFeatures << TestLog::EndMessage;
+ log << TestLog::Message << vulkanMemoryModelFeatures << TestLog::EndMessage;
+
+ if (( device16BitStorageFeatures.storageBuffer16BitAccess != vulkan11Features.storageBuffer16BitAccess ||
+ device16BitStorageFeatures.uniformAndStorageBuffer16BitAccess != vulkan11Features.uniformAndStorageBuffer16BitAccess ||
+ device16BitStorageFeatures.storagePushConstant16 != vulkan11Features.storagePushConstant16 ||
+ device16BitStorageFeatures.storageInputOutput16 != vulkan11Features.storageInputOutput16 ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDevice16BitStorageFeatures and VkPhysicalDeviceVulkan11Features");
+ }
+
+ if (( deviceMultiviewFeatures.multiview != vulkan11Features.multiview ||
+ deviceMultiviewFeatures.multiviewGeometryShader != vulkan11Features.multiviewGeometryShader ||
+ deviceMultiviewFeatures.multiviewTessellationShader != vulkan11Features.multiviewTessellationShader ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceMultiviewFeatures and VkPhysicalDeviceVulkan11Features");
+ }
+
+ if ( (protectedMemoryFeatures.protectedMemory != vulkan11Features.protectedMemory ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceProtectedMemoryFeatures and VkPhysicalDeviceVulkan11Features");
+ }
+
+ if ( (samplerYcbcrConversionFeatures.samplerYcbcrConversion != vulkan11Features.samplerYcbcrConversion ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceSamplerYcbcrConversionFeatures and VkPhysicalDeviceVulkan11Features");
+ }
+
+ if ( (shaderDrawParametersFeatures.shaderDrawParameters != vulkan11Features.shaderDrawParameters ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceShaderDrawParametersFeatures and VkPhysicalDeviceVulkan11Features");
+ }
+
+ if (( variablePointerFeatures.variablePointersStorageBuffer != vulkan11Features.variablePointersStorageBuffer ||
+ variablePointerFeatures.variablePointers != vulkan11Features.variablePointers))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceVariablePointersFeatures and VkPhysicalDeviceVulkan11Features");
+ }
+
+ if (( device8BitStorageFeatures.storageBuffer8BitAccess != vulkan12Features.storageBuffer8BitAccess ||
+ device8BitStorageFeatures.uniformAndStorageBuffer8BitAccess != vulkan12Features.uniformAndStorageBuffer8BitAccess ||
+ device8BitStorageFeatures.storagePushConstant8 != vulkan12Features.storagePushConstant8 ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDevice8BitStorageFeatures and VkPhysicalDeviceVulkan12Features");
+ }
+
+ if (( shaderAtomicInt64Features.shaderBufferInt64Atomics != vulkan12Features.shaderBufferInt64Atomics ||
+ shaderAtomicInt64Features.shaderSharedInt64Atomics != vulkan12Features.shaderSharedInt64Atomics ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceShaderAtomicInt64Features and VkPhysicalDeviceVulkan12Features");
+ }
+
+ if (( shaderFloat16Int8Features.shaderFloat16 != vulkan12Features.shaderFloat16 ||
+ shaderFloat16Int8Features.shaderInt8 != vulkan12Features.shaderInt8 ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceShaderFloat16Int8Features and VkPhysicalDeviceVulkan12Features");
+ }
+
+ if ((vulkan12Features.descriptorIndexing) &&
+ ( descriptorIndexingFeatures.shaderInputAttachmentArrayDynamicIndexing != vulkan12Features.shaderInputAttachmentArrayDynamicIndexing ||
+ descriptorIndexingFeatures.shaderUniformTexelBufferArrayDynamicIndexing != vulkan12Features.shaderUniformTexelBufferArrayDynamicIndexing ||
+ descriptorIndexingFeatures.shaderStorageTexelBufferArrayDynamicIndexing != vulkan12Features.shaderStorageTexelBufferArrayDynamicIndexing ||
+ descriptorIndexingFeatures.shaderUniformBufferArrayNonUniformIndexing != vulkan12Features.shaderUniformBufferArrayNonUniformIndexing ||
+ descriptorIndexingFeatures.shaderSampledImageArrayNonUniformIndexing != vulkan12Features.shaderSampledImageArrayNonUniformIndexing ||
+ descriptorIndexingFeatures.shaderStorageBufferArrayNonUniformIndexing != vulkan12Features.shaderStorageBufferArrayNonUniformIndexing ||
+ descriptorIndexingFeatures.shaderStorageImageArrayNonUniformIndexing != vulkan12Features.shaderStorageImageArrayNonUniformIndexing ||
+ descriptorIndexingFeatures.shaderInputAttachmentArrayNonUniformIndexing != vulkan12Features.shaderInputAttachmentArrayNonUniformIndexing ||
+ descriptorIndexingFeatures.shaderUniformTexelBufferArrayNonUniformIndexing != vulkan12Features.shaderUniformTexelBufferArrayNonUniformIndexing ||
+ descriptorIndexingFeatures.shaderStorageTexelBufferArrayNonUniformIndexing != vulkan12Features.shaderStorageTexelBufferArrayNonUniformIndexing ||
+ descriptorIndexingFeatures.descriptorBindingUniformBufferUpdateAfterBind != vulkan12Features.descriptorBindingUniformBufferUpdateAfterBind ||
+ descriptorIndexingFeatures.descriptorBindingSampledImageUpdateAfterBind != vulkan12Features.descriptorBindingSampledImageUpdateAfterBind ||
+ descriptorIndexingFeatures.descriptorBindingStorageImageUpdateAfterBind != vulkan12Features.descriptorBindingStorageImageUpdateAfterBind ||
+ descriptorIndexingFeatures.descriptorBindingStorageBufferUpdateAfterBind != vulkan12Features.descriptorBindingStorageBufferUpdateAfterBind ||
+ descriptorIndexingFeatures.descriptorBindingUniformTexelBufferUpdateAfterBind != vulkan12Features.descriptorBindingUniformTexelBufferUpdateAfterBind ||
+ descriptorIndexingFeatures.descriptorBindingStorageTexelBufferUpdateAfterBind != vulkan12Features.descriptorBindingStorageTexelBufferUpdateAfterBind ||
+ descriptorIndexingFeatures.descriptorBindingUpdateUnusedWhilePending != vulkan12Features.descriptorBindingUpdateUnusedWhilePending ||
+ descriptorIndexingFeatures.descriptorBindingPartiallyBound != vulkan12Features.descriptorBindingPartiallyBound ||
+ descriptorIndexingFeatures.descriptorBindingVariableDescriptorCount != vulkan12Features.descriptorBindingVariableDescriptorCount ||
+ descriptorIndexingFeatures.runtimeDescriptorArray != vulkan12Features.runtimeDescriptorArray ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceDescriptorIndexingFeatures and VkPhysicalDeviceVulkan12Features");
+ }
+
+ if (( scalarBlockLayoutFeatures.scalarBlockLayout != vulkan12Features.scalarBlockLayout ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceScalarBlockLayoutFeatures and VkPhysicalDeviceVulkan12Features");
+ }
+
+ if (( imagelessFramebufferFeatures.imagelessFramebuffer != vulkan12Features.imagelessFramebuffer ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceImagelessFramebufferFeatures and VkPhysicalDeviceVulkan12Features");
+ }
+
+ if (( uniformBufferStandardLayoutFeatures.uniformBufferStandardLayout != vulkan12Features.uniformBufferStandardLayout ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceUniformBufferStandardLayoutFeatures and VkPhysicalDeviceVulkan12Features");
+ }
+
+ if (( shaderSubgroupExtendedTypesFeatures.shaderSubgroupExtendedTypes != vulkan12Features.shaderSubgroupExtendedTypes ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures and VkPhysicalDeviceVulkan12Features");
+ }
+
+ if (( separateDepthStencilLayoutsFeatures.separateDepthStencilLayouts != vulkan12Features.separateDepthStencilLayouts ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures and VkPhysicalDeviceVulkan12Features");
+ }
+
+ if (( hostQueryResetFeatures.hostQueryReset != vulkan12Features.hostQueryReset ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceHostQueryResetFeatures and VkPhysicalDeviceVulkan12Features");
+ }
+
+ if (( timelineSemaphoreFeatures.timelineSemaphore != vulkan12Features.timelineSemaphore ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceTimelineSemaphoreFeatures and VkPhysicalDeviceVulkan12Features");
+ }
+
+ if (( bufferDeviceAddressFeatures.bufferDeviceAddress != vulkan12Features.bufferDeviceAddress ||
+ bufferDeviceAddressFeatures.bufferDeviceAddressCaptureReplay != vulkan12Features.bufferDeviceAddressCaptureReplay ||
+ bufferDeviceAddressFeatures.bufferDeviceAddressMultiDevice != vulkan12Features.bufferDeviceAddressMultiDevice ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceBufferDeviceAddressFeatures and VkPhysicalDeviceVulkan12Features");
+ }
+
+ if (( vulkanMemoryModelFeatures.vulkanMemoryModel != vulkan12Features.vulkanMemoryModel ||
+ vulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope != vulkan12Features.vulkanMemoryModelDeviceScope ||
+ vulkanMemoryModelFeatures.vulkanMemoryModelAvailabilityVisibilityChains != vulkan12Features.vulkanMemoryModelAvailabilityVisibilityChains ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceVulkanMemoryModelFeatures and VkPhysicalDeviceVulkan12Features");
+ }
+ }
+
+ return tcu::TestStatus::pass("Vulkan 1.2 device features are consistent with extensions");
+}
+
+tcu::TestStatus devicePropertyExtensionsConsistencyVulkan12(Context& context)
+{
+ TestLog& log = context.getTestContext().getLog();
+ const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
+ const CustomInstance instance (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+ const InstanceDriver& vki = instance.getDriver();
+
+ if (!context.contextSupports(vk::ApiVersion(1, 2, 0)))
+ TCU_THROW(NotSupportedError, "At least Vulkan 1.2 required to run test");
+
+ VkPhysicalDeviceVulkan12Properties vulkan12Properties = initVulkanStructure();
+ VkPhysicalDeviceVulkan11Properties vulkan11Properties = initVulkanStructure(&vulkan12Properties);
+ VkPhysicalDeviceProperties2 extProperties = initVulkanStructure(&vulkan11Properties);
+
+ vki.getPhysicalDeviceProperties2(physicalDevice, &extProperties);
+
+ log << TestLog::Message << vulkan11Properties << TestLog::EndMessage;
+ log << TestLog::Message << vulkan12Properties << TestLog::EndMessage;
+
+ // Validate all fields initialized matching to extension structures
+ {
+ VkPhysicalDeviceIDProperties idProperties = initVulkanStructure();
+ VkPhysicalDeviceSubgroupProperties subgroupProperties = initVulkanStructure(&idProperties);
+ VkPhysicalDevicePointClippingProperties pointClippingProperties = initVulkanStructure(&subgroupProperties);
+ VkPhysicalDeviceMultiviewProperties multiviewProperties = initVulkanStructure(&pointClippingProperties);
+ VkPhysicalDeviceProtectedMemoryProperties protectedMemoryPropertiesKHR = initVulkanStructure(&multiviewProperties);
+ VkPhysicalDeviceMaintenance3Properties maintenance3Properties = initVulkanStructure(&protectedMemoryPropertiesKHR);
+ VkPhysicalDeviceDriverProperties driverProperties = initVulkanStructure(&maintenance3Properties);
+ VkPhysicalDeviceFloatControlsProperties floatControlsProperties = initVulkanStructure(&driverProperties);
+ VkPhysicalDeviceDescriptorIndexingProperties descriptorIndexingProperties = initVulkanStructure(&floatControlsProperties);
+ VkPhysicalDeviceDepthStencilResolveProperties depthStencilResolveProperties = initVulkanStructure(&descriptorIndexingProperties);
+ VkPhysicalDeviceSamplerFilterMinmaxProperties samplerFilterMinmaxProperties = initVulkanStructure(&depthStencilResolveProperties);
+ VkPhysicalDeviceTimelineSemaphoreProperties timelineSemaphoreProperties = initVulkanStructure(&samplerFilterMinmaxProperties);
+ extProperties = initVulkanStructure(&timelineSemaphoreProperties);
+
+ vki.getPhysicalDeviceProperties2(physicalDevice, &extProperties);
+
+ if ((deMemCmp(idProperties.deviceUUID, vulkan11Properties.deviceUUID, VK_UUID_SIZE) != 0) ||
+ (deMemCmp(idProperties.driverUUID, vulkan11Properties.driverUUID, VK_UUID_SIZE) != 0) ||
+ (idProperties.deviceLUIDValid != vulkan11Properties.deviceLUIDValid))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceIDProperties and VkPhysicalDeviceVulkan11Properties");
+ }
+ else if (idProperties.deviceLUIDValid)
+ {
+ // If deviceLUIDValid is VK_FALSE, the contents of deviceLUID and deviceNodeMask are undefined
+ // so thay can only be compared when deviceLUIDValid is VK_TRUE.
+ if ((deMemCmp(idProperties.deviceLUID, vulkan11Properties.deviceLUID, VK_UUID_SIZE) != 0) ||
+ (idProperties.deviceNodeMask != vulkan11Properties.deviceNodeMask))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceIDProperties and VkPhysicalDeviceVulkan11Properties");
+ }
+ }
+
+ if ((subgroupProperties.subgroupSize != vulkan11Properties.subgroupSize ||
+ subgroupProperties.supportedStages != vulkan11Properties.subgroupSupportedStages ||
+ subgroupProperties.supportedOperations != vulkan11Properties.subgroupSupportedOperations ||
+ subgroupProperties.quadOperationsInAllStages != vulkan11Properties.subgroupQuadOperationsInAllStages))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceSubgroupProperties and VkPhysicalDeviceVulkan11Properties");
+ }
+
+ if ((pointClippingProperties.pointClippingBehavior != vulkan11Properties.pointClippingBehavior))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDevicePointClippingProperties and VkPhysicalDeviceVulkan11Properties");
+ }
+
+ if ((multiviewProperties.maxMultiviewViewCount != vulkan11Properties.maxMultiviewViewCount ||
+ multiviewProperties.maxMultiviewInstanceIndex != vulkan11Properties.maxMultiviewInstanceIndex))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceMultiviewProperties and VkPhysicalDeviceVulkan11Properties");
+ }
+
+ if ((protectedMemoryPropertiesKHR.protectedNoFault != vulkan11Properties.protectedNoFault))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceProtectedMemoryProperties and VkPhysicalDeviceVulkan11Properties");
+ }
+
+ if ((maintenance3Properties.maxPerSetDescriptors != vulkan11Properties.maxPerSetDescriptors ||
+ maintenance3Properties.maxMemoryAllocationSize != vulkan11Properties.maxMemoryAllocationSize))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceMaintenance3Properties and VkPhysicalDeviceVulkan11Properties");
+ }
+
+ if ((driverProperties.driverID != vulkan12Properties.driverID ||
+ strncmp(driverProperties.driverName, vulkan12Properties.driverName, VK_MAX_DRIVER_NAME_SIZE) != 0 ||
+ strncmp(driverProperties.driverInfo, vulkan12Properties.driverInfo, VK_MAX_DRIVER_INFO_SIZE) != 0 ||
+ driverProperties.conformanceVersion.major != vulkan12Properties.conformanceVersion.major ||
+ driverProperties.conformanceVersion.minor != vulkan12Properties.conformanceVersion.minor ||
+ driverProperties.conformanceVersion.subminor != vulkan12Properties.conformanceVersion.subminor ||
+ driverProperties.conformanceVersion.patch != vulkan12Properties.conformanceVersion.patch))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceDriverProperties and VkPhysicalDeviceVulkan12Properties");
+ }
+
+ if ((floatControlsProperties.denormBehaviorIndependence != vulkan12Properties.denormBehaviorIndependence ||
+ floatControlsProperties.roundingModeIndependence != vulkan12Properties.roundingModeIndependence ||
+ floatControlsProperties.shaderSignedZeroInfNanPreserveFloat16 != vulkan12Properties.shaderSignedZeroInfNanPreserveFloat16 ||
+ floatControlsProperties.shaderSignedZeroInfNanPreserveFloat32 != vulkan12Properties.shaderSignedZeroInfNanPreserveFloat32 ||
+ floatControlsProperties.shaderSignedZeroInfNanPreserveFloat64 != vulkan12Properties.shaderSignedZeroInfNanPreserveFloat64 ||
+ floatControlsProperties.shaderDenormPreserveFloat16 != vulkan12Properties.shaderDenormPreserveFloat16 ||
+ floatControlsProperties.shaderDenormPreserveFloat32 != vulkan12Properties.shaderDenormPreserveFloat32 ||
+ floatControlsProperties.shaderDenormPreserveFloat64 != vulkan12Properties.shaderDenormPreserveFloat64 ||
+ floatControlsProperties.shaderDenormFlushToZeroFloat16 != vulkan12Properties.shaderDenormFlushToZeroFloat16 ||
+ floatControlsProperties.shaderDenormFlushToZeroFloat32 != vulkan12Properties.shaderDenormFlushToZeroFloat32 ||
+ floatControlsProperties.shaderDenormFlushToZeroFloat64 != vulkan12Properties.shaderDenormFlushToZeroFloat64 ||
+ floatControlsProperties.shaderRoundingModeRTEFloat16 != vulkan12Properties.shaderRoundingModeRTEFloat16 ||
+ floatControlsProperties.shaderRoundingModeRTEFloat32 != vulkan12Properties.shaderRoundingModeRTEFloat32 ||
+ floatControlsProperties.shaderRoundingModeRTEFloat64 != vulkan12Properties.shaderRoundingModeRTEFloat64 ||
+ floatControlsProperties.shaderRoundingModeRTZFloat16 != vulkan12Properties.shaderRoundingModeRTZFloat16 ||
+ floatControlsProperties.shaderRoundingModeRTZFloat32 != vulkan12Properties.shaderRoundingModeRTZFloat32 ||
+ floatControlsProperties.shaderRoundingModeRTZFloat64 != vulkan12Properties.shaderRoundingModeRTZFloat64 ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceFloatControlsProperties and VkPhysicalDeviceVulkan12Properties");
+ }
+
+ if ((descriptorIndexingProperties.maxUpdateAfterBindDescriptorsInAllPools != vulkan12Properties.maxUpdateAfterBindDescriptorsInAllPools ||
+ descriptorIndexingProperties.shaderUniformBufferArrayNonUniformIndexingNative != vulkan12Properties.shaderUniformBufferArrayNonUniformIndexingNative ||
+ descriptorIndexingProperties.shaderSampledImageArrayNonUniformIndexingNative != vulkan12Properties.shaderSampledImageArrayNonUniformIndexingNative ||
+ descriptorIndexingProperties.shaderStorageBufferArrayNonUniformIndexingNative != vulkan12Properties.shaderStorageBufferArrayNonUniformIndexingNative ||
+ descriptorIndexingProperties.shaderStorageImageArrayNonUniformIndexingNative != vulkan12Properties.shaderStorageImageArrayNonUniformIndexingNative ||
+ descriptorIndexingProperties.shaderInputAttachmentArrayNonUniformIndexingNative != vulkan12Properties.shaderInputAttachmentArrayNonUniformIndexingNative ||
+ descriptorIndexingProperties.robustBufferAccessUpdateAfterBind != vulkan12Properties.robustBufferAccessUpdateAfterBind ||
+ descriptorIndexingProperties.quadDivergentImplicitLod != vulkan12Properties.quadDivergentImplicitLod ||
+ descriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindSamplers != vulkan12Properties.maxPerStageDescriptorUpdateAfterBindSamplers ||
+ descriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindUniformBuffers != vulkan12Properties.maxPerStageDescriptorUpdateAfterBindUniformBuffers ||
+ descriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindStorageBuffers != vulkan12Properties.maxPerStageDescriptorUpdateAfterBindStorageBuffers ||
+ descriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindSampledImages != vulkan12Properties.maxPerStageDescriptorUpdateAfterBindSampledImages ||
+ descriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindStorageImages != vulkan12Properties.maxPerStageDescriptorUpdateAfterBindStorageImages ||
+ descriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindInputAttachments != vulkan12Properties.maxPerStageDescriptorUpdateAfterBindInputAttachments ||
+ descriptorIndexingProperties.maxPerStageUpdateAfterBindResources != vulkan12Properties.maxPerStageUpdateAfterBindResources ||
+ descriptorIndexingProperties.maxDescriptorSetUpdateAfterBindSamplers != vulkan12Properties.maxDescriptorSetUpdateAfterBindSamplers ||
+ descriptorIndexingProperties.maxDescriptorSetUpdateAfterBindUniformBuffers != vulkan12Properties.maxDescriptorSetUpdateAfterBindUniformBuffers ||
+ descriptorIndexingProperties.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic != vulkan12Properties.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic ||
+ descriptorIndexingProperties.maxDescriptorSetUpdateAfterBindStorageBuffers != vulkan12Properties.maxDescriptorSetUpdateAfterBindStorageBuffers ||
+ descriptorIndexingProperties.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic != vulkan12Properties.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic ||
+ descriptorIndexingProperties.maxDescriptorSetUpdateAfterBindSampledImages != vulkan12Properties.maxDescriptorSetUpdateAfterBindSampledImages ||
+ descriptorIndexingProperties.maxDescriptorSetUpdateAfterBindStorageImages != vulkan12Properties.maxDescriptorSetUpdateAfterBindStorageImages ||
+ descriptorIndexingProperties.maxDescriptorSetUpdateAfterBindInputAttachments != vulkan12Properties.maxDescriptorSetUpdateAfterBindInputAttachments ))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceDescriptorIndexingProperties and VkPhysicalDeviceVulkan12Properties");
+ }
+
+ if ((depthStencilResolveProperties.supportedDepthResolveModes != vulkan12Properties.supportedDepthResolveModes ||
+ depthStencilResolveProperties.supportedStencilResolveModes != vulkan12Properties.supportedStencilResolveModes ||
+ depthStencilResolveProperties.independentResolveNone != vulkan12Properties.independentResolveNone ||
+ depthStencilResolveProperties.independentResolve != vulkan12Properties.independentResolve))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceDepthStencilResolveProperties and VkPhysicalDeviceVulkan12Properties");
+ }
+
+ if ((samplerFilterMinmaxProperties.filterMinmaxSingleComponentFormats != vulkan12Properties.filterMinmaxSingleComponentFormats ||
+ samplerFilterMinmaxProperties.filterMinmaxImageComponentMapping != vulkan12Properties.filterMinmaxImageComponentMapping))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceSamplerFilterMinmaxProperties and VkPhysicalDeviceVulkan12Properties");
+ }
+
+ if ((timelineSemaphoreProperties.maxTimelineSemaphoreValueDifference != vulkan12Properties.maxTimelineSemaphoreValueDifference))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceTimelineSemaphoreProperties and VkPhysicalDeviceVulkan12Properties");
+ }
+ }
+
+ return tcu::TestStatus::pass("Vulkan 1.2 device properties are consistent with extension properties");
+}
+
tcu::TestStatus imageFormatProperties2 (Context& context, const VkFormat format, const VkImageType imageType, const VkImageTiling tiling)
{
if (isYCbCrFormat(format))
@@ -3263,10 +5447,9 @@
TestLog& log = context.getTestContext().getLog();
- const PlatformInterface& vkp = context.getPlatformInterface();
const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
- const Unique<VkInstance> instance (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_get_physical_device_properties2"));
- const InstanceDriver vki (vkp, *instance);
+ const CustomInstance instance (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+ const InstanceDriver& vki (instance.getDriver());
const VkImageCreateFlags ycbcrFlags = isYCbCrFormat(format) ? (VkImageCreateFlags)VK_IMAGE_CREATE_DISJOINT_BIT_KHR : (VkImageCreateFlags)0u;
const VkImageUsageFlags allUsageFlags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT
@@ -3337,10 +5520,9 @@
{
TestLog& log = context.getTestContext().getLog();
- const PlatformInterface& vkp = context.getPlatformInterface();
const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
- const Unique<VkInstance> instance (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_get_physical_device_properties2"));
- const InstanceDriver vki (vkp, *instance);
+ const CustomInstance instance (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+ const InstanceDriver& vki (instance.getDriver());
const VkImageUsageFlags allUsageFlags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT
| VK_IMAGE_USAGE_TRANSFER_DST_BIT
@@ -3527,6 +5709,8 @@
// allowedExtensions.insert("VK_GOOGLE_extension1");
allowedDeviceExtensions.insert("VK_ANDROID_external_memory_android_hardware_buffer");
allowedDeviceExtensions.insert("VK_GOOGLE_display_timing");
+ allowedDeviceExtensions.insert("VK_GOOGLE_decorate_string");
+ allowedDeviceExtensions.insert("VK_GOOGLE_hlsl_functionality1");
// Instance extensions
checkExtensions(results,
@@ -3594,31 +5778,29 @@
// Instance extensions
{
- static const char* mandatoryExtensions[] =
+ static const string mandatoryExtensions[] =
{
"VK_KHR_get_physical_device_properties2",
};
- const vector<VkExtensionProperties> extensions = enumerateInstanceExtensionProperties(context.getPlatformInterface(), DE_NULL);
- for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(mandatoryExtensions); ++ndx)
+ for (const auto &ext : mandatoryExtensions)
{
- if (!isInstanceExtensionSupported(context.getUsedApiVersion(), extensions, RequiredExtension(mandatoryExtensions[ndx])))
- results.fail(string(mandatoryExtensions[ndx]) + " is not supported");
+ if (!context.isInstanceFunctionalitySupported(ext))
+ results.fail(ext + " is not supported");
}
}
// Device extensions
{
- static const char* mandatoryExtensions[] =
+ static const string mandatoryExtensions[] =
{
"VK_KHR_maintenance1",
};
- const vector<VkExtensionProperties> extensions = enumerateDeviceExtensionProperties(context.getInstanceInterface(), context.getPhysicalDevice(), DE_NULL);
- for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(mandatoryExtensions); ++ndx)
+ for (const auto &ext : mandatoryExtensions)
{
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), extensions, RequiredExtension(mandatoryExtensions[ndx])))
- results.fail(string(mandatoryExtensions[ndx]) + " is not supported");
+ if (!context.isDeviceFunctionalitySupported(ext))
+ results.fail(ext + " is not supported");
}
}
@@ -3633,41 +5815,6 @@
{
de::MovePtr<tcu::TestCaseGroup> infoTests (new tcu::TestCaseGroup(testCtx, "info", "Platform Information Tests"));
- {
- de::MovePtr<tcu::TestCaseGroup> instanceInfoTests (new tcu::TestCaseGroup(testCtx, "instance", "Instance Information Tests"));
-
- addFunctionCase(instanceInfoTests.get(), "physical_devices", "Physical devices", enumeratePhysicalDevices);
- addFunctionCase(instanceInfoTests.get(), "physical_device_groups", "Physical devices Groups", enumeratePhysicalDeviceGroups);
- addFunctionCase(instanceInfoTests.get(), "layers", "Layers", enumerateInstanceLayers);
- addFunctionCase(instanceInfoTests.get(), "extensions", "Extensions", enumerateInstanceExtensions);
-
- infoTests->addChild(instanceInfoTests.release());
- }
-
- {
- de::MovePtr<tcu::TestCaseGroup> deviceInfoTests (new tcu::TestCaseGroup(testCtx, "device", "Device Information Tests"));
-
- addFunctionCase(deviceInfoTests.get(), "features", "Device Features", deviceFeatures);
- addFunctionCase(deviceInfoTests.get(), "properties", "Device Properties", deviceProperties);
- addFunctionCase(deviceInfoTests.get(), "queue_family_properties", "Queue family properties", deviceQueueFamilyProperties);
- addFunctionCase(deviceInfoTests.get(), "memory_properties", "Memory properties", deviceMemoryProperties);
- addFunctionCase(deviceInfoTests.get(), "layers", "Layers", enumerateDeviceLayers);
- addFunctionCase(deviceInfoTests.get(), "extensions", "Extensions", enumerateDeviceExtensions);
- addFunctionCase(deviceInfoTests.get(), "no_khx_extensions", "KHX extensions", testNoKhxExtensions);
- addFunctionCase(deviceInfoTests.get(), "memory_budget", "Memory budget", deviceMemoryBudgetProperties);
- addFunctionCase(deviceInfoTests.get(), "mandatory_features", "Mandatory features", deviceMandatoryFeatures);
-
- infoTests->addChild(deviceInfoTests.release());
- }
-
- {
- de::MovePtr<tcu::TestCaseGroup> deviceGroupInfoTests(new tcu::TestCaseGroup(testCtx, "device_group", "Device Group Information Tests"));
-
- addFunctionCase(deviceGroupInfoTests.get(), "peer_memory_features", "Device Group peer memory features", deviceGroupPeerMemoryFeatures);
-
- infoTests->addChild(deviceGroupInfoTests.release());
- }
-
infoTests->addChild(createTestGroup(testCtx, "format_properties", "VkGetPhysicalDeviceFormatProperties() Tests", createFormatTests));
infoTests->addChild(createTestGroup(testCtx, "image_format_properties", "VkGetPhysicalDeviceImageFormatProperties() Tests", createImageFormatTests, imageFormatProperties));
@@ -3683,6 +5830,43 @@
infoTests->addChild(extendedPropertiesTests.release());
}
+ {
+ de::MovePtr<tcu::TestCaseGroup> extendedPropertiesTests (new tcu::TestCaseGroup(testCtx, "vulkan1p2", "Vulkan 1.2 related tests"));
+
+ addFunctionCase(extendedPropertiesTests.get(), "features", "Extended Vulkan 1.2 Device Features", deviceFeaturesVulkan12);
+ addFunctionCase(extendedPropertiesTests.get(), "properties", "Extended Vulkan 1.2 Device Properties", devicePropertiesVulkan12);
+ addFunctionCase(extendedPropertiesTests.get(), "feature_extensions_consistency", "Vulkan 1.2 consistency between Features and Extensions", deviceFeatureExtensionsConsistencyVulkan12);
+ addFunctionCase(extendedPropertiesTests.get(), "property_extensions_consistency", "Vulkan 1.2 consistency between Properties and Extensions", devicePropertyExtensionsConsistencyVulkan12);
+ addFunctionCase(extendedPropertiesTests.get(), "feature_bits_influence", "Validate feature bits influence on feature activation", checkSupportFeatureBitInfluence, featureBitInfluenceOnDeviceCreate);
+
+ infoTests->addChild(extendedPropertiesTests.release());
+ }
+
+ {
+ de::MovePtr<tcu::TestCaseGroup> limitsValidationTests (new tcu::TestCaseGroup(testCtx, "vulkan1p2_limits_validation", "Vulkan 1.2 and core extensions limits validation"));
+
+ addFunctionCase(limitsValidationTests.get(), "general", "Vulkan 1.2 Limit validation", validateLimitsCheckSupport, validateLimits12);
+ addFunctionCase(limitsValidationTests.get(), "khr_push_descriptor", "VK_KHR_push_descriptor limit validation", checkSupportKhrPushDescriptor, validateLimitsKhrPushDescriptor);
+ addFunctionCase(limitsValidationTests.get(), "khr_multiview", "VK_KHR_multiview limit validation", checkSupportKhrMultiview, validateLimitsKhrMultiview);
+ addFunctionCase(limitsValidationTests.get(), "ext_discard_rectangles", "VK_EXT_discard_rectangles limit validation", checkSupportExtDiscardRectangles, validateLimitsExtDiscardRectangles);
+ addFunctionCase(limitsValidationTests.get(), "ext_sample_locations", "VK_EXT_sample_locations limit validation", checkSupportExtSampleLocations, validateLimitsExtSampleLocations);
+ addFunctionCase(limitsValidationTests.get(), "ext_external_memory_host", "VK_EXT_external_memory_host limit validation", checkSupportExtExternalMemoryHost, validateLimitsExtExternalMemoryHost);
+ addFunctionCase(limitsValidationTests.get(), "ext_blend_operation_advanced", "VK_EXT_blend_operation_advanced limit validation", checkSupportExtBlendOperationAdvanced, validateLimitsExtBlendOperationAdvanced);
+ addFunctionCase(limitsValidationTests.get(), "khr_maintenance_3", "VK_KHR_maintenance3 limit validation", checkSupportKhrMaintenance3, validateLimitsKhrMaintenance3);
+ addFunctionCase(limitsValidationTests.get(), "ext_conservative_rasterization", "VK_EXT_conservative_rasterization limit validation", checkSupportExtConservativeRasterization, validateLimitsExtConservativeRasterization);
+ addFunctionCase(limitsValidationTests.get(), "ext_descriptor_indexing", "VK_EXT_descriptor_indexing limit validation", checkSupportExtDescriptorIndexing, validateLimitsExtDescriptorIndexing);
+ addFunctionCase(limitsValidationTests.get(), "ext_inline_uniform_block", "VK_EXT_inline_uniform_block limit validation", checkSupportExtInlineUniformBlock, validateLimitsExtInlineUniformBlock);
+ addFunctionCase(limitsValidationTests.get(), "ext_vertex_attribute_divisor", "VK_EXT_vertex_attribute_divisor limit validation", checkSupportExtVertexAttributeDivisor, validateLimitsExtVertexAttributeDivisor);
+ addFunctionCase(limitsValidationTests.get(), "nv_mesh_shader", "VK_NV_mesh_shader limit validation", checkSupportNvMeshShader, validateLimitsNvMeshShader);
+ addFunctionCase(limitsValidationTests.get(), "ext_transform_feedback", "VK_EXT_transform_feedback limit validation", checkSupportExtTransformFeedback, validateLimitsExtTransformFeedback);
+ addFunctionCase(limitsValidationTests.get(), "fragment_density_map", "VK_EXT_fragment_density_map limit validation", checkSupportExtFragmentDensityMap, validateLimitsExtFragmentDensityMap);
+ addFunctionCase(limitsValidationTests.get(), "nv_ray_tracing", "VK_NV_ray_tracing limit validation", checkSupportNvRayTracing, validateLimitsNvRayTracing);
+ addFunctionCase(limitsValidationTests.get(), "timeline_semaphore", "VK_KHR_timeline_semaphore limit validation", checkSupportKhrTimelineSemaphore, validateLimitsKhrTimelineSemaphore);
+ addFunctionCase(limitsValidationTests.get(), "ext_line_rasterization", "VK_EXT_line_rasterization limit validation", checkSupportExtLineRasterization, validateLimitsExtLineRasterization);
+
+ infoTests->addChild(limitsValidationTests.release());
+ }
+
infoTests->addChild(createTestGroup(testCtx, "image_format_properties2", "VkGetPhysicalDeviceImageFormatProperties2() Tests", createImageFormatTests, imageFormatProperties2));
infoTests->addChild(createTestGroup(testCtx, "sparse_image_format_properties2", "VkGetPhysicalDeviceSparseImageFormatProperties2() Tests", createImageFormatTests, sparseImageFormatProperties2));
@@ -3699,5 +5883,31 @@
return infoTests.release();
}
+void createFeatureInfoInstanceTests(tcu::TestCaseGroup* testGroup)
+{
+ addFunctionCase(testGroup, "physical_devices", "Physical devices", enumeratePhysicalDevices);
+ addFunctionCase(testGroup, "physical_device_groups", "Physical devices Groups", enumeratePhysicalDeviceGroups);
+ addFunctionCase(testGroup, "instance_layers", "Layers", enumerateInstanceLayers);
+ addFunctionCase(testGroup, "instance_extensions", "Extensions", enumerateInstanceExtensions);
+}
+
+void createFeatureInfoDeviceTests(tcu::TestCaseGroup* testGroup)
+{
+ addFunctionCase(testGroup, "device_features", "Device Features", deviceFeatures);
+ addFunctionCase(testGroup, "device_properties", "Device Properties", deviceProperties);
+ addFunctionCase(testGroup, "device_queue_family_properties", "Queue family properties", deviceQueueFamilyProperties);
+ addFunctionCase(testGroup, "device_memory_properties", "Memory properties", deviceMemoryProperties);
+ addFunctionCase(testGroup, "device_layers", "Layers", enumerateDeviceLayers);
+ addFunctionCase(testGroup, "device_extensions", "Extensions", enumerateDeviceExtensions);
+ addFunctionCase(testGroup, "device_no_khx_extensions", "KHX extensions", testNoKhxExtensions);
+ addFunctionCase(testGroup, "device_memory_budget", "Memory budget", deviceMemoryBudgetProperties);
+ addFunctionCase(testGroup, "device_mandatory_features", "Mandatory features", deviceMandatoryFeatures);
+}
+
+void createFeatureInfoDeviceGroupTests(tcu::TestCaseGroup* testGroup)
+{
+ addFunctionCase(testGroup, "device_group_peer_memory_features", "Device Group peer memory features", deviceGroupPeerMemoryFeatures);
+}
+
} // api
} // vkt
diff --git a/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.hpp b/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.hpp
index 8b9eb58..aa0e1a6 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.hpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.hpp
@@ -31,7 +31,10 @@
namespace api
{
-tcu::TestCaseGroup* createFeatureInfoTests (tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createFeatureInfoTests (tcu::TestContext& testCtx);
+void createFeatureInfoInstanceTests (tcu::TestCaseGroup* testGroup);
+void createFeatureInfoDeviceTests (tcu::TestCaseGroup* testGroup);
+void createFeatureInfoDeviceGroupTests (tcu::TestCaseGroup* testGroup);
} // api
} // vkt
diff --git a/external/vulkancts/modules/vulkan/api/vktApiImageClearingTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiImageClearingTests.cpp
index 5521c21..bef891b 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiImageClearingTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiImageClearingTests.cpp
@@ -467,20 +467,28 @@
return (std::string("_") + de::toString(extent.width) + std::string("x") + de::toString(extent.height) + (extent.depth != 1 ? (std::string("x") + de::toString(extent.depth)) : ""));
}
+enum SeparateDepthStencilLayoutMode
+{
+ SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_NONE = 0,
+ SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_DEPTH,
+ SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_STENCIL,
+};
+
struct TestParams
{
- bool useSingleMipLevel; //!< only mip level 0, otherwise up to maxMipLevels
- VkImageType imageType;
- VkFormat imageFormat;
- VkImageTiling imageTiling;
- VkExtent3D imageExtent;
- deUint32 imageLayerCount;
- LayerRange imageViewLayerRange;
- VkClearValue initValue;
- VkClearValue clearValue[2]; //!< the second value is used with more than one mip map
- LayerRange clearLayerRange;
- AllocationKind allocationKind;
- bool isCube;
+ bool useSingleMipLevel; //!< only mip level 0, otherwise up to maxMipLevels
+ VkImageType imageType;
+ VkFormat imageFormat;
+ VkImageTiling imageTiling;
+ VkExtent3D imageExtent;
+ deUint32 imageLayerCount;
+ LayerRange imageViewLayerRange;
+ VkClearValue initValue;
+ VkClearValue clearValue[2]; //!< the second value is used with more than one mip map
+ LayerRange clearLayerRange;
+ AllocationKind allocationKind;
+ bool isCube;
+ SeparateDepthStencilLayoutMode separateDepthStencilLayoutMode;
};
class ImageClearingTestInstance : public vkt::TestInstance
@@ -501,7 +509,7 @@
void submitCommandBuffer (void) const;
void beginRenderPass (VkSubpassContents content, VkClearValue clearValue) const;
- void pipelineImageBarrier (VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkImageLayout oldLayout, VkImageLayout newLayout) const;
+ void pipelineImageBarrier (VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkImageLayout oldLayout, VkImageLayout newLayout, VkImageAspectFlags aspectMask = 0u) const;
de::MovePtr<TextureLevelPyramid> readImage (VkImageAspectFlags aspectMask, deUint32 baseLayer) const;
tcu::TestStatus verifyResultImage (const std::string& successMessage, const UVec4& clearCoords = UVec4()) const;
@@ -584,7 +592,10 @@
, m_frameBuffer (m_isAttachmentFormat ? createFrameBuffer(*m_imageView, *m_renderPass, params.imageExtent.width, params.imageExtent.height, params.imageViewLayerRange.layerCount) : vk::Move<vk::VkFramebuffer>())
{
if (m_params.allocationKind == ALLOCATION_KIND_DEDICATED)
- context.requireDeviceExtension("VK_KHR_dedicated_allocation");
+ context.requireDeviceFunctionality("VK_KHR_dedicated_allocation");
+
+ if (m_params.separateDepthStencilLayoutMode != SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_NONE)
+ context.requireDeviceFunctionality("VK_KHR_separate_depth_stencil_layouts");
}
ImageClearingTestInstance::ViewType ImageClearingTestInstance::getViewType (deUint32 imageLayerCount) const
@@ -770,82 +781,182 @@
Move<VkRenderPass> ImageClearingTestInstance::createRenderPass (VkFormat format) const
{
- VkImageLayout imageLayout;
-
- if (isDepthStencilFormat(format))
- imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
- else
- imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
-
- const VkAttachmentDescription attachmentDesc =
+ if (m_params.separateDepthStencilLayoutMode == SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_NONE)
{
- 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_CLEAR, // VkAttachmentLoadOp stencilLoadOp;
- VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp stencilStoreOp;
- imageLayout, // VkImageLayout initialLayout;
- imageLayout, // VkImageLayout finalLayout;
- };
+ VkImageLayout imageLayout;
- const VkAttachmentDescription attachments[1] =
- {
- attachmentDesc
- };
+ if (isDepthStencilFormat(format))
+ imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+ else
+ imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
- const VkAttachmentReference attachmentRef =
- {
- 0u, // deUint32 attachment;
- imageLayout, // VkImageLayout layout;
- };
-
- const VkAttachmentReference* pColorAttachments = DE_NULL;
- const VkAttachmentReference* pDepthStencilAttachment = DE_NULL;
- deUint32 colorAttachmentCount = 1;
-
- if (isDepthStencilFormat(format))
- {
- colorAttachmentCount = 0;
- pDepthStencilAttachment = &attachmentRef;
- }
- else
- {
- colorAttachmentCount = 1;
- pColorAttachments = &attachmentRef;
- }
-
- const VkSubpassDescription subpassDesc[1] =
- {
+ const VkAttachmentDescription attachmentDesc =
{
+ 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_CLEAR, // VkAttachmentLoadOp stencilLoadOp;
+ VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp stencilStoreOp;
+ imageLayout, // VkImageLayout initialLayout;
+ imageLayout, // VkImageLayout finalLayout;
+ };
+
+ const VkAttachmentDescription attachments[1] =
+ {
+ attachmentDesc
+ };
+
+ const VkAttachmentReference attachmentRef =
+ {
+ 0u, // deUint32 attachment;
+ imageLayout, // VkImageLayout layout;
+ };
+
+ const VkAttachmentReference* pColorAttachments = DE_NULL;
+ const VkAttachmentReference* pDepthStencilAttachment = DE_NULL;
+ deUint32 colorAttachmentCount = 1;
+
+ if (isDepthStencilFormat(format))
+ {
+ colorAttachmentCount = 0;
+ pDepthStencilAttachment = &attachmentRef;
+ }
+ else
+ {
+ colorAttachmentCount = 1;
+ pColorAttachments = &attachmentRef;
+ }
+
+ const VkSubpassDescription subpassDesc[1] =
+ {
+ {
+ 0u, // VkSubpassDescriptionFlags flags;
+ VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint;
+ 0u, // deUint32 inputAttachmentCount;
+ DE_NULL, // const VkAttachmentReference* pInputAttachments;
+ colorAttachmentCount, // deUint32 colorAttachmentCount;
+ pColorAttachments, // const VkAttachmentReference* pColorAttachments;
+ DE_NULL, // const VkAttachmentReference* pResolveAttachments;
+ pDepthStencilAttachment, // const VkAttachmentReference* pDepthStencilAttachment;
+ 0u, // deUint32 preserveAttachmentCount;
+ DE_NULL, // const VkAttachmentReference* pPreserveAttachments;
+ }
+ };
+
+ const VkRenderPassCreateInfo renderPassCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkRenderPassCreateFlags flags;
+ 1u, // deUint32 attachmentCount;
+ attachments, // const VkAttachmentDescription* pAttachments;
+ 1u, // deUint32 subpassCount;
+ subpassDesc, // const VkSubpassDescription* pSubpasses;
+ 0u, // deUint32 dependencyCount;
+ DE_NULL, // const VkSubpassDependency* pDependencies;
+ };
+
+ return vk::createRenderPass(m_vkd, m_device, &renderPassCreateInfo, DE_NULL);
+ }
+ else
+ {
+ VkImageLayout initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+ VkImageLayout finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+ VkAttachmentDescriptionStencilLayoutKHR stencilLayouts =
+ {
+ VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT_KHR,
+ DE_NULL,
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
+ };
+
+ VkImageLayout imageLayout;
+ VkAttachmentReferenceStencilLayoutKHR stencilLayoutRef =
+ {
+ VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT_KHR,
+ DE_NULL,
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
+ };
+
+ if (m_params.separateDepthStencilLayoutMode == SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_DEPTH)
+ {
+ initialLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR;
+ finalLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR;
+ stencilLayouts.stencilInitialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ stencilLayouts.stencilFinalLayout = VK_IMAGE_LAYOUT_GENERAL;
+ imageLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR;
+ stencilLayoutRef.stencilLayout = VK_IMAGE_LAYOUT_GENERAL;
+ }
+ else
+ {
+ initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ finalLayout = VK_IMAGE_LAYOUT_GENERAL;
+ stencilLayouts.stencilInitialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+ stencilLayouts.stencilFinalLayout = VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR;
+ imageLayout = VK_IMAGE_LAYOUT_GENERAL;
+ stencilLayoutRef.stencilLayout = VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR;
+ }
+
+ const VkAttachmentDescription2KHR attachmentDesc =
+ {
+ VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR, // VkStructureType sType;
+ &stencilLayouts, // const void* pNext;
+ 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_CLEAR, // VkAttachmentLoadOp stencilLoadOp;
+ VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp stencilStoreOp;
+ initialLayout, // VkImageLayout initialLayout;
+ finalLayout, // VkImageLayout finalLayout;
+ };
+
+ const VkAttachmentReference2KHR attachmentRef =
+ {
+ VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR, // VkStructureType sType;
+ &stencilLayoutRef, // const void* pNext;
+ 0u, // deUint32 attachment;
+ imageLayout, // VkImageLayout layout;
+ 0u, // VkImageAspectFlags aspectMask;
+ };
+
+ const VkSubpassDescription2KHR subpassDesc =
+ {
+ VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
0u, // VkSubpassDescriptionFlags flags;
VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint;
+ 0u, // deUint32 viewMask;
0u, // deUint32 inputAttachmentCount;
- DE_NULL, // const VkAttachmentReference* pInputAttachments;
- colorAttachmentCount, // deUint32 colorAttachmentCount;
- pColorAttachments, // const VkAttachmentReference* pColorAttachments;
- DE_NULL, // const VkAttachmentReference* pResolveAttachments;
- pDepthStencilAttachment, // const VkAttachmentReference* pDepthStencilAttachment;
+ DE_NULL, // const VkAttachmentReference2KHR* pInputAttachments;
+ 0u, // deUint32 colorAttachmentCount;
+ DE_NULL, // const VkAttachmentReference2KHR* pColorAttachments;
+ DE_NULL, // const VkAttachmentReference2KHR* pResolveAttachments;
+ &attachmentRef, // const VkAttachmentReference2KHR* pDepthStencilAttachment;
0u, // deUint32 preserveAttachmentCount;
- DE_NULL, // const VkAttachmentReference* pPreserveAttachments;
- }
- };
+ DE_NULL, // const VkAttachmentReference2KHR* pPreserveAttachments;
+ };
- const VkRenderPassCreateInfo renderPassCreateInfo =
- {
- VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkRenderPassCreateFlags flags;
- 1u, // deUint32 attachmentCount;
- attachments, // const VkAttachmentDescription* pAttachments;
- 1u, // deUint32 subpassCount;
- subpassDesc, // const VkSubpassDescription* pSubpasses;
- 0u, // deUint32 dependencyCount;
- DE_NULL, // const VkSubpassDependency* pDependencies;
- };
+ const VkRenderPassCreateInfo2KHR renderPassCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkRenderPassCreateFlags flags;
+ 1u, // deUint32 attachmentCount;
+ &attachmentDesc, // const VkAttachmentDescription* pAttachments;
+ 1u, // deUint32 subpassCount;
+ &subpassDesc, // const VkSubpassDescription* pSubpasses;
+ 0u, // deUint32 dependencyCount;
+ DE_NULL, // const VkSubpassDependency* pDependencies;
+ 0u, // deUint32 correlatedViewMaskCount;
+ DE_NULL, // const deUint32* pCorrelatedViewMasks;
+ };
- return vk::createRenderPass(m_vkd, m_device, &renderPassCreateInfo, DE_NULL);
+ return vk::createRenderPass2(m_vkd, m_device, &renderPassCreateInfo, DE_NULL);
+ }
}
Move<VkFramebuffer> ImageClearingTestInstance::createFrameBuffer (VkImageView imageView, VkRenderPass renderPass, deUint32 imageWidth, deUint32 imageHeight, deUint32 imageLayersCount) const
@@ -886,8 +997,11 @@
submitCommandsAndWait(m_vkd, m_device, m_queue, m_commandBuffer.get());
}
-void ImageClearingTestInstance::pipelineImageBarrier(VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkImageLayout oldLayout, VkImageLayout newLayout) const
+void ImageClearingTestInstance::pipelineImageBarrier(VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkImageLayout oldLayout, VkImageLayout newLayout, VkImageAspectFlags aspectMask) const
{
+ if (!aspectMask || m_params.separateDepthStencilLayoutMode == SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_NONE)
+ aspectMask = m_imageAspectFlags;
+
const VkImageMemoryBarrier imageBarrier =
{
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
@@ -900,7 +1014,7 @@
VK_QUEUE_FAMILY_IGNORED, // deUint32 destQueueFamilyIndex;
*m_image, // VkImage image;
{
- m_imageAspectFlags, // VkImageAspectFlags aspectMask;
+ aspectMask, // VkImageAspectFlags aspectMask;
0u, // deUint32 baseMipLevel;
VK_REMAINING_MIP_LEVELS, // deUint32 levelCount;
0u, // deUint32 baseArrayLayer;
@@ -992,7 +1106,8 @@
VK_ACCESS_TRANSFER_WRITE_BIT,
VK_ACCESS_TRANSFER_READ_BIT,
VK_IMAGE_LAYOUT_GENERAL,
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
+ VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+ aspectMask);
m_vkd.cmdCopyImageToBuffer(*m_commandBuffer, *m_image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *buffer, static_cast<deUint32>(copyRegions.size()), ©Regions[0]);
m_vkd.cmdPipelineBarrier(*m_commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &bufferBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL);
@@ -1002,7 +1117,8 @@
VK_ACCESS_TRANSFER_READ_BIT,
VK_ACCESS_TRANSFER_READ_BIT,
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
- VK_IMAGE_LAYOUT_GENERAL);
+ VK_IMAGE_LAYOUT_GENERAL,
+ aspectMask);
endCommandBuffer();
submitCommandBuffer();
@@ -1030,7 +1146,7 @@
{
DE_ASSERT((clearCoords == UVec4()) || m_params.imageExtent.depth == 1u);
- if (getIsDepthFormat(m_params.imageFormat))
+ if (getIsDepthFormat(m_params.imageFormat) && m_params.separateDepthStencilLayoutMode != SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_STENCIL)
{
DE_ASSERT(m_imageMipLevels == 1u);
@@ -1059,7 +1175,7 @@
}
}
- if (getIsStencilFormat(m_params.imageFormat))
+ if (getIsStencilFormat(m_params.imageFormat) && m_params.separateDepthStencilLayoutMode != SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_DEPTH)
{
DE_ASSERT(m_imageMipLevels == 1u);
@@ -1228,8 +1344,23 @@
TestStatus ClearDepthStencilImageTestInstance::iterate (void)
{
- const VkImageSubresourceRange subresourceRange = makeImageSubresourceRange(m_imageAspectFlags, 0u, 1u, m_params.clearLayerRange.baseArrayLayer, m_twoStep ? 1 : m_params.clearLayerRange.layerCount);
- const VkImageSubresourceRange steptwoRange = makeImageSubresourceRange(m_imageAspectFlags, 0u, VK_REMAINING_MIP_LEVELS, m_params.clearLayerRange.baseArrayLayer, VK_REMAINING_ARRAY_LAYERS);
+ VkImageLayout layout = (m_isAttachmentFormat
+ ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
+ : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
+ VkImageAspectFlags aspectMask = m_imageAspectFlags;
+ if (m_params.separateDepthStencilLayoutMode == SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_DEPTH)
+ {
+ layout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR;
+ aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
+ }
+ else if (m_params.separateDepthStencilLayoutMode == SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_STENCIL)
+ {
+ layout = VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR;
+ aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
+ }
+
+ const VkImageSubresourceRange subresourceRange = makeImageSubresourceRange(aspectMask, 0u, 1u, m_params.clearLayerRange.baseArrayLayer, m_twoStep ? 1 : m_params.clearLayerRange.layerCount);
+ const VkImageSubresourceRange steptwoRange = makeImageSubresourceRange(aspectMask, 0u, VK_REMAINING_MIP_LEVELS, m_params.clearLayerRange.baseArrayLayer, VK_REMAINING_ARRAY_LAYERS);
beginCommandBuffer(0);
@@ -1240,9 +1371,8 @@
? VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT
: VK_ACCESS_TRANSFER_WRITE_BIT), // VkAccessFlags dstAccessMask
VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
- (m_isAttachmentFormat
- ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
- : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)); // VkImageLayout newLayout;
+ layout, // VkImageLayout newLayout;
+ aspectMask); // VkImageAspectFlags aspectMask;
if (m_isAttachmentFormat)
{
@@ -1253,8 +1383,9 @@
VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask
VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask
- VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout oldLayout;
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); // VkImageLayout newLayout;
+ layout, // VkImageLayout oldLayout;
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout newLayout;
+ aspectMask); // VkImageAspectFlags aspectMask;
}
m_vkd.cmdClearDepthStencilImage(*m_commandBuffer, *m_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &m_params.clearValue[0].depthStencil, 1, &subresourceRange);
@@ -1267,7 +1398,8 @@
VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask
VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout;
- VK_IMAGE_LAYOUT_GENERAL); // VkImageLayout newLayout;
+ VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout newLayout;
+ aspectMask); // VkImageAspectFlags aspectMask;
endCommandBuffer();
submitCommandBuffer();
@@ -1294,9 +1426,25 @@
TestStatus iterate (void)
{
+ const bool isDepthStencil = isDepthStencilFormat(m_params.imageFormat);
+ const VkAccessFlags accessMask = (isDepthStencil ? VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT : VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT);
+ VkImageLayout attachmentLayout = (isDepthStencil ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
+ VkImageAspectFlags aspectMask = m_imageAspectFlags;
+
+ if (m_params.separateDepthStencilLayoutMode == SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_DEPTH)
+ {
+ attachmentLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR;
+ aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
+ }
+ else if (m_params.separateDepthStencilLayoutMode == SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_STENCIL)
+ {
+ attachmentLayout = VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR;
+ aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
+ }
+
const VkClearAttachment clearAttachment =
{
- m_imageAspectFlags, // VkImageAspectFlags aspectMask;
+ aspectMask, // VkImageAspectFlags aspectMask;
0u, // deUint32 colorAttachment;
m_params.clearValue[0] // VkClearValue clearValue;
};
@@ -1352,10 +1500,6 @@
clearRects.push_back(rects[1]);
}
- const bool isDepthStencil = isDepthStencilFormat(m_params.imageFormat);
- const VkAccessFlags accessMask = (isDepthStencil ? VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT : VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT);
- const VkImageLayout attachmentLayout = (isDepthStencil ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
-
beginCommandBuffer(0);
pipelineImageBarrier(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, // VkPipelineStageFlags srcStageMask
@@ -1363,7 +1507,8 @@
0, // VkAccessFlags srcAccessMask
accessMask, // VkAccessFlags dstAccessMask
VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
- attachmentLayout); // VkImageLayout newLayout;
+ attachmentLayout, // VkImageLayout newLayout;
+ aspectMask); // VkImageAspectFlags aspectMask;
beginRenderPass(VK_SUBPASS_CONTENTS_INLINE, m_params.initValue);
m_vkd.cmdClearAttachments(*m_commandBuffer, 1, &clearAttachment, static_cast<deUint32>(clearRects.size()), &clearRects[0]);
@@ -1374,7 +1519,8 @@
accessMask, // VkAccessFlags srcAccessMask
VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask
attachmentLayout, // VkImageLayout oldLayout;
- VK_IMAGE_LAYOUT_GENERAL); // VkImageLayout newLayout;
+ VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout newLayout;
+ aspectMask); // VkImageAspectFlags aspectMask;
endCommandBuffer();
submitCommandBuffer();
@@ -1790,24 +1936,25 @@
const std::string testCaseName = getFormatCaseName(format) + dimensionsString;
const TestParams testParams =
{
- false, // bool useSingleMipLevel;
- imageTypesToTest[imageTypeIndex], // VkImageType imageType;
- format, // VkFormat imageFormat;
- imageTilingsToTest[imageTilingIndex], // VkImageTiling imageTiling;
- dimensions, // VkExtent3D imageExtent;
- imageLayerParamsToTest[imageLayerParamsIndex].imageLayerCount, // deUint32 imageLayerCount;
+ false, // bool useSingleMipLevel;
+ imageTypesToTest[imageTypeIndex], // VkImageType imageType;
+ format, // VkFormat imageFormat;
+ imageTilingsToTest[imageTilingIndex], // VkImageTiling imageTiling;
+ dimensions, // VkExtent3D imageExtent;
+ imageLayerParamsToTest[imageLayerParamsIndex].imageLayerCount, // deUint32 imageLayerCount;
{
0u,
imageLayerParamsToTest[imageLayerParamsIndex].imageLayerCount
- }, // LayerRange imageViewLayerRange;
- makeClearColorValue(format, 0.2f, 0.1f, 0.7f, 0.8f), // VkClearValue initValue;
+ }, // LayerRange imageViewLayerRange;
+ makeClearColorValue(format, 0.2f, 0.1f, 0.7f, 0.8f), // VkClearValue initValue;
{
- makeClearColorValue(format, 0.1f, 0.5f, 0.3f, 0.9f), // VkClearValue clearValue[0];
- makeClearColorValue(format, 0.3f, 0.6f, 0.2f, 0.7f), // VkClearValue clearValue[1];
+ makeClearColorValue(format, 0.1f, 0.5f, 0.3f, 0.9f), // VkClearValue clearValue[0];
+ makeClearColorValue(format, 0.3f, 0.6f, 0.2f, 0.7f), // VkClearValue clearValue[1];
},
- imageLayerParamsToTest[imageLayerParamsIndex].clearLayerRange, // LayerRange clearLayerRange;
- allocationKind, // AllocationKind allocationKind;
- false // bool isCube;
+ imageLayerParamsToTest[imageLayerParamsIndex].clearLayerRange, // LayerRange clearLayerRange;
+ allocationKind, // AllocationKind allocationKind;
+ false, // bool isCube;
+ SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_NONE, // SeparateDepthStencilLayoutMode separateDepthStencilLayoutMode;
};
if (!imageLayerParamsToTest[imageLayerParamsIndex].twoStep)
imageLayersGroup->addChild(new InstanceFactory1<ClearColorImageTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName, "Clear Color Image", testParams));
@@ -1844,34 +1991,46 @@
for (size_t imageFormatIndex = 0; imageFormatIndex < numOfDepthStencilImageFormatsToTest; ++imageFormatIndex)
{
- const VkFormat format = depthStencilImageFormatsToTest[imageFormatIndex];
- const std::string testCaseName = getFormatCaseName(format) + dimensionsString;
- const TestParams testParams =
- {
- true, // bool useSingleMipLevel;
- VK_IMAGE_TYPE_2D, // VkImageType imageType;
- format, // VkFormat format;
- VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
- dimensions, // VkExtent3D extent;
- imageLayerParamsToTest[imageLayerParamsIndex].imageLayerCount, // deUint32 imageLayerCount;
- {
- 0u,
- imageLayerParamsToTest[imageLayerParamsIndex].imageLayerCount
- }, // LayerRange imageViewLayerRange;
- makeClearValueDepthStencil(0.5f, 0x03), // VkClearValue initValue
- {
- makeClearValueDepthStencil(0.1f, 0x06), // VkClearValue clearValue[0];
- makeClearValueDepthStencil(0.3f, 0x04), // VkClearValue clearValue[1];
- },
- imageLayerParamsToTest[imageLayerParamsIndex].clearLayerRange, // LayerRange clearLayerRange;
- allocationKind, // AllocationKind allocationKind;
- false // bool isCube;
- };
+ const VkFormat format = depthStencilImageFormatsToTest[imageFormatIndex];
+ const bool hasDepth = tcu::hasDepthComponent(mapVkFormat(format).order);
+ const bool hasStencil = tcu::hasStencilComponent(mapVkFormat(format).order);
+ const int separateLayoutsLoopCount = (hasDepth && hasStencil) ? 3 : 1;
- if (!imageLayerParamsToTest[imageLayerParamsIndex].twoStep)
- imageLayersGroup->addChild(new InstanceFactory1<ClearDepthStencilImageTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName, "Clear Depth/Stencil Image", testParams));
- else
- imageLayersGroup->addChild(new InstanceFactory1<TwoStepClearDepthStencilImageTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName, "Clear Depth/Stencil Image", testParams));
+ for (int separateDepthStencilLayoutMode = 0; separateDepthStencilLayoutMode < separateLayoutsLoopCount; ++separateDepthStencilLayoutMode)
+ {
+ const std::string testCaseName = getFormatCaseName(format) +
+ ((separateDepthStencilLayoutMode == SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_DEPTH) ? "_separate_layouts_depth" :
+ (separateDepthStencilLayoutMode == SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_STENCIL) ? "_separate_layouts_stencil" :
+ "")
+ + dimensionsString;
+ const TestParams testParams =
+ {
+ true, // bool useSingleMipLevel;
+ VK_IMAGE_TYPE_2D, // VkImageType imageType;
+ format, // VkFormat format;
+ VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
+ dimensions, // VkExtent3D extent;
+ imageLayerParamsToTest[imageLayerParamsIndex].imageLayerCount, // deUint32 imageLayerCount;
+ {
+ 0u,
+ imageLayerParamsToTest[imageLayerParamsIndex].imageLayerCount
+ }, // LayerRange imageViewLayerRange;
+ makeClearValueDepthStencil(0.5f, 0x03), // VkClearValue initValue
+ {
+ makeClearValueDepthStencil(0.1f, 0x06), // VkClearValue clearValue[0];
+ makeClearValueDepthStencil(0.3f, 0x04), // VkClearValue clearValue[1];
+ },
+ imageLayerParamsToTest[imageLayerParamsIndex].clearLayerRange, // LayerRange clearLayerRange;
+ allocationKind, // AllocationKind allocationKind;
+ false, // bool isCube;
+ SeparateDepthStencilLayoutMode(separateDepthStencilLayoutMode), // SeparateDepthStencilLayoutMode separateDepthStencilLayoutMode;
+ };
+
+ if (!imageLayerParamsToTest[imageLayerParamsIndex].twoStep)
+ imageLayersGroup->addChild(new InstanceFactory1<ClearDepthStencilImageTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName, "Clear Depth/Stencil Image", testParams));
+ else
+ imageLayersGroup->addChild(new InstanceFactory1<TwoStepClearDepthStencilImageTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName, "Clear Depth/Stencil Image", testParams));
+ }
}
}
depthStencilImageClearTests->addChild(imageLayersGroup.release());
@@ -1905,21 +2064,22 @@
const std::string testCaseName = getFormatCaseName(format) + dimensionsString;
const TestParams testParams =
{
- true, // bool useSingleMipLevel;
- VK_IMAGE_TYPE_2D, // VkImageType imageType;
- format, // VkFormat format;
- VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
- dimensions, // VkExtent3D extent;
- imageLayerParamsToTest[imageLayerParamsIndex].imageLayerCount, // deUint32 imageLayerCount;
- imageLayerParamsToTest[imageLayerParamsIndex].imageViewRange, // LayerRange imageViewLayerRange;
- makeClearColorValue(format, 0.2f, 0.1f, 0.7f, 0.8f), // VkClearValue initValue
+ true, // bool useSingleMipLevel;
+ VK_IMAGE_TYPE_2D, // VkImageType imageType;
+ format, // VkFormat format;
+ VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
+ dimensions, // VkExtent3D extent;
+ imageLayerParamsToTest[imageLayerParamsIndex].imageLayerCount, // deUint32 imageLayerCount;
+ imageLayerParamsToTest[imageLayerParamsIndex].imageViewRange, // LayerRange imageViewLayerRange;
+ makeClearColorValue(format, 0.2f, 0.1f, 0.7f, 0.8f), // VkClearValue initValue
{
- makeClearColorValue(format, 0.1f, 0.5f, 0.3f, 0.9f), // VkClearValue clearValue[0];
- makeClearColorValue(format, 0.3f, 0.6f, 0.2f, 0.7f), // VkClearValue clearValue[1];
+ makeClearColorValue(format, 0.1f, 0.5f, 0.3f, 0.9f), // VkClearValue clearValue[0];
+ makeClearColorValue(format, 0.3f, 0.6f, 0.2f, 0.7f), // VkClearValue clearValue[1];
},
- imageLayerParamsToTest[imageLayerParamsIndex].clearLayerRange, // LayerRange clearLayerRange;
- allocationKind, // AllocationKind allocationKind;
- imageLayerParamsToTest[imageLayerParamsIndex].isCube // bool isCube;
+ imageLayerParamsToTest[imageLayerParamsIndex].clearLayerRange, // LayerRange clearLayerRange;
+ allocationKind, // AllocationKind allocationKind;
+ imageLayerParamsToTest[imageLayerParamsIndex].isCube, // bool isCube;
+ SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_NONE, // SeparateDepthStencilLayoutMode separateDepthStencilLayoutMode;
};
colorAttachmentClearLayersGroup->addChild(new InstanceFactory1<ClearAttachmentTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName, "Clear Color Attachment", testParams));
if (dimensions.width > 1)
@@ -1956,29 +2116,42 @@
for (size_t imageFormatIndex = 0; imageFormatIndex < numOfDepthStencilImageFormatsToTest; ++imageFormatIndex)
{
- const VkFormat format = depthStencilImageFormatsToTest[imageFormatIndex];
- const std::string testCaseName = getFormatCaseName(format) + dimensionsString;
- const TestParams testParams =
+ const VkFormat format = depthStencilImageFormatsToTest[imageFormatIndex];
+ const bool hasDepth = tcu::hasDepthComponent(mapVkFormat(format).order);
+ const bool hasStencil = tcu::hasStencilComponent(mapVkFormat(format).order);
+ const int separateLayoutsLoopCount = (hasDepth && hasStencil) ? 3 : 1;
+
+ for (int separateDepthStencilLayoutMode = 0; separateDepthStencilLayoutMode < separateLayoutsLoopCount; ++separateDepthStencilLayoutMode)
{
- true, // bool useSingleMipLevel;
- VK_IMAGE_TYPE_2D, // VkImageType imageType;
- format, // VkFormat format;
- VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
- dimensions, // VkExtent3D extent;
- imageLayerParamsToTest[imageLayerParamsIndex].imageLayerCount, // deUint32 imageLayerCount;
- imageLayerParamsToTest[imageLayerParamsIndex].imageViewRange, // LayerRange imageViewLayerRange;
- makeClearValueDepthStencil(0.5f, 0x03), // VkClearValue initValue
+ const std::string testCaseName = getFormatCaseName(format) +
+ ((separateDepthStencilLayoutMode == SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_DEPTH) ? "_separate_layouts_depth" :
+ (separateDepthStencilLayoutMode == SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_STENCIL) ? "_separate_layouts_stencil" :
+ "")
+ + dimensionsString;
+
+ const TestParams testParams =
{
- makeClearValueDepthStencil(0.1f, 0x06), // VkClearValue clearValue[0];
- makeClearValueDepthStencil(0.3f, 0x04), // VkClearValue clearValue[1];
- },
- imageLayerParamsToTest[imageLayerParamsIndex].clearLayerRange, // LayerRange clearLayerRange;
- allocationKind, // AllocationKind allocationKind;
- imageLayerParamsToTest[imageLayerParamsIndex].isCube // bool isCube;
- };
- depthStencilLayersGroup->addChild(new InstanceFactory1<ClearAttachmentTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName, "Clear Depth/Stencil Attachment", testParams));
- if (dimensions.width > 1)
- partialDepthStencilLayersGroup->addChild(new InstanceFactory1<PartialClearAttachmentTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName, "Partial Clear Depth/Stencil Attachment", testParams));
+ true, // bool useSingleMipLevel;
+ VK_IMAGE_TYPE_2D, // VkImageType imageType;
+ format, // VkFormat format;
+ VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
+ dimensions, // VkExtent3D extent;
+ imageLayerParamsToTest[imageLayerParamsIndex].imageLayerCount, // deUint32 imageLayerCount;
+ imageLayerParamsToTest[imageLayerParamsIndex].imageViewRange, // LayerRange imageViewLayerRange;
+ makeClearValueDepthStencil(0.5f, 0x03), // VkClearValue initValue
+ {
+ makeClearValueDepthStencil(0.1f, 0x06), // VkClearValue clearValue[0];
+ makeClearValueDepthStencil(0.3f, 0x04), // VkClearValue clearValue[1];
+ },
+ imageLayerParamsToTest[imageLayerParamsIndex].clearLayerRange, // LayerRange clearLayerRange;
+ allocationKind, // AllocationKind allocationKind;
+ imageLayerParamsToTest[imageLayerParamsIndex].isCube, // bool isCube;
+ SeparateDepthStencilLayoutMode(separateDepthStencilLayoutMode), // SeparateDepthStencilLayoutMode separateDepthStencilLayoutMode;
+ };
+ depthStencilLayersGroup->addChild(new InstanceFactory1<ClearAttachmentTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName, "Clear Depth/Stencil Attachment", testParams));
+ if (dimensions.width > 1)
+ partialDepthStencilLayersGroup->addChild(new InstanceFactory1<PartialClearAttachmentTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName, "Partial Clear Depth/Stencil Attachment", testParams));
+ }
}
}
depthStencilAttachmentClearTests->addChild(depthStencilLayersGroup.release());
diff --git a/external/vulkancts/modules/vulkan/api/vktApiMaintenance3Check.cpp b/external/vulkancts/modules/vulkan/api/vktApiMaintenance3Check.cpp
index 9cccad0..80d2921 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiMaintenance3Check.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiMaintenance3Check.cpp
@@ -100,7 +100,7 @@
{}
virtual void checkSupport (Context& ctx) const
{
- ctx.requireDeviceExtension("VK_KHR_maintenance3");
+ ctx.requireDeviceFunctionality("VK_KHR_maintenance3");
}
virtual TestInstance* createInstance (Context& ctx) const
{
@@ -273,7 +273,7 @@
{}
virtual void checkSupport (Context& ctx) const
{
- ctx.requireDeviceExtension("VK_KHR_maintenance3");
+ ctx.requireDeviceFunctionality("VK_KHR_maintenance3");
}
virtual TestInstance* createInstance (Context& ctx) const
{
diff --git a/external/vulkancts/modules/vulkan/api/vktApiMemoryRequirementInvarianceTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiMemoryRequirementInvarianceTests.cpp
index 889c8b3..d4c1068 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiMemoryRequirementInvarianceTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiMemoryRequirementInvarianceTests.cpp
@@ -254,11 +254,8 @@
size_t refSizes[testCycles];
unsigned int order[testCycles];
bool success = true;
- const std::vector<std::string>& extensions = m_context.getDeviceExtensions();
- const deBool isDedicatedAllocationSupported =
- isDeviceExtensionSupported(m_context.getUsedApiVersion(), extensions, "VK_KHR_dedicated_allocation");
- const deBool isYcbcrSupported =
- isDeviceExtensionSupported(m_context.getUsedApiVersion(), extensions, "VK_KHR_sampler_ycbcr_conversion");
+ const deBool isDedicatedAllocationSupported = m_context.isDeviceFunctionalitySupported("VK_KHR_dedicated_allocation");
+ const deBool isYcbcrSupported = m_context.isDeviceFunctionalitySupported("VK_KHR_sampler_ycbcr_conversion");
std::vector<int> optimalFormats;
std::vector<int> linearFormats;
std::vector<int> memoryTypes;
diff --git a/external/vulkancts/modules/vulkan/api/vktApiObjectManagementTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiObjectManagementTests.cpp
index 0b2d661..253f9d4 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiObjectManagementTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiObjectManagementTests.cpp
@@ -23,6 +23,7 @@
#include "vktApiObjectManagementTests.hpp"
#include "vktTestCaseUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkDefs.hpp"
#include "vkRef.hpp"
@@ -234,6 +235,7 @@
{
const PlatformInterface& vkp;
deUint32 apiVersion;
+ const InstanceInterface& instanceInterface;
VkInstance instance;
const DeviceInterface& vkd;
VkDevice device;
@@ -241,10 +243,12 @@
const BinaryCollection& programBinaries;
const VkAllocationCallbacks* allocationCallbacks;
deUint32 maxResourceConsumers; // Maximum number of objects using same Object::Resources concurrently
+ const tcu::CommandLine& commandLine;
Environment (Context& context, deUint32 maxResourceConsumers_)
: vkp (context.getPlatformInterface())
, apiVersion (context.getUsedApiVersion())
+ , instanceInterface (context.getInstanceInterface())
, instance (context.getInstance())
, vkd (context.getDeviceInterface())
, device (context.getDevice())
@@ -252,20 +256,24 @@
, programBinaries (context.getBinaryCollection())
, allocationCallbacks (DE_NULL)
, maxResourceConsumers (maxResourceConsumers_)
+ , commandLine (context.getTestContext().getCommandLine())
{
}
Environment (const PlatformInterface& vkp_,
deUint32 apiVersion_,
+ const InstanceInterface& instanceInterface_,
VkInstance instance_,
const DeviceInterface& vkd_,
VkDevice device_,
deUint32 queueFamilyIndex_,
const BinaryCollection& programBinaries_,
const VkAllocationCallbacks* allocationCallbacks_,
- deUint32 maxResourceConsumers_)
+ deUint32 maxResourceConsumers_,
+ const tcu::CommandLine& commandLine_)
: vkp (vkp_)
, apiVersion (apiVersion_)
+ , instanceInterface (instanceInterface_)
, instance (instance_)
, vkd (vkd_)
, device (device_)
@@ -273,6 +281,7 @@
, programBinaries (programBinaries_)
, allocationCallbacks (allocationCallbacks_)
, maxResourceConsumers (maxResourceConsumers_)
+ , commandLine (commandLine_)
{
}
};
@@ -315,7 +324,7 @@
inline bool hasDeviceExtension (Context& context, const string name)
{
- return isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), name);
+ return context.isDeviceFunctionalitySupported(name);
}
VkDeviceSize getPageTableSize (const PlatformMemoryLimits& limits, VkDeviceSize allocationSize)
@@ -350,13 +359,15 @@
AllocationCallbackRecorder allocRecorder (getSystemAllocator());
const Environment env (context.getPlatformInterface(),
context.getUsedApiVersion(),
+ context.getInstanceInterface(),
context.getInstance(),
context.getDeviceInterface(),
context.getDevice(),
context.getUniversalQueueFamilyIndex(),
context.getBinaryCollection(),
allocRecorder.getCallbacks(),
- 1u);
+ 1u,
+ context.getTestContext().getCommandLine());
const typename Object::Resources res (env, params);
const size_t resourceMemoryUsage = getCurrentSystemMemoryUsage(allocRecorder);
@@ -465,13 +476,14 @@
{
vector<const char*> extensionNamePtrs;
const vector<VkExtensionProperties> instanceExts = enumerateInstanceExtensionProperties(env.vkp, DE_NULL);
- for (size_t extensionID = 0; extensionID < params.instanceExtensions.size(); extensionID++)
+ for (const auto& extName : params.instanceExtensions)
{
- if (!isInstanceExtensionSupported(env.apiVersion, instanceExts, RequiredExtension(params.instanceExtensions[extensionID])))
- TCU_THROW(NotSupportedError, (params.instanceExtensions[extensionID] + " is not supported").c_str());
+ bool extNotInCore = !isCoreInstanceExtension(env.apiVersion, extName);
+ if (extNotInCore && !isExtensionSupported(instanceExts.begin(), instanceExts.end(), RequiredExtension(extName)))
+ TCU_THROW(NotSupportedError, (extName + " is not supported").c_str());
- if (!isCoreInstanceExtension(env.apiVersion, params.instanceExtensions[extensionID]))
- extensionNamePtrs.push_back(params.instanceExtensions[extensionID].c_str());
+ if (extNotInCore)
+ extensionNamePtrs.push_back(extName.c_str());
}
const VkApplicationInfo appInfo =
@@ -577,6 +589,7 @@
&queuePriority, // pQueuePriorities
}
};
+
const VkDeviceCreateInfo deviceInfo =
{
VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
@@ -591,7 +604,7 @@
DE_NULL, // pEnabledFeatures
};
- return createDevice(env.vkp, env.instance, res.vki, res.physicalDevice, &deviceInfo, env.allocationCallbacks);
+ return createCustomDevice(env.commandLine.isValidationEnabled(), env.vkp, env.instance, res.vki, res.physicalDevice, &deviceInfo, env.allocationCallbacks);
}
};
@@ -704,7 +717,7 @@
DE_NULL, // pEnabledFeatures
};
- return createDevice(env.vkp, env.instance, res.vki, res.physicalDevices[params.deviceIndex], &deviceGroupCreateInfo, env.allocationCallbacks);
+ return createCustomDevice(env.commandLine.isValidationEnabled(), env.vkp, env.instance, res.vki, res.physicalDevices[params.deviceIndex], &deviceGroupCreateInfo, env.allocationCallbacks);
}
};
@@ -2441,7 +2454,7 @@
: deviceRes (parent, deviceParams)
, device (Device::create(parent, deviceRes, deviceParams))
, vkd (parent.vkp, parent.instance, *device)
- , env (parent.vkp, parent.apiVersion, parent.instance, vkd, *device, deviceRes.queueFamilyIndex, parent.programBinaries, parent.allocationCallbacks, maxResourceConsumers)
+ , env (parent.vkp, parent.apiVersion, parent.instanceInterface, parent.instance, vkd, *device, deviceRes.queueFamilyIndex, parent.programBinaries, parent.allocationCallbacks, maxResourceConsumers, parent.commandLine)
{
}
};
@@ -2493,13 +2506,15 @@
// Root environment still uses default instance and device, created without callbacks
const Environment rootEnv (context.getPlatformInterface(),
context.getUsedApiVersion(),
+ context.getInstanceInterface(),
context.getInstance(),
context.getDeviceInterface(),
context.getDevice(),
context.getUniversalQueueFamilyIndex(),
context.getBinaryCollection(),
resCallbacks.getCallbacks(),
- 1u);
+ 1u,
+ context.getTestContext().getCommandLine());
{
// Test env has instance & device created with callbacks
@@ -2510,13 +2525,15 @@
AllocationCallbackRecorder objCallbacks(getSystemAllocator(), 128);
const Environment objEnv (resEnv.env.vkp,
resEnv.env.apiVersion,
+ resEnv.env.instanceInterface,
resEnv.env.instance,
resEnv.env.vkd,
resEnv.env.device,
resEnv.env.queueFamilyIndex,
resEnv.env.programBinaries,
objCallbacks.getCallbacks(),
- resEnv.env.maxResourceConsumers);
+ resEnv.env.maxResourceConsumers,
+ resEnv.env.commandLine);
{
Unique<typename Object::Type> obj (Object::create(objEnv, res, params));
@@ -2547,13 +2564,15 @@
AllocationCallbackRecorder resCallbacks (getSystemAllocator(), 128);
const Environment rootEnv (context.getPlatformInterface(),
context.getUsedApiVersion(),
+ context.getInstanceInterface(),
context.getInstance(),
context.getDeviceInterface(),
context.getDevice(),
context.getUniversalQueueFamilyIndex(),
context.getBinaryCollection(),
resCallbacks.getCallbacks(),
- 1u);
+ 1u,
+ context.getTestContext().getCommandLine());
deUint32 numPassingAllocs = 0;
const deUint32 cmdLineIterCount = (deUint32)context.getTestContext().getCommandLine().getTestIterationCount();
const deUint32 maxTries = cmdLineIterCount != 0 ? cmdLineIterCount : getOomIterLimit<Object>();
@@ -2571,13 +2590,15 @@
AllocationCallbackRecorder recorder (objAllocator.getCallbacks(), 128);
const Environment objEnv (resEnv.env.vkp,
resEnv.env.apiVersion,
+ resEnv.env.instanceInterface,
resEnv.env.instance,
resEnv.env.vkd,
resEnv.env.device,
resEnv.env.queueFamilyIndex,
resEnv.env.programBinaries,
recorder.getCallbacks(),
- resEnv.env.maxResourceConsumers);
+ resEnv.env.maxResourceConsumers,
+ resEnv.env.commandLine);
bool createOk = false;
context.getTestContext().getLog()
@@ -2660,13 +2681,15 @@
AllocationCallbackRecorder recorder (objAllocator.getCallbacks(), 128);
const Environment objEnv (context.getPlatformInterface(),
context.getUsedApiVersion(),
+ context.getInstanceInterface(),
context.getInstance(),
context.getDeviceInterface(),
context.getDevice(),
context.getUniversalQueueFamilyIndex(),
context.getBinaryCollection(),
recorder.getCallbacks(),
- numObjects);
+ numObjects,
+ context.getTestContext().getCommandLine());
context.getTestContext().getLog()
<< TestLog::Message
diff --git a/external/vulkancts/modules/vulkan/api/vktApiVersionCheck.cpp b/external/vulkancts/modules/vulkan/api/vktApiVersionCheck.cpp
index d441f85..0cc13d6 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiVersionCheck.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiVersionCheck.cpp
@@ -31,6 +31,7 @@
#include "tcuTestLog.hpp"
#include "tcuFunctionLibrary.hpp"
#include "tcuPlatform.hpp"
+#include "tcuCommandLine.hpp"
#include "vkApiVersion.hpp"
#include "vkDefs.hpp"
@@ -38,6 +39,7 @@
#include "vktApiVersionCheck.hpp"
#include "vktTestCase.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkDeviceUtil.hpp"
#include "vkQueryUtil.hpp"
@@ -114,6 +116,14 @@
class APIEntryPointsTestInstance : public TestInstance
{
public:
+ struct APIContext
+ {
+ VkInstance instance;
+ VkDevice device;
+ GetInstanceProcAddrFunc getInstanceProcAddr;
+ GetDeviceProcAddrFunc getDeviceProcAddr;
+ };
+
APIEntryPointsTestInstance (Context& ctx)
: TestInstance (ctx)
{
@@ -131,10 +141,11 @@
// Tests with default instance and device without extensions
{
- instance = createDefaultInstance(m_context.getPlatformInterface(), m_context.getUsedApiVersion());
- device = createTestDevice(m_context.getPlatformInterface(), m_context.getInstanceInterface(), m_context.getPhysicalDevice());
- getInstanceProcAddr = reinterpret_cast<GetInstanceProcAddrFunc>(funcLibrary.getFunction("vkGetInstanceProcAddr"));
- getDeviceProcAddr = reinterpret_cast<GetDeviceProcAddrFunc>(getInstanceProcAddr(*instance, "vkGetDeviceProcAddr"));
+ CustomInstance instance = createCustomInstanceFromContext(m_context, DE_NULL, false);
+ Move<VkDevice> device = createTestDevice(m_context, instance, vector<string>(), false);
+ GetInstanceProcAddrFunc getInstanceProcAddr = reinterpret_cast<GetInstanceProcAddrFunc>(funcLibrary.getFunction("vkGetInstanceProcAddr"));
+ GetDeviceProcAddrFunc getDeviceProcAddr = reinterpret_cast<GetDeviceProcAddrFunc>(getInstanceProcAddr(instance, "vkGetDeviceProcAddr"));
+ APIContext ctx = { instance, *device, getInstanceProcAddr, getDeviceProcAddr };
// Check entry points of core functions
{
@@ -149,11 +160,11 @@
}
log << tcu::TestLog::Message << "Regular check - tries to get core functions from proper vkGet*ProcAddr." << tcu::TestLog::EndMessage;
- const char* const regularResult = regularCheck(log, failsQuantity, lastGoodVersion->second) ? "Passed" : "Failed";
+ const char* const regularResult = regularCheck(ctx, log, failsQuantity, lastGoodVersion->second) ? "Passed" : "Failed";
log << tcu::TestLog::Message << regularResult << tcu::TestLog::EndMessage;
log << tcu::TestLog::Message << "Cross check - tries to get core functions from improper vkGet*ProcAddr." << tcu::TestLog::EndMessage;
- const char* const mixupResult = mixupAddressProcCheck(log, failsQuantity, lastGoodVersion->second) ? "Passed" : "Failed";
+ const char* const mixupResult = mixupAddressProcCheck(ctx, log, failsQuantity, lastGoodVersion->second) ? "Passed" : "Failed";
log << tcu::TestLog::Message << mixupResult << tcu::TestLog::EndMessage;
}
@@ -172,7 +183,7 @@
extFunctions.push_back(FunctionInfo("vkGetImageMemoryRequirements2KHR", FUNCTIONORIGIN_DEVICE));
log << tcu::TestLog::Message << "Disabled extensions check - tries to get functions of disabled extensions from proper vkGet*ProcAddr." << tcu::TestLog::EndMessage;
- const char * const result = specialCasesCheck(log, failsQuantity, extFunctions) ? "Passed" : "Failed";
+ const char * const result = specialCasesCheck(ctx, log, failsQuantity, extFunctions) ? "Passed" : "Failed";
log << tcu::TestLog::Message << result << tcu::TestLog::EndMessage;
}
@@ -188,17 +199,18 @@
}
log << tcu::TestLog::Message << "Special check - tries to get some dummy functions from various vkGet*ProcAddr." << tcu::TestLog::EndMessage;
- const char * const result = specialCasesCheck(log, failsQuantity, dummyFunctions) ? "Passed" : "Failed";
+ const char * const result = specialCasesCheck(ctx, log, failsQuantity, dummyFunctions) ? "Passed" : "Failed";
log << tcu::TestLog::Message << result << tcu::TestLog::EndMessage;
}
}
// Tests with instance and device with extensions
{
- instance = createInstanceWithExtensions(m_context.getPlatformInterface(), m_context.getUsedApiVersion(), getSupportedInstanceExtensions(apiVersion));
- device = createTestDevice(m_context.getPlatformInterface(), m_context.getInstanceInterface(), m_context.getPhysicalDevice(), getSupportedDeviceExtensions(apiVersion));
- getInstanceProcAddr = reinterpret_cast<GetInstanceProcAddrFunc>(funcLibrary.getFunction("vkGetInstanceProcAddr"));
- getDeviceProcAddr = reinterpret_cast<GetDeviceProcAddrFunc>(getInstanceProcAddr(*instance, "vkGetDeviceProcAddr"));
+ CustomInstance instance = createCustomInstanceWithExtensions(m_context, getSupportedInstanceExtensions(apiVersion), DE_NULL, false);
+ Move<VkDevice> device = createTestDevice(m_context, instance, getSupportedDeviceExtensions(apiVersion), false);
+ GetInstanceProcAddrFunc getInstanceProcAddr = reinterpret_cast<GetInstanceProcAddrFunc>(funcLibrary.getFunction("vkGetInstanceProcAddr"));
+ GetDeviceProcAddrFunc getDeviceProcAddr = reinterpret_cast<GetDeviceProcAddrFunc>(getInstanceProcAddr(instance, "vkGetDeviceProcAddr"));
+ APIContext ctx = { instance, *device, getInstanceProcAddr, getDeviceProcAddr };
// Check function entry points of enabled extensions
{
@@ -229,7 +241,7 @@
}
log << tcu::TestLog::Message << "Enabled extensions check - tries to get functions of supported extensions from proper vkGet*ProcAddr." << tcu::TestLog::EndMessage;
- const char * const result = regularCheck(log, failsQuantity, extFunctions) ? "Passed" : "Failed";
+ const char * const result = regularCheck(ctx, log, failsQuantity, extFunctions) ? "Passed" : "Failed";
log << tcu::TestLog::Message << result << tcu::TestLog::EndMessage;
}
}
@@ -242,11 +254,6 @@
private:
- GetDeviceProcAddrFunc getDeviceProcAddr;
- GetInstanceProcAddrFunc getInstanceProcAddr;
- Move<VkInstance> instance;
- Move<VkDevice> device;
-
deUint32 findQueueFamilyIndex(const InstanceInterface& vkInstance, VkPhysicalDevice physicalDevice, VkQueueFlags requiredCaps)
{
deUint32 numQueues = 0;
@@ -314,8 +321,12 @@
return filterMultiAuthorExtensions(supportedExtensions);
}
- Move<VkDevice> createTestDevice (const PlatformInterface& vkp, const InstanceInterface& vki, VkPhysicalDevice physicalDevice, vector<string> extensions = vector<string>())
+ Move<VkDevice> createTestDevice (const Context& context, VkInstance instance, vector<string> extensions = vector<string>(), bool allowLayers = true)
{
+ auto& cmdLine = context.getTestContext().getCommandLine();
+ const PlatformInterface& vkp = context.getPlatformInterface();
+ const InstanceInterface& vki = context.getInstanceInterface();
+ VkPhysicalDevice physicalDevice = chooseDevice(context.getInstanceInterface(), instance, cmdLine);
vector<const char*> extensionPtrs;
const float queuePriority = 1.0f;
const deUint32 queueIndex = findQueueFamilyIndex(vki, physicalDevice, VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT);
@@ -331,7 +342,8 @@
1u,
&queuePriority
};
- VkDeviceCreateInfo deviceInfo = {
+
+ const VkDeviceCreateInfo deviceInfo = {
VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
DE_NULL,
static_cast<VkDeviceCreateFlags>(0u),
@@ -344,7 +356,8 @@
DE_NULL,
};
- return vk::createDevice(vkp, *instance, vki, physicalDevice, &deviceInfo);
+ const bool validationEnabled = (cmdLine.isValidationEnabled() && allowLayers);
+ return createCustomDevice(validationEnabled, vkp, instance, vki, physicalDevice, &deviceInfo);
}
void reportFail (tcu::TestLog& log, const char* const functionName, const char* const firstParamName, const char* const secondParamName, deBool shouldBeNonNull, deUint32& failsQuantity)
@@ -356,21 +369,21 @@
++failsQuantity;
}
- void checkPlatformFunction (tcu::TestLog& log, const char* const name, deBool shouldBeNonNull, deUint32& failsQuantity)
+ void checkPlatformFunction (const APIContext& ctx, tcu::TestLog& log, const char* const name, deBool shouldBeNonNull, deUint32& failsQuantity)
{
- if ((getInstanceProcAddr(DE_NULL, name) == DE_NULL) == shouldBeNonNull)
+ if ((ctx.getInstanceProcAddr(DE_NULL, name) == DE_NULL) == shouldBeNonNull)
reportFail(log, "vkGetInstanceProcAddr", "DE_NULL", name, shouldBeNonNull, failsQuantity);
}
- void checkInstanceFunction (tcu::TestLog& log, const char* const name, deBool shouldBeNonNull, deUint32& failsQuantity)
+ void checkInstanceFunction (const APIContext& ctx, tcu::TestLog& log, const char* const name, deBool shouldBeNonNull, deUint32& failsQuantity)
{
- if ((getInstanceProcAddr(*instance, name) == DE_NULL) == shouldBeNonNull)
+ if ((ctx.getInstanceProcAddr(ctx.instance, name) == DE_NULL) == shouldBeNonNull)
reportFail(log, "vkGetInstanceProcAddr", "instance", name, shouldBeNonNull, failsQuantity);
}
- void checkDeviceFunction (tcu::TestLog& log, const char* const name, deBool shouldBeNonNull, deUint32& failsQuantity)
+ void checkDeviceFunction (const APIContext& ctx, tcu::TestLog& log, const char* const name, deBool shouldBeNonNull, deUint32& failsQuantity)
{
- if ((getDeviceProcAddr(*device, name) == DE_NULL) == shouldBeNonNull)
+ if ((ctx.getDeviceProcAddr(ctx.device, name) == DE_NULL) == shouldBeNonNull)
reportFail(log, "vkGetDeviceProcAddr", "device", name, shouldBeNonNull, failsQuantity);
}
@@ -388,7 +401,7 @@
return de::contains(supportedDeviceExtensions.begin(), supportedDeviceExtensions.end(), extName);
}
- deBool mixupAddressProcCheck (tcu::TestLog& log, deUint32& failsQuantity, const vector<pair<const char*, FunctionOrigin> >& testsArr)
+ deBool mixupAddressProcCheck (const APIContext& ctx, tcu::TestLog& log, deUint32& failsQuantity, const vector<pair<const char*, FunctionOrigin> >& testsArr)
{
const deUint32 startingQuantity = failsQuantity;
for (deUint32 ndx = 0u; ndx < testsArr.size(); ++ndx)
@@ -400,32 +413,32 @@
const deUint32 functionType = testsArr[ndx].second;
if (functionType == FUNCTIONORIGIN_INSTANCE)
{
- checkPlatformFunction(log, functionName, DE_FALSE, failsQuantity);
- checkDeviceFunction(log, functionName, DE_FALSE, failsQuantity);
+ checkPlatformFunction(ctx, log, functionName, DE_FALSE, failsQuantity);
+ checkDeviceFunction(ctx, log, functionName, DE_FALSE, failsQuantity);
}
else if (functionType == FUNCTIONORIGIN_DEVICE)
- checkPlatformFunction(log, functionName, DE_FALSE, failsQuantity);
+ checkPlatformFunction(ctx, log, functionName, DE_FALSE, failsQuantity);
}
return startingQuantity == failsQuantity;
}
- deBool specialCasesCheck (tcu::TestLog& log, deUint32& failsQuantity, const vector<pair<const char*, FunctionOrigin> >& testsArr)
+ deBool specialCasesCheck (const APIContext& ctx, tcu::TestLog& log, deUint32& failsQuantity, const vector<pair<const char*, FunctionOrigin> >& testsArr)
{
const deUint32 startingQuantity = failsQuantity;
for (deUint32 ndx = 0u; ndx < testsArr.size(); ++ndx)
{
const deUint32 functionType = testsArr[ndx].second;
if (functionType == FUNCTIONORIGIN_PLATFORM)
- checkPlatformFunction(log, testsArr[ndx].first, DE_FALSE, failsQuantity);
+ checkPlatformFunction(ctx, log, testsArr[ndx].first, DE_FALSE, failsQuantity);
else if (functionType == FUNCTIONORIGIN_INSTANCE)
- checkInstanceFunction(log, testsArr[ndx].first, DE_FALSE, failsQuantity);
+ checkInstanceFunction(ctx, log, testsArr[ndx].first, DE_FALSE, failsQuantity);
else if (functionType == FUNCTIONORIGIN_DEVICE)
- checkDeviceFunction(log, testsArr[ndx].first, DE_FALSE, failsQuantity);
+ checkDeviceFunction(ctx, log, testsArr[ndx].first, DE_FALSE, failsQuantity);
}
return startingQuantity == failsQuantity;
}
- deBool regularCheck (tcu::TestLog& log, deUint32& failsQuantity, const vector<pair<const char*, FunctionOrigin> >& testsArr)
+ deBool regularCheck (const APIContext& ctx, tcu::TestLog& log, deUint32& failsQuantity, const vector<pair<const char*, FunctionOrigin> >& testsArr)
{
const deUint32 startingQuantity = failsQuantity;
for (deUint32 ndx = 0u; ndx < testsArr.size(); ++ndx)
@@ -435,11 +448,11 @@
const deUint32 functionType = testsArr[ndx].second;
if (functionType == FUNCTIONORIGIN_PLATFORM)
- checkPlatformFunction(log, testsArr[ndx].first, DE_TRUE, failsQuantity);
+ checkPlatformFunction(ctx, log, testsArr[ndx].first, DE_TRUE, failsQuantity);
else if (functionType == FUNCTIONORIGIN_INSTANCE)
- checkInstanceFunction(log, testsArr[ndx].first, DE_TRUE, failsQuantity);
+ checkInstanceFunction(ctx, log, testsArr[ndx].first, DE_TRUE, failsQuantity);
else if (functionType == FUNCTIONORIGIN_DEVICE)
- checkDeviceFunction(log, testsArr[ndx].first, DE_TRUE, failsQuantity);
+ checkDeviceFunction(ctx, log, testsArr[ndx].first, DE_TRUE, failsQuantity);
}
return startingQuantity == failsQuantity;
}
diff --git a/external/vulkancts/modules/vulkan/binding_model/vktBindingBufferDeviceAddressTests.cpp b/external/vulkancts/modules/vulkan/binding_model/vktBindingBufferDeviceAddressTests.cpp
index fc75adb..8083257 100644
--- a/external/vulkancts/modules/vulkan/binding_model/vktBindingBufferDeviceAddressTests.cpp
+++ b/external/vulkancts/modules/vulkan/binding_model/vktBindingBufferDeviceAddressTests.cpp
@@ -56,6 +56,9 @@
using namespace vk;
using namespace std;
+typedef de::MovePtr<Unique<VkBuffer> > VkBufferSp;
+typedef de::MovePtr<Allocation> AllocationSp;
+
static const deUint32 DIM = 8;
typedef enum
@@ -87,13 +90,20 @@
LAYOUT_SCALAR,
} Layout;
+typedef enum
+{
+ CONVERT_NONE = 0,
+ CONVERT_UTOPTR,
+ CONVERT_UVEC2,
+} Convert;
+
struct CaseDef
{
deUint32 set;
deUint32 depth;
Base base;
Stage stage;
- bool convertUToPtr;
+ Convert convertUToPtr;
bool storeInLocal;
BufType bufType;
Layout layout;
@@ -154,7 +164,7 @@
void BufferAddressTestCase::checkSupport (Context& context) const
{
- if (!context.getBufferDeviceAddressFeatures().bufferDeviceAddress)
+ if (!context.isBufferDeviceAddressSupported())
TCU_THROW(NotSupportedError, "Physical storage buffer pointers not supported");
if (m_data.stage == STAGE_VERTEX && !context.getDeviceFeatures().vertexPipelineStoresAndAtomics)
@@ -163,11 +173,10 @@
if (m_data.set >= context.getDeviceProperties().limits.maxBoundDescriptorSets)
TCU_THROW(NotSupportedError, "descriptor set number not supported");
- if (m_data.convertUToPtr == VK_TRUE && !context.getDeviceFeatures().shaderInt64)
- TCU_THROW(NotSupportedError, "64-bit integers in shader not supported");
-
- if (m_data.bufType == BT_REPLAY &&
- !context.getBufferDeviceAddressFeatures().bufferDeviceAddressCaptureReplay)
+ bool isBufferDeviceAddressWithCaptureReplaySupported =
+ (context.isDeviceFunctionalitySupported("VK_KHR_buffer_device_address") && context.getBufferDeviceAddressFeatures().bufferDeviceAddressCaptureReplay) ||
+ (context.isDeviceFunctionalitySupported("VK_EXT_buffer_device_address") && context.getBufferDeviceAddressFeaturesEXT().bufferDeviceAddressCaptureReplay);
+ if (m_data.bufType == BT_REPLAY && !isBufferDeviceAddressWithCaptureReplaySupported)
TCU_THROW(NotSupportedError, "Capture/replay of physical storage buffer pointers not supported");
if (m_data.layout == LAYOUT_SCALAR && !context.getScalarBlockLayoutFeatures().scalarBlockLayout)
@@ -175,18 +184,28 @@
#if ENABLE_RAYTRACING
if (m_data.stage == STAGE_RAYGEN &&
- !isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_NV_ray_tracing"))
+ !context.isDeviceFunctionalitySupported("VK_NV_ray_tracing"))
{
TCU_THROW(NotSupportedError, "Ray tracing not supported");
}
#endif
+
+ if (m_data.convertUToPtr == CONVERT_UTOPTR && !context.getDeviceFeatures().shaderInt64)
+ TCU_THROW(NotSupportedError, "Int64 not supported");
+ if (m_data.convertUToPtr == CONVERT_UVEC2 && !context.isDeviceFunctionalitySupported("VK_KHR_buffer_device_address"))
+ TCU_THROW(NotSupportedError, "VK_KHR_buffer_device_address not supported");
}
void BufferAddressTestCase::checkBuffer (std::stringstream& checks, deUint32 bufNum, deUint32 curDepth, const std::string &prefix) const
{
string newPrefix = prefix;
- if (curDepth > 0 && m_data.convertUToPtr)
- newPrefix = "T1(uint64_t(T1(" + newPrefix + ")))";
+ if (curDepth > 0)
+ {
+ if (m_data.convertUToPtr == CONVERT_UTOPTR)
+ newPrefix = "T1(uint64_t(T1(" + newPrefix + ")))";
+ else if (m_data.convertUToPtr == CONVERT_UVEC2)
+ newPrefix = "T1(uvec2(T1(" + newPrefix + ")))";
+ }
if (m_data.storeInLocal && curDepth != 0)
{
@@ -271,7 +290,7 @@
decls << "layout(r32ui, set = " << m_data.set << ", binding = 0) uniform uimage2D image0_0;\n";
decls << "layout(buffer_reference) " << memberStorage << " T1;\n";
- std::string refType = m_data.convertUToPtr ? "uint64_t" : "T1";
+ std::string refType = m_data.convertUToPtr == CONVERT_UTOPTR ? "uint64_t" : m_data.convertUToPtr == CONVERT_UVEC2 ? "uvec2" : "T1";
std::string layout = m_data.layout == LAYOUT_SCALAR ? "scalar" : "std140";
decls <<
"layout(set = " << m_data.set << ", binding = 1, " << layout << ") " << baseStorage << " T2 {\n"
@@ -312,6 +331,7 @@
"#extension GL_EXT_shader_explicit_arithmetic_types_int64 : enable\n"
"#extension GL_EXT_buffer_reference : enable\n"
"#extension GL_EXT_scalar_block_layout : enable\n"
+ "#extension GL_EXT_buffer_reference_uvec2 : enable\n"
<< pushdecl.str()
<< decls.str() <<
"layout(local_size_x = 1, local_size_y = 1) in;\n"
@@ -337,6 +357,7 @@
"#extension GL_EXT_shader_explicit_arithmetic_types_int64 : enable\n"
"#extension GL_EXT_buffer_reference : enable\n"
"#extension GL_EXT_scalar_block_layout : enable\n"
+ "#extension GL_EXT_buffer_reference_uvec2 : enable\n"
"#extension GL_NV_ray_tracing : require\n"
<< pushdecl.str()
<< decls.str() <<
@@ -362,6 +383,7 @@
"#extension GL_EXT_shader_explicit_arithmetic_types_int64 : enable\n"
"#extension GL_EXT_buffer_reference : enable\n"
"#extension GL_EXT_scalar_block_layout : enable\n"
+ "#extension GL_EXT_buffer_reference_uvec2 : enable\n"
<< pushdecl.str()
<< decls.str() <<
"void main()\n"
@@ -397,6 +419,7 @@
"#extension GL_EXT_shader_explicit_arithmetic_types_int64 : enable\n"
"#extension GL_EXT_buffer_reference : enable\n"
"#extension GL_EXT_scalar_block_layout : enable\n"
+ "#extension GL_EXT_buffer_reference_uvec2 : enable\n"
<< pushdecl.str()
<< decls.str() <<
"void main()\n"
@@ -440,26 +463,14 @@
return bufferCreateInfo;
}
-VkBufferImageCopy makeBufferImageCopy (const VkExtent3D extent,
- const VkImageSubresourceLayers subresourceLayers)
-{
- const VkBufferImageCopy copyParams =
- {
- 0ull, // VkDeviceSize bufferOffset;
- 0u, // deUint32 bufferRowLength;
- 0u, // deUint32 bufferImageHeight;
- subresourceLayers, // VkImageSubresourceLayers imageSubresource;
- makeOffset3D(0, 0, 0), // VkOffset3D imageOffset;
- extent, // VkExtent3D imageExtent;
- };
- return copyParams;
-}
-
tcu::TestStatus BufferAddressTestInstance::iterate (void)
{
+ const InstanceInterface&vki = m_context.getInstanceInterface();
const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkPhysicalDevice& physDevice = m_context.getPhysicalDevice();
const VkDevice device = m_context.getDevice();
Allocator& allocator = m_context.getDefaultAllocator();
+ const bool useKHR = m_context.isDeviceFunctionalitySupported("VK_KHR_buffer_device_address");
VkFlags allShaderStages = VK_SHADER_STAGE_COMPUTE_BIT | VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT;
@@ -482,7 +493,7 @@
deMemset(&rayTracingProperties, 0, sizeof(rayTracingProperties));
rayTracingProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV;
- if (isDeviceExtensionSupported(m_context.getUsedApiVersion(), m_context.getDeviceExtensions(), "VK_NV_ray_tracing"))
+ if (context.isDeviceFunctionalitySupported("VK_NV_ray_tracing")))
{
properties.pNext = &rayTracingProperties;
}
@@ -555,60 +566,130 @@
numBindings = numBindings*3+1;
}
- VkBufferDeviceAddressCreateInfoEXT addressCreateInfo =
+ VkBufferDeviceAddressCreateInfoEXT addressCreateInfoEXT =
{
VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT, // VkStructureType sType;
DE_NULL, // const void* pNext;
- 0x000000000ULL, // VkDeviceSize deviceAddress
+ 0x000000000ULL, // VkDeviceSize deviceAddress
+ };
+
+ VkBufferOpaqueCaptureAddressCreateInfo bufferOpaqueCaptureAddressCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0x000000000ULL, // VkDeviceSize opaqueCaptureAddress
};
std::vector<deUint8 *> cpuAddrs(numBindings);
std::vector<VkDeviceAddress> gpuAddrs(numBindings);
+ std::vector<deUint64> opaqueBufferAddrs(numBindings);
+ std::vector<deUint64> opaqueMemoryAddrs(numBindings);
- VkBufferDeviceAddressInfoEXT info =
+ VkBufferDeviceAddressInfo bufferDeviceAddressInfo =
{
- VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0, // VkBuffer buffer
+ VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0, // VkBuffer buffer
+ };
+
+ VkDeviceMemoryOpaqueCaptureAddressInfo deviceMemoryOpaqueCaptureAddressInfo =
+ {
+ VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0, // VkDeviceMemory memory;
};
bool multiBuffer = m_data.bufType != BT_SINGLE;
deUint32 numBuffers = multiBuffer ? numBindings : 1;
VkDeviceSize bufferSize = multiBuffer ? align : (align*numBindings);
- vector<de::SharedPtr<BufferWithMemory> > buffers(numBuffers);
- for (deUint32 i = 0; i < numBuffers; ++i)
- {
- buffers[i] = de::SharedPtr<BufferWithMemory>(new BufferWithMemory(
- vk, device, allocator, makeBufferCreateInfo(DE_NULL, bufferSize,
+ vector<VkBufferSp> buffers(numBuffers);
+ vector<AllocationSp> allocations(numBuffers);
+
+ VkBufferCreateInfo bufferCreateInfo = makeBufferCreateInfo(DE_NULL, bufferSize,
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT |
- VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT,
- m_data.bufType == BT_REPLAY ? VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_EXT : 0),
- MemoryRequirement::HostVisible));
+ VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
+ m_data.bufType == BT_REPLAY ? VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT : 0);
+
+ // VkMemoryAllocateFlags to be filled out later
+ VkMemoryAllocateFlagsInfo allocFlagsInfo =
+ {
+ VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ 0, // VkMemoryAllocateFlags flags
+ 0, // uint32_t deviceMask
+ };
+
+ VkMemoryOpaqueCaptureAddressAllocateInfo memoryOpaqueCaptureAddressAllocateInfo =
+ {
+ VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0, // uint64_t opaqueCaptureAddress;
+ };
+
+ if (useKHR)
+ allocFlagsInfo.flags |= VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT;
+
+ if (useKHR && m_data.bufType == BT_REPLAY)
+ {
+ allocFlagsInfo.flags |= VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT;
+ allocFlagsInfo.pNext = &memoryOpaqueCaptureAddressAllocateInfo;
+ }
+
+ for (deUint32 i = 0; i < numBuffers; ++i)
+ {
+ buffers[i] = VkBufferSp(new Unique<VkBuffer>(createBuffer(vk, device, &bufferCreateInfo)));
+
+ // query opaque capture address before binding memory
+ if (useKHR) {
+ bufferDeviceAddressInfo.buffer = **buffers[i];
+ opaqueBufferAddrs[i] = vk.getBufferOpaqueCaptureAddress(device, &bufferDeviceAddressInfo);
+ }
+
+ allocations[i] = AllocationSp(allocateExtended(vki, vk, physDevice, device, getBufferMemoryRequirements(vk, device, **buffers[i]), MemoryRequirement::HostVisible, &allocFlagsInfo));
+
+ if (useKHR) {
+ deviceMemoryOpaqueCaptureAddressInfo.memory = allocations[i]->getMemory();
+ opaqueMemoryAddrs[i] = vk.getDeviceMemoryOpaqueCaptureAddress(device, &deviceMemoryOpaqueCaptureAddressInfo);
+ }
+
+ VK_CHECK(vk.bindBufferMemory(device, **buffers[i], allocations[i]->getMemory(), 0));
}
if (m_data.bufType == BT_REPLAY)
{
for (deUint32 i = 0; i < numBuffers; ++i)
{
- info.buffer = **buffers[i];
- gpuAddrs[i] = vk.getBufferDeviceAddressEXT(device, &info);
+ bufferDeviceAddressInfo.buffer = **buffers[i];
+ if (useKHR)
+ gpuAddrs[i] = vk.getBufferDeviceAddress(device, &bufferDeviceAddressInfo);
+ else
+ gpuAddrs[i] = vk.getBufferDeviceAddressEXT(device, &bufferDeviceAddressInfo);
}
buffers.clear();
buffers.resize(numBuffers);
+ allocations.clear();
+ allocations.resize(numBuffers);
+
+ bufferCreateInfo.pNext = useKHR ? (void *)&bufferOpaqueCaptureAddressCreateInfo : (void *)&addressCreateInfoEXT;
+
for (deInt32 i = numBuffers-1; i >= 0; --i)
{
- addressCreateInfo.deviceAddress = gpuAddrs[i];
- buffers[i] = de::SharedPtr<BufferWithMemory>(new BufferWithMemory(
- vk, device, allocator, makeBufferCreateInfo(&addressCreateInfo, bufferSize,
- VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
- VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT |
- VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT,
- m_data.bufType == BT_REPLAY ? VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_EXT : 0),
- MemoryRequirement::HostVisible));
- info.buffer = **buffers[i];
- VkDeviceSize newAddr = vk.getBufferDeviceAddressEXT(device, &info);
+ addressCreateInfoEXT.deviceAddress = gpuAddrs[i];
+ bufferOpaqueCaptureAddressCreateInfo.opaqueCaptureAddress = opaqueBufferAddrs[i];
+ memoryOpaqueCaptureAddressAllocateInfo.opaqueCaptureAddress = opaqueMemoryAddrs[i];
+
+ buffers[i] = VkBufferSp(new Unique<VkBuffer>(createBuffer(vk, device, &bufferCreateInfo)));
+ allocations[i] = AllocationSp(allocateExtended(vki, vk, physDevice, device, getBufferMemoryRequirements(vk, device, **buffers[i]), MemoryRequirement::HostVisible, &allocFlagsInfo));
+ VK_CHECK(vk.bindBufferMemory(device, **buffers[i], allocations[i]->getMemory(), 0));
+
+ bufferDeviceAddressInfo.buffer = **buffers[i];
+ VkDeviceSize newAddr;
+ if (useKHR)
+ newAddr = vk.getBufferDeviceAddress(device, &bufferDeviceAddressInfo);
+ else
+ newAddr = vk.getBufferDeviceAddressEXT(device, &bufferDeviceAddressInfo);
if (newAddr != gpuAddrs[i])
return tcu::TestStatus(QP_TEST_RESULT_FAIL, "address mismatch");
}
@@ -617,10 +698,13 @@
// Create a buffer and compute the address for each "align" bytes.
for (deUint32 i = 0; i < numBindings; ++i)
{
- info.buffer = **buffers[multiBuffer ? i : 0];
+ bufferDeviceAddressInfo.buffer = **buffers[multiBuffer ? i : 0];
- gpuAddrs[i] = vk.getBufferDeviceAddressEXT(device, &info);
- cpuAddrs[i] = (deUint8 *)buffers[multiBuffer ? i : 0]->getAllocation().getHostPtr();
+ if (useKHR)
+ gpuAddrs[i] = vk.getBufferDeviceAddress(device, &bufferDeviceAddressInfo);
+ else
+ gpuAddrs[i] = vk.getBufferDeviceAddressEXT(device, &bufferDeviceAddressInfo);
+ cpuAddrs[i] = (deUint8 *)allocations[multiBuffer ? i : 0]->getHostPtr();
if (!multiBuffer)
{
cpuAddrs[i] = cpuAddrs[i] + align*i;
@@ -632,7 +716,7 @@
fillBuffer(cpuAddrs, gpuAddrs, 0, 0);
for (deUint32 i = 0; i < numBuffers; ++i)
- flushAlloc(vk, device, buffers[i]->getAllocation());
+ flushAlloc(vk, device, *allocations[i]);
const VkQueue queue = m_context.getUniversalQueue();
Move<VkCommandPool> cmdPool = createCommandPool(vk, device, 0, m_context.getUniversalQueueFamilyIndex());
@@ -1169,8 +1253,9 @@
TestGroupCase cvtCases[] =
{
- { 0, "load", "load reference" },
- { 1, "convert", "load and convert reference" },
+ { CONVERT_NONE, "load", "load reference" },
+ { CONVERT_UTOPTR, "convert", "load and convert reference" },
+ { CONVERT_UVEC2, "convertuvec2", "load and convert reference to uvec2" },
};
TestGroupCase storeCases[] =
@@ -1231,7 +1316,7 @@
depthCases[depthNdx].count, // deUint32 depth;
(Base)baseCases[baseNdx].count, // Base base;
(Stage)stageCases[stageNdx].count, // Stage stage;
- !!cvtCases[cvtNdx].count, // bool convertUToPtr;
+ (Convert)cvtCases[cvtNdx].count, // Convert convertUToPtr;
!!storeCases[storeNdx].count, // bool storeInLocal;
(BufType)btCases[btNdx].count, // BufType bufType;
(Layout)layoutCases[layoutNdx].count, // Layout layout;
diff --git a/external/vulkancts/modules/vulkan/binding_model/vktBindingDescriptorSetRandomTests.cpp b/external/vulkancts/modules/vulkan/binding_model/vktBindingDescriptorSetRandomTests.cpp
index bb1ca16..16438d4 100644
--- a/external/vulkancts/modules/vulkan/binding_model/vktBindingDescriptorSetRandomTests.cpp
+++ b/external/vulkancts/modules/vulkan/binding_model/vktBindingDescriptorSetRandomTests.cpp
@@ -58,6 +58,7 @@
#include <string>
#include <sstream>
+#include <algorithm>
namespace vkt
{
@@ -107,11 +108,29 @@
deUint32 maxPerStageStorageImages;
deUint32 maxInlineUniformBlocks;
deUint32 maxInlineUniformBlockSize;
+ deUint32 maxPerStageInputAttachments;
Stage stage;
UpdateAfterBind uab;
deUint32 seed;
};
+static void getNeededFeatures(const Context& context,
+ VkPhysicalDeviceFeatures2& features,
+ VkPhysicalDeviceInlineUniformBlockFeaturesEXT& inlineUniformFeatures,
+ VkPhysicalDeviceDescriptorIndexingFeatures& indexingFeatures)
+{
+ inlineUniformFeatures = initVulkanStructure();
+ indexingFeatures = initVulkanStructure();
+ features = initVulkanStructure();
+
+ void** nextPtr = &features.pNext;
+ if (context.isDeviceFunctionalitySupported("VK_EXT_descriptor_indexing"))
+ addToChainVulkanStructure(&nextPtr, indexingFeatures);
+ if (context.isDeviceFunctionalitySupported("VK_EXT_inline_uniform_block"))
+ addToChainVulkanStructure(&nextPtr, inlineUniformFeatures);
+
+ context.getInstanceInterface().getPhysicalDeviceFeatures2(context.getPhysicalDevice(), &features);
+}
class RandomLayout
{
@@ -126,7 +145,7 @@
// These three are indexed by [set][binding]
vector<vector<VkDescriptorSetLayoutBinding> > layoutBindings;
- vector<vector<VkDescriptorBindingFlagsEXT> > layoutBindingFlags;
+ vector<vector<VkDescriptorBindingFlags> > layoutBindingFlags;
vector<vector<deUint32> > arraySizes;
// size of the variable descriptor (last) binding in each set
vector<deUint32> variableDescriptorSizes;
@@ -142,12 +161,6 @@
tcu::TestStatus iterate (void);
private:
CaseDef m_data;
-
- enum
- {
- WIDTH = 256,
- HEIGHT = 256
- };
};
DescriptorSetRandomTestInstance::DescriptorSetRandomTestInstance (Context& context, const CaseDef& data)
@@ -193,39 +206,17 @@
deMemset(&properties, 0, sizeof(properties));
properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
- if (isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_EXT_inline_uniform_block"))
+ if (context.isDeviceFunctionalitySupported("VK_EXT_inline_uniform_block"))
{
properties.pNext = &inlineUniformProperties;
}
context.getInstanceInterface().getPhysicalDeviceProperties2(context.getPhysicalDevice(), &properties);
- VkPhysicalDeviceInlineUniformBlockFeaturesEXT inlineUniformFeatures;
- deMemset(&inlineUniformFeatures, 0, sizeof(inlineUniformFeatures));
- inlineUniformFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT;
-
- VkPhysicalDeviceDescriptorIndexingFeaturesEXT indexingFeatures;
- deMemset(&indexingFeatures, 0, sizeof(indexingFeatures));
- indexingFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT;
-
VkPhysicalDeviceFeatures2 features;
- deMemset(&features, 0, sizeof(features));
- features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
-
- if (isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_EXT_descriptor_indexing") &&
- isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_EXT_inline_uniform_block"))
- {
- indexingFeatures.pNext = &inlineUniformFeatures;
- features.pNext = &indexingFeatures;
- }
- else if (isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_EXT_descriptor_indexing"))
- {
- features.pNext = &indexingFeatures;
- }
- else if (isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_EXT_inline_uniform_block"))
- {
- features.pNext = &inlineUniformFeatures;
- }
+ VkPhysicalDeviceDescriptorIndexingFeatures indexingFeatures;
+ VkPhysicalDeviceInlineUniformBlockFeaturesEXT inlineUniformFeatures;
+ getNeededFeatures(context, features, inlineUniformFeatures, indexingFeatures);
context.getInstanceInterface().getPhysicalDeviceFeatures2(context.getPhysicalDevice(), &features);
if (m_data.stage == STAGE_VERTEX && !features.features.vertexPipelineStoresAndAtomics)
@@ -240,6 +231,7 @@
!features.features.shaderStorageBufferArrayDynamicIndexing ||
!features.features.shaderSampledImageArrayDynamicIndexing ||
!features.features.shaderStorageImageArrayDynamicIndexing ||
+ (m_data.stage == STAGE_FRAGMENT && (!indexingFeatures.shaderInputAttachmentArrayDynamicIndexing)) ||
!indexingFeatures.shaderUniformTexelBufferArrayDynamicIndexing ||
!indexingFeatures.shaderStorageTexelBufferArrayDynamicIndexing))
{
@@ -252,18 +244,20 @@
}
if ((m_data.maxPerStageUniformBuffers + m_data.maxPerStageStorageBuffers +
- m_data.maxPerStageSampledImages + m_data.maxPerStageStorageImages) >
+ m_data.maxPerStageSampledImages + m_data.maxPerStageStorageImages +
+ m_data.maxPerStageInputAttachments) >
properties.properties.limits.maxPerStageResources)
{
TCU_THROW(NotSupportedError, "Number of descriptors not supported");
}
- if (m_data.maxPerStageUniformBuffers > properties.properties.limits.maxPerStageDescriptorUniformBuffers ||
- m_data.maxPerStageStorageBuffers > properties.properties.limits.maxPerStageDescriptorStorageBuffers ||
- m_data.maxUniformBuffersDynamic > properties.properties.limits.maxDescriptorSetUniformBuffersDynamic ||
- m_data.maxStorageBuffersDynamic > properties.properties.limits.maxDescriptorSetStorageBuffersDynamic ||
- m_data.maxPerStageSampledImages > properties.properties.limits.maxPerStageDescriptorSampledImages ||
- m_data.maxPerStageStorageImages > properties.properties.limits.maxPerStageDescriptorStorageImages)
+ if (m_data.maxPerStageUniformBuffers > properties.properties.limits.maxPerStageDescriptorUniformBuffers ||
+ m_data.maxPerStageStorageBuffers > properties.properties.limits.maxPerStageDescriptorStorageBuffers ||
+ m_data.maxUniformBuffersDynamic > properties.properties.limits.maxDescriptorSetUniformBuffersDynamic ||
+ m_data.maxStorageBuffersDynamic > properties.properties.limits.maxDescriptorSetStorageBuffersDynamic ||
+ m_data.maxPerStageSampledImages > properties.properties.limits.maxPerStageDescriptorSampledImages ||
+ m_data.maxPerStageStorageImages > properties.properties.limits.maxPerStageDescriptorStorageImages ||
+ m_data.maxPerStageInputAttachments > properties.properties.limits.maxPerStageDescriptorInputAttachments)
{
TCU_THROW(NotSupportedError, "Number of descriptors not supported");
}
@@ -314,6 +308,7 @@
deUint32 numImage = 0;
deUint32 numTexBuffer = 0;
deUint32 numInlineUniformBlocks = 0;
+ deUint32 numInputAttachments = 0;
// TODO: Consider varying these
deUint32 minBindings = 0;
@@ -327,7 +322,7 @@
for (deUint32 s = 0; s < caseDef.numDescriptorSets; ++s)
{
vector<VkDescriptorSetLayoutBinding> &bindings = randomLayout.layoutBindings[s];
- vector<VkDescriptorBindingFlagsEXT> &bindingsFlags = randomLayout.layoutBindingFlags[s];
+ vector<VkDescriptorBindingFlags> &bindingsFlags = randomLayout.layoutBindingFlags[s];
vector<deUint32> &arraySizes = randomLayout.arraySizes[s];
int numBindings = randRange(&rnd, minBindings, maxBindings);
@@ -338,7 +333,7 @@
}
bindings = vector<VkDescriptorSetLayoutBinding>(numBindings);
- bindingsFlags = vector<VkDescriptorBindingFlagsEXT>(numBindings);
+ bindingsFlags = vector<VkDescriptorBindingFlags>(numBindings);
arraySizes = vector<deUint32>(numBindings);
}
@@ -362,13 +357,13 @@
VkDescriptorSetLayoutBinding &binding = bindings[b];
binding.binding = b;
binding.pImmutableSamplers = NULL;
- binding.stageFlags = allShaderStages;
// Output image
if (s == 0 && b == 0)
{
binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
binding.descriptorCount = 1;
+ binding.stageFlags = allShaderStages;
numImage++;
arraySizes[b] = 0;
continue;
@@ -377,12 +372,34 @@
binding.descriptorCount = 0;
// Select a random type of descriptor.
- int r = randRange(&rnd, 0, (allowDynamicBuffers ? 6 : 4));
- switch (r)
+ std::map<int, vk::VkDescriptorType> intToType;
+ {
+ int index = 0;
+ intToType[index++] = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+ intToType[index++] = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
+ intToType[index++] = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
+ intToType[index++] = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
+ intToType[index++] = VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT;
+ if (caseDef.stage == STAGE_FRAGMENT)
+ {
+ intToType[index++] = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
+ }
+ if (allowDynamicBuffers)
+ {
+ intToType[index++] = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
+ intToType[index++] = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC;
+ }
+ }
+
+ int r = randRange(&rnd, 0, static_cast<int>(intToType.size() - 1));
+ DE_ASSERT(r >= 0 && static_cast<size_t>(r) < intToType.size());
+
+ // Add a binding for that descriptor type if possible.
+ binding.descriptorType = intToType[r];
+ switch (binding.descriptorType)
{
default: DE_ASSERT(0); // Fallthrough
- case 0:
- binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+ case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
if (numUBO < caseDef.maxPerStageUniformBuffers)
{
arraySizes[b] = randRange(&rnd, 0, de::min(maxArray, caseDef.maxPerStageUniformBuffers - numUBO));
@@ -390,8 +407,7 @@
numUBO += binding.descriptorCount;
}
break;
- case 1:
- binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
+ case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
if (numSSBO < caseDef.maxPerStageStorageBuffers)
{
arraySizes[b] = randRange(&rnd, 0, de::min(maxArray, caseDef.maxPerStageStorageBuffers - numSSBO));
@@ -399,8 +415,7 @@
numSSBO += binding.descriptorCount;
}
break;
- case 2:
- binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
+ case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
if (numImage < caseDef.maxPerStageStorageImages)
{
arraySizes[b] = randRange(&rnd, 0, de::min(maxArray, caseDef.maxPerStageStorageImages - numImage));
@@ -408,8 +423,7 @@
numImage += binding.descriptorCount;
}
break;
- case 3:
- binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
+ case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
if (numTexBuffer < caseDef.maxPerStageSampledImages)
{
arraySizes[b] = randRange(&rnd, 0, de::min(maxArray, caseDef.maxPerStageSampledImages - numTexBuffer));
@@ -417,10 +431,9 @@
numTexBuffer += binding.descriptorCount;
}
break;
- case 4:
+ case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT:
if (caseDef.maxInlineUniformBlocks > 0)
{
- binding.descriptorType = VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT;
if (numInlineUniformBlocks < caseDef.maxInlineUniformBlocks)
{
arraySizes[b] = randRange(&rnd, 1, (caseDef.maxInlineUniformBlockSize - 16) / 16); // subtract 16 for "ivec4 dummy"
@@ -436,8 +449,7 @@
binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
}
break;
- case 5:
- binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
+ case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
if (numUBODyn < caseDef.maxUniformBuffersDynamic &&
numUBO < caseDef.maxPerStageUniformBuffers)
{
@@ -448,8 +460,7 @@
numUBODyn += binding.descriptorCount;
}
break;
- case 6:
- binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC;
+ case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
if (numSSBODyn < caseDef.maxStorageBuffersDynamic &&
numSSBO < caseDef.maxPerStageStorageBuffers)
{
@@ -460,14 +471,24 @@
numSSBODyn += binding.descriptorCount;
}
break;
+ case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
+ if (numInputAttachments < caseDef.maxPerStageInputAttachments)
+ {
+ arraySizes[b] = randRange(&rnd, 0, de::min(maxArray, caseDef.maxPerStageInputAttachments - numInputAttachments));
+ binding.descriptorCount = arraySizes[b] ? arraySizes[b] : 1;
+ numInputAttachments += binding.descriptorCount;
+ }
+ break;
}
+
+ binding.stageFlags = ((binding.descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT) ? (VkFlags)(VK_SHADER_STAGE_FRAGMENT_BIT) : allShaderStages);
}
}
for (deUint32 s = 0; s < caseDef.numDescriptorSets; ++s)
{
vector<VkDescriptorSetLayoutBinding> &bindings = randomLayout.layoutBindings[s];
- vector<VkDescriptorBindingFlagsEXT> &bindingsFlags = randomLayout.layoutBindingFlags[s];
+ vector<VkDescriptorBindingFlags> &bindingsFlags = randomLayout.layoutBindingFlags[s];
vector<deUint32> &variableDescriptorSizes = randomLayout.variableDescriptorSizes;
// Choose a variable descriptor count size. If the feature is not supported, we'll just
@@ -475,11 +496,12 @@
if (bindings.size() > 0 &&
bindings[bindings.size()-1].descriptorType != VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC &&
bindings[bindings.size()-1].descriptorType != VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC &&
+ bindings[bindings.size()-1].descriptorType != VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT &&
!(s == 0 && bindings.size() == 1) && // Don't cut out the output image binding
randRange(&rnd, 1,4) == 1) // 1 in 4 chance
{
- bindingsFlags[bindings.size()-1] |= VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT;
+ bindingsFlags[bindings.size()-1] |= VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT;
variableDescriptorSizes[s] = randRange(&rnd, 0,bindings[bindings.size()-1].descriptorCount);
if (bindings[bindings.size()-1].descriptorType == VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT)
{
@@ -497,11 +519,13 @@
std::stringstream decls, checks;
- deUint32 descriptor = 0;
+ deUint32 inputAttachments = 0;
+ deUint32 descriptor = 0;
+
for (deUint32 s = 0; s < m_data.numDescriptorSets; ++s)
{
vector<VkDescriptorSetLayoutBinding> &bindings = randomLayout.layoutBindings[s];
- vector<VkDescriptorBindingFlagsEXT> bindingsFlags = randomLayout.layoutBindingFlags[s];
+ vector<VkDescriptorBindingFlags> bindingsFlags = randomLayout.layoutBindingFlags[s];
vector<deUint32> &arraySizes = randomLayout.arraySizes[s];
vector<deUint32> &variableDescriptorSizes = randomLayout.variableDescriptorSizes;
@@ -529,6 +553,7 @@
array << "[" << arraySizes[b] << "]";
}
}
+
switch (binding.descriptorType)
{
case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT:
@@ -551,6 +576,10 @@
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
decls << "layout(r32ui, set = " << s << ", binding = " << b << ") uniform uimage2D image" << s << "_" << b << array.str() << ";\n";
break;
+ case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
+ decls << "layout(input_attachment_index = " << inputAttachments << ", set = " << s << ", binding = " << b << ") uniform isubpassInput attachment" << s << "_" << b << array.str() << ";\n";
+ inputAttachments += binding.descriptorCount;
+ break;
default: DE_ASSERT(0);
}
@@ -559,7 +588,7 @@
// Don't access descriptors past the end of the allocated range for
// variable descriptor count
if (b == bindings.size() - 1 &&
- (bindingsFlags[b] & VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT))
+ (bindingsFlags[b] & VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT))
{
if (binding.descriptorType == VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT)
{
@@ -651,6 +680,9 @@
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
checks << " temp = imageLoad(image" << s << "_" << b << ind.str() << ", 0).x;\n";
break;
+ case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
+ checks << " temp = subpassLoad(attachment" << s << "_" << b << ind.str() << ").r;\n";
+ break;
default: DE_ASSERT(0);
}
if (m_data.indexType == INDEX_TYPE_DEPENDENT || m_data.indexType == INDEX_TYPE_RUNTIME_SIZE)
@@ -767,21 +799,6 @@
return new DescriptorSetRandomTestInstance(context, m_data);
}
-VkBufferImageCopy makeBufferImageCopy (const VkExtent3D extent,
- const VkImageSubresourceLayers subresourceLayers)
-{
- const VkBufferImageCopy copyParams =
- {
- 0ull, // VkDeviceSize bufferOffset;
- 0u, // deUint32 bufferRowLength;
- 0u, // deUint32 bufferImageHeight;
- subresourceLayers, // VkImageSubresourceLayers imageSubresource;
- makeOffset3D(0, 0, 0), // VkOffset3D imageOffset;
- extent, // VkExtent3D imageExtent;
- };
- return copyParams;
-}
-
tcu::TestStatus DescriptorSetRandomTestInstance::iterate (void)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
@@ -791,41 +808,16 @@
RandomLayout randomLayout(m_data.numDescriptorSets);
generateRandomLayout(randomLayout, m_data);
-
VkPhysicalDeviceProperties2 properties;
deMemset(&properties, 0, sizeof(properties));
properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
m_context.getInstanceInterface().getPhysicalDeviceProperties2(m_context.getPhysicalDevice(), &properties);
- VkPhysicalDeviceInlineUniformBlockFeaturesEXT inlineUniformFeatures;
- deMemset(&inlineUniformFeatures, 0, sizeof(inlineUniformFeatures));
- inlineUniformFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT;
-
- VkPhysicalDeviceDescriptorIndexingFeaturesEXT indexingFeatures;
- deMemset(&indexingFeatures, 0, sizeof(indexingFeatures));
- indexingFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT;
-
VkPhysicalDeviceFeatures2 features;
- deMemset(&features, 0, sizeof(features));
- features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
-
- if (isDeviceExtensionSupported(m_context.getUsedApiVersion(), m_context.getDeviceExtensions(), "VK_EXT_descriptor_indexing") &&
- isDeviceExtensionSupported(m_context.getUsedApiVersion(), m_context.getDeviceExtensions(), "VK_EXT_inline_uniform_block"))
- {
- indexingFeatures.pNext = &inlineUniformFeatures;
- features.pNext = &indexingFeatures;
- }
- else if (isDeviceExtensionSupported(m_context.getUsedApiVersion(), m_context.getDeviceExtensions(), "VK_EXT_descriptor_indexing"))
- {
- features.pNext = &indexingFeatures;
- }
- else if (isDeviceExtensionSupported(m_context.getUsedApiVersion(), m_context.getDeviceExtensions(), "VK_EXT_inline_uniform_block"))
- {
- features.pNext = &inlineUniformFeatures;
- }
-
- m_context.getInstanceInterface().getPhysicalDeviceFeatures2(m_context.getPhysicalDevice(), &features);
+ VkPhysicalDeviceInlineUniformBlockFeaturesEXT inlineUniformFeatures;
+ VkPhysicalDeviceDescriptorIndexingFeatures indexingFeatures;
+ getNeededFeatures(m_context, features, inlineUniformFeatures, indexingFeatures);
deRandom rnd;
deRandom_init(&rnd, m_data.seed);
@@ -841,7 +833,7 @@
for (deUint32 s = 0; s < m_data.numDescriptorSets; ++s)
{
vector<VkDescriptorSetLayoutBinding> &bindings = randomLayout.layoutBindings[s];
- vector<VkDescriptorBindingFlagsEXT> &bindingsFlags = randomLayout.layoutBindingFlags[s];
+ vector<VkDescriptorBindingFlags> &bindingsFlags = randomLayout.layoutBindingFlags[s];
vector<deUint32> &variableDescriptorSizes = randomLayout.variableDescriptorSizes;
VkDescriptorPoolCreateFlags poolCreateFlags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
@@ -861,28 +853,29 @@
(binding.descriptorType != VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER || indexingFeatures.descriptorBindingUniformTexelBufferUpdateAfterBind) &&
(binding.descriptorType != VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER || indexingFeatures.descriptorBindingStorageTexelBufferUpdateAfterBind) &&
(binding.descriptorType != VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT || inlineUniformFeatures.descriptorBindingInlineUniformBlockUpdateAfterBind) &&
+ (binding.descriptorType != VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT) &&
(binding.descriptorType != VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) &&
(binding.descriptorType != VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC))
{
- bindingsFlags[b] |= VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT;
+ bindingsFlags[b] |= VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT;
layoutCreateFlags |= VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT;
poolCreateFlags |= VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT;
}
if (!indexingFeatures.descriptorBindingVariableDescriptorCount)
{
- bindingsFlags[b] &= ~VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT;
+ bindingsFlags[b] &= ~VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT;
}
}
// Create a layout and allocate a descriptor set for it.
- const VkDescriptorSetLayoutBindingFlagsCreateInfoEXT bindingFlagsInfo =
+ const VkDescriptorSetLayoutBindingFlagsCreateInfo bindingFlagsInfo =
{
VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT, // VkStructureType sType;
DE_NULL, // const void* pNext;
(deUint32)bindings.size(), // uint32_t bindingCount;
- bindings.empty() ? DE_NULL : &bindingsFlags[0], // const VkDescriptorBindingFlagsEXT* pBindingFlags;
+ bindings.empty() ? DE_NULL : bindingsFlags.data(), // const VkDescriptorBindingFlags* pBindingFlags;
};
const VkDescriptorSetLayoutCreateInfo setLayoutCreateInfo =
@@ -892,7 +885,7 @@
layoutCreateFlags,
(deUint32)bindings.size(),
- bindings.empty() ? DE_NULL : &bindings[0]
+ bindings.empty() ? DE_NULL : bindings.data()
};
descriptorSetLayouts[s] = vk::createDescriptorSetLayout(vk, device, &setLayoutCreateInfo);
@@ -904,6 +897,10 @@
poolBuilder.addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, m_data.maxStorageBuffersDynamic);
poolBuilder.addType(VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, m_data.maxPerStageSampledImages);
poolBuilder.addType(VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, m_data.maxPerStageStorageImages);
+ if (m_data.maxPerStageInputAttachments > 0u)
+ {
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, m_data.maxPerStageInputAttachments);
+ }
poolBuilder.addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1);
if (m_data.maxInlineUniformBlocks)
{
@@ -920,9 +917,9 @@
descriptorPools[s] = poolBuilder.build(vk, device, poolCreateFlags, 1u,
m_data.maxInlineUniformBlocks ? &inlineUniformBlockPoolCreateInfo : DE_NULL);
- VkDescriptorSetVariableDescriptorCountAllocateInfoEXT variableCountInfo =
+ VkDescriptorSetVariableDescriptorCountAllocateInfo variableCountInfo =
{
- VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
0, // uint32_t descriptorSetCount;
DE_NULL, // const uint32_t* pDescriptorCounts;
@@ -930,7 +927,7 @@
const void *pNext = DE_NULL;
if (bindings.size() > 0 &&
- bindingsFlags[bindings.size()-1] & VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT)
+ bindingsFlags[bindings.size()-1] & VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT)
{
variableCountInfo.descriptorSetCount = 1;
variableCountInfo.pDescriptorCounts = &variableDescriptorSizes[s];
@@ -940,11 +937,12 @@
descriptorSets[s] = makeDescriptorSet(vk, device, *descriptorPools[s], *descriptorSetLayouts[s], pNext);
}
-
- VkDeviceSize align = de::max(de::max(de::max(properties.properties.limits.minTexelBufferOffsetAlignment,
- properties.properties.limits.minUniformBufferOffsetAlignment),
- properties.properties.limits.minStorageBufferOffsetAlignment),
- (VkDeviceSize)sizeof(deUint32));
+ // Create a buffer to hold data for all descriptors.
+ VkDeviceSize align = std::max({
+ properties.properties.limits.minTexelBufferOffsetAlignment,
+ properties.properties.limits.minUniformBufferOffsetAlignment,
+ properties.properties.limits.minStorageBufferOffsetAlignment,
+ (VkDeviceSize)sizeof(deUint32)});
de::MovePtr<BufferWithMemory> buffer;
buffer = de::MovePtr<BufferWithMemory>(new BufferWithMemory(
@@ -956,14 +954,169 @@
MemoryRequirement::HostVisible));
deUint8 *bufferPtr = (deUint8 *)buffer->getAllocation().getHostPtr();
- typedef vk::Unique<vk::VkBufferView> BufferViewHandleUp;
- typedef de::SharedPtr<BufferViewHandleUp> BufferViewHandleSp;
+ // Count the total number of input attachments and create images for them.
+ deUint32 inputAttachmentCount = 0u;
+ for (const auto& bindings : randomLayout.layoutBindings)
+ for (const auto& binding : bindings)
+ {
+ if (binding.descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)
+ inputAttachmentCount += binding.descriptorCount;
+ }
- vector<BufferViewHandleSp> bufferViews(de::max(1u,numDescriptors));
+ const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
- // Create a buffer and view for each descriptor. Fill descriptor 'd'
- // with an integer value equal to 'd'.
- int descriptor = 0;
+ vector<Move<VkImage>> inputAttachments;
+ const VkImageCreateInfo imgCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkImageCreateFlags flags;
+ VK_IMAGE_TYPE_2D, // VkImageType imageType;
+ VK_FORMAT_R32_SINT, // VkFormat format;
+ { DIM, DIM, 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_TRANSFER_DST_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT), // VkImageUsageFlags usage;
+ VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
+ 1u, // deUint32 queueFamilyIndexCount;
+ &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
+ VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout initialLayout;
+
+ };
+ for (const auto& bindings : randomLayout.layoutBindings)
+ for (const auto& binding : bindings)
+ {
+ if (binding.descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)
+ {
+ for (deUint32 d = 0; d < binding.descriptorCount; ++d)
+ {
+ inputAttachments.push_back(createImage(vk, device, &imgCreateInfo));
+ }
+ }
+ }
+
+ de::MovePtr<Allocation> inputAttachmentAlloc;
+ VkDeviceSize imageBlockSize = 0u;
+
+ if (inputAttachmentCount > 0u)
+ {
+ VkMemoryRequirements imageReqs = getImageMemoryRequirements(vk, device, inputAttachments.back().get());
+ VkDeviceSize mod = imageReqs.size % imageReqs.alignment;
+
+ // Create memory for every input attachment image.
+ imageBlockSize = imageReqs.size + ((mod == 0u) ? 0u : (imageReqs.alignment - mod));
+ imageReqs.size = imageBlockSize * inputAttachmentCount;
+ inputAttachmentAlloc = allocator.allocate(imageReqs, MemoryRequirement::Any);
+ }
+
+ // Bind memory to each input attachment and create an image view.
+ VkImageViewCreateInfo inputAttachmentViewParams =
+ {
+ VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkImageViewCreateFlags flags;
+ DE_NULL, // VkImage image;
+ VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType;
+ VK_FORMAT_R32_SINT, // VkFormat format;
+ { // VkComponentMapping channels;
+ 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;
+ };
+ vector<Move<VkImageView>> inputAttachmentViews;
+ deUint32 attachmentIndex = 0;
+
+ for (const auto& bindings : randomLayout.layoutBindings)
+ for (const auto& binding : bindings)
+ {
+ if (binding.descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)
+ {
+ for (deUint32 d = 0; d < binding.descriptorCount; ++d)
+ {
+ vk::VkImage img = *inputAttachments[attachmentIndex];
+
+ VK_CHECK(vk.bindImageMemory(device, img, inputAttachmentAlloc->getMemory(), inputAttachmentAlloc->getOffset() + attachmentIndex * imageBlockSize));
+
+ inputAttachmentViewParams.image = img;
+ inputAttachmentViews.push_back(createImageView(vk, device, &inputAttachmentViewParams));
+
+ ++attachmentIndex;
+ }
+ }
+ }
+
+ // Create a view for each descriptor. Fill descriptor 'd' with an integer
+ // value equal to 'd'. Skip inline uniform blocks and use images for input
+ // attachments.
+
+ Move<VkCommandPool> cmdPool = createCommandPool(vk, device, 0, queueFamilyIndex);
+ const VkQueue queue = m_context.getUniversalQueue();
+ Move<VkCommandBuffer> cmdBuffer = allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+
+ const VkImageSubresourceRange clearRange =
+ {
+ VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
+ 0u, // deUint32 baseMipLevel;
+ 1u, // deUint32 levelCount;
+ 0u, // deUint32 baseArrayLayer;
+ 1u // deUint32 layerCount;
+ };
+
+ 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_TRANSFER_DST_OPTIMAL, // VkImageLayout newLayout
+ VK_QUEUE_FAMILY_IGNORED, // uint32_t srcQueueFamilyIndex
+ VK_QUEUE_FAMILY_IGNORED, // uint32_t dstQueueFamilyIndex
+ DE_NULL, // VkImage image
+ {
+ VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask
+ 0u, // uint32_t baseMipLevel
+ 1u, // uint32_t mipLevels,
+ 0u, // uint32_t baseArray
+ 1u, // uint32_t arraySize
+ }
+ };
+
+ VkImageMemoryBarrier postImageBarrier =
+ {
+ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
+ VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, // VkAccessFlags dstAccessMask;
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout;
+ VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, // VkImageLayout newLayout;
+ VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
+ VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
+ DE_NULL, // VkImage image;
+ clearRange, // VkImageSubresourceRange subresourceRange;
+ };
+
+ vk::VkClearColorValue clearValue;
+ clearValue.uint32[0] = 0u;
+ clearValue.uint32[1] = 0u;
+ clearValue.uint32[2] = 0u;
+ clearValue.uint32[3] = 0u;
+
+ beginCommandBuffer(vk, *cmdBuffer, 0u);
+
+ int descriptor = 0;
+ attachmentIndex = 0;
+
+ typedef vk::Unique<vk::VkBufferView> BufferViewHandleUp;
+ typedef de::SharedPtr<BufferViewHandleUp> BufferViewHandleSp;
+
+ vector<BufferViewHandleSp> bufferViews(de::max(1u,numDescriptors));
+
for (deUint32 s = 0; s < m_data.numDescriptorSets; ++s)
{
vector<VkDescriptorSetLayoutBinding> &bindings = randomLayout.layoutBindings[s];
@@ -975,7 +1128,8 @@
{
continue;
}
- if (binding.descriptorType != VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT)
+ if (binding.descriptorType != VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT &&
+ binding.descriptorType != VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)
{
for (deUint32 d = descriptor; d < descriptor + binding.descriptorCount; ++d)
{
@@ -997,33 +1151,46 @@
}
descriptor += binding.descriptorCount;
}
- else
+ else if (binding.descriptorType == VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT)
{
// subtract 16 for "ivec4 dummy"
DE_ASSERT(binding.descriptorCount >= 16);
descriptor += binding.descriptorCount - 16;
}
+ else
+ {
+ // Input attachment.
+ for (deUint32 d = descriptor; d < descriptor + binding.descriptorCount; ++d)
+ {
+ VkImage img = *inputAttachments[attachmentIndex];
+
+ preImageBarrier.image = img;
+ clearValue.uint32[0] = d;
+ postImageBarrier.image = img;
+
+ 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);
+ vk.cmdClearColorImage(*cmdBuffer, img, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clearValue, 1, &clearRange);
+ vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &postImageBarrier);
+
+ ++attachmentIndex;
+ }
+ descriptor += binding.descriptorCount;
+ }
}
}
+ // Flush modified memory.
flushMappedMemoryRange(vk, device, buffer->getAllocation().getMemory(), buffer->getAllocation().getOffset(), VK_WHOLE_SIZE);
- const VkQueue queue = m_context.getUniversalQueue();
- Move<VkCommandPool> cmdPool = createCommandPool(vk, device, 0, m_context.getUniversalQueueFamilyIndex());
- Move<VkCommandBuffer> cmdBuffer = allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
-
- beginCommandBuffer(vk, *cmdBuffer, 0u);
-
// Push constants are used for dynamic indexing. PushConstant[i] = i.
-
- const VkPushConstantRange pushConstRange =
+ const VkPushConstantRange pushConstRange =
{
allShaderStages, // VkShaderStageFlags stageFlags
0, // deUint32 offset
128 // deUint32 size
};
- vector<vk::VkDescriptorSetLayout> descriptorSetLayoutsRaw(m_data.numDescriptorSets);
+ vector<vk::VkDescriptorSetLayout> descriptorSetLayoutsRaw (m_data.numDescriptorSets);
for (size_t i = 0; i < m_data.numDescriptorSets; ++i)
{
descriptorSetLayoutsRaw[i] = descriptorSetLayouts[i].get();
@@ -1090,10 +1257,10 @@
VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType;
VK_FORMAT_R32_UINT, // 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;
+ VK_COMPONENT_SWIZZLE_IDENTITY,
+ VK_COMPONENT_SWIZZLE_IDENTITY,
+ VK_COMPONENT_SWIZZLE_IDENTITY,
+ VK_COMPONENT_SWIZZLE_IDENTITY
}, // VkComponentMapping components;
{
VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
@@ -1112,11 +1279,13 @@
imageViewCreateInfo.image = **image;
imageView = createImageView(vk, device, &imageViewCreateInfo, NULL);
- descriptor = 0;
+ descriptor = 0;
+ attachmentIndex = 0;
+
for (deUint32 s = 0; s < m_data.numDescriptorSets; ++s)
{
vector<VkDescriptorSetLayoutBinding> &bindings = randomLayout.layoutBindings[s];
- vector<VkDescriptorBindingFlagsEXT> &bindingsFlags = randomLayout.layoutBindingFlags[s];
+ vector<VkDescriptorBindingFlags> &bindingsFlags = randomLayout.layoutBindingFlags[s];
vector<deUint32> &arraySizes = randomLayout.arraySizes[s];
vector<deUint32> &variableDescriptorSizes = randomLayout.variableDescriptorSizes;
@@ -1130,10 +1299,10 @@
int vecIndex = 0;
int numDynamic = 0;
- vector<VkDescriptorUpdateTemplateEntry> imgTemplateEntriesBefore, imgTemplateEntriesAfter,
- bufTemplateEntriesBefore, bufTemplateEntriesAfter,
- texelBufTemplateEntriesBefore, texelBufTemplateEntriesAfter,
- inlineTemplateEntriesBefore, inlineTemplateEntriesAfter;
+ vector<VkDescriptorUpdateTemplateEntry> imgTemplateEntriesBefore, imgTemplateEntriesAfter,
+ bufTemplateEntriesBefore, bufTemplateEntriesAfter,
+ texelBufTemplateEntriesBefore, texelBufTemplateEntriesAfter,
+ inlineTemplateEntriesBefore, inlineTemplateEntriesAfter;
for (size_t b = 0; b < bindings.size(); ++b)
{
@@ -1143,13 +1312,13 @@
// Construct the declaration for the binding
if (binding.descriptorCount > 0)
{
- bool updateAfterBind = !!(bindingsFlags[b] & VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT);
+ bool updateAfterBind = !!(bindingsFlags[b] & VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT);
for (deUint32 ai = 0; ai < de::max(1u, arraySizes[b]); ++ai, descriptor += descriptorIncrement)
{
// Don't access descriptors past the end of the allocated range for
// variable descriptor count
if (b == bindings.size() - 1 &&
- (bindingsFlags[b] & VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT))
+ (bindingsFlags[b] & VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT))
{
if (binding.descriptorType == VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT)
{
@@ -1166,33 +1335,45 @@
}
// output image
- imageInfoVec[vecIndex] = makeDescriptorImageInfo(DE_NULL, *imageView, VK_IMAGE_LAYOUT_GENERAL);
-
- if (binding.descriptorType != VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT)
+ switch (binding.descriptorType)
{
+ case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
+ // Output image.
+ imageInfoVec[vecIndex] = makeDescriptorImageInfo(DE_NULL, *imageView, VK_IMAGE_LAYOUT_GENERAL);
+ break;
+ case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
+ imageInfoVec[vecIndex] = makeDescriptorImageInfo(DE_NULL, inputAttachmentViews[attachmentIndex].get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
+ ++attachmentIndex;
+ break;
+ case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT:
+ // Handled below.
+ break;
+ default:
+ // Other descriptor types.
bufferInfoVec[vecIndex] = makeDescriptorBufferInfo(**buffer, descriptor*align, sizeof(deUint32));
bufferViewVec[vecIndex] = **bufferViews[descriptor];
+ break;
}
descriptorNumber[descriptor] = descriptor;
VkWriteDescriptorSet w =
{
- VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, // sType
- DE_NULL, // pNext
- *descriptorSets[s], // dstSet
- (deUint32)b, // binding
- ai, // dstArrayElement
- 1u, // descriptorCount
- binding.descriptorType, // descriptorType
- &imageInfoVec[vecIndex], // pImageInfo
- &bufferInfoVec[vecIndex], // pBufferInfo
- &bufferViewVec[vecIndex], // pTexelBufferView
+ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, // sType
+ DE_NULL, // pNext
+ *descriptorSets[s], // dstSet
+ (deUint32)b, // binding
+ ai, // dstArrayElement
+ 1u, // descriptorCount
+ binding.descriptorType, // descriptorType
+ &imageInfoVec[vecIndex], // pImageInfo
+ &bufferInfoVec[vecIndex], // pBufferInfo
+ &bufferViewVec[vecIndex], // pTexelBufferView
};
if (binding.descriptorType == VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT)
{
- VkWriteDescriptorSetInlineUniformBlockEXT inlineUniformBlock =
+ VkWriteDescriptorSetInlineUniformBlockEXT iuBlock =
{
VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT, // VkStructureType sType;
DE_NULL, // const void* pNext;
@@ -1200,7 +1381,7 @@
&descriptorNumber[descriptor], // const void* pData;
};
- inlineInfoVec[vecIndex] = inlineUniformBlock;
+ inlineInfoVec[vecIndex] = iuBlock;
w.dstArrayElement = ai*16 + 16; // add 16 to skip "ivec4 dummy"
w.pNext = &inlineInfoVec[vecIndex];
w.descriptorCount = sizeof(deUint32);
@@ -1220,6 +1401,7 @@
{
default: DE_ASSERT(0); // Fallthrough
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
+ case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
templateEntry.offset = vecIndex * sizeof(VkDescriptorImageInfo);
(updateAfterBind ? imgTemplateEntriesAfter : imgTemplateEntriesBefore).push_back(templateEntry);
break;
@@ -1281,10 +1463,10 @@
void *templateVectorData[] =
{
- &imageInfoVec[0],
- &bufferInfoVec[0],
- &bufferViewVec[0],
- &descriptorNumber[0],
+ imageInfoVec.data(),
+ bufferInfoVec.data(),
+ bufferViewVec.data(),
+ descriptorNumber.data(),
};
vector<VkDescriptorUpdateTemplateEntry> *templateVectorsBefore[] =
@@ -1303,12 +1485,12 @@
&inlineTemplateEntriesAfter,
};
- for (size_t i = 0; i < sizeof(templateVectorsBefore) / sizeof(templateVectorsBefore[0]); ++i)
+ for (size_t i = 0; i < DE_LENGTH_OF_ARRAY(templateVectorsBefore); ++i)
{
if (templateVectorsBefore[i]->size())
{
templateCreateInfo.descriptorUpdateEntryCount = (deUint32)templateVectorsBefore[i]->size();
- templateCreateInfo.pDescriptorUpdateEntries = &((*templateVectorsBefore[i])[0]);
+ templateCreateInfo.pDescriptorUpdateEntries = templateVectorsBefore[i]->data();
Move<VkDescriptorUpdateTemplate> descriptorUpdateTemplate = createDescriptorUpdateTemplate(vk, device, &templateCreateInfo, NULL);
vk.updateDescriptorSetWithTemplate(device, descriptorSets[s].get(), *descriptorUpdateTemplate, templateVectorData[i]);
}
@@ -1316,12 +1498,12 @@
vk.cmdBindDescriptorSets(*cmdBuffer, bindPoint, *pipelineLayout, s, 1, &descriptorSets[s].get(), numDynamic, &zeros[0]);
- for (size_t i = 0; i < sizeof(templateVectorsAfter) / sizeof(templateVectorsAfter[0]); ++i)
+ for (size_t i = 0; i < DE_LENGTH_OF_ARRAY(templateVectorsAfter); ++i)
{
if (templateVectorsAfter[i]->size())
{
templateCreateInfo.descriptorUpdateEntryCount = (deUint32)templateVectorsAfter[i]->size();
- templateCreateInfo.pDescriptorUpdateEntries = &((*templateVectorsAfter[i])[0]);
+ templateCreateInfo.pDescriptorUpdateEntries = templateVectorsAfter[i]->data();
Move<VkDescriptorUpdateTemplate> descriptorUpdateTemplate = createDescriptorUpdateTemplate(vk, device, &templateCreateInfo, NULL);
vk.updateDescriptorSetWithTemplate(device, descriptorSets[s].get(), *descriptorUpdateTemplate, templateVectorData[i]);
}
@@ -1377,46 +1559,91 @@
}
else
{
-
- const vk::VkSubpassDescription subpassDesc =
+ const VkAttachmentDescription attachmentDescription =
{
- (vk::VkSubpassDescriptionFlags)0,
- vk::VK_PIPELINE_BIND_POINT_GRAPHICS, // pipelineBindPoint
- 0u, // inputCount
- DE_NULL, // pInputAttachments
- 0u, // colorCount
- DE_NULL, // pColorAttachments
- DE_NULL, // pResolveAttachments
- DE_NULL, // depthStencilAttachment
- 0u, // preserveCount
- DE_NULL, // pPreserveAttachments
+ // Input attachment
+ (VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags
+ VK_FORMAT_R32_SINT, // 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_SHADER_READ_ONLY_OPTIMAL, // VkImageLayout initialLayout
+ VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL // VkImageLayout finalLayout
};
- const vk::VkRenderPassCreateInfo renderPassParams =
+
+ vector<VkAttachmentDescription> attachmentDescriptions (inputAttachments.size(), attachmentDescription);
+ vector<VkAttachmentReference> attachmentReferences;
+
+ attachmentReferences.reserve(inputAttachments.size());
+ VkAttachmentReference attachmentReference =
{
- vk::VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // sType
- DE_NULL, // pNext
- (vk::VkRenderPassCreateFlags)0,
- 0u, // attachmentCount
- DE_NULL, // pAttachments
- 1u, // subpassCount
- &subpassDesc, // pSubpasses
- 0u, // dependencyCount
- DE_NULL, // pDependencies
+ 0u,
+ VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
+ };
+ for (size_t i = 0; i < inputAttachments.size(); ++i)
+ {
+ attachmentReference.attachment = static_cast<deUint32>(i);
+ attachmentReferences.push_back(attachmentReference);
+ }
+
+ const VkSubpassDescription subpassDesc =
+ {
+ (VkSubpassDescriptionFlags)0, // VkSubpassDescriptionFlags flags
+ VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint
+ static_cast<deUint32>(attachmentReferences.size()), // deUint32 inputAttachmentCount
+ (attachmentReferences.empty() ? DE_NULL : attachmentReferences.data()), // const VkAttachmentReference* pInputAttachments
+ 0u, // deUint32 colorAttachmentCount
+ DE_NULL, // const VkAttachmentReference* pColorAttachments
+ DE_NULL, // const VkAttachmentReference* pResolveAttachments
+ DE_NULL, // const VkAttachmentReference* pDepthStencilAttachment
+ 0u, // deUint32 preserveAttachmentCount
+ DE_NULL // const deUint32* pPreserveAttachments
+ };
+
+ const VkSubpassDependency subpassDependency =
+ {
+ VK_SUBPASS_EXTERNAL, // deUint32 srcSubpass
+ 0, // deUint32 dstSubpass
+ VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags srcStageMask
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, // VkPipelineStageFlags dstStageMask
+ VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask
+ VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT, // dstAccessMask
+ VK_DEPENDENCY_BY_REGION_BIT // VkDependencyFlags dependencyFlags
+ };
+
+ const VkRenderPassCreateInfo renderPassParams =
+ {
+ VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureTypei sType
+ DE_NULL, // const void* pNext
+ (VkRenderPassCreateFlags)0, // VkRenderPassCreateFlags flags
+ static_cast<deUint32>(attachmentDescriptions.size()), // deUint32 attachmentCount
+ attachmentDescriptions.data(), // const VkAttachmentDescription* pAttachments
+ 1u, // deUint32 subpassCount
+ &subpassDesc, // const VkSubpassDescription* pSubpasses
+ 1u, // deUint32 dependencyCount
+ &subpassDependency // const VkSubpassDependency* pDependencies
};
renderPass = createRenderPass(vk, device, &renderPassParams);
+ vector<VkImageView> rawInputAttachmentViews;
+ rawInputAttachmentViews.reserve(inputAttachmentViews.size());
+ transform(begin(inputAttachmentViews), end(inputAttachmentViews), back_inserter(rawInputAttachmentViews),
+ [](const Move<VkImageView>& ptr) { return ptr.get(); });
+
const vk::VkFramebufferCreateInfo framebufferParams =
{
- vk::VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // sType
- DE_NULL, // pNext
+ vk::VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // sType
+ DE_NULL, // pNext
(vk::VkFramebufferCreateFlags)0,
- *renderPass, // renderPass
- 0u, // attachmentCount
- DE_NULL, // pAttachments
- DIM, // width
- DIM, // height
- 1u, // layers
+ *renderPass, // renderPass
+ static_cast<deUint32>(rawInputAttachmentViews.size()), // attachmentCount
+ rawInputAttachmentViews.data(), // pAttachments
+ DIM, // width
+ DIM, // height
+ 1u, // layers
};
framebuffer = createFramebuffer(vk, device, &framebufferParams);
@@ -1690,6 +1917,13 @@
{ 4096, "sbolimithigh", "high ssbo limit" },
};
+ TestGroupCase iaCases[] =
+ {
+ { 0, "noia", "no input attachments" },
+ { 4, "ialimitlow", "spec minmax input attachment limit" },
+ { 64, "ialimithigh", "high input attachment limit" },
+ };
+
static const struct
{
deUint32 texCount;
@@ -1752,29 +1986,39 @@
bool updateAfterBind = (UpdateAfterBind)uabCases[uabNdx].count == UPDATE_AFTER_BIND_ENABLED;
for (int stageNdx = 0; stageNdx < DE_LENGTH_OF_ARRAY(stageCases); stageNdx++)
{
+ Stage currentStage = static_cast<Stage>(stageCases[stageNdx].count);
de::MovePtr<tcu::TestCaseGroup> stageGroup(new tcu::TestCaseGroup(testCtx, stageCases[stageNdx].name, stageCases[stageNdx].description));
- deUint32 numSeeds = (setsCases[setsNdx].count == 4 && uboNdx == 0 && sboNdx == 0 && imgNdx == 0 && iubNdx == 0) ? 10 : 1;
- for (deUint32 rnd = 0; rnd < numSeeds; ++rnd)
+ for (int iaNdx = 0; iaNdx < DE_LENGTH_OF_ARRAY(iaCases); ++iaNdx)
{
- CaseDef c =
+ if (currentStage == STAGE_FRAGMENT || iaCases[iaNdx].count == 0u)
{
- (IndexType)indexCases[indexNdx].count, // IndexType indexType;
- setsCases[setsNdx].count, // deUint32 numDescriptorSets;
- uboCases[uboNdx].count, // deUint32 maxPerStageUniformBuffers;
- 8, // deUint32 maxUniformBuffersDynamic;
- sboCases[sboNdx].count, // deUint32 maxPerStageStorageBuffers;
- 4, // deUint32 maxStorageBuffersDynamic;
- imgCases[imgNdx].texCount, // deUint32 maxPerStageSampledImages;
- imgCases[imgNdx].imgCount, // deUint32 maxPerStageStorageImages;
- iubCases[iubNdx].iubCount, // deUint32 maxInlineUniformBlocks;
- iubCases[iubNdx].iubSize, // deUint32 maxInlineUniformBlockSize;
- (Stage)stageCases[stageNdx].count, // Stage stage;
- (UpdateAfterBind)uabCases[uabNdx].count, // UpdateAfterBind uab;
- seed++, // deUint32 seed;
- };
+ de::MovePtr<tcu::TestCaseGroup> iaGroup(new tcu::TestCaseGroup(testCtx, iaCases[iaNdx].name, iaCases[iaNdx].description));
+ deUint32 numSeeds = (setsCases[setsNdx].count == 4 && uboNdx == 0 && sboNdx == 0 && imgNdx == 0 && iubNdx == 0 && iaNdx < 2) ? 10 : 1;
+ for (deUint32 rnd = 0; rnd < numSeeds; ++rnd)
+ {
+ CaseDef c =
+ {
+ (IndexType)indexCases[indexNdx].count, // IndexType indexType;
+ setsCases[setsNdx].count, // deUint32 numDescriptorSets;
+ uboCases[uboNdx].count, // deUint32 maxPerStageUniformBuffers;
+ 8, // deUint32 maxUniformBuffersDynamic;
+ sboCases[sboNdx].count, // deUint32 maxPerStageStorageBuffers;
+ 4, // deUint32 maxStorageBuffersDynamic;
+ imgCases[imgNdx].texCount, // deUint32 maxPerStageSampledImages;
+ imgCases[imgNdx].imgCount, // deUint32 maxPerStageStorageImages;
+ iubCases[iubNdx].iubCount, // deUint32 maxInlineUniformBlocks;
+ iubCases[iubNdx].iubSize, // deUint32 maxInlineUniformBlockSize;
+ iaCases[iaNdx].count, // deUint32 maxPerStageInputAttachments;
+ currentStage, // Stage stage;
+ (UpdateAfterBind)uabCases[uabNdx].count, // UpdateAfterBind uab;
+ seed++, // deUint32 seed;
+ };
- string name = de::toString(rnd);
- stageGroup->addChild(new DescriptorSetRandomTestCase(testCtx, name.c_str(), "test", c));
+ string name = de::toString(rnd);
+ iaGroup->addChild(new DescriptorSetRandomTestCase(testCtx, name.c_str(), "test", c));
+ }
+ stageGroup->addChild(iaGroup.release());
+ }
}
(updateAfterBind ? uabGroup : iubGroup)->addChild(stageGroup.release());
}
diff --git a/external/vulkancts/modules/vulkan/clipping/vktClippingTests.cpp b/external/vulkancts/modules/vulkan/clipping/vktClippingTests.cpp
index 84f133d..76a6dae 100644
--- a/external/vulkancts/modules/vulkan/clipping/vktClippingTests.cpp
+++ b/external/vulkancts/modules/vulkan/clipping/vktClippingTests.cpp
@@ -386,7 +386,7 @@
void initProgramsPointSize (SourceCollections& programCollection)
{
- addSimplePrograms(programCollection, 0.75f * RENDER_SIZE);
+ addSimplePrograms(programCollection, 0.75f * static_cast<float>(RENDER_SIZE));
}
//! Primitives fully inside the clip volume.
@@ -613,7 +613,7 @@
//! Primitives partially outside the clip volume, but depth clipped with explicit depth clip control
tcu::TestStatus testPrimitivesDepthClip (Context& context, const VkPrimitiveTopology topology)
{
- if (!context.getDepthClipEnableFeatures().depthClipEnable)
+ if (!context.getDepthClipEnableFeaturesEXT().depthClipEnable)
throw tcu::NotSupportedError("VK_EXT_depth_clip_enable not supported");
std::vector<VulkanShader> shaders;
@@ -743,7 +743,7 @@
bool pointClippingOutside = true;
- if (isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_maintenance2"))
+ if (context.isDeviceFunctionalitySupported("VK_KHR_maintenance2"))
{
VkPointClippingBehavior clippingBehavior = getClippingBehavior(context.getInstanceInterface(), context.getPhysicalDevice());
diff --git a/external/vulkancts/modules/vulkan/compute/vktComputeBasicComputeShaderTests.cpp b/external/vulkancts/modules/vulkan/compute/vktComputeBasicComputeShaderTests.cpp
index dbcb8fd..c3e4048 100644
--- a/external/vulkancts/modules/vulkan/compute/vktComputeBasicComputeShaderTests.cpp
+++ b/external/vulkancts/modules/vulkan/compute/vktComputeBasicComputeShaderTests.cpp
@@ -26,6 +26,7 @@
#include "vktTestCase.hpp"
#include "vktTestCaseUtil.hpp"
#include "vktComputeTestsUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkDefs.hpp"
#include "vkRef.hpp"
@@ -2335,7 +2336,7 @@
void createDeviceGroup (void);
const vk::DeviceInterface& getDeviceInterface (void) { return *m_deviceDriver; }
- vk::VkInstance getInstance (void) { return *m_deviceGroupInstance; }
+ vk::VkInstance getInstance (void) { return m_deviceGroupInstance; }
vk::VkDevice getDevice (void) { return *m_logicalDevice; }
vk::VkPhysicalDevice getPhysicalDevice (deUint32 i = 0){ return m_physicalDevices[i]; }
@@ -2344,7 +2345,7 @@
deUint32 m_queueFamilyIndex;
private:
- vk::Move<vk::VkInstance> m_deviceGroupInstance;
+ CustomInstance m_deviceGroupInstance;
vk::Move<vk::VkDevice> m_logicalDevice;
std::vector<vk::VkPhysicalDevice> m_physicalDevices;
de::MovePtr<vk::DeviceDriver> m_deviceDriver;
@@ -2357,8 +2358,8 @@
const deUint32 physDeviceIdx = cmdLine.getVKDeviceId() - 1;
const float queuePriority = 1.0f;
const std::vector<std::string> requiredExtensions (1, "VK_KHR_device_group_creation");
- m_deviceGroupInstance = createInstanceWithExtensions(m_context.getPlatformInterface(), m_context.getUsedApiVersion(), requiredExtensions);
- std::vector<VkPhysicalDeviceGroupProperties> devGroupProperties = enumeratePhysicalDeviceGroups(m_context.getInstanceInterface(), m_deviceGroupInstance.get());
+ m_deviceGroupInstance = createCustomInstanceWithExtensions(m_context, requiredExtensions);
+ std::vector<VkPhysicalDeviceGroupProperties> devGroupProperties = enumeratePhysicalDeviceGroups(m_context.getInstanceInterface(), m_deviceGroupInstance);
m_numPhysDevices = devGroupProperties[devGroupIdx].physicalDeviceCount;
std::vector<const char*> deviceExtensions;
@@ -2372,7 +2373,7 @@
devGroupProperties[devGroupIdx].physicalDeviceCount, //physicalDeviceCount
devGroupProperties[devGroupIdx].physicalDevices //physicalDevices
};
- InstanceDriver instance (m_context.getPlatformInterface(), m_deviceGroupInstance.get());
+ const InstanceDriver& instance (m_deviceGroupInstance.getDriver());
const VkPhysicalDeviceFeatures deviceFeatures = getPhysicalDeviceFeatures(instance, deviceGroupInfo.pPhysicalDevices[physDeviceIdx]);
const std::vector<VkQueueFamilyProperties> queueProps = getPhysicalDeviceQueueFamilyProperties(instance, devGroupProperties[devGroupIdx].physicalDevices[physDeviceIdx]);
@@ -2409,8 +2410,9 @@
(deviceExtensions.empty() ? DE_NULL : &deviceExtensions[0]), // const char* const* ppEnabledExtensionNames;
&deviceFeatures, // const VkPhysicalDeviceFeatures* pEnabledFeatures;
};
- m_logicalDevice = createDevice(m_context.getPlatformInterface(), m_deviceGroupInstance.get(), instance, deviceGroupInfo.pPhysicalDevices[physDeviceIdx], &deviceInfo);
- m_deviceDriver = de::MovePtr<DeviceDriver>(new DeviceDriver(m_context.getPlatformInterface(), m_deviceGroupInstance.get(), *m_logicalDevice));
+
+ m_logicalDevice = createCustomDevice(m_context.getTestContext().getCommandLine().isValidationEnabled(), m_context.getPlatformInterface(), m_deviceGroupInstance, instance, deviceGroupInfo.pPhysicalDevices[physDeviceIdx], &deviceInfo);
+ m_deviceDriver = de::MovePtr<DeviceDriver>(new DeviceDriver(m_context.getPlatformInterface(), m_deviceGroupInstance, *m_logicalDevice));
}
class DispatchBaseTest : public vkt::TestCase
@@ -3096,7 +3098,7 @@
deviceInfo.queueCreateInfoCount = (queues[0].queueFamilyIndex == queues[1].queueFamilyIndex) ? 1 : 2;
deviceInfo.pQueueCreateInfos = queueInfos;
- logicalDevice = vk::createDevice(m_context.getPlatformInterface(), m_context.getInstance(), instance, physicalDevice, &deviceInfo);
+ logicalDevice = createCustomDevice(m_context.getTestContext().getCommandLine().isValidationEnabled(), m_context.getPlatformInterface(), m_context.getInstance(), instance, physicalDevice, &deviceInfo);
for (deUint32 queueReqNdx = 0; queueReqNdx < 2; ++queueReqNdx)
{
diff --git a/external/vulkancts/modules/vulkan/compute/vktComputeCooperativeMatrixTests.cpp b/external/vulkancts/modules/vulkan/compute/vktComputeCooperativeMatrixTests.cpp
index 53c4b60..14f753e 100644
--- a/external/vulkancts/modules/vulkan/compute/vktComputeCooperativeMatrixTests.cpp
+++ b/external/vulkancts/modules/vulkan/compute/vktComputeCooperativeMatrixTests.cpp
@@ -179,13 +179,12 @@
TCU_THROW(NotSupportedError, "variable pointers not supported");
}
- if (m_data.storageClass == SC_PHYSICAL_STORAGE_BUFFER &&
- !context.getBufferDeviceAddressFeatures().bufferDeviceAddress)
+ if (m_data.storageClass == SC_PHYSICAL_STORAGE_BUFFER && !context.isBufferDeviceAddressSupported())
{
TCU_THROW(NotSupportedError, "buffer device address not supported");
}
- if (!context.getFloat16Int8Features().shaderFloat16 &&
+ if (!context.getShaderFloat16Int8Features().shaderFloat16 &&
(m_data.inputType == VK_COMPONENT_TYPE_FLOAT16_NV || m_data.outputType == VK_COMPONENT_TYPE_FLOAT16_NV))
{
TCU_THROW(NotSupportedError, "shaderFloat16 not supported");
@@ -543,22 +542,6 @@
return new CooperativeMatrixTestInstance(context, m_data);
}
-VkBufferCreateInfo makeBufferCreateInfo (const VkDeviceSize bufferSize,
- const VkBufferUsageFlags usage)
-{
- const VkBufferCreateInfo bufferCreateInfo =
- {
- VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- (VkBufferCreateFlags)0, // VkBufferCreateFlags flags;
- bufferSize, // VkDeviceSize size;
- usage, // VkBufferUsageFlags usage;
- VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
- 0u, // deUint32 queueFamilyIndexCount;
- DE_NULL, // const deUint32* pQueueFamilyIndices;
- };
- return bufferCreateInfo;
-}
static void setData(void *base, VkComponentTypeNV dt, deUint32 i, float value)
{
if (dt == VK_COMPONENT_TYPE_FLOAT32_NV)
@@ -590,6 +573,8 @@
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice device = m_context.getDevice();
Allocator& allocator = m_context.getDefaultAllocator();
+ MemoryRequirement memoryDeviceAddress = m_data.storageClass == SC_PHYSICAL_STORAGE_BUFFER &&
+ m_context.isDeviceFunctionalitySupported("VK_KHR_buffer_device_address") ? MemoryRequirement::DeviceAddress : MemoryRequirement::Any;
deRandom rnd;
deRandom_init(&rnd, 1234);
@@ -664,13 +649,13 @@
{
buffers[i] = de::MovePtr<BufferWithMemory>(new BufferWithMemory(
vk, device, allocator, makeBufferCreateInfo(bufferSizes[i], VK_BUFFER_USAGE_STORAGE_BUFFER_BIT|VK_BUFFER_USAGE_TRANSFER_DST_BIT|VK_BUFFER_USAGE_TRANSFER_SRC_BIT|VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT),
- MemoryRequirement::HostVisible | MemoryRequirement::Cached | MemoryRequirement::Coherent));
+ MemoryRequirement::HostVisible | MemoryRequirement::Cached | MemoryRequirement::Coherent | memoryDeviceAddress));
}
catch (const tcu::NotSupportedError&)
{
buffers[i] = de::MovePtr<BufferWithMemory>(new BufferWithMemory(
vk, device, allocator, makeBufferCreateInfo(bufferSizes[i], VK_BUFFER_USAGE_STORAGE_BUFFER_BIT|VK_BUFFER_USAGE_TRANSFER_DST_BIT|VK_BUFFER_USAGE_TRANSFER_SRC_BIT|VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT),
- MemoryRequirement::HostVisible));
+ MemoryRequirement::HostVisible | memoryDeviceAddress));
}
bufferDescriptors[i] = makeDescriptorBufferInfo(**buffers[i], 0, bufferSizes[i]);
@@ -700,17 +685,23 @@
vk::DescriptorSetUpdateBuilder setUpdateBuilder;
if (m_data.storageClass == SC_PHYSICAL_STORAGE_BUFFER)
{
- VkBufferDeviceAddressInfoEXT info =
+ const bool useKHR = m_context.isDeviceFunctionalitySupported("VK_KHR_buffer_device_address");
+
+ VkBufferDeviceAddressInfo info =
{
- VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0, // VkBuffer buffer
+ VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0, // VkBuffer buffer
};
VkDeviceAddress *addrsInMemory = (VkDeviceAddress *)ptrs[4];
for (deUint32 i = 0; i < 4; ++i)
{
info.buffer = **buffers[i];
- VkDeviceAddress addr = vk.getBufferDeviceAddressEXT(device, &info);
+ VkDeviceAddress addr;
+ if (useKHR)
+ addr = vk.getBufferDeviceAddress(device, &info);
+ else
+ addr = vk.getBufferDeviceAddressEXT(device, &info);
addrsInMemory[i] = addr;
}
setUpdateBuilder.writeSingle(*descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(4),
diff --git a/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalClearAttachmentTests.cpp b/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalClearAttachmentTests.cpp
index f0173e0..43fbb93 100644
--- a/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalClearAttachmentTests.cpp
+++ b/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalClearAttachmentTests.cpp
@@ -185,7 +185,7 @@
submitCommandsAndWait(m_vk, device, queue, m_cmdBuffer.get());
// Validation
- tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
referenceFrame.allocLevel(0);
const deInt32 frameWidth = referenceFrame.getWidth();
diff --git a/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalDispatchTests.cpp b/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalDispatchTests.cpp
index bacc1e2..0a594af 100644
--- a/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalDispatchTests.cpp
+++ b/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalDispatchTests.cpp
@@ -311,6 +311,21 @@
vk.cmdExecuteCommands(*cmdBuffer, 1, &secondaryCmdBuffer.get());
}
+ const vk::VkBufferMemoryBarrier outputBufferMemoryBarrier =
+ {
+ vk::VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
+ DE_NULL,
+ vk::VK_ACCESS_SHADER_WRITE_BIT,
+ vk::VK_ACCESS_HOST_READ_BIT,
+ VK_QUEUE_FAMILY_IGNORED,
+ VK_QUEUE_FAMILY_IGNORED,
+ outputBuffer.get(),
+ 0u,
+ VK_WHOLE_SIZE
+ };
+
+ vk.cmdPipelineBarrier(*cmdBuffer, vk::VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, vk::VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL, 1u, &outputBufferMemoryBarrier, 0u, DE_NULL);
+
endCommandBuffer(vk, *cmdBuffer);
submitCommandsAndWait(vk, device, queue, *cmdBuffer);
diff --git a/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalDrawAndClearTests.cpp b/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalDrawAndClearTests.cpp
index 721d4a7..40124dd 100644
--- a/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalDrawAndClearTests.cpp
+++ b/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalDrawAndClearTests.cpp
@@ -773,6 +773,21 @@
copyResultImageToBuffer(m_testParams.m_testDepth ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT, m_testParams.m_testDepth ? m_depthTargetImage->object() : m_colorTargetImage->object());
+ const vk::VkBufferMemoryBarrier bufferMemoryBarrier =
+ {
+ vk::VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
+ DE_NULL,
+ vk::VK_ACCESS_TRANSFER_WRITE_BIT,
+ vk::VK_ACCESS_HOST_READ_BIT,
+ VK_QUEUE_FAMILY_IGNORED,
+ VK_QUEUE_FAMILY_IGNORED,
+ m_resultBuffer->object(),
+ 0u,
+ VK_WHOLE_SIZE
+ };
+
+ m_vkd.cmdPipelineBarrier(*m_cmdBufferPrimary, vk::VK_PIPELINE_STAGE_TRANSFER_BIT, vk::VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL, 1u, &bufferMemoryBarrier, 0u, DE_NULL);
+
endCommandBuffer(m_vkd, *m_cmdBufferPrimary);
submitCommandsAndWait(m_vkd, m_device, m_queue, *m_cmdBufferPrimary);
@@ -942,6 +957,21 @@
copyResultImageToBuffer(VK_IMAGE_ASPECT_COLOR_BIT, m_colorTargetImage->object());
+ const vk::VkBufferMemoryBarrier bufferMemoryBarrier =
+ {
+ vk::VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
+ DE_NULL,
+ vk::VK_ACCESS_TRANSFER_WRITE_BIT,
+ vk::VK_ACCESS_HOST_READ_BIT,
+ VK_QUEUE_FAMILY_IGNORED,
+ VK_QUEUE_FAMILY_IGNORED,
+ m_resultBuffer->object(),
+ 0u,
+ VK_WHOLE_SIZE
+ };
+
+ m_vkd.cmdPipelineBarrier(*m_cmdBufferPrimary, vk::VK_PIPELINE_STAGE_TRANSFER_BIT, vk::VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL, 1u, &bufferMemoryBarrier, 0u, DE_NULL);
+
endCommandBuffer(m_vkd, *m_cmdBufferPrimary);
submitCommandsAndWait(m_vkd, m_device, m_queue, *m_cmdBufferPrimary);
@@ -1221,6 +1251,21 @@
copyResultImageToBuffer(VK_IMAGE_ASPECT_COLOR_BIT, m_colorTargetImage->object());
+ const vk::VkBufferMemoryBarrier bufferMemoryBarrier =
+ {
+ vk::VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
+ DE_NULL,
+ vk::VK_ACCESS_TRANSFER_WRITE_BIT,
+ vk::VK_ACCESS_HOST_READ_BIT,
+ VK_QUEUE_FAMILY_IGNORED,
+ VK_QUEUE_FAMILY_IGNORED,
+ m_conditionalRenderingBuffer->object(),
+ 0u,
+ VK_WHOLE_SIZE
+ };
+
+ m_vkd.cmdPipelineBarrier(*m_cmdBufferPrimary, vk::VK_PIPELINE_STAGE_TRANSFER_BIT, vk::VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL, 1u, &bufferMemoryBarrier, 0u, DE_NULL);
+
endCommandBuffer(m_vkd, *m_cmdBufferPrimary);
submitCommandsAndWait(m_vkd, m_device, m_queue, *m_cmdBufferPrimary);
@@ -1232,7 +1277,7 @@
m_testParams ? prepareReferenceImageOneColor(reference, tcu::Vec4(0,1,0,1)) : prepareReferenceImageOneColor(reference, clearColorInitial);
- flushMappedMemoryRange(m_vkd, m_device, m_conditionalRenderingBuffer->getBoundMemory().getMemory(), m_conditionalRenderingBuffer->getBoundMemory().getOffset(), VK_WHOLE_SIZE);
+ 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");
@@ -1352,7 +1397,7 @@
void checkSupport (Context& context)
{
- context.requireDeviceExtension("VK_EXT_conditional_rendering");
+ context.requireDeviceFunctionality("VK_EXT_conditional_rendering");
}
} // unnamed namespace
diff --git a/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalDrawTests.cpp b/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalDrawTests.cpp
index 5cf344f..e84d114 100644
--- a/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalDrawTests.cpp
+++ b/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalDrawTests.cpp
@@ -306,18 +306,18 @@
}
case DRAW_COMMAND_TYPE_DRAW_INDIRECT_COUNT:
{
- m_vk.cmdDrawIndirectCountKHR( cmdBuffer,
- m_indirectBuffer->object(), indirectOffset,
- m_indirectCountBuffer->object(), 0, 3,
- sizeof(vk::VkDrawIndirectCommand));
+ m_vk.cmdDrawIndirectCount( cmdBuffer,
+ m_indirectBuffer->object(), indirectOffset,
+ m_indirectCountBuffer->object(), 0, 3,
+ sizeof(vk::VkDrawIndirectCommand));
break;
}
case DRAW_COMMAND_TYPE_DRAW_INDEXED_INDIRECT_COUNT:
{
- m_vk.cmdDrawIndexedIndirectCountKHR(cmdBuffer,
- m_indirectBuffer->object(), indexedIndirectOffset,
- m_indirectCountBuffer->object(), 0, 3,
- sizeof(vk::VkDrawIndexedIndirectCommand));
+ m_vk.cmdDrawIndexedIndirectCount(cmdBuffer,
+ m_indirectBuffer->object(), indexedIndirectOffset,
+ m_indirectCountBuffer->object(), 0, 3,
+ sizeof(vk::VkDrawIndexedIndirectCommand));
break;
}
default: DE_ASSERT(false);
@@ -456,7 +456,7 @@
submitCommandsAndWait(m_vk, device, queue, m_cmdBuffer.get());
// Validation
- tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
referenceFrame.allocLevel(0);
const deInt32 frameWidth = referenceFrame.getWidth();
diff --git a/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalRenderingTestUtil.cpp b/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalRenderingTestUtil.cpp
index 8f63a66..4afc648 100644
--- a/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalRenderingTestUtil.cpp
+++ b/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalRenderingTestUtil.cpp
@@ -33,12 +33,12 @@
void checkConditionalRenderingCapabilities (vkt::Context& context, const ConditionalData& data)
{
- if (!vk::isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_EXT_conditional_rendering"))
+ if (!context.isDeviceFunctionalitySupported("VK_EXT_conditional_rendering"))
TCU_THROW(NotSupportedError, "Missing extension: VK_EXT_conditional_rendering");
if (data.conditionInherited)
{
- const vk::VkPhysicalDeviceConditionalRenderingFeaturesEXT& conditionalRenderingFeatures = context.getConditionalRenderingFeatures();
+ const vk::VkPhysicalDeviceConditionalRenderingFeaturesEXT& conditionalRenderingFeatures = context.getConditionalRenderingFeaturesEXT();
if (!conditionalRenderingFeatures.inheritedConditionalRendering)
{
TCU_THROW(NotSupportedError, "Device does not support inherited conditional rendering");
diff --git a/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTests.cpp b/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTests.cpp
index aaa7ba6..c4830e3 100644
--- a/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTests.cpp
+++ b/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTests.cpp
@@ -220,9 +220,11 @@
CommonDescriptorInstance (Context& context,
const TestParams& testParams);
- deUint32 computeAvailableDescriptorCount (VkDescriptorType descriptorType) const;
+ deUint32 computeAvailableDescriptorCount (VkDescriptorType descriptorType,
+ bool reserveUniformTexelBuffer) const;
- Move<VkDescriptorSetLayout> createDescriptorSetLayout (deUint32& descriptorCount) const;
+ Move<VkDescriptorSetLayout> createDescriptorSetLayout (bool reserveUniformTexelBuffer,
+ deUint32& descriptorCount) const;
Move<VkDescriptorPool> createDescriptorPool (deUint32 descriptorCount) const;
@@ -528,17 +530,19 @@
{
}
-deUint32 CommonDescriptorInstance::computeAvailableDescriptorCount (VkDescriptorType descriptorType) const
+deUint32 CommonDescriptorInstance::computeAvailableDescriptorCount (VkDescriptorType descriptorType,
+ bool reserveUniformTexelBuffer) const
{
DE_UNREF(descriptorType);
const deUint32 vertexCount = m_testParams.frameResolution.width * m_testParams.frameResolution.height;
- const deUint32 availableDescriptorsOnDevice = ut::DeviceProperties(m_context).computeMaxPerStageDescriptorCount(m_testParams.descriptorType, m_testParams.updateAfterBind);
+ const deUint32 availableDescriptorsOnDevice = ut::DeviceProperties(m_context).computeMaxPerStageDescriptorCount(m_testParams.descriptorType, m_testParams.updateAfterBind, reserveUniformTexelBuffer);
return deMinu32(deMinu32(vertexCount, availableDescriptorsOnDevice), MAX_DESCRIPTORS);
}
-Move<VkDescriptorSetLayout> CommonDescriptorInstance::createDescriptorSetLayout (deUint32& descriptorCount) const
+Move<VkDescriptorSetLayout> CommonDescriptorInstance::createDescriptorSetLayout (bool reserveUniformTexelBuffer,
+ deUint32& descriptorCount) const
{
- descriptorCount = computeAvailableDescriptorCount(m_testParams.descriptorType);
+ descriptorCount = computeAvailableDescriptorCount(m_testParams.descriptorType, reserveUniformTexelBuffer);
bool optional = (m_testParams.additionalDescriptorBinding != BINDING_Undefined) && (m_testParams.additionalDescriptorType != VK_DESCRIPTOR_TYPE_UNDEFINED);
@@ -560,30 +564,30 @@
}
};
- const VkDescriptorBindingFlagsEXT bindingFlagUpdateAfterBind =
- m_testParams.updateAfterBind ? VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT : 0;
+ const VkDescriptorBindingFlags bindingFlagUpdateAfterBind =
+ m_testParams.updateAfterBind ? VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT : 0;
- const VkDescriptorBindingFlagsEXT bindingFlagsExt[] =
+ const VkDescriptorBindingFlags bindingFlags[] =
{
- VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT | bindingFlagUpdateAfterBind,
- VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT | bindingFlagUpdateAfterBind
+ VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT | bindingFlagUpdateAfterBind,
+ VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT | bindingFlagUpdateAfterBind
};
- const VkDescriptorSetLayoutBindingFlagsCreateInfoEXT bindingCreateInfoExt =
+ const VkDescriptorSetLayoutBindingFlagsCreateInfo bindingCreateInfo =
{
- VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT,
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO,
DE_NULL,
optional ? 2u : 1u, // bindingCount
- bindingFlagsExt, // pBindingFlags
+ bindingFlags, // pBindingFlags
};
const VkDescriptorSetLayoutCreateFlags layoutCreateFlags =
- m_testParams.updateAfterBind ? VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT : 0;
+ m_testParams.updateAfterBind ? VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT : 0;
const VkDescriptorSetLayoutCreateInfo layoutCreateInfo =
{
VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
- &bindingCreateInfoExt, // pNext
+ &bindingCreateInfo, // pNext
layoutCreateFlags, // flags
optional ? 2u : 1u, // bindingCount
bindings, // pBindings
@@ -594,7 +598,7 @@
Move<VkDescriptorPool> CommonDescriptorInstance::createDescriptorPool (deUint32 descriptorCount) const
{
- const VkDescriptorPoolCreateFlags pcf = m_testParams.updateAfterBind ? VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT : 0;
+ const VkDescriptorPoolCreateFlags pcf = m_testParams.updateAfterBind ? VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT : 0;
DescriptorPoolBuilder builder;
@@ -1187,7 +1191,7 @@
variables.lowerBound = 0;
variables.upperBound = variables.vertexCount;
- variables.descriptorSetLayout = createDescriptorSetLayout(variables.availableDescriptorCount);
+ variables.descriptorSetLayout = createDescriptorSetLayout(m_testParams.calculateInLoop, variables.availableDescriptorCount);
variables.validDescriptorCount = ut::computePrimeCount(variables.availableDescriptorCount);
variables.descriptorPool = createDescriptorPool(variables.availableDescriptorCount);
variables.descriptorSet = createDescriptorSet(*variables.descriptorPool, *variables.descriptorSetLayout);
@@ -3097,7 +3101,8 @@
virtual void checkSupport (vkt::Context& context) const
{
- context.requireDeviceExtension("VK_EXT_descriptor_indexing");
+ if (!context.isDeviceFunctionalitySupported("VK_EXT_descriptor_indexing"))
+ TCU_THROW(NotSupportedError, "Descriptor indexing is not supported");
const vk::VkPhysicalDeviceDescriptorIndexingFeaturesEXT& feats = context.getDescriptorIndexingFeatures();
diff --git a/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTests.hpp b/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTests.hpp
index c8a59c1..131beff 100644
--- a/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTests.hpp
+++ b/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTests.hpp
@@ -191,26 +191,27 @@
class DeviceProperties
{
- VkPhysicalDeviceDescriptorIndexingFeaturesEXT m_descriptorIndexingFeatures;
+ VkPhysicalDeviceDescriptorIndexingFeatures m_descriptorIndexingFeatures;
VkPhysicalDeviceFeatures2 m_features2;
- VkPhysicalDeviceDescriptorIndexingPropertiesEXT m_descriptorIndexingProperties;
+ VkPhysicalDeviceDescriptorIndexingProperties m_descriptorIndexingProperties;
VkPhysicalDeviceProperties2 m_properties2;
public:
DeviceProperties (const DeviceProperties& src);
DeviceProperties (const vkt::Context& testContext);
- inline const VkPhysicalDeviceDescriptorIndexingFeaturesEXT& descriptorIndexingFeatures (void) const;
+ inline const VkPhysicalDeviceDescriptorIndexingFeatures& descriptorIndexingFeatures (void) const;
inline const VkPhysicalDeviceProperties& physicalDeviceProperties (void) const;
- inline const VkPhysicalDeviceDescriptorIndexingPropertiesEXT& descriptorIndexingProperties(void) const;
+ inline const VkPhysicalDeviceDescriptorIndexingProperties& descriptorIndexingProperties(void) const;
inline const VkPhysicalDeviceFeatures& physicalDeviceFeatures (void) const;
deUint32 computeMaxPerStageDescriptorCount (VkDescriptorType descriptorType,
- bool enableUpdateAfterBind) const;
+ bool enableUpdateAfterBind,
+ bool reserveUniformTexelBuffer) const;
};
-inline const VkPhysicalDeviceDescriptorIndexingFeaturesEXT& DeviceProperties::descriptorIndexingFeatures (void) const
+inline const VkPhysicalDeviceDescriptorIndexingFeatures& DeviceProperties::descriptorIndexingFeatures (void) const
{
return m_descriptorIndexingFeatures;
}
@@ -220,7 +221,7 @@
return m_properties2.properties;
}
-inline const VkPhysicalDeviceDescriptorIndexingPropertiesEXT& DeviceProperties::descriptorIndexingProperties (void) const
+inline const VkPhysicalDeviceDescriptorIndexingProperties& DeviceProperties::descriptorIndexingProperties (void) const
{
return m_descriptorIndexingProperties;
}
diff --git a/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTestsUtils.cpp b/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTestsUtils.cpp
index 0e71de9..c81b845 100644
--- a/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTestsUtils.cpp
+++ b/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTestsUtils.cpp
@@ -667,7 +667,7 @@
const InstanceInterface& interface = testContext.getInstanceInterface();
deMemset(&m_descriptorIndexingFeatures, 0, sizeof(m_descriptorIndexingFeatures));
- m_descriptorIndexingFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT;
+ m_descriptorIndexingFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES;
m_descriptorIndexingFeatures.pNext = DE_NULL;
deMemset(&m_features2, 0, sizeof(m_features2));
@@ -677,7 +677,7 @@
interface.getPhysicalDeviceFeatures2(device, &m_features2);
deMemset(&m_descriptorIndexingProperties, 0, sizeof(m_descriptorIndexingProperties));
- m_descriptorIndexingProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT;
+ m_descriptorIndexingProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES;
m_descriptorIndexingProperties.pNext = DE_NULL;
deMemset(&m_properties2, 0, sizeof(m_properties2));
@@ -688,10 +688,11 @@
}
deUint32 DeviceProperties::computeMaxPerStageDescriptorCount (VkDescriptorType descriptorType,
- bool enableUpdateAfterBind) const
+ bool enableUpdateAfterBind,
+ bool reserveUniformTexelBuffer) const
{
- const VkPhysicalDeviceDescriptorIndexingPropertiesEXT& descriptorProps = descriptorIndexingProperties();
- const VkPhysicalDeviceProperties& deviceProps = physicalDeviceProperties();
+ const VkPhysicalDeviceDescriptorIndexingProperties& descriptorProps = descriptorIndexingProperties();
+ const VkPhysicalDeviceProperties& deviceProps = physicalDeviceProperties();
deUint32 result = 0;
deUint32 samplers = 0;
@@ -703,7 +704,11 @@
deUint32 storageImages = 0;
deUint32 inputAttachments = 0;
deUint32 inlineUniforms = 0;
- const deUint32 resources = deviceProps.limits.maxPerStageResources;
+
+ // in_loop tests use an additional single texel buffer, which is calculated against the limits below
+ const deUint32 reservedCount = (reserveUniformTexelBuffer ? 1u : 0u);
+
+ const deUint32 resources = deviceProps.limits.maxPerStageResources - reservedCount;
if (enableUpdateAfterBind)
{
@@ -718,14 +723,14 @@
}
else
{
- samplers = deMinu32( deviceProps.limits.maxPerStageDescriptorSamplers, deviceProps.limits.maxDescriptorSetSamplers); // 1048576
- uniformBuffers = deMinu32( deviceProps.limits.maxPerStageDescriptorUniformBuffers, deviceProps.limits.maxDescriptorSetUniformBuffers); // 15
- uniformBuffersDynamic = deMinu32( deviceProps.limits.maxPerStageDescriptorUniformBuffers, deviceProps.limits.maxDescriptorSetUniformBuffersDynamic); // 8
- storageBuffers = deMinu32( deviceProps.limits.maxPerStageDescriptorStorageBuffers, deviceProps.limits.maxDescriptorSetStorageBuffers); // 1048576
- storageBuffersDynamic = deMinu32( deviceProps.limits.maxPerStageDescriptorStorageBuffers, deviceProps.limits.maxDescriptorSetStorageBuffersDynamic); // 8
- sampledImages = deMinu32( deviceProps.limits.maxPerStageDescriptorSampledImages-1, deviceProps.limits.maxDescriptorSetSampledImages-1); // 1048576. -1 because during in_loop tests a single texel buffer is created and is calculated against this limit
- storageImages = deMinu32( deviceProps.limits.maxPerStageDescriptorStorageImages, deviceProps.limits.maxDescriptorSetStorageImages); // 1048576
- inputAttachments = deMinu32( deviceProps.limits.maxPerStageDescriptorInputAttachments, deviceProps.limits.maxDescriptorSetInputAttachments); // 1048576
+ samplers = deMinu32( deviceProps.limits.maxPerStageDescriptorSamplers, deviceProps.limits.maxDescriptorSetSamplers); // 1048576
+ uniformBuffers = deMinu32( deviceProps.limits.maxPerStageDescriptorUniformBuffers, deviceProps.limits.maxDescriptorSetUniformBuffers); // 15
+ uniformBuffersDynamic = deMinu32( deviceProps.limits.maxPerStageDescriptorUniformBuffers, deviceProps.limits.maxDescriptorSetUniformBuffersDynamic); // 8
+ storageBuffers = deMinu32( deviceProps.limits.maxPerStageDescriptorStorageBuffers, deviceProps.limits.maxDescriptorSetStorageBuffers); // 1048576
+ storageBuffersDynamic = deMinu32( deviceProps.limits.maxPerStageDescriptorStorageBuffers, deviceProps.limits.maxDescriptorSetStorageBuffersDynamic); // 8
+ sampledImages = deMinu32( deviceProps.limits.maxPerStageDescriptorSampledImages - reservedCount, deviceProps.limits.maxDescriptorSetSampledImages - reservedCount); // 1048576.
+ storageImages = deMinu32( deviceProps.limits.maxPerStageDescriptorStorageImages, deviceProps.limits.maxDescriptorSetStorageImages); // 1048576
+ inputAttachments = deMinu32( deviceProps.limits.maxPerStageDescriptorInputAttachments, deviceProps.limits.maxDescriptorSetInputAttachments); // 1048576
}
// adding arbitrary upper bound limits to restrain the size of the test ( we are testing big arrays, not the maximum size arrays )
diff --git a/external/vulkancts/modules/vulkan/device_group/vktDeviceGroupRendering.cpp b/external/vulkancts/modules/vulkan/device_group/vktDeviceGroupRendering.cpp
index 9bdcfa0..48c0000 100644
--- a/external/vulkancts/modules/vulkan/device_group/vktDeviceGroupRendering.cpp
+++ b/external/vulkancts/modules/vulkan/device_group/vktDeviceGroupRendering.cpp
@@ -23,6 +23,7 @@
*//*--------------------------------------------------------------------*/
#include "vktDeviceGroupTests.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkDefs.hpp"
#include "vkDeviceUtil.hpp"
@@ -151,7 +152,6 @@
private:
void init (void);
deUint32 getMemoryIndex (deUint32 memoryTypeBits, deUint32 memoryPropertyFlag);
- void getDeviceLayers (vector<string>& enabledLayers);
bool isPeerFetchAllowed (deUint32 memoryTypeIndex, deUint32 firstdeviceID, deUint32 seconddeviceID);
void SubmitBufferAndWaitForIdle (const DeviceDriver& vk, VkCommandBuffer cmdBuf, deUint32 deviceMask);
virtual tcu::TestStatus iterate (void);
@@ -209,20 +209,9 @@
return (peerMemFeatures1 & VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT) && (peerMemFeatures2 & VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT);
}
-void DeviceGroupTestInstance::getDeviceLayers (vector<string>& enabledLayers)
-{
- const tcu::CommandLine& cmdLine = m_context.getTestContext().getCommandLine();
- if (cmdLine.isValidationEnabled())
- {
- enabledLayers = vkt::getValidationLayers(m_context.getInstanceInterface(), m_context.getPhysicalDevice());
- if (enabledLayers.empty())
- TCU_THROW(NotSupportedError, "No device validation layers found");
- }
-}
-
void DeviceGroupTestInstance::init (void)
{
- if (!isInstanceExtensionSupported(m_context.getUsedApiVersion(), m_context.getInstanceExtensions(), "VK_KHR_device_group_creation"))
+ if (!m_context.isInstanceFunctionalitySupported("VK_KHR_device_group_creation"))
TCU_THROW(NotSupportedError, "Device Group tests are not supported, no device group extension present.");
const InstanceInterface& instanceInterface = m_context.getInstanceInterface();
@@ -235,7 +224,7 @@
vector<string> deviceExtensions;
vector<string> enabledLayers;
- if (!isDeviceExtensionSupported(m_context.getUsedApiVersion(), m_context.getDeviceExtensions(), "VK_KHR_device_group"))
+ if (!m_context.isDeviceFunctionalitySupported("VK_KHR_device_group"))
TCU_THROW(NotSupportedError, "Missing extension: VK_KHR_device_group");
if (!isCoreDeviceExtension(m_context.getUsedApiVersion(), "VK_KHR_device_group"))
@@ -243,7 +232,7 @@
if(m_useDedicated)
{
- if (!isDeviceExtensionSupported(m_context.getUsedApiVersion(), m_context.getDeviceExtensions(), "VK_KHR_dedicated_allocation"))
+ if (!m_context.isDeviceFunctionalitySupported("VK_KHR_dedicated_allocation"))
TCU_THROW(NotSupportedError, "Missing extension: VK_KHR_dedicated_allocation");
if (!isCoreDeviceExtension(m_context.getUsedApiVersion(), "VK_KHR_dedicated_allocation"))
@@ -303,12 +292,6 @@
for (size_t ndx = 0; ndx < deviceExtensions.size(); ++ndx)
extensionPtrs[ndx] = deviceExtensions[ndx].c_str();
- // Get Layers
- getDeviceLayers(enabledLayers);
- layerPtrs.resize(enabledLayers.size());
- for (size_t ndx = 0; ndx < enabledLayers.size(); ++ndx)
- layerPtrs[ndx] = enabledLayers[ndx].c_str();
-
const VkDeviceCreateInfo deviceCreateInfo =
{
VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, //sType;
@@ -316,13 +299,13 @@
(VkDeviceCreateFlags)0u, //flags
1, //queueRecordCount;
&deviceQueueCreateInfo, //pRequestedQueues;
- (deUint32)layerPtrs.size(), //layerCount;
- (layerPtrs.empty() ? DE_NULL : &layerPtrs[0]), //ppEnabledLayerNames;
+ 0u, //layerCount;
+ DE_NULL, //ppEnabledLayerNames;
(deUint32)extensionPtrs.size(), //extensionCount;
(extensionPtrs.empty() ? DE_NULL : &extensionPtrs[0]), //ppEnabledExtensionNames;
&enabledDeviceFeatures, //pEnabledFeatures;
};
- m_deviceGroup = createDevice(m_context.getPlatformInterface(), m_context.getInstance(), instanceInterface, physicalDevice, &deviceCreateInfo);
+ m_deviceGroup = createCustomDevice(m_context.getTestContext().getCommandLine().isValidationEnabled(), m_context.getPlatformInterface(), m_context.getInstance(), instanceInterface, physicalDevice, &deviceCreateInfo);
}
deviceDriver = de::MovePtr<vk::DeviceDriver>(new vk::DeviceDriver(m_context.getPlatformInterface(), m_context.getInstance(), *m_deviceGroup));
diff --git a/external/vulkancts/modules/vulkan/draw/vktBasicDrawTests.cpp b/external/vulkancts/modules/vulkan/draw/vktBasicDrawTests.cpp
index 997d865..120235d 100644
--- a/external/vulkancts/modules/vulkan/draw/vktBasicDrawTests.cpp
+++ b/external/vulkancts/modules/vulkan/draw/vktBasicDrawTests.cpp
@@ -663,7 +663,7 @@
submitCommandsAndWait(m_vk, device, queue, m_cmdBuffer.get());
// Validation
- tcu::TextureLevel refImage (vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::TextureLevel refImage (vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
tcu::clear(refImage.getAccess(), tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f));
std::vector<tcu::Vec4> vertices;
@@ -779,7 +779,7 @@
submitCommandsAndWait(m_vk, vkDevice, queue, m_cmdBuffer.get());
// Validation
- tcu::TextureLevel refImage (vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::TextureLevel refImage (vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
tcu::clear(refImage.getAccess(), tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f));
std::vector<tcu::Vec4> vertices;
@@ -908,7 +908,7 @@
submitCommandsAndWait(m_vk, vkDevice, queue, m_cmdBuffer.get());
// Validation
- tcu::TextureLevel refImage (vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::TextureLevel refImage (vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
tcu::clear(refImage.getAccess(), tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f));
for (std::vector<vk::VkDrawIndirectCommand>::const_iterator it = m_data.commands.begin(); it != m_data.commands.end(); ++it)
@@ -1090,7 +1090,7 @@
submitCommandsAndWait(m_vk, vkDevice, queue, m_cmdBuffer.get());
// Validation
- tcu::TextureLevel refImage (vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::TextureLevel refImage (vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
tcu::clear(refImage.getAccess(), tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f));
for (std::vector<vk::VkDrawIndexedIndirectCommand>::const_iterator cmd = m_data.commands.begin(); cmd != m_data.commands.end(); ++cmd)
diff --git a/external/vulkancts/modules/vulkan/draw/vktDrawConcurrentTests.cpp b/external/vulkancts/modules/vulkan/draw/vktDrawConcurrentTests.cpp
index f0d693d..03679c3 100644
--- a/external/vulkancts/modules/vulkan/draw/vktDrawConcurrentTests.cpp
+++ b/external/vulkancts/modules/vulkan/draw/vktDrawConcurrentTests.cpp
@@ -332,7 +332,7 @@
// Validation - draw
- tcu::Texture2D referenceFrame(mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::Texture2D referenceFrame(mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
referenceFrame.allocLevel(0);
diff --git a/external/vulkancts/modules/vulkan/draw/vktDrawDiscardRectanglesTests.cpp b/external/vulkancts/modules/vulkan/draw/vktDrawDiscardRectanglesTests.cpp
index 749227f..375ed88 100644
--- a/external/vulkancts/modules/vulkan/draw/vktDrawDiscardRectanglesTests.cpp
+++ b/external/vulkancts/modules/vulkan/draw/vktDrawDiscardRectanglesTests.cpp
@@ -94,18 +94,6 @@
return vec.size() * sizeof(vec[0]);
}
-MovePtr<Allocation> bindImage (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkImage image, const MemoryRequirement requirement)
-{
- MovePtr<Allocation> alloc = allocator.allocate(getImageMemoryRequirements(vk, device, image), requirement);
- VK_CHECK(vk.bindImageMemory(device, image, alloc->getMemory(), alloc->getOffset()));
- return alloc;
-}
-
-inline Move<VkImage> makeImage (const DeviceInterface& vk, const VkDevice device, const VkImageCreateInfo& createInfo)
-{
- return createImage(vk, device, &createInfo);
-}
-
VkImageCreateInfo makeImageCreateInfo (const VkFormat format, const UVec2& size, VkImageUsageFlags usage)
{
const VkImageCreateInfo imageParams =
@@ -688,7 +676,7 @@
void DiscardRectanglesTestCase::checkSupport (Context& context) const
{
- context.requireDeviceExtension("VK_EXT_discard_rectangles");
+ context.requireDeviceFunctionality("VK_EXT_discard_rectangles");
}
TestInstance* DiscardRectanglesTestCase::createInstance (Context& context) const
diff --git a/external/vulkancts/modules/vulkan/draw/vktDrawImageObjectUtil.cpp b/external/vulkancts/modules/vulkan/draw/vktDrawImageObjectUtil.cpp
index 66a1d5d..4cd1a11 100644
--- a/external/vulkancts/modules/vulkan/draw/vktDrawImageObjectUtil.cpp
+++ b/external/vulkancts/modules/vulkan/draw/vktDrawImageObjectUtil.cpp
@@ -348,6 +348,24 @@
};
m_vk.cmdCopyImageToBuffer(*copyCmdBuffer, object(), layout, stagingResource->object(), 1, ®ion);
+
+ // pipeline barrier for accessing the staging buffer from HOST
+ {
+ const vk::VkBufferMemoryBarrier memoryBarrier =
+ {
+ vk::VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
+ DE_NULL,
+ vk::VK_ACCESS_TRANSFER_WRITE_BIT,
+ vk::VK_ACCESS_HOST_READ_BIT,
+ VK_QUEUE_FAMILY_IGNORED,
+ VK_QUEUE_FAMILY_IGNORED,
+ stagingResource->object(),
+ 0u,
+ VK_WHOLE_SIZE
+ };
+ m_vk.cmdPipelineBarrier(*copyCmdBuffer, vk::VK_PIPELINE_STAGE_TRANSFER_BIT, vk::VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL, 1u, &memoryBarrier, 0u, DE_NULL);
+ }
+
endCommandBuffer(m_vk, *copyCmdBuffer);
submitCommandsAndWait(m_vk, m_device, queue, copyCmdBuffer.get());
@@ -437,6 +455,31 @@
vk::VkImageCopy region = { { (vk::VkImageAspectFlags)aspect, mipLevel, arrayElement, 1}, offset, { (vk::VkImageAspectFlags)aspect, 0, 0, 1}, zeroOffset, {(deUint32)width, (deUint32)height, (deUint32)depth} };
m_vk.cmdCopyImage(*copyCmdBuffer, object(), layout, stagingResource->object(), vk::VK_IMAGE_LAYOUT_GENERAL, 1, ®ion);
+
+ // pipeline barrier for accessing the staging image from HOST
+ {
+ const vk::VkImageMemoryBarrier memoryBarrier =
+ {
+ vk::VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+ DE_NULL,
+ vk::VK_ACCESS_TRANSFER_WRITE_BIT,
+ vk::VK_ACCESS_HOST_READ_BIT,
+ vk::VK_IMAGE_LAYOUT_GENERAL,
+ vk::VK_IMAGE_LAYOUT_GENERAL,
+ VK_QUEUE_FAMILY_IGNORED,
+ VK_QUEUE_FAMILY_IGNORED,
+ stagingResource->object(),
+ {
+ static_cast<vk::VkImageAspectFlags>(aspect),
+ 0u,
+ 1u,
+ 0u,
+ 1u
+ }
+ };
+ m_vk.cmdPipelineBarrier(*copyCmdBuffer, vk::VK_PIPELINE_STAGE_TRANSFER_BIT, vk::VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &memoryBarrier);
+ }
+
endCommandBuffer(m_vk, *copyCmdBuffer);
submitCommandsAndWait(m_vk, m_device, queue, copyCmdBuffer.get());
diff --git a/external/vulkancts/modules/vulkan/draw/vktDrawIndexedTest.cpp b/external/vulkancts/modules/vulkan/draw/vktDrawIndexedTest.cpp
index 8192cde..85b6d2c 100644
--- a/external/vulkancts/modules/vulkan/draw/vktDrawIndexedTest.cpp
+++ b/external/vulkancts/modules/vulkan/draw/vktDrawIndexedTest.cpp
@@ -168,7 +168,7 @@
submitCommandsAndWait(m_vk, device, queue, m_cmdBuffer.get());
// Validation
- tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
referenceFrame.allocLevel(0);
const deInt32 frameWidth = referenceFrame.getWidth();
@@ -275,7 +275,7 @@
// Validation
VK_CHECK(m_vk.queueWaitIdle(queue));
- tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
referenceFrame.allocLevel(0);
const deInt32 frameWidth = referenceFrame.getWidth();
diff --git a/external/vulkancts/modules/vulkan/draw/vktDrawIndirectTest.cpp b/external/vulkancts/modules/vulkan/draw/vktDrawIndirectTest.cpp
index f1877da..b0b495a 100644
--- a/external/vulkancts/modules/vulkan/draw/vktDrawIndirectTest.cpp
+++ b/external/vulkancts/modules/vulkan/draw/vktDrawIndirectTest.cpp
@@ -500,9 +500,9 @@
case DRAW_TYPE_SEQUENTIAL:
{
if (m_testIndirectCountExt)
- m_vk.cmdDrawIndirectCountKHR(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer,
- m_indirectCountBuffer->object(), m_offsetInCountBuffer, m_drawCount + m_indirectCountExtDrawPadding,
- m_strideInBuffer);
+ m_vk.cmdDrawIndirectCount(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer,
+ m_indirectCountBuffer->object(), m_offsetInCountBuffer, m_drawCount + m_indirectCountExtDrawPadding,
+ m_strideInBuffer);
else
m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, m_drawCount, m_strideInBuffer);
break;
@@ -510,9 +510,9 @@
case DRAW_TYPE_INDEXED:
{
if (m_testIndirectCountExt)
- m_vk.cmdDrawIndexedIndirectCountKHR(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer,
- m_indirectCountBuffer->object(), m_offsetInCountBuffer, m_drawCount + m_indirectCountExtDrawPadding,
- m_strideInBuffer);
+ m_vk.cmdDrawIndexedIndirectCount(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer,
+ m_indirectCountBuffer->object(), m_offsetInCountBuffer, m_drawCount + m_indirectCountExtDrawPadding,
+ m_strideInBuffer);
else
m_vk.cmdDrawIndexedIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, m_drawCount, m_strideInBuffer);
break;
@@ -530,9 +530,9 @@
case DRAW_TYPE_SEQUENTIAL:
{
if (m_testIndirectCountExt)
- m_vk.cmdDrawIndirectCountKHR(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer,
- m_indirectCountBuffer->object(), m_offsetInCountBuffer, m_drawCount + m_indirectCountExtDrawPadding,
- m_strideInBuffer);
+ m_vk.cmdDrawIndirectCount(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer,
+ m_indirectCountBuffer->object(), m_offsetInCountBuffer, m_drawCount + m_indirectCountExtDrawPadding,
+ m_strideInBuffer);
else
m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer, 1u, 0u);
break;
@@ -540,9 +540,9 @@
case DRAW_TYPE_INDEXED:
{
if (m_testIndirectCountExt)
- m_vk.cmdDrawIndexedIndirectCountKHR(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer,
- m_indirectCountBuffer->object(), m_offsetInCountBuffer, m_drawCount + m_indirectCountExtDrawPadding,
- m_strideInBuffer);
+ m_vk.cmdDrawIndexedIndirectCount(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer,
+ m_indirectCountBuffer->object(), m_offsetInCountBuffer, m_drawCount + m_indirectCountExtDrawPadding,
+ m_strideInBuffer);
else
m_vk.cmdDrawIndexedIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer, 1u, 0u);
break;
@@ -558,7 +558,7 @@
submitCommandsAndWait(m_vk, device, queue, m_cmdBuffer.get());
// Validation
- tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
referenceFrame.allocLevel(0);
const deInt32 frameWidth = referenceFrame.getWidth();
@@ -815,9 +815,9 @@
case DRAW_TYPE_SEQUENTIAL:
{
if (m_testIndirectCountExt)
- m_vk.cmdDrawIndirectCountKHR(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer,
- m_indirectCountBuffer->object(), m_offsetInCountBuffer,
- m_drawCount + m_indirectCountExtDrawPadding, m_strideInBuffer);
+ m_vk.cmdDrawIndirectCount(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer,
+ m_indirectCountBuffer->object(), m_offsetInCountBuffer,
+ m_drawCount + m_indirectCountExtDrawPadding, m_strideInBuffer);
else
m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, m_drawCount, m_strideInBuffer);
break;
@@ -825,9 +825,9 @@
case DRAW_TYPE_INDEXED:
{
if (m_testIndirectCountExt)
- m_vk.cmdDrawIndexedIndirectCountKHR(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer,
- m_indirectCountBuffer->object(), m_offsetInCountBuffer,
- m_drawCount + m_indirectCountExtDrawPadding, m_strideInBuffer);
+ m_vk.cmdDrawIndexedIndirectCount(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer,
+ m_indirectCountBuffer->object(), m_offsetInCountBuffer,
+ m_drawCount + m_indirectCountExtDrawPadding, m_strideInBuffer);
else
m_vk.cmdDrawIndexedIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, m_drawCount, m_strideInBuffer);
break;
@@ -845,9 +845,9 @@
case DRAW_TYPE_SEQUENTIAL:
{
if (m_testIndirectCountExt)
- m_vk.cmdDrawIndirectCountKHR(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer,
- m_indirectCountBuffer->object(), m_offsetInCountBuffer, m_drawCount + m_indirectCountExtDrawPadding,
- m_strideInBuffer);
+ m_vk.cmdDrawIndirectCount(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer,
+ m_indirectCountBuffer->object(), m_offsetInCountBuffer, m_drawCount + m_indirectCountExtDrawPadding,
+ m_strideInBuffer);
else
m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer, 1u, 0u);
break;
@@ -855,9 +855,9 @@
case DRAW_TYPE_INDEXED:
{
if (m_testIndirectCountExt)
- m_vk.cmdDrawIndexedIndirectCountKHR(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer,
- m_indirectCountBuffer->object(), m_offsetInCountBuffer, m_drawCount + m_indirectCountExtDrawPadding,
- m_strideInBuffer);
+ m_vk.cmdDrawIndexedIndirectCount(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer,
+ m_indirectCountBuffer->object(), m_offsetInCountBuffer, m_drawCount + m_indirectCountExtDrawPadding,
+ m_strideInBuffer);
else
m_vk.cmdDrawIndexedIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer, 1u, 0u);
break;
@@ -875,7 +875,7 @@
// Validation
VK_CHECK(m_vk.queueWaitIdle(queue));
- tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5 + static_cast<float>(HEIGHT)));
referenceFrame.allocLevel(0);
@@ -919,7 +919,7 @@
void checkIndirectCountExt (Context& context)
{
- context.requireDeviceExtension("VK_KHR_draw_indirect_count");
+ context.requireDeviceFunctionality("VK_KHR_draw_indirect_count");
}
} // anonymous
diff --git a/external/vulkancts/modules/vulkan/draw/vktDrawInstancedTests.cpp b/external/vulkancts/modules/vulkan/draw/vktDrawInstancedTests.cpp
index e459779..f0df4a2 100644
--- a/external/vulkancts/modules/vulkan/draw/vktDrawInstancedTests.cpp
+++ b/external/vulkancts/modules/vulkan/draw/vktDrawInstancedTests.cpp
@@ -290,9 +290,9 @@
{
if (m_params.testAttribDivisor)
{
- context.requireDeviceExtension("VK_EXT_vertex_attribute_divisor");
+ context.requireDeviceFunctionality("VK_EXT_vertex_attribute_divisor");
- const vk::VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT& vertexAttributeDivisorFeatures = context.getVertexAttributeDivisorFeatures();
+ const vk::VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT& vertexAttributeDivisorFeatures = context.getVertexAttributeDivisorFeaturesEXT();
if (m_params.attribDivisor != 1 && !vertexAttributeDivisorFeatures.vertexAttributeInstanceRateDivisor)
TCU_THROW(NotSupportedError, "Implementation does not support vertexAttributeInstanceRateDivisor");
@@ -302,7 +302,7 @@
if (m_params.testMultiview)
{
- context.requireDeviceExtension("VK_KHR_multiview");
+ context.requireDeviceFunctionality("VK_KHR_multiview");
const vk::VkPhysicalDeviceMultiviewFeatures& multiviewFeatures = context.getMultiviewFeatures();
diff --git a/external/vulkancts/modules/vulkan/draw/vktDrawInvertedDepthRangesTests.cpp b/external/vulkancts/modules/vulkan/draw/vktDrawInvertedDepthRangesTests.cpp
index 2ce792d..678fa1c 100644
--- a/external/vulkancts/modules/vulkan/draw/vktDrawInvertedDepthRangesTests.cpp
+++ b/external/vulkancts/modules/vulkan/draw/vktDrawInvertedDepthRangesTests.cpp
@@ -394,7 +394,7 @@
context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_DEPTH_CLAMP);
if (m_params.minDepth > 1.0f || m_params.minDepth < 0.0f || m_params.maxDepth > 1.0f || m_params.maxDepth < 0.0f)
- context.requireDeviceExtension("VK_EXT_depth_range_unrestricted");
+ context.requireDeviceFunctionality("VK_EXT_depth_range_unrestricted");
}
virtual TestInstance* createInstance (Context& context) const
diff --git a/external/vulkancts/modules/vulkan/draw/vktDrawNegativeViewportHeightTests.cpp b/external/vulkancts/modules/vulkan/draw/vktDrawNegativeViewportHeightTests.cpp
index 5571350..d7d25fa 100644
--- a/external/vulkancts/modules/vulkan/draw/vktDrawNegativeViewportHeightTests.cpp
+++ b/external/vulkancts/modules/vulkan/draw/vktDrawNegativeViewportHeightTests.cpp
@@ -500,7 +500,7 @@
virtual void checkSupport (Context& context) const
{
- context.requireDeviceExtension("VK_KHR_maintenance1");
+ context.requireDeviceFunctionality("VK_KHR_maintenance1");
}
virtual TestInstance* createInstance (Context& context) const
diff --git a/external/vulkancts/modules/vulkan/draw/vktDrawShaderDrawParametersTests.cpp b/external/vulkancts/modules/vulkan/draw/vktDrawShaderDrawParametersTests.cpp
index 4b120d2..32bd129 100644
--- a/external/vulkancts/modules/vulkan/draw/vktDrawShaderDrawParametersTests.cpp
+++ b/external/vulkancts/modules/vulkan/draw/vktDrawShaderDrawParametersTests.cpp
@@ -199,8 +199,8 @@
const Vec4 allColors[] = { Vec4(1.0f), Vec4(0.0f, 0.0f, 1.0f, 1.0f), Vec4(0.0f, 1.0f, 0.0f, 1.0f) };
const int numInstances = isInstanced() ? MAX_INSTANCE_COUNT : 1;
const int numIndirectDraws = isMultiDraw() ? MAX_INDIRECT_DRAW_COUNT : 1;
- const int rectWidth = static_cast<int>(WIDTH * 0.6f / 2.0f);
- const int rectHeight = static_cast<int>(HEIGHT * 0.6f / 2.0f);
+ const int rectWidth = static_cast<int>(static_cast<float>(WIDTH) * 0.6f / 2.0f);
+ const int rectHeight = static_cast<int>(static_cast<float>(HEIGHT) * 0.6f / 2.0f);
DE_ASSERT(DE_LENGTH_OF_ARRAY(perInstanceOffset) >= numInstances);
DE_ASSERT(DE_LENGTH_OF_ARRAY(allColors) >= numInstances && DE_LENGTH_OF_ARRAY(allColors) >= numIndirectDraws);
@@ -213,8 +213,8 @@
{
const Vec2 offset = perInstanceOffset[instanceNdx] + perDrawOffset[drawNdx];
const Vec4& color = allColors[isMultiDraw() ? drawNdx : instanceNdx];
- int x = static_cast<int>(WIDTH * (1.0f - 0.3f + offset.x()) / 2.0f);
- int y = static_cast<int>(HEIGHT * (1.0f - 0.3f + offset.y()) / 2.0f);
+ int x = static_cast<int>(static_cast<float>(WIDTH) * (1.0f - 0.3f + offset.x()) / 2.0f);
+ int y = static_cast<int>(static_cast<float>(HEIGHT) * (1.0f - 0.3f + offset.y()) / 2.0f);
tcu::clear(tcu::getSubregion(refImage, x, y, rectWidth, rectHeight), color);
}
@@ -296,7 +296,7 @@
// Validate
{
- tcu::TextureLevel referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), static_cast<int>(0.5f + WIDTH), static_cast<int>(0.5f + HEIGHT));
+ tcu::TextureLevel referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), static_cast<int>(0.5f + static_cast<float>(WIDTH)), static_cast<int>(0.5f + static_cast<float>(HEIGHT)));
drawReferenceImage(referenceFrame.getAccess());
@@ -313,7 +313,7 @@
void checkSupport (Context& context, TestFlags flags)
{
- context.requireDeviceExtension("VK_KHR_shader_draw_parameters");
+ context.requireDeviceFunctionality("VK_KHR_shader_draw_parameters");
// Shader draw parameters is part of Vulkan 1.1 but is optional
if (context.contextSupports(vk::ApiVersion(1, 1, 0)) )
diff --git a/external/vulkancts/modules/vulkan/draw/vktDrawShaderLayerTests.cpp b/external/vulkancts/modules/vulkan/draw/vktDrawShaderLayerTests.cpp
index db5e8cf..ee87595 100644
--- a/external/vulkancts/modules/vulkan/draw/vktDrawShaderLayerTests.cpp
+++ b/external/vulkancts/modules/vulkan/draw/vktDrawShaderLayerTests.cpp
@@ -77,18 +77,6 @@
return vec.size() * sizeof(vec[0]);
}
-MovePtr<Allocation> bindImage (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkImage image, const MemoryRequirement requirement)
-{
- MovePtr<Allocation> alloc = allocator.allocate(getImageMemoryRequirements(vk, device, image), requirement);
- VK_CHECK(vk.bindImageMemory(device, image, alloc->getMemory(), alloc->getOffset()));
- return alloc;
-}
-
-inline vk::Move<vk::VkImage> makeImage (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkImageCreateInfo& createInfo)
-{
- return createImage(vk, device, &createInfo);
-}
-
VkImageCreateInfo makeImageCreateInfo (const VkFormat format, const UVec2& size, const deUint32 numLayers, VkImageUsageFlags usage)
{
const VkImageCreateInfo imageParams =
@@ -718,7 +706,7 @@
void checkRequirements (Context& context, const int)
{
context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_MULTI_VIEWPORT);
- context.requireDeviceExtension("VK_EXT_shader_viewport_index_layer");
+ context.requireDeviceFunctionality("VK_EXT_shader_viewport_index_layer");
const VkPhysicalDeviceLimits limits = context.getDeviceProperties().limits;
diff --git a/external/vulkancts/modules/vulkan/draw/vktDrawShaderViewportIndexTests.cpp b/external/vulkancts/modules/vulkan/draw/vktDrawShaderViewportIndexTests.cpp
index 15170f0..53275e5 100644
--- a/external/vulkancts/modules/vulkan/draw/vktDrawShaderViewportIndexTests.cpp
+++ b/external/vulkancts/modules/vulkan/draw/vktDrawShaderViewportIndexTests.cpp
@@ -76,18 +76,6 @@
return vec.size() * sizeof(vec[0]);
}
-MovePtr<Allocation> bindImage (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkImage image, const MemoryRequirement requirement)
-{
- MovePtr<Allocation> alloc = allocator.allocate(getImageMemoryRequirements(vk, device, image), requirement);
- VK_CHECK(vk.bindImageMemory(device, image, alloc->getMemory(), alloc->getOffset()));
- return alloc;
-}
-
-inline vk::Move<vk::VkImage> makeImage (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkImageCreateInfo& createInfo)
-{
- return createImage(vk, device, &createInfo);
-}
-
VkImageCreateInfo makeImageCreateInfo (const VkFormat format, const UVec2& size, VkImageUsageFlags usage)
{
const VkImageCreateInfo imageParams =
@@ -808,7 +796,7 @@
void checkSupportVertex (Context& context, const int)
{
context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_MULTI_VIEWPORT);
- context.requireDeviceExtension("VK_EXT_shader_viewport_index_layer");
+ context.requireDeviceFunctionality("VK_EXT_shader_viewport_index_layer");
if (context.getDeviceProperties().limits.maxViewports < MIN_MAX_VIEWPORTS)
TCU_FAIL("multiViewport supported but maxViewports is less than the minimum required");
diff --git a/external/vulkancts/modules/vulkan/draw/vktDrawSimpleTest.cpp b/external/vulkancts/modules/vulkan/draw/vktDrawSimpleTest.cpp
index 2fd0642..c72b858 100644
--- a/external/vulkancts/modules/vulkan/draw/vktDrawSimpleTest.cpp
+++ b/external/vulkancts/modules/vulkan/draw/vktDrawSimpleTest.cpp
@@ -152,7 +152,7 @@
submitCommandsAndWait(m_vk, device, queue, m_cmdBuffer.get());
// Validation
- tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
referenceFrame.allocLevel(0);
@@ -246,7 +246,7 @@
// Validation
VK_CHECK(m_vk.queueWaitIdle(queue));
- tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
referenceFrame.allocLevel(0);
diff --git a/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateCBTests.cpp b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateCBTests.cpp
index 3622e98..499a6df 100644
--- a/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateCBTests.cpp
+++ b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateCBTests.cpp
@@ -115,7 +115,7 @@
//validation
{
- tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
referenceFrame.allocLevel(0);
const deInt32 frameWidth = referenceFrame.getWidth();
diff --git a/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateDSTests.cpp b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateDSTests.cpp
index 37f41d6..024ab82 100644
--- a/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateDSTests.cpp
+++ b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateDSTests.cpp
@@ -393,14 +393,6 @@
DepthBoundsParamTestInstance (Context &context, ShaderMap shaders)
: DepthStencilBaseCase (context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
{
- // Check if depth bounds test is supported
- {
- const vk::VkPhysicalDeviceFeatures& deviceFeatures = m_context.getDeviceFeatures();
-
- if (!deviceFeatures.depthBounds)
- throw tcu::NotSupportedError("Depth bounds test is unsupported");
- }
-
m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, 1.0f, 0.375f, 1.0f), tcu::RGBA::green().toVec()));
m_data.push_back(PositionColorVertex(tcu::Vec4(0.0f, 1.0f, 0.375f, 1.0f), tcu::RGBA::green().toVec()));
m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, -1.0f, 0.375f, 1.0f), tcu::RGBA::green().toVec()));
@@ -458,7 +450,7 @@
// validation
{
- tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
referenceFrame.allocLevel(0);
const deInt32 frameWidth = referenceFrame.getWidth();
@@ -531,12 +523,7 @@
: DynamicStateBaseClass (context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
, m_depthAttachmentFormat (vk::VK_FORMAT_D16_UNORM)
{
- // Check depthBounds support
- if (!context.getDeviceFeatures().depthBounds)
- TCU_THROW(NotSupportedError, "depthBounds feature is not supported");
-
const vk::VkDevice device = m_context.getDevice();
-
const vk::VkExtent3D depthImageExtent = { WIDTH, HEIGHT, 1 };
const ImageCreateInfo depthImageCreateInfo(vk::VK_IMAGE_TYPE_2D, m_depthAttachmentFormat, depthImageExtent, 1, 1, vk::VK_SAMPLE_COUNT_1_BIT,
vk::VK_IMAGE_TILING_OPTIMAL, vk::VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | vk::VK_IMAGE_USAGE_TRANSFER_DST_BIT);
@@ -647,7 +634,7 @@
const vk::VkDevice device = m_context.getDevice();
// Prepare depth image
- tcu::Texture2D depthData(vk::mapVkFormat(m_depthAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::Texture2D depthData(vk::mapVkFormat(m_depthAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
depthData.allocLevel(0);
const deInt32 depthDataWidth = depthData.getWidth();
@@ -711,7 +698,7 @@
// Validation
{
- tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
referenceFrame.allocLevel(0);
const deInt32 frameWidth = referenceFrame.getWidth();
@@ -840,7 +827,7 @@
// validation
{
- tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
referenceFrame.allocLevel(0);
const deInt32 frameWidth = referenceFrame.getWidth();
@@ -997,7 +984,7 @@
// validation
{
- tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
referenceFrame.allocLevel(0);
const deInt32 frameWidth = referenceFrame.getWidth();
@@ -1034,6 +1021,11 @@
}
};
+void checkDepthBoundsSupport (Context& context)
+{
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_DEPTH_BOUNDS);
+}
+
} //anonymous
DynamicStateDSTests::DynamicStateDSTests (tcu::TestContext& testCtx)
@@ -1052,8 +1044,8 @@
shaderPaths[glu::SHADERTYPE_VERTEX] = "vulkan/dynamic_state/VertexFetch.vert";
shaderPaths[glu::SHADERTYPE_FRAGMENT] = "vulkan/dynamic_state/VertexFetch.frag";
- addChild(new InstanceFactory<DepthBoundsParamTestInstance>(m_testCtx, "depth_bounds_1", "Perform depth bounds test 1", shaderPaths));
- addChild(new InstanceFactory<DepthBoundsTestInstance>(m_testCtx, "depth_bounds_2", "Perform depth bounds test 1", shaderPaths));
+ addChild(new InstanceFactory<DepthBoundsParamTestInstance, FunctionSupport0>(m_testCtx, "depth_bounds_1", "Perform depth bounds test 1", shaderPaths, checkDepthBoundsSupport));
+ addChild(new InstanceFactory<DepthBoundsTestInstance, FunctionSupport0>(m_testCtx, "depth_bounds_2", "Perform depth bounds test 1", shaderPaths, checkDepthBoundsSupport));
addChild(new StencilParamsBasicTestCase(m_testCtx, "stencil_params_basic_1", "Perform basic stencil test 1", 0x0D, 0x06, 0x05, tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f)));
addChild(new StencilParamsBasicTestCase(m_testCtx, "stencil_params_basic_2", "Perform basic stencil test 2", 0x06, 0x02, 0x05, tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f)));
addChild(new InstanceFactory<StencilParamsAdvancedTestInstance>(m_testCtx, "stencil_params_advanced", "Perform advanced stencil test", shaderPaths));
diff --git a/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateGeneralTests.cpp b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateGeneralTests.cpp
index 9d09fc6..254eab1 100644
--- a/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateGeneralTests.cpp
+++ b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateGeneralTests.cpp
@@ -106,7 +106,7 @@
submitCommandsAndWait(m_vk, device, queue, m_cmdBuffer.get());
//validation
- tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
referenceFrame.allocLevel(0);
const deInt32 frameWidth = referenceFrame.getWidth();
@@ -203,7 +203,7 @@
submitCommandsAndWait(m_vk, device, queue, m_cmdBuffer.get());
//validation
- tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
referenceFrame.allocLevel(0);
const deInt32 frameWidth = referenceFrame.getWidth();
@@ -340,7 +340,7 @@
submitCommandsAndWait(m_vk, device, queue, m_cmdBuffer.get());
//validation
- tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
referenceFrame.allocLevel(0);
const deInt32 frameWidth = referenceFrame.getWidth();
diff --git a/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateRSTests.cpp b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateRSTests.cpp
index 905dc14..d487798 100644
--- a/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateRSTests.cpp
+++ b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateRSTests.cpp
@@ -421,7 +421,7 @@
{
VK_CHECK(m_vk.queueWaitIdle(queue));
- tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
referenceFrame.allocLevel(0);
const deInt32 frameWidth = referenceFrame.getWidth();
@@ -488,9 +488,6 @@
const vk::VkQueue queue = m_context.getUniversalQueue();
const vk::VkDevice device = m_context.getDevice();
- if (!m_context.getDeviceFeatures().depthBiasClamp)
- TCU_THROW(NotSupportedError, "depthBiasClamp feature is not supported");
-
beginRenderPass();
// set states here
@@ -517,7 +514,7 @@
// validation
{
- tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
referenceFrame.allocLevel(0);
const deInt32 frameWidth = referenceFrame.getWidth();
@@ -562,14 +559,6 @@
LineWidthParamTestInstance (Context& context, ShaderMap shaders)
: DynamicStateBaseClass (context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
{
- // Check if line width test is supported
- {
- const vk::VkPhysicalDeviceFeatures& deviceFeatures = m_context.getDeviceFeatures();
-
- if (!deviceFeatures.wideLines)
- throw tcu::NotSupportedError("Line width test is unsupported");
- }
-
m_topology = vk::VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, 0.0f, 0.0f, 1.0f), tcu::RGBA::green().toVec()));
@@ -610,7 +599,7 @@
// validation
{
- tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
referenceFrame.allocLevel(0);
const deInt32 frameWidth = referenceFrame.getWidth();
@@ -649,6 +638,16 @@
}
};
+void checkDepthBiasClampSupport (Context& context)
+{
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_DEPTH_BIAS_CLAMP);
+}
+
+void checkWideLinesSupport (Context& context)
+{
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_WIDE_LINES);
+}
+
} //anonymous
DynamicStateRSTests::DynamicStateRSTests (tcu::TestContext& testCtx)
@@ -668,8 +667,8 @@
shaderPaths[glu::SHADERTYPE_FRAGMENT] = "vulkan/dynamic_state/VertexFetch.frag";
addChild(new InstanceFactory<DepthBiasParamTestInstance>(m_testCtx, "depth_bias", "Test depth bias functionality", shaderPaths));
- addChild(new InstanceFactory<DepthBiasClampParamTestInstance>(m_testCtx, "depth_bias_clamp", "Test depth bias clamp functionality", shaderPaths));
- addChild(new InstanceFactory<LineWidthParamTestInstance>(m_testCtx, "line_width", "Draw a line with width set to max defined by physical device", shaderPaths));
+ addChild(new InstanceFactory<DepthBiasClampParamTestInstance, FunctionSupport0>(m_testCtx, "depth_bias_clamp", "Test depth bias clamp functionality", shaderPaths, checkDepthBiasClampSupport));
+ addChild(new InstanceFactory<LineWidthParamTestInstance, FunctionSupport0>(m_testCtx, "line_width", "Draw a line with width set to max defined by physical device", shaderPaths, checkWideLinesSupport));
}
} // DynamicState
diff --git a/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateTestCaseUtil.hpp b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateTestCaseUtil.hpp
index 6cc8b15..e9f4131 100644
--- a/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateTestCaseUtil.hpp
+++ b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateTestCaseUtil.hpp
@@ -53,7 +53,7 @@
typedef std::map<glu::ShaderType, const char*> ShaderMap;
-template<typename Instance>
+template<typename Instance, typename Support = NoSupport0>
class InstanceFactory : public TestCase
{
public:
@@ -61,15 +61,24 @@
const std::map<glu::ShaderType, const char*> shaderPaths)
: TestCase (testCtx, name, desc)
, m_shaderPaths (shaderPaths)
+ , m_support ()
{
}
- TestInstance* createInstance (Context& context) const
+ InstanceFactory (tcu::TestContext& testCtx, const std::string& name, const std::string& desc,
+ const std::map<glu::ShaderType, const char*> shaderPaths, const Support& support)
+ : TestCase (testCtx, name, desc)
+ , m_shaderPaths (shaderPaths)
+ , m_support (support)
+ {
+ }
+
+ TestInstance* createInstance (Context& context) const
{
return new Instance(context, m_shaderPaths);
}
- virtual void initPrograms (vk::SourceCollections& programCollection) const
+ virtual void initPrograms (vk::SourceCollections& programCollection) const
{
for (ShaderMap::const_iterator i = m_shaderPaths.begin(); i != m_shaderPaths.end(); ++i)
{
@@ -78,8 +87,14 @@
}
}
+ virtual void checkSupport (Context& context) const
+ {
+ m_support.checkSupport(context);
+ }
+
private:
- const ShaderMap m_shaderPaths;
+ const ShaderMap m_shaderPaths;
+ const Support m_support;
};
} // DynamicState
diff --git a/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateVPTests.cpp b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateVPTests.cpp
index 423c26e..a35c669 100644
--- a/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateVPTests.cpp
+++ b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateVPTests.cpp
@@ -129,7 +129,7 @@
virtual void setDynamicStates(void)
{
- const vk::VkViewport viewport = { 0.0f, 0.0f, (float)WIDTH * 2, (float)HEIGHT * 2, 0.0f, 0.0f };
+ const vk::VkViewport viewport = { 0.0f, 0.0f, static_cast<float>(WIDTH) * 2.0f, static_cast<float>(HEIGHT) * 2.0f, 0.0f, 0.0f };
const vk::VkRect2D scissor = { { 0, 0 }, { WIDTH, HEIGHT } };
setDynamicViewportState(1, &viewport, &scissor);
@@ -140,7 +140,7 @@
virtual tcu::Texture2D buildReferenceFrame (void)
{
- tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
referenceFrame.allocLevel(0);
const deInt32 frameWidth = referenceFrame.getWidth();
@@ -187,7 +187,7 @@
virtual tcu::Texture2D buildReferenceFrame (void)
{
- tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
referenceFrame.allocLevel(0);
const deInt32 frameWidth = referenceFrame.getWidth();
@@ -223,17 +223,6 @@
: DynamicStateBaseClass (context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
, m_geometryShaderName (shaders[glu::SHADERTYPE_GEOMETRY])
{
- // Check geometry shader support
- {
- const vk::VkPhysicalDeviceFeatures& deviceFeatures = m_context.getDeviceFeatures();
-
- if (!deviceFeatures.multiViewport)
- throw tcu::NotSupportedError("Multi-viewport is not supported");
-
- if (!deviceFeatures.geometryShader)
- throw tcu::NotSupportedError("Geometry shaders are not supported");
- }
-
for (int i = 0; i < 4; i++)
{
m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, 1.0f, (float)i / 3.0f, 1.0f), tcu::RGBA::green().toVec()));
@@ -319,7 +308,7 @@
// validation
{
- tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
+ tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5f + static_cast<float>(WIDTH)), (int)(0.5f + static_cast<float>(HEIGHT)));
referenceFrame.allocLevel(0);
const deInt32 frameWidth = referenceFrame.getWidth();
@@ -356,6 +345,12 @@
}
};
+void checkGeometryAndMultiViewportSupport (Context& context)
+{
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_GEOMETRY_SHADER);
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_MULTI_VIEWPORT);
+}
+
} //anonymous
DynamicStateVPTests::DynamicStateVPTests (tcu::TestContext& testCtx)
@@ -378,7 +373,7 @@
addChild(new InstanceFactory<ScissorParamTestInstance>(m_testCtx, "scissor", "Perform a scissor test on 1/4 bottom-left part of the surface", shaderPaths));
shaderPaths[glu::SHADERTYPE_GEOMETRY] = "vulkan/dynamic_state/ViewportArray.geom";
- addChild(new InstanceFactory<ViewportArrayTestInstance>(m_testCtx, "viewport_array", "Multiple viewports and scissors", shaderPaths));
+ addChild(new InstanceFactory<ViewportArrayTestInstance, FunctionSupport0>(m_testCtx, "viewport_array", "Multiple viewports and scissors", shaderPaths, checkGeometryAndMultiViewportSupport));
}
} // DynamicState
diff --git a/external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsEarlyFragmentTests.cpp b/external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsEarlyFragmentTests.cpp
index 8add6dc..5e8aef3 100644
--- a/external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsEarlyFragmentTests.cpp
+++ b/external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsEarlyFragmentTests.cpp
@@ -218,6 +218,7 @@
void initPrograms (SourceCollections& programCollection) const;
TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
private:
const deUint32 m_flags;
@@ -351,7 +352,7 @@
const deUint32 numVertices = 6;
const VkDeviceSize vertexBufferSizeBytes = sizeof(tcu::Vec4) * numVertices;
- const Unique<VkBuffer> vertexBuffer (makeBuffer(vk, device, makeBufferCreateInfo(vertexBufferSizeBytes, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT)));
+ const Unique<VkBuffer> vertexBuffer (makeBuffer(vk, device, vertexBufferSizeBytes, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
const UniquePtr<Allocation> vertexBufferAlloc (bindBuffer(vk, device, allocator, *vertexBuffer, MemoryRequirement::HostVisible));
{
@@ -372,7 +373,7 @@
// Result buffer
const VkDeviceSize resultBufferSizeBytes = sizeof(deUint32);
- const Unique<VkBuffer> resultBuffer (makeBuffer(vk, device, makeBufferCreateInfo(resultBufferSizeBytes, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)));
+ const Unique<VkBuffer> resultBuffer (makeBuffer(vk, device, resultBufferSizeBytes, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT));
const UniquePtr<Allocation> resultBufferAlloc (bindBuffer(vk, device, allocator, *resultBuffer, MemoryRequirement::HostVisible));
{
@@ -385,7 +386,7 @@
// Render result buffer (to retrieve color attachment contents)
const VkDeviceSize colorBufferSizeBytes = tcu::getPixelSize(mapVkFormat(colorFormat)) * renderSize.x() * renderSize.y();
- const Unique<VkBuffer> colorBuffer (makeBuffer(vk, device, makeBufferCreateInfo(colorBufferSizeBytes, VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> colorBuffer (makeBuffer(vk, device, colorBufferSizeBytes, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> colorBufferAlloc (bindBuffer(vk, device, allocator, *colorBuffer, MemoryRequirement::HostVisible));
// Descriptors
@@ -501,19 +502,14 @@
TestInstance* EarlyFragmentTest::createInstance (Context& context) const
{
- // Check required features
- {
- VkPhysicalDeviceFeatures features;
- context.getInstanceInterface().getPhysicalDeviceFeatures(context.getPhysicalDevice(), &features);
-
- // SSBO writes in fragment shader
- if (!features.fragmentStoresAndAtomics)
- throw tcu::NotSupportedError("Missing required feature: fragmentStoresAndAtomics");
- }
-
return new EarlyFragmentTestInstance(context, m_flags);
}
+void EarlyFragmentTest::checkSupport (Context& context) const
+{
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_FRAGMENT_STORES_AND_ATOMICS);
+}
+
} // anonymous ns
tcu::TestCaseGroup* createEarlyFragmentTests (tcu::TestContext& testCtx)
diff --git a/external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsMakeUtil.cpp b/external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsMakeUtil.cpp
index e7a9faa..88cd327 100644
--- a/external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsMakeUtil.cpp
+++ b/external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsMakeUtil.cpp
@@ -64,19 +64,5 @@
return createComputePipeline(vk, device, DE_NULL , &pipelineInfo);
}
-MovePtr<Allocation> bindImage (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkImage image, const MemoryRequirement requirement)
-{
- MovePtr<Allocation> alloc = allocator.allocate(getImageMemoryRequirements(vk, device, image), requirement);
- VK_CHECK(vk.bindImageMemory(device, image, alloc->getMemory(), alloc->getOffset()));
- return alloc;
-}
-
-MovePtr<Allocation> bindBuffer (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkBuffer buffer, const MemoryRequirement requirement)
-{
- MovePtr<Allocation> alloc(allocator.allocate(getBufferMemoryRequirements(vk, device, buffer), requirement));
- VK_CHECK(vk.bindBufferMemory(device, buffer, alloc->getMemory(), alloc->getOffset()));
- return alloc;
-}
-
} // FragmentOperations
} // vkt
diff --git a/external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsMakeUtil.hpp b/external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsMakeUtil.hpp
index 294dda0..1e983b6 100644
--- a/external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsMakeUtil.hpp
+++ b/external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsMakeUtil.hpp
@@ -37,18 +37,6 @@
{
vk::Move<vk::VkPipeline> makeComputePipeline (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkPipelineLayout pipelineLayout, const vk::VkShaderModule shaderModule, const vk::VkSpecializationInfo* specInfo);
-de::MovePtr<vk::Allocation> bindImage (const vk::DeviceInterface& vk, const vk::VkDevice device, vk::Allocator& allocator, const vk::VkImage image, const vk::MemoryRequirement requirement);
-de::MovePtr<vk::Allocation> bindBuffer (const vk::DeviceInterface& vk, const vk::VkDevice device, vk::Allocator& allocator, const vk::VkBuffer buffer, const vk::MemoryRequirement requirement);
-
-inline vk::Move<vk::VkBuffer> makeBuffer (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkBufferCreateInfo& createInfo)
-{
- return createBuffer(vk, device, &createInfo);
-}
-
-inline vk::Move<vk::VkImage> makeImage (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkImageCreateInfo& createInfo)
-{
- return createImage(vk, device, &createInfo);
-}
} // FragmentOperations
} // vkt
diff --git a/external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsScissorMultiViewportTests.cpp b/external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsScissorMultiViewportTests.cpp
index f872d65..2cadc3d 100644
--- a/external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsScissorMultiViewportTests.cpp
+++ b/external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsScissorMultiViewportTests.cpp
@@ -136,27 +136,6 @@
VK_PRIMITIVE_TOPOLOGY_POINT_LIST); // const VkPrimitiveTopology topology
}
-void zeroBuffer (const DeviceInterface& vk, const VkDevice device, const Allocation& alloc, const VkDeviceSize size)
-{
- deMemset(alloc.getHostPtr(), 0, static_cast<std::size_t>(size));
- flushAlloc(vk, device, alloc);
-}
-
-void requireFeatureMultiViewport (const InstanceInterface& vki, const VkPhysicalDevice physDevice)
-{
- const VkPhysicalDeviceFeatures features = getPhysicalDeviceFeatures(vki, physDevice);
- const VkPhysicalDeviceLimits limits = getPhysicalDeviceProperties(vki, physDevice).limits;
-
- if (!features.geometryShader)
- TCU_THROW(NotSupportedError, "Required feature is not supported: geometryShader");
-
- if (!features.multiViewport)
- TCU_THROW(NotSupportedError, "Required feature is not supported: multiViewport");
-
- if (limits.maxViewports < MIN_MAX_VIEWPORTS)
- TCU_THROW(NotSupportedError, "Implementation doesn't support minimum required number of viewports");
-}
-
std::vector<IVec4> generateScissors (const int numScissors, const IVec2& renderSize)
{
// Scissor rects will be arranged in a grid-like fashion.
@@ -344,7 +323,7 @@
m_colorImageAlloc = bindImage (vk, device, allocator, *m_colorImage, MemoryRequirement::Any);
m_colorAttachment = makeImageView (vk, device, *m_colorImage, VK_IMAGE_VIEW_TYPE_2D, m_colorFormat, m_colorSubresourceRange);
- m_vertexBuffer = makeBuffer (vk, device, makeBufferCreateInfo(m_vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
+ m_vertexBuffer = makeBuffer (vk, device, m_vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
m_vertexBufferAlloc = bindBuffer (vk, device, allocator, *m_vertexBuffer, MemoryRequirement::HostVisible);
{
@@ -419,8 +398,6 @@
tcu::TestStatus test (Context& context, const int numViewports)
{
- requireFeatureMultiViewport(context.getInstanceInterface(), context.getPhysicalDevice());
-
const DeviceInterface& vk = context.getDeviceInterface();
const VkDevice device = context.getDevice();
Allocator& allocator = context.getDefaultAllocator();
@@ -432,7 +409,7 @@
const std::vector<IVec4> scissors = generateScissors(numViewports, renderSize);
const VkDeviceSize colorBufferSize = renderSize.x() * renderSize.y() * tcu::getPixelSize(mapVkFormat(colorFormat));
- const Unique<VkBuffer> colorBuffer (makeBuffer(vk, device, makeBufferCreateInfo(colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> colorBuffer (makeBuffer(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> colorBufferAlloc (bindBuffer(vk, device, allocator, *colorBuffer, MemoryRequirement::HostVisible));
zeroBuffer(vk, device, *colorBufferAlloc, colorBufferSize);
@@ -464,6 +441,15 @@
return tcu::TestStatus::pass("OK");
}
+void checkSupport (Context& context, const int)
+{
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_GEOMETRY_SHADER);
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_MULTI_VIEWPORT);
+
+ if (context.getDeviceProperties().limits.maxViewports < MIN_MAX_VIEWPORTS)
+ TCU_THROW(NotSupportedError, "Implementation doesn't support minimum required number of viewports");
+}
+
} // anonymous
tcu::TestCaseGroup* createScissorMultiViewportTests (tcu::TestContext& testCtx)
@@ -471,7 +457,7 @@
MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, "multi_viewport", ""));
for (int numViewports = 1; numViewports <= MIN_MAX_VIEWPORTS; ++numViewports)
- addFunctionCaseWithPrograms(group.get(), "scissor_" + de::toString(numViewports), "", initPrograms, test, numViewports);
+ addFunctionCaseWithPrograms(group.get(), "scissor_" + de::toString(numViewports), "", checkSupport, initPrograms, test, numViewports);
return group.release();
}
diff --git a/external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsScissorTests.cpp b/external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsScissorTests.cpp
index 6c29ae2..ed5615d 100644
--- a/external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsScissorTests.cpp
+++ b/external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsScissorTests.cpp
@@ -264,12 +264,6 @@
}
}
-void zeroBuffer (const DeviceInterface& vk, const VkDevice device, const Allocation& alloc, const VkDeviceSize size)
-{
- deMemset(alloc.getHostPtr(), 0, static_cast<std::size_t>(size));
- flushAlloc(vk, device, alloc);
-}
-
//! Transform from normalized coords to framebuffer space.
inline IVec4 getAreaRect (const Vec4& area, const int width, const int height)
{
@@ -365,7 +359,7 @@
m_colorImageAlloc = bindImage(vk, device, allocator, *m_colorImage, MemoryRequirement::Any);
m_colorAttachment = makeImageView(vk, device, *m_colorImage, VK_IMAGE_VIEW_TYPE_2D, m_colorFormat, m_colorSubresourceRange);
- m_vertexBuffer = makeBuffer(vk, device, makeBufferCreateInfo(m_vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
+ m_vertexBuffer = makeBuffer(vk, device, m_vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
m_vertexBufferAlloc = bindBuffer(vk, device, allocator, *m_vertexBuffer, MemoryRequirement::HostVisible);
{
@@ -454,10 +448,10 @@
const Vec4 clearColor (0.5f, 0.5f, 1.0f, 1.0f);
const VkDeviceSize colorBufferSize = renderSize.x() * renderSize.y() * tcu::getPixelSize(mapVkFormat(colorFormat));
- const Unique<VkBuffer> colorBufferFull (makeBuffer(vk, device, makeBufferCreateInfo(colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> colorBufferFull (makeBuffer(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> colorBufferFullAlloc (bindBuffer(vk, device, allocator, *colorBufferFull, MemoryRequirement::HostVisible));
- const Unique<VkBuffer> colorBufferScissored (makeBuffer(vk, device, makeBufferCreateInfo(colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> colorBufferScissored (makeBuffer(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> colorBufferScissoredAlloc (bindBuffer(vk, device, allocator, *colorBufferScissored, MemoryRequirement::HostVisible));
zeroBuffer(vk, device, *colorBufferFullAlloc, colorBufferSize);
diff --git a/external/vulkancts/modules/vulkan/fragment_shader_interlock/vktFragmentShaderInterlockBasic.cpp b/external/vulkancts/modules/vulkan/fragment_shader_interlock/vktFragmentShaderInterlockBasic.cpp
index f280259..cd215af 100644
--- a/external/vulkancts/modules/vulkan/fragment_shader_interlock/vktFragmentShaderInterlockBasic.cpp
+++ b/external/vulkancts/modules/vulkan/fragment_shader_interlock/vktFragmentShaderInterlockBasic.cpp
@@ -151,22 +151,22 @@
void FSITestCase::checkSupport(Context& context) const
{
- context.requireDeviceExtension("VK_EXT_fragment_shader_interlock");
+ context.requireDeviceFunctionality("VK_EXT_fragment_shader_interlock");
if ((m_data.interlock == INT_SAMPLE_ORDERED || m_data.interlock == INT_SAMPLE_UNORDERED) &&
- !context.getFragmentShaderInterlockFeatures().fragmentShaderSampleInterlock)
+ !context.getFragmentShaderInterlockFeaturesEXT().fragmentShaderSampleInterlock)
{
TCU_THROW(NotSupportedError, "Fragment shader sample interlock not supported");
}
if ((m_data.interlock == INT_PIXEL_ORDERED || m_data.interlock == INT_PIXEL_UNORDERED) &&
- !context.getFragmentShaderInterlockFeatures().fragmentShaderPixelInterlock)
+ !context.getFragmentShaderInterlockFeaturesEXT().fragmentShaderPixelInterlock)
{
TCU_THROW(NotSupportedError, "Fragment shader pixel interlock not supported");
}
if ((m_data.interlock == INT_SHADING_RATE_ORDERED || m_data.interlock == INT_SHADING_RATE_UNORDERED) &&
- !context.getFragmentShaderInterlockFeatures().fragmentShaderShadingRateInterlock)
+ !context.getFragmentShaderInterlockFeaturesEXT().fragmentShaderShadingRateInterlock)
{
TCU_THROW(NotSupportedError, "Fragment shader shading rate interlock not supported");
}
@@ -318,40 +318,6 @@
return new FSITestInstance(context, m_data);
}
-VkBufferCreateInfo makeBufferCreateInfo (const VkDeviceSize bufferSize,
- const VkBufferUsageFlags usage,
- const VkBufferCreateFlags flags)
-{
- const VkBufferCreateInfo bufferCreateInfo =
- {
- VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- flags, // VkBufferCreateFlags flags;
- bufferSize, // VkDeviceSize size;
- usage, // VkBufferUsageFlags usage;
- VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
- 0u, // deUint32 queueFamilyIndexCount;
- DE_NULL, // const deUint32* pQueueFamilyIndices;
- };
- return bufferCreateInfo;
-}
-
-VkBufferImageCopy makeBufferImageCopy (const VkExtent3D extent,
- const VkImageSubresourceLayers subresourceLayers)
-{
- const VkBufferImageCopy copyParams =
- {
- 0ull, // VkDeviceSize bufferOffset;
- 0u, // deUint32 bufferRowLength;
- 0u, // deUint32 bufferImageHeight;
- subresourceLayers, // VkImageSubresourceLayers imageSubresource;
- makeOffset3D(0, 0, 0), // VkOffset3D imageOffset;
- extent, // VkExtent3D imageExtent;
- };
-
- return copyParams;
-}
-
tcu::TestStatus FSITestInstance::iterate (void)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
@@ -417,7 +383,7 @@
de::MovePtr<BufferWithMemory> buffer;
buffer = de::MovePtr<BufferWithMemory>(new BufferWithMemory(
- vk, device, allocator, makeBufferCreateInfo(bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, 0), MemoryRequirement::Any));
+ vk, device, allocator, makeBufferCreateInfo(bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT), MemoryRequirement::Any));
flushAlloc(vk, device, buffer->getAllocation());
@@ -442,7 +408,7 @@
de::MovePtr<BufferWithMemory> copyBuffer;
copyBuffer = de::MovePtr<BufferWithMemory>(new BufferWithMemory(
- vk, device, allocator, makeBufferCreateInfo(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT, 0), MemoryRequirement::HostVisible | MemoryRequirement::Cached));
+ vk, device, allocator, makeBufferCreateInfo(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT), MemoryRequirement::HostVisible | MemoryRequirement::Cached));
const VkImageCreateInfo imageCreateInfo =
{
@@ -798,6 +764,11 @@
vk.cmdCopyBuffer(*cmdBuffer, **buffer, **copyBuffer, 1, ©Region);
}
+ memBarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ memBarrier.dstAccessMask = VK_ACCESS_HOST_READ_BIT;
+ vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT,
+ 0, 1, &memBarrier, 0, DE_NULL, 0, DE_NULL);
+
endCommandBuffer(vk, *cmdBuffer);
submitCommandsAndWait(vk, device, queue, cmdBuffer.get());
diff --git a/external/vulkancts/modules/vulkan/geometry/vktGeometryBasicClass.cpp b/external/vulkancts/modules/vulkan/geometry/vktGeometryBasicClass.cpp
index 8521710..521e8e6 100644
--- a/external/vulkancts/modules/vulkan/geometry/vktGeometryBasicClass.cpp
+++ b/external/vulkancts/modules/vulkan/geometry/vktGeometryBasicClass.cpp
@@ -63,7 +63,6 @@
, m_primitiveType (primitiveType)
, m_name (name)
{
- checkGeometryShaderSupport(context.getInstanceInterface(), context.getPhysicalDevice());
}
tcu::TestStatus GeometryExpanderRenderTestInstance::iterate (void)
@@ -79,7 +78,7 @@
vk,
device,
memAlloc,
- makeImageCreateInfo(resolution, colorFormat, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT),
+ makeImageCreateInfo(resolution, colorFormat, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT),
MemoryRequirement::Any
);
const Unique<VkRenderPass> renderPass (makeRenderPass(vk, device, colorFormat));
diff --git a/external/vulkancts/modules/vulkan/geometry/vktGeometryBasicGeometryShaderTests.cpp b/external/vulkancts/modules/vulkan/geometry/vktGeometryBasicGeometryShaderTests.cpp
index d540e32..764aaf7 100644
--- a/external/vulkancts/modules/vulkan/geometry/vktGeometryBasicGeometryShaderTests.cpp
+++ b/external/vulkancts/modules/vulkan/geometry/vktGeometryBasicGeometryShaderTests.cpp
@@ -562,8 +562,9 @@
const char* description,
const vector<int> pattern);
- void initPrograms (SourceCollections& sourceCollections) const;
- virtual TestInstance* createInstance (Context& context) const;
+ void initPrograms (SourceCollections& sourceCollections) const;
+ virtual TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
protected:
const vector<int> m_pattern;
@@ -576,6 +577,11 @@
}
+void GeometryOutputCountTest::checkSupport (Context& context) const
+{
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_GEOMETRY_SHADER);
+}
+
void GeometryOutputCountTest::initPrograms (SourceCollections& sourceCollections) const
{
{
@@ -603,6 +609,10 @@
<< "layout(triangle_strip, max_vertices = " << max_vertices << ") out;\n"
<< "layout(location = 0) in highp vec4 v_geom_FragColor[];\n"
<< "layout(location = 0) out highp vec4 v_frag_FragColor;\n"
+ << "out gl_PerVertex\n"
+ << "{\n"
+ << " vec4 gl_Position;\n"
+ << "};\n"
<< "void main (void)\n"
<< "{\n"
<< " const highp float rowHeight = 2.0 / float(" << m_pattern.size() << ");\n"
@@ -655,6 +665,7 @@
const ShaderInstancingMode mode);
void initPrograms (SourceCollections& sourceCollections) const;
virtual TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
protected:
const VaryingSource m_test;
const ShaderInstancingMode m_mode;
@@ -667,6 +678,11 @@
{
}
+void VaryingOutputCountCase::checkSupport (Context& context) const
+{
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_GEOMETRY_SHADER);
+}
+
void VaryingOutputCountCase::initPrograms (SourceCollections& sourceCollections) const
{
{
@@ -720,6 +736,10 @@
src << "layout(triangle_strip, max_vertices = 128) out;\n"
<< "layout(location = 0) in highp vec4 v_geom_emitCount[];\n"
<< "layout(location = 0) out highp vec4 v_frag_FragColor;\n"
+ << "out gl_PerVertex\n"
+ << "{\n"
+ << " vec4 gl_Position;\n"
+ << "};\n"
<< "void main (void)\n"
<< "{\n"
<< " highp vec4 attrEmitCounts = v_geom_emitCount[0];\n"
@@ -745,6 +765,10 @@
<< " ivec4 u_emitCount;\n"
<< "} emit;\n"
<< "layout(location = 0) out highp vec4 v_frag_FragColor;\n"
+ << "out gl_PerVertex\n"
+ << "{\n"
+ << " vec4 gl_Position;\n"
+ << "};\n"
<< "void main (void)\n"
<< "{\n"
<< " mediump int primitiveNdx = " << ((instanced) ? ("gl_InvocationID") : ("int(v_geom_vertexNdx[0].x)")) << ";\n"
@@ -775,6 +799,10 @@
<< "layout(location = 0) in highp vec4 v_geom_vertexNdx[];\n"
<< "layout(binding = 0) uniform highp sampler2D u_sampler;\n"
<< "layout(location = 0) out highp vec4 v_frag_FragColor;\n"
+ << "out gl_PerVertex\n"
+ << "{\n"
+ << " vec4 gl_Position;\n"
+ << "};\n"
<< "void main (void)\n"
<< "{\n"
<< " highp float primitiveNdx = " << ((instanced) ? ("float(gl_InvocationID)") : ("v_geom_vertexNdx[0].x")) << ";\n"
@@ -843,6 +871,7 @@
const bool flag = false);
void initPrograms (SourceCollections& sourceCollections) const;
virtual TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
protected:
const VariableTest m_test;
const bool m_flag;
@@ -855,6 +884,15 @@
{
}
+void BuiltinVariableRenderTest::checkSupport (Context& context) const
+{
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_GEOMETRY_SHADER);
+
+ if (m_test == TEST_POINT_SIZE)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SHADER_TESSELLATION_AND_GEOMETRY_POINT_SIZE);
+}
+
+
void BuiltinVariableRenderTest::initPrograms (SourceCollections& sourceCollections) const
{
{
@@ -1019,8 +1057,6 @@
TestInstance* BuiltinVariableRenderTest::createInstance (Context& context) const
{
- if (m_test == TEST_POINT_SIZE && !checkPointSize(context.getInstanceInterface(), context.getPhysicalDevice()))
- TCU_THROW(NotSupportedError, "Missing feature: pointSize");
return new BuiltinVariableRenderTestInstance(context, getName(), m_test, m_flag);
}
diff --git a/external/vulkancts/modules/vulkan/geometry/vktGeometryEmitGeometryShaderTests.cpp b/external/vulkancts/modules/vulkan/geometry/vktGeometryEmitGeometryShaderTests.cpp
index e855bc2..8c9014a 100644
--- a/external/vulkancts/modules/vulkan/geometry/vktGeometryEmitGeometryShaderTests.cpp
+++ b/external/vulkancts/modules/vulkan/geometry/vktGeometryEmitGeometryShaderTests.cpp
@@ -96,15 +96,16 @@
class EmitTest : public TestCase
{
public:
- EmitTest (TestContext& testCtx,
- const EmitTestSpec& emitTestSpec);
+ EmitTest (TestContext& testCtx,
+ const EmitTestSpec& emitTestSpec);
- void initPrograms (SourceCollections& sourceCollections) const;
- virtual TestInstance* createInstance (Context& context) const;
+ void initPrograms (SourceCollections& sourceCollections) const;
+ virtual TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
protected:
- string shaderGeometry (bool pointSize) const;
- const EmitTestSpec m_emitTestSpec;
+ string shaderGeometry (bool pointSize) const;
+ const EmitTestSpec m_emitTestSpec;
};
EmitTest::EmitTest (TestContext& testCtx, const EmitTestSpec& emitTestSpec)
@@ -115,6 +116,11 @@
}
+void EmitTest::checkSupport (Context& context) const
+{
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_GEOMETRY_SHADER);
+}
+
void EmitTest::initPrograms (SourceCollections& sourceCollections) const
{
{
diff --git a/external/vulkancts/modules/vulkan/geometry/vktGeometryInputGeometryShaderTests.cpp b/external/vulkancts/modules/vulkan/geometry/vktGeometryInputGeometryShaderTests.cpp
index b5a6315..6ec246d 100644
--- a/external/vulkancts/modules/vulkan/geometry/vktGeometryInputGeometryShaderTests.cpp
+++ b/external/vulkancts/modules/vulkan/geometry/vktGeometryInputGeometryShaderTests.cpp
@@ -119,14 +119,15 @@
class GeometryExpanderRenderTest : public TestCase
{
public:
- GeometryExpanderRenderTest (TestContext& testCtx,
- const PrimitiveTestSpec& inputPrimitives);
+ GeometryExpanderRenderTest (TestContext& testCtx,
+ const PrimitiveTestSpec& inputPrimitives);
- void initPrograms (SourceCollections& sourceCollections) const;
- virtual TestInstance* createInstance (Context& context) const;
+ void initPrograms (SourceCollections& sourceCollections) const;
+ virtual TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
protected:
- string shaderGeometry (bool pointSize) const;
+ string shaderGeometry (bool pointSize) const;
const VkPrimitiveTopology m_primitiveType;
const VkPrimitiveTopology m_outputType;
};
@@ -139,6 +140,11 @@
}
+void GeometryExpanderRenderTest::checkSupport (Context& context) const
+{
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_GEOMETRY_SHADER);
+}
+
void GeometryExpanderRenderTest::initPrograms (SourceCollections& sourceCollections) const
{
{
diff --git a/external/vulkancts/modules/vulkan/geometry/vktGeometryInstancedRenderingTests.cpp b/external/vulkancts/modules/vulkan/geometry/vktGeometryInstancedRenderingTests.cpp
index 24cb447..451adde 100644
--- a/external/vulkancts/modules/vulkan/geometry/vktGeometryInstancedRenderingTests.cpp
+++ b/external/vulkancts/modules/vulkan/geometry/vktGeometryInstancedRenderingTests.cpp
@@ -162,7 +162,7 @@
const Unique<VkImageView> colorAttachment (makeImageView (vk, device, *colorImage, VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorSubresourceRange));
const VkDeviceSize vertexBufferSize = sizeInBytes(perInstanceAttribute);
- const Unique<VkBuffer> vertexBuffer (makeBuffer(vk, device, makeBufferCreateInfo(vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT)));
+ 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));
const Unique<VkShaderModule> vertexModule (createShaderModule (vk, device, context.getBinaryCollection().get("vert"), 0u));
@@ -180,7 +180,7 @@
// Initialize vertex data
{
deMemcpy(vertexBufferAlloc->getHostPtr(), &perInstanceAttribute[0], (size_t)vertexBufferSize);
- flushMappedMemoryRange(vk, device, vertexBufferAlloc->getMemory(), vertexBufferAlloc->getOffset(), vertexBufferSize);
+ flushAlloc(vk, device, *vertexBufferAlloc);
}
beginCommandBuffer(vk, *cmdBuffer);
@@ -356,19 +356,15 @@
tcu::TestStatus test (Context& context, const TestParams params)
{
const DeviceInterface& vk = context.getDeviceInterface();
- const InstanceInterface& vki = context.getInstanceInterface();
const VkDevice device = context.getDevice();
- const VkPhysicalDevice physDevice = context.getPhysicalDevice();
Allocator& allocator = context.getDefaultAllocator();
- checkGeometryShaderSupport(vki, physDevice, params.numInvocations);
-
const UVec2 renderSize (128u, 128u);
const VkFormat colorFormat = VK_FORMAT_R8G8B8A8_UNORM;
const Vec4 clearColor = Vec4(0.0f, 0.0f, 0.0f, 1.0f);
const VkDeviceSize colorBufferSize = renderSize.x() * renderSize.y() * tcu::getPixelSize(mapVkFormat(colorFormat));
- const Unique<VkBuffer> colorBuffer (makeBuffer(vk, device, makeBufferCreateInfo(colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> colorBuffer (makeBuffer(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> colorBufferAlloc (bindBuffer(vk, device, allocator, *colorBuffer, MemoryRequirement::HostVisible));
const std::vector<Vec4> perInstancePosition = generatePerInstancePosition(params.numDrawInstances);
@@ -384,7 +380,7 @@
// Compare result
{
- invalidateMappedMemoryRange(vk, device, colorBufferAlloc->getMemory(), colorBufferAlloc->getOffset(), colorBufferSize);
+ invalidateAlloc(vk, device, *colorBufferAlloc);
const tcu::ConstPixelBufferAccess result(mapVkFormat(colorFormat), renderSize.x(), renderSize.y(), 1u, colorBufferAlloc->getHostPtr());
tcu::TextureLevel reference(mapVkFormat(colorFormat), renderSize.x(), renderSize.y());
@@ -397,6 +393,14 @@
}
}
+void checkSupport (Context& context, TestParams params)
+{
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_GEOMETRY_SHADER);
+
+ if (context.getDeviceProperties().limits.maxGeometryShaderInvocations < (deUint32)params.numInvocations)
+ TCU_THROW(NotSupportedError, (std::string("Unsupported limit: maxGeometryShaderInvocations < ") + de::toString(params.numInvocations)).c_str());
+}
+
} // anonymous
//! \note CTS requires shaders to be known ahead of time (some platforms use precompiled shaders), so we can't query a limit at runtime and generate
@@ -427,7 +431,7 @@
*pNumInvocations,
};
- addFunctionCaseWithPrograms(group.get(), caseName.str(), "", initPrograms, test, params);
+ addFunctionCaseWithPrograms(group.get(), caseName.str(), "", checkSupport, initPrograms, test, params);
}
return group.release();
diff --git a/external/vulkancts/modules/vulkan/geometry/vktGeometryLayeredRenderingTests.cpp b/external/vulkancts/modules/vulkan/geometry/vktGeometryLayeredRenderingTests.cpp
index 3e4f9a4..e40934c 100644
--- a/external/vulkancts/modules/vulkan/geometry/vktGeometryLayeredRenderingTests.cpp
+++ b/external/vulkancts/modules/vulkan/geometry/vktGeometryLayeredRenderingTests.cpp
@@ -1185,20 +1185,12 @@
tcu::TestStatus test (Context& context, const TestParams params)
{
- if (VK_IMAGE_VIEW_TYPE_3D == params.image.viewType &&
- (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_maintenance1")))
- TCU_THROW(NotSupportedError, "Extension VK_KHR_maintenance1 not supported");
-
const DeviceInterface& vk = context.getDeviceInterface();
- const InstanceInterface& vki = context.getInstanceInterface();
const VkDevice device = context.getDevice();
- const VkPhysicalDevice physDevice = context.getPhysicalDevice();
const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
const VkQueue queue = context.getUniversalQueue();
Allocator& allocator = context.getDefaultAllocator();
- checkGeometryShaderSupport(vki, physDevice);
-
const VkFormat colorFormat = VK_FORMAT_R8G8B8A8_UNORM;
const deUint32 numLayers = (VK_IMAGE_VIEW_TYPE_3D == params.image.viewType ? params.image.size.depth : params.image.numLayers);
const Vec4 clearColor = Vec4(0.0f, 0.0f, 0.0f, 1.0f);
@@ -1212,7 +1204,7 @@
const UniquePtr<Allocation> colorImageAlloc (bindImage (vk, device, allocator, *colorImage, MemoryRequirement::Any));
const Unique<VkImageView> colorAttachment (makeImageView (vk, device, *colorImage, viewType, colorFormat, makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, numLayers)));
- const Unique<VkBuffer> colorBuffer (makeBuffer (vk, device, makeBufferCreateInfo(colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> colorBuffer (makeBuffer (vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> colorBufferAlloc (bindBuffer (vk, device, allocator, *colorBuffer, MemoryRequirement::HostVisible));
const Unique<VkShaderModule> vertexModule (createShaderModule (vk, device, context.getBinaryCollection().get("vert"), 0u));
@@ -1253,10 +1245,6 @@
tcu::TestStatus testLayeredReadBack (Context& context, const TestParams params)
{
- if (VK_IMAGE_VIEW_TYPE_3D == params.image.viewType &&
- (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_maintenance1")))
- TCU_THROW(NotSupportedError, "Extension VK_KHR_maintenance1 not supported");
-
const DeviceInterface& vk = context.getDeviceInterface();
const InstanceInterface& vki = context.getInstanceInterface();
const VkDevice device = context.getDevice();
@@ -1265,8 +1253,6 @@
const VkQueue queue = context.getUniversalQueue();
Allocator& allocator = context.getDefaultAllocator();
- checkGeometryShaderSupport(vki, physDevice);
-
const size_t passCount = 2;
const deUint32 numLayers = (VK_IMAGE_VIEW_TYPE_3D == params.image.viewType ? params.image.size.depth : params.image.numLayers);
const VkImageCreateFlags imageCreateFlags = (isCubeImageViewType(params.image.viewType) ? VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT : (VkImageCreateFlagBits)0) |
@@ -1282,6 +1268,9 @@
const bool dsUsed = (VK_IMAGE_VIEW_TYPE_3D != params.image.viewType);
const VkFormat dsFormat = VK_FORMAT_D24_UNORM_S8_UINT;
+ const VkImageType dsImageType = (imageType == VK_IMAGE_TYPE_3D ? VK_IMAGE_TYPE_2D : imageType); // depth/stencil 2D_ARRAY attachments cannot be taken from 3D image, use 2D_ARRAY image instead.
+ const VkExtent3D dsImageSize = makeExtent3D(params.image.size.width, params.image.size.height, 1u);
+ const VkImageCreateFlags dsImageCreateFlags = (isCubeImageViewType(params.image.viewType) ? VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT : (VkImageCreateFlagBits)0);
const deUint32 dsImagePixelSize = static_cast<deUint32>(tcu::getPixelSize(mapVkFormat(dsFormat)));
const VkImageUsageFlags dsImageUsage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
const VkImageAspectFlags dsAspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
@@ -1296,15 +1285,15 @@
const Unique<VkImage> colorImage (makeImage (vk, device, makeImageCreateInfo(imageCreateFlags, imageType, colorFormat, params.image.size, params.image.numLayers, colorImageUsage)));
const UniquePtr<Allocation> colorImageAlloc (bindImage (vk, device, allocator, *colorImage, MemoryRequirement::Any));
const Unique<VkImageView> colorAttachment (makeImageView (vk, device, *colorImage, viewType, colorFormat, makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, numLayers)));
- const Unique<VkBuffer> colorBuffer (makeBuffer (vk, device, makeBufferCreateInfo(colorBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> colorBuffer (makeBuffer (vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> colorBufferAlloc (bindBuffer (vk, device, allocator, *colorBuffer, MemoryRequirement::HostVisible));
- const Unique<VkImage> dsImage (makeImage (vk, device, makeImageCreateInfo(imageCreateFlags, imageType, dsFormat, params.image.size, params.image.numLayers, dsImageUsage)));
+ const Unique<VkImage> dsImage (makeImage (vk, device, makeImageCreateInfo(dsImageCreateFlags, dsImageType, dsFormat, dsImageSize, numLayers, dsImageUsage)));
const UniquePtr<Allocation> dsImageAlloc (bindImage (vk, device, allocator, *dsImage, MemoryRequirement::Any));
const Unique<VkImageView> dsAttachment (makeImageView (vk, device, *dsImage, viewType, dsFormat, makeImageSubresourceRange(dsAspectFlags, 0u, 1u, 0u, numLayers)));
- const Unique<VkBuffer> depthBuffer (makeBuffer (vk, device, makeBufferCreateInfo(depthBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> depthBuffer (makeBuffer (vk, device, depthBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> depthBufferAlloc (bindBuffer (vk, device, allocator, *depthBuffer, MemoryRequirement::HostVisible));
- const Unique<VkBuffer> stencilBuffer (makeBuffer (vk, device, makeBufferCreateInfo(stencilBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> stencilBuffer (makeBuffer (vk, device, stencilBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> stencilBufferAlloc (bindBuffer (vk, device, allocator, *stencilBuffer, MemoryRequirement::HostVisible));
const VkImageView attachments[] = {*colorAttachment, *dsAttachment};
@@ -1348,7 +1337,7 @@
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 VkImageSubresourceRange colorSubresRange = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, params.image.numLayers);
- const VkImageSubresourceRange dsSubresRange = makeImageSubresourceRange(dsAspectFlags, 0u, 1u, 0u, params.image.numLayers);
+ const VkImageSubresourceRange dsSubresRange = makeImageSubresourceRange(dsAspectFlags, 0u, 1u, 0u, numLayers);
std::string result;
beginCommandBuffer(vk, *cmdBuffer);
@@ -1366,13 +1355,14 @@
for (deUint32 layerNdx = 0; layerNdx < numLayers; ++layerNdx)
{
- const deUint32 imageDepth = (VK_IMAGE_VIEW_TYPE_3D == params.image.viewType) ? layerNdx : 0u;
- const deUint32 layer = (VK_IMAGE_VIEW_TYPE_3D == params.image.viewType) ? 0u : layerNdx;
- const VkOffset3D imageOffset = makeOffset3D(0u, 0u, imageDepth);
const VkExtent3D imageExtent = makeExtent3D(params.image.size.width, params.image.size.height, 1u);
// Clear color image with initial value
{
+ const deUint32 layer = (VK_IMAGE_VIEW_TYPE_3D == params.image.viewType) ? 0u : layerNdx;
+ const deUint32 imageDepth = (VK_IMAGE_VIEW_TYPE_3D == params.image.viewType) ? layerNdx : 0u;
+ const VkOffset3D imageOffset = makeOffset3D(0u, 0u, imageDepth);
+
const tcu::Vec4 clearColor = scaleColor(s_colors[layerNdx % DE_LENGTH_OF_ARRAY(s_colors)], 0.25f);
const deUint32 bufferSliceSize = params.image.size.width * params.image.size.height * colorImagePixelSize;
const VkDeviceSize bufferOffset = layerNdx * bufferSliceSize;
@@ -1389,8 +1379,8 @@
const float depthValue = 1.0f;
const deUint32 bufferSliceSize = params.image.size.width * params.image.size.height * dsImagePixelSize;
const VkDeviceSize bufferOffset = layerNdx * bufferSliceSize;
- const VkImageSubresourceLayers imageSubresource = makeImageSubresourceLayers(VK_IMAGE_ASPECT_DEPTH_BIT, 0u, layer, 1u);
- const VkBufferImageCopy bufferImageCopyRegion = makeBufferImageCopy(bufferOffset, imageSubresource, imageOffset, imageExtent);
+ const VkImageSubresourceLayers imageSubresource = makeImageSubresourceLayers(VK_IMAGE_ASPECT_DEPTH_BIT, 0u, layerNdx, 1u);
+ const VkBufferImageCopy bufferImageCopyRegion = makeBufferImageCopy(bufferOffset, imageSubresource, makeOffset3D(0u, 0u, 0u), imageExtent);
fillBuffer(vk, device, *depthBufferAlloc, bufferOffset, bufferSliceSize, dsFormat, depthValue);
vk.cmdCopyBufferToImage(*cmdBuffer, *depthBuffer, *dsImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1u, &bufferImageCopyRegion);
@@ -1402,8 +1392,8 @@
const deUint8 stencilValue = 0;
const deUint32 bufferSliceSize = params.image.size.width * params.image.size.height * stencilPixelSize;
const VkDeviceSize bufferOffset = layerNdx * bufferSliceSize;
- const VkImageSubresourceLayers imageSubresource = makeImageSubresourceLayers(VK_IMAGE_ASPECT_STENCIL_BIT, 0u, layer, 1u);
- const VkBufferImageCopy bufferImageCopyRegion = makeBufferImageCopy(bufferOffset, imageSubresource, imageOffset, imageExtent);
+ const VkImageSubresourceLayers imageSubresource = makeImageSubresourceLayers(VK_IMAGE_ASPECT_STENCIL_BIT, 0u, layerNdx, 1u);
+ const VkBufferImageCopy bufferImageCopyRegion = makeBufferImageCopy(bufferOffset, imageSubresource, makeOffset3D(0u, 0u, 0u), imageExtent);
deUint8* bufferStart = static_cast<deUint8*>((*stencilBufferAlloc).getHostPtr());
deUint8* bufferLayerStart = &bufferStart[bufferOffset];
@@ -1495,8 +1485,8 @@
{
const VkImageMemoryBarrier preCopyBarrier = makeImageMemoryBarrier(VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT,
VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *dsImage, dsSubresRange);
- const VkBufferImageCopy depthCopyRegion = makeBufferImageCopy(params.image.size, makeImageSubresourceLayers(VK_IMAGE_ASPECT_DEPTH_BIT, 0u, 0u, params.image.numLayers));
- const VkBufferImageCopy stencilCopyRegion = makeBufferImageCopy(params.image.size, makeImageSubresourceLayers(VK_IMAGE_ASPECT_STENCIL_BIT, 0u, 0u, params.image.numLayers));
+ const VkBufferImageCopy depthCopyRegion = makeBufferImageCopy(dsImageSize, makeImageSubresourceLayers(VK_IMAGE_ASPECT_DEPTH_BIT, 0u, 0u, numLayers));
+ const VkBufferImageCopy stencilCopyRegion = makeBufferImageCopy(dsImageSize, makeImageSubresourceLayers(VK_IMAGE_ASPECT_STENCIL_BIT, 0u, 0u, numLayers));
const VkBufferMemoryBarrier postCopyBarriers[] =
{
makeBufferMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT, *depthBuffer, 0ull, VK_WHOLE_SIZE),
@@ -1536,26 +1526,12 @@
tcu::TestStatus testSecondaryCmdBuffer (Context& context, const TestParams params)
{
- if (VK_IMAGE_VIEW_TYPE_3D == params.image.viewType &&
- (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_maintenance1")))
- {
- TCU_THROW(NotSupportedError, "Extension VK_KHR_maintenance1 not supported");
- }
-
const DeviceInterface& vk = context.getDeviceInterface();
- const InstanceInterface& vki = context.getInstanceInterface();
const VkDevice device = context.getDevice();
- const VkPhysicalDevice physDevice = context.getPhysicalDevice();
- const VkPhysicalDeviceFeatures features = getPhysicalDeviceFeatures(vki, physDevice);
const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
const VkQueue queue = context.getUniversalQueue();
Allocator& allocator = context.getDefaultAllocator();
- checkGeometryShaderSupport(vki, physDevice);
-
- if (!features.fragmentStoresAndAtomics)
- TCU_THROW(NotSupportedError, "Storage image stores not supported in fragment shader");
-
const VkFormat colorFormat = VK_FORMAT_R8G8B8A8_UNORM;
const deUint32 numLayers = (VK_IMAGE_VIEW_TYPE_3D == params.image.viewType ? params.image.size.depth : params.image.numLayers);
const Vec4 clearColor = Vec4(0.0f, 0.0f, 0.0f, 1.0f);
@@ -1575,7 +1551,7 @@
const Unique<VkImageView> offscreenImageView (makeImageView(vk, device, *offscreenImage, params.image.viewType, colorFormat,
makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, params.image.numLayers)));
- const Unique<VkBuffer> colorBuffer (makeBuffer(vk, device, makeBufferCreateInfo(colorBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> colorBuffer (makeBuffer(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> colorBufferAlloc (bindBuffer(vk, device, allocator, *colorBuffer, MemoryRequirement::HostVisible));
const Move<VkDescriptorPool> descriptorPool = DescriptorPoolBuilder() .addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1u) .build(vk, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
@@ -1600,7 +1576,7 @@
const VkDescriptorImageInfo imageDescriptorInfo = makeDescriptorImageInfo(DE_NULL, *offscreenImageView, VK_IMAGE_LAYOUT_GENERAL);
- DescriptorSetUpdateBuilder()
+ DescriptorSetUpdateBuilder()
.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &imageDescriptorInfo)
.update(vk, device);
@@ -1783,6 +1759,17 @@
return tcu::TestStatus::pass("OK");
}
+void checkSupport (Context& context, const TestParams params)
+{
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_GEOMETRY_SHADER);
+
+ if (params.image.viewType == VK_IMAGE_VIEW_TYPE_3D)
+ context.requireDeviceFunctionality("VK_KHR_maintenance1");
+
+ if (params.testType == TEST_TYPE_SECONDARY_CMD_BUFFER)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_FRAGMENT_STORES_AND_ATOMICS);
+}
+
} // anonymous
tcu::TestCaseGroup* createLayeredRenderingTests (tcu::TestContext& testCtx)
@@ -1830,15 +1817,15 @@
};
if (testTypes[testTypeNdx].test == TEST_TYPE_LAYERED_READBACK)
- addFunctionCaseWithPrograms(viewTypeGroup.get(), testTypes[testTypeNdx].name, testTypes[testTypeNdx].description, initPrograms, testLayeredReadBack, params);
+ addFunctionCaseWithPrograms(viewTypeGroup.get(), testTypes[testTypeNdx].name, testTypes[testTypeNdx].description, checkSupport, initPrograms, testLayeredReadBack, params);
else if (testTypes[testTypeNdx].test == TEST_TYPE_SECONDARY_CMD_BUFFER)
{
- addFunctionCaseWithPrograms(viewTypeGroup.get(), "secondary_cmd_buffer", testTypes[testTypeNdx].description, initPrograms, testSecondaryCmdBuffer, params);
+ addFunctionCaseWithPrograms(viewTypeGroup.get(), "secondary_cmd_buffer", testTypes[testTypeNdx].description, checkSupport, initPrograms, testSecondaryCmdBuffer, params);
params.inheritFramebuffer = true;
- addFunctionCaseWithPrograms(viewTypeGroup.get(), "secondary_cmd_buffer_inherit_framebuffer", testTypes[testTypeNdx].description, initPrograms, testSecondaryCmdBuffer, params);
+ addFunctionCaseWithPrograms(viewTypeGroup.get(), "secondary_cmd_buffer_inherit_framebuffer", testTypes[testTypeNdx].description, checkSupport, initPrograms, testSecondaryCmdBuffer, params);
}
else
- addFunctionCaseWithPrograms(viewTypeGroup.get(), testTypes[testTypeNdx].name, testTypes[testTypeNdx].description, initPrograms, test, params);
+ addFunctionCaseWithPrograms(viewTypeGroup.get(), testTypes[testTypeNdx].name, testTypes[testTypeNdx].description, checkSupport, initPrograms, test, params);
}
group->addChild(viewTypeGroup.release());
diff --git a/external/vulkancts/modules/vulkan/geometry/vktGeometryTestsUtil.cpp b/external/vulkancts/modules/vulkan/geometry/vktGeometryTestsUtil.cpp
index 2869da0..709e21d 100644
--- a/external/vulkancts/modules/vulkan/geometry/vktGeometryTestsUtil.cpp
+++ b/external/vulkancts/modules/vulkan/geometry/vktGeometryTestsUtil.cpp
@@ -394,21 +394,6 @@
return imageInfo;
}
-VkBufferImageCopy makeBufferImageCopy (const VkExtent3D extent,
- const VkImageSubresourceLayers subresourceLayers)
-{
- const VkBufferImageCopy copyParams =
- {
- 0ull, // VkDeviceSize bufferOffset;
- 0u, // deUint32 bufferRowLength;
- 0u, // deUint32 bufferImageHeight;
- subresourceLayers, // VkImageSubresourceLayers imageSubresource;
- makeOffset3D(0, 0, 0), // VkOffset3D imageOffset;
- extent, // VkExtent3D imageExtent;
- };
- return copyParams;
-}
-
VkBufferImageCopy makeBufferImageCopy (const vk::VkDeviceSize& bufferOffset,
const vk::VkImageSubresourceLayers& imageSubresource,
const vk::VkOffset3D& imageOffset,
@@ -440,26 +425,6 @@
return false;
}
-de::MovePtr<Allocation> bindImage (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkImage image, const MemoryRequirement requirement)
-{
- de::MovePtr<Allocation> alloc = allocator.allocate(getImageMemoryRequirements(vk, device, image), requirement);
- VK_CHECK(vk.bindImageMemory(device, image, alloc->getMemory(), alloc->getOffset()));
- return alloc;
-}
-
-de::MovePtr<Allocation> bindBuffer (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkBuffer buffer, const MemoryRequirement requirement)
-{
- de::MovePtr<Allocation> alloc(allocator.allocate(getBufferMemoryRequirements(vk, device, buffer), requirement));
- VK_CHECK(vk.bindBufferMemory(device, buffer, alloc->getMemory(), alloc->getOffset()));
- return alloc;
-}
-
-void zeroBuffer (const DeviceInterface& vk, const VkDevice device, const Allocation& alloc, const VkDeviceSize size)
-{
- deMemset(alloc.getHostPtr(), 0, static_cast<std::size_t>(size));
- flushMappedMemoryRange(vk, device, alloc.getMemory(), alloc.getOffset(), size);
-}
-
void fillBuffer (const DeviceInterface& vk, const VkDevice device, const Allocation& alloc, const VkDeviceSize offset, const VkDeviceSize size, const VkFormat format, const tcu::Vec4& color)
{
const tcu::TextureFormat textureFormat = mapVkFormat(format);
@@ -504,17 +469,5 @@
return features.shaderTessellationAndGeometryPointSize;
}
-void checkGeometryShaderSupport (const InstanceInterface& vki, const VkPhysicalDevice physDevice, const int numGeometryShaderInvocations)
-{
- const VkPhysicalDeviceFeatures features = getPhysicalDeviceFeatures (vki, physDevice);
- const VkPhysicalDeviceLimits limits = getPhysicalDeviceProperties(vki, physDevice).limits;
-
- if (!features.geometryShader)
- TCU_THROW(NotSupportedError, "Missing feature: geometryShader");
-
- if (numGeometryShaderInvocations != 0 && limits.maxGeometryShaderInvocations < static_cast<deUint32>(numGeometryShaderInvocations))
- TCU_THROW(NotSupportedError, ("Unsupported limit: maxGeometryShaderInvocations < " + de::toString(numGeometryShaderInvocations)).c_str());
-}
-
} //geometry
} //vkt
diff --git a/external/vulkancts/modules/vulkan/geometry/vktGeometryTestsUtil.hpp b/external/vulkancts/modules/vulkan/geometry/vktGeometryTestsUtil.hpp
index 1dfa0eb..1c65000 100644
--- a/external/vulkancts/modules/vulkan/geometry/vktGeometryTestsUtil.hpp
+++ b/external/vulkancts/modules/vulkan/geometry/vktGeometryTestsUtil.hpp
@@ -168,30 +168,14 @@
std::size_t calcOutputVertices (const vk::VkPrimitiveTopology& inputType);
vk::VkImageCreateInfo makeImageCreateInfo (const tcu::IVec2& size, const vk::VkFormat format, const vk::VkImageUsageFlags usage, const deUint32 numArrayLayers = 1u);
-vk::VkBufferImageCopy makeBufferImageCopy (const vk::VkExtent3D extent, const vk::VkImageSubresourceLayers subresourceLayers);
vk::VkBufferImageCopy makeBufferImageCopy (const vk::VkDeviceSize& bufferOffset, const vk::VkImageSubresourceLayers& imageSubresource, const vk::VkOffset3D& imageOffset, const vk::VkExtent3D& imageExtent);
-de::MovePtr<vk::Allocation> bindImage (const vk::DeviceInterface& vk, const vk::VkDevice device, vk::Allocator& allocator, const vk::VkImage image, const vk::MemoryRequirement requirement);
-de::MovePtr<vk::Allocation> bindBuffer (const vk::DeviceInterface& vk, const vk::VkDevice device, vk::Allocator& allocator, const vk::VkBuffer buffer, const vk::MemoryRequirement requirement);
bool compareWithFileImage (Context& context, const tcu::ConstPixelBufferAccess& resultImage, std::string name);
void fillBuffer (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::Allocation& alloc, const vk::VkDeviceSize size, const vk::VkDeviceSize offset, const vk::VkFormat format, const tcu::Vec4& color);
void fillBuffer (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::Allocation& alloc, const vk::VkDeviceSize size, const vk::VkDeviceSize offset, const vk::VkFormat format, const float depth);
-void zeroBuffer (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::Allocation& alloc, const vk::VkDeviceSize size);
-
-void checkGeometryShaderSupport (const vk::InstanceInterface& vki, const vk::VkPhysicalDevice physDevice, const int numGeometryShaderInvocations = 0);
vk::VkBool32 checkPointSize (const vk::InstanceInterface& vki, const vk::VkPhysicalDevice physDevice);
-inline vk::Move<vk::VkBuffer> makeBuffer (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkBufferCreateInfo& createInfo)
-{
- return createBuffer(vk, device, &createInfo);
-}
-
-inline vk::Move<vk::VkImage> makeImage (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkImageCreateInfo& createInfo)
-{
- return createImage(vk, device, &createInfo);
-}
-
} //vkt
} //geometry
diff --git a/external/vulkancts/modules/vulkan/geometry/vktGeometryVaryingGeometryShaderTests.cpp b/external/vulkancts/modules/vulkan/geometry/vktGeometryVaryingGeometryShaderTests.cpp
index 1a25b4e..9533abe 100644
--- a/external/vulkancts/modules/vulkan/geometry/vktGeometryVaryingGeometryShaderTests.cpp
+++ b/external/vulkancts/modules/vulkan/geometry/vktGeometryVaryingGeometryShaderTests.cpp
@@ -100,6 +100,7 @@
VaryingTest (TestContext& testCtx,
const VaryingTestSpec& varyingTestSpec);
+ void checkSupport (Context& context) const;
void initPrograms (SourceCollections& sourceCollections) const;
virtual TestInstance* createInstance (Context& context) const;
@@ -115,6 +116,11 @@
}
+void VaryingTest::checkSupport (Context& context) const
+{
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_GEOMETRY_SHADER);
+}
+
void VaryingTest::initPrograms (SourceCollections& sourceCollections) const
{
{
diff --git a/external/vulkancts/modules/vulkan/image/vktImageAtomicOperationTests.cpp b/external/vulkancts/modules/vulkan/image/vktImageAtomicOperationTests.cpp
index 744301a..244fe05 100644
--- a/external/vulkancts/modules/vulkan/image/vktImageAtomicOperationTests.cpp
+++ b/external/vulkancts/modules/vulkan/image/vktImageAtomicOperationTests.cpp
@@ -251,19 +251,20 @@
class BinaryAtomicEndResultCase : public vkt::TestCase
{
public:
- BinaryAtomicEndResultCase (tcu::TestContext& testCtx,
- const string& name,
- const string& description,
- const ImageType imageType,
- const tcu::UVec3& imageSize,
- const tcu::TextureFormat& format,
- const AtomicOperation operation,
- const glu::GLSLVersion glslVersion);
+ BinaryAtomicEndResultCase (tcu::TestContext& testCtx,
+ const string& name,
+ const string& description,
+ const ImageType imageType,
+ const tcu::UVec3& imageSize,
+ const tcu::TextureFormat& format,
+ const AtomicOperation operation,
+ const glu::GLSLVersion glslVersion);
- void initPrograms (SourceCollections& sourceCollections) const;
- TestInstance* createInstance (Context& context) const;
+ void initPrograms (SourceCollections& sourceCollections) const;
+ TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
+
private:
-
const ImageType m_imageType;
const tcu::UVec3 m_imageSize;
const tcu::TextureFormat m_format;
@@ -288,6 +289,12 @@
{
}
+void BinaryAtomicEndResultCase::checkSupport (Context& context) const
+{
+ if (m_imageType == IMAGE_TYPE_CUBE_ARRAY)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_IMAGE_CUBE_ARRAY);
+}
+
void BinaryAtomicEndResultCase::initPrograms (SourceCollections& sourceCollections) const
{
const string versionDecl = glu::getGLSLVersionDeclaration(m_glslVersion);
@@ -325,19 +332,20 @@
class BinaryAtomicIntermValuesCase : public vkt::TestCase
{
public:
- BinaryAtomicIntermValuesCase (tcu::TestContext& testCtx,
- const string& name,
- const string& description,
- const ImageType imageType,
- const tcu::UVec3& imageSize,
- const tcu::TextureFormat& format,
- const AtomicOperation operation,
- const glu::GLSLVersion glslVersion);
+ BinaryAtomicIntermValuesCase (tcu::TestContext& testCtx,
+ const string& name,
+ const string& description,
+ const ImageType imageType,
+ const tcu::UVec3& imageSize,
+ const tcu::TextureFormat& format,
+ const AtomicOperation operation,
+ const glu::GLSLVersion glslVersion);
- void initPrograms (SourceCollections& sourceCollections) const;
- TestInstance* createInstance (Context& context) const;
+ void initPrograms (SourceCollections& sourceCollections) const;
+ TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
+
private:
-
const ImageType m_imageType;
const tcu::UVec3 m_imageSize;
const tcu::TextureFormat m_format;
@@ -362,6 +370,12 @@
{
}
+void BinaryAtomicIntermValuesCase::checkSupport (Context& context) const
+{
+ if (m_imageType == IMAGE_TYPE_CUBE_ARRAY)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_IMAGE_CUBE_ARRAY);
+}
+
void BinaryAtomicIntermValuesCase::initPrograms (SourceCollections& sourceCollections) const
{
const string versionDecl = glu::getGLSLVersionDeclaration(m_glslVersion);
@@ -420,7 +434,6 @@
virtual void commandsAfterCompute (const VkCommandBuffer cmdBuffer) const = 0;
virtual bool verifyResult (Allocation& outputBufferAllocation) const = 0;
- void checkRequirements (void) const;
protected:
const string m_name;
@@ -452,14 +465,6 @@
{
}
-void BinaryAtomicInstanceBase::checkRequirements (void) const
-{
- if (m_imageType == IMAGE_TYPE_CUBE_ARRAY && !m_context.getDeviceFeatures().imageCubeArray)
- {
- TCU_THROW(NotSupportedError, "imageCubeArray feature not supported");
- }
-}
-
tcu::TestStatus BinaryAtomicInstanceBase::iterate (void)
{
const VkDevice device = m_context.getDevice();
@@ -470,8 +475,6 @@
const VkDeviceSize imageSizeInBytes = tcu::getPixelSize(m_format) * getNumPixels(m_imageType, m_imageSize);
const VkDeviceSize outBuffSizeInBytes = getOutputBufferSize();
- checkRequirements();
-
const VkImageCreateInfo imageParams =
{
VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
diff --git a/external/vulkancts/modules/vulkan/image/vktImageCompressionTranscodingSupport.cpp b/external/vulkancts/modules/vulkan/image/vktImageCompressionTranscodingSupport.cpp
index ae83408..6f5a7b8 100644
--- a/external/vulkancts/modules/vulkan/image/vktImageCompressionTranscodingSupport.cpp
+++ b/external/vulkancts/modules/vulkan/image/vktImageCompressionTranscodingSupport.cpp
@@ -1944,6 +1944,9 @@
TCU_THROW(NotSupportedError, "Format storage feature not supported");
if ((usageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) && !(properties.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT))
TCU_THROW(NotSupportedError, "Format color attachment feature not supported");
+ if ((usageFlags & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) && !(properties.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) &&
+ !(properties.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT))
+ TCU_THROW(NotSupportedError, "Format color/depth/stencil attachment feature not supported for input attachment usage");
const VkImageCreateInfo createImageInfo =
{
@@ -2519,6 +2522,7 @@
const TestParameters& parameters);
void initPrograms (SourceCollections& programCollection) const;
TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
protected:
const TestParameters m_parameters;
};
@@ -2840,28 +2844,19 @@
}
}
-TestInstance* TexelViewCompatibleCase::createInstance (Context& context) const
+void TexelViewCompatibleCase::checkSupport (Context& context) const
{
const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
const InstanceInterface& vk = context.getInstanceInterface();
- if (!m_parameters.useMipmaps)
- {
- DE_ASSERT(getNumLayers(m_parameters.imageType, m_parameters.size) == 1u);
- }
-
- DE_ASSERT(getLayerSize(m_parameters.imageType, m_parameters.size).x() > 0u);
- DE_ASSERT(getLayerSize(m_parameters.imageType, m_parameters.size).y() > 0u);
-
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_maintenance2"))
- TCU_THROW(NotSupportedError, "Extension VK_KHR_maintenance2 not supported");
+ context.requireDeviceFunctionality("VK_KHR_maintenance2");
{
VkImageFormatProperties imageFormatProperties;
- if (VK_ERROR_FORMAT_NOT_SUPPORTED == vk.getPhysicalDeviceImageFormatProperties(physicalDevice, m_parameters.formatUncompressed,
- mapImageType(m_parameters.imageType), VK_IMAGE_TILING_OPTIMAL,
- m_parameters.uncompressedImageUsage, 0u, &imageFormatProperties))
+ if (vk.getPhysicalDeviceImageFormatProperties(physicalDevice, m_parameters.formatUncompressed,
+ mapImageType(m_parameters.imageType), VK_IMAGE_TILING_OPTIMAL,
+ m_parameters.uncompressedImageUsage, 0u, &imageFormatProperties) == VK_ERROR_FORMAT_NOT_SUPPORTED)
TCU_THROW(NotSupportedError, "Operation not supported with this image format");
if (VK_ERROR_FORMAT_NOT_SUPPORTED == vk.getPhysicalDeviceImageFormatProperties(physicalDevice, m_parameters.formatCompressed,
@@ -2873,7 +2868,7 @@
}
{
- const VkPhysicalDeviceFeatures physicalDeviceFeatures = getPhysicalDeviceFeatures (vk, physicalDevice);
+ const VkPhysicalDeviceFeatures physicalDeviceFeatures = getPhysicalDeviceFeatures(vk, physicalDevice);
if (deInRange32(m_parameters.formatCompressed, VK_FORMAT_BC1_RGB_UNORM_BLOCK, VK_FORMAT_BC7_SRGB_BLOCK) &&
!physicalDeviceFeatures.textureCompressionBC)
@@ -2892,6 +2887,15 @@
!physicalDeviceFeatures.shaderStorageImageExtendedFormats)
TCU_THROW(NotSupportedError, "Storage view format requires shaderStorageImageExtended");
}
+}
+
+TestInstance* TexelViewCompatibleCase::createInstance (Context& context) const
+{
+ if (!m_parameters.useMipmaps)
+ DE_ASSERT(getNumLayers(m_parameters.imageType, m_parameters.size) == 1u);
+
+ DE_ASSERT(getLayerSize(m_parameters.imageType, m_parameters.size).x() > 0u);
+ DE_ASSERT(getLayerSize(m_parameters.imageType, m_parameters.size).y() > 0u);
switch (m_parameters.shader)
{
diff --git a/external/vulkancts/modules/vulkan/image/vktImageLoadStoreTests.cpp b/external/vulkancts/modules/vulkan/image/vktImageLoadStoreTests.cpp
index 56ef508..763c059 100644
--- a/external/vulkancts/modules/vulkan/image/vktImageLoadStoreTests.cpp
+++ b/external/vulkancts/modules/vulkan/image/vktImageLoadStoreTests.cpp
@@ -50,9 +50,11 @@
#include "tcuTexture.hpp"
#include "tcuTextureUtil.hpp"
#include "tcuFloat.hpp"
+#include "tcuStringTemplate.hpp"
#include <string>
#include <vector>
+#include <map>
using namespace vk;
@@ -395,16 +397,13 @@
void StoreTest::checkSupport (Context& context) const
{
- const VkPhysicalDeviceFeatures features (context.getDeviceFeatures());
- const vk::VkFormatProperties formatProperties (vk::getPhysicalDeviceFormatProperties(context.getInstanceInterface(),
- context.getPhysicalDevice(),
- m_format));
+ const VkFormatProperties formatProperties (getPhysicalDeviceFormatProperties(context.getInstanceInterface(), context.getPhysicalDevice(), m_format));
- if (!m_declareImageFormatInShader && !features.shaderStorageImageWriteWithoutFormat)
- TCU_THROW(NotSupportedError, "shaderStorageImageWriteWithoutFormat feature not supported");
+ if (!m_declareImageFormatInShader)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SHADER_STORAGE_IMAGE_WRITE_WITHOUT_FORMAT);
- if (m_texture.type() == IMAGE_TYPE_CUBE_ARRAY && !features.imageCubeArray)
- TCU_THROW(NotSupportedError, "imageCubeArray feature not supported");
+ if (m_texture.type() == IMAGE_TYPE_CUBE_ARRAY)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_IMAGE_CUBE_ARRAY);
if ((m_texture.type() != IMAGE_TYPE_BUFFER) && !(formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT))
TCU_THROW(NotSupportedError, "Format not supported for storage images");
@@ -608,7 +607,7 @@
const bool singleLayerBind);
protected:
- tcu::TestStatus verifyResult (void);
+ virtual tcu::TestStatus verifyResult (void);
// Add empty implementations for functions that might be not needed
void commandBeforeCompute (const VkCommandBuffer) {}
@@ -692,9 +691,9 @@
, m_allDescriptorSets (texture.numLayers())
, m_allImageViews (texture.numLayers())
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice device = m_context.getDevice();
- Allocator& allocator = m_context.getDefaultAllocator();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+ Allocator& allocator = m_context.getDefaultAllocator();
m_image = de::MovePtr<Image>(new Image(
vk, device, allocator,
@@ -935,7 +934,6 @@
void LoadStoreTest::checkSupport (Context& context) const
{
- const VkPhysicalDeviceFeatures features (context.getDeviceFeatures());
const vk::VkFormatProperties formatProperties (vk::getPhysicalDeviceFormatProperties(context.getInstanceInterface(),
context.getPhysicalDevice(),
m_format));
@@ -943,11 +941,11 @@
context.getPhysicalDevice(),
m_imageFormat));
- if (!m_declareImageFormatInShader && !features.shaderStorageImageReadWithoutFormat)
- TCU_THROW(NotSupportedError, "shaderStorageImageReadWithoutFormat feature not supported");
+ if (!m_declareImageFormatInShader)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SHADER_STORAGE_IMAGE_READ_WITHOUT_FORMAT);
- if (m_texture.type() == IMAGE_TYPE_CUBE_ARRAY && !features.imageCubeArray)
- TCU_THROW(NotSupportedError, "imageCubeArray feature not supported");
+ if (m_texture.type() == IMAGE_TYPE_CUBE_ARRAY)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_IMAGE_CUBE_ARRAY);
if ((m_texture.type() != IMAGE_TYPE_BUFFER) && !(formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT))
TCU_THROW(NotSupportedError, "Format not supported for storage images");
@@ -1352,6 +1350,461 @@
return new ImageLoadStoreTestInstance(context, m_texture, m_format, m_imageFormat, m_declareImageFormatInShader, m_singleLayerBind);
}
+class ImageExtendOperandTestInstance : public BaseTestInstance
+{
+public:
+ ImageExtendOperandTestInstance (Context& context,
+ const Texture& texture,
+ const VkFormat format,
+ const bool signExtend);
+
+ virtual ~ImageExtendOperandTestInstance (void) {};
+
+protected:
+
+ VkDescriptorSetLayout prepareDescriptors (void);
+ void commandBeforeCompute (const VkCommandBuffer cmdBuffer);
+ void commandBetweenShaderInvocations (const VkCommandBuffer cmdBuffer);
+ void commandAfterCompute (const VkCommandBuffer cmdBuffer);
+
+ void commandBindDescriptorsForLayer (const VkCommandBuffer cmdBuffer,
+ const VkPipelineLayout pipelineLayout,
+ const int layerNdx);
+
+ tcu::TestStatus verifyResult (void);
+
+protected:
+
+ bool m_signExtend;
+ bool m_isSigned;
+ tcu::TextureLevel m_inputImageData;
+
+ de::MovePtr<Image> m_imageSrc; // source image
+ SharedVkImageView m_imageSrcView;
+ VkDeviceSize m_imageSrcSize;
+
+ de::MovePtr<Image> m_imageDst; // dest image
+ SharedVkImageView m_imageDstView;
+ VkFormat m_imageDstFormat;
+ VkDeviceSize m_imageDstSize;
+
+ de::MovePtr<Buffer> m_buffer; // result buffer
+
+ Move<VkDescriptorSetLayout> m_descriptorSetLayout;
+ Move<VkDescriptorPool> m_descriptorPool;
+ SharedVkDescriptorSet m_descriptorSet;
+};
+
+ImageExtendOperandTestInstance::ImageExtendOperandTestInstance (Context& context,
+ const Texture& texture,
+ const VkFormat format,
+ const bool signExtend)
+ : BaseTestInstance (context, texture, format, true, true)
+ , m_signExtend (signExtend)
+{
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+ Allocator& allocator = m_context.getDefaultAllocator();
+ const deInt32 width = texture.size().x();
+ const deInt32 height = texture.size().y();
+ const tcu::TextureFormat textureFormat = mapVkFormat(m_format);
+
+ // Generate reference image
+ m_isSigned = (getTextureChannelClass(textureFormat.type) == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER);
+ m_inputImageData.setStorage(textureFormat, width, height, 1);
+ const tcu::PixelBufferAccess access = m_inputImageData.getAccess();
+ int valueStart = m_isSigned ? -width / 2 : 0;
+ for (int x = 0; x < width; ++x)
+ for (int y = 0; y < height; ++y)
+ {
+ const tcu::IVec4 color(valueStart + x, valueStart + y, valueStart, valueStart);
+ access.setPixel(color, x, y);
+ }
+
+ // Create source image
+ m_imageSrc = de::MovePtr<Image>(new Image(
+ vk, device, allocator,
+ makeImageCreateInfo(m_texture, m_format, VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0u),
+ MemoryRequirement::Any));
+
+ // Create destination image
+ m_imageDstFormat = m_isSigned ? VK_FORMAT_R32G32B32A32_SINT : VK_FORMAT_R32G32B32A32_UINT;
+ m_imageDst = de::MovePtr<Image>(new Image(
+ vk, device, allocator,
+ makeImageCreateInfo(m_texture, m_imageDstFormat, VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0u),
+ MemoryRequirement::Any));
+
+ // Compute image and buffer sizes
+ m_imageSrcSize = width * height * tcu::getPixelSize(textureFormat);
+ m_imageDstSize = width * height * tcu::getPixelSize(mapVkFormat(m_imageDstFormat));
+ VkDeviceSize bufferSizeBytes = de::max(m_imageSrcSize, m_imageDstSize);
+
+ // Create helper buffer able to store input data and image write result
+ m_buffer = de::MovePtr<Buffer>(new Buffer(
+ vk, device, allocator,
+ makeBufferCreateInfo(bufferSizeBytes, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT),
+ MemoryRequirement::HostVisible));
+
+ const Allocation& alloc = m_buffer->getAllocation();
+ deMemcpy(alloc.getHostPtr(), m_inputImageData.getAccess().getDataPtr(), static_cast<size_t>(m_imageSrcSize));
+ flushAlloc(vk, device, alloc);
+}
+
+VkDescriptorSetLayout ImageExtendOperandTestInstance::prepareDescriptors (void)
+{
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+
+ m_descriptorSetLayout = DescriptorSetLayoutBuilder()
+ .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT)
+ .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT)
+ .build(vk, device);
+
+ m_descriptorPool = DescriptorPoolBuilder()
+ .addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1)
+ .addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1)
+ .build(vk, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1);
+
+ const VkImageViewType viewType = mapImageViewType(m_texture.type());
+ const VkImageSubresourceRange subresourceRange = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
+
+ m_descriptorSet = makeVkSharedPtr(makeDescriptorSet(vk, device, *m_descriptorPool, *m_descriptorSetLayout));
+ m_imageSrcView = makeVkSharedPtr(makeImageView(vk, device, m_imageSrc->get(), viewType, m_format, subresourceRange));
+ m_imageDstView = makeVkSharedPtr(makeImageView(vk, device, m_imageDst->get(), viewType, m_imageDstFormat, subresourceRange));
+
+ return *m_descriptorSetLayout; // not passing the ownership
+}
+
+void ImageExtendOperandTestInstance::commandBindDescriptorsForLayer (const VkCommandBuffer cmdBuffer, const VkPipelineLayout pipelineLayout, const int layerNdx)
+{
+ DE_UNREF(layerNdx);
+
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+ const VkDescriptorSet descriptorSet = **m_descriptorSet;
+
+ const VkDescriptorImageInfo descriptorSrcImageInfo = makeDescriptorImageInfo(DE_NULL, **m_imageSrcView, VK_IMAGE_LAYOUT_GENERAL);
+ const VkDescriptorImageInfo descriptorDstImageInfo = makeDescriptorImageInfo(DE_NULL, **m_imageDstView, VK_IMAGE_LAYOUT_GENERAL);
+
+ typedef DescriptorSetUpdateBuilder::Location DSUBL;
+ DescriptorSetUpdateBuilder()
+ .writeSingle(descriptorSet, DSUBL::binding(0u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &descriptorSrcImageInfo)
+ .writeSingle(descriptorSet, DSUBL::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &descriptorDstImageInfo)
+ .update(vk, device);
+ vk.cmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipelineLayout, 0u, 1u, &descriptorSet, 0u, DE_NULL);
+}
+
+void ImageExtendOperandTestInstance::commandBeforeCompute (const VkCommandBuffer cmdBuffer)
+{
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+
+ const VkImageSubresourceRange fullImageSubresourceRange = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, m_texture.numLayers());
+ {
+ const VkImageMemoryBarrier preCopyImageBarriers[] =
+ {
+ makeImageMemoryBarrier(
+ 0u, VK_ACCESS_TRANSFER_WRITE_BIT,
+ VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+ m_imageSrc->get(), fullImageSubresourceRange),
+ makeImageMemoryBarrier(
+ 0u, VK_ACCESS_SHADER_WRITE_BIT,
+ VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL,
+ m_imageDst->get(), fullImageSubresourceRange)
+ };
+
+ const VkBufferMemoryBarrier barrierFlushHostWriteBeforeCopy = makeBufferMemoryBarrier(
+ VK_ACCESS_HOST_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
+ m_buffer->get(), 0ull, m_imageSrcSize);
+
+ vk.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT,
+ (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &barrierFlushHostWriteBeforeCopy, DE_LENGTH_OF_ARRAY(preCopyImageBarriers), preCopyImageBarriers);
+ }
+ {
+ const VkImageMemoryBarrier barrierAfterCopy = makeImageMemoryBarrier(
+ VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT,
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL,
+ m_imageSrc->get(), fullImageSubresourceRange);
+
+ const VkBufferImageCopy copyRegion = makeBufferImageCopy(m_texture);
+
+ vk.cmdCopyBufferToImage(cmdBuffer, m_buffer->get(), m_imageSrc->get(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1u, ©Region);
+ vk.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &barrierAfterCopy);
+ }
+}
+
+void ImageExtendOperandTestInstance::commandBetweenShaderInvocations (const VkCommandBuffer cmdBuffer)
+{
+ commandImageWriteBarrierBetweenShaderInvocations(m_context, cmdBuffer, m_imageDst->get(), m_texture);
+}
+
+void ImageExtendOperandTestInstance::commandAfterCompute (const VkCommandBuffer cmdBuffer)
+{
+ commandCopyImageToBuffer(m_context, cmdBuffer, m_imageDst->get(), m_buffer->get(), m_imageDstSize, m_texture);
+}
+
+tcu::TestStatus ImageExtendOperandTestInstance::verifyResult (void)
+{
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+ const tcu::IVec3 imageSize = m_texture.size();
+ const tcu::PixelBufferAccess inputAccess = m_inputImageData.getAccess();
+ const deInt32 width = inputAccess.getWidth();
+ const deInt32 height = inputAccess.getHeight();
+ tcu::TextureLevel refImage (mapVkFormat(m_imageDstFormat), width, height);
+ tcu::PixelBufferAccess refAccess = refImage.getAccess();
+
+ for (int x = 0; x < width; ++x)
+ for (int y = 0; y < height; ++y)
+ {
+ tcu::IVec4 color = inputAccess.getPixelInt(x, y);
+ refAccess.setPixel(color, x, y);
+ }
+
+ const Allocation& alloc = m_buffer->getAllocation();
+ invalidateAlloc(vk, device, alloc);
+ const tcu::ConstPixelBufferAccess result(mapVkFormat(m_imageDstFormat), imageSize, alloc.getHostPtr());
+
+ if (intThresholdCompare (m_context.getTestContext().getLog(), "Comparison", "Comparison", refAccess, result, tcu::UVec4(0), tcu::COMPARE_LOG_RESULT))
+ return tcu::TestStatus::pass("Passed");
+ else
+ return tcu::TestStatus::fail("Image comparison failed");
+}
+
+class ImageExtendOperandTest : public TestCase
+{
+public:
+ ImageExtendOperandTest (tcu::TestContext& testCtx,
+ const std::string& name,
+ const Texture texture,
+ const VkFormat format,
+ const bool readSigned);
+
+ void checkSupport (Context& context) const;
+ void initPrograms (SourceCollections& programCollection) const;
+ TestInstance* createInstance (Context& context) const;
+
+private:
+ const Texture m_texture;
+ VkFormat m_format;
+ bool m_signExtend;
+};
+
+ImageExtendOperandTest::ImageExtendOperandTest (tcu::TestContext& testCtx,
+ const std::string& name,
+ const Texture texture,
+ const VkFormat format,
+ const bool signExtend)
+ : TestCase (testCtx, name, "")
+ , m_texture (texture)
+ , m_format (format)
+ , m_signExtend (signExtend)
+{
+}
+
+void ImageExtendOperandTest::checkSupport (Context& context) const
+{
+ const vk::VkFormatProperties formatProperties (vk::getPhysicalDeviceFormatProperties(context.getInstanceInterface(),
+ context.getPhysicalDevice(),
+ m_format));
+
+ if (!context.requireDeviceFunctionality("VK_KHR_spirv_1_4"))
+ TCU_THROW(NotSupportedError, "VK_KHR_spirv_1_4 not supported");
+
+ if ((m_texture.type() != IMAGE_TYPE_BUFFER) && !(formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT))
+ TCU_THROW(NotSupportedError, "Format not supported for storage images");
+
+ if (m_texture.type() == IMAGE_TYPE_BUFFER && !(formatProperties.bufferFeatures & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT))
+ TCU_THROW(NotSupportedError, "Format not supported for storage texel buffers");
+}
+
+void ImageExtendOperandTest::initPrograms (SourceCollections& programCollection) const
+{
+ tcu::StringTemplate shaderTemplate(
+ "OpCapability Shader\n"
+
+ "${capability}"
+
+ "%std450 = OpExtInstImport \"GLSL.std.450\"\n"
+ "OpMemoryModel Logical GLSL450\n"
+ "OpEntryPoint GLCompute %main \"main\" %id %src_image_ptr %dst_image_ptr\n"
+ "OpExecutionMode %main LocalSize 1 1 1\n"
+
+ // decorations
+ "OpDecorate %id BuiltIn GlobalInvocationId\n"
+
+ "OpDecorate %src_image_ptr DescriptorSet 0\n"
+ "OpDecorate %src_image_ptr Binding 0\n"
+ "OpDecorate %src_image_ptr NonWritable\n"
+
+ "OpDecorate %dst_image_ptr DescriptorSet 0\n"
+ "OpDecorate %dst_image_ptr Binding 1\n"
+ "OpDecorate %dst_image_ptr NonReadable\n"
+
+ // types
+ "%type_void = OpTypeVoid\n"
+ "%type_i32 = OpTypeInt 32 1\n"
+ "%type_u32 = OpTypeInt 32 0\n"
+ "%type_vec3_i32 = OpTypeVector %type_i32 3\n"
+ "%type_vec3_u32 = OpTypeVector %type_u32 3\n"
+ "%type_vec4_i32 = OpTypeVector %type_i32 4\n"
+ "%type_vec4_u32 = OpTypeVector %type_u32 4\n"
+
+ "%type_fun_void = OpTypeFunction %type_void\n"
+ "%type_ptr_fun_i32 = OpTypePointer Function %type_i32\n"
+
+ "${image_types}"
+
+ "%type_ptr_in_vec3_u32 = OpTypePointer Input %type_vec3_u32\n"
+ "%type_ptr_in_u32 = OpTypePointer Input %type_u32\n"
+
+ "${image_uniforms}"
+
+ // variables
+ "%id = OpVariable %type_ptr_in_vec3_u32 Input\n"
+
+ "${image_variables}"
+
+ // main function
+ "%main = OpFunction %type_void None %type_fun_void\n"
+ "%label = OpLabel\n"
+
+ "${image_load}"
+
+ "%coord = OpLoad %type_vec3_u32 %id\n"
+ "%value = OpImageRead ${read_vect4_type} %src_image %coord ${extend_operand}\n"
+ " OpImageWrite %dst_image %coord %value ${extend_operand}\n"
+ " OpReturn\n"
+ " OpFunctionEnd\n");
+
+ tcu::TextureFormat tcuFormat = mapVkFormat(m_format);
+ const ImageType usedImageType = getImageTypeForSingleLayer(m_texture.type());
+ const std::string imageTypeStr = getShaderImageType(tcuFormat, usedImageType);
+ const bool isSigned = (getTextureChannelClass(tcuFormat.type) == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER);
+
+ struct FormatData
+ {
+ std::string spirvImageFormat;
+ bool isExtendedFormat;
+ };
+ const std::map<vk::VkFormat, FormatData> formatDataMap =
+ {
+ // Mandatory support
+ { VK_FORMAT_R32G32B32A32_UINT, { "Rgba32ui", false } },
+ { VK_FORMAT_R16G16B16A16_UINT, { "Rgba16ui", false } },
+ { VK_FORMAT_R8G8B8A8_UINT, { "Rgba8ui", false } },
+ { VK_FORMAT_R32_UINT, { "R32ui", false } },
+ { VK_FORMAT_R32G32B32A32_SINT, { "Rgba32i", false } },
+ { VK_FORMAT_R16G16B16A16_SINT, { "Rgba16i", false } },
+ { VK_FORMAT_R8G8B8A8_SINT, { "Rgba8i", false } },
+ { VK_FORMAT_R32_SINT, { "R32i", false } },
+
+ // Requires StorageImageExtendedFormats capability
+ { VK_FORMAT_R32G32_UINT, { "Rg32ui", true } },
+ { VK_FORMAT_R16G16_UINT, { "Rg16ui", true } },
+ { VK_FORMAT_R16_UINT, { "R16ui", true } },
+ { VK_FORMAT_R8G8_UINT, { "Rg8ui", true } },
+ { VK_FORMAT_R8_UINT, { "R8ui", true } },
+ { VK_FORMAT_R32G32_SINT, { "Rg32i", true } },
+ { VK_FORMAT_R16G16_SINT, { "Rg16i", true } },
+ { VK_FORMAT_R16_SINT, { "R16i", true } },
+ { VK_FORMAT_R8G8_SINT, { "Rg8i", true } },
+ { VK_FORMAT_R8_SINT, { "R8i", true } },
+ { VK_FORMAT_A2B10G10R10_UINT_PACK32, { "Rgb10a2ui", true } }
+ };
+
+ auto it = formatDataMap.find(m_format);
+ if (it == formatDataMap.end())
+ DE_ASSERT(DE_FALSE); // Missing int format data
+ auto spirvImageFormat = it->second.spirvImageFormat;
+ auto isExtendedFormat = it->second.isExtendedFormat;
+
+ // Request additional capability when needed
+ std::string capability = "";
+ if (isExtendedFormat)
+ capability += "OpCapability StorageImageExtendedFormats\n";
+
+ // Read type and sampled type must match. For uint formats it does not
+ // matter if we do a Sign or ZeroExtend, it matters only for sint formats
+ std::string readTypePostfix = "u32";
+ if (isSigned && m_signExtend)
+ readTypePostfix = "i32";
+
+ std::map<std::string, std::string> specializations =
+ {
+ { "image_type_id", "%type_image" },
+ { "image_uni_ptr_type_id", "%type_ptr_uniform_const_image" },
+ { "image_var_id", "%src_image_ptr" },
+ { "image_id", "%src_image" },
+ { "capability", capability },
+ { "image_format", spirvImageFormat },
+ { "sampled_type", (std::string("%type_") + readTypePostfix) },
+ { "read_vect4_type", (std::string("%type_vec4_") + readTypePostfix) },
+ { "extend_operand", (m_signExtend ? "SignExtend" : "ZeroExtend") }
+ };
+
+ // Addidtional parametrization is needed for a case when source and destination textures have same format
+ tcu::StringTemplate imageTypeTemplate(
+ "${image_type_id} = OpTypeImage ${sampled_type} 2D 0 0 0 2 ${image_format}\n");
+ tcu::StringTemplate imageUniformTypeTemplate(
+ "${image_uni_ptr_type_id} = OpTypePointer UniformConstant ${image_type_id}\n");
+ tcu::StringTemplate imageVariablesTemplate(
+ "${image_var_id} = OpVariable ${image_uni_ptr_type_id} UniformConstant\n");
+ tcu::StringTemplate imageLoadTemplate(
+ "${image_id} = OpLoad ${image_type_id} ${image_var_id}\n");
+
+ std::string imageTypes;
+ std::string imageUniformTypes;
+ std::string imageVariables;
+ std::string imageLoad;
+
+ // If input image format is the same as output there is less spir-v definitions
+ if ((m_format == VK_FORMAT_R32G32B32A32_SINT) || (m_format == VK_FORMAT_R32G32B32A32_UINT))
+ {
+ imageTypes = imageTypeTemplate.specialize(specializations);
+ imageUniformTypes = imageUniformTypeTemplate.specialize(specializations);
+ imageVariables = imageVariablesTemplate.specialize(specializations);
+ imageLoad = imageLoadTemplate.specialize(specializations);
+
+ specializations["image_var_id"] = "%dst_image_ptr";
+ specializations["image_id"] = "%dst_image";
+ imageVariables += imageVariablesTemplate.specialize(specializations);
+ imageLoad += imageLoadTemplate.specialize(specializations);
+ }
+ else
+ {
+ specializations["image_type_id"] = "%type_src_image";
+ specializations["image_uni_ptr_type_id"] = "%type_ptr_uniform_const_src_image";
+ imageTypes = imageTypeTemplate.specialize(specializations);
+ imageUniformTypes = imageUniformTypeTemplate.specialize(specializations);
+ imageVariables = imageVariablesTemplate.specialize(specializations);
+ imageLoad = imageLoadTemplate.specialize(specializations);
+
+ specializations["image_format"] = isSigned ? "Rgba32i" : "Rgba32ui";
+ specializations["image_type_id"] = "%type_dst_image";
+ specializations["image_uni_ptr_type_id"] = "%type_ptr_uniform_const_dst_image";
+ specializations["image_var_id"] = "%dst_image_ptr";
+ specializations["image_id"] = "%dst_image";
+ imageTypes += imageTypeTemplate.specialize(specializations);
+ imageUniformTypes += imageUniformTypeTemplate.specialize(specializations);
+ imageVariables += imageVariablesTemplate.specialize(specializations);
+ imageLoad += imageLoadTemplate.specialize(specializations);
+ }
+
+ specializations["image_types"] = imageTypes;
+ specializations["image_uniforms"] = imageUniformTypes;
+ specializations["image_variables"] = imageVariables;
+ specializations["image_load"] = imageLoad;
+
+ // Specialize whole shader and add it to program collection
+ programCollection.spirvAsmSources.add("comp") << shaderTemplate.specialize(specializations)
+ << vk::SpirVAsmBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_4, true);
+}
+
+TestInstance* ImageExtendOperandTest::createInstance(Context& context) const
+{
+ return new ImageExtendOperandTestInstance(context, m_texture, m_format, m_signExtend);
+}
+
static const Texture s_textures[] =
{
Texture(IMAGE_TYPE_1D, tcu::IVec3(64, 1, 1), 1),
@@ -1528,5 +1981,24 @@
return de::MovePtr<TestCase>(new LoadStoreTest(testCtx, name, "", texture, format, format, LoadStoreTest::FLAG_RESTRICT_IMAGES | LoadStoreTest::FLAG_DECLARE_IMAGE_FORMAT_IN_SHADER));
}
+tcu::TestCaseGroup* createImageExtendOperandsTests(tcu::TestContext& testCtx)
+{
+ de::MovePtr<tcu::TestCaseGroup> testGroup(new tcu::TestCaseGroup(testCtx, "extend_operands_spirv1p4", "Cases with SignExtend and ZeroExtend"));
+
+ const auto texture = Texture(IMAGE_TYPE_2D, tcu::IVec3(8, 8, 1), 1);
+ for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(s_formats); ++formatNdx)
+ {
+ auto format = s_formats[formatNdx];
+ bool intFormat = isIntFormat(format);
+ if (intFormat || isUintFormat(format))
+ {
+ const std::string caseName = getFormatShortString(format) + (intFormat ? "_sign_extend" : "_zero_extend");
+ testGroup->addChild(new ImageExtendOperandTest(testCtx, caseName, texture, format, intFormat));
+ }
+ }
+
+ return testGroup.release();
+}
+
} // image
} // vkt
diff --git a/external/vulkancts/modules/vulkan/image/vktImageLoadStoreTests.hpp b/external/vulkancts/modules/vulkan/image/vktImageLoadStoreTests.hpp
index b7f7998..6d1887f 100644
--- a/external/vulkancts/modules/vulkan/image/vktImageLoadStoreTests.hpp
+++ b/external/vulkancts/modules/vulkan/image/vktImageLoadStoreTests.hpp
@@ -36,6 +36,7 @@
tcu::TestCaseGroup* createImageStoreTests (tcu::TestContext& testCtx);
tcu::TestCaseGroup* createImageLoadStoreTests (tcu::TestContext& testCtx);
tcu::TestCaseGroup* createImageFormatReinterpretTests (tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createImageExtendOperandsTests (tcu::TestContext& testCtx);
de::MovePtr<TestCase> createImageQualifierRestrictCase (tcu::TestContext& testCtx, const ImageType imageType, const std::string& name);
diff --git a/external/vulkancts/modules/vulkan/image/vktImageMultisampleLoadStoreTests.cpp b/external/vulkancts/modules/vulkan/image/vktImageMultisampleLoadStoreTests.cpp
index 7160022..b5964a6 100644
--- a/external/vulkancts/modules/vulkan/image/vktImageMultisampleLoadStoreTests.cpp
+++ b/external/vulkancts/modules/vulkan/image/vktImageMultisampleLoadStoreTests.cpp
@@ -77,7 +77,7 @@
// Write back results as a checksum image and verify them on the host.
// Each checksum image pixel should contain an integer equal to the number of samples.
-void initPrograms (SourceCollections& programCollection, const CaseDef caseDef)
+void initPrograms (SourceCollections& programCollection, const CaseDef caseDef)
{
const int dimension = (caseDef.singleLayerBind ? caseDef.texture.layerDimension() : caseDef.texture.dimension());
const std::string texelCoordStr = (dimension == 1 ? "gx" : dimension == 2 ? "ivec2(gx, gy)" : dimension == 3 ? "ivec3(gx, gy, gz)" : "");
@@ -180,17 +180,13 @@
}
}
-void checkRequirements (const InstanceInterface& vki, const VkPhysicalDevice physDevice, const CaseDef& caseDef)
+void checkSupport (Context& context, const CaseDef caseDef)
{
- VkPhysicalDeviceFeatures features;
- vki.getPhysicalDeviceFeatures(physDevice, &features);
-
- if (!features.shaderStorageImageMultisample)
- TCU_THROW(NotSupportedError, "Multisampled storage images are not supported");
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SHADER_STORAGE_IMAGE_MULTISAMPLE);
VkImageFormatProperties imageFormatProperties;
- const VkResult imageFormatResult = vki.getPhysicalDeviceImageFormatProperties(
- physDevice, caseDef.format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_STORAGE_BIT, (VkImageCreateFlags)0, &imageFormatProperties);
+ const VkResult imageFormatResult = context.getInstanceInterface().getPhysicalDeviceImageFormatProperties(
+ context.getPhysicalDevice(), caseDef.format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_STORAGE_BIT, (VkImageCreateFlags)0, &imageFormatProperties);
if (imageFormatResult == VK_ERROR_FORMAT_NOT_SUPPORTED)
TCU_THROW(NotSupportedError, "Format is not supported");
@@ -251,8 +247,6 @@
const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
Allocator& allocator = context.getDefaultAllocator();
- checkRequirements(vki, physDevice, caseDef);
-
// Images
const UniquePtr<Image> msImage(new Image(
@@ -531,7 +525,7 @@
singleLayerBind,
};
- addFunctionCaseWithPrograms(formatGroup.get(), samplesCaseName, "", initPrograms, test, caseDef);
+ addFunctionCaseWithPrograms(formatGroup.get(), samplesCaseName, "", checkSupport, initPrograms, test, caseDef);
}
imageViewGroup->addChild(formatGroup.release());
}
diff --git a/external/vulkancts/modules/vulkan/image/vktImageMutableTests.cpp b/external/vulkancts/modules/vulkan/image/vktImageMutableTests.cpp
index c6b4c82..72299d4 100644
--- a/external/vulkancts/modules/vulkan/image/vktImageMutableTests.cpp
+++ b/external/vulkancts/modules/vulkan/image/vktImageMutableTests.cpp
@@ -25,6 +25,7 @@
#include "vktImageLoadStoreUtil.hpp"
#include "vktTestCaseUtil.hpp"
#include "vktImageTexture.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkBuilderUtil.hpp"
#include "vkQueryUtil.hpp"
@@ -44,6 +45,7 @@
#include "tcuTestLog.hpp"
#include "tcuTextureUtil.hpp"
#include "tcuPlatform.hpp"
+#include "tcuCommandLine.hpp"
#include <string>
#include <vector>
@@ -523,7 +525,7 @@
viewFormat
};
- const VkImageFormatListCreateInfoKHR formatListInfo =
+ const VkImageFormatListCreateInfo formatListInfo =
{
VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR, // VkStructureType sType;
DE_NULL, // const void* pNext;
@@ -552,12 +554,6 @@
return createImage(vk, device, &imageParams);
}
-inline Move<VkBuffer> makeBuffer (const DeviceInterface& vk, const VkDevice device, const VkDeviceSize bufferSize, const VkBufferUsageFlags usage)
-{
- const VkBufferCreateInfo bufferCreateInfo = makeBufferCreateInfo(bufferSize, usage);
- return createBuffer(vk, device, &bufferCreateInfo);
-}
-
inline VkImageSubresourceRange makeColorSubresourceRange (const int baseArrayLayer, const int layerCount)
{
return makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, static_cast<deUint32>(baseArrayLayer), static_cast<deUint32>(layerCount));
@@ -754,20 +750,6 @@
return allocateCommandBuffer(vk, device, commandPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
}
-MovePtr<Allocation> bindImage (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkImage image, const MemoryRequirement requirement)
-{
- MovePtr<Allocation> alloc = allocator.allocate(getImageMemoryRequirements(vk, device, image), requirement);
- VK_CHECK(vk.bindImageMemory(device, image, alloc->getMemory(), alloc->getOffset()));
- return alloc;
-}
-
-MovePtr<Allocation> bindBuffer (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkBuffer buffer, const MemoryRequirement requirement)
-{
- MovePtr<Allocation> alloc(allocator.allocate(getBufferMemoryRequirements(vk, device, buffer), requirement));
- VK_CHECK(vk.bindBufferMemory(device, buffer, alloc->getMemory(), alloc->getOffset()));
- return alloc;
-}
-
vector<Vec4> genVertexData (const CaseDef& caseDef)
{
vector<Vec4> vectorData;
@@ -885,7 +867,7 @@
public:
UploadDownloadExecutor(Context& context, VkDevice device, VkQueue queue, deUint32 queueFamilyIndex, const CaseDef& caseSpec) :
m_caseDef(caseSpec),
- m_haveMaintenance2(isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_maintenance2")),
+ m_haveMaintenance2(context.isDeviceFunctionalitySupported("VK_KHR_maintenance2")),
m_vk(context.getDeviceInterface()),
m_device(device),
m_queue(queue),
@@ -1622,15 +1604,54 @@
tcu::TestStatus testMutable (Context& context, const CaseDef caseDef)
{
- const DeviceInterface& vk = context.getDeviceInterface();
+ const DeviceInterface& vk = context.getDeviceInterface();
+ const VkDevice device = context.getDevice();
+ Allocator& allocator = context.getDefaultAllocator();
+
+ // Create a color buffer for host-inspection of results
+ // For the Copy download method, this is the target of the download, for other
+ // download methods, pixel data will be copied to this buffer from the download
+ // target
+ const VkDeviceSize colorBufferSize = caseDef.size.x() * caseDef.size.y() * caseDef.size.z() * caseDef.numLayers * tcu::getPixelSize(mapVkFormat(caseDef.imageFormat));
+ const Unique<VkBuffer> colorBuffer (makeBuffer(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
+ const UniquePtr<Allocation> colorBufferAlloc (bindBuffer(vk, device, allocator, *colorBuffer, MemoryRequirement::HostVisible));
+ deMemset(colorBufferAlloc->getHostPtr(), 0, static_cast<std::size_t>(colorBufferSize));
+ flushAlloc(vk, device, *colorBufferAlloc);
+
+ // Execute the test
+ UploadDownloadExecutor executor(context, device, context.getUniversalQueue(), context.getUniversalQueueFamilyIndex(), caseDef);
+ executor.run(context, *colorBuffer);
+
+ // Verify results
+ {
+ invalidateAlloc(vk, device, *colorBufferAlloc);
+
+ // For verification purposes, we use the format of the upload to generate the expected image
+ const VkFormat format = caseDef.upload == UPLOAD_CLEAR || caseDef.upload == UPLOAD_COPY ? caseDef.imageFormat : caseDef.viewFormat;
+ const tcu::TextureFormat tcuFormat = mapVkFormat(format);
+ const bool isIntegerFormat = isUintFormat(format) || isIntFormat(format);
+ const tcu::ConstPixelBufferAccess resultImage (tcuFormat, caseDef.size.x(), caseDef.size.y(), caseDef.numLayers, colorBufferAlloc->getHostPtr());
+ tcu::TextureLevel textureLevel (tcuFormat, caseDef.size.x(), caseDef.size.y(), caseDef.numLayers);
+ const tcu::PixelBufferAccess expectedImage = textureLevel.getAccess();
+ generateExpectedImage(expectedImage, caseDef);
+
+ bool ok;
+ if (isIntegerFormat)
+ ok = tcu::intThresholdCompare(context.getTestContext().getLog(), "Image comparison", "", expectedImage, resultImage, tcu::UVec4(1), tcu::COMPARE_LOG_RESULT);
+ else
+ ok = tcu::floatThresholdCompare(context.getTestContext().getLog(), "Image comparison", "", expectedImage, resultImage, tcu::Vec4(0.01f), tcu::COMPARE_LOG_RESULT);
+ return ok ? tcu::TestStatus::pass("Pass") : tcu::TestStatus::fail("Fail");
+ }
+}
+
+void checkSupport (Context& context, const CaseDef caseDef)
+{
const InstanceInterface& vki = context.getInstanceInterface();
- const VkDevice device = context.getDevice();
const VkPhysicalDevice physDevice = context.getPhysicalDevice();
- Allocator& allocator = context.getDefaultAllocator();
// If this is a VK_KHR_image_format_list test, check that the extension is supported
- if (caseDef.isFormatListTest && !de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), "VK_KHR_image_format_list"))
- TCU_THROW(NotSupportedError, "VK_KHR_image_format_list not supported");
+ if (caseDef.isFormatListTest)
+ context.requireDeviceFunctionality("VK_KHR_image_format_list");
// Check required features on the format for the required upload/download methods
VkFormatProperties imageFormatProps, viewFormatProps;
@@ -1685,7 +1706,7 @@
if ((viewFormatProps.optimalTilingFeatures & viewFormatFeatureFlags) != viewFormatFeatureFlags)
TCU_THROW(NotSupportedError, "View format doesn't support upload/download method");
- const bool haveMaintenance2 = isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_maintenance2");
+ const bool haveMaintenance2 = context.isDeviceFunctionalitySupported("VK_KHR_maintenance2");
// We don't use the base image for anything other than transfer
// operations so there are no features to check. However, The Vulkan
@@ -1704,41 +1725,6 @@
{
TCU_THROW(NotSupportedError, "Base image format is not supported");
}
-
- // Create a color buffer for host-inspection of results
- // For the Copy download method, this is the target of the download, for other
- // download methods, pixel data will be copied to this buffer from the download
- // target
- const VkDeviceSize colorBufferSize = caseDef.size.x() * caseDef.size.y() * caseDef.size.z() * caseDef.numLayers * tcu::getPixelSize(mapVkFormat(caseDef.imageFormat));
- const Unique<VkBuffer> colorBuffer (makeBuffer(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
- const UniquePtr<Allocation> colorBufferAlloc (bindBuffer(vk, device, allocator, *colorBuffer, MemoryRequirement::HostVisible));
- deMemset(colorBufferAlloc->getHostPtr(), 0, static_cast<std::size_t>(colorBufferSize));
- flushAlloc(vk, device, *colorBufferAlloc);
-
- // Execute the test
- UploadDownloadExecutor executor(context, device, context.getUniversalQueue(), context.getUniversalQueueFamilyIndex(), caseDef);
- executor.run(context, *colorBuffer);
-
- // Verify results
- {
- invalidateAlloc(vk, device, *colorBufferAlloc);
-
- // For verification purposes, we use the format of the upload to generate the expected image
- const VkFormat format = caseDef.upload == UPLOAD_CLEAR || caseDef.upload == UPLOAD_COPY ? caseDef.imageFormat : caseDef.viewFormat;
- const tcu::TextureFormat tcuFormat = mapVkFormat(format);
- const bool isIntegerFormat = isUintFormat(format) || isIntFormat(format);
- const tcu::ConstPixelBufferAccess resultImage (tcuFormat, caseDef.size.x(), caseDef.size.y(), caseDef.numLayers, colorBufferAlloc->getHostPtr());
- tcu::TextureLevel textureLevel (tcuFormat, caseDef.size.x(), caseDef.size.y(), caseDef.numLayers);
- const tcu::PixelBufferAccess expectedImage = textureLevel.getAccess();
- generateExpectedImage(expectedImage, caseDef);
-
- bool ok;
- if (isIntegerFormat)
- ok = tcu::intThresholdCompare(context.getTestContext().getLog(), "Image comparison", "", expectedImage, resultImage, tcu::UVec4(1), tcu::COMPARE_LOG_RESULT);
- else
- ok = tcu::floatThresholdCompare(context.getTestContext().getLog(), "Image comparison", "", expectedImage, resultImage, tcu::Vec4(0.01f), tcu::COMPARE_LOG_RESULT);
- return ok ? tcu::TestStatus::pass("Pass") : tcu::TestStatus::fail("Fail");
- }
}
tcu::TestCaseGroup* createImageMutableTests (TestContext& testCtx)
@@ -1781,11 +1767,11 @@
std::string caseName = getFormatShortString(s_formats[imageFormatNdx]) + "_" + getFormatShortString(s_formats[viewFormatNdx]) +
"_" + getUploadString(upload) + "_" + getDownloadString(download);
- addFunctionCaseWithPrograms(groupByImageViewType.get(), caseName, "", initPrograms, testMutable, caseDef);
+ addFunctionCaseWithPrograms(groupByImageViewType.get(), caseName, "", checkSupport, initPrograms, testMutable, caseDef);
caseDef.isFormatListTest = true;
caseName += "_format_list";
- addFunctionCaseWithPrograms(groupByImageViewType.get(), caseName, "", initPrograms, testMutable, caseDef);
+ addFunctionCaseWithPrograms(groupByImageViewType.get(), caseName, "", checkSupport, initPrograms, testMutable, caseDef);
}
}
}
@@ -1810,11 +1796,10 @@
}
}
-Move<VkInstance> createInstanceWithWsi(const PlatformInterface& vkp,
- deUint32 version,
- const Extensions& supportedExtensions,
- Type wsiType,
- const VkAllocationCallbacks* pAllocator = DE_NULL)
+CustomInstance createInstanceWithWsi(Context& context,
+ const Extensions& supportedExtensions,
+ Type wsiType,
+ const VkAllocationCallbacks* pAllocator = DE_NULL)
{
vector<string> extensions;
@@ -1836,7 +1821,7 @@
checkAllSupported(supportedExtensions, extensions);
- return vk::createDefaultInstance(vkp, version, vector<string>(), extensions, pAllocator);
+ return createCustomInstanceWithExtensions(context, extensions, pAllocator);
}
@@ -1846,7 +1831,8 @@
VkPhysicalDevice physicalDevice,
const Extensions& supportedExtensions,
const deUint32 queueFamilyIndex,
- const VkAllocationCallbacks* pAllocator = DE_NULL)
+ const VkAllocationCallbacks* pAllocator,
+ bool enableValidation)
{
const float queuePriorities[] = { 1.0f };
const VkDeviceQueueCreateInfo queueInfos[] =
@@ -1864,6 +1850,7 @@
deMemset(&features, 0x0, sizeof(features));
const char* const extensions[] = { "VK_KHR_swapchain", "VK_KHR_swapchain_mutable_format" };
+
const VkDeviceCreateInfo deviceParams =
{
VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
@@ -1884,7 +1871,7 @@
TCU_THROW(NotSupportedError, (string(extensions[ndx]) + " is not supported").c_str());
}
- return createDevice(vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
+ return createCustomDevice(enableValidation, vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
}
deUint32 getNumQueueFamilyIndices(const InstanceInterface& vki, VkPhysicalDevice physicalDevice)
@@ -1923,18 +1910,17 @@
struct InstanceHelper
{
const vector<VkExtensionProperties> supportedExtensions;
- const Unique<VkInstance> instance;
- const InstanceDriver vki;
+ const CustomInstance instance;
+ const InstanceDriver& vki;
InstanceHelper(Context& context, Type wsiType, const VkAllocationCallbacks* pAllocator = DE_NULL)
: supportedExtensions(enumerateInstanceExtensionProperties(context.getPlatformInterface(),
DE_NULL))
- , instance(createInstanceWithWsi(context.getPlatformInterface(),
- context.getUsedApiVersion(),
+ , instance(createInstanceWithWsi(context,
supportedExtensions,
wsiType,
pAllocator))
- , vki(context.getPlatformInterface(), *instance)
+ , vki(instance.getDriver())
{}
};
@@ -1960,7 +1946,8 @@
physicalDevice,
enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL),
queueFamilyIndex,
- pAllocator))
+ pAllocator,
+ context.getTestContext().getCommandLine().isValidationEnabled()))
, vkd(context.getPlatformInterface(), context.getInstance(), *device)
, queue(getDeviceQueue(vkd, *device, queueFamilyIndex, 0))
{
@@ -2036,7 +2023,7 @@
viewFormat
};
- const VkImageFormatListCreateInfoKHR formatListInfo =
+ const VkImageFormatListCreateInfo formatListInfo =
{
VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR, // VkStructureType sType;
DE_NULL, // const void* pNext;
@@ -2079,21 +2066,15 @@
const tcu::UVec2 desiredSize(256, 256);
const InstanceHelper instHelper(context, wsiType);
const NativeObjects native(context, instHelper.supportedExtensions, wsiType, tcu::just(desiredSize));
- const Unique<VkSurfaceKHR> surface(createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
- const DeviceHelper devHelper(context, instHelper.vki, *instHelper.instance, *surface);
+ const Unique<VkSurfaceKHR> surface(createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+ const DeviceHelper devHelper(context, instHelper.vki, instHelper.instance, *surface);
const DeviceInterface& vk = devHelper.vkd;
const InstanceDriver& vki = instHelper.vki;
const VkDevice device = *devHelper.device;
const VkPhysicalDevice physDevice = devHelper.physicalDevice;
+ SimpleAllocator allocator(vk, device, getPhysicalDeviceMemoryProperties(vki, context.getPhysicalDevice()));
- SimpleAllocator allocator(vk, device, getPhysicalDeviceMemoryProperties(vki, context.getPhysicalDevice()));
-
- // Check required features on the format for the required upload/download methods
- VkFormatProperties imageFormatProps, viewFormatProps;
- vki.getPhysicalDeviceFormatProperties(physDevice, caseDef.imageFormat, &imageFormatProps);
- vki.getPhysicalDeviceFormatProperties(physDevice, caseDef.viewFormat, &viewFormatProps);
-
- const VkImageUsageFlags imageUsage = getImageUsageForTestCase(caseDef);
+ const VkImageUsageFlags imageUsage = getImageUsageForTestCase(caseDef);
{
VkImageFormatProperties properties;
@@ -2122,12 +2103,12 @@
caseDef.numLayers = capabilities.maxImageArrayLayers;
// Check support for requested formats by swapchain surface
- const vector<VkSurfaceFormatKHR> surfaceFormats = getPhysicalDeviceSurfaceFormats(vki,
+ const vector<VkSurfaceFormatKHR>surfaceFormats = getPhysicalDeviceSurfaceFormats(vki,
physDevice,
*surface);
- const VkSurfaceFormatKHR* surfaceFormat = DE_NULL;
- const VkFormat* viewFormat = DE_NULL;
+ const VkSurfaceFormatKHR* surfaceFormat = DE_NULL;
+ const VkFormat* viewFormat = DE_NULL;
for (vector<VkSurfaceFormatKHR>::size_type i = 0; i < surfaceFormats.size(); i++)
{
@@ -2163,74 +2144,6 @@
);
const vector<VkImage> swapchainImages = getSwapchainImages(vk, device, *swapchain);
- VkFormatFeatureFlags viewFormatFeatureFlags = 0u;
- switch (caseDef.upload)
- {
- case UPLOAD_DRAW:
- viewFormatFeatureFlags |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT;
- break;
- case UPLOAD_STORE:
- viewFormatFeatureFlags |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
- break;
- case UPLOAD_CLEAR:
- viewFormatFeatureFlags |= VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
- break;
- case UPLOAD_COPY:
- viewFormatFeatureFlags |= VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
- break;
- default:
- DE_FATAL("Invalid upload method");
- break;
- }
- switch (caseDef.download)
- {
- case DOWNLOAD_TEXTURE:
- viewFormatFeatureFlags |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT;
- // For the texture case we write the samples read to a separate output image with the same view format
- // so we need to check that we can also use the view format for storage
- viewFormatFeatureFlags |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
- break;
- case DOWNLOAD_LOAD:
- viewFormatFeatureFlags |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
- break;
- case DOWNLOAD_COPY:
- viewFormatFeatureFlags |= VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
- break;
- default:
- DE_FATAL("Invalid download method");
- break;
- }
-
- if ((viewFormatFeatureFlags & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) &&
- isStorageImageExtendedFormat(caseDef.viewFormat) &&
- !getPhysicalDeviceFeatures(vki, physDevice).shaderStorageImageExtendedFormats)
- {
- TCU_THROW(NotSupportedError, "View format requires shaderStorageImageExtended");
- }
-
- if ((viewFormatProps.optimalTilingFeatures & viewFormatFeatureFlags) != viewFormatFeatureFlags)
- TCU_THROW(NotSupportedError, "View format doesn't support upload/download method");
-
- const bool haveMaintenance2 = isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_maintenance2");
-
- // We don't use the base image for anything other than transfer
- // operations so there are no features to check. However, The Vulkan
- // 1.0 spec does not allow us to create an image view with usage that
- // is not supported by the main format. With VK_KHR_maintenance2, we
- // can do this via VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR.
- if ((imageFormatProps.optimalTilingFeatures & viewFormatFeatureFlags) != viewFormatFeatureFlags &&
- !haveMaintenance2)
- {
- TCU_THROW(NotSupportedError, "Image format doesn't support upload/download method");
- }
-
- // If no format feature flags are supported, the format itself is not supported,
- // and images of that format cannot be created.
- if (imageFormatProps.optimalTilingFeatures == 0)
- {
- TCU_THROW(NotSupportedError, "Base image format is not supported");
- }
-
// Create a color buffer for host-inspection of results
// For the Copy download method, this is the target of the download, for other
// download methods, pixel data will be copied to this buffer from the download
@@ -2317,7 +2230,7 @@
std::string caseName = getFormatShortString(s_swapchainFormats[imageFormatNdx]) + "_" + getFormatShortString(s_swapchainFormats[viewFormatNdx]) +
"_" + getUploadString(upload) + "_" + getDownloadString(download) + "_format_list";
- addFunctionCaseWithPrograms(groupByImageViewType.get(), caseName, "", initPrograms, testSwapchainMutable, caseDef);
+ addFunctionCaseWithPrograms(groupByImageViewType.get(), caseName, "", checkSupport, initPrograms, testSwapchainMutable, caseDef);
}
}
}
diff --git a/external/vulkancts/modules/vulkan/image/vktImageQualifiersTests.cpp b/external/vulkancts/modules/vulkan/image/vktImageQualifiersTests.cpp
index 9c03523..9968e0e 100644
--- a/external/vulkancts/modules/vulkan/image/vktImageQualifiersTests.cpp
+++ b/external/vulkancts/modules/vulkan/image/vktImageQualifiersTests.cpp
@@ -215,6 +215,7 @@
virtual void initPrograms (SourceCollections& programCollection) const;
virtual TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
protected:
@@ -242,6 +243,12 @@
{
}
+void MemoryQualifierTestCase::checkSupport (Context& context) const
+{
+ if (m_imageType == IMAGE_TYPE_CUBE_ARRAY)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_IMAGE_CUBE_ARRAY);
+}
+
void MemoryQualifierTestCase::initPrograms (SourceCollections& programCollection) const
{
const char* const versionDecl = glu::getGLSLVersionDeclaration(m_glslVersion);
@@ -329,7 +336,6 @@
virtual void commandsAfterCompute (const VkCommandBuffer cmdBuffer,
const VkDeviceSize bufferSizeInBytes) const = 0;
- virtual void checkRequirements (void) const;
protected:
tcu::TextureLevel generateReferenceImage (void) const;
@@ -358,14 +364,6 @@
{
}
-void MemoryQualifierInstanceBase::checkRequirements (void) const
-{
- if (m_imageType == IMAGE_TYPE_CUBE_ARRAY && !m_context.getDeviceFeatures().imageCubeArray)
- {
- TCU_THROW(NotSupportedError, "imageCubeArray feature not supported");
- }
-}
-
tcu::TestStatus MemoryQualifierInstanceBase::iterate (void)
{
const VkDevice device = m_context.getDevice();
@@ -375,8 +373,6 @@
const VkDeviceSize bufferSizeInBytes = getNumPixels(m_imageType, m_imageSize) * tcu::getPixelSize(m_format);
- checkRequirements();
-
// Prepare resources for the test
prepareResources(bufferSizeInBytes);
diff --git a/external/vulkancts/modules/vulkan/image/vktImageSizeTests.cpp b/external/vulkancts/modules/vulkan/image/vktImageSizeTests.cpp
index b5b81f2..4f9e6aa 100644
--- a/external/vulkancts/modules/vulkan/image/vktImageSizeTests.cpp
+++ b/external/vulkancts/modules/vulkan/image/vktImageSizeTests.cpp
@@ -169,6 +169,7 @@
void initPrograms (SourceCollections& programCollection) const;
TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
private:
const Texture m_texture;
@@ -193,6 +194,12 @@
DE_ASSERT(m_useReadonly || m_useWriteonly);
}
+void SizeTest::checkSupport (Context& context) const
+{
+ if (m_texture.type() == IMAGE_TYPE_CUBE_ARRAY)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_IMAGE_CUBE_ARRAY);
+}
+
void SizeTest::initPrograms (SourceCollections& programCollection) const
{
const std::string formatQualifierStr = getShaderImageFormatQualifier(mapVkFormat(m_format));
@@ -251,8 +258,6 @@
const VkFormat format);
tcu::TestStatus iterate (void);
- void checkRequirements (void) const;
-
virtual ~SizeTestInstance (void) {}
protected:
@@ -284,14 +289,6 @@
MemoryRequirement::HostVisible));
}
-void SizeTestInstance::checkRequirements (void) const
-{
- if (m_texture.type() == IMAGE_TYPE_CUBE_ARRAY && !m_context.getDeviceFeatures().imageCubeArray)
- {
- TCU_THROW(NotSupportedError, "imageCubeArray feature not supported");
- }
-}
-
tcu::TestStatus SizeTestInstance::iterate (void)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
@@ -299,8 +296,6 @@
const VkQueue queue = m_context.getUniversalQueue();
const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
- checkRequirements();
-
// Create memory barriers.
const VkBufferMemoryBarrier shaderWriteBarrier = makeBufferMemoryBarrier(
diff --git a/external/vulkancts/modules/vulkan/image/vktImageTests.cpp b/external/vulkancts/modules/vulkan/image/vktImageTests.cpp
index d0e1e65..58165f0 100644
--- a/external/vulkancts/modules/vulkan/image/vktImageTests.cpp
+++ b/external/vulkancts/modules/vulkan/image/vktImageTests.cpp
@@ -55,6 +55,7 @@
imageTests->addChild(createImageAtomicOperationTests(testCtx));
imageTests->addChild(createImageCompressionTranscodingTests(testCtx));
imageTests->addChild(createImageTranscodingSupportTests(testCtx));
+ imageTests->addChild(createImageExtendOperandsTests(testCtx));
}
} // anonymous
diff --git a/external/vulkancts/modules/vulkan/image/vktImageTestsUtil.cpp b/external/vulkancts/modules/vulkan/image/vktImageTestsUtil.cpp
index 76bb14b..fb60a10 100644
--- a/external/vulkancts/modules/vulkan/image/vktImageTestsUtil.cpp
+++ b/external/vulkancts/modules/vulkan/image/vktImageTestsUtil.cpp
@@ -795,7 +795,7 @@
{
const tcu::TextureFormat textureFormat = mapVkFormat(format);
- DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELTYPE_LAST == 40);
+ DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELTYPE_LAST == 42);
switch (textureFormat.type)
{
diff --git a/external/vulkancts/modules/vulkan/image/vktImageTranscodingSupportTests.cpp b/external/vulkancts/modules/vulkan/image/vktImageTranscodingSupportTests.cpp
index 587997e..8ae6d89 100644
--- a/external/vulkancts/modules/vulkan/image/vktImageTranscodingSupportTests.cpp
+++ b/external/vulkancts/modules/vulkan/image/vktImageTranscodingSupportTests.cpp
@@ -714,6 +714,7 @@
const TestParameters& parameters);
void initPrograms (SourceCollections& programCollection) const;
TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
bool isFormatUsageFlagSupported (Context& context,
const VkFormat format,
VkImageUsageFlags formatUsageFlags) const;
@@ -827,23 +828,24 @@
return (queryResult == VK_SUCCESS);
}
+void ImageTranscodingCase::checkSupport (Context& context) const
+{
+ context.requireDeviceFunctionality("VK_KHR_maintenance2");
+
+ if (!isFormatUsageFlagSupported(context, m_parameters.featuredFormat, m_parameters.testedImageUsageFeature))
+ TCU_THROW(NotSupportedError, "Test skipped due to feature is not supported by the format");
+
+ if (!isFormatUsageFlagSupported(context, m_parameters.featuredFormat, m_parameters.testedImageUsage | m_parameters.pairedImageUsage))
+ TCU_THROW(NotSupportedError, "Required image usage flags are not supported by the format");
+}
+
TestInstance* ImageTranscodingCase::createInstance (Context& context) const
{
- VkFormat featuredFormat = m_parameters.featuredFormat;
VkFormat featurelessFormat = VK_FORMAT_UNDEFINED;
bool differenceFound = false;
DE_ASSERT(m_parameters.testedImageUsageFeature != 0);
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_maintenance2"))
- TCU_THROW(NotSupportedError, "Extension VK_KHR_maintenance2 not supported");
-
- if (!isFormatUsageFlagSupported(context, featuredFormat, m_parameters.testedImageUsageFeature))
- TCU_THROW(NotSupportedError, "Test skipped due to feature is not supported by the format");
-
- if (!isFormatUsageFlagSupported(context, featuredFormat, m_parameters.testedImageUsage | m_parameters.pairedImageUsage))
- TCU_THROW(NotSupportedError, "Required image usage flags are not supported by the format");
-
for (deUint32 i = 0; m_parameters.compatibleFormats[i] != VK_FORMAT_UNDEFINED; i++)
{
featurelessFormat = m_parameters.compatibleFormats[i];
diff --git a/external/vulkancts/modules/vulkan/imageless_framebuffer/vktImagelessFramebufferTests.cpp b/external/vulkancts/modules/vulkan/imageless_framebuffer/vktImagelessFramebufferTests.cpp
index 4ad4e05..81310bc 100644
--- a/external/vulkancts/modules/vulkan/imageless_framebuffer/vktImagelessFramebufferTests.cpp
+++ b/external/vulkancts/modules/vulkan/imageless_framebuffer/vktImagelessFramebufferTests.cpp
@@ -111,11 +111,11 @@
}
}
-VkAttachmentReference2KHR convertAttachmentReference (const VkAttachmentReference& attachmentReference, const VkImageAspectFlags aspectMask)
+VkAttachmentReference2 convertAttachmentReference (const VkAttachmentReference& attachmentReference, const VkImageAspectFlags aspectMask)
{
- const VkAttachmentReference2KHR attachmentReference2 =
+ const VkAttachmentReference2 attachmentReference2 =
{
- VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, // VkStructureType sType;
DE_NULL, // const void* pNext;
attachmentReference.attachment, // deUint32 attachment;
attachmentReference.layout, // VkImageLayout layout;
@@ -125,18 +125,18 @@
return attachmentReference2;
}
-std::vector<VkAttachmentDescription2KHR> convertAttachmentDescriptions (const std::vector<VkAttachmentDescription>& attachmentDescriptions)
+std::vector<VkAttachmentDescription2> convertAttachmentDescriptions (const std::vector<VkAttachmentDescription>& attachmentDescriptions)
{
- std::vector<VkAttachmentDescription2KHR> attachmentDescriptions2;
+ std::vector<VkAttachmentDescription2> attachmentDescriptions2;
attachmentDescriptions2.reserve(attachmentDescriptions.size());
for (size_t adNdx = 0; adNdx < attachmentDescriptions.size(); ++adNdx)
{
const VkAttachmentDescription& attachmentDescription = attachmentDescriptions[adNdx];
- const VkAttachmentDescription2KHR attachmentDescription2 =
+ const VkAttachmentDescription2 attachmentDescription2 =
{
- VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2, // VkStructureType sType;
DE_NULL, // const void* pNext;
attachmentDescription.flags, // VkAttachmentDescriptionFlags flags;
attachmentDescription.format, // VkFormat format;
@@ -327,58 +327,58 @@
{
const VkImageAspectFlags colorAspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
const VkImageAspectFlags depthStencilAspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
- const VkAttachmentReference2KHR colorAttachmentRef2 = convertAttachmentReference(colorAttachmentRef, colorAspectMask);
- const VkAttachmentReference2KHR depthStencilAttachmentRef2 = convertAttachmentReference(depthStencilAttachmentRef, depthStencilAspectMask);
- const VkAttachmentReference2KHR colorResolveAttachmentRef2 = convertAttachmentReference(colorResolveAttachmentRef, colorAspectMask);
- const VkAttachmentReference2KHR depthStencilResolveAttachmentRef2 =
+ const VkAttachmentReference2 colorAttachmentRef2 = convertAttachmentReference(colorAttachmentRef, colorAspectMask);
+ const VkAttachmentReference2 depthStencilAttachmentRef2 = convertAttachmentReference(depthStencilAttachmentRef, depthStencilAspectMask);
+ const VkAttachmentReference2 colorResolveAttachmentRef2 = convertAttachmentReference(colorResolveAttachmentRef, colorAspectMask);
+ const VkAttachmentReference2 depthStencilResolveAttachmentRef2 =
{
- VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, // VkStructureType sType;
DE_NULL, // const void* pNext;
hasDepthStencilResolve ? attachmentCounter++ : 0u, // deUint32 attachment;
subpassLayoutDepthStencil, // VkImageLayout layout;
depthStencilAspectMask // VkImageAspectFlags aspectMask;
};
- const VkSubpassDescriptionDepthStencilResolveKHR subpassDescriptionDepthStencilResolve =
+ const VkSubpassDescriptionDepthStencilResolve subpassDescriptionDepthStencilResolve =
{
- VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE, // VkStructureType sType;
DE_NULL, // const void* pNext;
- VK_RESOLVE_MODE_AVERAGE_BIT_KHR, // VkResolveModeFlagBitsKHR depthResolveMode;
- VK_RESOLVE_MODE_MAX_BIT_KHR, // VkResolveModeFlagBitsKHR stencilResolveMode;
- &depthStencilResolveAttachmentRef2 // const VkAttachmentReference2KHR* pDepthStencilResolveAttachment;
+ VK_RESOLVE_MODE_AVERAGE_BIT, // VkResolveModeFlagBits depthResolveMode;
+ VK_RESOLVE_MODE_MAX_BIT, // VkResolveModeFlagBits stencilResolveMode;
+ &depthStencilResolveAttachmentRef2 // const VkAttachmentReference2* pDepthStencilResolveAttachment;
};
- const VkSubpassDescription2KHR subpassDescription2 =
+ const VkSubpassDescription2 subpassDescription2 =
{
- VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2, // VkStructureType sType;
&subpassDescriptionDepthStencilResolve, // const void* pNext;
(VkSubpassDescriptionFlags)0, // VkSubpassDescriptionFlags flags;
VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint;
0u, // deUint32 viewMask;
0u, // deUint32 inputAttachmentCount;
- DE_NULL, // const VkAttachmentReference2KHR* pInputAttachments;
+ DE_NULL, // const VkAttachmentReference2* pInputAttachments;
hasColor ? 1u : 0u, // deUint32 colorAttachmentCount;
- hasColor ? &colorAttachmentRef2 : DE_NULL, // const VkAttachmentReference2KHR* pColorAttachments;
- hasColorResolve ? &colorResolveAttachmentRef2 : DE_NULL, // const VkAttachmentReference2KHR* pResolveAttachments;
- hasDepthStencil ? &depthStencilAttachmentRef2 : DE_NULL, // const VkAttachmentReference2KHR* pDepthStencilAttachment;
+ hasColor ? &colorAttachmentRef2 : DE_NULL, // const VkAttachmentReference2* pColorAttachments;
+ hasColorResolve ? &colorResolveAttachmentRef2 : DE_NULL, // const VkAttachmentReference2* pResolveAttachments;
+ hasDepthStencil ? &depthStencilAttachmentRef2 : DE_NULL, // const VkAttachmentReference2* pDepthStencilAttachment;
0u, // deUint32 preserveAttachmentCount;
DE_NULL // const deUint32* pPreserveAttachments;
};
- const std::vector<VkAttachmentDescription2KHR> attachmentDescriptions2 = convertAttachmentDescriptions(attachmentDescriptions);
- const VkRenderPassCreateInfo2KHR renderPassInfo =
+ const std::vector<VkAttachmentDescription2> attachmentDescriptions2 = convertAttachmentDescriptions(attachmentDescriptions);
+ const VkRenderPassCreateInfo2 renderPassInfo =
{
- VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2, // VkStructureType sType;
DE_NULL, // const void* pNext;
(VkRenderPassCreateFlags)0, // VkRenderPassCreateFlags flags;
(deUint32)attachmentDescriptions2.size(), // deUint32 attachmentCount;
- &attachmentDescriptions2[0], // const VkAttachmentDescription2KHR* pAttachments;
+ &attachmentDescriptions2[0], // const VkAttachmentDescription2* pAttachments;
1u, // deUint32 subpassCount;
- &subpassDescription2, // const VkSubpassDescription2KHR* pSubpasses;
+ &subpassDescription2, // const VkSubpassDescription2* pSubpasses;
0u, // deUint32 dependencyCount;
- DE_NULL, // const VkSubpassDependency2KHR* pDependencies;
+ DE_NULL, // const VkSubpassDependency2* pDependencies;
0u, // deUint32 correlatedViewMaskCount;
DE_NULL // const deUint32* pCorrelatedViewMasks;
};
- return createRenderPass2KHR(vk, device, &renderPassInfo, allocationCallbacks);
+ return createRenderPass2(vk, device, &renderPassInfo, allocationCallbacks);
}
else
{
@@ -493,7 +493,7 @@
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, // VkPipelineStageFlags dstStageMask;
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask;
VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, // VkAccessFlags dstAccessMask;
- VK_DEPENDENCY_VIEW_LOCAL_BIT_KHR, // VkDependencyFlags dependencyFlags;
+ VK_DEPENDENCY_VIEW_LOCAL_BIT, // VkDependencyFlags dependencyFlags;
};
const VkRenderPassCreateInfo renderPassInfo =
{
@@ -535,26 +535,26 @@
return imageParams;
}
-std::vector<VkFramebufferAttachmentImageInfoKHR> makeFramebufferAttachmentImageInfos (const VkExtent2D& renderSize,
- const VkFormat* colorFormat,
- const VkImageUsageFlags colorUsage,
- const VkFormat* dsFormat,
- const VkImageUsageFlags dsUsage,
- const AspectFlags resolveAspects,
- const deUint32 inputAttachmentCount)
+std::vector<VkFramebufferAttachmentImageInfo> makeFramebufferAttachmentImageInfos (const VkExtent2D& renderSize,
+ const VkFormat* colorFormat,
+ const VkImageUsageFlags colorUsage,
+ const VkFormat* dsFormat,
+ const VkImageUsageFlags dsUsage,
+ const AspectFlags resolveAspects,
+ const deUint32 inputAttachmentCount)
{
- const bool colorResolve = (resolveAspects & ASPECT_COLOR) != 0;
- const bool depthStencilResolve = (resolveAspects & ASPECT_DEPTH_STENCIL) != 0;
- std::vector<VkFramebufferAttachmentImageInfoKHR> framebufferAttachmentImageInfos;
+ const bool colorResolve = (resolveAspects & ASPECT_COLOR) != 0;
+ const bool depthStencilResolve = (resolveAspects & ASPECT_DEPTH_STENCIL) != 0;
+ std::vector<VkFramebufferAttachmentImageInfo> framebufferAttachmentImageInfos;
DE_ASSERT(colorFormat != DE_NULL);
DE_ASSERT(dsFormat != DE_NULL);
if (*colorFormat != VK_FORMAT_UNDEFINED)
{
- const VkFramebufferAttachmentImageInfoKHR framebufferAttachmentImageInfo =
+ const VkFramebufferAttachmentImageInfo framebufferAttachmentImageInfo =
{
- VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
(VkImageCreateFlags)0u, // VkImageCreateFlags flags;
colorUsage, // VkImageUsageFlags usage;
@@ -570,9 +570,9 @@
if (*dsFormat != VK_FORMAT_UNDEFINED)
{
- const VkFramebufferAttachmentImageInfoKHR framebufferAttachmentImageInfo =
+ const VkFramebufferAttachmentImageInfo framebufferAttachmentImageInfo =
{
- VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
(VkImageCreateFlags)0u, // VkImageCreateFlags flags;
dsUsage, // VkImageUsageFlags usage;
@@ -588,9 +588,9 @@
if (colorResolve)
{
- const VkFramebufferAttachmentImageInfoKHR framebufferAttachmentImageInfo =
+ const VkFramebufferAttachmentImageInfo framebufferAttachmentImageInfo =
{
- VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
(VkImageCreateFlags)0u, // VkImageCreateFlags flags;
colorUsage, // VkImageUsageFlags usage;
@@ -608,9 +608,9 @@
if (depthStencilResolve)
{
- const VkFramebufferAttachmentImageInfoKHR framebufferAttachmentImageInfo =
+ const VkFramebufferAttachmentImageInfo framebufferAttachmentImageInfo =
{
- VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
(VkImageCreateFlags)0u, // VkImageCreateFlags flags;
dsUsage, // VkImageUsageFlags usage;
@@ -628,9 +628,9 @@
for (deUint32 inputAttachmentNdx = 0; inputAttachmentNdx < inputAttachmentCount; ++inputAttachmentNdx)
{
- const VkFramebufferAttachmentImageInfoKHR framebufferAttachmentImageInfo =
+ const VkFramebufferAttachmentImageInfo framebufferAttachmentImageInfo =
{
- VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
(VkImageCreateFlags)0u, // VkImageCreateFlags flags;
colorUsage | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, // VkImageUsageFlags usage;
@@ -658,20 +658,20 @@
const AspectFlags resolveAspects = ASPECT_NONE,
const deUint32 inputAttachmentCount = 0)
{
- const std::vector<VkFramebufferAttachmentImageInfoKHR> framebufferAttachmentImageInfos = makeFramebufferAttachmentImageInfos(renderSize, colorFormat, colorUsage, dsFormat, dsUsage, resolveAspects, inputAttachmentCount);
+ const std::vector<VkFramebufferAttachmentImageInfo> framebufferAttachmentImageInfos = makeFramebufferAttachmentImageInfos(renderSize, colorFormat, colorUsage, dsFormat, dsUsage, resolveAspects, inputAttachmentCount);
const deUint32 attachmentCount = static_cast<deUint32>(framebufferAttachmentImageInfos.size());
- const VkFramebufferAttachmentsCreateInfoKHR framebufferAttachmentsCreateInfo =
+ const VkFramebufferAttachmentsCreateInfo framebufferAttachmentsCreateInfo =
{
- VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
attachmentCount, // deUint32 attachmentImageInfoCount;
- &framebufferAttachmentImageInfos[0] // const VkFramebufferAttachmentImageInfoKHR* pAttachmentImageInfos;
+ &framebufferAttachmentImageInfos[0] // const VkFramebufferAttachmentImageInfo* pAttachmentImageInfos;
};
const VkFramebufferCreateInfo framebufferInfo =
{
VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType;
&framebufferAttachmentsCreateInfo, // const void* pNext;
- VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR, // VkFramebufferCreateFlags flags;
+ VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, // VkFramebufferCreateFlags flags;
renderPass, // VkRenderPass renderPass;
attachmentCount, // deUint32 attachmentCount;
DE_NULL, // const VkImageView* pAttachments;
@@ -779,45 +779,6 @@
return barrier;
}
-VkBufferImageCopy makeBufferImageCopy (const VkExtent3D extent,
- const VkImageSubresourceLayers subresourceLayers)
-{
- const VkBufferImageCopy copyParams =
- {
- 0ull, // VkDeviceSize bufferOffset;
- 0u, // deUint32 bufferRowLength;
- 0u, // deUint32 bufferImageHeight;
- subresourceLayers, // VkImageSubresourceLayers imageSubresource;
- makeOffset3D(0, 0, 0), // VkOffset3D imageOffset;
- extent, // VkExtent3D imageExtent;
- };
- return copyParams;
-}
-
-inline Move<VkBuffer> makeBuffer (const DeviceInterface& vk, const VkDevice device, const VkBufferCreateInfo& createInfo)
-{
- return createBuffer(vk, device, &createInfo);
-}
-
-inline Move<VkImage> makeImage (const DeviceInterface& vk, const VkDevice device, const VkImageCreateInfo& createInfo)
-{
- return createImage(vk, device, &createInfo);
-}
-
-MovePtr<Allocation> bindImage (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkImage image, const MemoryRequirement requirement)
-{
- MovePtr<Allocation> alloc = allocator.allocate(getImageMemoryRequirements(vk, device, image), requirement);
- VK_CHECK(vk.bindImageMemory(device, image, alloc->getMemory(), alloc->getOffset()));
- return alloc;
-}
-
-MovePtr<Allocation> bindBuffer (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkBuffer buffer, const MemoryRequirement requirement)
-{
- MovePtr<Allocation> alloc(allocator.allocate(getBufferMemoryRequirements(vk, device, buffer), requirement));
- VK_CHECK(vk.bindBufferMemory(device, buffer, alloc->getMemory(), alloc->getOffset()));
- return alloc;
-}
-
Move<VkSampler> makeSampler (const DeviceInterface& vk, const VkDevice& device)
{
const VkSamplerCreateInfo createInfo =
@@ -992,14 +953,14 @@
ColorImagelessTestInstance::ColorImagelessTestInstance (Context& context, const TestParameters& parameters)
: TestInstance (context)
- , m_extensions (context.requireDeviceExtension("VK_KHR_imageless_framebuffer"))
+ , m_extensions (context.requireDeviceFunctionality("VK_KHR_imageless_framebuffer"))
, m_imageExtent2D (makeExtent2D(32u, 32u))
, m_parameters (parameters)
, m_colorImageUsage (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT)
{
const InstanceInterface& vki = m_context.getInstanceInterface();
const VkPhysicalDevice physDevice = m_context.getPhysicalDevice();
- const VkPhysicalDeviceImagelessFramebufferFeaturesKHR& imagelessFramebufferFeatures (context.getImagelessFramebufferFeatures());
+ const VkPhysicalDeviceImagelessFramebufferFeatures& imagelessFramebufferFeatures (context.getImagelessFramebufferFeatures());
if (imagelessFramebufferFeatures.imagelessFramebuffer == DE_FALSE)
TCU_THROW(NotSupportedError, "Imageless framebuffer is not supported");
@@ -1067,7 +1028,7 @@
const std::vector<float> vertexArray (getFullQuadVertices());
const deUint32 vertexCount (static_cast<deUint32>(vertexArray.size() / 4u));
const VkDeviceSize vertexArraySize (vertexArray.size() * sizeof(vertexArray[0]));
- const Unique<VkBuffer> vertexBuffer (makeBuffer (vk, device, makeBufferCreateInfo(vertexArraySize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT)));
+ const Unique<VkBuffer> vertexBuffer (makeBuffer (vk, device, vertexArraySize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
const UniquePtr<Allocation> vertexBufferAlloc (bindBuffer (vk, device, allocator, *vertexBuffer, MemoryRequirement::HostVisible));
const VkDeviceSize vertexBufferOffset (0u);
@@ -1245,7 +1206,7 @@
const Unique<VkImage> colorImage (makeImage (vk, device, makeImageCreateInfo(colorFormat, m_imageExtent2D, m_colorImageUsage)));
const UniquePtr<Allocation> colorImageAlloc (bindImage (vk, device, allocator, *colorImage, MemoryRequirement::Any));
const Unique<VkImageView> colorAttachment (makeImageView (vk, device, *colorImage, VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorSubresRange));
- const Unique<VkBuffer> colorBuffer (makeBuffer (vk, device, makeBufferCreateInfo(colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> colorBuffer (makeBuffer (vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> colorBufferAlloc (bindBuffer (vk, device, allocator, *colorBuffer, MemoryRequirement::HostVisible));
const Unique<VkShaderModule> vertModule (createShaderModule (vk, device, m_context.getBinaryCollection().get("vert"), 0u));
@@ -1260,7 +1221,7 @@
const std::vector<float> vertexArray (getVertices());
const deUint32 vertexCount (static_cast<deUint32>(vertexArray.size() / 4u));
const VkDeviceSize vertexArraySize (vertexArray.size() * sizeof(vertexArray[0]));
- const Unique<VkBuffer> vertexBuffer (makeBuffer (vk, device, makeBufferCreateInfo(vertexArraySize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT)));
+ const Unique<VkBuffer> vertexBuffer (makeBuffer (vk, device, vertexArraySize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
const UniquePtr<Allocation> vertexBufferAlloc (bindBuffer (vk, device, allocator, *vertexBuffer, MemoryRequirement::HostVisible));
const VkDeviceSize vertexBufferOffset (0u);
@@ -1268,9 +1229,9 @@
beginCommandBuffer(vk, *cmdBuffer);
{
- const VkRenderPassAttachmentBeginInfoKHR renderPassAttachmentBeginInfo =
+ const VkRenderPassAttachmentBeginInfo renderPassAttachmentBeginInfo =
{
- VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
1u, // deUint32 attachmentCount;
&*colorAttachment // const VkImageView* pAttachments;
@@ -1457,7 +1418,7 @@
const Unique<VkImage> colorImage (makeImage (vk, device, makeImageCreateInfo(colorFormat, m_imageExtent2D, m_colorImageUsage)));
const UniquePtr<Allocation> colorImageAlloc (bindImage (vk, device, allocator, *colorImage, MemoryRequirement::Any));
const Unique<VkImageView> colorAttachment (makeImageView (vk, device, *colorImage, VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorSubresRange));
- const Unique<VkBuffer> colorBuffer (makeBuffer (vk, device, makeBufferCreateInfo(colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> colorBuffer (makeBuffer (vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> colorBufferAlloc (bindBuffer (vk, device, allocator, *colorBuffer, MemoryRequirement::HostVisible));
const float clearDepth = 1.0f;
@@ -1475,9 +1436,9 @@
const Unique<VkImage> dsImage (makeImage (vk, device, makeImageCreateInfo(dsFormat, m_imageExtent2D, m_dsImageUsage)));
const UniquePtr<Allocation> dsImageAlloc (bindImage (vk, device, allocator, *dsImage, MemoryRequirement::Any));
const Unique<VkImageView> dsAttachment (makeImageView (vk, device, *dsImage, VK_IMAGE_VIEW_TYPE_2D, dsFormat, dsSubresRange));
- const Unique<VkBuffer> depthBuffer (makeBuffer (vk, device, makeBufferCreateInfo(depthBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> depthBuffer (makeBuffer (vk, device, depthBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> depthBufferAlloc (bindBuffer (vk, device, allocator, *depthBuffer, MemoryRequirement::HostVisible));
- const Unique<VkBuffer> stencilBuffer (makeBuffer (vk, device, makeBufferCreateInfo(stencilBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> stencilBuffer (makeBuffer (vk, device, stencilBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> stencilBufferAlloc (bindBuffer (vk, device, allocator, *stencilBuffer, MemoryRequirement::HostVisible));
const Unique<VkShaderModule> vertModule (createShaderModule (vk, device, m_context.getBinaryCollection().get("vert"), 0u));
@@ -1492,7 +1453,7 @@
const std::vector<float> vertexArray (getVertices());
const deUint32 vertexCount (static_cast<deUint32>(vertexArray.size() / 4u));
const VkDeviceSize vertexArraySize (vertexArray.size() * sizeof(vertexArray[0]));
- const Unique<VkBuffer> vertexBuffer (makeBuffer (vk, device, makeBufferCreateInfo(vertexArraySize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT)));
+ const Unique<VkBuffer> vertexBuffer (makeBuffer (vk, device, vertexArraySize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
const UniquePtr<Allocation> vertexBufferAlloc (bindBuffer (vk, device, allocator, *vertexBuffer, MemoryRequirement::HostVisible));
const VkDeviceSize vertexBufferOffset (0u);
@@ -1501,9 +1462,9 @@
beginCommandBuffer(vk, *cmdBuffer);
{
const VkImageView attachments[] = { *colorAttachment, *dsAttachment };
- const VkRenderPassAttachmentBeginInfoKHR renderPassAttachmentBeginInfo =
+ const VkRenderPassAttachmentBeginInfo renderPassAttachmentBeginInfo =
{
- VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
DE_LENGTH_OF_ARRAY(attachments), // deUint32 attachmentCount;
attachments // const VkImageView* pAttachments;
@@ -1680,7 +1641,7 @@
const Unique<VkImage> colorResolveImage (makeImage (vk, device, makeImageCreateInfo(colorFormat, m_imageExtent2D, m_colorImageUsage)));
const UniquePtr<Allocation> colorResolveImageAlloc (bindImage (vk, device, allocator, *colorResolveImage, MemoryRequirement::Any));
const Unique<VkImageView> colorResolveAttachment (makeImageView (vk, device, *colorResolveImage, VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorSubresRange));
- const Unique<VkBuffer> colorResolveBuffer (makeBuffer (vk, device, makeBufferCreateInfo(colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> colorResolveBuffer (makeBuffer (vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> colorResolveBufferAlloc (bindBuffer (vk, device, allocator, *colorResolveBuffer, MemoryRequirement::HostVisible));
const Unique<VkShaderModule> vertModule (createShaderModule (vk, device, m_context.getBinaryCollection().get("vert"), 0u));
@@ -1695,7 +1656,7 @@
const std::vector<float> vertexArray (getVertices());
const deUint32 vertexCount (static_cast<deUint32>(vertexArray.size() / 4u));
const VkDeviceSize vertexArraySize (vertexArray.size() * sizeof(vertexArray[0]));
- const Unique<VkBuffer> vertexBuffer (makeBuffer (vk, device, makeBufferCreateInfo(vertexArraySize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT)));
+ const Unique<VkBuffer> vertexBuffer (makeBuffer (vk, device, vertexArraySize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
const UniquePtr<Allocation> vertexBufferAlloc (bindBuffer (vk, device, allocator, *vertexBuffer, MemoryRequirement::HostVisible));
const VkDeviceSize vertexBufferOffset (0u);
@@ -1704,9 +1665,9 @@
beginCommandBuffer(vk, *cmdBuffer);
{
const VkImageView attachments[] = { *colorAttachment, *colorResolveAttachment };
- const VkRenderPassAttachmentBeginInfoKHR renderPassAttachmentBeginInfo =
+ const VkRenderPassAttachmentBeginInfo renderPassAttachmentBeginInfo =
{
- VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
DE_LENGTH_OF_ARRAY(attachments), // deUint32 attachmentCount;
attachments // const VkImageView* pAttachments;
@@ -1751,7 +1712,7 @@
const std::string name ("Color" + de::toString(sampleNdx));
const Unique<VkImage> imageSample (makeImage (vk, device, makeImageCreateInfo(colorFormat, m_imageExtent2D, m_colorImageUsage)));
const UniquePtr<Allocation> imageSampleAlloc (bindImage (vk, device, allocator, *imageSample, MemoryRequirement::Any));
- const Unique<VkBuffer> imageBuffer (makeBuffer (vk, device, makeBufferCreateInfo(colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> imageBuffer (makeBuffer (vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> imageBufferAlloc (bindBuffer (vk, device, allocator, *imageBuffer, MemoryRequirement::HostVisible));
readOneSampleFromMultisampleImage(colorFormat, colorImage, sampleNdx, colorFormat, imageSample, imageBuffer, ASPECT_COLOR);
@@ -1787,12 +1748,12 @@
DepthResolveImagelessTestInstance::DepthResolveImagelessTestInstance (Context& context, const TestParameters& parameters)
: DepthImagelessTestInstance (context, parameters)
{
- context.requireDeviceExtension("VK_KHR_depth_stencil_resolve");
+ context.requireDeviceFunctionality("VK_KHR_depth_stencil_resolve");
const InstanceInterface& vki = m_context.getInstanceInterface();
const VkPhysicalDevice physDevice = m_context.getPhysicalDevice();
VkPhysicalDeviceProperties2 deviceProperties;
- VkPhysicalDeviceDepthStencilResolvePropertiesKHR dsResolveProperties;
+ VkPhysicalDeviceDepthStencilResolveProperties dsResolveProperties;
deMemset(&deviceProperties, 0, sizeof(deviceProperties));
deMemset(&dsResolveProperties, 0, sizeof(dsResolveProperties));
@@ -1800,16 +1761,16 @@
deviceProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
deviceProperties.pNext = &dsResolveProperties;
- dsResolveProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR;
+ dsResolveProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES;
dsResolveProperties.pNext = DE_NULL;
vki.getPhysicalDeviceProperties2(physDevice, &deviceProperties);
- if ((dsResolveProperties.supportedDepthResolveModes & VK_RESOLVE_MODE_AVERAGE_BIT_KHR) == 0)
- TCU_THROW(NotSupportedError, "Depth resolve does not support required VK_RESOLVE_MODE_AVERAGE_BIT_KHR");
+ if ((dsResolveProperties.supportedDepthResolveModes & VK_RESOLVE_MODE_AVERAGE_BIT) == 0)
+ TCU_THROW(NotSupportedError, "Depth resolve does not support required VK_RESOLVE_MODE_AVERAGE_BIT");
- if ((dsResolveProperties.supportedStencilResolveModes & VK_RESOLVE_MODE_MAX_BIT_KHR) == 0)
- TCU_THROW(NotSupportedError, "Stencil resolve does not support required VK_RESOLVE_MODE_MAX_BIT_KHR");
+ if ((dsResolveProperties.supportedStencilResolveModes & VK_RESOLVE_MODE_MAX_BIT) == 0)
+ TCU_THROW(NotSupportedError, "Stencil resolve does not support required VK_RESOLVE_MODE_MAX_BIT");
m_colorImageUsage |= VK_IMAGE_USAGE_SAMPLED_BIT;
@@ -1964,7 +1925,7 @@
const Unique<VkImage> colorResolveImage (makeImage (vk, device, makeImageCreateInfo(colorFormat, m_imageExtent2D, m_colorImageUsage)));
const UniquePtr<Allocation> colorResolveImageAlloc (bindImage (vk, device, allocator, *colorResolveImage, MemoryRequirement::Any));
const Unique<VkImageView> colorResolveAttachment (makeImageView (vk, device, *colorResolveImage, VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorSubresRange));
- const Unique<VkBuffer> colorResolveBuffer (makeBuffer (vk, device, makeBufferCreateInfo(colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> colorResolveBuffer (makeBuffer (vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> colorResolveBufferAlloc (bindBuffer (vk, device, allocator, *colorResolveBuffer, MemoryRequirement::HostVisible));
const float clearDepth = 1.0f;
@@ -1986,9 +1947,9 @@
const Unique<VkImage> dsResolveImage (makeImage (vk, device, makeImageCreateInfo(dsFormat, m_imageExtent2D, m_dsImageUsage)));
const UniquePtr<Allocation> dsResolveImageAlloc (bindImage (vk, device, allocator, *dsResolveImage, MemoryRequirement::Any));
const Unique<VkImageView> dsResolveAttachment (makeImageView (vk, device, *dsResolveImage, VK_IMAGE_VIEW_TYPE_2D, dsFormat, dsSubresRange));
- const Unique<VkBuffer> depthResolveBuffer (makeBuffer (vk, device, makeBufferCreateInfo(depthBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> depthResolveBuffer (makeBuffer (vk, device, depthBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> depthResolveBufferAlloc (bindBuffer (vk, device, allocator, *depthResolveBuffer, MemoryRequirement::HostVisible));
- const Unique<VkBuffer> stencilResolveBuffer (makeBuffer (vk, device, makeBufferCreateInfo(stencilBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> stencilResolveBuffer (makeBuffer (vk, device, stencilBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> stencilResolveBufferAlloc (bindBuffer (vk, device, allocator, *stencilResolveBuffer, MemoryRequirement::HostVisible));
const Unique<VkShaderModule> vertModule (createShaderModule (vk, device, m_context.getBinaryCollection().get("vert"), 0u));
@@ -2003,7 +1964,7 @@
const std::vector<float> vertexArray (getVertices());
const deUint32 vertexCount (static_cast<deUint32>(vertexArray.size() / 4u));
const VkDeviceSize vertexArraySize (vertexArray.size() * sizeof(vertexArray[0]));
- const Unique<VkBuffer> vertexBuffer (makeBuffer (vk, device, makeBufferCreateInfo(vertexArraySize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT)));
+ const Unique<VkBuffer> vertexBuffer (makeBuffer (vk, device, vertexArraySize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
const UniquePtr<Allocation> vertexBufferAlloc (bindBuffer (vk, device, allocator, *vertexBuffer, MemoryRequirement::HostVisible));
const VkDeviceSize vertexBufferOffset (0u);
@@ -2012,9 +1973,9 @@
beginCommandBuffer(vk, *cmdBuffer);
{
const VkImageView attachments[] = { *colorAttachment, *dsAttachment, *colorResolveAttachment, *dsResolveAttachment };
- const VkRenderPassAttachmentBeginInfoKHR renderPassAttachmentBeginInfo =
+ const VkRenderPassAttachmentBeginInfo renderPassAttachmentBeginInfo =
{
- VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
DE_LENGTH_OF_ARRAY(attachments), // deUint32 attachmentCount;
attachments // const VkImageView* pAttachments;
@@ -2086,7 +2047,7 @@
const std::string name ("Color" + de::toString(sampleNdx));
const Unique<VkImage> imageSample (makeImage (vk, device, makeImageCreateInfo(colorFormat, m_imageExtent2D, m_colorImageUsage)));
const UniquePtr<Allocation> imageSampleAlloc (bindImage (vk, device, allocator, *imageSample, MemoryRequirement::Any));
- const Unique<VkBuffer> imageBuffer (makeBuffer (vk, device, makeBufferCreateInfo(colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> imageBuffer (makeBuffer (vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> imageBufferAlloc (bindBuffer (vk, device, allocator, *imageBuffer, MemoryRequirement::HostVisible));
readOneSampleFromMultisampleImage(colorFormat, colorImage, sampleNdx, colorFormat, imageSample, imageBuffer, ASPECT_COLOR);
@@ -2101,7 +2062,7 @@
const std::string name ("Depth" + de::toString(sampleNdx));
const Unique<VkImage> imageSample (makeImage (vk, device, makeImageCreateInfo(colorFormat, m_imageExtent2D, m_colorImageUsage)));
const UniquePtr<Allocation> imageSampleAlloc (bindImage (vk, device, allocator, *imageSample, MemoryRequirement::Any));
- const Unique<VkBuffer> imageBuffer (makeBuffer (vk, device, makeBufferCreateInfo(colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> imageBuffer (makeBuffer (vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> imageBufferAlloc (bindBuffer (vk, device, allocator, *imageBuffer, MemoryRequirement::HostVisible));
readOneSampleFromMultisampleImage(dsFormat, dsImage, sampleNdx, colorFormat, imageSample, imageBuffer, ASPECT_DEPTH);
@@ -2116,7 +2077,7 @@
const std::string name ("Stencil" + de::toString(sampleNdx));
const Unique<VkImage> imageSample (makeImage (vk, device, makeImageCreateInfo(colorFormat, m_imageExtent2D, m_colorImageUsage)));
const UniquePtr<Allocation> imageSampleAlloc (bindImage (vk, device, allocator, *imageSample, MemoryRequirement::Any));
- const Unique<VkBuffer> imageBuffer (makeBuffer (vk, device, makeBufferCreateInfo(colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> imageBuffer (makeBuffer (vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> imageBufferAlloc (bindBuffer (vk, device, allocator, *imageBuffer, MemoryRequirement::HostVisible));
readOneSampleFromMultisampleImage(dsFormat, dsImage, sampleNdx, colorFormat, imageSample, imageBuffer, ASPECT_STENCIL);
@@ -2218,13 +2179,13 @@
const Unique<VkImage> color0Image (makeImage (vk, device, makeImageCreateInfo(colorFormat, m_imageExtent2D, m_colorImageUsage | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT)));
const UniquePtr<Allocation> color0ImageAlloc (bindImage (vk, device, allocator, *color0Image, MemoryRequirement::Any));
const Unique<VkImageView> color0Attachment (makeImageView (vk, device, *color0Image, VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorSubresRange));
- const Unique<VkBuffer> color0Buffer (makeBuffer (vk, device, makeBufferCreateInfo(colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> color0Buffer (makeBuffer (vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> color0BufferAlloc (bindBuffer (vk, device, allocator, *color0Buffer, MemoryRequirement::HostVisible));
const Unique<VkImage> color1Image (makeImage (vk, device, makeImageCreateInfo(colorFormat, m_imageExtent2D, m_colorImageUsage | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT)));
const UniquePtr<Allocation> color1ImageAlloc (bindImage (vk, device, allocator, *color1Image, MemoryRequirement::Any));
const Unique<VkImageView> color1Attachment (makeImageView (vk, device, *color1Image, VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorSubresRange));
- const Unique<VkBuffer> color1Buffer (makeBuffer (vk, device, makeBufferCreateInfo(colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> color1Buffer (makeBuffer (vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> color1BufferAlloc (bindBuffer (vk, device, allocator, *color1Buffer, MemoryRequirement::HostVisible));
const VkDescriptorType descriptorType (VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT);
@@ -2259,14 +2220,14 @@
const std::vector<float> vertex0Array (getVertices());
const deUint32 vertex0Count (static_cast<deUint32>(vertex0Array.size() / 4u));
const VkDeviceSize vertex0ArraySize (vertex0Array.size() * sizeof(vertex0Array[0]));
- const Unique<VkBuffer> vertex0Buffer (makeBuffer (vk, device, makeBufferCreateInfo(vertex0ArraySize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT)));
+ const Unique<VkBuffer> vertex0Buffer (makeBuffer (vk, device, vertex0ArraySize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
const UniquePtr<Allocation> vertex0BufferAlloc (bindBuffer (vk, device, allocator, *vertex0Buffer, MemoryRequirement::HostVisible));
const VkDeviceSize vertex0BufferOffset (0u);
const std::vector<float> vertex1Array (getFullQuadVertices());
const deUint32 vertex1Count (static_cast<deUint32>(vertex1Array.size() / 4u));
const VkDeviceSize vertex1ArraySize (vertex1Array.size() * sizeof(vertex1Array[0]));
- const Unique<VkBuffer> vertex1Buffer (makeBuffer (vk, device, makeBufferCreateInfo(vertex1ArraySize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT)));
+ const Unique<VkBuffer> vertex1Buffer (makeBuffer (vk, device, vertex1ArraySize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
const UniquePtr<Allocation> vertex1BufferAlloc (bindBuffer (vk, device, allocator, *vertex1Buffer, MemoryRequirement::HostVisible));
const VkDeviceSize vertex1BufferOffset (0u);
@@ -2276,9 +2237,9 @@
beginCommandBuffer(vk, *cmdBuffer);
{
const VkImageView attachments[] = { *color0Attachment, *color1Attachment };
- const VkRenderPassAttachmentBeginInfoKHR renderPassAttachmentBeginInfo =
+ const VkRenderPassAttachmentBeginInfo renderPassAttachmentBeginInfo =
{
- VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
DE_LENGTH_OF_ARRAY(attachments), // deUint32 attachmentCount;
&attachments[0] // const VkImageView* pAttachments;
diff --git a/external/vulkancts/modules/vulkan/memory/vktMemoryAllocationTests.cpp b/external/vulkancts/modules/vulkan/memory/vktMemoryAllocationTests.cpp
index 41ec49f..a1bc610 100644
--- a/external/vulkancts/modules/vulkan/memory/vktMemoryAllocationTests.cpp
+++ b/external/vulkancts/modules/vulkan/memory/vktMemoryAllocationTests.cpp
@@ -24,6 +24,7 @@
#include "vktMemoryAllocationTests.hpp"
#include "vktTestCaseUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "tcuMaybe.hpp"
#include "tcuResultCollector.hpp"
@@ -150,7 +151,7 @@
VkPhysicalDeviceMemoryProperties m_memoryProperties;
private:
- vk::Move<vk::VkInstance> m_deviceGroupInstance;
+ CustomInstance m_deviceGroupInstance;
vk::Move<vk::VkDevice> m_logicalDevice;
de::MovePtr<vk::DeviceDriver> m_deviceDriver;
};
@@ -211,7 +212,7 @@
protMemSupported ? DE_NULL : &deviceFeatures // const VkPhysicalDeviceFeatures* pEnabledFeatures;
};
- m_logicalDevice = vk::createDevice(m_context.getPlatformInterface(), instance, instanceDriver, m_context.getPhysicalDevice(), &deviceInfo);
+ m_logicalDevice = createCustomDevice(m_context.getTestContext().getCommandLine().isValidationEnabled(), m_context.getPlatformInterface(), instance, instanceDriver, m_context.getPhysicalDevice(), &deviceInfo);
}
void BaseAllocateTestInstance::createDeviceGroup (void)
@@ -222,8 +223,8 @@
const float queuePriority = 1.0f;
deUint32 queueFamilyIndex = 0;
const std::vector<std::string> requiredExtensions (1, "VK_KHR_device_group_creation");
- m_deviceGroupInstance = createInstanceWithExtensions(m_context.getPlatformInterface(), m_context.getUsedApiVersion(), requiredExtensions);
- std::vector<VkPhysicalDeviceGroupProperties> devGroupProperties = enumeratePhysicalDeviceGroups(m_context.getInstanceInterface(), m_deviceGroupInstance.get());
+ m_deviceGroupInstance = createCustomInstanceWithExtensions(m_context, requiredExtensions);
+ std::vector<VkPhysicalDeviceGroupProperties> devGroupProperties = enumeratePhysicalDeviceGroups(m_context.getInstanceInterface(), m_deviceGroupInstance);
m_numPhysDevices = devGroupProperties[devGroupIdx].physicalDeviceCount;
m_subsetAllocationAllowed = devGroupProperties[devGroupIdx].subsetAllocation;
if (m_numPhysDevices < 2)
@@ -240,7 +241,7 @@
devGroupProperties[devGroupIdx].physicalDeviceCount, //physicalDeviceCount
devGroupProperties[devGroupIdx].physicalDevices //physicalDevices
};
- VkInstance instance (m_useDeviceGroups ? m_deviceGroupInstance.get() : m_context.getInstance());
+ VkInstance instance (m_useDeviceGroups ? m_deviceGroupInstance : m_context.getInstance());
InstanceDriver instanceDriver (m_context.getPlatformInterface(), instance);
const VkPhysicalDeviceFeatures deviceFeatures = getPhysicalDeviceFeatures(instanceDriver, deviceGroupInfo.pPhysicalDevices[physDeviceIdx]);
@@ -274,7 +275,8 @@
deviceExtensions.empty() ? DE_NULL : &deviceExtensions[0], // const char* const* ppEnabledExtensionNames;
&deviceFeatures, // const VkPhysicalDeviceFeatures* pEnabledFeatures;
};
- m_logicalDevice = vk::createDevice(m_context.getPlatformInterface(), instance, instanceDriver, deviceGroupInfo.pPhysicalDevices[physDeviceIdx], &deviceInfo);
+
+ m_logicalDevice = createCustomDevice(m_context.getTestContext().getCommandLine().isValidationEnabled(), m_context.getPlatformInterface(), instance, instanceDriver, deviceGroupInfo.pPhysicalDevices[physDeviceIdx], &deviceInfo);
m_deviceDriver = de::MovePtr<DeviceDriver>(new DeviceDriver(m_context.getPlatformInterface(), instance, *m_logicalDevice));
m_memoryProperties = getPhysicalDeviceMemoryProperties(instanceDriver, deviceGroupInfo.pPhysicalDevices[physDeviceIdx]);
}
diff --git a/external/vulkancts/modules/vulkan/memory/vktMemoryBindingTests.cpp b/external/vulkancts/modules/vulkan/memory/vktMemoryBindingTests.cpp
index 00383d7..15f085f 100644
--- a/external/vulkancts/modules/vulkan/memory/vktMemoryBindingTests.cpp
+++ b/external/vulkancts/modules/vulkan/memory/vktMemoryBindingTests.cpp
@@ -844,15 +844,6 @@
virtual tcu::TestStatus iterate (void)
{
- const std::vector<std::string>& extensions = m_context.getDeviceExtensions();
- const deBool isSupported = isDeviceExtensionSupported(m_context.getUsedApiVersion(), extensions, "VK_KHR_bind_memory2");
- if (!isSupported)
- {
- TCU_THROW(NotSupportedError, "Not supported");
- }
- if (m_params.usePriority && !m_context.getMemoryPriorityFeatures().memoryPriority)
- TCU_THROW(NotSupportedError, "VK_EXT_memory_priority Not supported");
-
std::vector<de::SharedPtr<Move<TTarget> > >
targets;
MemoryRegionsList memory;
@@ -899,15 +890,6 @@
virtual tcu::TestStatus iterate (void)
{
- const std::vector<std::string>& extensions = m_context.getDeviceExtensions();
- const deBool isSupported = isDeviceExtensionSupported(m_context.getUsedApiVersion(), extensions, "VK_KHR_bind_memory2");
- if (!isSupported)
- {
- TCU_THROW(NotSupportedError, "Not supported");
- }
- if (m_params.usePriority && !m_context.getMemoryPriorityFeatures().memoryPriority)
- TCU_THROW(NotSupportedError, "VK_EXT_memory_priority Not supported");
-
std::vector<de::SharedPtr<Move<TTarget> > >
targets[2];
MemoryRegionsList memory;
@@ -967,6 +949,14 @@
return new TInstance(ctx, m_params);
}
+ virtual void checkSupport (Context& ctx) const
+ {
+ ctx.requireDeviceFunctionality("VK_KHR_bind_memory2");
+
+ if (m_params.usePriority && !ctx.getMemoryPriorityFeaturesEXT().memoryPriority)
+ TCU_THROW(NotSupportedError, "VK_EXT_memory_priority Not supported");
+ }
+
private:
BindingCaseParameters m_params;
};
diff --git a/external/vulkancts/modules/vulkan/memory/vktMemoryExternalMemoryHostTests.cpp b/external/vulkancts/modules/vulkan/memory/vktMemoryExternalMemoryHostTests.cpp
index baeaec5..6b5341a 100644
--- a/external/vulkancts/modules/vulkan/memory/vktMemoryExternalMemoryHostTests.cpp
+++ b/external/vulkancts/modules/vulkan/memory/vktMemoryExternalMemoryHostTests.cpp
@@ -67,6 +67,21 @@
TestParams (VkFormat f, bool offset = false) : m_format(f) , m_useOffset(offset) {}
};
+void checkExternalMemoryProperties (const vk::VkExternalMemoryProperties& properties)
+{
+ // If obtaining the properties did not fail, the compatible handle types should indicate our handle type at least.
+ if ((properties.compatibleHandleTypes & VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT) == 0)
+ TCU_FAIL("compatibleHandleTypes does not include the host allocation bit");
+
+ // If this is host memory, it cannot require dedicated allocation.
+ if ((properties.externalMemoryFeatures & VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT) != 0)
+ TCU_FAIL("externalMemoryFeatures for host allocated format includes dedicated allocation bit");
+
+ // Memory should be importable to bind it to an image or buffer.
+ if ((properties.externalMemoryFeatures & VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT) == 0)
+ TCU_FAIL("externalMemoryFeatures for host allocated format does not include the importable bit");
+}
+
class ExternalMemoryHostBaseTestInstance : public TestInstance
{
public:
@@ -101,7 +116,7 @@
ExternalMemoryHostRenderImageTestInstance (Context& context, TestParams testParams);
protected:
virtual tcu::TestStatus iterate (void);
- Move<VkImage> createImage (VkImageTiling tiling);
+ Move<VkImage> createImage (VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage);
Move<VkImageView> createImageView (void);
Move<VkBuffer> createBindMemoryInitializeVertexBuffer (void);
Move<VkBuffer> createBindMemoryResultBuffer (void);
@@ -114,6 +129,7 @@
void draw (void);
void copyResultImagetoBuffer (void);
void prepareReferenceImage (tcu::PixelBufferAccess& reference);
+ void verifyFormatProperties (VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage);
TestParams m_testParams;
Move<VkImage> m_image;
@@ -141,11 +157,12 @@
ExternalMemoryHostSynchronizationTestInstance (Context& context, TestParams testParams);
protected:
virtual tcu::TestStatus iterate (void);
- void prepareBufferForHostAccess (void);
- void copyResultBuffertoBuffer (void);
+ void prepareBufferForHostAccess (VkDeviceSize size);
+ void copyResultBuffertoBuffer (VkDeviceSize size);
void submitCommands (VkCommandBuffer commandBuffer, VkFence fence);
- Move<VkBuffer> createDataBuffer (void);
- void fillBuffer (void);
+ Move<VkBuffer> createDataBuffer (VkDeviceSize size, VkBufferUsageFlags usage);
+ void fillBuffer (VkDeviceSize size);
+ void verifyBufferProperties (VkBufferUsageFlags usage);
Move<VkBuffer> m_dataBuffer;
Move<VkCommandPool> m_cmdPoolCopy;
@@ -168,9 +185,6 @@
, m_allocationSize (m_minImportedHostPointerAlignment * allocationSize)
, m_allocator (m_context.getDefaultAllocator())
{
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_EXT_external_memory_host"))
- throw tcu::NotSupportedError("VK_EXT_external_memory_host is not supported");
-
m_hostMemoryAlloc = deAlignedMalloc((size_t)m_allocationSize, (size_t)m_minImportedHostPointerAlignment);
if (!m_hostMemoryAlloc)
@@ -303,8 +317,10 @@
deUint32 hostPointerMemoryTypeBits;
deUint32 memoryTypeIndexToTest;
VkMemoryRequirements imageMemoryRequirements;
+ const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL;
+ const VkImageUsageFlags usageFlags = (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
- m_image = createImage(VK_IMAGE_TILING_OPTIMAL);
+ m_image = createImage(m_testParams.m_format, tiling, usageFlags);
//check memory requirements and reallocate memory if needed
imageMemoryRequirements = getImageMemoryRequirements(m_vkd, m_device, *m_image);
@@ -351,6 +367,9 @@
else
TCU_THROW(NotSupportedError, "Compatible memory type not found");
+ // Verify image format properties before proceeding.
+ verifyFormatProperties(m_testParams.m_format, tiling, usageFlags);
+
VK_CHECK(m_vkd.bindImageMemory(m_device, *m_image, *m_deviceMemoryAllocatedFromHostPointer, (m_testParams.m_useOffset ? imageMemoryRequirements.alignment : 0)));
m_imageView = createImageView();
@@ -404,27 +423,25 @@
return tcu::TestStatus::pass("Pass");
}
-Move<VkImage> ExternalMemoryHostRenderImageTestInstance::createImage (VkImageTiling tiling)
+Move<VkImage> ExternalMemoryHostRenderImageTestInstance::createImage (VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage)
{
const VkImageCreateInfo imageCreateInfo =
{
- VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType
- DE_NULL, // const void* pNext
- DE_NULL, // VkImageCreateFlags flags
- VK_IMAGE_TYPE_2D, // VkImageType imageType
- m_testParams.m_format, // VkFormat format
- { 100, 100, 1 }, // VkExtent3D extent
- 1, // deUint32 mipLevels
- 1, // deUint32 arrayLayers
- VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples
- tiling, // VkImageTiling tiling
- VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
- VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
- VK_IMAGE_USAGE_TRANSFER_DST_BIT, // VkImageUsageFlags usage
- VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode
- 0, // deUint32 queueFamilyIndexCount
- DE_NULL, // const deUint32* pQueueFamilyIndices
- VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout
+ VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ 0u, // VkImageCreateFlags flags
+ VK_IMAGE_TYPE_2D, // VkImageType imageType
+ format, // VkFormat format
+ { 100, 100, 1 }, // VkExtent3D extent
+ 1, // deUint32 mipLevels
+ 1, // deUint32 arrayLayers
+ VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples
+ tiling, // VkImageTiling tiling
+ usage, // VkImageUsageFlags usage
+ VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode
+ 0, // deUint32 queueFamilyIndexCount
+ DE_NULL, // const deUint32* pQueueFamilyIndices
+ VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout
};
return vk::createImage(m_vkd, m_device, &imageCreateInfo, DE_NULL);
@@ -726,6 +743,42 @@
return vk::createRenderPass(m_vkd, m_device, &renderPassInfo);
}
+void ExternalMemoryHostRenderImageTestInstance::verifyFormatProperties (VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage)
+{
+ const VkPhysicalDeviceExternalImageFormatInfo externalInfo = {
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO,
+ DE_NULL,
+ VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT
+ };
+
+ const VkPhysicalDeviceImageFormatInfo2 formatInfo = {
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2, // VkStructureType sType;
+ &externalInfo, // const void* pNext;
+ format, // VkFormat format;
+ VK_IMAGE_TYPE_2D, // VkImageType type;
+ tiling, // VkImageTiling tiling;
+ usage, // VkImageUsageFlags usage;
+ 0u // VkImageCreateFlags flags;
+ };
+
+ vk::VkExternalImageFormatProperties externalProperties = {
+ VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES,
+ DE_NULL,
+ vk::VkExternalMemoryProperties()
+ };
+
+ vk::VkImageFormatProperties2 formatProperties = {
+ VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2,
+ &externalProperties,
+ vk::VkImageFormatProperties()
+ };
+
+ // Memory type bits have been verified to be compatible previously. The call below should not fail.
+ VK_CHECK(m_context.getInstanceInterface().getPhysicalDeviceImageFormatProperties2(m_context.getPhysicalDevice(), &formatInfo, &formatProperties));
+
+ checkExternalMemoryProperties(externalProperties.externalMemoryProperties);
+}
+
ExternalMemoryHostSynchronizationTestInstance::ExternalMemoryHostSynchronizationTestInstance (Context& context, TestParams testParams)
: ExternalMemoryHostRenderImageTestInstance (context, testParams)
{
@@ -737,12 +790,13 @@
const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
const VkDeviceSize dataBufferSize = 10000 * vk::mapVkFormat(m_testParams.m_format).getPixelSize();
+ const VkBufferUsageFlags usageFlags = (VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
void* pointerReturnedByMapMemory;
deUint32 hostPointerMemoryTypeBits;
deUint32 memoryTypeIndexToTest;
VkMemoryRequirements bufferMemoryRequirements;
- m_dataBuffer = createDataBuffer();
+ m_dataBuffer = createDataBuffer(dataBufferSize, usageFlags);
//check memory requirements
bufferMemoryRequirements = getBufferMemoryRequirements(m_vkd, m_device, *m_dataBuffer);
@@ -772,6 +826,9 @@
else
TCU_THROW(NotSupportedError, "Compatible memory type not found");
+ // Verify buffer properties with external host memory.
+ verifyBufferProperties(usageFlags);
+
VK_CHECK(m_vkd.bindBufferMemory(m_device, *m_dataBuffer, *m_deviceMemoryAllocatedFromHostPointer, 0));
m_resultBuffer = createBindMemoryResultBuffer();
@@ -785,13 +842,13 @@
//record first command buffer
beginCommandBuffer(m_vkd, *m_cmdBuffer);
- fillBuffer();
- prepareBufferForHostAccess();
+ fillBuffer(dataBufferSize);
+ prepareBufferForHostAccess(dataBufferSize);
endCommandBuffer(m_vkd, *m_cmdBuffer);
//record second command buffer
beginCommandBuffer(m_vkd, *m_cmdBufferCopy);
- copyResultBuffertoBuffer();
+ copyResultBuffertoBuffer(dataBufferSize);
endCommandBuffer(m_vkd, *m_cmdBufferCopy);
submitCommands(*m_cmdBuffer, *m_fence_1);
@@ -800,10 +857,10 @@
//wait for fence_1 and modify image on host
VK_CHECK(m_vkd.waitForFences(m_device, 1u, &m_fence_1.get(), DE_TRUE, ~0ull));
pointerReturnedByMapMemory = mapMemory(m_vkd, m_device, *m_deviceMemoryAllocatedFromHostPointer, 0, dataBufferSize, 0);
- invalidateMappedMemoryRange(m_vkd, m_device, *m_deviceMemoryAllocatedFromHostPointer, 0, dataBufferSize);
+ invalidateMappedMemoryRange(m_vkd, m_device, *m_deviceMemoryAllocatedFromHostPointer, 0, VK_WHOLE_SIZE);
tcu::PixelBufferAccess bufferSurface(mapVkFormat(m_testParams.m_format), 100, 100, 1, (100 * vk::mapVkFormat(m_testParams.m_format).getPixelSize()), 0, m_hostMemoryAlloc);
prepareReferenceImage(bufferSurface);
- flushMappedMemoryRange(m_vkd, m_device, *m_deviceMemoryAllocatedFromHostPointer, 0, dataBufferSize);
+ flushMappedMemoryRange(m_vkd, m_device, *m_deviceMemoryAllocatedFromHostPointer, 0, VK_WHOLE_SIZE);
//compare memory pointed by both pointers
if (deMemCmp(m_hostMemoryAlloc, pointerReturnedByMapMemory, (size_t)dataBufferSize) != 0)
TCU_FAIL("Failed memcmp check.");
@@ -827,9 +884,8 @@
return tcu::TestStatus::pass("Pass");
}
-void ExternalMemoryHostSynchronizationTestInstance::prepareBufferForHostAccess ()
+void ExternalMemoryHostSynchronizationTestInstance::prepareBufferForHostAccess (VkDeviceSize size)
{
- VkDeviceSize size = 10000 * vk::mapVkFormat(m_testParams.m_format).getPixelSize();
const VkBufferMemoryBarrier bufferBarrier =
{
VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType;
@@ -846,9 +902,8 @@
m_vkd.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, DE_FALSE, 0u, DE_NULL, 1u, &bufferBarrier, 0u, DE_NULL);
}
-void ExternalMemoryHostSynchronizationTestInstance::copyResultBuffertoBuffer ()
+void ExternalMemoryHostSynchronizationTestInstance::copyResultBuffertoBuffer (VkDeviceSize size)
{
- VkDeviceSize size = 10000 * vk::mapVkFormat(m_testParams.m_format).getPixelSize();
const VkBufferMemoryBarrier bufferBarrier =
{
VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType;
@@ -891,17 +946,15 @@
VK_CHECK(m_vkd.queueSubmit(m_queue, 1u, &submitInfo, fence));
}
-Move<VkBuffer> ExternalMemoryHostSynchronizationTestInstance::createDataBuffer ()
+Move<VkBuffer> ExternalMemoryHostSynchronizationTestInstance::createDataBuffer (VkDeviceSize size, VkBufferUsageFlags usage)
{
- VkDeviceSize size = 10000 * vk::mapVkFormat(m_testParams.m_format).getPixelSize();
const VkBufferCreateInfo dataBufferCreateInfo =
{
VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType
DE_NULL, // const void* pNext
0, // VkBufferCreateFlags flag
size, // VkDeviceSize size
- VK_BUFFER_USAGE_TRANSFER_DST_BIT |
- VK_BUFFER_USAGE_TRANSFER_SRC_BIT, // VkBufferUsageFlags usage
+ usage, // VkBufferUsageFlags usage
VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode
0, // deUint32 queueFamilyCount
DE_NULL // const deUint32* pQueueFamilyIndices
@@ -909,9 +962,8 @@
return vk::createBuffer(m_vkd, m_device, &dataBufferCreateInfo, DE_NULL);
}
-void ExternalMemoryHostSynchronizationTestInstance::fillBuffer ()
+void ExternalMemoryHostSynchronizationTestInstance::fillBuffer (VkDeviceSize size)
{
- VkDeviceSize size = 10000 * vk::mapVkFormat(m_testParams.m_format).getPixelSize();
const VkBufferMemoryBarrier bufferBarrier =
{
VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType;
@@ -929,6 +981,27 @@
m_vkd.cmdFillBuffer(*m_cmdBuffer, *m_dataBuffer, 0, size, 0xFFFFFFFF);
}
+void ExternalMemoryHostSynchronizationTestInstance::verifyBufferProperties (VkBufferUsageFlags usage)
+{
+ const VkPhysicalDeviceExternalBufferInfo bufferInfo = {
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0, // VkBufferCreateFlags flags;
+ usage, // VkBufferUsageFlags usage;
+ VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT // VkExternalMemoryHandleTypeFlagBits handleType;
+ };
+
+ VkExternalBufferProperties props = {
+ VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES, // VkStructureType sType;
+ DE_NULL, // void* pNext;
+ VkExternalMemoryProperties() // VkExternalMemoryProperties externalMemoryProperties;
+ };
+
+ m_context.getInstanceInterface().getPhysicalDeviceExternalBufferProperties(m_context.getPhysicalDevice(), &bufferInfo, &props);
+
+ checkExternalMemoryProperties(props.externalMemoryProperties);
+}
+
struct AddPrograms
{
void init (vk::SourceCollections& sources, TestParams testParams) const
@@ -968,6 +1041,17 @@
}
};
+struct FormatName
+{
+ vk::VkFormat format;
+ std::string name;
+};
+
+void checkSupport (Context& context)
+{
+ context.requireDeviceFunctionality("VK_EXT_external_memory_host");
+}
+
} // unnamed namespace
tcu::TestCaseGroup* createMemoryExternalMemoryHostTests (tcu::TestContext& testCtx)
@@ -980,49 +1064,40 @@
de::MovePtr<tcu::TestCaseGroup> synchronization(new tcu::TestCaseGroup(testCtx, "synchronization", "synchronization tests."));
//test cases:
- simpleAllocation->addChild(new InstanceFactory1<ExternalMemoryHostBaseTestInstance, VkDeviceSize> (testCtx, tcu::NODETYPE_SELF_VALIDATE, "minImportedHostPointerAlignment_x1",
- "allocate minImportedHostPointerAlignment multiplied by 1", 1));
- simpleAllocation->addChild(new InstanceFactory1<ExternalMemoryHostBaseTestInstance, VkDeviceSize> (testCtx, tcu::NODETYPE_SELF_VALIDATE, "minImportedHostPointerAlignment_x3",
- "allocate minImportedHostPointerAlignment multiplied by 3", 3));
+ simpleAllocation->addChild(new InstanceFactory1WithSupport<ExternalMemoryHostBaseTestInstance, VkDeviceSize, FunctionSupport0> (testCtx, tcu::NODETYPE_SELF_VALIDATE, "minImportedHostPointerAlignment_x1",
+ "allocate minImportedHostPointerAlignment multiplied by 1", 1, checkSupport));
+ simpleAllocation->addChild(new InstanceFactory1WithSupport<ExternalMemoryHostBaseTestInstance, VkDeviceSize, FunctionSupport0> (testCtx, tcu::NODETYPE_SELF_VALIDATE, "minImportedHostPointerAlignment_x3",
+ "allocate minImportedHostPointerAlignment multiplied by 3", 3, checkSupport));
group ->addChild(simpleAllocation.release());
- const VkFormat testFormats[] = {
- VK_FORMAT_R8G8B8A8_UNORM,
- VK_FORMAT_R16G16B16A16_UNORM,
- VK_FORMAT_R16G16B16A16_SFLOAT,
- VK_FORMAT_R32G32B32A32_SFLOAT
+ const std::vector<FormatName> testFormats = {
+ { vk::VK_FORMAT_R8G8B8A8_UNORM, "r8g8b8a8_unorm" },
+ { vk::VK_FORMAT_R16G16B16A16_UNORM, "r16g16b16a16_unorm" },
+ { vk::VK_FORMAT_R16G16B16A16_SFLOAT, "r16g16b16a16_sfloat" },
+ { vk::VK_FORMAT_R32G32B32A32_SFLOAT, "r32g32b32a32_sfloat" },
};
- const std::string testNames[] = {
- "r8g8b8a8_unorm",
- "r16g16b16a16_unorm",
- "r16g16b16a16_sfloat",
- "r32g32b32a32_sfloat"
- };
-
- for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(testFormats); formatNdx++)
+ for (const auto& formatName : testFormats)
{
- std::string testName = testNames[formatNdx];
- with_zero_offset->addChild(new InstanceFactory1<ExternalMemoryHostRenderImageTestInstance, TestParams, AddPrograms> (testCtx, tcu::NODETYPE_SELF_VALIDATE,
- testName, testName, AddPrograms(),
- TestParams(testFormats[formatNdx])));
+ with_zero_offset->addChild(new InstanceFactory1WithSupport<ExternalMemoryHostRenderImageTestInstance, TestParams, FunctionSupport0, AddPrograms> (testCtx, tcu::NODETYPE_SELF_VALIDATE,
+ formatName.name, formatName.name, AddPrograms(),
+ TestParams(formatName.format), checkSupport));
}
bind_image_memory_and_render->addChild(with_zero_offset.release());
- for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(testFormats); formatNdx++)
+ for (const auto& formatName : testFormats)
{
- std::string testName = testNames[formatNdx];
- with_non_zero_offset->addChild(new InstanceFactory1<ExternalMemoryHostRenderImageTestInstance, TestParams, AddPrograms> (testCtx, tcu::NODETYPE_SELF_VALIDATE,
- testName, testName, AddPrograms(),
- TestParams(testFormats[formatNdx], true)));
+ with_non_zero_offset->addChild(new InstanceFactory1WithSupport<ExternalMemoryHostRenderImageTestInstance, TestParams, FunctionSupport0, AddPrograms> (testCtx, tcu::NODETYPE_SELF_VALIDATE,
+ formatName.name, formatName.name, AddPrograms(),
+ TestParams(formatName.format, true), checkSupport));
}
bind_image_memory_and_render->addChild(with_non_zero_offset.release());
group->addChild(bind_image_memory_and_render.release());
- synchronization->addChild(new InstanceFactory1<ExternalMemoryHostSynchronizationTestInstance, TestParams, AddPrograms> (testCtx, tcu::NODETYPE_SELF_VALIDATE,
- "synchronization", "synchronization", AddPrograms(),
- TestParams(testFormats[0], true)));
+ synchronization->addChild(new InstanceFactory1WithSupport<ExternalMemoryHostSynchronizationTestInstance, TestParams, FunctionSupport0, AddPrograms> (testCtx, tcu::NODETYPE_SELF_VALIDATE,
+ "synchronization", "synchronization", AddPrograms(),
+ TestParams(testFormats[0].format, true), checkSupport));
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 9dc296d..221cea4 100644
--- a/external/vulkancts/modules/vulkan/memory/vktMemoryMappingTests.cpp
+++ b/external/vulkancts/modules/vulkan/memory/vktMemoryMappingTests.cpp
@@ -531,17 +531,6 @@
const VkDeviceSize nonCoherentAtomSize = context.getDeviceProperties().limits.nonCoherentAtomSize;
const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
- if (config.allocationKind == ALLOCATION_KIND_DEDICATED_IMAGE
- || config.allocationKind == ALLOCATION_KIND_DEDICATED_BUFFER)
- {
- const std::vector<std::string>& extensions = context.getDeviceExtensions();
- const deBool isSupported = isDeviceExtensionSupported(context.getUsedApiVersion(), extensions, "VK_KHR_dedicated_allocation");
- if (!isSupported)
- {
- TCU_THROW(NotSupportedError, "Not supported");
- }
- }
-
{
const tcu::ScopedLogSection section (log, "TestCaseInfo", "TestCaseInfo");
@@ -1633,6 +1622,15 @@
return subMappedConfig(allocationSize, MemoryRange(0, allocationSize), op, seed, allocationKind);
}
+void checkSupport (Context& context, TestConfig config)
+{
+ if (config.allocationKind == ALLOCATION_KIND_DEDICATED_IMAGE
+ || config.allocationKind == ALLOCATION_KIND_DEDICATED_BUFFER)
+ {
+ context.requireDeviceFunctionality("VK_KHR_dedicated_allocation");
+ }
+}
+
} // anonymous
tcu::TestCaseGroup* createMappingTests (tcu::TestContext& testCtx)
@@ -1697,7 +1695,7 @@
const deUint32 seed = (deUint32)(opNdx * allocationSizeNdx);
const TestConfig config = fullMappedConfig(allocationSize, op, seed, static_cast<AllocationKind>(allocationKindNdx));
- addFunctionCase(allocationSizeGroup.get(), name, name, testMemoryMapping, config);
+ addFunctionCase(allocationSizeGroup.get(), name, name, checkSupport, testMemoryMapping, config);
}
fullGroup->addChild(allocationSizeGroup.release());
@@ -1744,7 +1742,7 @@
const char* const name = ops[opNdx].name;
const TestConfig config = subMappedConfig(allocationSize, MemoryRange(offset, size), op, seed, static_cast<AllocationKind>(allocationKindNdx));
- addFunctionCase(sizeGroup.get(), name, name, testMemoryMapping, config);
+ addFunctionCase(sizeGroup.get(), name, name, checkSupport, testMemoryMapping, config);
}
offsetGroup->addChild(sizeGroup.release());
diff --git a/external/vulkancts/modules/vulkan/memory/vktMemoryRequirementsTests.cpp b/external/vulkancts/modules/vulkan/memory/vktMemoryRequirementsTests.cpp
index 365617b..cea8fda 100644
--- a/external/vulkancts/modules/vulkan/memory/vktMemoryRequirementsTests.cpp
+++ b/external/vulkancts/modules/vulkan/memory/vktMemoryRequirementsTests.cpp
@@ -170,11 +170,6 @@
virtual tcu::TestStatus execTest (Context& context,
const VkBufferCreateFlags bufferFlags) = 0;
- virtual void preTestChecks (Context& context,
- const InstanceInterface& vki,
- const VkPhysicalDevice physDevice,
- const VkBufferCreateFlags flags) = 0;
-
virtual void updateMemoryRequirements (const DeviceInterface& vk,
const VkDevice device,
const VkDeviceSize size,
@@ -206,11 +201,6 @@
virtual tcu::TestStatus execTest (Context& context,
const VkBufferCreateFlags bufferFlags);
- virtual void preTestChecks (Context& context,
- const InstanceInterface& vki,
- const VkPhysicalDevice physDevice,
- const VkBufferCreateFlags flags);
-
virtual void updateMemoryRequirements (const DeviceInterface& vk,
const VkDevice device,
const VkDeviceSize size,
@@ -260,12 +250,24 @@
group->addChild(bufferGroup.release());
}
+void checkSupportBufferMemoryRequirementsOriginal (Context& context, VkBufferCreateFlags flags)
+{
+ if (flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SPARSE_BINDING);
+
+ if (flags & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SPARSE_RESIDENCY_BUFFER);
+
+ if (flags & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SPARSE_RESIDENCY_ALIASED);
+}
+
void BufferMemoryRequirementsOriginal::addFunctionTestCase (tcu::TestCaseGroup* group,
const std::string& name,
const std::string& desc,
VkBufferCreateFlags arg0)
{
- addFunctionCase(group, name, desc, testEntryPoint, arg0);
+ addFunctionCase(group, name, desc, checkSupportBufferMemoryRequirementsOriginal, testEntryPoint, arg0);
}
tcu::TestStatus BufferMemoryRequirementsOriginal::execTest (Context& context, const VkBufferCreateFlags bufferFlags)
@@ -275,8 +277,6 @@
const VkDevice device = context.getDevice();
const VkPhysicalDevice physDevice = context.getPhysicalDevice();
- preTestChecks(context, vki, physDevice, bufferFlags);
-
const VkPhysicalDeviceMemoryProperties memoryProperties = getPhysicalDeviceMemoryProperties(vki, physDevice);
const VkPhysicalDeviceLimits limits = getPhysicalDeviceProperties(vki, physDevice).limits;
const VkBufferUsageFlags allUsageFlags = static_cast<VkBufferUsageFlags>((VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT << 1) - 1);
@@ -341,23 +341,6 @@
return allPass ? tcu::TestStatus::pass("Pass") : tcu::TestStatus::fail("Some memory requirements were incorrect");
}
-void BufferMemoryRequirementsOriginal::preTestChecks (Context& ,
- const InstanceInterface& vki,
- const VkPhysicalDevice physDevice,
- const VkBufferCreateFlags flags)
-{
- const VkPhysicalDeviceFeatures features = getPhysicalDeviceFeatures(vki, physDevice);
-
- if ((flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) && !features.sparseBinding)
- TCU_THROW(NotSupportedError, "Feature not supported: sparseBinding");
-
- if ((flags & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) && !features.sparseResidencyBuffer)
- TCU_THROW(NotSupportedError, "Feature not supported: sparseResidencyBuffer");
-
- if ((flags & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) && !features.sparseResidencyAliased)
- TCU_THROW(NotSupportedError, "Feature not supported: sparseResidencyAliased");
-}
-
void BufferMemoryRequirementsOriginal::updateMemoryRequirements (const DeviceInterface& vk,
const VkDevice device,
const VkDeviceSize size,
@@ -451,11 +434,6 @@
const std::string& desc,
VkBufferCreateFlags arg0);
- virtual void preTestChecks (Context& context,
- const InstanceInterface& vki,
- const VkPhysicalDevice physDevice,
- const VkBufferCreateFlags flags);
-
virtual void updateMemoryRequirements (const DeviceInterface& vk,
const VkDevice device,
const VkDeviceSize size,
@@ -471,25 +449,19 @@
return test.execTest(context, bufferFlags);
}
+void checkSupportBufferMemoryRequirementsExtended (Context& context, VkBufferCreateFlags flags)
+{
+ checkSupportBufferMemoryRequirementsOriginal(context, flags);
+
+ context.requireDeviceFunctionality("VK_KHR_get_memory_requirements2");
+}
+
void BufferMemoryRequirementsExtended::addFunctionTestCase (tcu::TestCaseGroup* group,
const std::string& name,
const std::string& desc,
VkBufferCreateFlags arg0)
{
- addFunctionCase(group, name, desc, testEntryPoint, arg0);
-}
-
-void BufferMemoryRequirementsExtended::preTestChecks (Context& context,
- const InstanceInterface& vki,
- const VkPhysicalDevice physDevice,
- const VkBufferCreateFlags flags)
-{
- const std::string extensionName("VK_KHR_get_memory_requirements2");
-
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), extensionName))
- TCU_THROW(NotSupportedError, std::string(extensionName + " is not supported").c_str());
-
- BufferMemoryRequirementsOriginal::preTestChecks(context, vki, physDevice, flags);
+ addFunctionCase(group, name, desc, checkSupportBufferMemoryRequirementsExtended, testEntryPoint, arg0);
}
void BufferMemoryRequirementsExtended::updateMemoryRequirements (const DeviceInterface& vk,
@@ -521,11 +493,6 @@
const std::string& desc,
VkBufferCreateFlags arg0);
- virtual void preTestChecks (Context& context,
- const InstanceInterface& vki,
- const VkPhysicalDevice physDevice,
- const VkBufferCreateFlags flags);
-
virtual void updateMemoryRequirements (const DeviceInterface& vk,
const VkDevice device,
const VkDeviceSize size,
@@ -555,23 +522,19 @@
return test.execTest(context, bufferFlags);
}
+void checkSupportBufferMemoryRequirementsDedicatedAllocation (Context& context, VkBufferCreateFlags flags)
+{
+ checkSupportBufferMemoryRequirementsExtended(context, flags);
+
+ context.requireDeviceFunctionality("VK_KHR_dedicated_allocation");
+}
+
void BufferMemoryRequirementsDedicatedAllocation::addFunctionTestCase (tcu::TestCaseGroup* group,
const std::string& name,
const std::string& desc,
VkBufferCreateFlags arg0)
{
- addFunctionCase(group, name, desc, testEntryPoint, arg0);
-}
-
-void BufferMemoryRequirementsDedicatedAllocation::preTestChecks (Context& context,
- const InstanceInterface& vki,
- const VkPhysicalDevice physDevice,
- const VkBufferCreateFlags flags)
-{
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_dedicated_allocation"))
- TCU_THROW(NotSupportedError, "VK_KHR_dedicated_allocation is not supported");
-
- BufferMemoryRequirementsExtended::preTestChecks(context, vki, physDevice, flags);
+ addFunctionCase(group, name, desc, checkSupportBufferMemoryRequirementsDedicatedAllocation, testEntryPoint, arg0);
}
void BufferMemoryRequirementsDedicatedAllocation::updateMemoryRequirements (const DeviceInterface& vk,
@@ -662,11 +625,6 @@
virtual tcu::TestStatus execTest (Context& context,
const ImageTestParams bufferFlags) = 0;
- virtual void preTestChecks (Context& context,
- const InstanceInterface& vki,
- const VkPhysicalDevice physDevice,
- const VkImageCreateFlags flags) = 0;
-
virtual void updateMemoryRequirements (const DeviceInterface& vk,
const VkDevice device) = 0;
@@ -691,11 +649,6 @@
virtual tcu::TestStatus execTest (Context& context,
const ImageTestParams params);
- virtual void preTestChecks (Context& context,
- const InstanceInterface& vki,
- const VkPhysicalDevice physDevice,
- const VkImageCreateFlags flags);
-
virtual void updateMemoryRequirements (const DeviceInterface& vk,
const VkDevice device);
@@ -703,10 +656,9 @@
const VkPhysicalDeviceMemoryProperties& deviceMemoryProperties);
private:
- virtual bool isImageSupported (const deUint32 apiVersion,
+ virtual bool isImageSupported (const Context& context,
const InstanceInterface& vki,
const VkPhysicalDevice physDevice,
- const std::vector<std::string>& deviceExtensions,
const VkImageCreateInfo& info);
virtual bool isFormatMatchingAspect (const VkFormat format,
@@ -774,36 +726,26 @@
group->addChild(imageGroup.release());
}
+void checkSupportImageMemoryRequirementsOriginal (Context& context, ImageTestParams params)
+{
+ const VkPhysicalDeviceFeatures features = getPhysicalDeviceFeatures(context.getInstanceInterface(), context.getPhysicalDevice());
+
+ if (params.flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SPARSE_BINDING);
+
+ if (params.flags & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SPARSE_RESIDENCY_ALIASED);
+
+ if ((params.flags & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) && !(features.sparseResidencyImage2D || features.sparseResidencyImage3D))
+ TCU_THROW(NotSupportedError, "Feature not supported: sparseResidencyImage (2D and 3D)");
+}
+
void ImageMemoryRequirementsOriginal::addFunctionTestCase (tcu::TestCaseGroup* group,
const std::string& name,
const std::string& desc,
const ImageTestParams arg0)
{
- addFunctionCase(group, name, desc, testEntryPoint, arg0);
-}
-
-static void CheckImageFlagFeatures (const InstanceInterface& vki,
- const VkPhysicalDevice physDevice,
- const VkImageCreateFlags createFlags)
-{
- const VkPhysicalDeviceFeatures features = getPhysicalDeviceFeatures(vki, physDevice);
-
- if ((createFlags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) && !features.sparseBinding)
- TCU_THROW(NotSupportedError, "Feature not supported: sparseBinding");
-
- if ((createFlags & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) && !(features.sparseResidencyImage2D || features.sparseResidencyImage3D))
- TCU_THROW(NotSupportedError, "Feature not supported: sparseResidencyImage (2D and 3D)");
-
- if ((createFlags & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) && !features.sparseResidencyAliased)
- TCU_THROW(NotSupportedError, "Feature not supported: sparseResidencyAliased");
-}
-
-void ImageMemoryRequirementsOriginal::preTestChecks (Context& ,
- const InstanceInterface& vki,
- const VkPhysicalDevice physDevice,
- const VkImageCreateFlags createFlags)
-{
- CheckImageFlagFeatures(vki, physDevice, createFlags);
+ addFunctionCase(group, name, desc, checkSupportImageMemoryRequirementsOriginal, testEntryPoint, arg0);
}
void ImageMemoryRequirementsOriginal::updateMemoryRequirements (const DeviceInterface& vk,
@@ -873,7 +815,7 @@
}
//! This catches both invalid as well as legal but unsupported combinations of image parameters
-bool ImageMemoryRequirementsOriginal::isImageSupported (const deUint32 apiVersion, const InstanceInterface& vki, const VkPhysicalDevice physDevice, const std::vector<std::string>& deviceExtensions, const VkImageCreateInfo& info)
+bool ImageMemoryRequirementsOriginal::isImageSupported (const Context& context, const InstanceInterface& vki, const VkPhysicalDevice physDevice, const VkImageCreateInfo& info)
{
DE_ASSERT(info.extent.width >= 1u && info.extent.height >= 1u && info.extent.depth >= 1u);
@@ -882,7 +824,7 @@
|| info.mipLevels != 1
|| info.arrayLayers != 1
|| info.samples != VK_SAMPLE_COUNT_1_BIT))
- || !isDeviceExtensionSupported(apiVersion, deviceExtensions, "VK_KHR_sampler_ycbcr_conversion"))
+ || !context.isDeviceFunctionalitySupported("VK_KHR_sampler_ycbcr_conversion"))
{
return false;
}
@@ -1317,8 +1259,6 @@
const VkImageCreateFlags sparseFlags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT;
const VkImageUsageFlags transientFlags = VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT;
- preTestChecks(context, vki, physDevice, params.flags);
-
const VkPhysicalDeviceMemoryProperties memoryProperties = getPhysicalDeviceMemoryProperties(vki, physDevice);
const deUint32 notInitializedBits = ~0u;
const VkImageAspectFlags colorAspect = VK_IMAGE_ASPECT_COLOR_BIT;
@@ -1374,7 +1314,7 @@
m_currentTestImageInfo = imageInfo;
- if (!isImageSupported(context.getUsedApiVersion(), vki, physDevice, context.getDeviceExtensions(), m_currentTestImageInfo))
+ if (!isImageSupported(context, vki, physDevice, m_currentTestImageInfo))
continue;
log << tcu::TestLog::Message << "- " << getImageInfoString(m_currentTestImageInfo) << tcu::TestLog::EndMessage;
@@ -1418,11 +1358,6 @@
const std::string& desc,
const ImageTestParams arg0);
- virtual void preTestChecks (Context& context,
- const InstanceInterface& vki,
- const VkPhysicalDevice physDevice,
- const VkImageCreateFlags flags);
-
virtual void updateMemoryRequirements (const DeviceInterface& vk,
const VkDevice device);
};
@@ -1435,25 +1370,19 @@
return test.execTest(context, params);
}
+void checkSupportImageMemoryRequirementsExtended (Context& context, ImageTestParams params)
+{
+ checkSupportImageMemoryRequirementsOriginal(context, params);
+
+ context.requireDeviceFunctionality("VK_KHR_get_memory_requirements2");
+}
+
void ImageMemoryRequirementsExtended::addFunctionTestCase (tcu::TestCaseGroup* group,
const std::string& name,
const std::string& desc,
const ImageTestParams arg0)
{
- addFunctionCase(group, name, desc, testEntryPoint, arg0);
-}
-
-void ImageMemoryRequirementsExtended::preTestChecks (Context& context,
- const InstanceInterface& vki,
- const VkPhysicalDevice physDevice,
- const VkImageCreateFlags createFlags)
-{
- const std::string extensionName("VK_KHR_get_memory_requirements2");
-
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), extensionName))
- TCU_THROW(NotSupportedError, std::string(extensionName + " is not supported").c_str());
-
- ImageMemoryRequirementsOriginal::preTestChecks (context, vki, physDevice, createFlags);
+ addFunctionCase(group, name, desc, checkSupportImageMemoryRequirementsExtended, testEntryPoint, arg0);
}
void ImageMemoryRequirementsExtended::updateMemoryRequirements (const DeviceInterface& vk,
@@ -1475,11 +1404,6 @@
const std::string& desc,
const ImageTestParams arg0);
- virtual void preTestChecks (Context& context,
- const InstanceInterface& vki,
- const VkPhysicalDevice physDevice,
- const VkImageCreateFlags flags);
-
virtual void updateMemoryRequirements (const DeviceInterface& vk,
const VkDevice device);
@@ -1499,26 +1423,21 @@
return test.execTest(context, params);
}
+void checkSupportImageMemoryRequirementsDedicatedAllocation (Context& context, ImageTestParams params)
+{
+ checkSupportImageMemoryRequirementsExtended(context, params);
+
+ context.requireDeviceFunctionality("VK_KHR_dedicated_allocation");
+}
+
void ImageMemoryRequirementsDedicatedAllocation::addFunctionTestCase (tcu::TestCaseGroup* group,
const std::string& name,
const std::string& desc,
const ImageTestParams arg0)
{
- addFunctionCase(group, name, desc, testEntryPoint, arg0);
+ addFunctionCase(group, name, desc, checkSupportImageMemoryRequirementsDedicatedAllocation, testEntryPoint, arg0);
}
-void ImageMemoryRequirementsDedicatedAllocation::preTestChecks (Context& context,
- const InstanceInterface& vki,
- const VkPhysicalDevice physDevice,
- const VkImageCreateFlags createFlags)
-{
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_dedicated_allocation"))
- TCU_THROW(NotSupportedError, "VK_KHR_dedicated_allocation is not supported");
-
- ImageMemoryRequirementsExtended::preTestChecks (context, vki, physDevice, createFlags);
-}
-
-
void ImageMemoryRequirementsDedicatedAllocation::updateMemoryRequirements (const DeviceInterface& vk,
const VkDevice device)
{
@@ -1649,24 +1568,9 @@
VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR,
VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR
};
- {
- const std::string extensionName("VK_KHR_get_memory_requirements2");
-
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), extensionName))
- TCU_THROW(NotSupportedError, std::string(extensionName + " is not supported").c_str());
- }
- {
- const std::string extensionName("VK_KHR_sampler_ycbcr_conversion");
-
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), extensionName))
- TCU_THROW(NotSupportedError, std::string(extensionName + " is not supported").c_str());
- }
const InstanceInterface& vki = context.getInstanceInterface();
const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
-
- CheckImageFlagFeatures(vki, physicalDevice, params.flags);
-
const DeviceInterface& vk = context.getDeviceInterface();
const VkDevice device = context.getDevice();
const VkImageCreateFlags sparseFlags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT;
@@ -1775,6 +1679,14 @@
return tcu::TestStatus(result.getResult(), result.getMessage());
}
+void checkSupportMultiplane (Context& context, ImageTestParams params)
+{
+ checkSupportImageMemoryRequirementsOriginal(context, params);
+
+ context.requireDeviceFunctionality("VK_KHR_get_memory_requirements2");
+ context.requireDeviceFunctionality("VK_KHR_sampler_ycbcr_conversion");
+}
+
void populateMultiplaneTestGroup (tcu::TestCaseGroup* group)
{
const struct
@@ -1813,7 +1725,7 @@
if (tiling == VK_IMAGE_TILING_LINEAR && (flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != 0)
continue;
- addFunctionCase(group, name, name, testMultiplaneImages, params);
+ addFunctionCase(group, name, name, checkSupportMultiplane, testMultiplaneImages, params);
}
}
diff --git a/external/vulkancts/modules/vulkan/memory_model/vktMemoryModelMessagePassing.cpp b/external/vulkancts/modules/vulkan/memory_model/vktMemoryModelMessagePassing.cpp
index c09d4b3..02b4ad2 100644
--- a/external/vulkancts/modules/vulkan/memory_model/vktMemoryModelMessagePassing.cpp
+++ b/external/vulkancts/modules/vulkan/memory_model/vktMemoryModelMessagePassing.cpp
@@ -253,8 +253,7 @@
!context.getVulkanMemoryModelFeatures().vulkanMemoryModelAvailabilityVisibilityChains)
TCU_THROW(NotSupportedError, "vulkanMemoryModelAvailabilityVisibilityChains not supported");
- if ((m_data.payloadSC == SC_PHYSBUFFER || m_data.guardSC == SC_PHYSBUFFER) &&
- !context.getBufferDeviceAddressFeatures().bufferDeviceAddress)
+ if ((m_data.payloadSC == SC_PHYSBUFFER || m_data.guardSC == SC_PHYSBUFFER) && !context.isBufferDeviceAddressSupported())
TCU_THROW(NotSupportedError, "Physical storage buffer pointers not supported");
if (m_data.stage == STAGE_VERTEX)
@@ -994,6 +993,8 @@
vk::VkFlags usageFlags = vk::VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
+ bool memoryDeviceAddress = false;
+
bool local;
switch (i)
{
@@ -1003,14 +1004,22 @@
continue;
local = m_data.payloadMemLocal;
if (m_data.payloadSC == SC_PHYSBUFFER)
- usageFlags |= vk::VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT;
+ {
+ usageFlags |= vk::VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT;
+ if (m_context.isDeviceFunctionalitySupported("VK_KHR_buffer_device_address"))
+ memoryDeviceAddress = true;
+ }
break;
case 1:
if (m_data.guardSC != SC_BUFFER && m_data.guardSC != SC_PHYSBUFFER)
continue;
local = m_data.guardMemLocal;
if (m_data.guardSC == SC_PHYSBUFFER)
- usageFlags |= vk::VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT;
+ {
+ usageFlags |= vk::VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT;
+ if (m_context.isDeviceFunctionalitySupported("VK_KHR_buffer_device_address"))
+ memoryDeviceAddress = true;
+ }
break;
case 2: local = true; break;
}
@@ -1019,7 +1028,8 @@
{
buffers[i] = de::MovePtr<BufferWithMemory>(new BufferWithMemory(
vk, device, allocator, makeBufferCreateInfo(bufferSizes[i], usageFlags),
- local ? MemoryRequirement::Local : MemoryRequirement::NonLocal));
+ (memoryDeviceAddress ? MemoryRequirement::DeviceAddress : MemoryRequirement::Any) |
+ (local ? MemoryRequirement::Local : MemoryRequirement::NonLocal)));
}
catch (const tcu::NotSupportedError&)
{
@@ -1442,11 +1452,11 @@
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);
- VkBufferDeviceAddressInfoEXT addrInfo =
+ VkBufferDeviceAddressInfo addrInfo =
{
- VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0, // VkBuffer buffer
+ VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0, // VkBuffer buffer
};
VkImageSubresourceRange range = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
@@ -1467,7 +1477,7 @@
bufferSizes[2] // size
};
- deUint32 NUM_SUBMITS = 2;
+ deUint32 NUM_SUBMITS = 2;
for (deUint32 x = 0; x < NUM_SUBMITS; ++x)
{
@@ -1513,15 +1523,25 @@
if (m_data.payloadSC == SC_PHYSBUFFER)
{
+ const bool useKHR = m_context.isDeviceFunctionalitySupported("VK_KHR_buffer_device_address");
addrInfo.buffer = **buffers[0];
- VkDeviceAddress addr = vk.getBufferDeviceAddressEXT(device, &addrInfo);
+ VkDeviceAddress addr;
+ if (useKHR)
+ addr = vk.getBufferDeviceAddress(device, &addrInfo);
+ else
+ addr = vk.getBufferDeviceAddressEXT(device, &addrInfo);
vk.cmdPushConstants(*cmdBuffer, *pipelineLayout, allShaderStages,
0, sizeof(VkDeviceSize), &addr);
}
if (m_data.guardSC == SC_PHYSBUFFER)
{
+ const bool useKHR = m_context.isDeviceFunctionalitySupported("VK_KHR_buffer_device_address");
addrInfo.buffer = **buffers[1];
- VkDeviceAddress addr = vk.getBufferDeviceAddressEXT(device, &addrInfo);
+ VkDeviceAddress addr;
+ if (useKHR)
+ addr = vk.getBufferDeviceAddress(device, &addrInfo);
+ else
+ addr = vk.getBufferDeviceAddressEXT(device, &addrInfo);
vk.cmdPushConstants(*cmdBuffer, *pipelineLayout, allShaderStages,
8, sizeof(VkDeviceSize), &addr);
}
@@ -1569,7 +1589,13 @@
}
if (x == NUM_SUBMITS - 1)
+ {
vk.cmdCopyBuffer(*cmdBuffer, **buffers[2], **copyBuffer, 1, ©Params);
+ memBarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ memBarrier.dstAccessMask = VK_ACCESS_HOST_READ_BIT;
+ vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT,
+ 0, 1, &memBarrier, 0, DE_NULL, 0, DE_NULL);
+ }
endCommandBuffer(vk, *cmdBuffer);
diff --git a/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderPassUtil.cpp b/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderPassUtil.cpp
index a31d9cf..698aeb5 100644
--- a/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderPassUtil.cpp
+++ b/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderPassUtil.cpp
@@ -69,7 +69,7 @@
VkImageLayout initialLayout_,
VkImageLayout finalLayout_)
{
- sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR;
+ sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2;
pNext = pNext_;
flags = flags_;
format = format_;
@@ -102,7 +102,7 @@
VkImageLayout layout_,
VkImageAspectFlags aspectMask_)
{
- sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR;
+ sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2;
pNext = pNext_;
attachment = attachment_;
layout = layout_;
@@ -145,15 +145,15 @@
VkPipelineBindPoint pipelineBindPoint_,
deUint32 viewMask_,
deUint32 inputAttachmentCount_,
- const VkAttachmentReference2KHR* pInputAttachments_,
+ const VkAttachmentReference2* pInputAttachments_,
deUint32 colorAttachmentCount_,
- const VkAttachmentReference2KHR* pColorAttachments_,
- const VkAttachmentReference2KHR* pResolveAttachments_,
- const VkAttachmentReference2KHR* pDepthStencilAttachment_,
+ const VkAttachmentReference2* pColorAttachments_,
+ const VkAttachmentReference2* pResolveAttachments_,
+ const VkAttachmentReference2* pDepthStencilAttachment_,
deUint32 preserveAttachmentCount_,
const deUint32* pPreserveAttachments_)
{
- sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR;
+ sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2;
pNext = pNext_;
flags = flags_;
pipelineBindPoint = pipelineBindPoint_;
@@ -203,7 +203,7 @@
VkDependencyFlags dependencyFlags_,
deInt32 viewOffset_)
{
- sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2_KHR;
+ sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2;
pNext = pNext_;
srcSubpass = srcSubpass_;
dstSubpass = dstSubpass_;
@@ -250,15 +250,15 @@
RenderPassCreateInfo2::RenderPassCreateInfo2 (const void* pNext_,
VkRenderPassCreateFlags flags_,
deUint32 attachmentCount_,
- const VkAttachmentDescription2KHR* pAttachments_,
+ const VkAttachmentDescription2* pAttachments_,
deUint32 subpassCount_,
- const VkSubpassDescription2KHR* pSubpasses_,
+ const VkSubpassDescription2* pSubpasses_,
deUint32 dependencyCount_,
- const VkSubpassDependency2KHR* pDependencies_,
+ const VkSubpassDependency2* pDependencies_,
deUint32 correlatedViewMaskCount_,
const deUint32* pCorrelatedViewMasks_)
{
- sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR;
+ sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2;
pNext = pNext_;
flags = flags_;
attachmentCount = attachmentCount_;
@@ -273,7 +273,7 @@
Move<VkRenderPass> RenderPassCreateInfo2::createRenderPass (const DeviceInterface& vk, VkDevice device) const
{
- return vk::createRenderPass2KHR(vk, device, this);
+ return vk::createRenderPass2(vk, device, this);
}
SubpassBeginInfo1::SubpassBeginInfo1 (const void* pNext_,
@@ -288,7 +288,7 @@
SubpassBeginInfo2::SubpassBeginInfo2 (const void* pNext_,
VkSubpassContents contents_)
{
- sType = VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO_KHR;
+ sType = VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO;
pNext = pNext_;
contents = contents_;
}
@@ -302,7 +302,7 @@
SubpassEndInfo2::SubpassEndInfo2 (const void* pNext_)
{
- sType = VK_STRUCTURE_TYPE_SUBPASS_END_INFO_KHR;
+ sType = VK_STRUCTURE_TYPE_SUBPASS_END_INFO;
pNext = pNext_;
}
@@ -341,7 +341,7 @@
const VkRenderPassBeginInfo* pRenderPassBegin,
const SubpassBeginInfo* pSubpassBeginInfo)
{
- vk.cmdBeginRenderPass2KHR(cmdBuffer, pRenderPassBegin, pSubpassBeginInfo);
+ vk.cmdBeginRenderPass2(cmdBuffer, pRenderPassBegin, pSubpassBeginInfo);
}
void RenderpassSubpass2::cmdNextSubpass (const DeviceInterface& vk,
@@ -352,7 +352,7 @@
DE_ASSERT(pSubpassBeginInfo != DE_NULL);
DE_ASSERT(pSubpassEndInfo != DE_NULL);
- vk.cmdNextSubpass2KHR(cmdBuffer, pSubpassBeginInfo, pSubpassEndInfo);
+ vk.cmdNextSubpass2(cmdBuffer, pSubpassBeginInfo, pSubpassEndInfo);
}
void RenderpassSubpass2::cmdEndRenderPass (const DeviceInterface& vk,
@@ -361,7 +361,7 @@
{
DE_ASSERT(pSubpassEndInfo != DE_NULL);
- vk.cmdEndRenderPass2KHR(cmdBuffer, pSubpassEndInfo);
+ vk.cmdEndRenderPass2(cmdBuffer, pSubpassEndInfo);
}
} // renderpass
diff --git a/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderPassUtil.hpp b/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderPassUtil.hpp
index 1e80c3e..9274146 100644
--- a/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderPassUtil.hpp
+++ b/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderPassUtil.hpp
@@ -49,7 +49,7 @@
VkImageLayout finalLayout);
};
-class AttachmentDescription2 : public vk::VkAttachmentDescription2KHR
+class AttachmentDescription2 : public vk::VkAttachmentDescription2
{
public:
AttachmentDescription2 (const void* pNext,
@@ -73,7 +73,7 @@
VkImageAspectFlags aspectMask);
};
-class AttachmentReference2 : public vk::VkAttachmentReference2KHR
+class AttachmentReference2 : public vk::VkAttachmentReference2
{
public:
AttachmentReference2 (const void* pNext,
@@ -99,7 +99,7 @@
const deUint32* pPreserveAttachments);
};
-class SubpassDescription2 : public vk::VkSubpassDescription2KHR
+class SubpassDescription2 : public vk::VkSubpassDescription2
{
public:
SubpassDescription2 (const void* pNext,
@@ -107,11 +107,11 @@
VkPipelineBindPoint pipelineBindPoint,
deUint32 viewMask,
deUint32 inputAttachmentCount,
- const VkAttachmentReference2KHR* pInputAttachments,
+ const VkAttachmentReference2* pInputAttachments,
deUint32 colorAttachmentCount,
- const VkAttachmentReference2KHR* pColorAttachments,
- const VkAttachmentReference2KHR* pResolveAttachments,
- const VkAttachmentReference2KHR* pDepthStencilAttachment,
+ const VkAttachmentReference2* pColorAttachments,
+ const VkAttachmentReference2* pResolveAttachments,
+ const VkAttachmentReference2* pDepthStencilAttachment,
deUint32 preserveAttachmentCount,
const deUint32* pPreserveAttachments);
};
@@ -130,7 +130,7 @@
deInt32 viewOffset);
};
-class SubpassDependency2 : public vk::VkSubpassDependency2KHR
+class SubpassDependency2 : public vk::VkSubpassDependency2
{
public:
SubpassDependency2 (const void* pNext,
@@ -162,17 +162,17 @@
VkDevice device) const;
};
-class RenderPassCreateInfo2 : public VkRenderPassCreateInfo2KHR
+class RenderPassCreateInfo2 : public VkRenderPassCreateInfo2
{
public:
RenderPassCreateInfo2 (const void* pNext,
VkRenderPassCreateFlags flags,
deUint32 attachmentCount,
- const VkAttachmentDescription2KHR* pAttachments,
+ const VkAttachmentDescription2* pAttachments,
deUint32 subpassCount,
- const VkSubpassDescription2KHR* pSubpasses,
+ const VkSubpassDescription2* pSubpasses,
deUint32 dependencyCount,
- const VkSubpassDependency2KHR* pDependencies,
+ const VkSubpassDependency2* pDependencies,
deUint32 correlatedViewMaskCount,
const deUint32* pCorrelatedViewMasks);
@@ -189,7 +189,7 @@
VkSubpassContents contents;
};
-class SubpassBeginInfo2 : public VkSubpassBeginInfoKHR
+class SubpassBeginInfo2 : public VkSubpassBeginInfo
{
public:
SubpassBeginInfo2 (const void* pNext,
@@ -202,7 +202,7 @@
SubpassEndInfo1 (const void* pNext);
};
-class SubpassEndInfo2 : public VkSubpassEndInfoKHR
+class SubpassEndInfo2 : public VkSubpassEndInfo
{
public:
SubpassEndInfo2 (const void* pNext);
diff --git a/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderTests.cpp b/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderTests.cpp
index 71e03fa..2225726 100644
--- a/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderTests.cpp
+++ b/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderTests.cpp
@@ -24,6 +24,7 @@
#include "vktMultiViewRenderTests.hpp"
#include "vktMultiViewRenderUtil.hpp"
#include "vktMultiViewRenderPassUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vktTestCase.hpp"
#include "vkBuilderUtil.hpp"
@@ -317,15 +318,12 @@
MultiViewRenderTestInstance::MultiViewRenderTestInstance (Context& context, const TestParameters& parameters)
: TestInstance (context)
- , m_extensionSupported ((parameters.renderPassType == RENDERPASS_TYPE_RENDERPASS2) && context.requireDeviceExtension("VK_KHR_create_renderpass2"))
+ , m_extensionSupported ((parameters.renderPassType == RENDERPASS_TYPE_RENDERPASS2) && context.requireDeviceFunctionality("VK_KHR_create_renderpass2"))
, m_parameters (fillMissingParameters(parameters))
, m_seed (context.getTestContext().getCommandLine().getBaseSeed())
, m_squareCount (4u)
, m_queueFamilyIndex (0u)
{
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_multiview"))
- throw tcu::NotSupportedError("VK_KHR_multiview is not supported");
-
const float v = 0.75f;
const float o = 0.25f;
@@ -536,9 +534,6 @@
return parameters;
else
{
- if (!isDeviceExtensionSupported(m_context.getUsedApiVersion(), m_context.getDeviceExtensions(), "VK_KHR_multiview"))
- throw tcu::NotSupportedError("VK_KHR_multiview is not supported");
-
const InstanceInterface& instance = m_context.getInstanceInterface();
const VkPhysicalDevice physicalDevice = m_context.getPhysicalDevice();
@@ -701,7 +696,7 @@
m_hasMultiDrawIndirect = enabledFeatures.features.multiDrawIndirect;
{
- vector<const char*> deviceExtensions;
+ vector<const char*> deviceExtensions;
if (!isCoreDeviceExtension(m_context.getUsedApiVersion(), "VK_KHR_multiview"))
deviceExtensions.push_back("VK_KHR_multiview");
@@ -724,7 +719,7 @@
DE_NULL //const VkPhysicalDeviceFeatures* pEnabledFeatures;
};
- m_logicalDevice = createDevice(m_context.getPlatformInterface(), m_context.getInstance(), instance, physicalDevice, &deviceInfo);
+ m_logicalDevice = createCustomDevice(m_context.getTestContext().getCommandLine().isValidationEnabled(), m_context.getPlatformInterface(), m_context.getInstance(), instance, physicalDevice, &deviceInfo);
m_device = MovePtr<DeviceDriver>(new DeviceDriver(m_context.getPlatformInterface(), m_context.getInstance(), *m_logicalDevice));
m_allocator = MovePtr<Allocator>(new SimpleAllocator(*m_device, *m_logicalDevice, getPhysicalDeviceMemoryProperties(instance, physicalDevice)));
m_device->getDeviceQueue (*m_logicalDevice, m_queueFamilyIndex, 0u, &m_queue);
@@ -3367,6 +3362,11 @@
TCU_THROW(InternalError, "Unknown test type");
}
+ virtual void checkSupport (Context& context) const
+ {
+ context.requireDeviceFunctionality("VK_KHR_multiview");
+ }
+
void initPrograms (SourceCollections& programCollection) const
{
// Create vertex shader
diff --git a/external/vulkancts/modules/vulkan/pipeline/CMakeLists.txt b/external/vulkancts/modules/vulkan/pipeline/CMakeLists.txt
index efd8537..fb4df66 100644
--- a/external/vulkancts/modules/vulkan/pipeline/CMakeLists.txt
+++ b/external/vulkancts/modules/vulkan/pipeline/CMakeLists.txt
@@ -99,6 +99,8 @@
)
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})
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineBlendTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineBlendTests.cpp
index bbc02f8..25e1357 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineBlendTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineBlendTests.cpp
@@ -111,6 +111,7 @@
const VkPipelineColorBlendAttachmentState blendStates[QUAD_COUNT]);
virtual ~BlendTest (void);
virtual void initPrograms (SourceCollections& sourceCollections) const;
+ virtual void checkSupport (Context& context) const;
virtual TestInstance* createInstance (Context& context) const;
private:
@@ -265,6 +266,12 @@
return new BlendTestInstance(context, m_colorFormat, m_blendStates);
}
+void BlendTest::checkSupport (Context& context) const
+{
+ if (!isSupportedBlendFormat(context.getInstanceInterface(), context.getPhysicalDevice(), m_colorFormat))
+ throw tcu::NotSupportedError(std::string("Unsupported color blending format: ") + getFormatName(m_colorFormat));
+}
+
void BlendTest::initPrograms (SourceCollections& sourceCollections) const
{
std::ostringstream fragmentSource;
@@ -311,9 +318,6 @@
// Create color image
{
- if (!isSupportedBlendFormat(context.getInstanceInterface(), context.getPhysicalDevice(), m_colorFormat))
- throw tcu::NotSupportedError(std::string("Unsupported color blending format: ") + getFormatName(m_colorFormat));
-
const VkImageCreateInfo colorImageParams =
{
VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
@@ -581,8 +585,8 @@
{
switch (tcu::getTextureChannelClass(format.type))
{
- case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: return BlendTest::QUAD_COUNT / static_cast<float>((1 << numBits) - 1);
- case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: return BlendTest::QUAD_COUNT / static_cast<float>((1 << (numBits - 1)) - 1);
+ case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: return static_cast<float>(BlendTest::QUAD_COUNT) / static_cast<float>((1 << numBits) - 1);
+ case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: return static_cast<float>(BlendTest::QUAD_COUNT) / static_cast<float>((1 << (numBits - 1)) - 1);
default:
break;
}
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineCacheTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineCacheTests.cpp
index 6c78d91..41d505b 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineCacheTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineCacheTests.cpp
@@ -62,8 +62,8 @@
// helper functions
-std::string getShaderFlagStr (const VkShaderStageFlagBits shader,
- bool isDescription)
+std::string getShaderFlagStr (const VkShaderStageFlagBits shader,
+ bool isDescription)
{
std::ostringstream desc;
switch(shader)
@@ -111,18 +111,18 @@
class CacheTestParam
{
public:
- CacheTestParam (const VkShaderStageFlagBits* shaders,
- deUint32 count,
- bool compileCacheMissShaders);
- virtual ~CacheTestParam (void);
- virtual const std::string generateTestName (void) const;
- virtual const std::string generateTestDescription (void) const;
- VkShaderStageFlagBits getShaderFlag (deUint32 ndx) const { return m_shaders[ndx]; }
- deUint32 getShaderCount (void) const { return (deUint32)m_shaderCount; }
+ CacheTestParam (const VkShaderStageFlagBits* shaders,
+ deUint32 count,
+ bool compileCacheMissShaders);
+ virtual ~CacheTestParam (void);
+ virtual const std::string generateTestName (void) const;
+ virtual const std::string generateTestDescription (void) const;
+ VkShaderStageFlagBits getShaderFlag (deUint32 ndx) const { return m_shaders[ndx]; }
+ deUint32 getShaderCount (void) const { return (deUint32)m_shaderCount; }
bool getCompileMissShaders (void) const { return m_compileCacheMissShaders; }
protected:
- VkShaderStageFlagBits m_shaders[VK_MAX_SHADER_STAGES];
- size_t m_shaderCount;
+ VkShaderStageFlagBits m_shaders[VK_MAX_SHADER_STAGES];
+ size_t m_shaderCount;
bool m_compileCacheMissShaders;
};
@@ -130,8 +130,10 @@
: m_compileCacheMissShaders (compileCacheMissShaders)
{
DE_ASSERT(count <= VK_MAX_SHADER_STAGES);
+
for (deUint32 ndx = 0; ndx < count; ndx++)
m_shaders[ndx] = shaders[ndx];
+
m_shaderCount = count;
}
@@ -173,13 +175,11 @@
VkPipelineCache cache,
VkPipelineLayout pipelineLayout);
protected:
- Context& m_context;
-
- Move<VkShaderModule> m_shaderModules[VK_MAX_SHADER_STAGES];
- deUint32 m_shaderStageCount;
- VkPipelineShaderStageCreateInfo m_shaderStageInfo[VK_MAX_SHADER_STAGES];
-
- deUint32 m_patchControlPoints;
+ Context& m_context;
+ Move<VkShaderModule> m_shaderModules[VK_MAX_SHADER_STAGES];
+ deUint32 m_shaderStageCount;
+ VkPipelineShaderStageCreateInfo m_shaderStageInfo[VK_MAX_SHADER_STAGES];
+ deUint32 m_patchControlPoints;
};
SimpleGraphicsPipelineBuilder::SimpleGraphicsPipelineBuilder (Context& context)
@@ -189,16 +189,16 @@
m_shaderStageCount = 0;
}
-void SimpleGraphicsPipelineBuilder::bindShaderStage (VkShaderStageFlagBits stage,
- const char* sourceName,
- const char* entryName)
+void SimpleGraphicsPipelineBuilder::bindShaderStage (VkShaderStageFlagBits stage,
+ const char* sourceName,
+ const char* entryName)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice vkDevice = m_context.getDevice();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
// Create shader module
- deUint32* code = (deUint32*)m_context.getBinaryCollection().get(sourceName).getBinary();
- deUint32 codeSize = (deUint32)m_context.getBinaryCollection().get(sourceName).getSize();
+ deUint32* code = (deUint32*)m_context.getBinaryCollection().get(sourceName).getBinary();
+ deUint32 codeSize = (deUint32)m_context.getBinaryCollection().get(sourceName).getSize();
const VkShaderModuleCreateInfo moduleCreateInfo =
{
@@ -212,65 +212,65 @@
m_shaderModules[m_shaderStageCount] = createShaderModule(vk, vkDevice, &moduleCreateInfo);
// Prepare shader stage info
- m_shaderStageInfo[m_shaderStageCount].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
- m_shaderStageInfo[m_shaderStageCount].pNext = DE_NULL;
- m_shaderStageInfo[m_shaderStageCount].flags = 0u;
- m_shaderStageInfo[m_shaderStageCount].stage = stage;
- m_shaderStageInfo[m_shaderStageCount].module = *m_shaderModules[m_shaderStageCount];
- m_shaderStageInfo[m_shaderStageCount].pName = entryName;
- m_shaderStageInfo[m_shaderStageCount].pSpecializationInfo = DE_NULL;
+ m_shaderStageInfo[m_shaderStageCount].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
+ m_shaderStageInfo[m_shaderStageCount].pNext = DE_NULL;
+ m_shaderStageInfo[m_shaderStageCount].flags = 0u;
+ m_shaderStageInfo[m_shaderStageCount].stage = stage;
+ m_shaderStageInfo[m_shaderStageCount].module = *m_shaderModules[m_shaderStageCount];
+ m_shaderStageInfo[m_shaderStageCount].pName = entryName;
+ m_shaderStageInfo[m_shaderStageCount].pSpecializationInfo = DE_NULL;
m_shaderStageCount++;
}
Move<VkPipeline> SimpleGraphicsPipelineBuilder::buildPipeline (tcu::UVec2 renderSize, VkRenderPass renderPass, VkPipelineCache cache, VkPipelineLayout pipelineLayout)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice vkDevice = m_context.getDevice();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
// Create pipeline
const VkVertexInputBindingDescription vertexInputBindingDescription =
{
- 0u, // deUint32 binding;
- sizeof(Vertex4RGBA), // deUint32 strideInBytes;
- VK_VERTEX_INPUT_RATE_VERTEX, // VkVertexInputRate inputRate;
+ 0u, // deUint32 binding;
+ sizeof(Vertex4RGBA), // deUint32 strideInBytes;
+ VK_VERTEX_INPUT_RATE_VERTEX, // VkVertexInputRate inputRate;
};
const VkVertexInputAttributeDescription vertexInputAttributeDescriptions[2] =
{
{
- 0u, // deUint32 location;
- 0u, // deUint32 binding;
- VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format;
- 0u // deUint32 offsetInBytes;
+ 0u, // deUint32 location;
+ 0u, // deUint32 binding;
+ VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format;
+ 0u // deUint32 offsetInBytes;
},
{
- 1u, // deUint32 location;
- 0u, // deUint32 binding;
- VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format;
- DE_OFFSET_OF(Vertex4RGBA, color), // deUint32 offsetInBytes;
+ 1u, // deUint32 location;
+ 0u, // deUint32 binding;
+ VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format;
+ DE_OFFSET_OF(Vertex4RGBA, color), // deUint32 offsetInBytes;
}
};
const VkPipelineVertexInputStateCreateInfo vertexInputStateParams =
{
- VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkPipelineVertexInputStateCreateFlags flags;
- 1u, // deUint32 vertexBindingDescriptionCount;
- &vertexInputBindingDescription, // const VkVertexInputBindingDescription* pVertexBindingDescriptions;
- 2u, // deUint32 vertexAttributeDescriptionCount;
- vertexInputAttributeDescriptions, // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions;
+ VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkPipelineVertexInputStateCreateFlags flags;
+ 1u, // deUint32 vertexBindingDescriptionCount;
+ &vertexInputBindingDescription, // const VkVertexInputBindingDescription* pVertexBindingDescriptions;
+ 2u, // deUint32 vertexAttributeDescriptionCount;
+ vertexInputAttributeDescriptions, // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions;
};
const VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateParams =
{
- VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkPipelineInputAssemblyStateCreateFlags flags;
+ VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkPipelineInputAssemblyStateCreateFlags flags;
(m_patchControlPoints == 0 ? VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST
- : VK_PRIMITIVE_TOPOLOGY_PATCH_LIST), // VkPrimitiveTopology topology;
- VK_FALSE, // VkBool32 primitiveRestartEnable;
+ : VK_PRIMITIVE_TOPOLOGY_PATCH_LIST), // VkPrimitiveTopology topology;
+ VK_FALSE, // VkBool32 primitiveRestartEnable;
};
const VkViewport viewport = makeViewport(renderSize);
@@ -278,112 +278,112 @@
const VkPipelineViewportStateCreateInfo viewportStateParams =
{
- VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkPipelineViewportStateCreateFlags flags;
- 1u, // deUint32 viewportCount;
- &viewport, // const VkViewport* pViewports;
- 1u, // deUint32 scissorCount;
- &scissor // const VkRect2D* pScissors;
+ VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkPipelineViewportStateCreateFlags flags;
+ 1u, // deUint32 viewportCount;
+ &viewport, // const VkViewport* pViewports;
+ 1u, // deUint32 scissorCount;
+ &scissor // const VkRect2D* pScissors;
};
const VkPipelineRasterizationStateCreateInfo rasterStateParams =
{
- VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkPipelineRasterizationStateCreateFlags flags;
- VK_FALSE, // VkBool32 depthClampEnable;
- VK_FALSE, // VkBool32 rasterizerDiscardEnable;
- VK_POLYGON_MODE_FILL, // VkPolygonMode polygonMode;
- VK_CULL_MODE_NONE, // VkCullModeFlags cullMode;
- VK_FRONT_FACE_COUNTER_CLOCKWISE, // VkFrontFace frontFace;
- VK_FALSE, // VkBool32 depthBiasEnable;
- 0.0f, // float depthBiasConstantFactor;
- 0.0f, // float depthBiasClamp;
- 0.0f, // float depthBiasSlopeFactor;
- 1.0f, // float lineWidth;
+ VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkPipelineRasterizationStateCreateFlags flags;
+ VK_FALSE, // VkBool32 depthClampEnable;
+ VK_FALSE, // VkBool32 rasterizerDiscardEnable;
+ VK_POLYGON_MODE_FILL, // VkPolygonMode polygonMode;
+ VK_CULL_MODE_NONE, // VkCullModeFlags cullMode;
+ VK_FRONT_FACE_COUNTER_CLOCKWISE, // VkFrontFace frontFace;
+ VK_FALSE, // VkBool32 depthBiasEnable;
+ 0.0f, // float depthBiasConstantFactor;
+ 0.0f, // float depthBiasClamp;
+ 0.0f, // float depthBiasSlopeFactor;
+ 1.0f, // float lineWidth;
};
const VkPipelineColorBlendAttachmentState colorBlendAttachmentState =
{
- VK_FALSE, // VkBool32 blendEnable;
- VK_BLEND_FACTOR_ONE, // VkBlendFactor srcColorBlendFactor;
- VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstColorBlendFactor;
- VK_BLEND_OP_ADD, // VkBlendOp colorBlendOp;
- VK_BLEND_FACTOR_ONE, // VkBlendFactor srcAlphaBlendFactor;
- VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstAlphaBlendFactor;
- VK_BLEND_OP_ADD, // VkBlendOp alphaBlendOp;
+ VK_FALSE, // VkBool32 blendEnable;
+ VK_BLEND_FACTOR_ONE, // VkBlendFactor srcColorBlendFactor;
+ VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstColorBlendFactor;
+ VK_BLEND_OP_ADD, // VkBlendOp colorBlendOp;
+ VK_BLEND_FACTOR_ONE, // VkBlendFactor srcAlphaBlendFactor;
+ VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstAlphaBlendFactor;
+ VK_BLEND_OP_ADD, // VkBlendOp alphaBlendOp;
VK_COLOR_COMPONENT_R_BIT |
VK_COLOR_COMPONENT_G_BIT |
VK_COLOR_COMPONENT_B_BIT |
- VK_COLOR_COMPONENT_A_BIT // VkColorComponentFlags colorWriteMask;
+ VK_COLOR_COMPONENT_A_BIT // VkColorComponentFlags colorWriteMask;
};
const VkPipelineColorBlendStateCreateInfo colorBlendStateParams =
{
- 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;
- 1u, // deUint32 attachmentCount;
- &colorBlendAttachmentState, // const VkPipelineColorBlendAttachmentState* pAttachments;
- { 0.0f, 0.0f, 0.0f, 0.0f }, // float blendConst[4];
+ 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;
+ 1u, // deUint32 attachmentCount;
+ &colorBlendAttachmentState, // const VkPipelineColorBlendAttachmentState* pAttachments;
+ { 0.0f, 0.0f, 0.0f, 0.0f }, // float blendConst[4];
};
const VkPipelineMultisampleStateCreateInfo multisampleStateParams =
{
- 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;
- 0.0f, // float minSampleShading;
- DE_NULL, // const VkSampleMask* pSampleMask;
- VK_FALSE, // VkBool32 alphaToCoverageEnable;
- VK_FALSE, // VkBool32 alphaToOneEnable;
+ 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;
+ 0.0f, // float minSampleShading;
+ DE_NULL, // const VkSampleMask* pSampleMask;
+ VK_FALSE, // VkBool32 alphaToCoverageEnable;
+ VK_FALSE, // VkBool32 alphaToOneEnable;
};
VkPipelineDepthStencilStateCreateInfo depthStencilStateParams =
{
- VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkPipelineDepthStencilStateCreateFlags flags;
- VK_TRUE, // VkBool32 depthTestEnable;
- VK_TRUE, // VkBool32 depthWriteEnable;
- VK_COMPARE_OP_LESS_OR_EQUAL, // VkCompareOp depthCompareOp;
- VK_FALSE, // VkBool32 depthBoundsTestEnable;
- VK_FALSE, // VkBool32 stencilTestEnable;
+ VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkPipelineDepthStencilStateCreateFlags flags;
+ VK_TRUE, // VkBool32 depthTestEnable;
+ VK_TRUE, // VkBool32 depthWriteEnable;
+ VK_COMPARE_OP_LESS_OR_EQUAL, // VkCompareOp depthCompareOp;
+ VK_FALSE, // VkBool32 depthBoundsTestEnable;
+ VK_FALSE, // VkBool32 stencilTestEnable;
// VkStencilOpState front;
{
- VK_STENCIL_OP_KEEP, // VkStencilOp failOp;
- VK_STENCIL_OP_KEEP, // VkStencilOp passOp;
- VK_STENCIL_OP_KEEP, // VkStencilOp depthFailOp;
- VK_COMPARE_OP_NEVER, // VkCompareOp compareOp;
- 0u, // deUint32 compareMask;
- 0u, // deUint32 writeMask;
- 0u, // deUint32 reference;
+ VK_STENCIL_OP_KEEP, // VkStencilOp failOp;
+ VK_STENCIL_OP_KEEP, // VkStencilOp passOp;
+ VK_STENCIL_OP_KEEP, // VkStencilOp depthFailOp;
+ VK_COMPARE_OP_NEVER, // VkCompareOp compareOp;
+ 0u, // deUint32 compareMask;
+ 0u, // deUint32 writeMask;
+ 0u, // deUint32 reference;
},
// VkStencilOpState back;
{
- VK_STENCIL_OP_KEEP, // VkStencilOp failOp;
- VK_STENCIL_OP_KEEP, // VkStencilOp passOp;
- VK_STENCIL_OP_KEEP, // VkStencilOp depthFailOp;
- VK_COMPARE_OP_NEVER, // VkCompareOp compareOp;
- 0u, // deUint32 compareMask;
- 0u, // deUint32 writeMask;
- 0u, // deUint32 reference;
+ VK_STENCIL_OP_KEEP, // VkStencilOp failOp;
+ VK_STENCIL_OP_KEEP, // VkStencilOp passOp;
+ VK_STENCIL_OP_KEEP, // VkStencilOp depthFailOp;
+ VK_COMPARE_OP_NEVER, // VkCompareOp compareOp;
+ 0u, // deUint32 compareMask;
+ 0u, // deUint32 writeMask;
+ 0u, // deUint32 reference;
},
- 0.0f, // float minDepthBounds;
- 1.0f, // float maxDepthBounds;
+ 0.0f, // float minDepthBounds;
+ 1.0f, // float maxDepthBounds;
};
const VkPipelineTessellationStateCreateInfo tessStateCreateInfo =
{
- VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkPipelineTesselationStateCreateFlags flags;
- m_patchControlPoints, // deUint32 patchControlPoints;
+ VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkPipelineTesselationStateCreateFlags flags;
+ m_patchControlPoints, // deUint32 patchControlPoints;
};
const VkPipelineTessellationStateCreateInfo* pTessCreateInfo = (m_patchControlPoints > 0)
? &tessStateCreateInfo
@@ -391,25 +391,25 @@
const VkGraphicsPipelineCreateInfo graphicsPipelineParams =
{
- VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkPipelineCreateFlags flags;
- m_shaderStageCount, // deUint32 stageCount;
- m_shaderStageInfo, // const VkPipelineShaderStageCreateInfo* pStages;
- &vertexInputStateParams, // const VkPipelineVertexInputStateCreateInfo* pVertexInputState;
- &inputAssemblyStateParams, // const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState;
- pTessCreateInfo, // const VkPipelineTessellationStateCreateInfo* pTessellationState;
- &viewportStateParams, // const VkPipelineViewportStateCreateInfo* pViewportState;
- &rasterStateParams, // const VkPipelineRasterizationStateCreateInfo* pRasterState;
- &multisampleStateParams, // const VkPipelineMultisampleStateCreateInfo* pMultisampleState;
- &depthStencilStateParams, // const VkPipelineDepthStencilStateCreateInfo* pDepthStencilState;
- &colorBlendStateParams, // const VkPipelineColorBlendStateCreateInfo* pColorBlendState;
- (const VkPipelineDynamicStateCreateInfo*)DE_NULL, // const VkPipelineDynamicStateCreateInfo* pDynamicState;
- pipelineLayout, // VkPipelineLayout layout;
- renderPass, // VkRenderPass renderPass;
- 0u, // deUint32 subpass;
- 0u, // VkPipeline basePipelineHandle;
- 0, // deInt32 basePipelineIndex;
+ VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkPipelineCreateFlags flags;
+ m_shaderStageCount, // deUint32 stageCount;
+ m_shaderStageInfo, // const VkPipelineShaderStageCreateInfo* pStages;
+ &vertexInputStateParams, // const VkPipelineVertexInputStateCreateInfo* pVertexInputState;
+ &inputAssemblyStateParams, // const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState;
+ pTessCreateInfo, // const VkPipelineTessellationStateCreateInfo* pTessellationState;
+ &viewportStateParams, // const VkPipelineViewportStateCreateInfo* pViewportState;
+ &rasterStateParams, // const VkPipelineRasterizationStateCreateInfo* pRasterState;
+ &multisampleStateParams, // const VkPipelineMultisampleStateCreateInfo* pMultisampleState;
+ &depthStencilStateParams, // const VkPipelineDepthStencilStateCreateInfo* pDepthStencilState;
+ &colorBlendStateParams, // const VkPipelineColorBlendStateCreateInfo* pColorBlendState;
+ (const VkPipelineDynamicStateCreateInfo*)DE_NULL, // const VkPipelineDynamicStateCreateInfo* pDynamicState;
+ pipelineLayout, // VkPipelineLayout layout;
+ renderPass, // VkRenderPass renderPass;
+ 0u, // deUint32 subpass;
+ 0u, // VkPipeline basePipelineHandle;
+ 0, // deInt32 basePipelineIndex;
};
return createGraphicsPipeline(vk, vkDevice, cache, &graphicsPipelineParams);
@@ -421,8 +421,8 @@
}
template <class Test>
-vkt::TestCase* newTestCase (tcu::TestContext& testContext,
- const CacheTestParam* testParam)
+vkt::TestCase* newTestCase (tcu::TestContext& testContext,
+ const CacheTestParam* testParam)
{
return new Test(testContext,
testParam->generateTestName().c_str(),
@@ -432,9 +432,9 @@
Move<VkBuffer> createBufferAndBindMemory (Context& context, VkDeviceSize size, VkBufferUsageFlags usage, de::MovePtr<Allocation>* pAlloc)
{
- const DeviceInterface& vk = context.getDeviceInterface();
- const VkDevice vkDevice = context.getDevice();
- const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
+ const DeviceInterface& vk = context.getDeviceInterface();
+ const VkDevice vkDevice = context.getDevice();
+ const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
const VkBufferCreateInfo vertexBufferParams =
{
@@ -456,35 +456,35 @@
return vertexBuffer;
}
-Move<VkImage> createImage2DAndBindMemory (Context& context,
- VkFormat format,
- deUint32 width,
- deUint32 height,
- VkImageUsageFlags usage,
- VkSampleCountFlagBits sampleCount,
- de::details::MovePtr<Allocation>* pAlloc)
+Move<VkImage> createImage2DAndBindMemory (Context& context,
+ VkFormat format,
+ deUint32 width,
+ deUint32 height,
+ VkImageUsageFlags usage,
+ VkSampleCountFlagBits sampleCount,
+ de::details::MovePtr<Allocation>* pAlloc)
{
- const DeviceInterface& vk = context.getDeviceInterface();
- const VkDevice vkDevice = context.getDevice();
- const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
+ const DeviceInterface& vk = context.getDeviceInterface();
+ const VkDevice vkDevice = context.getDevice();
+ const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
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;
- format, // VkFormat format;
- { width, height, 1u }, // VkExtent3D extent;
- 1u, // deUint32 mipLevels;
- 1u, // deUint32 arraySize;
- sampleCount, // deUint32 samples;
- VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
- usage, // VkImageUsageFlags usage;
- VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
- 1u, // deUint32 queueFamilyCount;
- &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
- VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
+ VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkImageCreateFlags flags;
+ VK_IMAGE_TYPE_2D, // VkImageType imageType;
+ format, // VkFormat format;
+ { width, height, 1u }, // VkExtent3D extent;
+ 1u, // deUint32 mipLevels;
+ 1u, // deUint32 arraySize;
+ sampleCount, // deUint32 samples;
+ VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
+ usage, // VkImageUsageFlags usage;
+ VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
+ 1u, // deUint32 queueFamilyCount;
+ &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
+ VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
};
Move<VkImage> image = createImage(vk, vkDevice, &colorImageParams);
@@ -499,16 +499,16 @@
class CacheTest : public vkt::TestCase
{
public:
- CacheTest(tcu::TestContext& testContext,
- const std::string& name,
- const std::string& description,
- const CacheTestParam* param)
+ CacheTest (tcu::TestContext& testContext,
+ const std::string& name,
+ const std::string& description,
+ const CacheTestParam* param)
: vkt::TestCase (testContext, name, description)
, m_param (*param)
{ }
- virtual ~CacheTest (void) { }
+ virtual ~CacheTest (void) { }
protected:
- const CacheTestParam m_param;
+ const CacheTestParam m_param;
};
class CacheTestInstance : public vkt::TestInstance
@@ -520,29 +520,28 @@
PIPELINE_CACHE_NDX_CACHED,
PIPELINE_CACHE_NDX_COUNT,
};
- CacheTestInstance (Context& context,
- const CacheTestParam* param);
- virtual ~CacheTestInstance (void);
- virtual tcu::TestStatus iterate (void);
+ CacheTestInstance (Context& context,
+ const CacheTestParam* param);
+ virtual ~CacheTestInstance (void);
+ virtual tcu::TestStatus iterate (void);
protected:
- virtual tcu::TestStatus verifyTestResult (void) = 0;
- virtual void prepareCommandBuffer (void) = 0;
+ virtual tcu::TestStatus verifyTestResult (void) = 0;
+ virtual void prepareCommandBuffer (void) = 0;
protected:
const CacheTestParam* m_param;
-
- Move<VkCommandPool> m_cmdPool;
- Move<VkCommandBuffer> m_cmdBuffer;
- Move<VkPipelineCache> m_cache;
+ Move<VkCommandPool> m_cmdPool;
+ Move<VkCommandBuffer> m_cmdBuffer;
+ Move<VkPipelineCache> m_cache;
};
-CacheTestInstance::CacheTestInstance (Context& context,
- const CacheTestParam* param)
- : TestInstance (context)
- , m_param (param)
+CacheTestInstance::CacheTestInstance (Context& context,
+ const CacheTestParam* param)
+ : TestInstance (context)
+ , m_param (param)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice vkDevice = m_context.getDevice();
- const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
+ const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
// Create command pool
m_cmdPool = createCommandPool(vk, vkDevice, VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, queueFamilyIndex);
@@ -554,11 +553,11 @@
{
const VkPipelineCacheCreateInfo pipelineCacheCreateInfo =
{
- VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkPipelineCacheCreateFlags flags;
- 0u, // deUintptr initialDataSize;
- DE_NULL, // const void* pInitialData;
+ VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkPipelineCacheCreateFlags flags;
+ 0u, // deUintptr initialDataSize;
+ DE_NULL, // const void* pInitialData;
};
m_cache = createPipelineCache(vk, vkDevice, &pipelineCacheCreateInfo);
@@ -571,9 +570,9 @@
tcu::TestStatus CacheTestInstance::iterate (void)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice vkDevice = m_context.getDevice();
- const VkQueue queue = m_context.getUniversalQueue();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
+ const VkQueue queue = m_context.getUniversalQueue();
prepareCommandBuffer();
@@ -585,52 +584,53 @@
class GraphicsCacheTest : public CacheTest
{
public:
- GraphicsCacheTest (tcu::TestContext& testContext,
- const std::string& name,
- const std::string& description,
- const CacheTestParam* param)
+ GraphicsCacheTest (tcu::TestContext& testContext,
+ const std::string& name,
+ const std::string& description,
+ const CacheTestParam* param)
: CacheTest (testContext, name, description, param)
{ }
- virtual ~GraphicsCacheTest (void) { }
- virtual void initPrograms (SourceCollections& programCollection) const;
- virtual TestInstance* createInstance (Context& context) const;
+ virtual ~GraphicsCacheTest (void) { }
+ virtual void initPrograms (SourceCollections& programCollection) const;
+ virtual void checkSupport (Context& context) const;
+ virtual TestInstance* createInstance (Context& context) const;
};
class GraphicsCacheTestInstance : public CacheTestInstance
{
public:
- GraphicsCacheTestInstance (Context& context,
- const CacheTestParam* param);
- virtual ~GraphicsCacheTestInstance (void);
+ GraphicsCacheTestInstance (Context& context,
+ const CacheTestParam* param);
+ virtual ~GraphicsCacheTestInstance (void);
protected:
- void prepareRenderPass (VkFramebuffer framebuffer, VkPipeline pipeline);
- virtual void prepareCommandBuffer (void);
- virtual tcu::TestStatus verifyTestResult (void);
+ void prepareRenderPass (VkFramebuffer framebuffer, VkPipeline pipeline);
+ virtual void prepareCommandBuffer (void);
+ virtual tcu::TestStatus verifyTestResult (void);
protected:
- const tcu::UVec2 m_renderSize;
- const VkFormat m_colorFormat;
- const VkFormat m_depthFormat;
- Move<VkPipelineLayout> m_pipelineLayout;
+ const tcu::UVec2 m_renderSize;
+ const VkFormat m_colorFormat;
+ const VkFormat m_depthFormat;
+ Move<VkPipelineLayout> m_pipelineLayout;
- Move<VkImage> m_depthImage;
- de::MovePtr<Allocation> m_depthImageAlloc;
- de::MovePtr<Allocation> m_colorImageAlloc[PIPELINE_CACHE_NDX_COUNT];
- Move<VkImageView> m_depthAttachmentView;
- VkImageMemoryBarrier m_imageLayoutBarriers[3];
+ Move<VkImage> m_depthImage;
+ de::MovePtr<Allocation> m_depthImageAlloc;
+ de::MovePtr<Allocation> m_colorImageAlloc[PIPELINE_CACHE_NDX_COUNT];
+ Move<VkImageView> m_depthAttachmentView;
+ VkImageMemoryBarrier m_imageLayoutBarriers[3];
- Move<VkBuffer> m_vertexBuffer;
- de::MovePtr<Allocation> m_vertexBufferMemory;
- std::vector<Vertex4RGBA> m_vertices;
+ Move<VkBuffer> m_vertexBuffer;
+ de::MovePtr<Allocation> m_vertexBufferMemory;
+ std::vector<Vertex4RGBA> m_vertices;
- SimpleGraphicsPipelineBuilder m_pipelineBuilder;
- SimpleGraphicsPipelineBuilder m_missPipelineBuilder;
- Move<VkRenderPass> m_renderPass;
+ SimpleGraphicsPipelineBuilder m_pipelineBuilder;
+ SimpleGraphicsPipelineBuilder m_missPipelineBuilder;
+ Move<VkRenderPass> m_renderPass;
- Move<VkImage> m_colorImage[PIPELINE_CACHE_NDX_COUNT];
- Move<VkImageView> m_colorAttachmentView[PIPELINE_CACHE_NDX_COUNT];
- Move<VkFramebuffer> m_framebuffer[PIPELINE_CACHE_NDX_COUNT];
- Move<VkPipeline> m_pipeline[PIPELINE_CACHE_NDX_COUNT];
+ Move<VkImage> m_colorImage[PIPELINE_CACHE_NDX_COUNT];
+ Move<VkImageView> m_colorAttachmentView[PIPELINE_CACHE_NDX_COUNT];
+ Move<VkFramebuffer> m_framebuffer[PIPELINE_CACHE_NDX_COUNT];
+ Move<VkPipeline> m_pipeline[PIPELINE_CACHE_NDX_COUNT];
};
void GraphicsCacheTest::initPrograms (SourceCollections& programCollection) const
@@ -757,13 +757,32 @@
}
}
+void GraphicsCacheTest::checkSupport (Context& context) const
+{
+ for (deUint32 shaderNdx = 0; shaderNdx < m_param.getShaderCount(); shaderNdx++)
+ {
+ switch(m_param.getShaderFlag(shaderNdx))
+ {
+ case VK_SHADER_STAGE_GEOMETRY_BIT:
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_GEOMETRY_SHADER);
+ break;
+ case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
+ case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_TESSELLATION_SHADER);
+ break;
+ default:
+ break;
+ };
+ }
+}
+
TestInstance* GraphicsCacheTest::createInstance (Context& context) const
{
return new GraphicsCacheTestInstance(context, &m_param);
}
-GraphicsCacheTestInstance::GraphicsCacheTestInstance (Context& context,
- const CacheTestParam* param)
+GraphicsCacheTestInstance::GraphicsCacheTestInstance (Context& context,
+ const CacheTestParam* param)
: CacheTestInstance (context,param)
, m_renderSize (32u, 32u)
, m_colorFormat (VK_FORMAT_R8G8B8A8_UNORM)
@@ -771,14 +790,14 @@
, m_pipelineBuilder (context)
, m_missPipelineBuilder (context)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice vkDevice = m_context.getDevice();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
// Create vertex buffer
{
- m_vertexBuffer = createBufferAndBindMemory(m_context, 1024u, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, &m_vertexBufferMemory);
+ m_vertexBuffer = createBufferAndBindMemory(m_context, 1024u, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, &m_vertexBufferMemory);
- m_vertices = createOverlappingQuads();
+ m_vertices = createOverlappingQuads();
// Load vertices into vertex buffer
deMemcpy(m_vertexBufferMemory->getHostPtr(), m_vertices.data(), m_vertices.size() * sizeof(Vertex4RGBA));
flushAlloc(vk, vkDevice, *m_vertexBufferMemory);
@@ -787,23 +806,23 @@
// Create render pass
m_renderPass = makeRenderPass(vk, vkDevice, m_colorFormat, m_depthFormat);
- const VkComponentMapping ComponentMappingRGBA = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A};
+ const VkComponentMapping ComponentMappingRGBA = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A};
// Create color image
{
- m_colorImage[PIPELINE_CACHE_NDX_NO_CACHE] = createImage2DAndBindMemory(m_context,
- m_colorFormat,
- m_renderSize.x(),
- m_renderSize.y(),
- VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
- VK_SAMPLE_COUNT_1_BIT,
- &m_colorImageAlloc[PIPELINE_CACHE_NDX_NO_CACHE]);
- m_colorImage[PIPELINE_CACHE_NDX_CACHED] = createImage2DAndBindMemory(m_context,
- m_colorFormat,
- m_renderSize.x(),
- m_renderSize.y(),
- VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
- VK_SAMPLE_COUNT_1_BIT,
- &m_colorImageAlloc[PIPELINE_CACHE_NDX_CACHED]);
+ m_colorImage[PIPELINE_CACHE_NDX_NO_CACHE] = createImage2DAndBindMemory(m_context,
+ m_colorFormat,
+ m_renderSize.x(),
+ m_renderSize.y(),
+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
+ VK_SAMPLE_COUNT_1_BIT,
+ &m_colorImageAlloc[PIPELINE_CACHE_NDX_NO_CACHE]);
+ m_colorImage[PIPELINE_CACHE_NDX_CACHED] = createImage2DAndBindMemory(m_context,
+ m_colorFormat,
+ m_renderSize.x(),
+ m_renderSize.y(),
+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
+ VK_SAMPLE_COUNT_1_BIT,
+ &m_colorImageAlloc[PIPELINE_CACHE_NDX_CACHED]);
}
// Create depth image
@@ -858,14 +877,14 @@
{
VkImageViewCreateInfo colorAttachmentViewParams =
{
- VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkImageViewCreateFlags flags;
- *m_colorImage[PIPELINE_CACHE_NDX_NO_CACHE], // VkImage image;
- VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType;
- m_colorFormat, // VkFormat format;
- ComponentMappingRGBA, // VkComponentMapping components;
- { VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u }, // VkImageSubresourceRange subresourceRange;
+ VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkImageViewCreateFlags flags;
+ *m_colorImage[PIPELINE_CACHE_NDX_NO_CACHE], // VkImage image;
+ VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType;
+ m_colorFormat, // VkFormat format;
+ ComponentMappingRGBA, // VkComponentMapping components;
+ { VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u }, // VkImageSubresourceRange subresourceRange;
};
m_colorAttachmentView[PIPELINE_CACHE_NDX_NO_CACHE] = createImageView(vk, vkDevice, &colorAttachmentViewParams);
@@ -878,14 +897,14 @@
{
const VkImageViewCreateInfo depthAttachmentViewParams =
{
- VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkImageViewCreateFlags flags;
- *m_depthImage, // VkImage image;
- VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType;
- m_depthFormat, // VkFormat format;
- ComponentMappingRGBA, // VkComponentMapping components;
- { VK_IMAGE_ASPECT_DEPTH_BIT, 0u, 1u, 0u, 1u }, // VkImageSubresourceRange subresourceRange;
+ VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkImageViewCreateFlags flags;
+ *m_depthImage, // VkImage image;
+ VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType;
+ m_depthFormat, // VkFormat format;
+ ComponentMappingRGBA, // VkComponentMapping components;
+ { VK_IMAGE_ASPECT_DEPTH_BIT, 0u, 1u, 0u, 1u }, // VkImageSubresourceRange subresourceRange;
};
m_depthAttachmentView = createImageView(vk, vkDevice, &depthAttachmentViewParams);
@@ -901,15 +920,15 @@
const VkFramebufferCreateInfo framebufferParams =
{
- VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkFramebufferCreateFlags flags;
- *m_renderPass, // VkRenderPass renderPass;
- 2u, // deUint32 attachmentCount;
- attachmentBindInfos, // const VkImageView* pAttachments;
- (deUint32)m_renderSize.x(), // deUint32 width;
- (deUint32)m_renderSize.y(), // deUint32 height;
- 1u, // deUint32 layers;
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkFramebufferCreateFlags flags;
+ *m_renderPass, // VkRenderPass renderPass;
+ 2u, // deUint32 attachmentCount;
+ attachmentBindInfos, // const VkImageView* pAttachments;
+ (deUint32)m_renderSize.x(), // deUint32 width;
+ (deUint32)m_renderSize.y(), // deUint32 height;
+ 1u, // deUint32 layers;
};
m_framebuffer[PIPELINE_CACHE_NDX_NO_CACHE] = createFramebuffer(vk, vkDevice, &framebufferParams);
@@ -919,7 +938,6 @@
}
// Bind shader stages
- VkPhysicalDeviceFeatures features = m_context.getDeviceFeatures();
for (deUint32 shaderNdx = 0; shaderNdx < m_param->getShaderCount(); shaderNdx++)
{
switch(m_param->getShaderFlag(shaderNdx))
@@ -939,49 +957,28 @@
}
break;
case VK_SHADER_STAGE_GEOMETRY_BIT:
- if (features.geometryShader == VK_FALSE)
+ m_pipelineBuilder.bindShaderStage(VK_SHADER_STAGE_GEOMETRY_BIT, "dummy_geo", "main");
+ if (m_param->getCompileMissShaders())
{
- TCU_THROW(NotSupportedError, "Geometry Shader Not Supported");
- }
- else
- {
- m_pipelineBuilder.bindShaderStage(VK_SHADER_STAGE_GEOMETRY_BIT, "dummy_geo", "main");
- if (m_param->getCompileMissShaders())
- {
- m_missPipelineBuilder.bindShaderStage(VK_SHADER_STAGE_GEOMETRY_BIT, "dummy_geo_miss", "main");
- }
+ m_missPipelineBuilder.bindShaderStage(VK_SHADER_STAGE_GEOMETRY_BIT, "dummy_geo_miss", "main");
}
break;
case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
- if (features.tessellationShader == VK_FALSE)
+ m_pipelineBuilder.bindShaderStage(VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, "basic_tcs", "main");
+ m_pipelineBuilder.enableTessellationStage(3);
+ if (m_param->getCompileMissShaders())
{
- TCU_THROW(NotSupportedError, "Tessellation Not Supported");
- }
- else
- {
- m_pipelineBuilder.bindShaderStage(VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, "basic_tcs", "main");
- m_pipelineBuilder.enableTessellationStage(3);
- if (m_param->getCompileMissShaders())
- {
- m_missPipelineBuilder.bindShaderStage(VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, "basic_tcs_miss", "main");
- m_missPipelineBuilder.enableTessellationStage(3);
- }
+ m_missPipelineBuilder.bindShaderStage(VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, "basic_tcs_miss", "main");
+ m_missPipelineBuilder.enableTessellationStage(3);
}
break;
case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
- if (features.tessellationShader == VK_FALSE)
+ m_pipelineBuilder.bindShaderStage(VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, "basic_tes", "main");
+ m_pipelineBuilder.enableTessellationStage(3);
+ if (m_param->getCompileMissShaders())
{
- TCU_THROW(NotSupportedError, "Tessellation Not Supported");
- }
- else
- {
- m_pipelineBuilder.bindShaderStage(VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, "basic_tes", "main");
- m_pipelineBuilder.enableTessellationStage(3);
- if (m_param->getCompileMissShaders())
- {
- m_missPipelineBuilder.bindShaderStage(VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, "basic_tes_miss", "main");
- m_missPipelineBuilder.enableTessellationStage(3);
- }
+ m_missPipelineBuilder.bindShaderStage(VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, "basic_tes_miss", "main");
+ m_missPipelineBuilder.enableTessellationStage(3);
}
break;
default:
@@ -994,13 +991,13 @@
{
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;
- 0u, // deUint32 pushConstantRangeCount;
- DE_NULL // const VkPushConstantRange* pPushConstantRanges;
+ 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;
+ 0u, // deUint32 pushConstantRangeCount;
+ DE_NULL // const VkPushConstantRange* pPushConstantRanges;
};
m_pipelineLayout = createPipelineLayout(vk, vkDevice, &pipelineLayoutParams);
@@ -1016,9 +1013,9 @@
void GraphicsCacheTestInstance::prepareRenderPass (VkFramebuffer framebuffer, VkPipeline pipeline)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkClearValue attachmentClearValues[2] =
+ const VkClearValue attachmentClearValues[2] =
{
defaultClearValue(m_colorFormat),
defaultClearValue(m_depthFormat),
@@ -1036,7 +1033,7 @@
void GraphicsCacheTestInstance::prepareCommandBuffer (void)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
beginCommandBuffer(vk, *m_cmdBuffer, 0u);
@@ -1054,12 +1051,12 @@
tcu::TestStatus GraphicsCacheTestInstance::verifyTestResult (void)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice vkDevice = m_context.getDevice();
- const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
+ const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
- const VkQueue queue = m_context.getUniversalQueue();
- de::MovePtr<tcu::TextureLevel> resultNoCache = readColorAttachment(vk,
+ const VkQueue queue = m_context.getUniversalQueue();
+ de::MovePtr<tcu::TextureLevel> resultNoCache = readColorAttachment(vk,
vkDevice,
queue,
queueFamilyIndex,
@@ -1067,7 +1064,7 @@
*m_colorImage[PIPELINE_CACHE_NDX_NO_CACHE],
m_colorFormat,
m_renderSize);
- de::MovePtr<tcu::TextureLevel> resultCache = readColorAttachment(vk,
+ de::MovePtr<tcu::TextureLevel> resultCache = readColorAttachment(vk,
vkDevice,
queue,
queueFamilyIndex,
@@ -1093,44 +1090,44 @@
class ComputeCacheTest : public CacheTest
{
public:
- ComputeCacheTest (tcu::TestContext& testContext,
- const std::string& name,
- const std::string& description,
- const CacheTestParam* param)
+ ComputeCacheTest (tcu::TestContext& testContext,
+ const std::string& name,
+ const std::string& description,
+ const CacheTestParam* param)
: CacheTest (testContext, name, description, param)
{ }
- virtual ~ComputeCacheTest (void) { }
- virtual void initPrograms (SourceCollections& programCollection) const;
- virtual TestInstance* createInstance (Context& context) const;
+ virtual ~ComputeCacheTest (void) { }
+ virtual void initPrograms (SourceCollections& programCollection) const;
+ virtual TestInstance* createInstance (Context& context) const;
};
class ComputeCacheTestInstance : public CacheTestInstance
{
public:
- ComputeCacheTestInstance (Context& context,
- const CacheTestParam* param);
- virtual ~ComputeCacheTestInstance (void);
- virtual void prepareCommandBuffer (void);
+ ComputeCacheTestInstance (Context& context,
+ const CacheTestParam* param);
+ virtual ~ComputeCacheTestInstance (void);
+ virtual void prepareCommandBuffer (void);
protected:
- virtual tcu::TestStatus verifyTestResult (void);
- void buildBuffers (void);
- void buildDescriptorSets (deUint32 ndx);
- void buildShader (void);
- void buildPipeline (deUint32 ndx);
+ virtual tcu::TestStatus verifyTestResult (void);
+ void buildBuffers (void);
+ void buildDescriptorSets (deUint32 ndx);
+ void buildShader (void);
+ void buildPipeline (deUint32 ndx);
protected:
- Move<VkBuffer> m_inputBuf;
- de::MovePtr<Allocation> m_inputBufferAlloc;
- Move<VkShaderModule> m_computeShaderModule;
+ Move<VkBuffer> m_inputBuf;
+ de::MovePtr<Allocation> m_inputBufferAlloc;
+ Move<VkShaderModule> m_computeShaderModule;
- Move<VkBuffer> m_outputBuf[PIPELINE_CACHE_NDX_COUNT];
- de::MovePtr<Allocation> m_outputBufferAlloc[PIPELINE_CACHE_NDX_COUNT];
+ Move<VkBuffer> m_outputBuf[PIPELINE_CACHE_NDX_COUNT];
+ de::MovePtr<Allocation> m_outputBufferAlloc[PIPELINE_CACHE_NDX_COUNT];
- Move<VkDescriptorPool> m_descriptorPool[PIPELINE_CACHE_NDX_COUNT];
- Move<VkDescriptorSetLayout> m_descriptorSetLayout[PIPELINE_CACHE_NDX_COUNT];
- Move<VkDescriptorSet> m_descriptorSet[PIPELINE_CACHE_NDX_COUNT];
+ Move<VkDescriptorPool> m_descriptorPool[PIPELINE_CACHE_NDX_COUNT];
+ Move<VkDescriptorSetLayout> m_descriptorSetLayout[PIPELINE_CACHE_NDX_COUNT];
+ Move<VkDescriptorSet> m_descriptorSet[PIPELINE_CACHE_NDX_COUNT];
- Move<VkPipelineLayout> m_pipelineLayout[PIPELINE_CACHE_NDX_COUNT];
- Move<VkPipeline> m_pipeline[PIPELINE_CACHE_NDX_COUNT];
+ Move<VkPipelineLayout> m_pipelineLayout[PIPELINE_CACHE_NDX_COUNT];
+ Move<VkPipeline> m_pipeline[PIPELINE_CACHE_NDX_COUNT];
};
void ComputeCacheTest::initPrograms (SourceCollections& programCollection) const
@@ -1161,11 +1158,11 @@
void ComputeCacheTestInstance::buildBuffers (void)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice vkDevice = m_context.getDevice();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
// Create buffer object, allocate storage, and generate input data
- const VkDeviceSize size = sizeof(tcu::Vec4) * 128u;
+ const VkDeviceSize size = sizeof(tcu::Vec4) * 128u;
m_inputBuf = createBufferAndBindMemory(m_context, size, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, &m_inputBufferAlloc);
// Initialize input buffer
@@ -1193,8 +1190,8 @@
void ComputeCacheTestInstance::buildDescriptorSets (deUint32 ndx)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice vkDevice = m_context.getDevice();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
// Create descriptor set layout
DescriptorSetLayoutBuilder descLayoutBuilder;
@@ -1204,7 +1201,7 @@
m_descriptorSetLayout[ndx] = descLayoutBuilder.build(vk, vkDevice);
- std::vector<VkDescriptorBufferInfo> descriptorInfos;
+ std::vector<VkDescriptorBufferInfo> descriptorInfos;
descriptorInfos.push_back(makeDescriptorBufferInfo(*m_inputBuf, 0u, sizeof(tcu::Vec4) * 128u));
descriptorInfos.push_back(makeDescriptorBufferInfo(*m_outputBuf[ndx], 0u, sizeof(tcu::Vec4) * 128u));
@@ -1217,11 +1214,11 @@
// Create descriptor set
const VkDescriptorSetAllocateInfo descriptorSetAllocInfo =
{
- VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- *m_descriptorPool[ndx], // VkDescriptorPool descriptorPool;
- 1u, // deUint32 setLayoutCount;
- &m_descriptorSetLayout[ndx].get(), // const VkDescriptorSetLayout* pSetLayouts;
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ *m_descriptorPool[ndx], // VkDescriptorPool descriptorPool;
+ 1u, // deUint32 setLayoutCount;
+ &m_descriptorSetLayout[ndx].get(), // const VkDescriptorSetLayout* pSetLayouts;
};
m_descriptorSet[ndx] = allocateDescriptorSet(vk, vkDevice, &descriptorSetAllocInfo);
@@ -1238,67 +1235,67 @@
void ComputeCacheTestInstance::buildShader (void)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice vkDevice = m_context.getDevice();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
// Create compute shader
VkShaderModuleCreateInfo shaderModuleCreateInfo =
{
- VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkShaderModuleCreateFlags flags;
- m_context.getBinaryCollection().get("basic_compute").getSize(), // deUintptr codeSize;
- (deUint32*)m_context.getBinaryCollection().get("basic_compute").getBinary(), // const deUint32* pCode;
+ VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkShaderModuleCreateFlags flags;
+ m_context.getBinaryCollection().get("basic_compute").getSize(), // deUintptr codeSize;
+ (deUint32*)m_context.getBinaryCollection().get("basic_compute").getBinary(), // const deUint32* pCode;
};
m_computeShaderModule = createShaderModule(vk, vkDevice, &shaderModuleCreateInfo);
}
void ComputeCacheTestInstance::buildPipeline (deUint32 ndx)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice vkDevice = m_context.getDevice();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
// Create compute pipeline layout
const VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo =
{
- VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkPipelineLayoutCreateFlags flags;
- 1u, // deUint32 setLayoutCount;
- &m_descriptorSetLayout[ndx].get(), // const VkDescriptorSetLayout* pSetLayouts;
- 0u, // deUint32 pushConstantRangeCount;
- DE_NULL, // const VkPushConstantRange* pPushConstantRanges;
+ VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkPipelineLayoutCreateFlags flags;
+ 1u, // deUint32 setLayoutCount;
+ &m_descriptorSetLayout[ndx].get(), // const VkDescriptorSetLayout* pSetLayouts;
+ 0u, // deUint32 pushConstantRangeCount;
+ DE_NULL, // const VkPushConstantRange* pPushConstantRanges;
};
m_pipelineLayout[ndx] = createPipelineLayout(vk, vkDevice, &pipelineLayoutCreateInfo);
const VkPipelineShaderStageCreateInfo stageCreateInfo =
{
- VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkPipelineShaderStageCreateFlags flags;
- VK_SHADER_STAGE_COMPUTE_BIT, // VkShaderStageFlagBits stage;
- *m_computeShaderModule, // VkShaderModule module;
- "main", // const char* pName;
- DE_NULL, // const VkSpecializationInfo* pSpecializationInfo;
+ VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkPipelineShaderStageCreateFlags flags;
+ VK_SHADER_STAGE_COMPUTE_BIT, // VkShaderStageFlagBits stage;
+ *m_computeShaderModule, // VkShaderModule module;
+ "main", // const char* pName;
+ DE_NULL, // const VkSpecializationInfo* pSpecializationInfo;
};
const VkComputePipelineCreateInfo pipelineCreateInfo =
{
- VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkPipelineCreateFlags flags;
- stageCreateInfo, // VkPipelineShaderStageCreateInfo stage;
- *m_pipelineLayout[ndx], // VkPipelineLayout layout;
- (VkPipeline)0, // VkPipeline basePipelineHandle;
- 0u, // deInt32 basePipelineIndex;
+ VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkPipelineCreateFlags flags;
+ stageCreateInfo, // VkPipelineShaderStageCreateInfo stage;
+ *m_pipelineLayout[ndx], // VkPipelineLayout layout;
+ (VkPipeline)0, // VkPipeline basePipelineHandle;
+ 0u, // deInt32 basePipelineIndex;
};
m_pipeline[ndx] = createComputePipeline(vk, vkDevice, *m_cache, &pipelineCreateInfo);
}
-ComputeCacheTestInstance::ComputeCacheTestInstance (Context& context,
- const CacheTestParam* param)
+ComputeCacheTestInstance::ComputeCacheTestInstance (Context& context,
+ const CacheTestParam* param)
: CacheTestInstance (context, param)
{
buildBuffers();
@@ -1320,7 +1317,7 @@
void ComputeCacheTestInstance::prepareCommandBuffer (void)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
beginCommandBuffer(vk, *m_cmdBuffer, 0u);
@@ -1336,8 +1333,8 @@
tcu::TestStatus ComputeCacheTestInstance::verifyTestResult (void)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice vkDevice = m_context.getDevice();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
// Read the content of output buffers
invalidateAlloc(vk, vkDevice, *m_outputBufferAlloc[PIPELINE_CACHE_NDX_NO_CACHE]);
@@ -1361,8 +1358,8 @@
{
public:
PipelineFromCacheTest (tcu::TestContext& testContext, const std::string& name, const std::string& description, const CacheTestParam* param);
- virtual ~PipelineFromCacheTest (void) { }
- virtual TestInstance* createInstance (Context& context) const;
+ virtual ~PipelineFromCacheTest (void) { }
+ virtual TestInstance* createInstance (Context& context) const;
};
PipelineFromCacheTest::PipelineFromCacheTest (tcu::TestContext& testContext, const std::string& name, const std::string& description, const CacheTestParam* param)
@@ -1374,10 +1371,10 @@
{
public:
PipelineFromCacheTestInstance (Context& context, const CacheTestParam* param);
- virtual ~PipelineFromCacheTestInstance (void);
+ virtual ~PipelineFromCacheTestInstance (void);
protected:
- Move<VkPipelineCache> m_newCache;
- deUint8* m_data;
+ Move<VkPipelineCache> m_newCache;
+ deUint8* m_data;
};
TestInstance* PipelineFromCacheTest::createInstance (Context& context) const
@@ -1389,26 +1386,26 @@
: GraphicsCacheTestInstance (context, param)
, m_data (DE_NULL)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice vkDevice = m_context.getDevice();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
// Create more pipeline caches
{
- size_t dataSize = 0u;
+ size_t dataSize = 0u;
VK_CHECK(vk.getPipelineCacheData(vkDevice, *m_cache, (deUintptr*)&dataSize, DE_NULL));
- m_data = new deUint8[dataSize];
+ m_data = new deUint8[dataSize];
DE_ASSERT(m_data);
VK_CHECK(vk.getPipelineCacheData(vkDevice, *m_cache, (deUintptr*)&dataSize, (void*)m_data));
const VkPipelineCacheCreateInfo pipelineCacheCreateInfo =
{
- VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkPipelineCacheCreateFlags flags;
- dataSize, // deUintptr initialDataSize;
- m_data, // const void* pInitialData;
+ VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkPipelineCacheCreateFlags flags;
+ dataSize, // deUintptr initialDataSize;
+ m_data, // const void* pInitialData;
};
m_newCache = createPipelineCache(vk, vkDevice, &pipelineCacheCreateInfo);
}
@@ -1424,8 +1421,8 @@
{
public:
PipelineFromIncompleteCacheTest (tcu::TestContext& testContext, const std::string& name, const std::string& description, const CacheTestParam* param);
- virtual ~PipelineFromIncompleteCacheTest (void) {}
- virtual TestInstance* createInstance (Context& context) const;
+ virtual ~PipelineFromIncompleteCacheTest (void) {}
+ virtual TestInstance* createInstance (Context& context) const;
};
PipelineFromIncompleteCacheTest::PipelineFromIncompleteCacheTest (tcu::TestContext& testContext, const std::string& name, const std::string& description, const CacheTestParam* param)
@@ -1437,11 +1434,11 @@
{
public:
PipelineFromIncompleteCacheTestInstance(Context& context, const CacheTestParam* param);
- virtual ~PipelineFromIncompleteCacheTestInstance(void);
+ virtual ~PipelineFromIncompleteCacheTestInstance(void);
protected:
protected:
- Move<VkPipelineCache> m_newCache;
- deUint8* m_data;
+ Move<VkPipelineCache> m_newCache;
+ deUint8* m_data;
};
TestInstance* PipelineFromIncompleteCacheTest::createInstance (Context& context) const
@@ -1453,12 +1450,12 @@
: GraphicsCacheTestInstance (context, param)
, m_data (DE_NULL)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice vkDevice = m_context.getDevice();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
// Create more pipeline caches
{
- size_t dataSize = 0u;
+ size_t dataSize = 0u;
VK_CHECK(vk.getPipelineCacheData(vkDevice, *m_cache, (deUintptr*)&dataSize, DE_NULL));
if (dataSize == 0)
@@ -1473,11 +1470,11 @@
const VkPipelineCacheCreateInfo pipelineCacheCreateInfo =
{
- VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkPipelineCacheCreateFlags flags;
- dataSize, // deUintptr initialDataSize;
- m_data, // const void* pInitialData;
+ VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkPipelineCacheCreateFlags flags;
+ dataSize, // deUintptr initialDataSize;
+ m_data, // const void* pInitialData;
};
m_newCache = createPipelineCache(vk, vkDevice, &pipelineCacheCreateInfo);
}
@@ -1489,7 +1486,6 @@
delete[] m_data;
}
-
enum MergeCacheType
{
MERGE_CACHE_EMPTY = 0,
@@ -1545,16 +1541,16 @@
class MergeCacheTest : public GraphicsCacheTest
{
public:
- MergeCacheTest (tcu::TestContext& testContext,
- const std::string& name,
- const std::string& description,
- const CacheTestParam* param,
- const MergeCacheTestParam* mergeCacheParam)
+ MergeCacheTest (tcu::TestContext& testContext,
+ const std::string& name,
+ const std::string& description,
+ const CacheTestParam* param,
+ const MergeCacheTestParam* mergeCacheParam)
: GraphicsCacheTest (testContext, name, description, param)
, m_mergeCacheParam (*mergeCacheParam)
{ }
- virtual ~MergeCacheTest (void) { }
- virtual TestInstance* createInstance (Context& context) const;
+ virtual ~MergeCacheTest (void) { }
+ virtual TestInstance* createInstance (Context& context) const;
private:
const MergeCacheTestParam m_mergeCacheParam;
};
@@ -1562,14 +1558,14 @@
class MergeCacheTestInstance : public GraphicsCacheTestInstance
{
public:
- MergeCacheTestInstance (Context& context,
+ MergeCacheTestInstance (Context& context,
const CacheTestParam* param,
const MergeCacheTestParam* mergeCacheParam);
private:
Move<VkPipelineCache> createPipelineCache (const DeviceInterface& vk, VkDevice device, MergeCacheType type);
protected:
- Move<VkPipelineCache> m_cacheMerged;
+ Move<VkPipelineCache> m_cacheMerged;
};
TestInstance* MergeCacheTest::createInstance (Context& context) const
@@ -1580,9 +1576,8 @@
MergeCacheTestInstance::MergeCacheTestInstance (Context& context, const CacheTestParam* param, const MergeCacheTestParam* mergeCacheParam)
: GraphicsCacheTestInstance (context, param)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice vkDevice = m_context.getDevice();
-
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
// Create a merge destination cache
m_cacheMerged = createPipelineCache(vk, vkDevice, mergeCacheParam->destCacheType);
@@ -1614,11 +1609,11 @@
{
VkPipelineCacheCreateInfo pipelineCacheCreateInfo =
{
- VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkPipelineCacheCreateFlags flags;
- 0u, // deUintptr initialDataSize;
- DE_NULL, // const void* pInitialData;
+ VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkPipelineCacheCreateFlags flags;
+ 0u, // deUintptr initialDataSize;
+ DE_NULL, // const void* pInitialData;
};
switch (type)
@@ -1678,7 +1673,7 @@
*cache3
};
- Move<VkPipelineCache> ret = createPipelineCache(vk, device, MERGE_CACHE_EMPTY);
+ Move<VkPipelineCache> ret = createPipelineCache(vk, device, MERGE_CACHE_EMPTY);
// Merge the caches
VK_CHECK(vk.mergePipelineCaches(device, *ret, DE_LENGTH_OF_ARRAY(sourceCaches), sourceCaches));
@@ -1692,31 +1687,31 @@
class CacheHeaderTest : public GraphicsCacheTest
{
public:
- CacheHeaderTest(tcu::TestContext& testContext,
- const std::string& name,
- const std::string& description,
- const CacheTestParam* param)
- : GraphicsCacheTest(testContext, name, description, param)
+ CacheHeaderTest (tcu::TestContext& testContext,
+ const std::string& name,
+ const std::string& description,
+ const CacheTestParam* param)
+ : GraphicsCacheTest(testContext, name, description, param)
{ }
- virtual ~CacheHeaderTest(void) { }
- virtual TestInstance* createInstance(Context& context) const;
+ virtual ~CacheHeaderTest (void) { }
+ virtual TestInstance* createInstance(Context& context) const;
};
class CacheHeaderTestInstance : public GraphicsCacheTestInstance
{
public:
- CacheHeaderTestInstance (Context& context, const CacheTestParam* param);
- virtual ~CacheHeaderTestInstance (void);
+ CacheHeaderTestInstance (Context& context, const CacheTestParam* param);
+ virtual ~CacheHeaderTestInstance (void);
protected:
- deUint8* m_data;
+ deUint8* m_data;
struct CacheHeader
{
- deUint32 HeaderLength;
- deUint32 HeaderVersion;
- deUint32 VendorID;
- deUint32 DeviceID;
- deUint8 PipelineCacheUUID[VK_UUID_SIZE];
+ deUint32 HeaderLength;
+ deUint32 HeaderVersion;
+ deUint32 VendorID;
+ deUint32 DeviceID;
+ deUint8 PipelineCacheUUID[VK_UUID_SIZE];
} m_header;
};
@@ -1726,16 +1721,16 @@
}
CacheHeaderTestInstance::CacheHeaderTestInstance (Context& context, const CacheTestParam* param)
- : GraphicsCacheTestInstance (context, param)
- , m_data (DE_NULL)
+ : GraphicsCacheTestInstance (context, param)
+ , m_data (DE_NULL)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice vkDevice = m_context.getDevice();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
// Create more pipeline caches
{
// Create a cache with init data from m_cache
- size_t dataSize = 0u;
+ size_t dataSize = 0u;
VK_CHECK(vk.getPipelineCacheData(vkDevice, *m_cache, (deUintptr*)&dataSize, DE_NULL));
if (dataSize < sizeof(m_header))
@@ -1773,8 +1768,8 @@
{
public:
InvalidSizeTest (tcu::TestContext& testContext, const std::string& name, const std::string& description, const CacheTestParam* param);
- virtual ~InvalidSizeTest (void) {}
- virtual TestInstance* createInstance (Context& context) const;
+ virtual ~InvalidSizeTest (void) {}
+ virtual TestInstance* createInstance (Context& context) const;
};
InvalidSizeTest::InvalidSizeTest (tcu::TestContext& testContext, const std::string& name, const std::string& description, const CacheTestParam* param)
@@ -1786,10 +1781,10 @@
{
public:
InvalidSizeTestInstance (Context& context, const CacheTestParam* param);
- virtual ~InvalidSizeTestInstance (void);
+ virtual ~InvalidSizeTestInstance (void);
protected:
- deUint8* m_data;
- deUint8* m_zeroBlock;
+ deUint8* m_data;
+ deUint8* m_zeroBlock;
};
TestInstance* InvalidSizeTest::createInstance (Context& context) const
@@ -1802,8 +1797,8 @@
, m_data (DE_NULL)
, m_zeroBlock (DE_NULL)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice vkDevice = m_context.getDevice();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
// Create more pipeline caches
try
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineCreationFeedbackTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineCreationFeedbackTests.cpp
index 6c116f3..4e95648 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineCreationFeedbackTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineCreationFeedbackTests.cpp
@@ -528,7 +528,7 @@
const CacheTestParam* param)
: TestInstance (context)
, m_param (param)
- , m_extensions (m_context.requireDeviceExtension("VK_EXT_pipeline_creation_feedback"))
+ , m_extensions (m_context.requireDeviceFunctionality("VK_EXT_pipeline_creation_feedback"))
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice vkDevice = m_context.getDevice();
@@ -561,14 +561,15 @@
{
public:
GraphicsCacheTest (tcu::TestContext& testContext,
- const std::string& name,
- const std::string& description,
+ const std::string& name,
+ const std::string& description,
const CacheTestParam* param)
: CacheTest (testContext, name, description, param)
{ }
virtual ~GraphicsCacheTest (void) { }
virtual void initPrograms (SourceCollections& programCollection) const;
- virtual TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
+ virtual TestInstance* createInstance (Context& context) const;
};
class GraphicsCacheTestInstance : public CacheTestInstance
@@ -713,12 +714,31 @@
}
}
+void GraphicsCacheTest::checkSupport (Context& context) const
+{
+ for (deUint32 shaderNdx = 0; shaderNdx < m_param.getShaderCount(); shaderNdx++)
+ {
+ switch(m_param.getShaderFlag(shaderNdx))
+ {
+ case VK_SHADER_STAGE_GEOMETRY_BIT:
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_GEOMETRY_SHADER);
+ break;
+ case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
+ case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_TESSELLATION_SHADER);
+ break;
+ default:
+ break;
+ };
+ }
+}
+
TestInstance* GraphicsCacheTest::createInstance (Context& context) const
{
return new GraphicsCacheTestInstance(context, &m_param);
}
-GraphicsCacheTestInstance::GraphicsCacheTestInstance (Context& context,
+GraphicsCacheTestInstance::GraphicsCacheTestInstance (Context& context,
const CacheTestParam* param)
: CacheTestInstance (context, param)
, m_renderSize (32u, 32u)
@@ -750,8 +770,6 @@
m_renderPass = makeRenderPass(vk, vkDevice, m_colorFormat, m_depthFormat);
// Bind shader stages
-
- VkPhysicalDeviceFeatures features = m_context.getDeviceFeatures();
for (deUint32 ndx = 0; ndx < PIPELINE_CACHE_NDX_COUNT; ndx++)
{
for (deUint32 shaderNdx = 0; shaderNdx < m_param->getShaderCount(); shaderNdx++)
@@ -759,52 +777,30 @@
switch(m_param->getShaderFlag(shaderNdx))
{
case VK_SHADER_STAGE_VERTEX_BIT:
- {
- std::string shader_name("color_vert_");
- shader_name += (ndx == PIPELINE_CACHE_NDX_DERIVATIVE) ? "2" : "1";
- m_pipelineBuilder.bindShaderStage(VK_SHADER_STAGE_VERTEX_BIT, shader_name.c_str(), "main");
- }
+ {
+ std::string shader_name("color_vert_");
+ shader_name += (ndx == PIPELINE_CACHE_NDX_DERIVATIVE) ? "2" : "1";
+ m_pipelineBuilder.bindShaderStage(VK_SHADER_STAGE_VERTEX_BIT, shader_name.c_str(), "main");
+ }
break;
case VK_SHADER_STAGE_FRAGMENT_BIT:
m_pipelineBuilder.bindShaderStage(VK_SHADER_STAGE_FRAGMENT_BIT, "color_frag", "main");
break;
case VK_SHADER_STAGE_GEOMETRY_BIT:
- if (features.geometryShader == VK_FALSE)
- {
- TCU_THROW(NotSupportedError, "Geometry Shader Not Supported");
- }
- else
- {
- m_pipelineBuilder.bindShaderStage(VK_SHADER_STAGE_GEOMETRY_BIT, "dummy_geo", "main");
- }
+ m_pipelineBuilder.bindShaderStage(VK_SHADER_STAGE_GEOMETRY_BIT, "dummy_geo", "main");
break;
case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
- if (features.tessellationShader == VK_FALSE)
- {
- TCU_THROW(NotSupportedError, "Tessellation Not Supported");
- }
- else
- {
- m_pipelineBuilder.bindShaderStage(VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, "basic_tcs", "main");
- m_pipelineBuilder.enableTessellationStage(3);
- }
+ m_pipelineBuilder.bindShaderStage(VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, "basic_tcs", "main");
+ m_pipelineBuilder.enableTessellationStage(3);
break;
case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
- if (features.tessellationShader == VK_FALSE)
- {
- TCU_THROW(NotSupportedError, "Tessellation Not Supported");
- }
- else
- {
- m_pipelineBuilder.bindShaderStage(VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, "basic_tes", "main");
- m_pipelineBuilder.enableTessellationStage(3);
- }
+ m_pipelineBuilder.bindShaderStage(VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, "basic_tes", "main");
+ m_pipelineBuilder.enableTessellationStage(3);
break;
default:
DE_FATAL("Unknown Shader Stage!");
break;
};
-
}
if (ndx == PIPELINE_CACHE_NDX_CACHED)
{
@@ -1276,7 +1272,6 @@
tcu::TestCaseGroup* createCreationFeedbackTests (tcu::TestContext& testCtx)
{
-
de::MovePtr<tcu::TestCaseGroup> cacheTests (new tcu::TestCaseGroup(testCtx, "creation_feedback", "pipeline creation feedback tests"));
// Graphics Pipeline Tests
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineDepthRangeUnrestrictedTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineDepthRangeUnrestrictedTests.cpp
index 41a408f..fc22f93 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineDepthRangeUnrestrictedTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineDepthRangeUnrestrictedTests.cpp
@@ -56,8 +56,10 @@
enum testDynamicStaticMode
{
- TEST_MODE_VIEWPORT_STATIC = 0,
+ TEST_MODE_VIEWPORT_DEPTH_BOUNDS_STATIC = 0,
TEST_MODE_VIEWPORT_DYNAMIC = 1,
+ TEST_MODE_DEPTH_BOUNDS_DYNAMIC = 2,
+ TEST_MODE_VIEWPORT_DEPTH_BOUNDS_DYNAMIC = 3,
};
struct DepthRangeUnrestrictedParam
@@ -67,9 +69,10 @@
VkClearValue depthBufferClearValue;
VkBool32 depthClampEnable;
float wc; // Component W of the vertices
- deUint32 viewportMode;
+ deUint32 viewportDepthBoundsMode;
float viewportMinDepth;
float viewportMaxDepth;
+ VkBool32 depthBoundsTestEnable;
float minDepthBounds;
float maxDepthBounds;
VkCompareOp depthCompareOp;
@@ -97,16 +100,25 @@
if (param.depthClampEnable == VK_FALSE)
result << "_wc_" << (int) param.wc;
- if (param.viewportMode & TEST_MODE_VIEWPORT_DYNAMIC)
+ if (param.viewportDepthBoundsMode & TEST_MODE_VIEWPORT_DYNAMIC)
result << "_dynamic";
result << "_viewport_min_" << (int)param.viewportMinDepth << "_max_" << (int)param.viewportMaxDepth;
+ if (param.depthBoundsTestEnable)
+ {
+ if (param.viewportDepthBoundsMode & TEST_MODE_DEPTH_BOUNDS_DYNAMIC)
+ result << "_dynamic";
+ result << "_boundstest_min" << (int)param.minDepthBounds << "_max_" << (int)param.maxDepthBounds;
+ }
+
return result.str();
}
-const std::string generateTestDescription ()
+const std::string generateTestDescription (struct DepthRangeUnrestrictedParam param)
{
std::string result("Test unrestricted depth ranges on viewport");
+ if (param.depthBoundsTestEnable)
+ result += " , depth bounds test";
return result;
}
@@ -218,7 +230,7 @@
//
// Vertex Depth Color
// 0 0.0 white
- // 1 1.0 magenta
+ // 1 0.25 magenta
// 2 -2.0 yellow
// 3 2.0 red
// 4 -5.0 black
@@ -233,7 +245,7 @@
};
const Vertex4RGBA vertex1 =
{
- Vec4(-0.25f * wc, -0.25f * wc, 1.0f, wc),
+ Vec4(-0.25f * wc, -0.25f * wc, 0.25f, wc),
Vec4(1.0f, 0.0f, 1.0f, 1.0)
};
const Vertex4RGBA vertex2 =
@@ -286,7 +298,7 @@
{
return new Test(testContext,
generateTestName(testParam).c_str(),
- generateTestDescription().c_str(),
+ generateTestDescription(testParam).c_str(),
testParam);
}
@@ -354,6 +366,92 @@
return image;
}
+Move<VkRenderPass> makeRenderPass (const DeviceInterface& vk,
+ const VkDevice device,
+ const VkFormat colorFormat,
+ const VkFormat depthStencilFormat,
+ const VkAttachmentLoadOp loadOperationColor,
+ const VkAttachmentLoadOp loadOperationDepthStencil)
+{
+ const bool hasColor = colorFormat != VK_FORMAT_UNDEFINED;
+ const bool hasDepthStencil = depthStencilFormat != VK_FORMAT_UNDEFINED;
+ const VkImageLayout initialLayoutColor = loadOperationColor == VK_ATTACHMENT_LOAD_OP_LOAD ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_UNDEFINED;
+ const VkImageLayout initialLayoutDepthStencil = loadOperationDepthStencil == VK_ATTACHMENT_LOAD_OP_LOAD ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_UNDEFINED;
+
+ const VkAttachmentDescription colorAttachmentDescription =
+ {
+ (VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags
+ colorFormat, // VkFormat format
+ VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples
+ loadOperationColor, // 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
+ initialLayoutColor, // VkImageLayout initialLayout
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout finalLayout
+ };
+
+ const VkAttachmentDescription depthStencilAttachmentDescription =
+ {
+ (VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags
+ depthStencilFormat, // VkFormat format
+ VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples
+ loadOperationDepthStencil, // VkAttachmentLoadOp loadOp
+ VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp
+ loadOperationDepthStencil, // VkAttachmentLoadOp stencilLoadOp
+ VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp stencilStoreOp
+ initialLayoutDepthStencil, // VkImageLayout initialLayout
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL // VkImageLayout finalLayout
+ };
+
+ std::vector<VkAttachmentDescription> attachmentDescriptions;
+
+ if (hasColor)
+ attachmentDescriptions.push_back(colorAttachmentDescription);
+ if (hasDepthStencil)
+ attachmentDescriptions.push_back(depthStencilAttachmentDescription);
+
+ const VkAttachmentReference colorAttachmentRef =
+ {
+ 0u, // deUint32 attachment
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout layout
+ };
+
+ const VkAttachmentReference depthStencilAttachmentRef =
+ {
+ hasColor ? 1u : 0u, // deUint32 attachment
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL // VkImageLayout layout
+ };
+
+ const VkSubpassDescription subpassDescription =
+ {
+ (VkSubpassDescriptionFlags)0, // VkSubpassDescriptionFlags flags
+ VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint
+ 0u, // deUint32 inputAttachmentCount
+ DE_NULL, // const VkAttachmentReference* pInputAttachments
+ hasColor ? 1u : 0u, // deUint32 colorAttachmentCount
+ hasColor ? &colorAttachmentRef : DE_NULL, // const VkAttachmentReference* pColorAttachments
+ DE_NULL, // const VkAttachmentReference* pResolveAttachments
+ hasDepthStencil ? &depthStencilAttachmentRef : DE_NULL, // const VkAttachmentReference* pDepthStencilAttachment
+ 0u, // deUint32 preserveAttachmentCount
+ DE_NULL // const deUint32* pPreserveAttachments
+ };
+
+ const VkRenderPassCreateInfo renderPassInfo =
+ {
+ VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ (VkRenderPassCreateFlags)0, // VkRenderPassCreateFlags flags
+ (deUint32)attachmentDescriptions.size(), // deUint32 attachmentCount
+ attachmentDescriptions.size() > 0 ? &attachmentDescriptions[0] : DE_NULL, // const VkAttachmentDescription* pAttachments
+ 1u, // deUint32 subpassCount
+ &subpassDescription, // const VkSubpassDescription* pSubpasses
+ 0u, // deUint32 dependencyCount
+ DE_NULL // const VkSubpassDependency* pDependencies
+ };
+
+ return createRenderPass(vk, device, &renderPassInfo, DE_NULL);
+}
// Test Classes
class DepthRangeUnrestrictedTestInstance : public vkt::TestInstance
@@ -364,9 +462,9 @@
virtual ~DepthRangeUnrestrictedTestInstance (void);
virtual tcu::TestStatus iterate (void);
protected:
- void prepareRenderPass (VkFramebuffer framebuffer, VkPipeline pipeline);
+ void prepareRenderPass (VkRenderPass renderPass, VkFramebuffer framebuffer, VkPipeline pipeline);
void prepareCommandBuffer (void);
- void buildPipeline (void);
+ Move<VkPipeline> buildPipeline (VkRenderPass renderpass);
void bindShaderStage (VkShaderStageFlagBits stage,
const char* sourceName,
const char* entryName);
@@ -435,7 +533,7 @@
m_shaderStageCount++;
}
-void DepthRangeUnrestrictedTestInstance::buildPipeline ()
+Move<VkPipeline> DepthRangeUnrestrictedTestInstance::buildPipeline (VkRenderPass renderPass)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice vkDevice = m_context.getDevice();
@@ -487,7 +585,7 @@
const VkRect2D scissor = makeRect2D(m_renderSize);
VkViewport viewport = makeViewport(m_renderSize);
- if (!(m_param.viewportMode & TEST_MODE_VIEWPORT_DYNAMIC))
+ if (!(m_param.viewportDepthBoundsMode & TEST_MODE_VIEWPORT_DYNAMIC))
{
viewport.minDepth = m_param.viewportMinDepth;
viewport.maxDepth = m_param.viewportMaxDepth;
@@ -561,6 +659,15 @@
VK_FALSE, // VkBool32 alphaToOneEnable;
};
+ float minDepthBounds = m_param.minDepthBounds;
+ float maxDepthBounds = m_param.maxDepthBounds;
+
+ if (m_param.viewportDepthBoundsMode & TEST_MODE_DEPTH_BOUNDS_DYNAMIC)
+ {
+ minDepthBounds = 0.0f;
+ maxDepthBounds = 1.0f;
+ }
+
VkPipelineDepthStencilStateCreateInfo depthStencilStateParams =
{
VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // VkStructureType sType;
@@ -569,7 +676,7 @@
VK_TRUE, // VkBool32 depthTestEnable;
VK_TRUE, // VkBool32 depthWriteEnable;
m_param.depthCompareOp, // VkCompareOp depthCompareOp;
- VK_FALSE, // VkBool32 depthBoundsTestEnable;
+ m_param.depthBoundsTestEnable, // VkBool32 depthBoundsTestEnable;
VK_FALSE, // VkBool32 stencilTestEnable;
// VkStencilOpState front;
{
@@ -591,13 +698,15 @@
0u, // deUint32 writeMask;
0u, // deUint32 reference;
},
- 0.0f, // float minDepthBounds;
- 1.0f, // float maxDepthBounds;
+ minDepthBounds, // float minDepthBounds;
+ maxDepthBounds, // float maxDepthBounds;
};
std::vector<VkDynamicState> dynamicStates;
- if (m_param.viewportMode & TEST_MODE_VIEWPORT_DYNAMIC)
+ if (m_param.viewportDepthBoundsMode & TEST_MODE_VIEWPORT_DYNAMIC)
dynamicStates.push_back(VK_DYNAMIC_STATE_VIEWPORT);
+ if (m_param.viewportDepthBoundsMode & TEST_MODE_DEPTH_BOUNDS_DYNAMIC)
+ dynamicStates.push_back(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
const VkPipelineDynamicStateCreateInfo dynamicStateParams =
{
@@ -625,16 +734,16 @@
&colorBlendStateParams, // const VkPipelineColorBlendStateCreateInfo* pColorBlendState;
&dynamicStateParams, // const VkPipelineDynamicStateCreateInfo* pDynamicState;
*m_pipelineLayout, // VkPipelineLayout layout;
- *m_renderPass, // VkRenderPass renderPass;
+ renderPass, // VkRenderPass renderPass;
0u, // deUint32 subpass;
DE_NULL, // VkPipeline basePipelineHandle;
0u, // deInt32 basePipelineIndex;
};
- m_pipeline = createGraphicsPipeline(vk, vkDevice, DE_NULL, &graphicsPipelineParams);
+ return createGraphicsPipeline(vk, vkDevice, DE_NULL, &graphicsPipelineParams);
}
-void DepthRangeUnrestrictedTestInstance::prepareRenderPass (VkFramebuffer framebuffer, VkPipeline pipeline)
+void DepthRangeUnrestrictedTestInstance::prepareRenderPass (VkRenderPass renderPass, VkFramebuffer framebuffer, VkPipeline pipeline)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
@@ -644,13 +753,13 @@
m_param.depthBufferClearValue,
};
- beginRenderPass(vk, *m_cmdBuffer, *m_renderPass, framebuffer, makeRect2D(0, 0, m_renderSize.x(), m_renderSize.y()), 2u, attachmentClearValues);
+ beginRenderPass(vk, *m_cmdBuffer, renderPass, framebuffer, makeRect2D(0, 0, m_renderSize.x(), m_renderSize.y()), 2u, attachmentClearValues);
vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
VkDeviceSize offsets = 0u;
vk.cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &m_vertexBuffer.get(), &offsets);
- if (m_param.viewportMode & TEST_MODE_VIEWPORT_DYNAMIC)
+ if (m_param.viewportDepthBoundsMode & TEST_MODE_VIEWPORT_DYNAMIC)
{
VkViewport viewport = makeViewport(m_renderSize);
viewport.minDepth = m_param.viewportMinDepth;
@@ -658,6 +767,9 @@
vk.cmdSetViewport(*m_cmdBuffer, 0u, 1u, &viewport);
}
+ if (m_param.viewportDepthBoundsMode & TEST_MODE_DEPTH_BOUNDS_DYNAMIC)
+ vk.cmdSetDepthBounds(*m_cmdBuffer, m_param.minDepthBounds, m_param.maxDepthBounds);
+
if (!m_vertices.empty() && !m_param.testClearValueOnly)
vk.cmdDraw(*m_cmdBuffer, (deUint32)m_vertices.size(), 1u, 0u, 0u);
@@ -673,7 +785,7 @@
vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, (VkDependencyFlags)0,
0u, DE_NULL, 0u, DE_NULL, DE_LENGTH_OF_ARRAY(m_imageLayoutBarriers), m_imageLayoutBarriers);
- prepareRenderPass(*m_framebuffer, *m_pipeline);
+ prepareRenderPass(*m_renderPass, *m_framebuffer, *m_pipeline);
endCommandBuffer(vk, *m_cmdBuffer);
}
@@ -682,7 +794,7 @@
const DepthRangeUnrestrictedParam param)
: TestInstance (context)
, m_param (param)
- , m_extensions (m_context.requireDeviceExtension("VK_EXT_depth_range_unrestricted"))
+ , m_extensions (m_context.requireDeviceFunctionality("VK_EXT_depth_range_unrestricted"))
, m_renderSize (tcu::UVec2(32,32))
, m_colorFormat (VK_FORMAT_R8G8B8A8_UNORM)
, m_shaderStageCount (0)
@@ -702,6 +814,11 @@
throw tcu::NotSupportedError("Unsupported feature: depthClamp");
}
+ if (param.depthBoundsTestEnable && features.depthBounds == DE_FALSE)
+ {
+ throw tcu::NotSupportedError("Unsupported feature: depthBounds");
+ }
+
// Create vertex buffer
{
m_vertexBuffer = createBufferAndBindMemory(m_context, 1024u, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, &m_vertexBufferMemory);
@@ -712,7 +829,7 @@
}
// Create render pass
- m_renderPass = makeRenderPass(vk, vkDevice, m_colorFormat, m_param.depthFormat, VK_ATTACHMENT_LOAD_OP_CLEAR);
+ m_renderPass = makeRenderPass(vk, vkDevice, m_colorFormat, m_param.depthFormat, VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_LOAD_OP_CLEAR);
const VkComponentMapping ComponentMappingRGBA = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A};
// Create color image
@@ -759,7 +876,7 @@
m_imageLayoutBarriers[0] = colorImageBarrier;
- const VkImageMemoryBarrier depthImageBarrier =
+ VkImageMemoryBarrier depthImageBarrier =
{
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
DE_NULL, // const void* pNext;
@@ -856,10 +973,10 @@
}
// Create pipeline
- buildPipeline();
+ m_pipeline = buildPipeline(*m_renderPass);
// Create command pool
- m_cmdPool = createCommandPool(vk, vkDevice, VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, queueFamilyIndex);
+ m_cmdPool = createCommandPool(vk, vkDevice, VK_COMMAND_POOL_CREATE_TRANSIENT_BIT | VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex);
// Create command buffer
m_cmdBuffer = allocateCommandBuffer(vk, vkDevice, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
@@ -917,6 +1034,8 @@
// Depth Clamp is enabled, then we clamp point depth to viewport's maxDepth and minDepth values, or [0.0f, 1.0f] is depth format is fixed-point.
float scaling = ((vertex->position.z() / vertex->position.w()) * (m_param.viewportMaxDepth - m_param.viewportMinDepth)) + m_param.viewportMinDepth;
float depth = de::min(de::max(scaling, m_param.viewportMinDepth), m_param.viewportMaxDepth);
+
+ // For non-float depth formats, depth value is clampled to the range [0, 1].
if (isFloatingPointDepthFormat(m_param.depthFormat) == VK_FALSE)
depth = de::min(de::max(depth, 0.0f), 1.0f);
@@ -929,6 +1048,7 @@
}
}
+ // Check the rendered image
{
de::MovePtr<tcu::TextureLevel> result = vkt::pipeline::readColorAttachment(vk, vkDevice, queue, queueFamilyIndex, allocator, *m_colorImage, m_colorFormat, m_renderSize);
@@ -945,6 +1065,7 @@
return tcu::TestStatus::fail("Image mismatch");
}
+ // Check depth buffer contents
{
de::MovePtr<tcu::TextureLevel> depthResult = readDepthAttachment(vk, vkDevice, queue, queueFamilyIndex, allocator, *m_depthImage, m_param.depthFormat, m_renderSize);
@@ -1042,10 +1163,264 @@
return tcu::TestStatus::pass("Result images matches references");
}
+// Test Classes
+class DepthBoundsRangeUnrestrictedTestInstance : public DepthRangeUnrestrictedTestInstance
+{
+public:
+ DepthBoundsRangeUnrestrictedTestInstance (Context& context,
+ const DepthRangeUnrestrictedParam param);
+ virtual ~DepthBoundsRangeUnrestrictedTestInstance (void);
+ virtual tcu::TestStatus iterate (void);
+
+protected:
+ tcu::TestStatus verifyTestResult (bool firstDraw);
+ void prepareCommandBuffer (bool firstDraw);
+
+protected:
+ Move<VkRenderPass> m_renderPassSecondDraw;
+ Move<VkFramebuffer> m_framebufferSecondDraw;
+ Move<VkPipeline> m_pipelineSecondDraw;
+ std::vector<bool> m_vertexWasRendered;
+
+};
+
+DepthBoundsRangeUnrestrictedTestInstance::DepthBoundsRangeUnrestrictedTestInstance (Context& context,
+ const DepthRangeUnrestrictedParam param)
+ : DepthRangeUnrestrictedTestInstance(context, param)
+{
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
+
+ // Create render pass for second draw, we keep the first draw's contents of the depth buffer.
+ m_renderPassSecondDraw = makeRenderPass(vk, vkDevice, m_colorFormat, m_param.depthFormat, VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_LOAD_OP_LOAD);
+
+ // Create framebuffer for second draw.
+ {
+ VkImageView attachmentBindInfos[2] =
+ {
+ *m_colorAttachmentView,
+ *m_depthAttachmentView,
+ };
+
+ const VkFramebufferCreateInfo framebufferParams =
+ {
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkFramebufferCreateFlags flags;
+ *m_renderPassSecondDraw, // VkRenderPass renderPass;
+ 2u, // deUint32 attachmentCount;
+ attachmentBindInfos, // const VkImageView* pAttachments;
+ (deUint32)m_renderSize.x(), // deUint32 width;
+ (deUint32)m_renderSize.y(), // deUint32 height;
+ 1u, // deUint32 layers;
+ };
+
+ m_framebufferSecondDraw = createFramebuffer(vk, vkDevice, &framebufferParams);
+ }
+
+ // Create pipeline
+ m_pipelineSecondDraw = buildPipeline(*m_renderPassSecondDraw);
+}
+
+DepthBoundsRangeUnrestrictedTestInstance::~DepthBoundsRangeUnrestrictedTestInstance (void)
+{
+}
+
+tcu::TestStatus DepthBoundsRangeUnrestrictedTestInstance::iterate (void)
+{
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
+ const VkQueue queue = m_context.getUniversalQueue();
+
+ // This test will draw the same scene two times.
+ // First one will render the points depending on if the pass the depth test and if clear depth value passes the
+ // depthBounds test.
+ //
+ // The second one, will render the same scene but the the point positions will have depth buffer values from
+ // the first draw. If they pass the depth test, the depthBounds test will check the content of the depth buffer,
+ // which is most cases, will make that the second result differs from the first one, hence the need to split
+ // the verification in two steps.
+ prepareCommandBuffer(true);
+ submitCommandsAndWait(vk, vkDevice, queue, m_cmdBuffer.get());
+ tcu::TestStatus status = verifyTestResult(true);
+ if (status.getCode() != QP_TEST_RESULT_PASS)
+ return status;
+
+ prepareCommandBuffer(false);
+ submitCommandsAndWait(vk, vkDevice, queue, m_cmdBuffer.get());
+ return verifyTestResult(false);
+}
+
+void DepthBoundsRangeUnrestrictedTestInstance::prepareCommandBuffer (bool firstDraw)
+{
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+
+ if (!firstDraw)
+ {
+ vk.resetCommandBuffer(*m_cmdBuffer, VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
+ // Color image layout changed after verifying the first draw call, restore it.
+ m_imageLayoutBarriers[0].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
+ m_imageLayoutBarriers[0].oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
+ // Depth image layout changed after verifying the first draw call, restore it.
+ m_imageLayoutBarriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
+ m_imageLayoutBarriers[1].oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
+ }
+
+ beginCommandBuffer(vk, *m_cmdBuffer, 0u);
+
+ vk.cmdPipelineBarrier(*m_cmdBuffer, (firstDraw ? VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT : VK_PIPELINE_STAGE_TRANSFER_BIT), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, (VkDependencyFlags)0,
+ 0u, DE_NULL, 0u, DE_NULL, DE_LENGTH_OF_ARRAY(m_imageLayoutBarriers), m_imageLayoutBarriers);
+
+ prepareRenderPass((firstDraw ? *m_renderPass : *m_renderPassSecondDraw),
+ (firstDraw ? *m_framebuffer : *m_framebufferSecondDraw),
+ (firstDraw ? *m_pipeline : *m_pipelineSecondDraw));
+
+ endCommandBuffer(vk, *m_cmdBuffer);
+}
+
+tcu::TestStatus DepthBoundsRangeUnrestrictedTestInstance::verifyTestResult (bool firstDraw)
+{
+ deBool compareOk = DE_TRUE;
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
+ const VkQueue queue = m_context.getUniversalQueue();
+ const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
+ tcu::TestLog& log = m_context.getTestContext().getLog();
+ Allocator& allocator = m_context.getDefaultAllocator();
+ tcu::TextureLevel refImage (vk::mapVkFormat(m_colorFormat), 32, 32);
+ float clearValue = m_param.depthBufferClearValue.depthStencil.depth;
+ double epsilon = 1e-5;
+
+ // For non-float depth formats, depth value is clampled to the range [0, 1].
+ if (isFloatingPointDepthFormat(m_param.depthFormat) == VK_FALSE)
+ clearValue = de::min(de::max(clearValue, 0.0f), 1.0f);
+
+ // Generate reference image
+ {
+ VkClearValue clearColor = defaultClearValue(m_colorFormat);
+ tcu::Vec4 clearColorVec4 (clearColor.color.float32[0], clearColor.color.float32[1],
+ clearColor.color.float32[2], clearColor.color.float32[3]);
+ tcu::clear(refImage.getAccess(), clearColorVec4);
+ for (std::vector<Vertex4RGBA>::const_iterator vertex = m_vertices.begin(); vertex != m_vertices.end(); ++vertex)
+ {
+ // Depth Clamp is enabled, then we clamp point depth to viewport's maxDepth and minDepth values and later check if it is inside depthBounds volume.
+ float scaling = ((vertex->position.z() / vertex->position.w()) * (m_param.viewportMaxDepth - m_param.viewportMinDepth)) + m_param.viewportMinDepth;
+ float depth = de::min(de::max(scaling, m_param.viewportMinDepth), m_param.viewportMaxDepth);
+ if (isFloatingPointDepthFormat(m_param.depthFormat) == VK_FALSE)
+ depth = de::min(de::max(depth, 0.0f), 1.0f);
+
+ long i = vertex - m_vertices.begin();
+
+ // Depending if the first draw call succeed, we need to know if the second draw call will render the points because the depth buffer content
+ // will determine if it passes the depth test and the depth bounds test.
+ bool firstDrawHasPassedDepthBoundsTest = !firstDraw && m_vertexWasRendered[i];
+ float depthBufferValue = firstDrawHasPassedDepthBoundsTest ? depth : clearValue;
+
+ // For non-float depth formats, depth value is clampled to the range [0, 1].
+ if (isFloatingPointDepthFormat(m_param.depthFormat) == VK_FALSE)
+ depthBufferValue = de::min(de::max(depthBufferValue, 0.0f), 1.0f);
+
+ // Check that the point passes the depth test and the depth bounds test.
+ if (compareDepthResult(m_param.depthCompareOp, depth, depthBufferValue) &&
+ depthBufferValue >= m_param.minDepthBounds && depthBufferValue <= m_param.maxDepthBounds)
+ {
+ deInt32 x = static_cast<deInt32>((((vertex->position.x() / vertex->position.w()) + 1.0f) / 2.0f) * static_cast<float>(m_renderSize.x() - 1));
+ deInt32 y = static_cast<deInt32>((((vertex->position.y() / vertex->position.w()) + 1.0f) / 2.0f) * static_cast<float>(m_renderSize.y() - 1));
+ refImage.getAccess().setPixel(vertex->color, x, y);
+ if (firstDraw)
+ m_vertexWasRendered.push_back(true);
+ continue;
+ }
+
+ if (firstDraw)
+ m_vertexWasRendered.push_back(false);
+ }
+ }
+
+ // Check the rendered image
+ {
+ de::MovePtr<tcu::TextureLevel> result = vkt::pipeline::readColorAttachment(vk, vkDevice, queue, queueFamilyIndex, allocator, *m_colorImage, m_colorFormat, m_renderSize);
+ std::string description = "Image comparison draw ";
+ description += (firstDraw ? "1" : "2");
+
+ compareOk = tcu::intThresholdPositionDeviationCompare(m_context.getTestContext().getLog(),
+ "IntImageCompare",
+ description.c_str(),
+ refImage.getAccess(),
+ result->getAccess(),
+ tcu::UVec4(2, 2, 2, 2),
+ tcu::IVec3(1, 1, 0),
+ true,
+ tcu::COMPARE_LOG_RESULT);
+ if (!compareOk)
+ return tcu::TestStatus::fail("Image mismatch");
+ }
+
+ // Check depth buffer contents
+ {
+ de::MovePtr<tcu::TextureLevel> depthResult = readDepthAttachment(vk, vkDevice, queue, queueFamilyIndex, allocator, *m_depthImage, m_param.depthFormat, m_renderSize);
+
+ log << tcu::TestLog::Message;
+ for (std::vector<Vertex4RGBA>::const_iterator vertex = m_vertices.begin(); vertex != m_vertices.end(); ++vertex)
+ {
+ deInt32 x = static_cast<deInt32>((((vertex->position.x() / vertex->position.w()) + 1.0f) / 2.0f) * static_cast<float>(m_renderSize.x() - 1));
+ deInt32 y = static_cast<deInt32>((((vertex->position.y() / vertex->position.w()) + 1.0f) / 2.0f) * static_cast<float>(m_renderSize.y() - 1));
+ tcu::Vec4 depth = depthResult->getAccess().getPixel(x, y);
+
+ // Check depth values are valid
+ if (depth.y() != 0.0f || depth.z() != 0.0f || depth.w() != 1.0f)
+ {
+ log << tcu::TestLog::Message << "Draw " << (firstDraw ? "1" : "2") << ": Invalid depth buffer values for pixel (" << x << ", " << y << ") = ("
+ << depth.x() << ", " << depth.y() << ", " << depth.z() << ", " << depth.w() << "." << tcu::TestLog::EndMessage;
+ compareOk = DE_FALSE;
+ }
+
+ // Depth Clamp is enabled, so we clamp point depth to viewport's maxDepth and minDepth values, or 0.0f and 1.0f is format is not float.
+ float scaling = (vertex->position.z() / vertex->position.w()) * (m_param.viewportMaxDepth - m_param.viewportMinDepth) + m_param.viewportMinDepth;
+ float expectedDepth = de::min(de::max(scaling, m_param.viewportMinDepth), m_param.viewportMaxDepth);
+
+ long i = vertex - m_vertices.begin();
+
+ // Depending if the first draw call succeed, we need to know if the second draw call will render the points because the depth buffer content
+ // will determine if it passes the depth test and the depth bounds test.
+ bool firstDrawHasPassedDepthBoundsTest = !firstDraw && m_vertexWasRendered[i];
+
+ // If we are in the first draw call, the depth buffer content is clearValue. If we are in the second draw call, it is going to be depth.x() if the first
+ // succeeded.
+ float depthBufferValue = firstDrawHasPassedDepthBoundsTest ? depth.x() : clearValue;
+
+ // For non-float depth formats, depth value is clampled to the range [0, 1].
+ if (isFloatingPointDepthFormat(m_param.depthFormat) == VK_FALSE)
+ depthBufferValue = de::min(de::max(depthBufferValue, 0.0f), 1.0f);
+
+ // Calculate the expectd depth depending on the depth test and the depth bounds test results.
+ expectedDepth =
+ (compareDepthResult(m_param.depthCompareOp, expectedDepth, depthBufferValue) && depthBufferValue <= m_param.maxDepthBounds && depthBufferValue >= m_param.minDepthBounds)
+ ? expectedDepth : depthBufferValue;
+
+ // For non-float depth formats, depth value is clampled to the range [0, 1].
+ if (isFloatingPointDepthFormat(m_param.depthFormat) == VK_FALSE)
+ expectedDepth = de::min(de::max(expectedDepth, 0.0f), 1.0f);
+
+ if (fabs(expectedDepth - depth.x()) > epsilon)
+ {
+ log << tcu::TestLog::Message << "Draw " << (firstDraw ? "1" : "2") << ": Error pixel (" << x << ", " << y
+ << "). Depth value " << depth.x() << ", expected " << expectedDepth << ", error " << fabs(expectedDepth - depth.x()) << tcu::TestLog::EndMessage;
+ compareOk = DE_FALSE;
+ }
+ }
+
+ if (!compareOk)
+ return tcu::TestStatus::fail("Depth buffer mismatch");
+ }
+
+ return tcu::TestStatus::pass("Result images matches references");
+}
+
class DepthRangeUnrestrictedTest : public vkt::TestCase
{
public:
- DepthRangeUnrestrictedTest (tcu::TestContext& testContext,
+ DepthRangeUnrestrictedTest (tcu::TestContext& testContext,
const std::string& name,
const std::string& description,
const DepthRangeUnrestrictedParam param)
@@ -1089,6 +1464,8 @@
TestInstance* DepthRangeUnrestrictedTest::createInstance (Context& context) const
{
+ if (m_param.depthBoundsTestEnable)
+ return new DepthBoundsRangeUnrestrictedTestInstance(context, m_param);
return new DepthRangeUnrestrictedTestInstance(context, m_param);
}
} // anonymous
@@ -1112,6 +1489,7 @@
};
float viewportValues[] = {2.0f, 6.0f, 12.0f};
+ float depthBoundsValues[] = {2.0f, 4.0f, 8.0f};
float wcValues[] = {2.0f, 6.0f, 12.0f};
float clearValues[] = {2.0f, -3.0f, 6.0f, -7.0f};
@@ -1126,8 +1504,9 @@
testParams.viewportMaxDepth = 1.0f;
testParams.minDepthBounds = 0.0f;
testParams.maxDepthBounds = 1.0f;
+ testParams.depthBoundsTestEnable = VK_FALSE;
testParams.depthCompareOp = VK_COMPARE_OP_LESS_OR_EQUAL;
- testParams.viewportMode = TEST_MODE_VIEWPORT_STATIC;
+ testParams.viewportDepthBoundsMode = TEST_MODE_VIEWPORT_DEPTH_BOUNDS_STATIC;
for (int format = 0; format < DE_LENGTH_OF_ARRAY(depthFormats); ++format)
{
@@ -1151,6 +1530,7 @@
testParams.depthClampEnable = VK_TRUE;
testParams.minDepthBounds = 0.0f;
testParams.maxDepthBounds = 1.0f;
+ testParams.depthBoundsTestEnable = VK_FALSE;
for (int format = 0; format < DE_LENGTH_OF_ARRAY(depthFormats); ++format)
{
@@ -1166,9 +1546,9 @@
{
testParams.viewportMinDepth = -viewportValues[viewportValue];
testParams.viewportMaxDepth = viewportValues[viewportValue];
- testParams.viewportMode = TEST_MODE_VIEWPORT_STATIC;
+ testParams.viewportDepthBoundsMode = TEST_MODE_VIEWPORT_DEPTH_BOUNDS_STATIC;
viewportTests->addChild(newTestCase<DepthRangeUnrestrictedTest>(testCtx, testParams));
- testParams.viewportMode = TEST_MODE_VIEWPORT_DYNAMIC;
+ testParams.viewportDepthBoundsMode = TEST_MODE_VIEWPORT_DYNAMIC;
viewportTests->addChild(newTestCase<DepthRangeUnrestrictedTest>(testCtx, testParams));
}
}
@@ -1178,6 +1558,49 @@
depthTests->addChild(viewportTests.release());
}
+ // DepthBounds's depth unrestricted range
+ {
+ de::MovePtr<tcu::TestCaseGroup> depthBoundsTests (new tcu::TestCaseGroup(testCtx, "depthbounds", "Depthbounds unrestricted range"));
+ DepthRangeUnrestrictedParam testParams;
+ testParams.testClearValueOnly = VK_FALSE;
+ testParams.wc = 1.0f;
+ testParams.depthClampEnable = VK_TRUE;
+ testParams.depthBoundsTestEnable = VK_TRUE;
+
+ for (int format = 0; format < DE_LENGTH_OF_ARRAY(depthFormats); ++format)
+ {
+ testParams.depthFormat = depthFormats[format];
+ testParams.depthBufferClearValue = defaultClearValue(testParams.depthFormat);
+ for (int compareOp = 0; compareOp < DE_LENGTH_OF_ARRAY(compareOps); compareOp++)
+ {
+ testParams.depthCompareOp = compareOps[compareOp];
+ for (int clearValue = 0; clearValue < DE_LENGTH_OF_ARRAY(clearValues); clearValue++)
+ {
+ testParams.depthBufferClearValue.depthStencil.depth = clearValues[clearValue];
+ for (int viewportValue = 0; viewportValue < DE_LENGTH_OF_ARRAY(viewportValues); viewportValue++)
+ {
+ testParams.viewportMinDepth = -viewportValues[viewportValue];
+ testParams.viewportMaxDepth = viewportValues[viewportValue];
+ for (int depthValue = 0; depthValue < DE_LENGTH_OF_ARRAY(depthBoundsValues); depthValue++)
+ {
+ testParams.minDepthBounds = -depthBoundsValues[depthValue];
+ testParams.maxDepthBounds = depthBoundsValues[depthValue];
+
+ testParams.viewportDepthBoundsMode = TEST_MODE_VIEWPORT_DEPTH_BOUNDS_STATIC;
+ depthBoundsTests->addChild(newTestCase<DepthRangeUnrestrictedTest>(testCtx, testParams));
+ testParams.viewportDepthBoundsMode = TEST_MODE_DEPTH_BOUNDS_DYNAMIC;
+ depthBoundsTests->addChild(newTestCase<DepthRangeUnrestrictedTest>(testCtx, testParams));
+ testParams.viewportDepthBoundsMode = TEST_MODE_VIEWPORT_DEPTH_BOUNDS_DYNAMIC;
+ depthBoundsTests->addChild(newTestCase<DepthRangeUnrestrictedTest>(testCtx, testParams));
+ }
+ }
+ }
+ }
+ }
+
+ depthTests->addChild(depthBoundsTests.release());
+ }
+
// Depth clamping disabled
{
de::MovePtr<tcu::TestCaseGroup> noDepthClampingTests (new tcu::TestCaseGroup(testCtx, "depthclampingdisabled", "Depth clamping disabled tests"));
@@ -1186,7 +1609,8 @@
testParams.depthClampEnable = VK_FALSE;
testParams.minDepthBounds = 0.0f;
testParams.maxDepthBounds = 1.0f;
- testParams.viewportMode = TEST_MODE_VIEWPORT_STATIC;
+ testParams.depthBoundsTestEnable = VK_FALSE;
+ testParams.viewportDepthBoundsMode = TEST_MODE_VIEWPORT_DEPTH_BOUNDS_STATIC;
for (int format = 0; format < DE_LENGTH_OF_ARRAY(depthFormats); ++format)
{
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineDepthTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineDepthTests.cpp
index 851dd1a..20c3d4d 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineDepthTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineDepthTests.cpp
@@ -119,6 +119,7 @@
const std::string& description,
const VkFormat depthFormat,
const VkCompareOp depthCompareOps[QUAD_COUNT],
+ const bool separateDepthStencilLayouts,
const bool depthBoundsTestEnable = false,
const float depthBoundsMin = 0.0f,
const float depthBoundsMax = 1.0f,
@@ -127,10 +128,12 @@
const bool colorAttachmentEnable = true);
virtual ~DepthTest (void);
virtual void initPrograms (SourceCollections& programCollection) const;
+ virtual void checkSupport (Context& context) const;
virtual TestInstance* createInstance (Context& context) const;
private:
const VkFormat m_depthFormat;
+ const bool m_separateDepthStencilLayouts;
const bool m_depthBoundsTestEnable;
const float m_depthBoundsMin;
const float m_depthBoundsMax;
@@ -146,6 +149,7 @@
DepthTestInstance (Context& context,
const VkFormat depthFormat,
const VkCompareOp depthCompareOps[DepthTest::QUAD_COUNT],
+ const bool separateDepthStencilLayouts,
const bool depthBoundsTestEnable,
const float depthBoundsMin,
const float depthBoundsMax,
@@ -163,6 +167,7 @@
const tcu::UVec2 m_renderSize;
const VkFormat m_colorFormat;
const VkFormat m_depthFormat;
+ const bool m_separateDepthStencilLayouts;
const bool m_depthBoundsTestEnable;
const float m_depthBoundsMin;
const float m_depthBoundsMax;
@@ -207,6 +212,7 @@
const std::string& description,
const VkFormat depthFormat,
const VkCompareOp depthCompareOps[QUAD_COUNT],
+ const bool separateDepthStencilLayouts,
const bool depthBoundsTestEnable,
const float depthBoundsMin,
const float depthBoundsMax,
@@ -214,13 +220,14 @@
const bool stencilTestEnable,
const bool colorAttachmentEnable)
: vkt::TestCase (testContext, name, description)
- , m_depthFormat (depthFormat)
- , m_depthBoundsTestEnable (depthBoundsTestEnable)
- , m_depthBoundsMin (depthBoundsMin)
- , m_depthBoundsMax (depthBoundsMax)
- , m_depthTestEnable (depthTestEnable)
- , m_stencilTestEnable (stencilTestEnable)
- , m_colorAttachmentEnable (colorAttachmentEnable)
+ , m_depthFormat (depthFormat)
+ , m_separateDepthStencilLayouts (separateDepthStencilLayouts)
+ , m_depthBoundsTestEnable (depthBoundsTestEnable)
+ , m_depthBoundsMin (depthBoundsMin)
+ , m_depthBoundsMax (depthBoundsMax)
+ , m_depthTestEnable (depthTestEnable)
+ , m_stencilTestEnable (stencilTestEnable)
+ , m_colorAttachmentEnable (colorAttachmentEnable)
{
deMemcpy(m_depthCompareOps, depthCompareOps, sizeof(VkCompareOp) * QUAD_COUNT);
}
@@ -229,9 +236,21 @@
{
}
+void DepthTest::checkSupport (Context& context) const
+{
+ if (m_depthBoundsTestEnable)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_DEPTH_BOUNDS);
+
+ if (!isSupportedDepthStencilFormat(context.getInstanceInterface(), context.getPhysicalDevice(), m_depthFormat))
+ throw tcu::NotSupportedError(std::string("Unsupported depth/stencil format: ") + getFormatName(m_depthFormat));
+
+ if (m_separateDepthStencilLayouts && !context.isDeviceFunctionalitySupported("VK_KHR_separate_depth_stencil_layouts"))
+ TCU_THROW(NotSupportedError, "VK_KHR_separate_depth_stencil_layouts is not supported");
+}
+
TestInstance* DepthTest::createInstance (Context& context) const
{
- return new DepthTestInstance(context, m_depthFormat, m_depthCompareOps, m_depthBoundsTestEnable, m_depthBoundsMin, m_depthBoundsMax, m_depthTestEnable, m_stencilTestEnable, m_colorAttachmentEnable);
+ return new DepthTestInstance(context, m_depthFormat, m_depthCompareOps, m_separateDepthStencilLayouts, m_depthBoundsTestEnable, m_depthBoundsMin, m_depthBoundsMax, m_depthTestEnable, m_stencilTestEnable, m_colorAttachmentEnable);
}
void DepthTest::initPrograms (SourceCollections& programCollection) const
@@ -281,22 +300,24 @@
DepthTestInstance::DepthTestInstance (Context& context,
const VkFormat depthFormat,
const VkCompareOp depthCompareOps[DepthTest::QUAD_COUNT],
+ const bool separateDepthStencilLayouts,
const bool depthBoundsTestEnable,
const float depthBoundsMin,
const float depthBoundsMax,
const bool depthTestEnable,
const bool stencilTestEnable,
const bool colorAttachmentEnable)
- : vkt::TestInstance (context)
- , m_renderSize (32, 32)
- , m_colorFormat (colorAttachmentEnable ? VK_FORMAT_R8G8B8A8_UNORM : VK_FORMAT_UNDEFINED)
- , m_depthFormat (depthFormat)
- , m_depthBoundsTestEnable (depthBoundsTestEnable)
- , m_depthBoundsMin (depthBoundsMin)
- , m_depthBoundsMax (depthBoundsMax)
- , m_depthTestEnable (depthTestEnable)
- , m_stencilTestEnable (stencilTestEnable)
- , m_colorAttachmentEnable (colorAttachmentEnable)
+ : vkt::TestInstance (context)
+ , m_renderSize (32, 32)
+ , m_colorFormat (colorAttachmentEnable ? VK_FORMAT_R8G8B8A8_UNORM : VK_FORMAT_UNDEFINED)
+ , m_depthFormat (depthFormat)
+ , m_separateDepthStencilLayouts (separateDepthStencilLayouts)
+ , m_depthBoundsTestEnable (depthBoundsTestEnable)
+ , m_depthBoundsMin (depthBoundsMin)
+ , m_depthBoundsMax (depthBoundsMax)
+ , m_depthTestEnable (depthTestEnable)
+ , m_stencilTestEnable (stencilTestEnable)
+ , m_colorAttachmentEnable (colorAttachmentEnable)
{
const DeviceInterface& vk = context.getDeviceInterface();
const VkDevice vkDevice = context.getDevice();
@@ -304,10 +325,6 @@
SimpleAllocator memAlloc (vk, vkDevice, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice()));
const VkComponentMapping componentMappingRGBA = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A };
- // Check depthBounds support
- if (m_depthBoundsTestEnable && !context.getDeviceFeatures().depthBounds)
- TCU_THROW(NotSupportedError, "depthBounds feature is not supported");
-
// Copy depth operators
deMemcpy(m_depthCompareOps, depthCompareOps, sizeof(VkCompareOp) * DepthTest::QUAD_COUNT);
@@ -342,10 +359,6 @@
// Create depth image
{
- // Check format support
- if (!isSupportedDepthStencilFormat(context.getInstanceInterface(), context.getPhysicalDevice(), m_depthFormat))
- throw tcu::NotSupportedError(std::string("Unsupported depth/stencil format: ") + getFormatName(m_depthFormat));
-
const VkImageCreateInfo depthImageParams =
{
VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
@@ -599,7 +612,7 @@
attachmentClearValues.push_back(defaultClearValue(m_depthFormat));
- const VkImageMemoryBarrier colorBarrier =
+ const VkImageMemoryBarrier colorBarrier =
{
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
DE_NULL, // const void* pNext;
@@ -613,18 +626,26 @@
{ VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u } // VkImageSubresourceRange subresourceRange;
};
- const VkImageMemoryBarrier depthBarrier =
+ VkImageSubresourceRange depthBarrierSubresourceRange = m_depthImageSubresourceRange;
+ VkImageLayout newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+ if (m_separateDepthStencilLayouts)
+ {
+ depthBarrierSubresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
+ newLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR;
+ }
+
+ const VkImageMemoryBarrier depthBarrier =
{
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
DE_NULL, // const void* pNext;
(VkAccessFlags)0, // VkAccessFlags srcAccessMask;
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask;
VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
- VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout newLayout;
+ newLayout , // VkImageLayout newLayout;
VK_QUEUE_FAMILY_IGNORED, // uint32_t srcQueueFamilyIndex;
VK_QUEUE_FAMILY_IGNORED, // uint32_t dstQueueFamilyIndex;
*m_depthImage, // VkImage image;
- m_depthImageSubresourceRange, // VkImageSubresourceRange subresourceRange;
+ depthBarrierSubresourceRange, // VkImageSubresourceRange subresourceRange;
};
std::vector<VkImageMemoryBarrier> imageLayoutBarriers;
@@ -979,67 +1000,80 @@
for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(depthFormats); formatNdx++)
{
- de::MovePtr<tcu::TestCaseGroup> formatTest (new tcu::TestCaseGroup(testCtx,
- getFormatCaseName(depthFormats[formatNdx]).c_str(),
- (std::string("Uses format ") + getFormatName(depthFormats[formatNdx])).c_str()));
- de::MovePtr<tcu::TestCaseGroup> compareOpsTests (new tcu::TestCaseGroup(testCtx, "compare_ops", "Combines depth compare operators"));
+ const bool hasDepth = tcu::hasDepthComponent(mapVkFormat(depthFormats[formatNdx]).order);
+ const bool hasStencil = tcu::hasStencilComponent(mapVkFormat(depthFormats[formatNdx]).order);
+ const int separateLayoutsLoopCount = (hasDepth && hasStencil) ? 2 : 1;
- for (size_t opsNdx = 0; opsNdx < DE_LENGTH_OF_ARRAY(depthOps); opsNdx++)
+ for (int separateDepthStencilLayouts = 0; separateDepthStencilLayouts < separateLayoutsLoopCount; ++separateDepthStencilLayouts)
{
- compareOpsTests->addChild(new DepthTest(testCtx,
- getCompareOpsName(depthOps[opsNdx]),
- getCompareOpsDescription(depthOps[opsNdx]),
- depthFormats[formatNdx],
- depthOps[opsNdx]));
+ const bool useSeparateDepthStencilLayouts = bool(separateDepthStencilLayouts);
- compareOpsTests->addChild(new DepthTest(testCtx,
- getCompareOpsName(depthOps[opsNdx]) + "_depth_bounds_test",
- getCompareOpsDescription(depthOps[opsNdx]) + " with depth bounds test enabled",
- depthFormats[formatNdx],
- depthOps[opsNdx],
- true,
- 0.1f,
- 0.25f,
- true,
- false,
- colorEnabled));
- }
- // Special VkPipelineDepthStencilStateCreateInfo known to have issues
- {
- const VkCompareOp depthOpsSpecial[DepthTest::QUAD_COUNT] = { VK_COMPARE_OP_NEVER, VK_COMPARE_OP_NEVER, VK_COMPARE_OP_NEVER, VK_COMPARE_OP_NEVER };
+ de::MovePtr<tcu::TestCaseGroup> formatTest (new tcu::TestCaseGroup(testCtx,
+ (getFormatCaseName(depthFormats[formatNdx]) + ((useSeparateDepthStencilLayouts) ? "_separate_layouts" : "")).c_str(),
+ (std::string("Uses format ") + getFormatName(depthFormats[formatNdx]) + ((useSeparateDepthStencilLayouts) ? " with separate depth/stencil layouts" : "")).c_str()));
+ de::MovePtr<tcu::TestCaseGroup> compareOpsTests (new tcu::TestCaseGroup(testCtx, "compare_ops", "Combines depth compare operators"));
- compareOpsTests->addChild(new DepthTest(testCtx,
- "never_zerodepthbounds_depthdisabled_stencilenabled",
- "special VkPipelineDepthStencilStateCreateInfo",
- depthFormats[formatNdx],
- depthOpsSpecial,
- true,
- 0.0f,
- 0.0f,
- false,
- true,
- colorEnabled));
- }
- formatTest->addChild(compareOpsTests.release());
+ for (size_t opsNdx = 0; opsNdx < DE_LENGTH_OF_ARRAY(depthOps); opsNdx++)
+ {
+ compareOpsTests->addChild(new DepthTest(testCtx,
+ getCompareOpsName(depthOps[opsNdx]),
+ getCompareOpsDescription(depthOps[opsNdx]),
+ depthFormats[formatNdx],
+ depthOps[opsNdx],
+ useSeparateDepthStencilLayouts));
- // Test case with depth test enabled, but depth write disabled
- de::MovePtr<tcu::TestCaseGroup> depthTestDisabled(new tcu::TestCaseGroup(testCtx, "depth_test_disabled", "Test for disabled depth test"));
- {
- const VkCompareOp depthOpsDepthTestDisabled[DepthTest::QUAD_COUNT] = { VK_COMPARE_OP_NEVER, VK_COMPARE_OP_LESS, VK_COMPARE_OP_GREATER, VK_COMPARE_OP_ALWAYS };
- depthTestDisabled->addChild(new DepthTest(testCtx,
- "depth_write_enabled",
- "Depth writes should not occur if depth test is disabled",
- depthFormats[formatNdx],
- depthOpsDepthTestDisabled,
- false, /* depthBoundsTestEnable */
- 0.0f, /* depthBoundMin*/
- 1.0f, /* depthBoundMax*/
- false, /* depthTestEnable */
- false, /* stencilTestEnable */
- colorEnabled /* colorAttachmentEnable */));
+ compareOpsTests->addChild(new DepthTest(testCtx,
+ getCompareOpsName(depthOps[opsNdx]) + "_depth_bounds_test",
+ getCompareOpsDescription(depthOps[opsNdx]) + " with depth bounds test enabled",
+ depthFormats[formatNdx],
+ depthOps[opsNdx],
+ useSeparateDepthStencilLayouts,
+ true,
+ 0.1f,
+ 0.25f,
+ true,
+ false,
+ colorEnabled));
+ }
+ // Special VkPipelineDepthStencilStateCreateInfo known to have issues
+ {
+ const VkCompareOp depthOpsSpecial[DepthTest::QUAD_COUNT] = { VK_COMPARE_OP_NEVER, VK_COMPARE_OP_NEVER, VK_COMPARE_OP_NEVER, VK_COMPARE_OP_NEVER };
+
+ compareOpsTests->addChild(new DepthTest(testCtx,
+ "never_zerodepthbounds_depthdisabled_stencilenabled",
+ "special VkPipelineDepthStencilStateCreateInfo",
+ depthFormats[formatNdx],
+ depthOpsSpecial,
+ useSeparateDepthStencilLayouts,
+ true,
+ 0.0f,
+ 0.0f,
+ false,
+ true,
+ colorEnabled));
+ }
+ formatTest->addChild(compareOpsTests.release());
+
+ // Test case with depth test enabled, but depth write disabled
+ de::MovePtr<tcu::TestCaseGroup> depthTestDisabled(new tcu::TestCaseGroup(testCtx, "depth_test_disabled", "Test for disabled depth test"));
+ {
+ const VkCompareOp depthOpsDepthTestDisabled[DepthTest::QUAD_COUNT] = { VK_COMPARE_OP_NEVER, VK_COMPARE_OP_LESS, VK_COMPARE_OP_GREATER, VK_COMPARE_OP_ALWAYS };
+ depthTestDisabled->addChild(new DepthTest(testCtx,
+ "depth_write_enabled",
+ "Depth writes should not occur if depth test is disabled",
+ depthFormats[formatNdx],
+ depthOpsDepthTestDisabled,
+ useSeparateDepthStencilLayouts,
+ false, /* depthBoundsTestEnable */
+ 0.0f, /* depthBoundMin*/
+ 1.0f, /* depthBoundMax*/
+ false, /* depthTestEnable */
+ false, /* stencilTestEnable */
+ colorEnabled /* colorAttachmentEnable */));
+ }
+ formatTest->addChild(depthTestDisabled.release());
+ formatTests->addChild(formatTest.release());
}
- formatTest->addChild(depthTestDisabled.release());
- formatTests->addChild(formatTest.release());
}
if (colorEnabled)
depthTests->addChild(formatTests.release());
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineExecutablePropertiesTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineExecutablePropertiesTests.cpp
index 9543ea5..7f6e3f4 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineExecutablePropertiesTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineExecutablePropertiesTests.cpp
@@ -263,7 +263,7 @@
const char* sourceName,
const char* entryName);
void enableTessellationStage (deUint32 patchControlPoints);
- VkPipeline buildPipeline (tcu::UVec2 renderSize,
+ Move<VkPipeline> buildPipeline (tcu::UVec2 renderSize,
VkRenderPass renderPass,
VkPipelineCache cache,
VkPipelineLayout pipelineLayout,
@@ -326,8 +326,8 @@
m_shaderStageCount++;
}
-VkPipeline SimpleGraphicsPipelineBuilder::buildPipeline (tcu::UVec2 renderSize, VkRenderPass renderPass, VkPipelineCache cache,
- VkPipelineLayout pipelineLayout, VkPipelineCreateFlags flags)
+Move<VkPipeline> SimpleGraphicsPipelineBuilder::buildPipeline (tcu::UVec2 renderSize, VkRenderPass renderPass, VkPipelineCache cache,
+ VkPipelineLayout pipelineLayout, VkPipelineCreateFlags flags)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice vkDevice = m_context.getDevice();
@@ -515,9 +515,8 @@
DE_NULL, // VkPipeline basePipelineHandle;
0, // deInt32 basePipelineIndex;
};
- VkPipeline pipeline;
- vk.createGraphicsPipelines(vkDevice, cache, 1u, &graphicsPipelineParams, DE_NULL, &pipeline);
- return pipeline;
+
+ return createGraphicsPipeline(vk, vkDevice, cache, &graphicsPipelineParams, DE_NULL);
}
void SimpleGraphicsPipelineBuilder::enableTessellationStage (deUint32 patchControlPoints)
@@ -568,14 +567,14 @@
Move<VkPipelineCache> m_cache;
deBool m_extensions;
- VkPipeline m_pipeline[PIPELINE_CACHE_NDX_COUNT];
+ Move<VkPipeline> m_pipeline[PIPELINE_CACHE_NDX_COUNT];
};
ExecutablePropertiesTestInstance::ExecutablePropertiesTestInstance (Context& context,
const ExecutablePropertiesTestParam* param)
: TestInstance (context)
, m_param (param)
- , m_extensions (m_context.requireDeviceExtension("VK_KHR_pipeline_executable_properties"))
+ , m_extensions (m_context.requireDeviceFunctionality("VK_KHR_pipeline_executable_properties"))
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice vkDevice = m_context.getDevice();
@@ -645,7 +644,7 @@
{
VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR, // VkStructureType sType;
DE_NULL, // const void* pNext;
- m_pipeline[ndx], // VkPipeline pipeline;
+ *m_pipeline[ndx], // VkPipeline pipeline;
executableNdx, // uint32_t executableIndex;
};
@@ -802,7 +801,7 @@
{
VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR, // VkStructureType sType;
DE_NULL, // const void* pNext;
- m_pipeline[1], // VkPipeline pipeline;
+ *m_pipeline[1], // VkPipeline pipeline;
executableNdx, // uint32_t executableIndex;
};
@@ -931,7 +930,7 @@
{
VK_STRUCTURE_TYPE_PIPELINE_INFO_KHR, // VkStructureType sType;
DE_NULL, // const void* pNext;
- m_pipeline[ndx], // VkPipeline pipeline;
+ *m_pipeline[ndx], // VkPipeline pipeline;
};
deUint32 executableCount = 0;
@@ -1347,14 +1346,14 @@
void buildPipeline (deUint32 ndx);
protected:
Move<VkBuffer> m_inputBuf;
- de::MovePtr<Allocation> m_inputBufferAlloc;
+ de::MovePtr<Allocation> m_inputBufferAlloc;
Move<VkShaderModule> m_computeShaderModule[PIPELINE_CACHE_NDX_COUNT];
Move<VkBuffer> m_outputBuf[PIPELINE_CACHE_NDX_COUNT];
- de::MovePtr<Allocation> m_outputBufferAlloc[PIPELINE_CACHE_NDX_COUNT];
+ de::MovePtr<Allocation> m_outputBufferAlloc[PIPELINE_CACHE_NDX_COUNT];
Move<VkDescriptorPool> m_descriptorPool[PIPELINE_CACHE_NDX_COUNT];
- Move<VkDescriptorSetLayout> m_descriptorSetLayout[PIPELINE_CACHE_NDX_COUNT];
+ Move<VkDescriptorSetLayout> m_descriptorSetLayout[PIPELINE_CACHE_NDX_COUNT];
Move<VkDescriptorSet> m_descriptorSet[PIPELINE_CACHE_NDX_COUNT];
Move<VkPipelineLayout> m_pipelineLayout[PIPELINE_CACHE_NDX_COUNT];
@@ -1470,7 +1469,7 @@
0u, // deInt32 basePipelineIndex;
};
- vk.createComputePipelines(vkDevice, *m_cache, 1u, &pipelineCreateInfo, DE_NULL, &m_pipeline[ndx]);
+ m_pipeline[ndx] = createComputePipeline(vk, vkDevice, *m_cache, &pipelineCreateInfo, DE_NULL);
}
ComputeExecutablePropertiesTestInstance::ComputeExecutablePropertiesTestInstance (Context& context,
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineFramebufferAttachmentTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineFramebufferAttachmentTests.cpp
index 2e41043..9c96f9c 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineFramebufferAttachmentTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineFramebufferAttachmentTests.cpp
@@ -370,12 +370,6 @@
return expectedImage;
}
-inline Move<VkBuffer> makeBuffer (const DeviceInterface& vk, const VkDevice device, const VkDeviceSize bufferSize, const VkBufferUsageFlags usage)
-{
- const VkBufferCreateInfo bufferCreateInfo = makeBufferCreateInfo(bufferSize, usage);
- return createBuffer(vk, device, &bufferCreateInfo);
-}
-
inline VkImageSubresourceRange makeColorSubresourceRange (const deUint32 baseArrayLayer, const deUint32 layerCount)
{
return makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, baseArrayLayer, layerCount);
@@ -777,14 +771,6 @@
// 4-sample multi-sampling
tcu::TestStatus testNoAtt (Context& context, const bool multisample)
{
- const VkPhysicalDeviceFeatures features = context.getDeviceFeatures();
- if (!features.fragmentStoresAndAtomics)
- throw tcu::NotSupportedError("fragmentStoresAndAtomics feature not supported");
- if (!features.geometryShader && !features.tessellationShader) // Shader uses gl_PrimitiveID
- throw tcu::NotSupportedError("geometryShader or tessellationShader feature not supported");
- if (multisample && !features.sampleRateShading) // MS shader uses gl_SampleID
- throw tcu::NotSupportedError("sampleRateShading feature not supported");
-
const DeviceInterface& vk = context.getDeviceInterface();
const VkDevice device = context.getDevice();
const VkQueue queue = context.getUniversalQueue();
@@ -1478,6 +1464,19 @@
return str.str();
}
+void checkSupport (Context& context, const bool multisample)
+{
+ const VkPhysicalDeviceFeatures features = context.getDeviceFeatures();
+
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_FRAGMENT_STORES_AND_ATOMICS);
+
+ if (!features.geometryShader && !features.tessellationShader) // Shader uses gl_PrimitiveID
+ throw tcu::NotSupportedError("geometryShader or tessellationShader feature not supported");
+
+ if (multisample)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SAMPLE_RATE_SHADING); // MS shader uses gl_SampleID
+}
+
void addAttachmentTestCasesWithFunctions (tcu::TestCaseGroup* group)
{
@@ -1532,8 +1531,8 @@
// Add tests for the case where there are no color attachments but the
// fragment shader writes to an image via imageStore().
- addFunctionCaseWithPrograms(group, "no_attachments", "", initImagePrograms, testNoAtt, false);
- addFunctionCaseWithPrograms(group, "no_attachments_ms", "", initImagePrograms, testNoAtt, true);
+ addFunctionCaseWithPrograms(group, "no_attachments", "", checkSupport, initImagePrograms, testNoAtt, false);
+ addFunctionCaseWithPrograms(group, "no_attachments_ms", "", checkSupport, initImagePrograms, testNoAtt, true);
// Test render pass with attachment set as unused.
addFunctionCase(group, "unused_attachment", "", testUnusedAtt);
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageSamplingInstance.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageSamplingInstance.cpp
index 92b567a..5ae09af 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageSamplingInstance.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageSamplingInstance.cpp
@@ -186,85 +186,43 @@
} // anonymous
-ImageSamplingInstance::ImageSamplingInstance (Context& context,
- const tcu::UVec2& renderSize,
- VkImageViewType imageViewType,
- VkFormat imageFormat,
- const tcu::IVec3& imageSize,
- int layerCount,
- const VkComponentMapping& componentMapping,
- const VkImageSubresourceRange& subresourceRange,
- const VkSamplerCreateInfo& samplerParams,
- float samplerLod,
- const std::vector<Vertex4Tex4>& vertices,
- bool separateStencilUsage,
- VkDescriptorType samplingType,
- int imageCount,
- AllocationKind allocationKind)
- : vkt::TestInstance (context)
- , m_allocationKind (allocationKind)
- , m_samplingType (samplingType)
- , m_imageViewType (imageViewType)
- , m_imageFormat (imageFormat)
- , m_imageSize (imageSize)
- , m_layerCount (layerCount)
- , m_imageCount (imageCount)
- , m_componentMapping (componentMapping)
- , m_componentMask (true)
- , m_subresourceRange (subresourceRange)
- , m_samplerParams (samplerParams)
- , m_samplerLod (samplerLod)
- , m_renderSize (renderSize)
- , m_colorFormat (VK_FORMAT_R8G8B8A8_UNORM)
- , m_vertices (vertices)
- , m_separateStencilUsage(separateStencilUsage)
+void checkSupportImageSamplingInstance (Context& context, ImageSamplingInstanceParams params)
{
- const InstanceInterface& vki = context.getInstanceInterface();
- const DeviceInterface& vk = context.getDeviceInterface();
- const VkPhysicalDevice physDevice = context.getPhysicalDevice();
- const VkDevice vkDevice = context.getDevice();
- const VkQueue queue = context.getUniversalQueue();
- const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
- SimpleAllocator memAlloc (vk, vkDevice, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice()));
- const VkComponentMapping componentMappingRGBA = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A };
- const vk::VkPhysicalDeviceLimits limits = getPhysicalDeviceProperties(vki, physDevice).limits;
- const VkImageStencilUsageCreateInfoEXT stencilUsage =
- {
- VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT,
- DE_NULL,
- VK_IMAGE_USAGE_TRANSFER_DST_BIT
- };
- if (de::abs(samplerParams.mipLodBias) > limits.maxSamplerLodBias)
+ if (de::abs(params.samplerParams.mipLodBias) > context.getDeviceProperties().limits.maxSamplerLodBias)
TCU_THROW(NotSupportedError, "Unsupported sampler Lod bias value");
- if (!isSupportedSamplableFormat(context.getInstanceInterface(), context.getPhysicalDevice(), imageFormat))
- throw tcu::NotSupportedError(std::string("Unsupported format for sampling: ") + getFormatName(imageFormat));
+ if (!isSupportedSamplableFormat(context.getInstanceInterface(), context.getPhysicalDevice(), params.imageFormat))
+ throw tcu::NotSupportedError(std::string("Unsupported format for sampling: ") + getFormatName(params.imageFormat));
- if ((deUint32)imageCount > context.getDeviceProperties().limits.maxColorAttachments)
- throw tcu::NotSupportedError(std::string("Unsupported render target count: ") + de::toString(imageCount));
+ if ((deUint32)params.imageCount > context.getDeviceProperties().limits.maxColorAttachments)
+ throw tcu::NotSupportedError(std::string("Unsupported render target count: ") + de::toString(params.imageCount));
- if ((samplerParams.minFilter == VK_FILTER_LINEAR ||
- samplerParams.magFilter == VK_FILTER_LINEAR ||
- samplerParams.mipmapMode == VK_SAMPLER_MIPMAP_MODE_LINEAR) &&
- !isLinearFilteringSupported(context.getInstanceInterface(), context.getPhysicalDevice(), imageFormat, VK_IMAGE_TILING_OPTIMAL))
- throw tcu::NotSupportedError(std::string("Unsupported format for linear filtering: ") + getFormatName(imageFormat));
+ if ((params.samplerParams.minFilter == VK_FILTER_LINEAR ||
+ params.samplerParams.magFilter == VK_FILTER_LINEAR ||
+ params.samplerParams.mipmapMode == VK_SAMPLER_MIPMAP_MODE_LINEAR) &&
+ !isLinearFilteringSupported(context.getInstanceInterface(), context.getPhysicalDevice(), params.imageFormat, VK_IMAGE_TILING_OPTIMAL))
+ throw tcu::NotSupportedError(std::string("Unsupported format for linear filtering: ") + getFormatName(params.imageFormat));
- if (separateStencilUsage)
+ if (params.separateStencilUsage)
{
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_EXT_separate_stencil_usage"))
- TCU_THROW(NotSupportedError, "VK_EXT_separate_stencil_usage not supported");
+ context.requireDeviceFunctionality("VK_EXT_separate_stencil_usage");
+ context.requireInstanceFunctionality("VK_KHR_get_physical_device_properties2");
- if (!isInstanceExtensionSupported(context.getUsedApiVersion(), context.getInstanceExtensions(), "VK_KHR_get_physical_device_properties2"))
- TCU_THROW(NotSupportedError, "VK_KHR_get_physical_device_properties2 not supported");
+ const VkImageStencilUsageCreateInfo stencilUsage =
+ {
+ VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO,
+ DE_NULL,
+ VK_IMAGE_USAGE_TRANSFER_DST_BIT
+ };
const VkPhysicalDeviceImageFormatInfo2 formatInfo2 =
{
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2, // VkStructureType sType
- m_separateStencilUsage ? &stencilUsage
- : DE_NULL, // const void* pNext
- imageFormat, // VkFormat format
- getCompatibleImageType(m_imageViewType), // VkImageType type
+ params.separateStencilUsage ? &stencilUsage
+ : DE_NULL, // const void* pNext
+ params.imageFormat, // VkFormat format
+ getCompatibleImageType(params.imageViewType), // VkImageType type
VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling
VK_IMAGE_USAGE_SAMPLED_BIT
| VK_IMAGE_USAGE_TRANSFER_DST_BIT, // VkImageUsageFlags usage
@@ -275,41 +233,114 @@
{
VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2,
DE_NULL,
- {
{
- 0, // width
- 0, // height
- 0, // depth
+ {
+ 0, // width
+ 0, // height
+ 0, // depth
+ },
+ 0u, // maxMipLevels
+ 0u, // maxArrayLayers
+ 0, // sampleCounts
+ 0u, // maxResourceSize
},
- 0u, // maxMipLevels
- 0u, // maxArrayLayers
- 0, // sampleCounts
- 0u, // maxResourceSize
- },
};
- if ((vki.getPhysicalDeviceImageFormatProperties2(context.getPhysicalDevice(), &formatInfo2, &extProperties) == VK_ERROR_FORMAT_NOT_SUPPORTED)
- || extProperties.imageFormatProperties.maxExtent.width < (deUint32)m_imageSize.x()
- || extProperties.imageFormatProperties.maxExtent.height < (deUint32)m_imageSize.y())
+ if ((context.getInstanceInterface().getPhysicalDeviceImageFormatProperties2(context.getPhysicalDevice(), &formatInfo2, &extProperties) == VK_ERROR_FORMAT_NOT_SUPPORTED)
+ || extProperties.imageFormatProperties.maxExtent.width < (deUint32)params.imageSize.x()
+ || extProperties.imageFormatProperties.maxExtent.height < (deUint32)params.imageSize.y())
{
TCU_THROW(NotSupportedError, "Image format not supported");
}
}
- if (samplerParams.pNext != DE_NULL)
+ if (params.samplerParams.pNext != DE_NULL)
{
- const VkStructureType nextType = *reinterpret_cast<const VkStructureType*>(samplerParams.pNext);
+ const VkStructureType nextType = *reinterpret_cast<const VkStructureType*>(params.samplerParams.pNext);
+
+ if (nextType == VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT)
+ {
+ context.requireDeviceFunctionality("VK_EXT_sampler_filter_minmax");
+
+ if (!isMinMaxFilteringSupported(context.getInstanceInterface(), context.getPhysicalDevice(), params.imageFormat, VK_IMAGE_TILING_OPTIMAL))
+ throw tcu::NotSupportedError(std::string("Unsupported format for min/max filtering: ") + getFormatName(params.imageFormat));
+ }
+ }
+
+ if (params.samplerParams.addressModeU == VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE ||
+ params.samplerParams.addressModeV == VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE ||
+ params.samplerParams.addressModeW == VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE)
+ {
+ context.requireDeviceFunctionality("VK_KHR_sampler_mirror_clamp_to_edge");
+ }
+
+ if ((isCompressedFormat(params.imageFormat) || isDepthStencilFormat(params.imageFormat)) && params.imageViewType == VK_IMAGE_VIEW_TYPE_3D)
+ {
+ // \todo [2016-01-22 pyry] Mandate VK_ERROR_FORMAT_NOT_SUPPORTED
+ try
+ {
+ const VkImageFormatProperties formatProperties = getPhysicalDeviceImageFormatProperties(context.getInstanceInterface(),
+ context.getPhysicalDevice(),
+ params.imageFormat,
+ VK_IMAGE_TYPE_3D,
+ VK_IMAGE_TILING_OPTIMAL,
+ VK_IMAGE_USAGE_SAMPLED_BIT,
+ (VkImageCreateFlags)0);
+
+ if (formatProperties.maxExtent.width == 0 &&
+ formatProperties.maxExtent.height == 0 &&
+ formatProperties.maxExtent.depth == 0)
+ TCU_THROW(NotSupportedError, "3D compressed or depth format not supported");
+ }
+ catch (const Error&)
+ {
+ TCU_THROW(NotSupportedError, "3D compressed or depth format not supported");
+ }
+ }
+
+ if (params.imageViewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_IMAGE_CUBE_ARRAY);
+
+ if (params.allocationKind == ALLOCATION_KIND_DEDICATED)
+ context.requireDeviceFunctionality("VK_KHR_dedicated_allocation");
+}
+
+ImageSamplingInstance::ImageSamplingInstance (Context& context,
+ ImageSamplingInstanceParams params)
+ : vkt::TestInstance (context)
+ , m_allocationKind (params.allocationKind)
+ , m_samplingType (params.samplingType)
+ , m_imageViewType (params.imageViewType)
+ , m_imageFormat (params.imageFormat)
+ , m_imageSize (params.imageSize)
+ , m_layerCount (params.layerCount)
+ , m_imageCount (params.imageCount)
+ , m_componentMapping (params.componentMapping)
+ , m_componentMask (true)
+ , m_subresourceRange (params.subresourceRange)
+ , m_samplerParams (params.samplerParams)
+ , m_samplerLod (params.samplerLod)
+ , m_renderSize (params.renderSize)
+ , m_colorFormat (VK_FORMAT_R8G8B8A8_UNORM)
+ , m_vertices (params.vertices)
+{
+ const InstanceInterface& vki = context.getInstanceInterface();
+ const DeviceInterface& vk = context.getDeviceInterface();
+ const VkPhysicalDevice physDevice = context.getPhysicalDevice();
+ const VkDevice vkDevice = context.getDevice();
+ const VkQueue queue = context.getUniversalQueue();
+ const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
+ SimpleAllocator memAlloc (vk, vkDevice, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice()));
+ const VkComponentMapping componentMappingRGBA = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A };
+
+ if (m_samplerParams.pNext != DE_NULL)
+ {
+ const VkStructureType nextType = *reinterpret_cast<const VkStructureType*>(m_samplerParams.pNext);
switch (nextType)
{
case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT:
{
- if (!de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), "VK_EXT_sampler_filter_minmax"))
- TCU_THROW(NotSupportedError, "VK_EXT_sampler_filter_minmax not supported");
-
- if (!isMinMaxFilteringSupported(context.getInstanceInterface(), context.getPhysicalDevice(), imageFormat, VK_IMAGE_TILING_OPTIMAL))
- throw tcu::NotSupportedError(std::string("Unsupported format for min/max filtering: ") + getFormatName(imageFormat));
-
- VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT physicalDeviceSamplerMinMaxProperties =
+ VkPhysicalDeviceSamplerFilterMinmaxProperties physicalDeviceSamplerMinMaxProperties =
{
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT,
DE_NULL,
@@ -343,46 +374,6 @@
}
}
-
- if ((samplerParams.addressModeU == VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE ||
- samplerParams.addressModeV == VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE ||
- samplerParams.addressModeW == VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE) &&
- !de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), "VK_KHR_sampler_mirror_clamp_to_edge"))
- TCU_THROW(NotSupportedError, "VK_KHR_sampler_mirror_clamp_to_edge not supported");
-
- if ((isCompressedFormat(imageFormat) || isDepthStencilFormat(imageFormat)) && imageViewType == VK_IMAGE_VIEW_TYPE_3D)
- {
- // \todo [2016-01-22 pyry] Mandate VK_ERROR_FORMAT_NOT_SUPPORTED
- try
- {
- const VkImageFormatProperties formatProperties = getPhysicalDeviceImageFormatProperties(context.getInstanceInterface(),
- context.getPhysicalDevice(),
- imageFormat,
- VK_IMAGE_TYPE_3D,
- VK_IMAGE_TILING_OPTIMAL,
- VK_IMAGE_USAGE_SAMPLED_BIT,
- (VkImageCreateFlags)0);
-
- if (formatProperties.maxExtent.width == 0 &&
- formatProperties.maxExtent.height == 0 &&
- formatProperties.maxExtent.depth == 0)
- TCU_THROW(NotSupportedError, "3D compressed or depth format not supported");
- }
- catch (const Error&)
- {
- TCU_THROW(NotSupportedError, "3D compressed or depth format not supported");
- }
- }
-
- if (imageViewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY && !context.getDeviceFeatures().imageCubeArray)
- TCU_THROW(NotSupportedError, "imageCubeArray feature is not supported");
-
- if (m_allocationKind == ALLOCATION_KIND_DEDICATED)
- {
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_dedicated_allocation"))
- TCU_THROW(NotSupportedError, std::string("VK_KHR_dedicated_allocation is not supported").c_str());
- }
-
// Create texture images, views and samplers
{
VkImageCreateFlags imageFlags = 0u;
@@ -391,10 +382,10 @@
imageFlags = VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
// Initialize texture data
- if (isCompressedFormat(imageFormat))
- m_texture = createTestTexture(mapVkCompressedFormat(imageFormat), imageViewType, imageSize, layerCount);
+ if (isCompressedFormat(m_imageFormat))
+ m_texture = createTestTexture(mapVkCompressedFormat(m_imageFormat), m_imageViewType, m_imageSize, m_layerCount);
else
- m_texture = createTestTexture(mapVkFormat(imageFormat), imageViewType, imageSize, layerCount);
+ m_texture = createTestTexture(mapVkFormat(m_imageFormat), m_imageViewType, m_imageSize, m_layerCount);
const VkImageCreateInfo imageParams =
{
@@ -402,7 +393,7 @@
DE_NULL, // const void* pNext;
imageFlags, // VkImageCreateFlags flags;
getCompatibleImageType(m_imageViewType), // VkImageType imageType;
- imageFormat, // VkFormat format;
+ m_imageFormat, // VkFormat format;
{ // VkExtent3D extent;
(deUint32)m_imageSize.x(),
(deUint32)m_imageSize.y(),
@@ -440,7 +431,7 @@
0u, // VkImageViewCreateFlags flags;
**m_images[imgNdx], // VkImage image;
m_imageViewType, // VkImageViewType viewType;
- imageFormat, // VkFormat format;
+ m_imageFormat, // VkFormat format;
m_componentMapping, // VkComponentMapping components;
m_subresourceRange, // VkImageSubresourceRange subresourceRange;
};
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageSamplingInstance.hpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageSamplingInstance.hpp
index c7dcb5e..55bd1fe 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageSamplingInstance.hpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageSamplingInstance.hpp
@@ -45,24 +45,61 @@
ALLOCATION_KIND_DEDICATED,
};
+struct ImageSamplingInstanceParams
+{
+ ImageSamplingInstanceParams (const tcu::UVec2& renderSize_,
+ vk::VkImageViewType imageViewType_,
+ vk::VkFormat imageFormat_,
+ const tcu::IVec3& imageSize_,
+ int layerCount_,
+ const vk::VkComponentMapping& componentMapping_,
+ const vk::VkImageSubresourceRange& subresourceRange_,
+ const vk::VkSamplerCreateInfo& samplerParams_,
+ float samplerLod_,
+ const std::vector<Vertex4Tex4>& vertices_,
+ bool separateStencilUsage_ = false,
+ vk::VkDescriptorType samplingType_ = vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
+ int imageCount_ = 1,
+ AllocationKind allocationKind_ = ALLOCATION_KIND_SUBALLOCATED)
+ : renderSize (renderSize_)
+ , imageViewType (imageViewType_)
+ , imageFormat (imageFormat_)
+ , imageSize (imageSize_)
+ , layerCount (layerCount_)
+ , componentMapping (componentMapping_)
+ , subresourceRange (subresourceRange_)
+ , samplerParams (samplerParams_)
+ , samplerLod (samplerLod_)
+ , vertices (vertices_)
+ , separateStencilUsage (separateStencilUsage_)
+ , samplingType (samplingType_)
+ , imageCount (imageCount_)
+ , allocationKind (allocationKind_)
+ {}
+
+ const tcu::UVec2 renderSize;
+ vk::VkImageViewType imageViewType;
+ vk::VkFormat imageFormat;
+ const tcu::IVec3 imageSize;
+ int layerCount;
+ const vk::VkComponentMapping componentMapping;
+ const vk::VkImageSubresourceRange subresourceRange;
+ const vk::VkSamplerCreateInfo samplerParams;
+ float samplerLod;
+ const std::vector<Vertex4Tex4> vertices;
+ bool separateStencilUsage;
+ vk::VkDescriptorType samplingType;
+ int imageCount;
+ AllocationKind allocationKind;
+};
+
+void checkSupportImageSamplingInstance (Context& context, ImageSamplingInstanceParams params);
+
class ImageSamplingInstance : public vkt::TestInstance
{
public:
- ImageSamplingInstance (Context& context,
- const tcu::UVec2& renderSize,
- vk::VkImageViewType imageViewType,
- vk::VkFormat imageFormat,
- const tcu::IVec3& imageSize,
- int layerCount,
- const vk::VkComponentMapping& componentMapping,
- const vk::VkImageSubresourceRange& subresourceRange,
- const vk::VkSamplerCreateInfo& samplerParams,
- float samplerLod,
- const std::vector<Vertex4Tex4>& vertices,
- bool separateStencilUsage = false,
- vk::VkDescriptorType samplingType = vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
- int imageCount = 1,
- AllocationKind allocationKind = ALLOCATION_KIND_SUBALLOCATED);
+ ImageSamplingInstance (Context& context,
+ ImageSamplingInstanceParams params);
virtual ~ImageSamplingInstance (void);
@@ -124,8 +161,6 @@
vk::Move<vk::VkCommandPool> m_cmdPool;
vk::Move<vk::VkCommandBuffer> m_cmdBuffer;
-
- const bool m_separateStencilUsage;
};
} // pipeline
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageTests.cpp
index 8b0890c..221aff8 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageTests.cpp
@@ -49,38 +49,47 @@
class ImageTest : public vkt::TestCase
{
public:
- ImageTest (tcu::TestContext& testContext,
- const char* name,
- const char* description,
+ ImageTest (tcu::TestContext& testContext,
+ const char* name,
+ const char* description,
- AllocationKind allocationKind,
- VkDescriptorType samplingType,
- VkImageViewType imageViewType,
- VkFormat imageFormat,
- const tcu::IVec3& imageSize,
- int imageCount,
- int arraySize);
+ AllocationKind allocationKind,
+ VkDescriptorType samplingType,
+ VkImageViewType imageViewType,
+ VkFormat imageFormat,
+ const tcu::IVec3& imageSize,
+ int imageCount,
+ int arraySize);
- virtual void initPrograms (SourceCollections& sourceCollections) const;
- virtual TestInstance* createInstance (Context& context) const;
- static std::string getGlslSamplerType (const tcu::TextureFormat& format, VkImageViewType type);
- static std::string getGlslTextureType (const tcu::TextureFormat& format, VkImageViewType type);
- static std::string getGlslSamplerDecl (int imageCount);
- static std::string getGlslTextureDecl (int imageCount);
- static std::string getGlslFragColorDecl (int imageCount);
- static std::string getGlslSampler (const tcu::TextureFormat& format,
- VkImageViewType type,
- VkDescriptorType samplingType,
- int imageCount);
+ ImageSamplingInstanceParams getImageSamplingInstanceParams (AllocationKind allocationKind,
+ VkDescriptorType samplingType,
+ VkImageViewType imageViewType,
+ VkFormat imageFormat,
+ const tcu::IVec3& imageSize,
+ int imageCount,
+ int arraySize) const;
+
+ virtual void initPrograms (SourceCollections& sourceCollections) const;
+ virtual void checkSupport (Context& context) const;
+ virtual TestInstance* createInstance (Context& context) const;
+ static std::string getGlslSamplerType (const tcu::TextureFormat& format, VkImageViewType type);
+ static std::string getGlslTextureType (const tcu::TextureFormat& format, VkImageViewType type);
+ static std::string getGlslSamplerDecl (int imageCount);
+ static std::string getGlslTextureDecl (int imageCount);
+ static std::string getGlslFragColorDecl (int imageCount);
+ static std::string getGlslSampler (const tcu::TextureFormat& format,
+ VkImageViewType type,
+ VkDescriptorType samplingType,
+ int imageCount);
private:
- AllocationKind m_allocationKind;
- VkDescriptorType m_samplingType;
- VkImageViewType m_imageViewType;
- VkFormat m_imageFormat;
- tcu::IVec3 m_imageSize;
- int m_imageCount;
- int m_arraySize;
+ AllocationKind m_allocationKind;
+ VkDescriptorType m_samplingType;
+ VkImageViewType m_imageViewType;
+ VkFormat m_imageFormat;
+ tcu::IVec3 m_imageSize;
+ int m_imageCount;
+ int m_arraySize;
};
ImageTest::ImageTest (tcu::TestContext& testContext,
@@ -105,6 +114,72 @@
{
}
+void ImageTest::checkSupport (Context& context) const
+{
+ // Using a loop to index into an array of images requires shaderSampledImageArrayDynamicIndexing
+ if (m_imageCount > 1)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SHADER_SAMPLED_IMAGE_ARRAY_DYNAMIC_INDEXING);
+
+ checkSupportImageSamplingInstance(context, getImageSamplingInstanceParams(m_allocationKind, m_samplingType, m_imageViewType, m_imageFormat, m_imageSize, m_imageCount, m_arraySize));
+}
+
+ImageSamplingInstanceParams ImageTest::getImageSamplingInstanceParams (AllocationKind allocationKind,
+ VkDescriptorType samplingType,
+ VkImageViewType imageViewType,
+ VkFormat imageFormat,
+ const tcu::IVec3& imageSize,
+ int imageCount,
+ int arraySize) const
+{
+ tcu::UVec2 renderSize;
+
+ if (imageViewType == VK_IMAGE_VIEW_TYPE_1D || imageViewType == VK_IMAGE_VIEW_TYPE_2D)
+ {
+ renderSize = tcu::UVec2((deUint32)imageSize.x(), (deUint32)imageSize.y());
+ }
+ else
+ {
+ // Draw a 3x2 grid of texture layers
+ renderSize = tcu::UVec2((deUint32)imageSize.x() * 3, (deUint32)imageSize.y() * 2);
+ }
+
+ const bool separateStencilUsage = false;
+ const std::vector<Vertex4Tex4> vertices = createTestQuadMosaic(imageViewType);
+ const VkComponentMapping componentMapping = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A };
+ const VkImageSubresourceRange subresourceRange =
+ {
+ VK_IMAGE_ASPECT_COLOR_BIT,
+ 0u,
+ (deUint32)deLog2Floor32(deMax32(imageSize.x(), deMax32(imageSize.y(), imageSize.z()))) + 1,
+ 0u,
+ (deUint32)arraySize,
+ };
+
+ const VkSamplerCreateInfo samplerParams =
+ {
+ VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // 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_CLAMP_TO_EDGE, // VkSamplerAddressMode addressModeU;
+ VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, // VkSamplerAddressMode addressModeV;
+ VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, // VkSamplerAddressMode addressModeW;
+ 0.0f, // float mipLodBias;
+ VK_FALSE, // VkBool32 anisotropyEnable;
+ 1.0f, // float maxAnisotropy;
+ false, // VkBool32 compareEnable;
+ VK_COMPARE_OP_NEVER, // VkCompareOp compareOp;
+ 0.0f, // float minLod;
+ (float)(subresourceRange.levelCount - 1), // float maxLod;
+ getFormatBorderColor(BORDER_COLOR_TRANSPARENT_BLACK, imageFormat), // VkBorderColor borderColor;
+ false // VkBool32 unnormalizedCoordinates;
+ };
+
+ return ImageSamplingInstanceParams(renderSize, imageViewType, imageFormat, imageSize, arraySize, componentMapping, subresourceRange, samplerParams, 0.0f, vertices, separateStencilUsage, samplingType, imageCount, allocationKind);
+}
+
void ImageTest::initPrograms (SourceCollections& sourceCollections) const
{
std::ostringstream vertexSrc;
@@ -185,60 +260,7 @@
TestInstance* ImageTest::createInstance (Context& context) const
{
- tcu::UVec2 renderSize;
- const VkPhysicalDeviceFeatures& features = context.getDeviceFeatures();
-
- // Using an loop to index into an array of images requires shaderSampledImageArrayDynamicIndexing
- if (m_imageCount > 1 && features.shaderSampledImageArrayDynamicIndexing == VK_FALSE)
- {
- TCU_THROW(NotSupportedError, "shaderSampledImageArrayDynamicIndexing feature is not supported");
- }
-
- if (m_imageViewType == VK_IMAGE_VIEW_TYPE_1D || m_imageViewType == VK_IMAGE_VIEW_TYPE_2D)
- {
- renderSize = tcu::UVec2((deUint32)m_imageSize.x(), (deUint32)m_imageSize.y());
- }
- else
- {
- // Draw a 3x2 grid of texture layers
- renderSize = tcu::UVec2((deUint32)m_imageSize.x() * 3, (deUint32)m_imageSize.y() * 2);
- }
-
- const bool separateStencilUsage = false;
- const std::vector<Vertex4Tex4> vertices = createTestQuadMosaic(m_imageViewType);
- const VkComponentMapping componentMapping = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A };
- const VkImageSubresourceRange subresourceRange =
- {
- VK_IMAGE_ASPECT_COLOR_BIT,
- 0u,
- (deUint32)deLog2Floor32(deMax32(m_imageSize.x(), deMax32(m_imageSize.y(), m_imageSize.z()))) + 1,
- 0u,
- (deUint32)m_arraySize,
- };
-
- const VkSamplerCreateInfo samplerParams =
- {
- VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // 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_CLAMP_TO_EDGE, // VkSamplerAddressMode addressModeU;
- VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, // VkSamplerAddressMode addressModeV;
- VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, // VkSamplerAddressMode addressModeW;
- 0.0f, // float mipLodBias;
- VK_FALSE, // VkBool32 anisotropyEnable;
- 1.0f, // float maxAnisotropy;
- false, // VkBool32 compareEnable;
- VK_COMPARE_OP_NEVER, // VkCompareOp compareOp;
- 0.0f, // float minLod;
- (float)(subresourceRange.levelCount - 1), // float maxLod;
- getFormatBorderColor(BORDER_COLOR_TRANSPARENT_BLACK, m_imageFormat), // VkBorderColor borderColor;
- false // VkBool32 unnormalizedCoordinates;
- };
-
- return new ImageSamplingInstance(context, renderSize, m_imageViewType, m_imageFormat, m_imageSize, m_arraySize, componentMapping, subresourceRange, samplerParams, 0.0f, vertices, separateStencilUsage, m_samplingType, m_imageCount, m_allocationKind);
+ return new ImageSamplingInstance(context, getImageSamplingInstanceParams(m_allocationKind, m_samplingType, m_imageViewType, m_imageFormat, m_imageSize, m_imageCount, m_arraySize));
}
std::string ImageTest::getGlslSamplerType (const tcu::TextureFormat& format, VkImageViewType type)
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.cpp
index 5bf1b74..6652b4d 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.cpp
@@ -254,7 +254,8 @@
vk::Allocator& allocator,
vk::VkImage image,
vk::VkFormat format,
- const tcu::UVec2& renderSize)
+ const tcu::UVec2& renderSize,
+ vk::VkImageLayout currentLayout)
{
Move<VkBuffer> buffer;
de::MovePtr<Allocation> bufferAlloc;
@@ -312,7 +313,7 @@
cmdBuffer = allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
beginCommandBuffer(vk, *cmdBuffer);
- copyImageToBuffer(vk, *cmdBuffer, image, *buffer, tcu::IVec2(renderSize.x(), renderSize.y()), VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 1u, barrierAspect, VK_IMAGE_ASPECT_DEPTH_BIT);
+ copyImageToBuffer(vk, *cmdBuffer, image, *buffer, tcu::IVec2(renderSize.x(), renderSize.y()), VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, currentLayout, 1u, barrierAspect, VK_IMAGE_ASPECT_DEPTH_BIT);
endCommandBuffer(vk, *cmdBuffer);
submitCommandsAndWait(vk, device, queue, cmdBuffer.get());
@@ -331,7 +332,8 @@
vk::Allocator& allocator,
vk::VkImage image,
vk::VkFormat format,
- const tcu::UVec2& renderSize)
+ const tcu::UVec2& renderSize,
+ vk::VkImageLayout currentLayout)
{
Move<VkBuffer> buffer;
de::MovePtr<Allocation> bufferAlloc;
@@ -369,7 +371,7 @@
cmdBuffer = allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
beginCommandBuffer(vk, *cmdBuffer);
- copyImageToBuffer(vk, *cmdBuffer, image, *buffer, tcu::IVec2(renderSize.x(), renderSize.y()), VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 1u, barrierAspect, VK_IMAGE_ASPECT_STENCIL_BIT);
+ copyImageToBuffer(vk, *cmdBuffer, image, *buffer, tcu::IVec2(renderSize.x(), renderSize.y()), VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, currentLayout, 1u, barrierAspect, VK_IMAGE_ASPECT_STENCIL_BIT);
endCommandBuffer(vk, *cmdBuffer);
submitCommandsAndWait(vk, device, queue, cmdBuffer.get());
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.hpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.hpp
index 7483cd8..c966d88 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.hpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.hpp
@@ -100,7 +100,8 @@
vk::Allocator& allocator,
vk::VkImage image,
vk::VkFormat format,
- const tcu::UVec2& renderSize);
+ const tcu::UVec2& renderSize,
+ vk::VkImageLayout currentLayout = vk::VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
/*--------------------------------------------------------------------*//*!
* Gets a tcu::TextureLevel initialized with data from a VK stencil
@@ -116,7 +117,8 @@
vk::Allocator& allocator,
vk::VkImage image,
vk::VkFormat format,
- const tcu::UVec2& renderSize);
+ const tcu::UVec2& renderSize,
+ vk::VkImageLayout currentLayout = vk::VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
/*--------------------------------------------------------------------*//*!
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageViewTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageViewTests.cpp
index fa04406..6498116 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageViewTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageViewTests.cpp
@@ -52,32 +52,39 @@
class ImageViewTest : public vkt::TestCase
{
public:
- ImageViewTest (tcu::TestContext& testContext,
- const char* name,
- const char* description,
- VkImageViewType imageViewType,
- VkFormat imageFormat,
- float samplerLod,
- const VkComponentMapping& componentMapping,
- const VkImageSubresourceRange& subresourceRange);
- virtual ~ImageViewTest (void) {}
+ ImageViewTest (tcu::TestContext& testContext,
+ const char* name,
+ const char* description,
+ VkImageViewType imageViewType,
+ VkFormat imageFormat,
+ float samplerLod,
+ const VkComponentMapping& componentMapping,
+ const VkImageSubresourceRange& subresourceRange);
+ virtual ~ImageViewTest (void) {}
- virtual void initPrograms (SourceCollections& sourceCollections) const;
- virtual TestInstance* createInstance (Context& context) const;
- static std::string getGlslSamplerType (const tcu::TextureFormat& format,
- VkImageViewType type);
- static tcu::UVec2 getRenderSize (VkImageViewType viewType);
- static tcu::IVec3 getImageSize (VkImageViewType viewType);
- static int getArraySize (VkImageViewType viewType);
- static int getNumLevels (VkImageViewType viewType);
- static tcu::Vec4 swizzle (tcu::Vec4 inputData,
- VkComponentMapping componentMapping);
+ ImageSamplingInstanceParams getImageSamplingInstanceParams (VkImageViewType imageViewType,
+ VkFormat imageFormat,
+ float samplerLod,
+ const VkComponentMapping& componentMapping,
+ const VkImageSubresourceRange& subresourceRange) const;
+
+ virtual void initPrograms (SourceCollections& sourceCollections) const;
+ virtual void checkSupport (Context& context) const;
+ virtual TestInstance* createInstance (Context& context) const;
+ static std::string getGlslSamplerType (const tcu::TextureFormat& format,
+ VkImageViewType type);
+ static tcu::UVec2 getRenderSize (VkImageViewType viewType);
+ static tcu::IVec3 getImageSize (VkImageViewType viewType);
+ static int getArraySize (VkImageViewType viewType);
+ static int getNumLevels (VkImageViewType viewType);
+ static tcu::Vec4 swizzle (tcu::Vec4 inputData,
+ VkComponentMapping componentMapping);
private:
- VkImageViewType m_imageViewType;
- VkFormat m_imageFormat;
- float m_samplerLod;
- VkComponentMapping m_componentMapping;
- VkImageSubresourceRange m_subresourceRange;
+ VkImageViewType m_imageViewType;
+ VkFormat m_imageFormat;
+ float m_samplerLod;
+ VkComponentMapping m_componentMapping;
+ VkImageSubresourceRange m_subresourceRange;
};
ImageViewTest::ImageViewTest (tcu::TestContext& testContext,
@@ -98,6 +105,47 @@
{
}
+ImageSamplingInstanceParams ImageViewTest::getImageSamplingInstanceParams (VkImageViewType imageViewType,
+ VkFormat imageFormat,
+ float samplerLod,
+ const VkComponentMapping& componentMapping,
+ const VkImageSubresourceRange& subresourceRange) const
+{
+ const tcu::UVec2 renderSize = getRenderSize(imageViewType);
+ const tcu::IVec3 imageSize = getImageSize(imageViewType);
+ const int arraySize = getArraySize(imageViewType);
+ const std::vector<Vertex4Tex4> vertices = createTestQuadMosaic(imageViewType);
+
+ const VkSamplerCreateInfo samplerParams =
+ {
+ VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // 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_CLAMP_TO_EDGE, // VkSamplerAddressMode addressModeU;
+ VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, // VkSamplerAddressMode addressModeV;
+ VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, // VkSamplerAddressMode addressModeW;
+ 0.0f, // float mipLodBias;
+ VK_FALSE, // VkBool32 anisotropyEnable;
+ 1.0f, // float maxAnisotropy;
+ false, // VkBool32 compareEnable;
+ VK_COMPARE_OP_NEVER, // VkCompareOp compareOp;
+ 0.0f, // float minLod;
+ (float)(subresourceRange.levelCount - 1), // float maxLod;
+ getFormatBorderColor(BORDER_COLOR_TRANSPARENT_BLACK, imageFormat), // VkBorderColor borderColor;
+ false // VkBool32 unnormalizedCoordinates;
+ };
+
+ return ImageSamplingInstanceParams(renderSize, imageViewType, imageFormat, imageSize, arraySize, componentMapping, subresourceRange, samplerParams, samplerLod, vertices);
+}
+
+void ImageViewTest::checkSupport (Context& context) const
+{
+ checkSupportImageSamplingInstance(context, getImageSamplingInstanceParams(m_imageViewType, m_imageFormat, m_samplerLod, m_componentMapping, m_subresourceRange));
+}
+
tcu::Vec4 ImageViewTest::swizzle (tcu::Vec4 inputData, VkComponentMapping componentMapping)
{
// array map with enum VkComponentSwizzle
@@ -192,34 +240,7 @@
TestInstance* ImageViewTest::createInstance (Context& context) const
{
- const tcu::UVec2 renderSize = getRenderSize(m_imageViewType);
- const tcu::IVec3 imageSize = getImageSize(m_imageViewType);
- const int arraySize = getArraySize(m_imageViewType);
- const std::vector<Vertex4Tex4> vertices = createTestQuadMosaic(m_imageViewType);
-
- const VkSamplerCreateInfo samplerParams =
- {
- VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // 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_CLAMP_TO_EDGE, // VkSamplerAddressMode addressModeU;
- VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, // VkSamplerAddressMode addressModeV;
- VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, // VkSamplerAddressMode addressModeW;
- 0.0f, // float mipLodBias;
- VK_FALSE, // VkBool32 anisotropyEnable;
- 1.0f, // float maxAnisotropy;
- false, // VkBool32 compareEnable;
- VK_COMPARE_OP_NEVER, // VkCompareOp compareOp;
- 0.0f, // float minLod;
- (float)(m_subresourceRange.levelCount - 1), // float maxLod;
- getFormatBorderColor(BORDER_COLOR_TRANSPARENT_BLACK, m_imageFormat), // VkBorderColor borderColor;
- false // VkBool32 unnormalizedCoordinates;
- };
-
- return new ImageSamplingInstance(context, renderSize, m_imageViewType, m_imageFormat, imageSize, arraySize, m_componentMapping, m_subresourceRange, samplerParams, m_samplerLod, vertices);
+ return new ImageSamplingInstance(context, getImageSamplingInstanceParams(m_imageViewType, m_imageFormat, m_samplerLod, m_componentMapping, m_subresourceRange));
}
std::string ImageViewTest::getGlslSamplerType (const tcu::TextureFormat& format, VkImageViewType type)
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineInputAssemblyTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineInputAssemblyTests.cpp
index aab8a0d..9af8969 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineInputAssemblyTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineInputAssemblyTests.cpp
@@ -75,6 +75,7 @@
VkIndexType indexType);
virtual ~InputAssemblyTest (void) {}
virtual void initPrograms (SourceCollections& sourceCollections) const;
+ virtual void checkSupport (Context& context) const;
virtual TestInstance* createInstance (Context& context) const;
static bool isRestartIndex (VkIndexType indexType, deUint32 indexValue);
static deUint32 getRestartIndex (VkIndexType indexType);
@@ -222,6 +223,29 @@
{
}
+void InputAssemblyTest::checkSupport (Context& context) const
+{
+ if (m_indexType == VK_INDEX_TYPE_UINT8_EXT)
+ context.requireDeviceFunctionality("VK_EXT_index_type_uint8");
+
+ switch (m_primitiveTopology)
+ {
+ case VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY:
+ case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY:
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY:
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY:
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_GEOMETRY_SHADER);
+ break;
+
+ case VK_PRIMITIVE_TOPOLOGY_PATCH_LIST:
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_TESSELLATION_SHADER);
+ break;
+
+ default:
+ break;
+ }
+}
+
TestInstance* InputAssemblyTest::createInstance (Context& context) const
{
std::vector<deUint32> indexBufferData;
@@ -935,28 +959,6 @@
SimpleAllocator memAlloc (vk, vkDevice, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice()));
const VkComponentMapping componentMappingRGBA = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A };
- if (m_indexType == VK_INDEX_TYPE_UINT8_EXT)
- context.requireDeviceExtension("VK_EXT_index_type_uint8");
-
- switch (m_primitiveTopology)
- {
- case VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY:
- case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY:
- case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY:
- case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY:
- if (!context.getDeviceFeatures().geometryShader)
- throw tcu::NotSupportedError("Geometry shaders are not supported");
- break;
-
- case VK_PRIMITIVE_TOPOLOGY_PATCH_LIST:
- if (!context.getDeviceFeatures().tessellationShader)
- throw tcu::NotSupportedError("Tessellation shaders are not supported");
- break;
-
- default:
- break;
- }
-
// Create color image
{
const VkImageCreateInfo colorImageParams =
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMakeUtil.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMakeUtil.cpp
index a224c6d..58eb75b 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMakeUtil.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMakeUtil.cpp
@@ -89,20 +89,6 @@
return createComputePipeline(vk, device, DE_NULL , &pipelineInfo);
}
-MovePtr<Allocation> bindImage (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkImage image, const MemoryRequirement requirement)
-{
- MovePtr<Allocation> alloc = allocator.allocate(getImageMemoryRequirements(vk, device, image), requirement);
- VK_CHECK(vk.bindImageMemory(device, image, alloc->getMemory(), alloc->getOffset()));
- return alloc;
-}
-
-MovePtr<Allocation> bindBuffer (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkBuffer buffer, const MemoryRequirement requirement)
-{
- MovePtr<Allocation> alloc(allocator.allocate(getBufferMemoryRequirements(vk, device, buffer), requirement));
- VK_CHECK(vk.bindBufferMemory(device, buffer, alloc->getMemory(), alloc->getOffset()));
- return alloc;
-}
-
MovePtr<Allocation> bindImageDedicated (const InstanceInterface& vki, const DeviceInterface& vkd, const VkPhysicalDevice physDevice, const VkDevice device, const VkImage image, const MemoryRequirement requirement)
{
MovePtr<Allocation> alloc(allocateDedicated(vki, vkd, physDevice, device, image, requirement));
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMakeUtil.hpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMakeUtil.hpp
index 09feead..ad11c14 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMakeUtil.hpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMakeUtil.hpp
@@ -78,8 +78,6 @@
vk::Move<vk::VkCommandBuffer> makeCommandBuffer (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkCommandPool commandPool);
vk::Move<vk::VkPipeline> makeComputePipeline (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkPipelineLayout pipelineLayout, const vk::VkShaderModule shaderModule, const vk::VkSpecializationInfo* specInfo);
-de::MovePtr<vk::Allocation> bindImage (const vk::DeviceInterface& vk, const vk::VkDevice device, vk::Allocator& allocator, const vk::VkImage image, const vk::MemoryRequirement requirement);
-de::MovePtr<vk::Allocation> bindBuffer (const vk::DeviceInterface& vk, const vk::VkDevice device, vk::Allocator& allocator, const vk::VkBuffer buffer, const vk::MemoryRequirement requirement);
de::MovePtr<vk::Allocation> bindImageDedicated (const vk::InstanceInterface& vki, const vk::DeviceInterface& vkd, const vk::VkPhysicalDevice physDevice, const vk::VkDevice device, const vk::VkImage image, const vk::MemoryRequirement requirement);
de::MovePtr<vk::Allocation> bindBufferDedicated (const vk::InstanceInterface& vki, const vk::DeviceInterface& vkd, const vk::VkPhysicalDevice physDevice, const vk::VkDevice device, const vk::VkBuffer buffer, const vk::MemoryRequirement requirement);
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBase.hpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBase.hpp
index ed20661..af5d7d7 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBase.hpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBase.hpp
@@ -52,6 +52,9 @@
, m_imageMSParams(imageMSParams)
{}
+ virtual void checkSupport (Context&) const
+ {}
+
protected:
const ImageMSParams m_imageMSParams;
};
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleImageTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleImageTests.cpp
index a58b3a4..ef4efb3 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleImageTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleImageTests.cpp
@@ -480,12 +480,6 @@
return createSampler(vk, device, &samplerParams);
}
-inline Move<VkBuffer> makeBuffer (const DeviceInterface& vk, const VkDevice device, const VkDeviceSize bufferSize, const VkBufferUsageFlags usage)
-{
- const VkBufferCreateInfo bufferCreateInfo = makeBufferCreateInfo(bufferSize, usage);
- return createBuffer(vk, device, &bufferCreateInfo);
-}
-
inline VkImageSubresourceRange makeColorSubresourceRange (const int baseArrayLayer, const int layerCount)
{
return makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, static_cast<deUint32>(baseArrayLayer), static_cast<deUint32>(layerCount));
@@ -519,12 +513,6 @@
TCU_THROW(NotSupportedError, "Requested sample count is not supported");
}
-void zeroBuffer (const DeviceInterface& vk, const VkDevice device, const Allocation& alloc, const VkDeviceSize bufferSize)
-{
- deMemset(alloc.getHostPtr(), 0, static_cast<std::size_t>(bufferSize));
- flushAlloc(vk, device, alloc);
-}
-
//! The default foreground color.
inline Vec4 getPrimitiveColor (void)
{
@@ -871,51 +859,59 @@
std::ostringstream src;
src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
<< "\n"
- << "layout(location = 0) out int o_status;\n"
+ << "layout(location = 0) out uvec2 o_status;\n"
<< "\n"
<< "layout(set = 0, binding = 0) uniform " << samplerTypeStr << " colorTexture;\n"
<< "\n"
<< "void main(void)\n"
<< "{\n"
- << " int checksum = 0;\n"
+ << " uint clearColorCount = 0;\n"
+ << " uint primitiveColorCount = 0;\n"
<< "\n";
if (caseDef.numLayers == 1)
src << " for (int sampleNdx = 0; sampleNdx < " << caseDef.numSamples << "; ++sampleNdx) {\n"
<< " " << texelFormatStr << " color = texelFetch(colorTexture, ivec2(gl_FragCoord.xy), sampleNdx);\n"
- << " if (color == " << refClearColor << " || color == " << refPrimitiveColor << ")\n"
- << " ++checksum;\n"
+ << " if (color == " << refClearColor << ")\n"
+ << " ++clearColorCount;\n"
+ << " else if (color == " << refPrimitiveColor << ")\n"
+ << " ++primitiveColorCount;\n"
<< " }\n";
else
src << " for (int layerNdx = 0; layerNdx < " << caseDef.numLayers << "; ++layerNdx)\n"
<< " for (int sampleNdx = 0; sampleNdx < " << caseDef.numSamples << "; ++sampleNdx) {\n"
<< " " << texelFormatStr << " color = texelFetch(colorTexture, ivec3(gl_FragCoord.xy, layerNdx), sampleNdx);\n"
- << " if (color == " << refClearColor << " || color == " << refPrimitiveColor << ")\n"
- << " ++checksum;\n"
+ << " if (color == " << refClearColor << ")\n"
+ << " ++clearColorCount;\n"
+ << " else if (color == " << refPrimitiveColor << ")\n"
+ << " ++primitiveColorCount;\n"
<< " }\n";
src << "\n"
- << " o_status = checksum;\n"
+ << " o_status = uvec2(clearColorCount, primitiveColorCount);\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;
+
+ checkImageFormatRequirements(context.getInstanceInterface(), context.getPhysicalDevice(), caseDef.numSamples, caseDef.colorFormat, colorImageUsage);
+}
+
tcu::TestStatus test (Context& context, const CaseDef caseDef)
{
const DeviceInterface& vk = context.getDeviceInterface();
- const InstanceInterface& vki = context.getInstanceInterface();
const VkDevice device = context.getDevice();
- const VkPhysicalDevice physDevice = context.getPhysicalDevice();
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;
- checkImageFormatRequirements(vki, physDevice, caseDef.numSamples, caseDef.colorFormat, colorImageUsage);
-
{
tcu::TestLog& log = context.getTestContext().getLog();
log << tcu::LogSection("Description", "")
@@ -944,7 +940,7 @@
const Unique<VkSampler> colorSampler (makeSampler(vk, device));
// Checksum image
- const VkFormat checksumFormat = VK_FORMAT_R32_SINT;
+ const VkFormat checksumFormat = VK_FORMAT_R8G8_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));
@@ -1041,15 +1037,26 @@
{
invalidateAlloc(vk, device, *checksumBufferAlloc);
- const tcu::ConstPixelBufferAccess access(mapVkFormat(checksumFormat), caseDef.renderSize.x(), caseDef.renderSize.y(), 1, checksumBufferAlloc->getHostPtr());
- const int numExpectedChecksum = getNumSamples(caseDef.numSamples) * caseDef.numLayers;
+ const tcu::ConstPixelBufferAccess access (mapVkFormat(checksumFormat), caseDef.renderSize.x(), caseDef.renderSize.y(), 1, checksumBufferAlloc->getHostPtr());
+ const deUint32 numExpectedChecksum = getNumSamples(caseDef.numSamples) * caseDef.numLayers;
+ bool multipleColorsPerTexelFound = false;
for (int y = 0; y < caseDef.renderSize.y(); ++y)
for (int x = 0; x < caseDef.renderSize.x(); ++x)
{
- if (access.getPixelInt(x, y).x() != numExpectedChecksum)
+ deUint32 clearColorCount = access.getPixelUint(x, y).x();
+ deUint32 primitiveColorCount = access.getPixelUint(x, y).y();
+
+ if ((clearColorCount + primitiveColorCount) != numExpectedChecksum)
return tcu::TestStatus::fail("Some samples have incorrect color");
+
+ if ((clearColorCount > 0) && (primitiveColorCount > 0))
+ multipleColorsPerTexelFound = true;
}
+
+ // For a multisampled image, we are expecting some texels to have samples of both clear color and primitive color
+ if (!multipleColorsPerTexelFound)
+ return tcu::TestStatus::fail("Could not find texels with samples of both clear color and primitive color");
}
}
@@ -1318,16 +1325,19 @@
}
}
+void checkSupport (Context& context, const CaseDef caseDef)
+{
+ const VkImageUsageFlags colorImageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
+
+ checkImageFormatRequirements(context.getInstanceInterface(), context.getPhysicalDevice(), caseDef.numSamples, caseDef.colorFormat, colorImageUsage);
+}
+
tcu::TestStatus test (Context& context, const CaseDef caseDef)
{
const DeviceInterface& vk = context.getDeviceInterface();
- const InstanceInterface& vki = context.getInstanceInterface();
const VkDevice device = context.getDevice();
- const VkPhysicalDevice physDevice = context.getPhysicalDevice();
Allocator& allocator = context.getDefaultAllocator();
- checkImageFormatRequirements(vki, physDevice, caseDef.numSamples, caseDef.colorFormat, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_STORAGE_BIT);
-
{
tcu::TestLog& log = context.getTestContext().getLog();
log << tcu::LogSection("Description", "")
@@ -1384,6 +1394,7 @@
}
void addTestCasesWithFunctions (tcu::TestCaseGroup* group,
+ FunctionSupport1<CaseDef>::Function checkSupport,
FunctionPrograms1<CaseDef>::Function initPrograms,
FunctionInstance1<CaseDef>::Function testFunc)
{
@@ -1433,7 +1444,7 @@
samples[samplesNdx], // VkSampleCountFlagBits numSamples;
};
- addFunctionCaseWithPrograms(formatGroup.get(), caseName.str(), "", initPrograms, testFunc, caseDef);
+ addFunctionCaseWithPrograms(formatGroup.get(), caseName.str(), "", checkSupport, initPrograms, testFunc, caseDef);
}
sizeLayerGroup->addChild(formatGroup.release());
}
@@ -1443,12 +1454,12 @@
void createSampledImageTestsInGroup (tcu::TestCaseGroup* group)
{
- addTestCasesWithFunctions(group, SampledImage::initPrograms, SampledImage::test);
+ addTestCasesWithFunctions(group, SampledImage::checkSupport, SampledImage::initPrograms, SampledImage::test);
}
void createStorageImageTestsInGroup (tcu::TestCaseGroup* group)
{
- addTestCasesWithFunctions(group, StorageImage::initPrograms, StorageImage::test);
+ addTestCasesWithFunctions(group, StorageImage::checkSupport, StorageImage::initPrograms, StorageImage::test);
}
} // anonymous ns
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleInterpolationTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleInterpolationTests.cpp
index bf22de7..92e8b82 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleInterpolationTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleInterpolationTests.cpp
@@ -87,6 +87,7 @@
void init (void);
void initPrograms (vk::SourceCollections& programCollection) const;
+ virtual void checkSupport (Context&) const {}
TestInstance* createInstance (Context& context) const;
static MultisampleCaseBase* createCase (tcu::TestContext& testCtx,
const std::string& name,
@@ -225,10 +226,13 @@
programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
}
+template<> void MSCase<MSCaseSampleQualifierDistinctValues>::checkSupport (Context& context) const
+{
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SAMPLE_RATE_SHADING);
+}
+
template<> TestInstance* MSCase<MSCaseSampleQualifierDistinctValues>::createInstance (Context& context) const
{
- if (!context.getDeviceFeatures().sampleRateShading)
- TCU_THROW(NotSupportedError, "sampleRateShading support required");
return new MSInstance<MSInstanceDistinctValues>(context, m_imageMSParams);
}
@@ -287,11 +291,13 @@
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
{
- if (!context.getDeviceFeatures().sampleRateShading)
- TCU_THROW(NotSupportedError, "sampleRateShading support required");
-
return new MSInstance<MSInstanceDistinctValues>(context, m_imageMSParams);
}
@@ -412,11 +418,13 @@
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
{
- if (!context.getDeviceFeatures().sampleRateShading)
- TCU_THROW(NotSupportedError, "sampleRateShading support required");
-
return new MSInstance<MSInstanceInterpolateScreenPosition>(context, m_imageMSParams);
}
@@ -484,11 +492,13 @@
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
{
- if (!context.getDeviceFeatures().sampleRateShading)
- TCU_THROW(NotSupportedError, "sampleRateShading support required");
-
return new MSInstance<MSInstanceInterpolateScreenPosition>(context, m_imageMSParams);
}
@@ -555,11 +565,13 @@
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
{
- if (!context.getDeviceFeatures().sampleRateShading)
- TCU_THROW(NotSupportedError, "sampleRateShading support required");
-
return new MSInstance<MSInstanceInterpolateScreenPosition>(context, m_imageMSParams);
}
@@ -626,11 +638,13 @@
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
{
- if (!context.getDeviceFeatures().sampleRateShading)
- TCU_THROW(NotSupportedError, "sampleRateShading support required");
-
return new MSInstance<MSInstanceInterpolateScreenPosition>(context, m_imageMSParams);
}
@@ -704,11 +718,13 @@
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
{
- if (!context.getDeviceFeatures().sampleRateShading)
- TCU_THROW(NotSupportedError, "sampleRateShading support required");
-
return new MSInstance<MSInstanceInterpolateScreenPosition>(context, m_imageMSParams);
}
@@ -777,11 +793,13 @@
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
{
- if (!context.getDeviceFeatures().sampleRateShading)
- TCU_THROW(NotSupportedError, "sampleRateShading support required");
-
return new MSInstance<MSInstanceInterpolateScreenPosition>(context, m_imageMSParams);
}
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleSampleLocationsExtTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleSampleLocationsExtTests.cpp
index 7f24747..6067bd2 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleSampleLocationsExtTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleSampleLocationsExtTests.cpp
@@ -130,11 +130,17 @@
void addInstanceTestCaseWithPrograms (tcu::TestCaseGroup* group,
const std::string& name,
const std::string& desc,
+ typename FunctionSupport1<Arg0>::Function checkSupport,
typename FunctionProgramsSimple1<Arg0>::Function initPrograms,
Arg0 arg0)
{
- group->addChild(new InstanceFactory1<Instance, Arg0, FunctionProgramsSimple1<Arg0> >(
- group->getTestContext(), tcu::NODETYPE_SELF_VALIDATE, name, desc, FunctionProgramsSimple1<Arg0>(initPrograms), arg0));
+ group->addChild(new InstanceFactory1WithSupport<Instance, Arg0, FunctionSupport1<Arg0>, FunctionProgramsSimple1<Arg0> >(
+ group->getTestContext(), tcu::NODETYPE_SELF_VALIDATE, name, desc, FunctionProgramsSimple1<Arg0>(initPrograms), arg0, typename FunctionSupport1<Arg0>::Args(checkSupport, arg0)));
+}
+
+void checkSupportSampleLocations (Context& context)
+{
+ context.requireDeviceFunctionality("VK_EXT_sample_locations");
}
std::string getString (const VkSampleCountFlagBits sampleCount)
@@ -182,17 +188,6 @@
return 0u;
}
-//! Return NotSupported if required extensions are missing
-void requireExtensions (Context& context)
-{
- const InstanceInterface& vki = context.getInstanceInterface();
- const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
- const std::vector<VkExtensionProperties> supportedExtensions = enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
-
- if (!isExtensionSupported(supportedExtensions, RequiredExtension("VK_EXT_sample_locations")))
- TCU_THROW(NotSupportedError, "Missing extension: VK_EXT_sample_locations");
-}
-
VkPhysicalDeviceSampleLocationsPropertiesEXT getSampleLocationsPropertiesEXT (Context& context)
{
const InstanceInterface& vki = context.getInstanceInterface();
@@ -504,12 +499,6 @@
return createImage(vk, device, &imageParams);
}
-inline Move<VkBuffer> makeBuffer (const DeviceInterface& vk, const VkDevice device, const VkDeviceSize bufferSize, const VkBufferUsageFlags usage)
-{
- const VkBufferCreateInfo bufferCreateInfo = makeBufferCreateInfo(bufferSize, usage);
- return createBuffer(vk, device, &bufferCreateInfo);
-}
-
Move<VkEvent> makeEvent (const DeviceInterface& vk, const VkDevice device)
{
const VkEventCreateInfo createInfo =
@@ -1186,8 +1175,6 @@
//! Verify results of a VkPhysicalDeviceSampleLocationsPropertiesEXT query with VkPhysicalDeviceProperties2KHR
tcu::TestStatus testQuerySampleLocationProperties (Context& context)
{
- requireExtensions(context);
-
const VkPhysicalDeviceSampleLocationsPropertiesEXT sampleLocationsProperties = getSampleLocationsPropertiesEXT(context);
context.getTestContext().getLog()
@@ -1236,8 +1223,6 @@
//! Verify results of vkGetPhysicalDeviceMultisamplePropertiesEXT queries
tcu::TestStatus testQueryMultisampleProperties (Context& context)
{
- requireExtensions(context);
-
const InstanceInterface& vki = context.getInstanceInterface();
const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
tcu::TestLog& log = context.getTestContext().getLog();
@@ -1334,6 +1319,20 @@
TestOptionFlags options;
};
+void checkSupportVerifyTests (Context& context, const TestParams params)
+{
+ checkSupportSampleLocations(context);
+
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SAMPLE_RATE_SHADING);
+
+ if ((context.getDeviceProperties().limits.framebufferColorSampleCounts & params.numSamples) == 0u)
+ TCU_THROW(NotSupportedError, "framebufferColorSampleCounts: sample count not supported");
+
+ if ((getSampleLocationsPropertiesEXT(context).sampleLocationSampleCounts & params.numSamples) == 0u)
+ TCU_THROW(NotSupportedError, "VkPhysicalDeviceSampleLocationsPropertiesEXT: sample count not supported");
+}
+
+
std::string declareSampleDataSSBO (void)
{
std::ostringstream str;
@@ -1453,8 +1452,6 @@
, m_numVertices (0)
, m_currentGridNdx (0)
{
- requireExtensions(context);
-
VkMultisamplePropertiesEXT multisampleProperties =
{
VK_STRUCTURE_TYPE_MULTISAMPLE_PROPERTIES_EXT, // VkStructureType sType;
@@ -1477,18 +1474,6 @@
tcu::TestStatus iterate (void)
{
// Will be executed several times, for all possible pixel grid sizes
-
- const VkPhysicalDeviceLimits& limits = m_context.getDeviceProperties().limits;
-
- if (!m_context.getDeviceFeatures().sampleRateShading)
- TCU_THROW(NotSupportedError, "Missing feature: sampleRateShading");
-
- if ((limits.framebufferColorSampleCounts & m_params.numSamples) == 0u)
- TCU_THROW(NotSupportedError, "framebufferColorSampleCounts: sample count not supported");
-
- if ((m_sampleLocationsProperties.sampleLocationSampleCounts & m_params.numSamples) == 0u)
- TCU_THROW(NotSupportedError, "VkPhysicalDeviceSampleLocationsPropertiesEXT: sample count not supported");
-
if (!(currentGridSize().x() >= 1 && currentGridSize().y() >= 1))
return tcu::TestStatus::fail("maxSampleLocationGridSize is invalid");
@@ -1828,13 +1813,13 @@
params.numSamples = numSamples;
params.options = (TestOptionFlags)0;
- addInstanceTestCaseWithPrograms<Test>(group, getString(numSamples).c_str(), "", initPrograms, params);
+ addInstanceTestCaseWithPrograms<Test>(group, getString(numSamples).c_str(), "", checkSupportVerifyTests, initPrograms, params);
params.options = (TestOptionFlags)TEST_OPTION_DYNAMIC_STATE_BIT;
- addInstanceTestCaseWithPrograms<Test>(group, (getString(numSamples) + "_dynamic").c_str(), "", initPrograms, params);
+ addInstanceTestCaseWithPrograms<Test>(group, (getString(numSamples) + "_dynamic").c_str(), "", checkSupportVerifyTests, initPrograms, params);
params.options = (TestOptionFlags)TEST_OPTION_CLOSELY_PACKED_BIT;
- addInstanceTestCaseWithPrograms<Test>(group, (getString(numSamples) + "_packed").c_str(), "", initPrograms, params);
+ addInstanceTestCaseWithPrograms<Test>(group, (getString(numSamples) + "_packed").c_str(), "", checkSupportVerifyTests, initPrograms, params);
}
} // VerifySamples
@@ -1889,6 +1874,21 @@
TestImageAspect imageAspect;
};
+void checkSupportDrawTests (Context& context, const TestParams params)
+{
+ checkSupportSampleLocations(context);
+
+ if ((context.getDeviceProperties().limits.framebufferColorSampleCounts & params.numSamples) == 0u)
+ TCU_THROW(NotSupportedError, "framebufferColorSampleCounts: sample count not supported");
+
+ if ((getSampleLocationsPropertiesEXT(context).sampleLocationSampleCounts & params.numSamples) == 0u)
+ TCU_THROW(NotSupportedError, "VkPhysicalDeviceSampleLocationsPropertiesEXT: sample count not supported");
+
+ // 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");
+}
+
const char* getString (const TestImageAspect aspect)
{
switch (aspect)
@@ -2003,8 +2003,6 @@
, m_depthStencilFormat (VK_FORMAT_UNDEFINED)
, m_depthStencilAspect (0)
{
- requireExtensions(context);
-
VkMultisamplePropertiesEXT multisampleProperties =
{
VK_STRUCTURE_TYPE_MULTISAMPLE_PROPERTIES_EXT, // VkStructureType sType;
@@ -2022,22 +2020,8 @@
tcu::TestStatus iterate (void)
{
// Requirements
- {
- const VkPhysicalDeviceLimits& limits = m_context.getDeviceProperties().limits;
-
- if ((limits.framebufferColorSampleCounts & m_params.numSamples) == 0u)
- TCU_THROW(NotSupportedError, "framebufferColorSampleCounts: sample count not supported");
-
- if ((m_sampleLocationsProperties.sampleLocationSampleCounts & m_params.numSamples) == 0u)
- TCU_THROW(NotSupportedError, "VkPhysicalDeviceSampleLocationsPropertiesEXT: sample count not supported");
-
- if (!(m_gridSize.x() >= 1 && m_gridSize.y() >= 1))
- return tcu::TestStatus::fail("maxSampleLocationGridSize is invalid");
-
- // Are we allowed to modify the sample pattern within the same subpass?
- if (m_params.drawIn == TEST_DRAW_IN_SAME_SUBPASS && !useSameSamplePattern() && !m_sampleLocationsProperties.variableSampleLocations)
- TCU_THROW(NotSupportedError, "VkPhysicalDeviceSampleLocationsPropertiesEXT: variableSampleLocations not supported");
- }
+ if (!(m_gridSize.x() >= 1 && m_gridSize.y() >= 1))
+ return tcu::TestStatus::fail("maxSampleLocationGridSize is invalid");
// Images
{
@@ -3114,8 +3098,8 @@
{
MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(rootGroup->getTestContext(), "query", ""));
- addFunctionCase(group.get(), "sample_locations_properties", "", testQuerySampleLocationProperties);
- addFunctionCase(group.get(), "multisample_properties", "", testQueryMultisampleProperties);
+ addFunctionCase(group.get(), "sample_locations_properties", "", checkSupportSampleLocations, testQuerySampleLocationProperties);
+ addFunctionCase(group.get(), "multisample_properties", "", checkSupportSampleLocations, testQueryMultisampleProperties);
rootGroup->addChild(group.release());
}
@@ -3230,7 +3214,7 @@
<< getString(params.clears) << (params.options != 0 ? "_" : "")
<< getTestOptionFlagsString(params.options);
- addInstanceTestCaseWithPrograms<DrawTest>(samplesGroup.get(), caseName.str().c_str(), "", initPrograms, params);
+ addInstanceTestCaseWithPrograms<DrawTest>(samplesGroup.get(), caseName.str().c_str(), "", checkSupportDrawTests, initPrograms, params);
}
aspectGroup->addChild(samplesGroup.release());
}
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleTests.cpp
index a0b7b73..e184950 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleTests.cpp
@@ -109,12 +109,6 @@
ImageBackingMode backingMode;
};
-void checkLargePointsSupport (Context& context, VkPrimitiveTopology topology, float pointSize)
-{
- if (topology == VK_PRIMITIVE_TOPOLOGY_POINT_LIST && pointSize > 1.0f && !context.getDeviceFeatures().largePoints)
- TCU_THROW(NotSupportedError, "Large points feature not supported.");
-}
-
void initMultisamplePrograms (SourceCollections& sources, MultisampleTestParams params);
bool isSupportedSampleCount (const InstanceInterface& instanceInterface, VkPhysicalDevice physicalDevice, VkSampleCountFlagBits rasterizationSamples);
bool isSupportedDepthStencilFormat (const InstanceInterface& vki, const VkPhysicalDevice physDevice, const VkFormat format);
@@ -141,6 +135,7 @@
virtual void initPrograms (SourceCollections& programCollection) const;
virtual TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
protected:
virtual TestInstance* createMultisampleTestInstance (Context& context,
@@ -194,11 +189,13 @@
float minSampleShading,
GeometryType geometryType,
float pointSize,
- ImageBackingMode backingMode);
+ ImageBackingMode backingMode,
+ const bool minSampleShadingEnabled = true);
virtual ~MinSampleShadingTest (void) {}
protected:
virtual void initPrograms (SourceCollections& programCollection) const;
+ virtual void checkSupport (Context& context) const;
virtual TestInstance* createMultisampleTestInstance (Context& context,
VkPrimitiveTopology topology,
float pointSize,
@@ -206,10 +203,13 @@
const VkPipelineMultisampleStateCreateInfo& multisampleStateParams,
const VkPipelineColorBlendAttachmentState& colorBlendState) const;
- static VkPipelineMultisampleStateCreateInfo getMinSampleShadingStateParams (VkSampleCountFlagBits rasterizationSamples, float minSampleShading);
+ static VkPipelineMultisampleStateCreateInfo getMinSampleShadingStateParams (VkSampleCountFlagBits rasterizationSamples,
+ float minSampleShading,
+ bool minSampleShadingEnabled);
const float m_pointSize;
const ImageBackingMode m_backingMode;
+ const bool m_minSampleShadingEnabled;
};
class SampleMaskTest : public MultisampleTest
@@ -251,6 +251,7 @@
virtual ~AlphaToOneTest (void) {}
protected:
+ virtual void checkSupport (Context& context) const;
virtual TestInstance* createMultisampleTestInstance (Context& context,
VkPrimitiveTopology topology,
float pointSize,
@@ -357,6 +358,7 @@
void initPrograms (SourceCollections& programCollection) const;
TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
private:
const VkSampleCountFlagBits m_rasterizationSamples;
const bool m_enablePostDepthCoverage;
@@ -524,6 +526,23 @@
const ImageBackingMode m_backingMode;
};
+class MinSampleShadingDisabledInstance : public MinSampleShadingInstance
+{
+public:
+ MinSampleShadingDisabledInstance (Context& context,
+ VkPrimitiveTopology topology,
+ float pointSize,
+ const std::vector<Vertex4RGBA>& vertices,
+ const VkPipelineMultisampleStateCreateInfo& multisampleStateParams,
+ const VkPipelineColorBlendAttachmentState& blendState,
+ ImageBackingMode backingMode);
+ virtual ~MinSampleShadingDisabledInstance (void) {}
+
+protected:
+ virtual tcu::TestStatus verifySampleShadedImage (const std::vector<tcu::TextureLevel>& sampleShadedImages,
+ const tcu::ConstPixelBufferAccess& noSampleshadingImage);
+};
+
class SampleMaskInstance : public vkt::TestInstance
{
public:
@@ -1094,6 +1113,11 @@
return createMultisampleTestInstance(context, getPrimitiveTopology(m_geometryType), m_pointSize, generateVertices(m_geometryType), m_multisampleStateParams, m_colorBlendState);
}
+void MultisampleTest::checkSupport (Context& context) const
+{
+ if (m_geometryType == GEOMETRY_TYPE_OPAQUE_POINT && m_pointSize > 1.0f)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_LARGE_POINTS);
+}
// RasterizationSamplesTest
@@ -1149,13 +1173,22 @@
float minSampleShading,
GeometryType geometryType,
float pointSize,
- ImageBackingMode backingMode)
- : MultisampleTest (testContext, name, description, getMinSampleShadingStateParams(rasterizationSamples, minSampleShading), getDefaultColorBlendAttachmentState(), geometryType, pointSize, backingMode)
- , m_pointSize (pointSize)
- , m_backingMode (backingMode)
+ ImageBackingMode backingMode,
+ const bool minSampleShadingEnabled)
+ : MultisampleTest (testContext, name, description, getMinSampleShadingStateParams(rasterizationSamples, minSampleShading, minSampleShadingEnabled), getDefaultColorBlendAttachmentState(), geometryType, pointSize, backingMode)
+ , m_pointSize (pointSize)
+ , m_backingMode (backingMode)
+ , m_minSampleShadingEnabled (minSampleShadingEnabled)
{
}
+void MinSampleShadingTest::checkSupport (Context& context) const
+{
+ MultisampleTest::checkSupport(context);
+
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SAMPLE_RATE_SHADING);
+}
+
void MinSampleShadingTest::initPrograms (SourceCollections& programCollection) const
{
MultisampleTestParams params = {m_geometryType, m_pointSize, m_backingMode};
@@ -1169,10 +1202,13 @@
const VkPipelineMultisampleStateCreateInfo& multisampleStateParams,
const VkPipelineColorBlendAttachmentState& colorBlendState) const
{
- return new MinSampleShadingInstance(context, topology, pointSize, vertices, multisampleStateParams, colorBlendState, m_backingMode);
+ if (m_minSampleShadingEnabled)
+ return new MinSampleShadingInstance(context, topology, pointSize, vertices, multisampleStateParams, colorBlendState, m_backingMode);
+ else
+ return new MinSampleShadingDisabledInstance(context, topology, pointSize, vertices, multisampleStateParams, colorBlendState, m_backingMode);
}
-VkPipelineMultisampleStateCreateInfo MinSampleShadingTest::getMinSampleShadingStateParams (VkSampleCountFlagBits rasterizationSamples, float minSampleShading)
+VkPipelineMultisampleStateCreateInfo MinSampleShadingTest::getMinSampleShadingStateParams (VkSampleCountFlagBits rasterizationSamples, float minSampleShading, bool minSampleShadingEnabled)
{
const VkPipelineMultisampleStateCreateInfo multisampleStateParams =
{
@@ -1180,7 +1216,7 @@
DE_NULL, // const void* pNext;
0u, // VkPipelineMultisampleStateCreateFlags flags;
rasterizationSamples, // VkSampleCountFlagBits rasterizationSamples;
- true, // VkBool32 sampleShadingEnable;
+ minSampleShadingEnabled ? VK_TRUE : VK_FALSE, // VkBool32 sampleShadingEnable;
minSampleShading, // float minSampleShading;
DE_NULL, // const VkSampleMask* pSampleMask;
false, // VkBool32 alphaToCoverageEnable;
@@ -1248,6 +1284,13 @@
{
}
+void AlphaToOneTest::checkSupport (Context& context) const
+{
+ MultisampleTest::checkSupport(context);
+
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_ALPHA_TO_ONE);
+}
+
TestInstance* AlphaToOneTest::createMultisampleTestInstance (Context& context,
VkPrimitiveTopology topology,
float pointSize,
@@ -1443,6 +1486,14 @@
{
}
+void SampleMaskWithDepthTestTest::checkSupport (Context& context) const
+{
+ if (!context.getDeviceProperties().limits.standardSampleLocations)
+ TCU_THROW(NotSupportedError, "standardSampleLocations required");
+
+ context.requireDeviceFunctionality("VK_EXT_post_depth_coverage");
+}
+
void SampleMaskWithDepthTestTest::initPrograms (SourceCollections& programCollection) const
{
DE_ASSERT((int)m_rasterizationSamples <= 32);
@@ -1505,8 +1556,6 @@
, m_fullQuadVertices (generateVertices(GEOMETRY_TYPE_OPAQUE_QUAD_NONZERO_DEPTH))
, m_modeFlags (modeFlags)
{
- checkLargePointsSupport(context, topology, pointSize);
-
if (m_modeFlags != 0)
{
const bool useDepth = (m_modeFlags & TEST_MODE_DEPTH_BIT) != 0;
@@ -1612,14 +1661,7 @@
, m_colorBlendState (colorBlendState)
, m_backingMode (backingMode)
{
- checkLargePointsSupport(context, topology, pointSize);
-
- VkPhysicalDeviceFeatures deviceFeatures;
-
- m_context.getInstanceInterface().getPhysicalDeviceFeatures(m_context.getPhysicalDevice(), &deviceFeatures);
-
- if (!deviceFeatures.sampleRateShading)
- throw tcu::NotSupportedError("Sample shading is not supported");
+ DE_UNREF(pointSize);
}
tcu::TestStatus MinSampleShadingInstance::iterate (void)
@@ -1729,6 +1771,70 @@
return tcu::TestStatus::pass("Got proper count of unique colors");
}
+MinSampleShadingDisabledInstance::MinSampleShadingDisabledInstance (Context& context,
+ VkPrimitiveTopology topology,
+ float pointSize,
+ const std::vector<Vertex4RGBA>& vertices,
+ const VkPipelineMultisampleStateCreateInfo& multisampleStateParams,
+ const VkPipelineColorBlendAttachmentState& blendState,
+ ImageBackingMode backingMode)
+ : MinSampleShadingInstance (context, topology, pointSize, vertices, multisampleStateParams, blendState, backingMode)
+{
+}
+
+tcu::TestStatus MinSampleShadingDisabledInstance::verifySampleShadedImage (const std::vector<tcu::TextureLevel>& sampleShadedImages,
+ const tcu::ConstPixelBufferAccess& noSampleshadingImage)
+{
+ const deUint32 samplesCount = (int)sampleShadedImages.size();
+ const deUint32 width = noSampleshadingImage.getWidth();
+ const deUint32 height = noSampleshadingImage.getHeight();
+ const deUint32 depth = noSampleshadingImage.getDepth();
+ const tcu::UVec4 zeroPixel = tcu::UVec4();
+ bool anyPixelCovered = false;
+
+ DE_ASSERT(depth == 1);
+ DE_UNREF(depth);
+
+ for (deUint32 y = 0; y < height; ++y)
+ for (deUint32 x = 0; x < width; ++x)
+ {
+ const tcu::UVec4 noSampleShadingValue = noSampleshadingImage.getPixelUint(x, y);
+
+ if (noSampleShadingValue == zeroPixel)
+ continue;
+
+ anyPixelCovered = true;
+ tcu::UVec4 sampleShadingValue = tcu::UVec4();
+
+ // Collect histogram of occurrences or each pixel across all samples
+ for (size_t i = 0; i < samplesCount; ++i)
+ {
+ const tcu::UVec4 sampleShadedValue = sampleShadedImages[i].getAccess().getPixelUint(x, y);
+
+ sampleShadingValue += sampleShadedValue;
+ }
+
+ sampleShadingValue = sampleShadingValue / samplesCount;
+
+ if (sampleShadingValue.w() != 255)
+ {
+ return tcu::TestStatus::fail("Invalid Alpha channel value");
+ }
+
+ if (sampleShadingValue != noSampleShadingValue)
+ {
+ return tcu::TestStatus::fail("Invalid color");
+ }
+ }
+
+ if (!anyPixelCovered)
+ {
+ return tcu::TestStatus::fail("Did not get any covered pixel, cannot test minSampleShadingDisabled");
+ }
+
+ return tcu::TestStatus::pass("Got proper count of unique colors");
+}
+
SampleMaskInstance::SampleMaskInstance (Context& context,
VkPrimitiveTopology topology,
float pointSize,
@@ -1745,7 +1851,7 @@
, m_colorBlendState (blendState)
, m_backingMode (backingMode)
{
- checkLargePointsSupport(context, topology, pointSize);
+ DE_UNREF(pointSize);
}
tcu::TestStatus SampleMaskInstance::iterate (void)
@@ -1900,12 +2006,6 @@
, m_colorBlendState (blendState)
, m_backingMode (backingMode)
{
- VkPhysicalDeviceFeatures deviceFeatures;
-
- context.getInstanceInterface().getPhysicalDeviceFeatures(context.getPhysicalDevice(), &deviceFeatures);
-
- if (!deviceFeatures.alphaToOne)
- throw tcu::NotSupportedError("Alpha-to-one is not supported");
}
tcu::TestStatus AlphaToOneInstance::iterate (void)
@@ -2157,14 +2257,6 @@
, m_imageBackingMode (IMAGE_BACKING_MODE_REGULAR)
, m_depthClearValue (0.667f)
{
- if (!m_context.getDeviceProperties().limits.standardSampleLocations)
- TCU_THROW(NotSupportedError, "standardSampleLocations required");
-
- std::vector<VkExtensionProperties> supportedExtensions = enumerateDeviceExtensionProperties(context.getInstanceInterface(), context.getPhysicalDevice(), DE_NULL);
-
- if (!isExtensionSupported(supportedExtensions, RequiredExtension("VK_EXT_post_depth_coverage")))
- TCU_THROW(NotSupportedError, "VK_EXT_post_depth_coverage not supported");
-
m_refCoverageAfterDepthTest[VK_SAMPLE_COUNT_2_BIT] = SampleCoverage(1u, 1u); // !< Sample coverage of the diagonally halved pixel,
m_refCoverageAfterDepthTest[VK_SAMPLE_COUNT_4_BIT] = SampleCoverage(2u, 2u); // !< with max possible subPixelPrecisionBits threshold
m_refCoverageAfterDepthTest[VK_SAMPLE_COUNT_8_BIT] = SampleCoverage(2u, 6u); // !<
@@ -3553,37 +3645,91 @@
{ "min_1_0", 1.0f }
};
- de::MovePtr<tcu::TestCaseGroup> minSampleShadingTests(new tcu::TestCaseGroup(testCtx, "min_sample_shading", ""));
-
- for (int configNdx = 0; configNdx < DE_LENGTH_OF_ARRAY(testConfigs); configNdx++)
{
- const TestConfig& testConfig = testConfigs[configNdx];
- de::MovePtr<tcu::TestCaseGroup> minShadingValueTests (new tcu::TestCaseGroup(testCtx, testConfigs[configNdx].name, ""));
+ de::MovePtr<tcu::TestCaseGroup> minSampleShadingTests(new tcu::TestCaseGroup(testCtx, "min_sample_shading", ""));
- for (int samplesNdx = 0; samplesNdx < DE_LENGTH_OF_ARRAY(samples); samplesNdx++)
+ for (int configNdx = 0; configNdx < DE_LENGTH_OF_ARRAY(testConfigs); configNdx++)
{
- std::ostringstream caseName;
- caseName << "samples_" << samples[samplesNdx];
+ const TestConfig& testConfig = testConfigs[configNdx];
+ de::MovePtr<tcu::TestCaseGroup> minShadingValueTests (new tcu::TestCaseGroup(testCtx, testConfigs[configNdx].name, ""));
- de::MovePtr<tcu::TestCaseGroup> samplesTests (new tcu::TestCaseGroup(testCtx, caseName.str().c_str(), ""));
+ for (int samplesNdx = 0; samplesNdx < DE_LENGTH_OF_ARRAY(samples); samplesNdx++)
+ {
+ std::ostringstream caseName;
+ caseName << "samples_" << samples[samplesNdx];
- samplesTests->addChild(new MinSampleShadingTest(testCtx, "primitive_triangle", "", samples[samplesNdx], testConfig.minSampleShading, GEOMETRY_TYPE_OPAQUE_TRIANGLE, 1.0f, IMAGE_BACKING_MODE_REGULAR));
- samplesTests->addChild(new MinSampleShadingTest(testCtx, "primitive_line", "", samples[samplesNdx], testConfig.minSampleShading, GEOMETRY_TYPE_OPAQUE_LINE, 1.0f, IMAGE_BACKING_MODE_REGULAR));
- samplesTests->addChild(new MinSampleShadingTest(testCtx, "primitive_point_1px", "", samples[samplesNdx], testConfig.minSampleShading, GEOMETRY_TYPE_OPAQUE_POINT, 1.0f, IMAGE_BACKING_MODE_REGULAR));
- samplesTests->addChild(new MinSampleShadingTest(testCtx, "primitive_point", "", samples[samplesNdx], testConfig.minSampleShading, GEOMETRY_TYPE_OPAQUE_POINT, 3.0f, IMAGE_BACKING_MODE_REGULAR));
+ de::MovePtr<tcu::TestCaseGroup> samplesTests (new tcu::TestCaseGroup(testCtx, caseName.str().c_str(), ""));
- samplesTests->addChild(new MinSampleShadingTest(testCtx, "primitive_triangle_sparse", "", samples[samplesNdx], testConfig.minSampleShading, GEOMETRY_TYPE_OPAQUE_TRIANGLE, 1.0f, IMAGE_BACKING_MODE_SPARSE));
- samplesTests->addChild(new MinSampleShadingTest(testCtx, "primitive_line_sparse", "", samples[samplesNdx], testConfig.minSampleShading, GEOMETRY_TYPE_OPAQUE_LINE, 1.0f, IMAGE_BACKING_MODE_SPARSE));
- samplesTests->addChild(new MinSampleShadingTest(testCtx, "primitive_point_1px_sparse", "", samples[samplesNdx], testConfig.minSampleShading, GEOMETRY_TYPE_OPAQUE_POINT, 1.0f, IMAGE_BACKING_MODE_SPARSE));
- samplesTests->addChild(new MinSampleShadingTest(testCtx, "primitive_point_sparse", "", samples[samplesNdx], testConfig.minSampleShading, GEOMETRY_TYPE_OPAQUE_POINT, 3.0f, IMAGE_BACKING_MODE_SPARSE));
+ samplesTests->addChild(new MinSampleShadingTest(testCtx, "primitive_triangle", "", samples[samplesNdx], testConfig.minSampleShading, GEOMETRY_TYPE_OPAQUE_TRIANGLE, 1.0f, IMAGE_BACKING_MODE_REGULAR));
+ samplesTests->addChild(new MinSampleShadingTest(testCtx, "primitive_line", "", samples[samplesNdx], testConfig.minSampleShading, GEOMETRY_TYPE_OPAQUE_LINE, 1.0f, IMAGE_BACKING_MODE_REGULAR));
+ samplesTests->addChild(new MinSampleShadingTest(testCtx, "primitive_point_1px", "", samples[samplesNdx], testConfig.minSampleShading, GEOMETRY_TYPE_OPAQUE_POINT, 1.0f, IMAGE_BACKING_MODE_REGULAR));
+ samplesTests->addChild(new MinSampleShadingTest(testCtx, "primitive_point", "", samples[samplesNdx], testConfig.minSampleShading, GEOMETRY_TYPE_OPAQUE_POINT, 3.0f, IMAGE_BACKING_MODE_REGULAR));
- minShadingValueTests->addChild(samplesTests.release());
+ samplesTests->addChild(new MinSampleShadingTest(testCtx, "primitive_triangle_sparse", "", samples[samplesNdx], testConfig.minSampleShading, GEOMETRY_TYPE_OPAQUE_TRIANGLE, 1.0f, IMAGE_BACKING_MODE_SPARSE));
+ samplesTests->addChild(new MinSampleShadingTest(testCtx, "primitive_line_sparse", "", samples[samplesNdx], testConfig.minSampleShading, GEOMETRY_TYPE_OPAQUE_LINE, 1.0f, IMAGE_BACKING_MODE_SPARSE));
+ samplesTests->addChild(new MinSampleShadingTest(testCtx, "primitive_point_1px_sparse", "", samples[samplesNdx], testConfig.minSampleShading, GEOMETRY_TYPE_OPAQUE_POINT, 1.0f, IMAGE_BACKING_MODE_SPARSE));
+ samplesTests->addChild(new MinSampleShadingTest(testCtx, "primitive_point_sparse", "", samples[samplesNdx], testConfig.minSampleShading, GEOMETRY_TYPE_OPAQUE_POINT, 3.0f, IMAGE_BACKING_MODE_SPARSE));
+
+ minShadingValueTests->addChild(samplesTests.release());
+ }
+
+ minSampleShadingTests->addChild(minShadingValueTests.release());
}
- minSampleShadingTests->addChild(minShadingValueTests.release());
+ multisampleTests->addChild(minSampleShadingTests.release());
}
- multisampleTests->addChild(minSampleShadingTests.release());
+ {
+ de::MovePtr<tcu::TestCaseGroup> minSampleShadingTests(new tcu::TestCaseGroup(testCtx, "min_sample_shading_enabled", ""));
+
+ for (int configNdx = 0; configNdx < DE_LENGTH_OF_ARRAY(testConfigs); configNdx++)
+ {
+ const TestConfig& testConfig = testConfigs[configNdx];
+ de::MovePtr<tcu::TestCaseGroup> minShadingValueTests (new tcu::TestCaseGroup(testCtx, testConfigs[configNdx].name, ""));
+
+ for (int samplesNdx = 0; samplesNdx < DE_LENGTH_OF_ARRAY(samples); samplesNdx++)
+ {
+ std::ostringstream caseName;
+ caseName << "samples_" << samples[samplesNdx];
+
+ de::MovePtr<tcu::TestCaseGroup> samplesTests (new tcu::TestCaseGroup(testCtx, caseName.str().c_str(), ""));
+
+ samplesTests->addChild(new MinSampleShadingTest(testCtx, "quad", "", samples[samplesNdx], testConfig.minSampleShading, GEOMETRY_TYPE_OPAQUE_QUAD, 1.0f, IMAGE_BACKING_MODE_REGULAR, true));
+
+ minShadingValueTests->addChild(samplesTests.release());
+ }
+
+ minSampleShadingTests->addChild(minShadingValueTests.release());
+ }
+
+ multisampleTests->addChild(minSampleShadingTests.release());
+ }
+
+ {
+ de::MovePtr<tcu::TestCaseGroup> minSampleShadingTests(new tcu::TestCaseGroup(testCtx, "min_sample_shading_disabled", ""));
+
+ for (int configNdx = 0; configNdx < DE_LENGTH_OF_ARRAY(testConfigs); configNdx++)
+ {
+ const TestConfig& testConfig = testConfigs[configNdx];
+ de::MovePtr<tcu::TestCaseGroup> minShadingValueTests (new tcu::TestCaseGroup(testCtx, testConfigs[configNdx].name, ""));
+
+ for (int samplesNdx = 0; samplesNdx < DE_LENGTH_OF_ARRAY(samples); samplesNdx++)
+ {
+ std::ostringstream caseName;
+ caseName << "samples_" << samples[samplesNdx];
+
+ de::MovePtr<tcu::TestCaseGroup> samplesTests (new tcu::TestCaseGroup(testCtx, caseName.str().c_str(), ""));
+
+ samplesTests->addChild(new MinSampleShadingTest(testCtx, "quad", "", samples[samplesNdx], testConfig.minSampleShading, GEOMETRY_TYPE_OPAQUE_QUAD, 1.0f, IMAGE_BACKING_MODE_REGULAR, false));
+
+ minShadingValueTests->addChild(samplesTests.release());
+ }
+
+ minSampleShadingTests->addChild(minShadingValueTests.release());
+ }
+
+ multisampleTests->addChild(minSampleShadingTests.release());
+ }
}
// SampleMask tests
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelinePushDescriptorTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelinePushDescriptorTests.cpp
index bba7a52..d407d96 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelinePushDescriptorTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelinePushDescriptorTests.cpp
@@ -29,6 +29,7 @@
#include "vktPipelineVertexUtil.hpp"
#include "vktPipelineReferenceRenderer.hpp"
#include "vktTestCase.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkImageUtil.hpp"
#include "vkMemUtil.hpp"
#include "vkPrograms.hpp"
@@ -82,20 +83,13 @@
}
}
-Move<VkInstance> createInstanceWithGetPhysicalDeviceProperties2 (const Context& context,
- const PlatformInterface& vkp,
- const Extensions& supportedExtensions)
+CustomInstance createInstanceWithGetPhysicalDeviceProperties2 (Context& context,
+ const Extensions& supportedExtensions)
{
vector<string> requiredExtensions = { "VK_KHR_get_physical_device_properties2" };
checkAllSupported(supportedExtensions, requiredExtensions);
- vector<string> enabledLayers;
- if (context.getTestContext().getCommandLine().isValidationEnabled())
- {
- enabledLayers = vkt::getValidationLayers(vkp);
- }
-
- return createDefaultInstance(vkp, context.getUsedApiVersion(), enabledLayers, requiredExtensions);
+ return createCustomInstanceWithExtensions(context, requiredExtensions);
}
const char *innerCString(const string &str)
@@ -133,15 +127,6 @@
transform(begin(requiredExtensionsStr), end(requiredExtensionsStr), back_inserter(requiredExtensions), innerCString);
// Enable validation layers on this device if validation has been requested from the command line.
- vector<string> enabledLayersStr;
- vector<const char*> enabledLayers;
- if (context.getTestContext().getCommandLine().isValidationEnabled())
- {
- // We need the contents of enabledLayersStr as a vector<const char*> in VkDeviceCreateInfo.
- enabledLayersStr = vkt::getValidationLayers(vki, physicalDevice);
- transform(begin(enabledLayersStr), end(enabledLayersStr), back_inserter(enabledLayers), innerCString);
- }
-
const VkDeviceCreateInfo deviceParams =
{
VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
@@ -149,14 +134,14 @@
(VkDeviceCreateFlags)0,
1u,
&queueInfo,
- static_cast<deUint32>(enabledLayers.size()),
- (enabledLayers.empty() ? DE_NULL : enabledLayers.data()),
+ 0u,
+ DE_NULL,
static_cast<deUint32>(requiredExtensions.size()),
(requiredExtensions.empty() ? DE_NULL : requiredExtensions.data()),
&features
};
- return createDevice(vkp, instance, vki, physicalDevice, &deviceParams, DE_NULL);
+ return createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), vkp, instance, vki, physicalDevice, &deviceParams, DE_NULL);
}
deUint32 findQueueFamilyIndexWithCaps (const InstanceInterface& vkInstance, VkPhysicalDevice physicalDevice, VkQueueFlags requiredCaps)
@@ -239,8 +224,8 @@
const TestParams m_params;
const PlatformInterface& m_vkp;
const Extensions m_instanceExtensions;
- const Unique<VkInstance> m_instance;
- const InstanceDriver m_vki;
+ const CustomInstance m_instance;
+ const InstanceDriver& m_vki;
const VkPhysicalDevice m_physicalDevice;
const deUint32 m_queueFamilyIndex;
const Extensions m_deviceExtensions;
@@ -274,13 +259,13 @@
, m_params (params)
, m_vkp (context.getPlatformInterface())
, m_instanceExtensions (enumerateInstanceExtensionProperties(m_vkp, DE_NULL))
- , m_instance (createInstanceWithGetPhysicalDeviceProperties2(context, m_vkp, m_instanceExtensions))
- , m_vki (m_vkp, *m_instance)
- , m_physicalDevice (chooseDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
+ , m_instance (createInstanceWithGetPhysicalDeviceProperties2(context, m_instanceExtensions))
+ , m_vki (m_instance.getDriver())
+ , m_physicalDevice (chooseDevice(m_vki, m_instance, context.getTestContext().getCommandLine()))
, m_queueFamilyIndex (findQueueFamilyIndexWithCaps(m_vki, m_physicalDevice, VK_QUEUE_GRAPHICS_BIT))
, m_deviceExtensions (enumerateDeviceExtensionProperties(m_vki, m_physicalDevice, DE_NULL))
- , 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_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_allocator (m_vkd, *m_device, getPhysicalDeviceMemoryProperties(m_vki, m_physicalDevice))
, m_renderSize (32, 32)
@@ -700,8 +685,8 @@
const TestParams m_params;
const PlatformInterface& m_vkp;
const Extensions m_instanceExtensions;
- const Unique<VkInstance> m_instance;
- const InstanceDriver m_vki;
+ const CustomInstance m_instance;
+ const InstanceDriver& m_vki;
const VkPhysicalDevice m_physicalDevice;
const deUint32 m_queueFamilyIndex;
const Extensions m_deviceExtensions;
@@ -727,13 +712,13 @@
, m_params (params)
, m_vkp (context.getPlatformInterface())
, m_instanceExtensions (enumerateInstanceExtensionProperties(m_vkp, DE_NULL))
- , m_instance (createInstanceWithGetPhysicalDeviceProperties2(context, m_vkp, m_instanceExtensions))
- , m_vki (m_vkp, *m_instance)
- , m_physicalDevice (chooseDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
+ , m_instance (createInstanceWithGetPhysicalDeviceProperties2(context, m_instanceExtensions))
+ , m_vki (m_instance.getDriver())
+ , m_physicalDevice (chooseDevice(m_vki, m_instance, context.getTestContext().getCommandLine()))
, m_queueFamilyIndex (findQueueFamilyIndexWithCaps(m_vki, m_physicalDevice, VK_QUEUE_COMPUTE_BIT))
, m_deviceExtensions (enumerateDeviceExtensionProperties(m_vki, m_physicalDevice, DE_NULL))
- , 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_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_allocator (m_vkd, *m_device, getPhysicalDeviceMemoryProperties(m_vki, m_physicalDevice))
{
@@ -1039,8 +1024,8 @@
const TestParams m_params;
const PlatformInterface& m_vkp;
const Extensions m_instanceExtensions;
- const Unique<VkInstance> m_instance;
- const InstanceDriver m_vki;
+ const CustomInstance m_instance;
+ const InstanceDriver& m_vki;
const VkPhysicalDevice m_physicalDevice;
const deUint32 m_queueFamilyIndex;
const Extensions m_deviceExtensions;
@@ -1078,13 +1063,13 @@
, m_params (params)
, m_vkp (context.getPlatformInterface())
, m_instanceExtensions (enumerateInstanceExtensionProperties(m_vkp, DE_NULL))
- , m_instance (createInstanceWithGetPhysicalDeviceProperties2(context, m_vkp, m_instanceExtensions))
- , m_vki (m_vkp, *m_instance)
- , m_physicalDevice (chooseDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
+ , m_instance (createInstanceWithGetPhysicalDeviceProperties2(context, m_instanceExtensions))
+ , m_vki (m_instance.getDriver())
+ , m_physicalDevice (chooseDevice(m_vki, m_instance, context.getTestContext().getCommandLine()))
, m_queueFamilyIndex (findQueueFamilyIndexWithCaps(m_vki, m_physicalDevice, VK_QUEUE_GRAPHICS_BIT))
, m_deviceExtensions (enumerateDeviceExtensionProperties(m_vki, m_physicalDevice, DE_NULL))
- , 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_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_allocator (m_vkd, *m_device, getPhysicalDeviceMemoryProperties(m_vki, m_physicalDevice))
, m_renderSize (32, 32)
@@ -1891,8 +1876,8 @@
const TestParams m_params;
const PlatformInterface& m_vkp;
const Extensions m_instanceExtensions;
- const Unique<VkInstance> m_instance;
- const InstanceDriver m_vki;
+ const CustomInstance m_instance;
+ const InstanceDriver& m_vki;
const VkPhysicalDevice m_physicalDevice;
const deUint32 m_queueFamilyIndex;
const Extensions m_deviceExtensions;
@@ -1923,13 +1908,13 @@
, m_params (params)
, m_vkp (context.getPlatformInterface())
, m_instanceExtensions (enumerateInstanceExtensionProperties(m_vkp, DE_NULL))
- , m_instance (createInstanceWithGetPhysicalDeviceProperties2(context, m_vkp, m_instanceExtensions))
- , m_vki (m_vkp, *m_instance)
- , m_physicalDevice (chooseDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
+ , m_instance (createInstanceWithGetPhysicalDeviceProperties2(context, m_instanceExtensions))
+ , m_vki (m_instance.getDriver())
+ , m_physicalDevice (chooseDevice(m_vki, m_instance, context.getTestContext().getCommandLine()))
, m_queueFamilyIndex (findQueueFamilyIndexWithCaps(m_vki, m_physicalDevice, VK_QUEUE_COMPUTE_BIT | VK_QUEUE_GRAPHICS_BIT))
, m_deviceExtensions (enumerateDeviceExtensionProperties(m_vki, m_physicalDevice, DE_NULL))
- , 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_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_allocator (m_vkd, *m_device, getPhysicalDeviceMemoryProperties(m_vki, m_physicalDevice))
, m_textureSize (32, 32)
@@ -2652,8 +2637,8 @@
const TestParams m_params;
const PlatformInterface& m_vkp;
const Extensions m_instanceExtensions;
- const Unique<VkInstance> m_instance;
- const InstanceDriver m_vki;
+ const CustomInstance m_instance;
+ const InstanceDriver& m_vki;
const VkPhysicalDevice m_physicalDevice;
const deUint32 m_queueFamilyIndex;
const Extensions m_deviceExtensions;
@@ -2689,13 +2674,13 @@
, m_params (params)
, m_vkp (context.getPlatformInterface())
, m_instanceExtensions (enumerateInstanceExtensionProperties(m_vkp, DE_NULL))
- , m_instance (createInstanceWithGetPhysicalDeviceProperties2(context, m_vkp, m_instanceExtensions))
- , m_vki (m_vkp, *m_instance)
- , m_physicalDevice (chooseDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
+ , m_instance (createInstanceWithGetPhysicalDeviceProperties2(context, m_instanceExtensions))
+ , m_vki (m_instance.getDriver())
+ , m_physicalDevice (chooseDevice(m_vki, m_instance, context.getTestContext().getCommandLine()))
, m_queueFamilyIndex (findQueueFamilyIndexWithCaps(m_vki, m_physicalDevice, VK_QUEUE_GRAPHICS_BIT))
, m_deviceExtensions (enumerateDeviceExtensionProperties(m_vki, m_physicalDevice, DE_NULL))
- , 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_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_allocator (m_vkd, *m_device, getPhysicalDeviceMemoryProperties(m_vki, m_physicalDevice))
, m_renderSize (32, 32)
@@ -3138,8 +3123,8 @@
const TestParams m_params;
const PlatformInterface& m_vkp;
const Extensions m_instanceExtensions;
- const Unique<VkInstance> m_instance;
- const InstanceDriver m_vki;
+ const CustomInstance m_instance;
+ const InstanceDriver& m_vki;
const VkPhysicalDevice m_physicalDevice;
const deUint32 m_queueFamilyIndex;
const Extensions m_deviceExtensions;
@@ -3166,13 +3151,13 @@
, m_params (params)
, m_vkp (context.getPlatformInterface())
, m_instanceExtensions (enumerateInstanceExtensionProperties(m_vkp, DE_NULL))
- , m_instance (createInstanceWithGetPhysicalDeviceProperties2(context, m_vkp, m_instanceExtensions))
- , m_vki (m_vkp, *m_instance)
- , m_physicalDevice (chooseDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
+ , m_instance (createInstanceWithGetPhysicalDeviceProperties2(context, m_instanceExtensions))
+ , m_vki (m_instance.getDriver())
+ , m_physicalDevice (chooseDevice(m_vki, m_instance, context.getTestContext().getCommandLine()))
, m_queueFamilyIndex (findQueueFamilyIndexWithCaps(m_vki, m_physicalDevice, VK_QUEUE_COMPUTE_BIT))
, m_deviceExtensions (enumerateDeviceExtensionProperties(m_vki, m_physicalDevice, DE_NULL))
- , 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_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_allocator (m_vkd, *m_device, getPhysicalDeviceMemoryProperties(m_vki, m_physicalDevice))
, m_bufferFormat (VK_FORMAT_R32G32B32A32_SFLOAT)
@@ -3502,8 +3487,8 @@
const TestParams m_params;
const PlatformInterface& m_vkp;
const Extensions m_instanceExtensions;
- const Unique<VkInstance> m_instance;
- const InstanceDriver m_vki;
+ const CustomInstance m_instance;
+ const InstanceDriver& m_vki;
const VkPhysicalDevice m_physicalDevice;
const deUint32 m_queueFamilyIndex;
const Extensions m_deviceExtensions;
@@ -3539,13 +3524,13 @@
, m_params (params)
, m_vkp (context.getPlatformInterface())
, m_instanceExtensions (enumerateInstanceExtensionProperties(m_vkp, DE_NULL))
- , m_instance (createInstanceWithGetPhysicalDeviceProperties2(context, m_vkp, m_instanceExtensions))
- , m_vki (m_vkp, *m_instance)
- , m_physicalDevice (chooseDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
+ , m_instance (createInstanceWithGetPhysicalDeviceProperties2(context, m_instanceExtensions))
+ , m_vki (m_instance.getDriver())
+ , m_physicalDevice (chooseDevice(m_vki, m_instance, context.getTestContext().getCommandLine()))
, m_queueFamilyIndex (findQueueFamilyIndexWithCaps(m_vki, m_physicalDevice, VK_QUEUE_GRAPHICS_BIT))
, m_deviceExtensions (enumerateDeviceExtensionProperties(m_vki, m_physicalDevice, DE_NULL))
- , 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_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_allocator (m_vkd, *m_device, getPhysicalDeviceMemoryProperties(m_vki, m_physicalDevice))
, m_renderSize (32, 32)
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineRenderToImageTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineRenderToImageTests.cpp
index 6f7d0e0..7d1d133 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineRenderToImageTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineRenderToImageTests.cpp
@@ -184,7 +184,7 @@
{
case ALLOCATION_KIND_SUBALLOCATED:
{
- return ::vkt::pipeline::bindBuffer(vkd, device, allocator, buffer, requirement);
+ return vk::bindBuffer(vkd, device, allocator, buffer, requirement);
}
case ALLOCATION_KIND_DEDICATED:
@@ -212,7 +212,7 @@
{
case ALLOCATION_KIND_SUBALLOCATED:
{
- return ::vkt::pipeline::bindImage(vkd, device, allocator, image, requirement);
+ return vk::bindImage(vkd, device, allocator, image, requirement);
}
case ALLOCATION_KIND_DEDICATED:
@@ -555,12 +555,6 @@
return createImage(vk, device, &imageParams);
}
-inline Move<VkBuffer> makeBuffer (const DeviceInterface& vk, const VkDevice device, const VkDeviceSize bufferSize, const VkBufferUsageFlags usage)
-{
- const VkBufferCreateInfo bufferCreateInfo = makeBufferCreateInfo(bufferSize, usage);
- return createBuffer(vk, device, &bufferCreateInfo);
-}
-
inline VkImageSubresourceRange makeColorSubresourceRange (const int baseArrayLayer, const int layerCount)
{
return makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, static_cast<deUint32>(baseArrayLayer), static_cast<deUint32>(layerCount));
@@ -968,10 +962,6 @@
// "Slices" is either the depth of a 3D image, or the number of layers of an arrayed image
const deInt32 numSlices = maxLayersOrDepth(imageSize);
-
- if (useDepthStencil && !isDepthStencilFormatSupported(vki, physDevice, caseDef.depthStencilFormat))
- TCU_THROW(NotSupportedError, "Unsupported depth/stencil format");
-
// Determine the verification bounds. The checked region will be in the center of the rendered image
const IVec4 checkSize = tcu::min(imageSize, IVec4(MAX_VERIFICATION_REGION_SIZE,
MAX_VERIFICATION_REGION_SIZE,
@@ -1228,12 +1218,22 @@
void checkImageViewTypeRequirements (Context& context, const VkImageViewType viewType)
{
- if (viewType == VK_IMAGE_VIEW_TYPE_3D &&
- (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_maintenance1")))
- TCU_THROW(NotSupportedError, "Extension VK_KHR_maintenance1 not supported");
+ if (viewType == VK_IMAGE_VIEW_TYPE_3D)
+ context.requireDeviceFunctionality("VK_KHR_maintenance1");
- if (viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY && !context.getDeviceFeatures().imageCubeArray)
- TCU_THROW(NotSupportedError, "Missing feature: imageCubeArray");
+ if (viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_IMAGE_CUBE_ARRAY);
+}
+
+void checkSupportAttachmentSize (Context& context, const CaseDef caseDef)
+{
+ checkImageViewTypeRequirements(context, caseDef.viewType);
+
+ if (caseDef.allocationKind == ALLOCATION_KIND_DEDICATED)
+ context.requireDeviceFunctionality("VK_KHR_dedicated_allocation");
+
+ if (caseDef.depthStencilFormat != VK_FORMAT_UNDEFINED && !isDepthStencilFormatSupported(context.getInstanceInterface(), context.getPhysicalDevice(), caseDef.depthStencilFormat))
+ TCU_THROW(NotSupportedError, "Unsupported depth/stencil format");
}
//! A test that can exercise very big color and depth/stencil attachment sizes.
@@ -1241,14 +1241,6 @@
//! the test can be retried with a next increment of size reduction index, making the attachments smaller.
tcu::TestStatus testAttachmentSize (Context& context, const CaseDef caseDef)
{
- checkImageViewTypeRequirements(context, caseDef.viewType);
-
- if (caseDef.allocationKind == ALLOCATION_KIND_DEDICATED)
- {
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_dedicated_allocation"))
- TCU_THROW(NotSupportedError, "VK_KHR_dedicated_allocation is not supported");
- }
-
return testWithSizeReduction(context, caseDef);
// Never reached
}
@@ -1376,11 +1368,20 @@
}
}
-//! Use image mip levels as attachments
-tcu::TestStatus testRenderToMipMaps (Context& context, const CaseDef caseDef)
+void checkSupportRenderToMipMaps (Context& context, const CaseDef caseDef)
{
checkImageViewTypeRequirements(context, caseDef.viewType);
+ if (caseDef.allocationKind == ALLOCATION_KIND_DEDICATED)
+ context.requireDeviceFunctionality("VK_KHR_dedicated_allocation");
+
+ if (caseDef.depthStencilFormat != VK_FORMAT_UNDEFINED && !isDepthStencilFormatSupported(context.getInstanceInterface(), context.getPhysicalDevice(), caseDef.depthStencilFormat))
+ TCU_THROW(NotSupportedError, "Unsupported depth/stencil format");
+}
+
+//! Use image mip levels as attachments
+tcu::TestStatus testRenderToMipMaps (Context& context, const CaseDef caseDef)
+{
const DeviceInterface& vk = context.getDeviceInterface();
const InstanceInterface& vki = context.getInstanceInterface();
const VkDevice device = context.getDevice();
@@ -1396,15 +1397,6 @@
const int numMipLevels = static_cast<int>(mipLevelSizes.size());
const bool useDepthStencil = (caseDef.depthStencilFormat != VK_FORMAT_UNDEFINED);
- if (caseDef.allocationKind == ALLOCATION_KIND_DEDICATED)
- {
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_dedicated_allocation"))
- TCU_THROW(NotSupportedError, "VK_KHR_dedicated_allocation is not supported");
- }
-
- if (useDepthStencil && !isDepthStencilFormatSupported(vki, physDevice, caseDef.depthStencilFormat))
- TCU_THROW(NotSupportedError, "Unsupported depth/stencil format");
-
// Create a color buffer big enough to hold all layers and mip levels
const VkDeviceSize colorBufferSize = sum(mipLevelStorageSizes);
const Unique<VkBuffer> colorBuffer (makeBuffer(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
@@ -1784,7 +1776,7 @@
depthStencilFormat[dsFormatNdx], // VkFormat depthStencilFormat;
allocationKind // AllocationKind allocationKind;
};
- addFunctionCaseWithPrograms(smallGroup.get(), getFormatString(format[formatNdx], depthStencilFormat[dsFormatNdx]), "", initPrograms, testAttachmentSize, caseDef);
+ addFunctionCaseWithPrograms(smallGroup.get(), getFormatString(format[formatNdx], depthStencilFormat[dsFormatNdx]), "", checkSupportAttachmentSize, initPrograms, testAttachmentSize, caseDef);
}
}
else // All huge cases go into a separate group
@@ -1805,7 +1797,7 @@
depthStencilFormat[dsFormatNdx], // VkFormat depthStencilFormat;
allocationKind // AllocationKind allocationKind;
};
- addFunctionCaseWithPrograms(sizeGroup.get(), getFormatString(colorFormat, depthStencilFormat[dsFormatNdx]), "", initPrograms, testAttachmentSize, caseDef);
+ addFunctionCaseWithPrograms(sizeGroup.get(), getFormatString(colorFormat, depthStencilFormat[dsFormatNdx]), "", checkSupportAttachmentSize, initPrograms, testAttachmentSize, caseDef);
}
hugeGroup->addChild(sizeGroup.release());
}
@@ -1830,7 +1822,7 @@
depthStencilFormat[dsFormatNdx], // VkFormat depthStencilFormat;
allocationKind // AllocationKind allocationKind;
};
- addFunctionCaseWithPrograms(mipmapGroup.get(), getFormatString(format[formatNdx], depthStencilFormat[dsFormatNdx]), "", initPrograms, testRenderToMipMaps, caseDef);
+ addFunctionCaseWithPrograms(mipmapGroup.get(), getFormatString(format[formatNdx], depthStencilFormat[dsFormatNdx]), "", checkSupportRenderToMipMaps, initPrograms, testRenderToMipMaps, caseDef);
}
imageGroup->addChild(mipmapGroup.release());
}
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineSamplerTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineSamplerTests.cpp
index 0f62ae2..5904ca8 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineSamplerTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineSamplerTests.cpp
@@ -52,34 +52,39 @@
class SamplerTest : public vkt::TestCase
{
public:
- SamplerTest (tcu::TestContext& testContext,
- const char* name,
- const char* description,
- VkImageViewType imageViewType,
- VkFormat imageFormat,
- int imageSize,
- float samplerLod,
- bool separateStencilUsage);
- virtual ~SamplerTest (void) {}
+ SamplerTest (tcu::TestContext& testContext,
+ const char* name,
+ const char* description,
+ VkImageViewType imageViewType,
+ VkFormat imageFormat,
+ int imageSize,
+ float samplerLod,
+ bool separateStencilUsage);
+ virtual ~SamplerTest (void) {}
- tcu::Vec4 swizzle (tcu::Vec4 inputData, VkComponentMapping componentMapping, float zeroOrOneValue) const;
- virtual void initPrograms (SourceCollections& sourceCollections) const;
- virtual TestInstance* createInstance (Context& context) const;
- virtual tcu::UVec2 getRenderSize (VkImageViewType viewType) const;
- virtual std::vector<Vertex4Tex4> createVertices (void) const;
- virtual VkSamplerCreateInfo getSamplerCreateInfo (void) const;
- virtual VkComponentMapping getComponentMapping (void) const;
+ virtual ImageSamplingInstanceParams getImageSamplingInstanceParams (VkImageViewType imageViewType,
+ VkFormat imageFormat,
+ int imageSize,
+ float samplerLod,
+ bool separateStencilUsage) const;
- static std::string getGlslSamplerType (const tcu::TextureFormat& format, VkImageViewType type);
- static tcu::IVec3 getImageSize (VkImageViewType viewType, int size);
- static int getArraySize (VkImageViewType viewType);
+ tcu::Vec4 swizzle (tcu::Vec4 inputData, VkComponentMapping componentMapping, float zeroOrOneValue) const;
+ virtual void initPrograms (SourceCollections& sourceCollections) const;
+ virtual void checkSupport (Context& context) const;
+ virtual TestInstance* createInstance (Context& context) const;
+ virtual tcu::UVec2 getRenderSize (VkImageViewType viewType) const;
+ virtual std::vector<Vertex4Tex4> createVertices (void) const;
+ virtual VkSamplerCreateInfo getSamplerCreateInfo (void) const;
+ virtual VkComponentMapping getComponentMapping (void) const;
+
+ static std::string getGlslSamplerType (const tcu::TextureFormat& format, VkImageViewType type);
+ static tcu::IVec3 getImageSize (VkImageViewType viewType, int size);
+ static int getArraySize (VkImageViewType viewType);
protected:
VkImageViewType m_imageViewType;
VkFormat m_imageFormat;
int m_imageSize;
- VkImageViewCreateInfo m_imageViewParams;
- VkSamplerCreateInfo m_samplerParams;
float m_samplerLod;
bool m_separateStencilUsage;
};
@@ -127,7 +132,7 @@
VkImageViewType imageViewType,
VkFormat imageFormat,
VkComponentMapping componentMapping,
- VkSamplerReductionModeEXT reductionMode,
+ VkSamplerReductionMode reductionMode,
bool separateStencilUsage);
virtual ~SamplerMagReduceFilterTest (void) {}
@@ -135,7 +140,7 @@
virtual VkComponentMapping getComponentMapping (void) const;
private:
- const VkSamplerReductionModeCreateInfoEXT m_reductionCreaterInfo;
+ const VkSamplerReductionModeCreateInfo m_reductionCreaterInfo;
VkComponentMapping m_componentMapping;
};
@@ -148,7 +153,7 @@
VkImageViewType imageViewType,
VkFormat imageFormat,
VkComponentMapping componentMapping,
- VkSamplerReductionModeEXT reductionMode,
+ VkSamplerReductionMode reductionMode,
bool separateStencilUsage);
virtual ~SamplerMinReduceFilterTest (void) {}
@@ -156,7 +161,7 @@
virtual VkComponentMapping getComponentMapping (void) const;
private:
- const VkSamplerReductionModeCreateInfoEXT m_reductionCreaterInfo;
+ const VkSamplerReductionModeCreateInfo m_reductionCreaterInfo;
VkComponentMapping m_componentMapping;
};
@@ -220,15 +225,49 @@
int imageSize,
float samplerLod,
bool separateStencilUsage)
- : vkt::TestCase (testContext, name, description)
- , m_imageViewType (imageViewType)
- , m_imageFormat (imageFormat)
- , m_imageSize (imageSize)
- , m_samplerLod (samplerLod)
- , m_separateStencilUsage(separateStencilUsage)
+ : vkt::TestCase (testContext, name, description)
+ , m_imageViewType (imageViewType)
+ , m_imageFormat (imageFormat)
+ , m_imageSize (imageSize)
+ , m_samplerLod (samplerLod)
+ , m_separateStencilUsage (separateStencilUsage)
{
}
+ImageSamplingInstanceParams SamplerTest::getImageSamplingInstanceParams (VkImageViewType imageViewType,
+ VkFormat imageFormat,
+ int imageSize,
+ float samplerLod,
+ bool separateStencilUsage) const
+{
+ const tcu::UVec2 renderSize = getRenderSize(imageViewType);
+ const std::vector<Vertex4Tex4> vertices = createVertices();
+ const VkSamplerCreateInfo samplerParams = getSamplerCreateInfo();
+ const VkComponentMapping componentMapping = getComponentMapping();
+
+ const VkImageAspectFlags imageAspect = (!isCompressedFormat(imageFormat) && hasDepthComponent(mapVkFormat(imageFormat).order)) ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT;
+
+ const VkImageSubresourceRange subresourceRange =
+ {
+ imageAspect, // VkImageAspectFlags aspectMask;
+ 0u, // deUint32 baseMipLevel;
+ (deUint32)deLog2Floor32(imageSize) + 1, // deUint32 mipLevels;
+ 0u, // deUint32 baseArrayLayer;
+ (deUint32)SamplerTest::getArraySize(imageViewType) // deUint32 arraySize;
+ };
+
+ return ImageSamplingInstanceParams(renderSize, imageViewType, imageFormat,
+ getImageSize(imageViewType, imageSize),
+ getArraySize(imageViewType),
+ componentMapping, subresourceRange,
+ samplerParams, samplerLod, vertices, separateStencilUsage);
+}
+
+void SamplerTest::checkSupport (Context& context) const
+{
+ checkSupportImageSamplingInstance(context, getImageSamplingInstanceParams(m_imageViewType, m_imageFormat, m_imageSize, m_samplerLod, m_separateStencilUsage));
+}
+
tcu::Vec4 SamplerTest::swizzle (tcu::Vec4 inputData, VkComponentMapping componentMapping, float zeroOrOneValue) const
{
// Remove VK_COMPONENT_SWIZZLE_IDENTITY to avoid addressing channelValues[0]
@@ -331,29 +370,7 @@
TestInstance* SamplerTest::createInstance (Context& context) const
{
- const tcu::UVec2 renderSize = getRenderSize(m_imageViewType);
- const std::vector<Vertex4Tex4> vertices = createVertices();
- const VkSamplerCreateInfo samplerParams = getSamplerCreateInfo();
- const VkComponentMapping componentMapping = getComponentMapping();
-
- const VkImageAspectFlags imageAspect = (!isCompressedFormat(m_imageFormat) && hasDepthComponent(mapVkFormat(m_imageFormat).order)) ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT;
-
- const VkImageSubresourceRange subresourceRange =
- {
- imageAspect, // VkImageAspectFlags aspectMask;
- 0u, // deUint32 baseMipLevel;
- (deUint32)deLog2Floor32(m_imageSize) + 1, // deUint32 mipLevels;
- 0u, // deUint32 baseArrayLayer;
- (deUint32)SamplerTest::getArraySize(m_imageViewType) // deUint32 arraySize;
- };
-
-
-
- return new ImageSamplingInstance(context, renderSize, m_imageViewType, m_imageFormat,
- getImageSize(m_imageViewType, m_imageSize),
- getArraySize(m_imageViewType),
- componentMapping, subresourceRange,
- samplerParams, m_samplerLod,vertices, m_separateStencilUsage);
+ return new ImageSamplingInstance(context, getImageSamplingInstanceParams(m_imageViewType, m_imageFormat, m_imageSize, m_samplerLod, m_separateStencilUsage));
}
tcu::UVec2 SamplerTest::getRenderSize (VkImageViewType viewType) const
@@ -549,13 +566,13 @@
namespace
{
-VkSamplerReductionModeCreateInfoEXT getSamplerReductionCreateInfo (VkSamplerReductionModeEXT reductionMode)
+VkSamplerReductionModeCreateInfo getSamplerReductionCreateInfo (VkSamplerReductionMode reductionMode)
{
- const VkSamplerReductionModeCreateInfoEXT ret =
+ const VkSamplerReductionModeCreateInfo ret =
{
- VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT, // VkStructureType sType
+ VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO, // VkStructureType sType
DE_NULL, // const void* pNext
- reductionMode // VkSamplerReductionModeEXT reductionMode
+ reductionMode // VkSamplerReductionMode reductionMode
};
return ret;
}
@@ -565,13 +582,13 @@
// SamplerMagReduceFilterTest
-SamplerMagReduceFilterTest::SamplerMagReduceFilterTest (tcu::TestContext& testContext,
+SamplerMagReduceFilterTest::SamplerMagReduceFilterTest (tcu::TestContext& testContext,
const char* name,
const char* description,
VkImageViewType imageViewType,
VkFormat imageFormat,
VkComponentMapping componentMapping,
- VkSamplerReductionModeEXT reductionMode,
+ VkSamplerReductionMode reductionMode,
bool separateStencilUsage)
: SamplerMagFilterTest (testContext, name, description, imageViewType, imageFormat, VK_FILTER_LINEAR, separateStencilUsage)
, m_reductionCreaterInfo (getSamplerReductionCreateInfo(reductionMode))
@@ -595,13 +612,13 @@
// SamplerMinReduceFilterTest
-SamplerMinReduceFilterTest::SamplerMinReduceFilterTest (tcu::TestContext& testContext,
+SamplerMinReduceFilterTest::SamplerMinReduceFilterTest (tcu::TestContext& testContext,
const char* name,
const char* description,
VkImageViewType imageViewType,
VkFormat imageFormat,
VkComponentMapping componentMapping,
- VkSamplerReductionModeEXT reductionMode,
+ VkSamplerReductionMode reductionMode,
bool separateStencilUsage)
: SamplerMinFilterTest (testContext, name, description, imageViewType, imageFormat, VK_FILTER_LINEAR, separateStencilUsage)
, m_reductionCreaterInfo (getSamplerReductionCreateInfo(reductionMode))
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineSpecConstantTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineSpecConstantTests.cpp
index 2997ec9..1793ba6 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineSpecConstantTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineSpecConstantTests.cpp
@@ -235,6 +235,7 @@
void initPrograms (SourceCollections& programCollection) const;
TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
private:
const VkShaderStageFlagBits m_stage;
@@ -718,10 +719,13 @@
return features;
}
+void SpecConstantTest::checkSupport (Context& context) const
+{
+ requireFeatures(context, m_caseDef.requirements | getShaderStageRequirements(m_stage));
+}
+
TestInstance* SpecConstantTest::createInstance (Context& context) const
{
- requireFeatures(context.getInstanceInterface(), context.getPhysicalDevice(), m_caseDef.requirements | getShaderStageRequirements(m_stage));
-
if (m_stage & VK_SHADER_STAGE_COMPUTE_BIT)
return new ComputeTestInstance(context, m_caseDef.ssboSize, m_caseDef.specConstants, m_caseDef.expectedValues);
else
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineSpecConstantUtil.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineSpecConstantUtil.cpp
index 4cd6268..0f1fe9b 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineSpecConstantUtil.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineSpecConstantUtil.cpp
@@ -284,24 +284,22 @@
return imageInfo;
}
-void requireFeatures (const InstanceInterface& vki, const VkPhysicalDevice physDevice, const FeatureFlags flags)
+void requireFeatures (Context& context, const FeatureFlags flags)
{
- const VkPhysicalDeviceFeatures features = getPhysicalDeviceFeatures(vki, physDevice);
+ if (flags & FEATURE_TESSELLATION_SHADER)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_TESSELLATION_SHADER);
- if (((flags & FEATURE_TESSELLATION_SHADER) != 0) && !features.tessellationShader)
- throw tcu::NotSupportedError("Tessellation shader not supported");
+ if (flags & FEATURE_GEOMETRY_SHADER)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_GEOMETRY_SHADER);
- if (((flags & FEATURE_GEOMETRY_SHADER) != 0) && !features.geometryShader)
- throw tcu::NotSupportedError("Geometry shader not supported");
+ if (flags & FEATURE_SHADER_FLOAT_64)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SHADER_FLOAT64);
- if (((flags & FEATURE_SHADER_FLOAT_64) != 0) && !features.shaderFloat64)
- throw tcu::NotSupportedError("Double-precision floats not supported");
+ if (flags & FEATURE_VERTEX_PIPELINE_STORES_AND_ATOMICS)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_VERTEX_PIPELINE_STORES_AND_ATOMICS);
- if (((flags & FEATURE_VERTEX_PIPELINE_STORES_AND_ATOMICS) != 0) && !features.vertexPipelineStoresAndAtomics)
- throw tcu::NotSupportedError("SSBO and image writes not supported in vertex pipeline");
-
- if (((flags & FEATURE_FRAGMENT_STORES_AND_ATOMICS) != 0) && !features.fragmentStoresAndAtomics)
- throw tcu::NotSupportedError("SSBO and image writes not supported in fragment shader");
+ if (flags & FEATURE_FRAGMENT_STORES_AND_ATOMICS)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_FRAGMENT_STORES_AND_ATOMICS);
}
} // pipeline
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineSpecConstantUtil.hpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineSpecConstantUtil.hpp
index 163e551..7e34d40 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineSpecConstantUtil.hpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineSpecConstantUtil.hpp
@@ -29,6 +29,7 @@
#include "vkMemUtil.hpp"
#include "vkRefUtil.hpp"
#include "vkQueryUtil.hpp"
+#include "vktTestCase.hpp"
namespace vkt
{
@@ -70,7 +71,7 @@
typedef deUint32 FeatureFlags;
vk::VkImageCreateInfo makeImageCreateInfo (const tcu::IVec2& size, const vk::VkFormat format, const vk::VkImageUsageFlags usage);
-void requireFeatures (const vk::InstanceInterface& vki, const vk::VkPhysicalDevice physDevice, const FeatureFlags flags);
+void requireFeatures (vkt::Context& context, const FeatureFlags flags);
// Ugly, brute-force replacement for the initializer list
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineStencilExportTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineStencilExportTests.cpp
index 930b2d7..a9e6cce 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineStencilExportTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineStencilExportTests.cpp
@@ -132,17 +132,6 @@
return (formatProps.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) != 0;
}
-inline Move<VkBuffer> makeBuffer (const DeviceInterface& vk, const VkDevice device, const VkDeviceSize bufferSize, const VkBufferUsageFlags usage)
-{
- const VkBufferCreateInfo bufferCreateInfo = makeBufferCreateInfo(bufferSize, usage);
- return createBuffer(vk, device, &bufferCreateInfo);
-}
-
-inline vk::Move<vk::VkImage> makeImage (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkImageCreateInfo& createInfo)
-{
- return createImage(vk, device, &createInfo);
-}
-
VkImageCreateInfo makeImageCreateInfo (const VkFormat format, const UVec2& size, VkImageUsageFlags usage)
{
const VkImageCreateInfo imageParams =
@@ -555,9 +544,7 @@
void checkSupport (Context& context)
{
- const std::vector<std::string>& extensions = context.getDeviceExtensions();
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), extensions, "VK_EXT_shader_stencil_export"))
- TCU_THROW(NotSupportedError, "Extension VK_EXT_shader_stencil_export not supported");
+ context.requireDeviceFunctionality("VK_EXT_shader_stencil_export");
const VkFormat stencilFormat = VK_FORMAT_S8_UINT;
if (!isSupportedDepthStencilFormat(context.getInstanceInterface(), context.getPhysicalDevice(), stencilFormat))
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineStencilTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineStencilTests.cpp
index 61ced5e..5a29742 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineStencilTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineStencilTests.cpp
@@ -116,9 +116,11 @@
VkFormat stencilFormat,
const VkStencilOpState& stencilOpStateFront,
const VkStencilOpState& stencilOpStateBack,
- const bool colorAttachmentEnable);
+ const bool colorAttachmentEnable,
+ const bool separateDepthStencilLayouts);
virtual ~StencilTest (void);
virtual void initPrograms (SourceCollections& sourceCollections) const;
+ virtual void checkSupport (Context& context) const;
virtual TestInstance* createInstance (Context& context) const;
private:
@@ -126,6 +128,7 @@
const VkStencilOpState m_stencilOpStateFront;
const VkStencilOpState m_stencilOpStateBack;
const bool m_colorAttachmentEnable;
+ const bool m_separateDepthStencilLayouts;
};
class StencilTestInstance : public vkt::TestInstance
@@ -135,7 +138,8 @@
VkFormat stencilFormat,
const VkStencilOpState& stencilOpStatesFront,
const VkStencilOpState& stencilOpStatesBack,
- const bool colorAttachmentEnable);
+ const bool colorAttachmentEnable,
+ const bool separateDepthStencilLayouts);
virtual ~StencilTestInstance (void);
virtual tcu::TestStatus iterate (void);
@@ -145,6 +149,7 @@
VkStencilOpState m_stencilOpStateFront;
VkStencilOpState m_stencilOpStateBack;
const bool m_colorAttachmentEnable;
+ const bool m_separateDepthStencilLayouts;
const tcu::UVec2 m_renderSize;
const VkFormat m_colorFormat;
const VkFormat m_stencilFormat;
@@ -264,12 +269,14 @@
VkFormat stencilFormat,
const VkStencilOpState& stencilOpStateFront,
const VkStencilOpState& stencilOpStateBack,
- const bool colorAttachmentEnable)
- : vkt::TestCase (testContext, name, description)
- , m_stencilFormat (stencilFormat)
- , m_stencilOpStateFront (stencilOpStateFront)
- , m_stencilOpStateBack (stencilOpStateBack)
- , m_colorAttachmentEnable (colorAttachmentEnable)
+ const bool colorAttachmentEnable,
+ const bool separateDepthStencilLayouts)
+ : vkt::TestCase (testContext, name, description)
+ , m_stencilFormat (stencilFormat)
+ , m_stencilOpStateFront (stencilOpStateFront)
+ , m_stencilOpStateBack (stencilOpStateBack)
+ , m_colorAttachmentEnable (colorAttachmentEnable)
+ , m_separateDepthStencilLayouts (separateDepthStencilLayouts)
{
}
@@ -277,9 +284,18 @@
{
}
+void StencilTest::checkSupport (Context& context) const
+{
+ if (!isSupportedDepthStencilFormat(context.getInstanceInterface(), context.getPhysicalDevice(), m_stencilFormat))
+ throw tcu::NotSupportedError(std::string("Unsupported depth/stencil format: ") + getFormatName(m_stencilFormat));
+
+ if (m_separateDepthStencilLayouts && !context.isDeviceFunctionalitySupported("VK_KHR_separate_depth_stencil_layouts"))
+ TCU_THROW(NotSupportedError, "VK_KHR_separate_depth_stencil_layouts is not supported");
+}
+
TestInstance* StencilTest::createInstance (Context& context) const
{
- return new StencilTestInstance(context, m_stencilFormat, m_stencilOpStateFront, m_stencilOpStateBack, m_colorAttachmentEnable);
+ return new StencilTestInstance(context, m_stencilFormat, m_stencilOpStateFront, m_stencilOpStateBack, m_colorAttachmentEnable, m_separateDepthStencilLayouts);
}
void StencilTest::initPrograms (SourceCollections& sourceCollections) const
@@ -332,14 +348,16 @@
VkFormat stencilFormat,
const VkStencilOpState& stencilOpStateFront,
const VkStencilOpState& stencilOpStateBack,
- const bool colorAttachmentEnable)
- : vkt::TestInstance (context)
- , m_stencilOpStateFront (stencilOpStateFront)
- , m_stencilOpStateBack (stencilOpStateBack)
- , m_colorAttachmentEnable (colorAttachmentEnable)
- , m_renderSize (32, 32)
- , m_colorFormat (colorAttachmentEnable ? VK_FORMAT_R8G8B8A8_UNORM : VK_FORMAT_UNDEFINED)
- , m_stencilFormat (stencilFormat)
+ const bool colorAttachmentEnable,
+ const bool separateDepthStencilLayouts)
+ : vkt::TestInstance (context)
+ , m_stencilOpStateFront (stencilOpStateFront)
+ , m_stencilOpStateBack (stencilOpStateBack)
+ , m_colorAttachmentEnable (colorAttachmentEnable)
+ , m_separateDepthStencilLayouts (separateDepthStencilLayouts)
+ , m_renderSize (32, 32)
+ , m_colorFormat (colorAttachmentEnable ? VK_FORMAT_R8G8B8A8_UNORM : VK_FORMAT_UNDEFINED)
+ , m_stencilFormat (stencilFormat)
{
const DeviceInterface& vk = context.getDeviceInterface();
const VkDevice vkDevice = context.getDevice();
@@ -379,10 +397,6 @@
// Create stencil image
{
- // Check format support
- if (!isSupportedDepthStencilFormat(context.getInstanceInterface(), context.getPhysicalDevice(), m_stencilFormat))
- throw tcu::NotSupportedError(std::string("Unsupported depth/stencil format: ") + getFormatName(m_stencilFormat));
-
const VkImageUsageFlags usageFlags = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
const VkImageCreateInfo stencilImageParams =
@@ -626,7 +640,7 @@
// Create command buffer
{
- const VkImageMemoryBarrier colorImageBarrier =
+ const VkImageMemoryBarrier colorImageBarrier =
{
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
DE_NULL, // const void* pNext;
@@ -640,18 +654,26 @@
{ VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u } // VkImageSubresourceRange subresourceRange;
};
- const VkImageMemoryBarrier stencilImageBarrier =
+ VkImageSubresourceRange stencilImageBarrierSubresourceRange = m_stencilImageSubresourceRange;
+ VkImageLayout newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+ if (m_separateDepthStencilLayouts)
{
- VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- (VkAccessFlags)0, // VkAccessFlags srcAccessMask;
- VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask;
- VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
- VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout newLayout;
- VK_QUEUE_FAMILY_IGNORED, // uint32_t srcQueueFamilyIndex;
- VK_QUEUE_FAMILY_IGNORED, // uint32_t dstQueueFamilyIndex;
- *m_stencilImage, // VkImage image;
- m_stencilImageSubresourceRange, // VkImageSubresourceRange subresourceRange;
+ stencilImageBarrierSubresourceRange.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
+ newLayout = VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR;
+ }
+
+ const VkImageMemoryBarrier stencilImageBarrier =
+ {
+ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ (VkAccessFlags)0, // VkAccessFlags srcAccessMask;
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask;
+ VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
+ newLayout, // VkImageLayout newLayout;
+ VK_QUEUE_FAMILY_IGNORED, // uint32_t srcQueueFamilyIndex;
+ VK_QUEUE_FAMILY_IGNORED, // uint32_t dstQueueFamilyIndex;
+ *m_stencilImage, // VkImage image;
+ stencilImageBarrierSubresourceRange, // VkImageSubresourceRange subresourceRange;
};
std::vector<VkClearValue> attachmentClearValues;
@@ -901,80 +923,89 @@
for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(stencilFormats); formatNdx++)
{
- const VkFormat stencilFormat = stencilFormats[formatNdx];
- de::MovePtr<tcu::TestCaseGroup> formatTest (new tcu::TestCaseGroup(testCtx,
- getFormatCaseName(stencilFormat).c_str(),
- (std::string("Uses format ") + getFormatName(stencilFormat)).c_str()));
+ const VkFormat stencilFormat = stencilFormats[formatNdx];
+ const bool hasDepth = tcu::hasDepthComponent(mapVkFormat(stencilFormat).order);
+ const bool hasStencil = tcu::hasStencilComponent(mapVkFormat(stencilFormat).order);
+ const int separateLayoutsLoopCount = (hasDepth && hasStencil) ? 2 : 1;
- de::MovePtr<tcu::TestCaseGroup> stencilStateTests;
+ for (int separateDepthStencilLayouts = 0; separateDepthStencilLayouts < separateLayoutsLoopCount; ++separateDepthStencilLayouts)
{
- std::ostringstream desc;
- desc << "Draws 4 quads with the following depths and dynamic stencil states: ";
+ const bool useSeparateDepthStencilLayouts = bool(separateDepthStencilLayouts);
- for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++)
+ de::MovePtr<tcu::TestCaseGroup> formatTest (new tcu::TestCaseGroup(testCtx,
+ (getFormatCaseName(stencilFormat) + ((useSeparateDepthStencilLayouts) ? "_separate_layouts" : "")).c_str(),
+ (std::string("Uses format ") + getFormatName(stencilFormat) + ((useSeparateDepthStencilLayouts) ? " with separate depth/stencil layouts" : "")).c_str()));
+
+ de::MovePtr<tcu::TestCaseGroup> stencilStateTests;
{
- const StencilTest::StencilStateConfig& stencilConfig = StencilTest::s_stencilStateConfigs[quadNdx];
+ std::ostringstream desc;
+ desc << "Draws 4 quads with the following depths and dynamic stencil states: ";
- desc << "(" << quadNdx << ") "
- << "z = " << StencilTest::s_quadDepths[quadNdx] << ", "
- << "frontReadMask = " << stencilConfig.frontReadMask << ", "
- << "frontWriteMask = " << stencilConfig.frontWriteMask << ", "
- << "frontRef = " << stencilConfig.frontRef << ", "
- << "backReadMask = " << stencilConfig.backReadMask << ", "
- << "backWriteMask = " << stencilConfig.backWriteMask << ", "
- << "backRef = " << stencilConfig.backRef;
- }
-
- stencilStateTests = de::MovePtr<tcu::TestCaseGroup>(new tcu::TestCaseGroup(testCtx, "states", desc.str().c_str()));
- }
-
- stencilOpItr.reset();
-
- for (deUint32 failOpNdx = 0u; failOpNdx < DE_LENGTH_OF_ARRAY(stencilOps); failOpNdx++)
- {
- const std::string failOpName = std::string("fail_") + getShortName(stencilOps[failOpNdx]);
- de::MovePtr<tcu::TestCaseGroup> failOpTest (new tcu::TestCaseGroup(testCtx, failOpName.c_str(), ""));
-
- for (deUint32 passOpNdx = 0u; passOpNdx < DE_LENGTH_OF_ARRAY(stencilOps); passOpNdx++)
- {
- const std::string passOpName = std::string("pass_") + getShortName(stencilOps[passOpNdx]);
- de::MovePtr<tcu::TestCaseGroup> passOpTest (new tcu::TestCaseGroup(testCtx, passOpName.c_str(), ""));
-
- for (deUint32 dFailOpNdx = 0u; dFailOpNdx < DE_LENGTH_OF_ARRAY(stencilOps); dFailOpNdx++)
+ for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++)
{
- const std::string dFailOpName = std::string("dfail_") + getShortName(stencilOps[dFailOpNdx]);
- de::MovePtr<tcu::TestCaseGroup> dFailOpTest (new tcu::TestCaseGroup(testCtx, dFailOpName.c_str(), ""));
+ const StencilTest::StencilStateConfig& stencilConfig = StencilTest::s_stencilStateConfigs[quadNdx];
- for (deUint32 compareOpNdx = 0u; compareOpNdx < DE_LENGTH_OF_ARRAY(compareOps); compareOpNdx++)
- {
- // Iterate front set of stencil state in ascending order
- const VkStencilOpState stencilStateFront =
- {
- stencilOps[failOpNdx], // failOp
- stencilOps[passOpNdx], // passOp
- stencilOps[dFailOpNdx], // depthFailOp
- compareOps[compareOpNdx], // compareOp
- 0x0, // compareMask
- 0x0, // writeMask
- 0x0 // reference
- };
-
- // Iterate back set of stencil state in random order
- const VkStencilOpState stencilStateBack = stencilOpItr.next();
- const std::string caseName = compareOpNames[compareOpNdx];
- const std::string caseDesc = getStencilStateSetDescription(stencilStateFront, stencilStateBack);
-
- dFailOpTest->addChild(new StencilTest(testCtx, caseName, caseDesc, stencilFormat, stencilStateFront, stencilStateBack, colorEnabled));
- }
- passOpTest->addChild(dFailOpTest.release());
+ desc << "(" << quadNdx << ") "
+ << "z = " << StencilTest::s_quadDepths[quadNdx] << ", "
+ << "frontReadMask = " << stencilConfig.frontReadMask << ", "
+ << "frontWriteMask = " << stencilConfig.frontWriteMask << ", "
+ << "frontRef = " << stencilConfig.frontRef << ", "
+ << "backReadMask = " << stencilConfig.backReadMask << ", "
+ << "backWriteMask = " << stencilConfig.backWriteMask << ", "
+ << "backRef = " << stencilConfig.backRef;
}
- failOpTest->addChild(passOpTest.release());
- }
- stencilStateTests->addChild(failOpTest.release());
- }
- formatTest->addChild(stencilStateTests.release());
- formatTests->addChild(formatTest.release());
+ stencilStateTests = de::MovePtr<tcu::TestCaseGroup>(new tcu::TestCaseGroup(testCtx, "states", desc.str().c_str()));
+ }
+
+ stencilOpItr.reset();
+
+ for (deUint32 failOpNdx = 0u; failOpNdx < DE_LENGTH_OF_ARRAY(stencilOps); failOpNdx++)
+ {
+ const std::string failOpName = std::string("fail_") + getShortName(stencilOps[failOpNdx]);
+ de::MovePtr<tcu::TestCaseGroup> failOpTest (new tcu::TestCaseGroup(testCtx, failOpName.c_str(), ""));
+
+ for (deUint32 passOpNdx = 0u; passOpNdx < DE_LENGTH_OF_ARRAY(stencilOps); passOpNdx++)
+ {
+ const std::string passOpName = std::string("pass_") + getShortName(stencilOps[passOpNdx]);
+ de::MovePtr<tcu::TestCaseGroup> passOpTest (new tcu::TestCaseGroup(testCtx, passOpName.c_str(), ""));
+
+ for (deUint32 dFailOpNdx = 0u; dFailOpNdx < DE_LENGTH_OF_ARRAY(stencilOps); dFailOpNdx++)
+ {
+ const std::string dFailOpName = std::string("dfail_") + getShortName(stencilOps[dFailOpNdx]);
+ de::MovePtr<tcu::TestCaseGroup> dFailOpTest (new tcu::TestCaseGroup(testCtx, dFailOpName.c_str(), ""));
+
+ for (deUint32 compareOpNdx = 0u; compareOpNdx < DE_LENGTH_OF_ARRAY(compareOps); compareOpNdx++)
+ {
+ // Iterate front set of stencil state in ascending order
+ const VkStencilOpState stencilStateFront =
+ {
+ stencilOps[failOpNdx], // failOp
+ stencilOps[passOpNdx], // passOp
+ stencilOps[dFailOpNdx], // depthFailOp
+ compareOps[compareOpNdx], // compareOp
+ 0x0, // compareMask
+ 0x0, // writeMask
+ 0x0 // reference
+ };
+
+ // Iterate back set of stencil state in random order
+ const VkStencilOpState stencilStateBack = stencilOpItr.next();
+ const std::string caseName = compareOpNames[compareOpNdx];
+ const std::string caseDesc = getStencilStateSetDescription(stencilStateFront, stencilStateBack);
+
+ dFailOpTest->addChild(new StencilTest(testCtx, caseName, caseDesc, stencilFormat, stencilStateFront, stencilStateBack, colorEnabled, useSeparateDepthStencilLayouts));
+ }
+ passOpTest->addChild(dFailOpTest.release());
+ }
+ failOpTest->addChild(passOpTest.release());
+ }
+ stencilStateTests->addChild(failOpTest.release());
+ }
+
+ formatTest->addChild(stencilStateTests.release());
+ formatTests->addChild(formatTest.release());
+ }
}
if (colorEnabled)
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineTimestampTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineTimestampTests.cpp
index 98311c2..7ea490c 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineTimestampTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineTimestampTests.cpp
@@ -141,11 +141,12 @@
TRANSFER_METHOD_LAST
};
-std::string getTransferMethodStr(const TransferMethod method,
- bool isDescription)
+std::string getTransferMethodStr (const TransferMethod method,
+ bool isDescription)
{
- std::ostringstream desc;
- std::locale loc;
+ std::ostringstream desc;
+ std::locale loc;
+
switch(method)
{
#define METHOD_CASE(p) \
@@ -178,32 +179,81 @@
constexpr deUint32 MIN_TIMESTAMP_VALID_BITS = 36;
constexpr deUint32 MAX_TIMESTAMP_VALID_BITS = 64;
+// Checks the number of valid bits for the given queue meets the spec requirements.
+void checkValidBits (deUint32 validBits, deUint32 queueFamilyIndex)
+{
+ if (validBits < MIN_TIMESTAMP_VALID_BITS || validBits > MAX_TIMESTAMP_VALID_BITS)
+ {
+ std::ostringstream msg;
+ msg << "Invalid value for timestampValidBits (" << validBits << ") in queue index " << queueFamilyIndex;
+ TCU_FAIL(msg.str());
+ }
+}
+
+// Returns the timestamp mask given the number of valid timestamp bits.
+deUint64 timestampMaskFromValidBits (deUint32 validBits)
+{
+ return ((validBits == MAX_TIMESTAMP_VALID_BITS) ? std::numeric_limits<deUint64>::max() : ((1ULL << validBits) - 1));
+}
+
+// Checks support for timestamps and returns the timestamp mask.
+deUint64 checkTimestampsSupported (Context& context)
+{
+ const InstanceInterface& vki = context.getInstanceInterface();
+ const VkPhysicalDevice physDevice = context.getPhysicalDevice();
+ const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
+ const std::vector<VkQueueFamilyProperties> queueProperties = vk::getPhysicalDeviceQueueFamilyProperties(vki, physDevice);
+ DE_ASSERT(queueFamilyIndex < queueProperties.size());
+ const deUint32& validBits = queueProperties[queueFamilyIndex].timestampValidBits;
+
+ if (validBits == 0)
+ throw tcu::NotSupportedError("Universal queue does not support timestamps");
+
+ checkValidBits(validBits, queueFamilyIndex);
+ return timestampMaskFromValidBits(validBits);
+}
+
+void checkTimestampBits (deUint64 timestamp, deUint64 mask)
+{
+ // The spec says:
+ // timestampValidBits is the unsigned integer count of meaningful bits in
+ // the timestamps written via vkCmdWriteTimestamp. The valid range for the
+ // count is 36..64 bits, or a value of 0, indicating no support for
+ // timestamps. Bits outside the valid range are guaranteed to be zeros.
+ if (timestamp > mask)
+ {
+ std::ostringstream msg;
+ msg << std::hex << "Invalid device timestamp value 0x" << timestamp << " according to device timestamp mask 0x" << mask;
+ TCU_FAIL(msg.str());
+ }
+}
+
// helper classes
class TimestampTestParam
{
public:
- TimestampTestParam (const VkPipelineStageFlagBits* stages,
- const deUint32 stageCount,
- const bool inRenderPass,
- const bool hostQueryReset);
- ~TimestampTestParam (void);
- virtual const std::string generateTestName (void) const;
- virtual const std::string generateTestDescription (void) const;
- StageFlagVector getStageVector (void) const { return m_stageVec; }
- bool getInRenderPass (void) const { return m_inRenderPass; }
- bool getHostQueryReset (void) const { return m_hostQueryReset; }
- void toggleInRenderPass (void) { m_inRenderPass = !m_inRenderPass; }
- void toggleHostQueryReset (void) { m_hostQueryReset = !m_hostQueryReset; }
+ TimestampTestParam (const VkPipelineStageFlagBits* stages,
+ const deUint32 stageCount,
+ const bool inRenderPass,
+ const bool hostQueryReset);
+ ~TimestampTestParam (void);
+ virtual const std::string generateTestName (void) const;
+ virtual const std::string generateTestDescription (void) const;
+ StageFlagVector getStageVector (void) const { return m_stageVec; }
+ bool getInRenderPass (void) const { return m_inRenderPass; }
+ bool getHostQueryReset (void) const { return m_hostQueryReset; }
+ void toggleInRenderPass (void) { m_inRenderPass = !m_inRenderPass; }
+ void toggleHostQueryReset (void) { m_hostQueryReset = !m_hostQueryReset; }
protected:
- StageFlagVector m_stageVec;
- bool m_inRenderPass;
- bool m_hostQueryReset;
+ StageFlagVector m_stageVec;
+ bool m_inRenderPass;
+ bool m_hostQueryReset;
};
-TimestampTestParam::TimestampTestParam(const VkPipelineStageFlagBits* stages,
- const deUint32 stageCount,
- const bool inRenderPass,
- const bool hostQueryReset)
+TimestampTestParam::TimestampTestParam (const VkPipelineStageFlagBits* stages,
+ const deUint32 stageCount,
+ const bool inRenderPass,
+ const bool hostQueryReset)
: m_inRenderPass(inRenderPass)
, m_hostQueryReset(hostQueryReset)
{
@@ -213,11 +263,11 @@
}
}
-TimestampTestParam::~TimestampTestParam(void)
+TimestampTestParam::~TimestampTestParam (void)
{
}
-const std::string TimestampTestParam::generateTestName(void) const
+const std::string TimestampTestParam::generateTestName (void) const
{
std::string result("");
@@ -239,7 +289,7 @@
return result;
}
-const std::string TimestampTestParam::generateTestDescription(void) const
+const std::string TimestampTestParam::generateTestDescription (void) const
{
std::string result("Record timestamp after ");
@@ -264,24 +314,24 @@
class TransferTimestampTestParam : public TimestampTestParam
{
public:
- TransferTimestampTestParam (const VkPipelineStageFlagBits* stages,
- const deUint32 stageCount,
- const bool inRenderPass,
- const bool hostQueryReset,
- const deUint32 methodNdx);
- ~TransferTimestampTestParam (void) { }
- const std::string generateTestName (void) const;
- const std::string generateTestDescription (void) const;
- TransferMethod getMethod (void) const { return m_method; }
+ TransferTimestampTestParam (const VkPipelineStageFlagBits* stages,
+ const deUint32 stageCount,
+ const bool inRenderPass,
+ const bool hostQueryReset,
+ const deUint32 methodNdx);
+ ~TransferTimestampTestParam (void) { }
+ const std::string generateTestName (void) const;
+ const std::string generateTestDescription (void) const;
+ TransferMethod getMethod (void) const { return m_method; }
protected:
- TransferMethod m_method;
+ TransferMethod m_method;
};
-TransferTimestampTestParam::TransferTimestampTestParam(const VkPipelineStageFlagBits* stages,
- const deUint32 stageCount,
- const bool inRenderPass,
- const bool hostQueryReset,
- const deUint32 methodNdx)
+TransferTimestampTestParam::TransferTimestampTestParam (const VkPipelineStageFlagBits* stages,
+ const deUint32 stageCount,
+ const bool inRenderPass,
+ const bool hostQueryReset,
+ const deUint32 methodNdx)
: TimestampTestParam(stages, stageCount, inRenderPass, hostQueryReset)
{
DE_ASSERT(methodNdx < (deUint32)TRANSFER_METHOD_LAST);
@@ -289,7 +339,7 @@
m_method = (TransferMethod)methodNdx;
}
-const std::string TransferTimestampTestParam::generateTestName(void) const
+const std::string TransferTimestampTestParam::generateTestName (void) const
{
std::string result("");
@@ -309,7 +359,7 @@
return result;
}
-const std::string TransferTimestampTestParam::generateTestDescription(void) const
+const std::string TransferTimestampTestParam::generateTestDescription (void) const
{
std::string result("");
@@ -355,13 +405,16 @@
class SimpleGraphicsPipelineBuilder
{
public:
- SimpleGraphicsPipelineBuilder (Context& context);
- ~SimpleGraphicsPipelineBuilder (void) { }
- void bindShaderStage (VkShaderStageFlagBits stage,
- const char* source_name);
- void enableTessellationStage (deUint32 patchControlPoints);
- Move<VkPipeline> buildPipeline (tcu::UVec2 renderSize,
- VkRenderPass renderPass);
+ SimpleGraphicsPipelineBuilder (Context& context);
+ ~SimpleGraphicsPipelineBuilder (void) { }
+
+ void bindShaderStage (VkShaderStageFlagBits stage,
+ const char* source_name);
+
+ void enableTessellationStage (deUint32 patchControlPoints);
+
+ Move<VkPipeline> buildPipeline (tcu::UVec2 renderSize,
+ VkRenderPass renderPass);
protected:
enum
{
@@ -388,23 +441,23 @@
m_shaderStageCount = 0;
}
-void SimpleGraphicsPipelineBuilder::bindShaderStage(VkShaderStageFlagBits stage,
- const char* source_name)
+void SimpleGraphicsPipelineBuilder::bindShaderStage (VkShaderStageFlagBits stage,
+ const char* source_name)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice vkDevice = m_context.getDevice();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
// Create shader module
- deUint32* pCode = (deUint32*)m_context.getBinaryCollection().get(source_name).getBinary();
- deUint32 codeSize = (deUint32)m_context.getBinaryCollection().get(source_name).getSize();
+ deUint32* pCode = (deUint32*)m_context.getBinaryCollection().get(source_name).getBinary();
+ deUint32 codeSize = (deUint32)m_context.getBinaryCollection().get(source_name).getSize();
const VkShaderModuleCreateInfo moduleCreateInfo =
{
- VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkShaderModuleCreateFlags flags;
- codeSize, // deUintptr codeSize;
- pCode, // const deUint32* pCode;
+ VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkShaderModuleCreateFlags flags;
+ codeSize, // deUintptr codeSize;
+ pCode, // const deUint32* pCode;
};
m_shaderModules[m_shaderStageCount] = createShaderModule(vk, vkDevice, &moduleCreateInfo);
@@ -413,7 +466,7 @@
m_shaderStageCount++;
}
-Move<VkPipeline> SimpleGraphicsPipelineBuilder::buildPipeline(tcu::UVec2 renderSize, VkRenderPass renderPass)
+Move<VkPipeline> SimpleGraphicsPipelineBuilder::buildPipeline (tcu::UVec2 renderSize, VkRenderPass renderPass)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice vkDevice = m_context.getDevice();
@@ -441,13 +494,13 @@
{
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;
- 0u, // deUint32 pushConstantRangeCount;
- DE_NULL // const VkPushConstantRange* pPushConstantRanges;
+ 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;
+ 0u, // deUint32 pushConstantRangeCount;
+ DE_NULL // const VkPushConstantRange* pPushConstantRanges;
};
m_pipelineLayout = createPipelineLayout(vk, vkDevice, &pipelineLayoutParams);
@@ -456,36 +509,36 @@
// Create pipeline
const VkVertexInputBindingDescription vertexInputBindingDescription =
{
- 0u, // deUint32 binding;
- sizeof(Vertex4RGBA), // deUint32 strideInBytes;
- VK_VERTEX_INPUT_RATE_VERTEX, // VkVertexInputRate inputRate;
+ 0u, // deUint32 binding;
+ sizeof(Vertex4RGBA), // deUint32 strideInBytes;
+ VK_VERTEX_INPUT_RATE_VERTEX, // VkVertexInputRate inputRate;
};
const VkVertexInputAttributeDescription vertexInputAttributeDescriptions[2] =
{
{
- 0u, // deUint32 location;
- 0u, // deUint32 binding;
- VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format;
- 0u // deUint32 offsetInBytes;
+ 0u, // deUint32 location;
+ 0u, // deUint32 binding;
+ VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format;
+ 0u // deUint32 offsetInBytes;
},
{
- 1u, // deUint32 location;
- 0u, // deUint32 binding;
- VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format;
- DE_OFFSET_OF(Vertex4RGBA, color), // deUint32 offsetInBytes;
+ 1u, // deUint32 location;
+ 0u, // deUint32 binding;
+ VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format;
+ DE_OFFSET_OF(Vertex4RGBA, color), // deUint32 offsetInBytes;
}
};
const VkPipelineVertexInputStateCreateInfo vertexInputStateParams =
{
- VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkPipelineVertexInputStateCreateFlags flags;
- 1u, // deUint32 vertexBindingDescriptionCount;
- &vertexInputBindingDescription, // const VkVertexInputBindingDescription* pVertexBindingDescriptions;
- 2u, // deUint32 vertexAttributeDescriptionCount;
- vertexInputAttributeDescriptions, // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions;
+ VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkPipelineVertexInputStateCreateFlags flags;
+ 1u, // deUint32 vertexBindingDescriptionCount;
+ &vertexInputBindingDescription, // const VkVertexInputBindingDescription* pVertexBindingDescriptions;
+ 2u, // deUint32 vertexAttributeDescriptionCount;
+ vertexInputAttributeDescriptions, // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions;
};
VkPrimitiveTopology primitiveTopology = (m_patchControlPoints > 0) ? VK_PRIMITIVE_TOPOLOGY_PATCH_LIST : VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
@@ -495,66 +548,66 @@
VkPipelineDepthStencilStateCreateInfo depthStencilStateParams =
{
- VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkPipelineDepthStencilStateCreateFlags flags;
- VK_TRUE, // VkBool32 depthTestEnable;
- VK_TRUE, // VkBool32 depthWriteEnable;
- VK_COMPARE_OP_LESS_OR_EQUAL, // VkCompareOp depthCompareOp;
- VK_FALSE, // VkBool32 depthBoundsTestEnable;
- VK_FALSE, // VkBool32 stencilTestEnable;
+ VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkPipelineDepthStencilStateCreateFlags flags;
+ VK_TRUE, // VkBool32 depthTestEnable;
+ VK_TRUE, // VkBool32 depthWriteEnable;
+ VK_COMPARE_OP_LESS_OR_EQUAL, // VkCompareOp depthCompareOp;
+ VK_FALSE, // VkBool32 depthBoundsTestEnable;
+ VK_FALSE, // VkBool32 stencilTestEnable;
// VkStencilOpState front;
{
- VK_STENCIL_OP_KEEP, // VkStencilOp failOp;
- VK_STENCIL_OP_KEEP, // VkStencilOp passOp;
- VK_STENCIL_OP_KEEP, // VkStencilOp depthFailOp;
- VK_COMPARE_OP_NEVER, // VkCompareOp compareOp;
- 0u, // deUint32 compareMask;
- 0u, // deUint32 writeMask;
- 0u, // deUint32 reference;
+ VK_STENCIL_OP_KEEP, // VkStencilOp failOp;
+ VK_STENCIL_OP_KEEP, // VkStencilOp passOp;
+ VK_STENCIL_OP_KEEP, // VkStencilOp depthFailOp;
+ VK_COMPARE_OP_NEVER, // VkCompareOp compareOp;
+ 0u, // deUint32 compareMask;
+ 0u, // deUint32 writeMask;
+ 0u, // deUint32 reference;
},
// VkStencilOpState back;
{
- VK_STENCIL_OP_KEEP, // VkStencilOp failOp;
- VK_STENCIL_OP_KEEP, // VkStencilOp passOp;
- VK_STENCIL_OP_KEEP, // VkStencilOp depthFailOp;
- VK_COMPARE_OP_NEVER, // VkCompareOp compareOp;
- 0u, // deUint32 compareMask;
- 0u, // deUint32 writeMask;
- 0u, // deUint32 reference;
+ VK_STENCIL_OP_KEEP, // VkStencilOp failOp;
+ VK_STENCIL_OP_KEEP, // VkStencilOp passOp;
+ VK_STENCIL_OP_KEEP, // VkStencilOp depthFailOp;
+ VK_COMPARE_OP_NEVER, // VkCompareOp compareOp;
+ 0u, // deUint32 compareMask;
+ 0u, // deUint32 writeMask;
+ 0u, // deUint32 reference;
},
- 0.0f, // float minDepthBounds;
- 1.0f, // float maxDepthBounds;
+ 0.0f, // float minDepthBounds;
+ 1.0f, // float maxDepthBounds;
};
- return makeGraphicsPipeline(vk, // const DeviceInterface& vk
- vkDevice, // const VkDevice device
- *m_pipelineLayout, // const VkPipelineLayout pipelineLayout
- vertShaderModule, // const VkShaderModule vertexShaderModule
- tessControlShaderModule, // const VkShaderModule tessellationControlModule
- tessEvalShaderModule, // const VkShaderModule tessellationEvalModule
- geomShaderModule, // const VkShaderModule geometryShaderModule
- fragShaderModule, // const VkShaderModule fragmentShaderModule
- renderPass, // const VkRenderPass renderPass
- viewports, // const std::vector<VkViewport>& viewports
- scissors, // const std::vector<VkRect2D>& scissors
- primitiveTopology, // const VkPrimitiveTopology topology
- 0u, // const deUint32 subpass
- m_patchControlPoints, // const deUint32 patchControlPoints
- &vertexInputStateParams, // const VkPipelineVertexInputStateCreateInfo* vertexInputStateCreateInfo
- DE_NULL, // const VkPipelineRasterizationStateCreateInfo* rasterizationStateCreateInfo
- DE_NULL, // const VkPipelineMultisampleStateCreateInfo* multisampleStateCreateInfo
- &depthStencilStateParams); // const VkPipelineDepthStencilStateCreateInfo* depthStencilStateCreateInfo
+ return makeGraphicsPipeline(vk, // const DeviceInterface& vk
+ vkDevice, // const VkDevice device
+ *m_pipelineLayout, // const VkPipelineLayout pipelineLayout
+ vertShaderModule, // const VkShaderModule vertexShaderModule
+ tessControlShaderModule, // const VkShaderModule tessellationControlModule
+ tessEvalShaderModule, // const VkShaderModule tessellationEvalModule
+ geomShaderModule, // const VkShaderModule geometryShaderModule
+ fragShaderModule, // const VkShaderModule fragmentShaderModule
+ renderPass, // const VkRenderPass renderPass
+ viewports, // const std::vector<VkViewport>& viewports
+ scissors, // const std::vector<VkRect2D>& scissors
+ primitiveTopology, // const VkPrimitiveTopology topology
+ 0u, // const deUint32 subpass
+ m_patchControlPoints, // const deUint32 patchControlPoints
+ &vertexInputStateParams, // const VkPipelineVertexInputStateCreateInfo* vertexInputStateCreateInfo
+ DE_NULL, // const VkPipelineRasterizationStateCreateInfo* rasterizationStateCreateInfo
+ DE_NULL, // const VkPipelineMultisampleStateCreateInfo* multisampleStateCreateInfo
+ &depthStencilStateParams); // const VkPipelineDepthStencilStateCreateInfo* depthStencilStateCreateInfo
}
-void SimpleGraphicsPipelineBuilder::enableTessellationStage(deUint32 patchControlPoints)
+void SimpleGraphicsPipelineBuilder::enableTessellationStage (deUint32 patchControlPoints)
{
m_patchControlPoints = patchControlPoints;
}
template <class Test>
-vkt::TestCase* newTestCase(tcu::TestContext& testContext,
- TimestampTestParam* testParam)
+vkt::TestCase* newTestCase (tcu::TestContext& testContext,
+ TimestampTestParam* testParam)
{
return new Test(testContext,
testParam->generateTestName().c_str(),
@@ -571,83 +624,75 @@
ENTRY_COUNT = 8
};
- TimestampTest(tcu::TestContext& testContext,
- const std::string& name,
- const std::string& description,
- const TimestampTestParam* param)
- : vkt::TestCase (testContext, name, description)
- , m_stages (param->getStageVector())
- , m_inRenderPass (param->getInRenderPass())
- , m_hostQueryReset (param->getHostQueryReset())
- { }
- virtual ~TimestampTest (void) { }
- virtual void initPrograms (SourceCollections& programCollection) const;
- virtual TestInstance* createInstance (Context& context) const;
+ TimestampTest (tcu::TestContext& testContext,
+ const std::string& name,
+ const std::string& description,
+ const TimestampTestParam* param)
+ : vkt::TestCase (testContext, name, description)
+ , m_stages (param->getStageVector())
+ , m_inRenderPass (param->getInRenderPass())
+ , m_hostQueryReset (param->getHostQueryReset())
+ { }
+ virtual ~TimestampTest (void) { }
+ virtual void initPrograms (SourceCollections& programCollection) const;
+ virtual TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
protected:
- const StageFlagVector m_stages;
- const bool m_inRenderPass;
- const bool m_hostQueryReset;
+ const StageFlagVector m_stages;
+ const bool m_inRenderPass;
+ const bool m_hostQueryReset;
};
class TimestampTestInstance : public vkt::TestInstance
{
public:
- TimestampTestInstance (Context& context,
- const StageFlagVector& stages,
- const bool inRenderPass,
- const bool hostQueryReset);
- virtual ~TimestampTestInstance (void);
- virtual tcu::TestStatus iterate (void);
-protected:
- virtual tcu::TestStatus verifyTimestamp (void);
- virtual void configCommandBuffer (void);
- Move<VkBuffer> createBufferAndBindMemory (VkDeviceSize size,
- VkBufferUsageFlags usage,
- de::MovePtr<Allocation>* pAlloc);
- Move<VkImage> createImage2DAndBindMemory (VkFormat format,
- deUint32 width,
- deUint32 height,
- VkImageUsageFlags usage,
- VkSampleCountFlagBits sampleCount,
- de::MovePtr<Allocation>* pAlloc);
-protected:
- const StageFlagVector m_stages;
- bool m_inRenderPass;
- bool m_hostQueryReset;
+ TimestampTestInstance (Context& context,
+ const StageFlagVector& stages,
+ const bool inRenderPass,
+ const bool hostQueryReset);
- Move<VkCommandPool> m_cmdPool;
- Move<VkCommandBuffer> m_cmdBuffer;
- Move<VkQueryPool> m_queryPool;
- deUint64* m_timestampValues;
- deUint64* m_timestampValuesHostQueryReset;
+ virtual ~TimestampTestInstance (void);
+ virtual tcu::TestStatus iterate (void);
+
+protected:
+ virtual tcu::TestStatus verifyTimestamp (void);
+ virtual void configCommandBuffer (void);
+
+ Move<VkBuffer> createBufferAndBindMemory (VkDeviceSize size,
+ VkBufferUsageFlags usage,
+ de::MovePtr<Allocation>* pAlloc);
+
+ Move<VkImage> createImage2DAndBindMemory (VkFormat format,
+ deUint32 width,
+ deUint32 height,
+ VkImageUsageFlags usage,
+ VkSampleCountFlagBits sampleCount,
+ de::MovePtr<Allocation>* pAlloc);
+
+protected:
+ const StageFlagVector m_stages;
+ bool m_inRenderPass;
+ bool m_hostQueryReset;
+
+ Move<VkCommandPool> m_cmdPool;
+ Move<VkCommandBuffer> m_cmdBuffer;
+ Move<VkQueryPool> m_queryPool;
+ deUint64* m_timestampValues;
+ deUint64* m_timestampValuesHostQueryReset;
+ deUint64 m_timestampMask;
};
-void TimestampTest::initPrograms(SourceCollections& programCollection) const
+void TimestampTest::initPrograms (SourceCollections& programCollection) const
{
vkt::TestCase::initPrograms(programCollection);
}
-TestInstance* TimestampTest::createInstance(Context& context) const
+void TimestampTest::checkSupport (Context& context) const
{
- return new TimestampTestInstance(context,m_stages,m_inRenderPass,m_hostQueryReset);
-}
-
-TimestampTestInstance::TimestampTestInstance(Context& context,
- const StageFlagVector& stages,
- const bool inRenderPass,
- const bool hostQueryReset)
- : TestInstance (context)
- , m_stages (stages)
- , m_inRenderPass (inRenderPass)
- , m_hostQueryReset (hostQueryReset)
-{
- const DeviceInterface& vk = context.getDeviceInterface();
- const VkDevice vkDevice = context.getDevice();
- const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
-
// Check support for timestamp queries
{
- const std::vector<VkQueueFamilyProperties> queueProperties = vk::getPhysicalDeviceQueueFamilyProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice());
+ const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
+ const std::vector<VkQueueFamilyProperties> queueProperties = vk::getPhysicalDeviceQueueFamilyProperties(context.getInstanceInterface(), context.getPhysicalDevice());
DE_ASSERT(queueFamilyIndex < (deUint32)queueProperties.size());
@@ -658,21 +703,43 @@
if (m_hostQueryReset)
{
// Check VK_EXT_host_query_reset is supported
- m_context.requireDeviceExtension("VK_EXT_host_query_reset");
- if(m_context.getHostQueryResetFeatures().hostQueryReset == VK_FALSE)
- throw tcu::NotSupportedError(std::string("Implementation doesn't support resetting queries from the host").c_str());
+ context.requireDeviceFunctionality("VK_EXT_host_query_reset");
+
+ if(context.getHostQueryResetFeatures().hostQueryReset == VK_FALSE)
+ throw tcu::NotSupportedError("Implementation doesn't support resetting queries from the host");
}
+}
+
+TestInstance* TimestampTest::createInstance (Context& context) const
+{
+ return new TimestampTestInstance(context,m_stages,m_inRenderPass,m_hostQueryReset);
+}
+
+TimestampTestInstance::TimestampTestInstance (Context& context,
+ const StageFlagVector& stages,
+ const bool inRenderPass,
+ const bool hostQueryReset)
+ : TestInstance (context)
+ , m_stages (stages)
+ , m_inRenderPass (inRenderPass)
+ , m_hostQueryReset (hostQueryReset)
+{
+ const DeviceInterface& vk = context.getDeviceInterface();
+ const VkDevice vkDevice = context.getDevice();
+ const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
+
+ m_timestampMask = checkTimestampsSupported(context);
// Create Query Pool
{
const VkQueryPoolCreateInfo queryPoolParams =
{
- VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkQueryPoolCreateFlags flags;
- VK_QUERY_TYPE_TIMESTAMP, // VkQueryType queryType;
- TimestampTest::ENTRY_COUNT, // deUint32 entryCount;
- 0u, // VkQueryPipelineStatisticFlags pipelineStatistics;
+ VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkQueryPoolCreateFlags flags;
+ VK_QUERY_TYPE_TIMESTAMP, // VkQueryType queryType;
+ TimestampTest::ENTRY_COUNT, // deUint32 entryCount;
+ 0u, // VkQueryPipelineStatisticFlags pipelineStatistics;
};
m_queryPool = createQueryPool(vk, vkDevice, &queryPoolParams);
@@ -693,7 +760,7 @@
m_timestampValuesHostQueryReset = DE_NULL;
}
-TimestampTestInstance::~TimestampTestInstance(void)
+TimestampTestInstance::~TimestampTestInstance (void)
{
delete[] m_timestampValues;
m_timestampValues = NULL;
@@ -702,7 +769,7 @@
m_timestampValuesHostQueryReset = NULL;
}
-void TimestampTestInstance::configCommandBuffer(void)
+void TimestampTestInstance::configCommandBuffer (void)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
@@ -712,73 +779,48 @@
vk.cmdResetQueryPool(*m_cmdBuffer, *m_queryPool, 0u, TimestampTest::ENTRY_COUNT);
deUint32 timestampEntry = 0;
- for (StageFlagVector::const_iterator it = m_stages.begin(); it != m_stages.end(); it++)
+ for (const auto& stage : m_stages)
{
- vk.cmdWriteTimestamp(*m_cmdBuffer, *it, *m_queryPool, timestampEntry++);
+ vk.cmdWriteTimestamp(*m_cmdBuffer, stage, *m_queryPool, timestampEntry++);
}
endCommandBuffer(vk, *m_cmdBuffer);
}
-tcu::TestStatus TimestampTestInstance::iterate(void)
+tcu::TestStatus TimestampTestInstance::iterate (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();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
+ const VkQueue queue = m_context.getUniversalQueue();
+ const deUint32 stageSize = (deUint32)m_stages.size();
configCommandBuffer();
-
if (m_hostQueryReset)
{
- vk.resetQueryPoolEXT(vkDevice, *m_queryPool, 0u, TimestampTest::ENTRY_COUNT);
+ vk.resetQueryPool(vkDevice, *m_queryPool, 0u, TimestampTest::ENTRY_COUNT);
}
-
submitCommandsAndWait(vk, vkDevice, queue, m_cmdBuffer.get());
- // Generate the timestamp mask
- deUint64 timestampMask;
- const std::vector<VkQueueFamilyProperties> queueProperties = vk::getPhysicalDeviceQueueFamilyProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice());
- if(queueProperties[queueFamilyIndex].timestampValidBits == 0)
- {
- return tcu::TestStatus::fail("Device does not support timestamp!");
- }
- else if (queueProperties[queueFamilyIndex].timestampValidBits < MIN_TIMESTAMP_VALID_BITS || queueProperties[queueFamilyIndex].timestampValidBits > MAX_TIMESTAMP_VALID_BITS)
- {
- std::ostringstream msg;
- msg << "Invalid value for timestampValidBits in queue index " << queueFamilyIndex;
- return tcu::TestStatus::fail(msg.str());
- }
- else if(queueProperties[queueFamilyIndex].timestampValidBits == MAX_TIMESTAMP_VALID_BITS)
- {
- timestampMask = 0xFFFFFFFFFFFFFFFF;
- }
- else
- {
- timestampMask = ((deUint64)1 << queueProperties[queueFamilyIndex].timestampValidBits) - 1;
- }
-
// Get timestamp value from query pool
- deUint32 stageSize = (deUint32)m_stages.size();
-
vk.getQueryPoolResults(vkDevice, *m_queryPool, 0u, stageSize, sizeof(deUint64) * stageSize, (void*)m_timestampValues, sizeof(deUint64), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT);
for (deUint32 ndx = 0; ndx < stageSize; ndx++)
{
- m_timestampValues[ndx] &= timestampMask;
+ m_timestampValues[ndx] &= m_timestampMask;
}
if(m_hostQueryReset)
{
// Initialize timestampValuesHostQueryReset values
deMemset(m_timestampValuesHostQueryReset, 0, sizeof(deUint64) * stageSize * 2);
+
for (deUint32 ndx = 0; ndx < stageSize; ndx++)
{
m_timestampValuesHostQueryReset[2 * ndx] = m_timestampValues[ndx];
}
// Host resets the query pool
- vk.resetQueryPoolEXT(vkDevice, *m_queryPool, 0u, stageSize);
+ vk.resetQueryPool(vkDevice, *m_queryPool, 0u, stageSize);
// Get timestamp value from query pool
vk::VkResult res = vk.getQueryPoolResults(vkDevice, *m_queryPool, 0u, stageSize, sizeof(deUint64) * stageSize * 2, (void*)m_timestampValuesHostQueryReset, sizeof(deUint64) * 2, VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
@@ -793,7 +835,7 @@
for (deUint32 ndx = 0; ndx < stageSize; ndx++)
{
- if ((m_timestampValuesHostQueryReset[2 * ndx] & timestampMask) != m_timestampValues[ndx])
+ if ((m_timestampValuesHostQueryReset[2 * ndx] & m_timestampMask) != m_timestampValues[ndx])
return tcu::TestStatus::fail("QueryPoolResults returned value was modified");
if (m_timestampValuesHostQueryReset[2 * ndx + 1] != 0u)
return tcu::TestStatus::fail("QueryPoolResults availability status is not zero");
@@ -803,7 +845,7 @@
return verifyTimestamp();
}
-tcu::TestStatus TimestampTestInstance::verifyTimestamp(void)
+tcu::TestStatus TimestampTestInstance::verifyTimestamp (void)
{
for (deUint32 first = 0; first < m_stages.size(); first++)
{
@@ -819,23 +861,23 @@
return tcu::TestStatus::pass("Timestamp increases steadily.");
}
-Move<VkBuffer> TimestampTestInstance::createBufferAndBindMemory(VkDeviceSize size, VkBufferUsageFlags usage, de::MovePtr<Allocation>* pAlloc)
+Move<VkBuffer> TimestampTestInstance::createBufferAndBindMemory (VkDeviceSize size, VkBufferUsageFlags usage, de::MovePtr<Allocation>* pAlloc)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice vkDevice = m_context.getDevice();
- const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
- SimpleAllocator memAlloc (vk, vkDevice, getPhysicalDeviceMemoryProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice()));
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
+ const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
+ SimpleAllocator memAlloc (vk, vkDevice, getPhysicalDeviceMemoryProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice()));
- const VkBufferCreateInfo vertexBufferParams =
+ const VkBufferCreateInfo vertexBufferParams =
{
- VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkBufferCreateFlags flags;
- size, // VkDeviceSize size;
- usage, // VkBufferUsageFlags usage;
- VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
- 1u, // deUint32 queueFamilyCount;
- &queueFamilyIndex // const deUint32* pQueueFamilyIndices;
+ VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkBufferCreateFlags flags;
+ size, // VkDeviceSize size;
+ usage, // VkBufferUsageFlags usage;
+ VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
+ 1u, // deUint32 queueFamilyCount;
+ &queueFamilyIndex // const deUint32* pQueueFamilyIndices;
};
Move<VkBuffer> vertexBuffer = createBuffer(vk, vkDevice, &vertexBufferParams);
@@ -849,21 +891,23 @@
return vertexBuffer;
}
-Move<VkImage> TimestampTestInstance::createImage2DAndBindMemory(VkFormat format,
- deUint32 width,
- deUint32 height,
- VkImageUsageFlags usage,
- VkSampleCountFlagBits sampleCount,
- de::details::MovePtr<Allocation>* pAlloc)
+Move<VkImage> TimestampTestInstance::createImage2DAndBindMemory (VkFormat format,
+ deUint32 width,
+ deUint32 height,
+ VkImageUsageFlags usage,
+ VkSampleCountFlagBits sampleCount,
+ de::details::MovePtr<Allocation>* pAlloc)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice vkDevice = m_context.getDevice();
- const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
- SimpleAllocator memAlloc (vk, vkDevice, getPhysicalDeviceMemoryProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice()));
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
+ const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
+ SimpleAllocator memAlloc (vk, vkDevice, getPhysicalDeviceMemoryProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice()));
// Optimal tiling feature check
- VkFormatProperties formatProperty;
+ VkFormatProperties formatProperty;
+
m_context.getInstanceInterface().getPhysicalDeviceFormatProperties(m_context.getPhysicalDevice(), format, &formatProperty);
+
if((usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) && !(formatProperty.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT))
{
// Remove color attachment usage if the optimal tiling feature does not support it
@@ -877,21 +921,21 @@
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;
- format, // VkFormat format;
- { width, height, 1u }, // VkExtent3D extent;
- 1u, // deUint32 mipLevels;
- 1u, // deUint32 arraySize;
- sampleCount, // deUint32 samples;
- VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
- usage, // VkImageUsageFlags usage;
- VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
- 1u, // deUint32 queueFamilyCount;
- &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
- VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
+ VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkImageCreateFlags flags;
+ VK_IMAGE_TYPE_2D, // VkImageType imageType;
+ format, // VkFormat format;
+ { width, height, 1u }, // VkExtent3D extent;
+ 1u, // deUint32 mipLevels;
+ 1u, // deUint32 arraySize;
+ sampleCount, // deUint32 samples;
+ VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
+ usage, // VkImageUsageFlags usage;
+ VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
+ 1u, // deUint32 queueFamilyCount;
+ &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
+ VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
};
Move<VkImage> image = createImage(vk, vkDevice, &colorImageParams);
@@ -915,15 +959,17 @@
const std::string& description)
: vkt::TestCase{testContext, name, description}
{ }
+
virtual ~CalibratedTimestampTest (void) override { }
virtual void initPrograms (SourceCollections& programCollection) const override;
+ virtual void checkSupport (Context& context) const override;
virtual vkt::TestInstance* createInstance (Context& context) const override;
};
class CalibratedTimestampTestInstance : public vkt::TestInstance
{
public:
- CalibratedTimestampTestInstance (Context& context);
+ CalibratedTimestampTestInstance (Context& context);
virtual ~CalibratedTimestampTestInstance (void) override { }
virtual tcu::TestStatus iterate (void) override;
virtual tcu::TestStatus runTest (void) = 0;
@@ -978,9 +1024,10 @@
class CalibratedTimestampDevDomainTestInstance : public CalibratedTimestampTestInstance
{
public:
- CalibratedTimestampDevDomainTestInstance (Context& context)
+ CalibratedTimestampDevDomainTestInstance (Context& context)
: CalibratedTimestampTestInstance{context}
{ }
+
virtual ~CalibratedTimestampDevDomainTestInstance (void) { }
virtual tcu::TestStatus runTest (void) override;
};
@@ -988,9 +1035,10 @@
class CalibratedTimestampHostDomainTestInstance : public CalibratedTimestampTestInstance
{
public:
- CalibratedTimestampHostDomainTestInstance (Context& context)
+ CalibratedTimestampHostDomainTestInstance (Context& context)
: CalibratedTimestampTestInstance{context}
{ }
+
virtual ~CalibratedTimestampHostDomainTestInstance (void) { }
virtual tcu::TestStatus runTest (void) override;
};
@@ -998,30 +1046,35 @@
class CalibratedTimestampCalibrationTestInstance : public CalibratedTimestampTestInstance
{
public:
- CalibratedTimestampCalibrationTestInstance (Context& context)
+ CalibratedTimestampCalibrationTestInstance (Context& context)
: CalibratedTimestampTestInstance{context}
{ }
+
virtual ~CalibratedTimestampCalibrationTestInstance (void) { }
virtual tcu::TestStatus runTest (void) override;
};
template <class T>
-void CalibratedTimestampTest<T>::initPrograms(SourceCollections& programCollection) const
+void CalibratedTimestampTest<T>::initPrograms (SourceCollections& programCollection) const
{
vkt::TestCase::initPrograms(programCollection);
}
template <class T>
-vkt::TestInstance* CalibratedTimestampTest<T>::createInstance(Context& context) const
+vkt::TestInstance* CalibratedTimestampTest<T>::createInstance (Context& context) const
{
return new T{context};
}
-CalibratedTimestampTestInstance::CalibratedTimestampTestInstance(Context& context)
+template <class T>
+void CalibratedTimestampTest<T>::checkSupport (Context& context) const
+{
+ context.requireDeviceFunctionality("VK_EXT_calibrated_timestamps");
+}
+
+CalibratedTimestampTestInstance::CalibratedTimestampTestInstance (Context& context)
: TestInstance{context}
{
- context.requireDeviceExtension("VK_EXT_calibrated_timestamps");
-
#if (DE_OS == DE_OS_WIN32)
LARGE_INTEGER freq;
if (!QueryPerformanceFrequency(&freq))
@@ -1035,31 +1088,12 @@
m_frequency = static_cast<deUint64>(freq.QuadPart);
#endif
- const InstanceInterface& vki = context.getInstanceInterface();
- const VkPhysicalDevice physDevice = context.getPhysicalDevice();
+ const InstanceInterface& vki = context.getInstanceInterface();
+ const VkPhysicalDevice physDevice = context.getPhysicalDevice();
+ const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
// Get timestamp mask.
- const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
- const std::vector<VkQueueFamilyProperties> queueProperties = vk::getPhysicalDeviceQueueFamilyProperties(vki, physDevice);
-
- DE_ASSERT(queueFamilyIndex < queueProperties.size());
-
- const deUint32 validBits = queueProperties[queueFamilyIndex].timestampValidBits;
-
- if (validBits == 0)
- throw tcu::NotSupportedError("Universal queue does not support timestamps");
-
- if (validBits < MIN_TIMESTAMP_VALID_BITS || validBits > MAX_TIMESTAMP_VALID_BITS)
- {
- std::ostringstream msg;
- msg << "Invalid value for timestampValidBits in queue index " << queueFamilyIndex;
- TCU_FAIL(msg.str());
- }
-
- if (validBits == MAX_TIMESTAMP_VALID_BITS)
- m_devTimestampMask = std::numeric_limits<deUint64>::max();
- else
- m_devTimestampMask = ((1ULL << validBits) - 1);
+ m_devTimestampMask = checkTimestampsSupported(context);
// Get calibreatable time domains.
m_timestampPeriod = getPhysicalDeviceProperties(vki, physDevice).limits.timestampPeriod;
@@ -1091,17 +1125,17 @@
m_hostDomains = getDomainSubset(domains, preferredHostDomains);
// Initialize command buffers and queries.
- const DeviceInterface& vk = context.getDeviceInterface();
- const VkDevice vkDevice = context.getDevice();
+ const DeviceInterface& vk = context.getDeviceInterface();
+ const VkDevice vkDevice = context.getDevice();
- const VkQueryPoolCreateInfo queryPoolParams =
+ const VkQueryPoolCreateInfo queryPoolParams =
{
- VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkQueryPoolCreateFlags flags;
- VK_QUERY_TYPE_TIMESTAMP, // VkQueryType queryType;
- 1u, // deUint32 entryCount;
- 0u, // VkQueryPipelineStatisticFlags pipelineStatistics;
+ VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkQueryPoolCreateFlags flags;
+ VK_QUERY_TYPE_TIMESTAMP, // VkQueryType queryType;
+ 1u, // deUint32 entryCount;
+ 0u, // VkQueryPipelineStatisticFlags pipelineStatistics;
};
m_queryPool = createQueryPool(vk, vkDevice, &queryPoolParams);
@@ -1114,7 +1148,7 @@
endCommandBuffer(vk, *m_cmdBuffer);
}
-std::vector<VkTimeDomainEXT> CalibratedTimestampTestInstance::getDomainSubset(const std::vector<VkTimeDomainEXT>& available, const std::vector<VkTimeDomainEXT>& interesting) const
+std::vector<VkTimeDomainEXT> CalibratedTimestampTestInstance::getDomainSubset (const std::vector<VkTimeDomainEXT>& available, const std::vector<VkTimeDomainEXT>& interesting) const
{
std::vector<VkTimeDomainEXT> subset;
std::set_intersection(begin(available), end(available), begin(interesting), end(interesting), std::back_inserter(subset));
@@ -1133,7 +1167,7 @@
}
}
-deUint64 CalibratedTimestampTestInstance::getHostNativeTimestamp(VkTimeDomainEXT hostDomain) const
+deUint64 CalibratedTimestampTestInstance::getHostNativeTimestamp (VkTimeDomainEXT hostDomain) const
{
#if (DE_OS == DE_OS_WIN32)
DE_ASSERT(hostDomain == VK_TIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_EXT);
@@ -1161,11 +1195,12 @@
#endif
}
-deUint64 CalibratedTimestampTestInstance::getHostNanoseconds(deUint64 hostTimestamp) const
+deUint64 CalibratedTimestampTestInstance::getHostNanoseconds (deUint64 hostTimestamp) const
{
#if (DE_OS == DE_OS_WIN32)
- deUint64 secs = hostTimestamp / m_frequency;
- deUint64 nanos = ((hostTimestamp % m_frequency) * kNanosecondsPerSecond) / m_frequency;
+ deUint64 secs = hostTimestamp / m_frequency;
+ deUint64 nanos = ((hostTimestamp % m_frequency) * kNanosecondsPerSecond) / m_frequency;
+
return ((secs * kNanosecondsPerSecond) + nanos);
#else
return hostTimestamp;
@@ -1174,7 +1209,7 @@
// This method will be used when devTicksDelta is (supposedly) a small amount of ticks between two events. We will check
// devTicksDelta is reasonably small for the calculation below to succeed without losing precision.
-deUint64 CalibratedTimestampTestInstance::getDeviceNanoseconds(deUint64 devTicksDelta) const
+deUint64 CalibratedTimestampTestInstance::getDeviceNanoseconds (deUint64 devTicksDelta) const
{
if (devTicksDelta > static_cast<deUint64>(std::numeric_limits<deUint32>::max()))
{
@@ -1185,7 +1220,7 @@
return static_cast<deUint64>(static_cast<double>(devTicksDelta) * m_timestampPeriod);
}
-tcu::TestStatus CalibratedTimestampTestInstance::iterate(void)
+tcu::TestStatus CalibratedTimestampTestInstance::iterate (void)
{
// Notes:
// 1) Clocks may overflow.
@@ -1204,24 +1239,14 @@
}
// Verify all invalid timestamp bits are zero.
-void CalibratedTimestampTestInstance::verifyDevTimestampMask(deUint64 value) const
+void CalibratedTimestampTestInstance::verifyDevTimestampMask (deUint64 value) const
{
- // The spec says:
- // timestampValidBits is the unsigned integer count of meaningful bits in
- // the timestamps written via vkCmdWriteTimestamp. The valid range for the
- // count is 36..64 bits, or a value of 0, indicating no support for
- // timestamps. Bits outside the valid range are guaranteed to be zeros.
- if (value > m_devTimestampMask)
- {
- std::ostringstream msg;
- msg << std::hex << "Invalid device timestamp value 0x" << value << " according to device timestamp mask 0x" << m_devTimestampMask;
- TCU_FAIL(msg.str());
- }
+ checkTimestampBits(value, m_devTimestampMask);
}
// Absolute difference between two timestamps A and B taking overflow into account. Pick the smallest difference between the two
// possibilities. We don't know beforehand if B > A or vice versa. Take the valid bit mask into account.
-deUint64 CalibratedTimestampTestInstance::absDiffWithOverflow(deUint64 a, deUint64 b, deUint64 mask) const
+deUint64 CalibratedTimestampTestInstance::absDiffWithOverflow (deUint64 a, deUint64 b, deUint64 mask) const
{
// <---------+ range +-------->
//
@@ -1239,14 +1264,17 @@
DE_ASSERT(b <= mask);
const deUint64 c = ((a >= b) ? (a - b) : (b - a));
+
if (c == 0u)
return c;
+
const deUint64 d = (mask - c) + 1;
+
return ((c < d) ? c : d);
}
// Positive difference between both marks, advancing from before to after, taking overflow and the valid bit mask into account.
-deUint64 CalibratedTimestampTestInstance::positiveDiffWithOverflow(deUint64 before, deUint64 after, deUint64 mask) const
+deUint64 CalibratedTimestampTestInstance::positiveDiffWithOverflow (deUint64 before, deUint64 after, deUint64 mask) const
{
DE_ASSERT(before <= mask);
DE_ASSERT(after <= mask);
@@ -1255,15 +1283,16 @@
}
// Return true if middle is not between begin and end, taking overflow into account.
-bool CalibratedTimestampTestInstance::outOfRange(deUint64 begin, deUint64 middle, deUint64 end) const
+bool CalibratedTimestampTestInstance::outOfRange (deUint64 begin, deUint64 middle, deUint64 end) const
{
return (((begin <= end) && (middle < begin || middle > end )) ||
((begin > end) && (middle > end && middle < begin)));
}
-std::vector<CalibratedTimestampTestInstance::CalibratedTimestamp> CalibratedTimestampTestInstance::getCalibratedTimestamps(const std::vector<VkTimeDomainEXT>& domains)
+std::vector<CalibratedTimestampTestInstance::CalibratedTimestamp> CalibratedTimestampTestInstance::getCalibratedTimestamps (const std::vector<VkTimeDomainEXT>& domains)
{
std::vector<VkCalibratedTimestampInfoEXT> infos;
+
for (auto domain : domains)
{
VkCalibratedTimestampInfoEXT info;
@@ -1296,30 +1325,33 @@
// Pack results.
std::vector<CalibratedTimestamp> results;
+
for (size_t i = 0; i < domains.size(); ++i)
{
if (domains[i] == VK_TIME_DOMAIN_DEVICE_EXT)
verifyDevTimestampMask(timestamps[i]);
results.emplace_back(timestamps[i], deviation);
}
+
return results;
}
-CalibratedTimestampTestInstance::CalibratedTimestamp CalibratedTimestampTestInstance::getCalibratedTimestamp(VkTimeDomainEXT domain)
+CalibratedTimestampTestInstance::CalibratedTimestamp CalibratedTimestampTestInstance::getCalibratedTimestamp (VkTimeDomainEXT domain)
{
// Single domain, single result.
return getCalibratedTimestamps(std::vector<VkTimeDomainEXT>(1, domain))[0];
}
-void CalibratedTimestampTestInstance::appendQualityMessage(const std::string& message)
+void CalibratedTimestampTestInstance::appendQualityMessage (const std::string& message)
{
if (!m_qualityMessage.empty())
m_qualityMessage += "; ";
+
m_qualityMessage += message;
}
// Test device domain makes sense and is consistent with vkCmdWriteTimestamp().
-tcu::TestStatus CalibratedTimestampDevDomainTestInstance::runTest()
+tcu::TestStatus CalibratedTimestampDevDomainTestInstance::runTest (void)
{
if (m_devDomains.empty())
throw tcu::NotSupportedError("No suitable device time domains found");
@@ -1353,7 +1385,7 @@
}
// Test host domain makes sense and is consistent with native host values.
-tcu::TestStatus CalibratedTimestampHostDomainTestInstance::runTest()
+tcu::TestStatus CalibratedTimestampHostDomainTestInstance::runTest (void)
{
if (m_hostDomains.empty())
throw tcu::NotSupportedError("No suitable host time domains found");
@@ -1380,7 +1412,7 @@
}
// Verify predictable timestamps and calibration possible.
-tcu::TestStatus CalibratedTimestampCalibrationTestInstance::runTest()
+tcu::TestStatus CalibratedTimestampCalibrationTestInstance::runTest (void)
{
if (m_devDomains.empty())
throw tcu::NotSupportedError("No suitable device time domains found");
@@ -1438,15 +1470,15 @@
class BasicGraphicsTest : public TimestampTest
{
public:
- BasicGraphicsTest(tcu::TestContext& testContext,
- const std::string& name,
- const std::string& description,
- const TimestampTestParam* param)
- : TimestampTest (testContext, name, description, param)
- { }
- virtual ~BasicGraphicsTest (void) { }
- virtual void initPrograms (SourceCollections& programCollection) const;
- virtual TestInstance* createInstance (Context& context) const;
+ BasicGraphicsTest (tcu::TestContext& testContext,
+ const std::string& name,
+ const std::string& description,
+ const TimestampTestParam* param)
+ : TimestampTest (testContext, name, description, param)
+{ }
+ virtual ~BasicGraphicsTest (void) { }
+ virtual void initPrograms (SourceCollections& programCollection) const;
+ virtual TestInstance* createInstance (Context& context) const;
};
class BasicGraphicsTestInstance : public TimestampTestInstance
@@ -1456,40 +1488,43 @@
{
VK_MAX_SHADER_STAGES = 6,
};
- BasicGraphicsTestInstance (Context& context,
- const StageFlagVector stages,
- const bool inRenderPass,
- const bool hostQueryReset);
- virtual ~BasicGraphicsTestInstance (void);
+ BasicGraphicsTestInstance (Context& context,
+ const StageFlagVector stages,
+ const bool inRenderPass,
+ const bool hostQueryReset);
+
+ virtual ~BasicGraphicsTestInstance (void);
protected:
- virtual void configCommandBuffer (void);
- virtual void buildVertexBuffer (void);
- virtual void buildRenderPass (VkFormat colorFormat,
- VkFormat depthFormat);
- virtual void buildFrameBuffer (tcu::UVec2 renderSize,
- VkFormat colorFormat,
- VkFormat depthFormat);
+ virtual void configCommandBuffer (void);
+ virtual void buildVertexBuffer (void);
+ virtual void buildRenderPass (VkFormat colorFormat,
+ VkFormat depthFormat);
+
+ virtual void buildFrameBuffer (tcu::UVec2 renderSize,
+ VkFormat colorFormat,
+ VkFormat depthFormat);
+
protected:
- const tcu::UVec2 m_renderSize;
- const VkFormat m_colorFormat;
- const VkFormat m_depthFormat;
+ const tcu::UVec2 m_renderSize;
+ const VkFormat m_colorFormat;
+ const VkFormat m_depthFormat;
- Move<VkImage> m_colorImage;
- de::MovePtr<Allocation> m_colorImageAlloc;
- Move<VkImage> m_depthImage;
- de::MovePtr<Allocation> m_depthImageAlloc;
- Move<VkImageView> m_colorAttachmentView;
- Move<VkImageView> m_depthAttachmentView;
- Move<VkRenderPass> m_renderPass;
- Move<VkFramebuffer> m_framebuffer;
- VkImageMemoryBarrier m_imageLayoutBarriers[2];
+ Move<VkImage> m_colorImage;
+ de::MovePtr<Allocation> m_colorImageAlloc;
+ Move<VkImage> m_depthImage;
+ de::MovePtr<Allocation> m_depthImageAlloc;
+ Move<VkImageView> m_colorAttachmentView;
+ Move<VkImageView> m_depthAttachmentView;
+ Move<VkRenderPass> m_renderPass;
+ Move<VkFramebuffer> m_framebuffer;
+ VkImageMemoryBarrier m_imageLayoutBarriers[2];
- de::MovePtr<Allocation> m_vertexBufferAlloc;
- Move<VkBuffer> m_vertexBuffer;
- std::vector<Vertex4RGBA> m_vertices;
+ de::MovePtr<Allocation> m_vertexBufferAlloc;
+ Move<VkBuffer> m_vertexBuffer;
+ std::vector<Vertex4RGBA> m_vertices;
- SimpleGraphicsPipelineBuilder m_pipelineBuilder;
- Move<VkPipeline> m_graphicsPipelines;
+ SimpleGraphicsPipelineBuilder m_pipelineBuilder;
+ Move<VkPipeline> m_graphicsPipelines;
};
void BasicGraphicsTest::initPrograms (SourceCollections& programCollection) const
@@ -1515,41 +1550,41 @@
"}\n");
}
-TestInstance* BasicGraphicsTest::createInstance(Context& context) const
+TestInstance* BasicGraphicsTest::createInstance (Context& context) const
{
return new BasicGraphicsTestInstance(context,m_stages,m_inRenderPass,m_hostQueryReset);
}
-void BasicGraphicsTestInstance::buildVertexBuffer(void)
+void BasicGraphicsTestInstance::buildVertexBuffer (void)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice vkDevice = m_context.getDevice();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
// Create vertex buffer
{
- m_vertexBuffer = createBufferAndBindMemory(1024u, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, &m_vertexBufferAlloc);
+ m_vertexBuffer = createBufferAndBindMemory(1024u, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, &m_vertexBufferAlloc);
+ m_vertices = createOverlappingQuads();
- m_vertices = createOverlappingQuads();
// Load vertices into vertex buffer
deMemcpy(m_vertexBufferAlloc->getHostPtr(), m_vertices.data(), m_vertices.size() * sizeof(Vertex4RGBA));
flushAlloc(vk, vkDevice, *m_vertexBufferAlloc);
}
}
-void BasicGraphicsTestInstance::buildRenderPass(VkFormat colorFormat, VkFormat depthFormat)
+void BasicGraphicsTestInstance::buildRenderPass (VkFormat colorFormat, VkFormat depthFormat)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice vkDevice = m_context.getDevice();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
// Create render pass
m_renderPass = makeRenderPass(vk, vkDevice, colorFormat, depthFormat);
}
-void BasicGraphicsTestInstance::buildFrameBuffer(tcu::UVec2 renderSize, VkFormat colorFormat, VkFormat depthFormat)
+void BasicGraphicsTestInstance::buildFrameBuffer (tcu::UVec2 renderSize, VkFormat colorFormat, VkFormat depthFormat)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice vkDevice = m_context.getDevice();
- const VkComponentMapping ComponentMappingRGBA = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A};
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
+ const VkComponentMapping ComponentMappingRGBA = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A};
// Create color image
{
@@ -1608,14 +1643,14 @@
{
const VkImageViewCreateInfo colorAttachmentViewParams =
{
- VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkImageViewCreateFlags flags;
- *m_colorImage, // VkImage image;
- VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType;
- colorFormat, // VkFormat format;
- ComponentMappingRGBA, // VkComponentMapping components;
- { VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u }, // VkImageSubresourceRange subresourceRange;
+ VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkImageViewCreateFlags flags;
+ *m_colorImage, // VkImage image;
+ VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType;
+ colorFormat, // VkFormat format;
+ ComponentMappingRGBA, // VkComponentMapping components;
+ { VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u }, // VkImageSubresourceRange subresourceRange;
};
m_colorAttachmentView = createImageView(vk, vkDevice, &colorAttachmentViewParams);
@@ -1625,14 +1660,14 @@
{
const VkImageViewCreateInfo depthAttachmentViewParams =
{
- VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkImageViewCreateFlags flags;
- *m_depthImage, // VkImage image;
- VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType;
- depthFormat, // VkFormat format;
- ComponentMappingRGBA, // VkComponentMapping components;
- { VK_IMAGE_ASPECT_DEPTH_BIT, 0u, 1u, 0u, 1u }, // VkImageSubresourceRange subresourceRange;
+ VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkImageViewCreateFlags flags;
+ *m_depthImage, // VkImage image;
+ VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType;
+ depthFormat, // VkFormat format;
+ ComponentMappingRGBA, // VkComponentMapping components;
+ { VK_IMAGE_ASPECT_DEPTH_BIT, 0u, 1u, 0u, 1u }, // VkImageSubresourceRange subresourceRange;
};
m_depthAttachmentView = createImageView(vk, vkDevice, &depthAttachmentViewParams);
@@ -1648,15 +1683,15 @@
const VkFramebufferCreateInfo framebufferParams =
{
- VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkFramebufferCreateFlags flags;
- *m_renderPass, // VkRenderPass renderPass;
- 2u, // deUint32 attachmentCount;
- attachmentBindInfos, // const VkImageView* pAttachments;
- (deUint32)renderSize.x(), // deUint32 width;
- (deUint32)renderSize.y(), // deUint32 height;
- 1u, // deUint32 layers;
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkFramebufferCreateFlags flags;
+ *m_renderPass, // VkRenderPass renderPass;
+ 2u, // deUint32 attachmentCount;
+ attachmentBindInfos, // const VkImageView* pAttachments;
+ (deUint32)renderSize.x(), // deUint32 width;
+ (deUint32)renderSize.y(), // deUint32 height;
+ 1u, // deUint32 layers;
};
m_framebuffer = createFramebuffer(vk, vkDevice, &framebufferParams);
@@ -1664,15 +1699,15 @@
}
-BasicGraphicsTestInstance::BasicGraphicsTestInstance(Context& context,
- const StageFlagVector stages,
- const bool inRenderPass,
- const bool hostQueryReset)
- : TimestampTestInstance (context,stages,inRenderPass, hostQueryReset)
- , m_renderSize (32, 32)
- , m_colorFormat (VK_FORMAT_R8G8B8A8_UNORM)
- , m_depthFormat (VK_FORMAT_D16_UNORM)
- , m_pipelineBuilder (context)
+BasicGraphicsTestInstance::BasicGraphicsTestInstance (Context& context,
+ const StageFlagVector stages,
+ const bool inRenderPass,
+ const bool hostQueryReset)
+ : TimestampTestInstance (context,stages,inRenderPass, hostQueryReset)
+ , m_renderSize (32, 32)
+ , m_colorFormat (VK_FORMAT_R8G8B8A8_UNORM)
+ , m_depthFormat (VK_FORMAT_D16_UNORM)
+ , m_pipelineBuilder (context)
{
buildVertexBuffer();
@@ -1687,11 +1722,11 @@
}
-BasicGraphicsTestInstance::~BasicGraphicsTestInstance(void)
+BasicGraphicsTestInstance::~BasicGraphicsTestInstance (void)
{
}
-void BasicGraphicsTestInstance::configCommandBuffer(void)
+void BasicGraphicsTestInstance::configCommandBuffer (void)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
@@ -1719,6 +1754,7 @@
if(m_inRenderPass)
{
deUint32 timestampEntry = 0u;
+
for (StageFlagVector::const_iterator it = m_stages.begin(); it != m_stages.end(); it++)
{
vk.cmdWriteTimestamp(*m_cmdBuffer, *it, *m_queryPool, timestampEntry++);
@@ -1730,6 +1766,7 @@
if(!m_inRenderPass)
{
deUint32 timestampEntry = 0u;
+
for (StageFlagVector::const_iterator it = m_stages.begin(); it != m_stages.end(); it++)
{
vk.cmdWriteTimestamp(*m_cmdBuffer, *it, *m_queryPool, timestampEntry++);
@@ -1742,36 +1779,40 @@
class AdvGraphicsTest : public BasicGraphicsTest
{
public:
- AdvGraphicsTest (tcu::TestContext& testContext,
- const std::string& name,
- const std::string& description,
- const TimestampTestParam* param)
+ AdvGraphicsTest (tcu::TestContext& testContext,
+ const std::string& name,
+ const std::string& description,
+ const TimestampTestParam* param)
: BasicGraphicsTest(testContext, name, description, param)
{ }
+
virtual ~AdvGraphicsTest (void) { }
- virtual void initPrograms (SourceCollections& programCollection) const;
- virtual TestInstance* createInstance (Context& context) const;
+ virtual void initPrograms (SourceCollections& programCollection) const;
+ virtual TestInstance* createInstance (Context& context) const;
};
class AdvGraphicsTestInstance : public BasicGraphicsTestInstance
{
public:
- AdvGraphicsTestInstance (Context& context,
- const StageFlagVector stages,
- const bool inRenderPass,
- const bool hostQueryReset);
- virtual ~AdvGraphicsTestInstance (void);
- virtual void configCommandBuffer (void);
+ AdvGraphicsTestInstance (Context& context,
+ const StageFlagVector stages,
+ const bool inRenderPass,
+ const bool hostQueryReset);
+
+ virtual ~AdvGraphicsTestInstance (void);
+ virtual void configCommandBuffer (void);
+
protected:
- virtual void featureSupportCheck (void);
+ virtual void featureSupportCheck (void);
+
protected:
- VkPhysicalDeviceFeatures m_features;
- deUint32 m_draw_count;
- de::MovePtr<Allocation> m_indirectBufferAlloc;
- Move<VkBuffer> m_indirectBuffer;
+ VkPhysicalDeviceFeatures m_features;
+ deUint32 m_draw_count;
+ de::MovePtr<Allocation> m_indirectBufferAlloc;
+ Move<VkBuffer> m_indirectBuffer;
};
-void AdvGraphicsTest::initPrograms(SourceCollections& programCollection) const
+void AdvGraphicsTest::initPrograms (SourceCollections& programCollection) const
{
BasicGraphicsTest::initPrograms(programCollection);
@@ -1835,12 +1876,12 @@
"}\n");
}
-TestInstance* AdvGraphicsTest::createInstance(Context& context) const
+TestInstance* AdvGraphicsTest::createInstance (Context& context) const
{
return new AdvGraphicsTestInstance(context,m_stages,m_inRenderPass,m_hostQueryReset);
}
-void AdvGraphicsTestInstance::featureSupportCheck(void)
+void AdvGraphicsTestInstance::featureSupportCheck (void)
{
for (StageFlagVector::const_iterator it = m_stages.begin(); it != m_stages.end(); it++)
{
@@ -1866,10 +1907,10 @@
}
}
-AdvGraphicsTestInstance::AdvGraphicsTestInstance(Context& context,
- const StageFlagVector stages,
- const bool inRenderPass,
- const bool hostQueryReset)
+AdvGraphicsTestInstance::AdvGraphicsTestInstance (Context& context,
+ const StageFlagVector stages,
+ const bool inRenderPass,
+ const bool hostQueryReset)
: BasicGraphicsTestInstance(context, stages, inRenderPass, hostQueryReset)
{
m_features = m_context.getDeviceFeatures();
@@ -1892,8 +1933,8 @@
m_graphicsPipelines = m_pipelineBuilder.buildPipeline(m_renderSize, *m_renderPass);
// Prepare the indirect draw buffer
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice vkDevice = m_context.getDevice();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
if(m_features.multiDrawIndirect == VK_TRUE)
{
@@ -1903,34 +1944,36 @@
{
m_draw_count = 1;
}
+
m_indirectBuffer = createBufferAndBindMemory(32u, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, &m_indirectBufferAlloc);
const VkDrawIndirectCommand indirectCmds[] =
{
{
- 12u, // deUint32 vertexCount;
- 1u, // deUint32 instanceCount;
- 0u, // deUint32 firstVertex;
- 0u, // deUint32 firstInstance;
+ 12u, // deUint32 vertexCount;
+ 1u, // deUint32 instanceCount;
+ 0u, // deUint32 firstVertex;
+ 0u, // deUint32 firstInstance;
},
{
- 12u, // deUint32 vertexCount;
- 1u, // deUint32 instanceCount;
- 11u, // deUint32 firstVertex;
- 0u, // deUint32 firstInstance;
+ 12u, // deUint32 vertexCount;
+ 1u, // deUint32 instanceCount;
+ 11u, // deUint32 firstVertex;
+ 0u, // deUint32 firstInstance;
},
};
+
// Load data into indirect draw buffer
deMemcpy(m_indirectBufferAlloc->getHostPtr(), indirectCmds, m_draw_count * sizeof(VkDrawIndirectCommand));
flushAlloc(vk, vkDevice, *m_indirectBufferAlloc);
}
-AdvGraphicsTestInstance::~AdvGraphicsTestInstance(void)
+AdvGraphicsTestInstance::~AdvGraphicsTestInstance (void)
{
}
-void AdvGraphicsTestInstance::configCommandBuffer(void)
+void AdvGraphicsTestInstance::configCommandBuffer (void)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
@@ -1983,26 +2026,28 @@
class BasicComputeTest : public TimestampTest
{
public:
- BasicComputeTest (tcu::TestContext& testContext,
- const std::string& name,
- const std::string& description,
- const TimestampTestParam* param)
+ BasicComputeTest (tcu::TestContext& testContext,
+ const std::string& name,
+ const std::string& description,
+ const TimestampTestParam* param)
: TimestampTest(testContext, name, description, param)
{ }
- virtual ~BasicComputeTest (void) { }
- virtual void initPrograms (SourceCollections& programCollection) const;
- virtual TestInstance* createInstance (Context& context) const;
+
+ virtual ~BasicComputeTest (void) { }
+ virtual void initPrograms (SourceCollections& programCollection) const;
+ virtual TestInstance* createInstance (Context& context) const;
};
class BasicComputeTestInstance : public TimestampTestInstance
{
public:
- BasicComputeTestInstance (Context& context,
- const StageFlagVector stages,
- const bool inRenderPass,
- const bool hostQueryReset);
- virtual ~BasicComputeTestInstance (void);
- virtual void configCommandBuffer (void);
+ BasicComputeTestInstance (Context& context,
+ const StageFlagVector stages,
+ const bool inRenderPass,
+ const bool hostQueryReset);
+
+ virtual ~BasicComputeTestInstance (void);
+ virtual void configCommandBuffer (void);
protected:
de::MovePtr<Allocation> m_inputBufAlloc;
Move<VkBuffer> m_inputBuf;
@@ -2018,7 +2063,7 @@
Move<VkPipeline> m_computePipelines;
};
-void BasicComputeTest::initPrograms(SourceCollections& programCollection) const
+void BasicComputeTest::initPrograms (SourceCollections& programCollection) const
{
TimestampTest::initPrograms(programCollection);
@@ -2041,25 +2086,28 @@
"}");
}
-TestInstance* BasicComputeTest::createInstance(Context& context) const
+TestInstance* BasicComputeTest::createInstance (Context& context) const
{
return new BasicComputeTestInstance(context,m_stages,m_inRenderPass, m_hostQueryReset);
}
-BasicComputeTestInstance::BasicComputeTestInstance(Context& context,
- const StageFlagVector stages,
- const bool inRenderPass,
- const bool hostQueryReset)
+BasicComputeTestInstance::BasicComputeTestInstance (Context& context,
+ const StageFlagVector stages,
+ const bool inRenderPass,
+ const bool hostQueryReset)
: TimestampTestInstance(context, stages, inRenderPass, hostQueryReset)
{
- const DeviceInterface& vk = context.getDeviceInterface();
- const VkDevice vkDevice = context.getDevice();
+ const DeviceInterface& vk = context.getDeviceInterface();
+ const VkDevice vkDevice = context.getDevice();
// Create buffer object, allocate storage, and generate input data
- const VkDeviceSize size = sizeof(tcu::Vec4) * 128u * 128u;
+ const VkDeviceSize size = sizeof(tcu::Vec4) * 128u * 128u;
+
m_inputBuf = createBufferAndBindMemory(size, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, &m_inputBufAlloc);
+
// Load vertices into buffer
- tcu::Vec4* pVec = reinterpret_cast<tcu::Vec4*>(m_inputBufAlloc->getHostPtr());
+ tcu::Vec4* pVec = reinterpret_cast<tcu::Vec4*>(m_inputBufAlloc->getHostPtr());
+
for (deUint32 ndx = 0u; ndx < (128u * 128u); ndx++)
{
for (deUint32 component = 0u; component < 4u; component++)
@@ -2067,11 +2115,13 @@
pVec[ndx][component]= (float)(ndx * (component + 1u));
}
}
+
flushAlloc(vk, vkDevice, *m_inputBufAlloc);
m_outputBuf = createBufferAndBindMemory(size, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, &m_outputBufAlloc);
- std::vector<VkDescriptorBufferInfo> descriptorInfos;
+ std::vector<VkDescriptorBufferInfo> descriptorInfos;
+
descriptorInfos.push_back(makeDescriptorBufferInfo(*m_inputBuf, 0u, size));
descriptorInfos.push_back(makeDescriptorBufferInfo(*m_outputBuf, 0u, size));
@@ -2091,11 +2141,11 @@
// Create descriptor set
const VkDescriptorSetAllocateInfo descriptorSetAllocInfo =
{
- VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- *m_descriptorPool, // VkDescriptorPool descriptorPool;
- 1u, // deUint32 setLayoutCount;
- &m_descriptorSetLayout.get(), // const VkDescriptorSetLayout* pSetLayouts;
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ *m_descriptorPool, // VkDescriptorPool descriptorPool;
+ 1u, // deUint32 setLayoutCount;
+ &m_descriptorSetLayout.get(), // const VkDescriptorSetLayout* pSetLayouts;
};
m_descriptorSet = allocateDescriptorSet(vk, vkDevice, &descriptorSetAllocInfo);
@@ -2109,13 +2159,13 @@
// Create compute pipeline layout
const VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo =
{
- VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkPipelineLayoutCreateFlags flags;
- 1u, // deUint32 setLayoutCount;
- &m_descriptorSetLayout.get(), // const VkDescriptorSetLayout* pSetLayouts;
- 0u, // deUint32 pushConstantRangeCount;
- DE_NULL, // const VkPushConstantRange* pPushConstantRanges;
+ VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkPipelineLayoutCreateFlags flags;
+ 1u, // deUint32 setLayoutCount;
+ &m_descriptorSetLayout.get(), // const VkDescriptorSetLayout* pSetLayouts;
+ 0u, // deUint32 pushConstantRangeCount;
+ DE_NULL, // const VkPushConstantRange* pPushConstantRanges;
};
m_pipelineLayout = createPipelineLayout(vk, vkDevice, &pipelineLayoutCreateInfo);
@@ -2123,11 +2173,11 @@
// Create compute shader
VkShaderModuleCreateInfo shaderModuleCreateInfo =
{
- VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkShaderModuleCreateFlags flags;
- m_context.getBinaryCollection().get("basic_compute").getSize(), // deUintptr codeSize;
- (deUint32*)m_context.getBinaryCollection().get("basic_compute").getBinary(), // const deUint32* pCode;
+ VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkShaderModuleCreateFlags flags;
+ m_context.getBinaryCollection().get("basic_compute").getSize(), // deUintptr codeSize;
+ (deUint32*)m_context.getBinaryCollection().get("basic_compute").getBinary(), // const deUint32* pCode;
};
@@ -2136,35 +2186,34 @@
// Create compute pipeline
const VkPipelineShaderStageCreateInfo stageCreateInfo =
{
- VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkPipelineShaderStageCreateFlags flags;
- VK_SHADER_STAGE_COMPUTE_BIT, // VkShaderStageFlagBits stage;
- *m_computeShaderModule, // VkShaderModule module;
- "main", // const char* pName;
- DE_NULL, // const VkSpecializationInfo* pSpecializationInfo;
+ VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkPipelineShaderStageCreateFlags flags;
+ VK_SHADER_STAGE_COMPUTE_BIT, // VkShaderStageFlagBits stage;
+ *m_computeShaderModule, // VkShaderModule module;
+ "main", // const char* pName;
+ DE_NULL, // const VkSpecializationInfo* pSpecializationInfo;
};
const VkComputePipelineCreateInfo pipelineCreateInfo =
{
- VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkPipelineCreateFlags flags;
- stageCreateInfo, // VkPipelineShaderStageCreateInfo stage;
- *m_pipelineLayout, // VkPipelineLayout layout;
- (VkPipeline)0, // VkPipeline basePipelineHandle;
- 0u, // deInt32 basePipelineIndex;
+ VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkPipelineCreateFlags flags;
+ stageCreateInfo, // VkPipelineShaderStageCreateInfo stage;
+ *m_pipelineLayout, // VkPipelineLayout layout;
+ (VkPipeline)0, // VkPipeline basePipelineHandle;
+ 0u, // deInt32 basePipelineIndex;
};
m_computePipelines = createComputePipeline(vk, vkDevice, (VkPipelineCache)0u, &pipelineCreateInfo);
-
}
-BasicComputeTestInstance::~BasicComputeTestInstance(void)
+BasicComputeTestInstance::~BasicComputeTestInstance (void)
{
}
-void BasicComputeTestInstance::configCommandBuffer(void)
+void BasicComputeTestInstance::configCommandBuffer (void)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
@@ -2189,13 +2238,15 @@
class TransferTest : public TimestampTest
{
public:
- TransferTest (tcu::TestContext& testContext,
- const std::string& name,
- const std::string& description,
- const TimestampTestParam* param);
- virtual ~TransferTest (void) { }
- virtual void initPrograms (SourceCollections& programCollection) const;
- virtual TestInstance* createInstance (Context& context) const;
+ TransferTest (tcu::TestContext& testContext,
+ const std::string& name,
+ const std::string& description,
+ const TimestampTestParam* param);
+
+ virtual ~TransferTest (void) { }
+ virtual void initPrograms (SourceCollections& programCollection) const;
+ virtual TestInstance* createInstance (Context& context) const;
+
protected:
TransferMethod m_method;
};
@@ -2208,6 +2259,7 @@
const bool inRenderPass,
const bool hostQueryReset,
const TransferMethod method);
+
virtual ~TransferTestInstance (void);
virtual void configCommandBuffer (void);
virtual void initialImageTransition (VkCommandBuffer cmdBuffer,
@@ -2237,31 +2289,31 @@
de::MovePtr<Allocation> m_msImageAlloc;
};
-TransferTest::TransferTest(tcu::TestContext& testContext,
- const std::string& name,
- const std::string& description,
- const TimestampTestParam* param)
+TransferTest::TransferTest (tcu::TestContext& testContext,
+ const std::string& name,
+ const std::string& description,
+ const TimestampTestParam* param)
: TimestampTest(testContext, name, description, param)
{
const TransferTimestampTestParam* transferParam = dynamic_cast<const TransferTimestampTestParam*>(param);
m_method = transferParam->getMethod();
}
-void TransferTest::initPrograms(SourceCollections& programCollection) const
+void TransferTest::initPrograms (SourceCollections& programCollection) const
{
TimestampTest::initPrograms(programCollection);
}
-TestInstance* TransferTest::createInstance(Context& context) const
+TestInstance* TransferTest::createInstance (Context& context) const
{
return new TransferTestInstance(context, m_stages, m_inRenderPass, m_hostQueryReset, m_method);
}
-TransferTestInstance::TransferTestInstance(Context& context,
- const StageFlagVector stages,
- const bool inRenderPass,
- const bool hostQueryReset,
- const TransferMethod method)
+TransferTestInstance::TransferTestInstance (Context& context,
+ const StageFlagVector stages,
+ const bool inRenderPass,
+ const bool hostQueryReset,
+ const TransferMethod method)
: TimestampTestInstance(context, stages, inRenderPass, hostQueryReset)
, m_method(method)
, m_bufSize(256u)
@@ -2270,8 +2322,8 @@
, m_imageHeight(4u)
, m_imageSize(256u)
{
- const DeviceInterface& vk = context.getDeviceInterface();
- const VkDevice vkDevice = context.getDevice();
+ const DeviceInterface& vk = context.getDeviceInterface();
+ const VkDevice vkDevice = context.getDevice();
// Create src buffer
m_srcBuffer = createBufferAndBindMemory(m_bufSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT, &m_srcBufferAlloc);
@@ -2282,32 +2334,32 @@
flushAlloc(vk, vkDevice, *m_srcBufferAlloc);
// Create dst buffer
- m_dstBuffer = createBufferAndBindMemory(m_bufSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, &m_dstBufferAlloc);
+ m_dstBuffer = createBufferAndBindMemory(m_bufSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, &m_dstBufferAlloc);
// Create src/dst/depth image
- m_srcImage = createImage2DAndBindMemory(m_imageFormat, m_imageWidth, m_imageHeight,
- VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
- VK_SAMPLE_COUNT_1_BIT,
- &m_srcImageAlloc);
- m_dstImage = createImage2DAndBindMemory(m_imageFormat, m_imageWidth, m_imageHeight,
- VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
- VK_SAMPLE_COUNT_1_BIT,
- &m_dstImageAlloc);
- m_depthImage = createImage2DAndBindMemory(VK_FORMAT_D16_UNORM, m_imageWidth, m_imageHeight,
- VK_IMAGE_USAGE_TRANSFER_DST_BIT,
- VK_SAMPLE_COUNT_1_BIT,
- &m_depthImageAlloc);
- m_msImage = createImage2DAndBindMemory(m_imageFormat, m_imageWidth, m_imageHeight,
- VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
- VK_SAMPLE_COUNT_4_BIT,
- &m_msImageAlloc);
+ m_srcImage = createImage2DAndBindMemory(m_imageFormat, m_imageWidth, m_imageHeight,
+ VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
+ VK_SAMPLE_COUNT_1_BIT,
+ &m_srcImageAlloc);
+ m_dstImage = createImage2DAndBindMemory(m_imageFormat, m_imageWidth, m_imageHeight,
+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
+ VK_SAMPLE_COUNT_1_BIT,
+ &m_dstImageAlloc);
+ m_depthImage = createImage2DAndBindMemory(VK_FORMAT_D16_UNORM, m_imageWidth, m_imageHeight,
+ VK_IMAGE_USAGE_TRANSFER_DST_BIT,
+ VK_SAMPLE_COUNT_1_BIT,
+ &m_depthImageAlloc);
+ m_msImage = createImage2DAndBindMemory(m_imageFormat, m_imageWidth, m_imageHeight,
+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
+ VK_SAMPLE_COUNT_4_BIT,
+ &m_msImageAlloc);
}
-TransferTestInstance::~TransferTestInstance(void)
+TransferTestInstance::~TransferTestInstance (void)
{
}
-void TransferTestInstance::configCommandBuffer(void)
+void TransferTestInstance::configCommandBuffer (void)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
@@ -2326,19 +2378,19 @@
};
const struct VkImageSubresourceRange subRangeColor =
{
- VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
- 0u, // deUint32 baseMipLevel;
- 1u, // deUint32 mipLevels;
- 0u, // deUint32 baseArrayLayer;
- 1u, // deUint32 arraySize;
+ VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
+ 0u, // deUint32 baseMipLevel;
+ 1u, // deUint32 mipLevels;
+ 0u, // deUint32 baseArrayLayer;
+ 1u, // deUint32 arraySize;
};
const struct VkImageSubresourceRange subRangeDepth =
{
- VK_IMAGE_ASPECT_DEPTH_BIT, // VkImageAspectFlags aspectMask;
- 0u, // deUint32 baseMipLevel;
- 1u, // deUint32 mipLevels;
- 0u, // deUint32 baseArrayLayer;
- 1u, // deUint32 arraySize;
+ VK_IMAGE_ASPECT_DEPTH_BIT, // VkImageAspectFlags aspectMask;
+ 0u, // deUint32 baseMipLevel;
+ 1u, // deUint32 mipLevels;
+ 0u, // deUint32 baseArrayLayer;
+ 1u, // deUint32 arraySize;
};
initialImageTransition(*m_cmdBuffer, *m_srcImage, subRangeColor, VK_IMAGE_LAYOUT_GENERAL);
@@ -2353,25 +2405,27 @@
// Copy Operations
const VkImageSubresourceLayers imgSubResCopy =
{
- VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
- 0u, // deUint32 mipLevel;
- 0u, // deUint32 baseArrayLayer;
- 1u, // deUint32 layerCount;
+ VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
+ 0u, // deUint32 mipLevel;
+ 0u, // deUint32 baseArrayLayer;
+ 1u, // deUint32 layerCount;
};
const VkOffset3D nullOffset = {0u, 0u, 0u};
const VkExtent3D imageExtent = {(deUint32)m_imageWidth, (deUint32)m_imageHeight, 1u};
const VkOffset3D imageOffset = {(int)m_imageWidth, (int)m_imageHeight, 1};
+
switch(m_method)
{
case TRANSFER_METHOD_COPY_BUFFER:
{
const VkBufferCopy copyBufRegion =
{
- 0u, // VkDeviceSize srcOffset;
- 0u, // VkDeviceSize destOffset;
- m_bufSize, // VkDeviceSize copySize;
+ 0u, // VkDeviceSize srcOffset;
+ 0u, // VkDeviceSize destOffset;
+ m_bufSize, // VkDeviceSize copySize;
};
+
vk.cmdCopyBuffer(*m_cmdBuffer, *m_srcBuffer, *m_dstBuffer, 1u, ©BufRegion);
break;
}
@@ -2379,13 +2433,14 @@
{
const VkImageCopy copyImageRegion =
{
- imgSubResCopy, // VkImageSubresourceCopy srcSubresource;
- nullOffset, // VkOffset3D srcOffset;
- imgSubResCopy, // VkImageSubresourceCopy destSubresource;
- nullOffset, // VkOffset3D destOffset;
- imageExtent, // VkExtent3D extent;
+ imgSubResCopy, // VkImageSubresourceCopy srcSubresource;
+ nullOffset, // VkOffset3D srcOffset;
+ imgSubResCopy, // VkImageSubresourceCopy destSubresource;
+ nullOffset, // VkOffset3D destOffset;
+ imageExtent, // VkExtent3D extent;
};
+
vk.cmdCopyImage(*m_cmdBuffer, *m_srcImage, VK_IMAGE_LAYOUT_GENERAL, *m_dstImage, VK_IMAGE_LAYOUT_GENERAL, 1u, ©ImageRegion);
break;
}
@@ -2393,13 +2448,14 @@
{
const VkBufferImageCopy bufImageCopy =
{
- 0u, // VkDeviceSize bufferOffset;
- (deUint32)m_imageWidth, // deUint32 bufferRowLength;
- (deUint32)m_imageHeight, // deUint32 bufferImageHeight;
- imgSubResCopy, // VkImageSubresourceCopy imageSubresource;
- nullOffset, // VkOffset3D imageOffset;
- imageExtent, // VkExtent3D imageExtent;
+ 0u, // VkDeviceSize bufferOffset;
+ (deUint32)m_imageWidth, // deUint32 bufferRowLength;
+ (deUint32)m_imageHeight, // deUint32 bufferImageHeight;
+ imgSubResCopy, // VkImageSubresourceCopy imageSubresource;
+ nullOffset, // VkOffset3D imageOffset;
+ imageExtent, // VkExtent3D imageExtent;
};
+
vk.cmdCopyBufferToImage(*m_cmdBuffer, *m_srcBuffer, *m_dstImage, VK_IMAGE_LAYOUT_GENERAL, 1u, &bufImageCopy);
break;
}
@@ -2407,13 +2463,14 @@
{
const VkBufferImageCopy imgBufferCopy =
{
- 0u, // VkDeviceSize bufferOffset;
- (deUint32)m_imageWidth, // deUint32 bufferRowLength;
- (deUint32)m_imageHeight, // deUint32 bufferImageHeight;
- imgSubResCopy, // VkImageSubresourceCopy imageSubresource;
- nullOffset, // VkOffset3D imageOffset;
- imageExtent, // VkExtent3D imageExtent;
+ 0u, // VkDeviceSize bufferOffset;
+ (deUint32)m_imageWidth, // deUint32 bufferRowLength;
+ (deUint32)m_imageHeight, // deUint32 bufferImageHeight;
+ imgSubResCopy, // VkImageSubresourceCopy imageSubresource;
+ nullOffset, // VkOffset3D imageOffset;
+ imageExtent, // VkExtent3D imageExtent;
};
+
vk.cmdCopyImageToBuffer(*m_cmdBuffer, *m_srcImage, VK_IMAGE_LAYOUT_GENERAL, *m_dstBuffer, 1u, &imgBufferCopy);
break;
}
@@ -2421,17 +2478,18 @@
{
const VkImageBlit imageBlt =
{
- imgSubResCopy, // VkImageSubresourceCopy srcSubresource;
+ imgSubResCopy, // VkImageSubresourceCopy srcSubresource;
{
nullOffset,
imageOffset,
},
- imgSubResCopy, // VkImageSubresourceCopy destSubresource;
+ imgSubResCopy, // VkImageSubresourceCopy destSubresource;
{
nullOffset,
imageOffset,
}
};
+
vk.cmdBlitImage(*m_cmdBuffer, *m_srcImage, VK_IMAGE_LAYOUT_GENERAL, *m_dstImage, VK_IMAGE_LAYOUT_GENERAL, 1u, &imageBlt, VK_FILTER_NEAREST);
break;
}
@@ -2443,11 +2501,13 @@
case TRANSFER_METHOD_CLEAR_DEPTH_STENCIL_IMAGE:
{
initialImageTransition(*m_cmdBuffer, *m_depthImage, subRangeDepth, VK_IMAGE_LAYOUT_GENERAL);
+
const VkClearDepthStencilValue clearDSValue =
{
- 1.0f, // float depth;
- 0u, // deUint32 stencil;
+ 1.0f, // float depth;
+ 0u, // deUint32 stencil;
};
+
vk.cmdClearDepthStencilImage(*m_cmdBuffer, *m_depthImage, VK_IMAGE_LAYOUT_GENERAL, &clearDSValue, 1u, &subRangeDepth);
break;
}
@@ -2462,6 +2522,7 @@
{
0xdeadbeef, 0xabcdef00, 0x12345678
};
+
vk.cmdUpdateBuffer(*m_cmdBuffer, *m_dstBuffer, 0x10, sizeof(data), data);
break;
}
@@ -2482,6 +2543,7 @@
0ull, // VkDeviceSize offset;
VK_WHOLE_SIZE // VkDeviceSize size;
};
+
vk.cmdPipelineBarrier(*m_cmdBuffer, vk::VK_PIPELINE_STAGE_TRANSFER_BIT, vk::VK_PIPELINE_STAGE_HOST_BIT, 0u,
0u, DE_NULL, 1u, &bufferBarrier, 0u, DE_NULL);
@@ -2498,6 +2560,7 @@
nullOffset, // VkOffset3D destOffset;
imageExtent, // VkExtent3D extent;
};
+
initialImageTransition(*m_cmdBuffer, *m_msImage, subRangeColor, VK_IMAGE_LAYOUT_GENERAL);
vk.cmdClearColorImage(*m_cmdBuffer, *m_msImage, VK_IMAGE_LAYOUT_GENERAL, &srcClearValue, 1u, &subRangeColor);
vk.cmdResolveImage(*m_cmdBuffer, *m_msImage, VK_IMAGE_LAYOUT_GENERAL, *m_dstImage, VK_IMAGE_LAYOUT_GENERAL, 1u, &imageResolve);
@@ -2509,6 +2572,7 @@
};
deUint32 timestampEntry = 0u;
+
for (StageFlagVector::const_iterator it = m_stages.begin(); it != m_stages.end(); it++)
{
vk.cmdWriteTimestamp(*m_cmdBuffer, *it, *m_queryPool, timestampEntry++);
@@ -2520,18 +2584,19 @@
void TransferTestInstance::initialImageTransition (VkCommandBuffer cmdBuffer, VkImage image, VkImageSubresourceRange subRange, VkImageLayout layout)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
+
const VkImageMemoryBarrier imageMemBarrier =
{
- VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkAccessFlags srcAccessMask;
- 0u, // VkAccessFlags dstAccessMask;
- VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
- layout, // VkImageLayout newLayout;
- VK_QUEUE_FAMILY_IGNORED, // uint32_t srcQueueFamilyIndex;
- VK_QUEUE_FAMILY_IGNORED, // uint32_t dstQueueFamilyIndex;
- image, // VkImage image;
- subRange // VkImageSubresourceRange subresourceRange;
+ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkAccessFlags srcAccessMask;
+ 0u, // VkAccessFlags dstAccessMask;
+ VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
+ layout, // VkImageLayout newLayout;
+ VK_QUEUE_FAMILY_IGNORED, // uint32_t srcQueueFamilyIndex;
+ VK_QUEUE_FAMILY_IGNORED, // uint32_t dstQueueFamilyIndex;
+ image, // VkImage image;
+ subRange // VkImageSubresourceRange subresourceRange;
};
vk.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 0, 0, DE_NULL, 0, DE_NULL, 1, &imageMemBarrier);
@@ -2571,17 +2636,17 @@
de::MovePtr<Allocation> m_resultBufferMemory;
};
-void ResetTimestampQueryBeforeCopyTest::initPrograms(SourceCollections& programCollection) const
+void ResetTimestampQueryBeforeCopyTest::initPrograms (SourceCollections& programCollection) const
{
vkt::TestCase::initPrograms(programCollection);
}
-TestInstance* ResetTimestampQueryBeforeCopyTest::createInstance(Context& context) const
+TestInstance* ResetTimestampQueryBeforeCopyTest::createInstance (Context& context) const
{
return new ResetTimestampQueryBeforeCopyTestInstance(context);
}
-ResetTimestampQueryBeforeCopyTestInstance::ResetTimestampQueryBeforeCopyTestInstance(Context& context)
+ResetTimestampQueryBeforeCopyTestInstance::ResetTimestampQueryBeforeCopyTestInstance (Context& context)
: vkt::TestInstance(context)
{
const DeviceInterface& vk = context.getDeviceInterface();
@@ -2590,12 +2655,7 @@
Allocator& allocator = m_context.getDefaultAllocator();
// Check support for timestamp queries
- {
- const std::vector<VkQueueFamilyProperties> queueProperties = vk::getPhysicalDeviceQueueFamilyProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice());
- DE_ASSERT(static_cast<size_t>(queueFamilyIndex) < queueProperties.size());
- if (queueProperties[queueFamilyIndex].timestampValidBits == 0)
- throw tcu::NotSupportedError("Universal queue does not support timestamps");
- }
+ checkTimestampsSupported(context);
const VkQueryPoolCreateInfo queryPoolParams =
{
@@ -2628,20 +2688,34 @@
m_resultBufferMemory = allocator.allocate(getBufferMemoryRequirements(vk, vkDevice, *m_resultBuffer), MemoryRequirement::HostVisible);
VK_CHECK(vk.bindBufferMemory(vkDevice, *m_resultBuffer, m_resultBufferMemory->getMemory(), m_resultBufferMemory->getOffset()));
+ 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_HOST_READ_BIT, // VkAccessFlags dstAccessMask;
+ VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
+ VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
+ *m_resultBuffer, // VkBuffer buffer;
+ 0ull, // VkDeviceSize offset;
+ VK_WHOLE_SIZE // VkDeviceSize size;
+ };
+
// Prepare command buffer.
beginCommandBuffer(vk, *m_cmdBuffer, 0u);
vk.cmdResetQueryPool(*m_cmdBuffer, *m_queryPool, 0u, 1u);
vk.cmdWriteTimestamp(*m_cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, *m_queryPool, 0u);
vk.cmdResetQueryPool(*m_cmdBuffer, *m_queryPool, 0u, 1u);
vk.cmdCopyQueryPoolResults(*m_cmdBuffer, *m_queryPool, 0u, 1u, *m_resultBuffer, 0u, sizeof(TimestampWithAvailability), (VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT));
+ vk.cmdPipelineBarrier(*m_cmdBuffer, vk::VK_PIPELINE_STAGE_TRANSFER_BIT, vk::VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL, 1u, &bufferBarrier, 0u, DE_NULL);
endCommandBuffer(vk, *m_cmdBuffer);
}
-tcu::TestStatus ResetTimestampQueryBeforeCopyTestInstance::iterate(void)
+tcu::TestStatus ResetTimestampQueryBeforeCopyTestInstance::iterate (void)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkDevice vkDevice = m_context.getDevice();
- const VkQueue queue = m_context.getUniversalQueue();
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
+ const VkQueue queue = m_context.getUniversalQueue();
TimestampWithAvailability ta;
submitCommandsAndWait(vk, vkDevice, queue, m_cmdBuffer.get());
@@ -2672,7 +2746,7 @@
TwoCmdBuffersTestInstance (Context& context,
const StageFlagVector stages,
const bool inRenderPass,
- const bool hostQueryReset,
+ const bool hostQueryReset,
VkCommandBufferLevel cmdBufferLevel);
virtual ~TwoCmdBuffersTestInstance (void);
virtual tcu::TestStatus iterate (void);
@@ -2694,7 +2768,7 @@
TwoCmdBuffersTestInstance::TwoCmdBuffersTestInstance (Context& context,
const StageFlagVector stages,
const bool inRenderPass,
- const bool hostQueryReset,
+ const bool hostQueryReset,
VkCommandBufferLevel cmdBufferLevel)
: TimestampTestInstance (context, stages, inRenderPass, hostQueryReset), m_cmdBufferLevel(cmdBufferLevel)
{
@@ -2742,7 +2816,7 @@
vk.cmdWriteTimestamp(*m_cmdBuffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, *m_queryPool, 0);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
VK_CHECK(vk.beginCommandBuffer(*m_secondCmdBuffer, &cmdBufferBeginInfo));
- vk.cmdCopyQueryPoolResults(*m_secondCmdBuffer, *m_queryPool, 0u, 1u, *m_dstBuffer, 0u, 0u, 0u);
+ vk.cmdCopyQueryPoolResults(*m_secondCmdBuffer, *m_queryPool, 0u, 1u, *m_dstBuffer, 0u, 0u, VK_QUERY_RESULT_WAIT_BIT);
vk.cmdPipelineBarrier(*m_secondCmdBuffer, vk::VK_PIPELINE_STAGE_TRANSFER_BIT, vk::VK_PIPELINE_STAGE_HOST_BIT, 0u,
0u, DE_NULL, 1u, &bufferBarrier, 0u, DE_NULL);
VK_CHECK(vk.endCommandBuffer(*m_secondCmdBuffer));
@@ -2775,7 +2849,7 @@
VK_CHECK(vk.endCommandBuffer(*m_secondCmdBuffer));
VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo));
vk.cmdExecuteCommands(m_cmdBuffer.get(), 1u, &m_secondCmdBuffer.get());
- vk.cmdCopyQueryPoolResults(*m_cmdBuffer, *m_queryPool, 0u, 1u, *m_dstBuffer, 0u, 0u, 0u);
+ vk.cmdCopyQueryPoolResults(*m_cmdBuffer, *m_queryPool, 0u, 1u, *m_dstBuffer, 0u, 0u, VK_QUERY_RESULT_WAIT_BIT);
vk.cmdPipelineBarrier(*m_cmdBuffer, vk::VK_PIPELINE_STAGE_TRANSFER_BIT, vk::VK_PIPELINE_STAGE_HOST_BIT, 0u,
0u, DE_NULL, 1u, &bufferBarrier, 0u, DE_NULL);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
@@ -2807,7 +2881,7 @@
if (m_hostQueryReset)
{
// Only reset the pool for the primary command buffer, the secondary command buffer will reset the pool by itself.
- vk.resetQueryPoolEXT(m_context.getDevice(), *m_queryPool, 0u, TimestampTest::ENTRY_COUNT);
+ vk.resetQueryPool(m_context.getDevice(), *m_queryPool, 0u, TimestampTest::ENTRY_COUNT);
}
VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, DE_NULL));
@@ -2817,6 +2891,175 @@
return tcu::TestStatus::pass("Pass");
}
+class ConsistentQueryResultsTest : public vkt::TestCase
+{
+public:
+ ConsistentQueryResultsTest (tcu::TestContext& testContext,
+ const std::string& name,
+ const std::string& description)
+ : vkt::TestCase(testContext, name, description)
+ { }
+ virtual ~ConsistentQueryResultsTest (void) { }
+ virtual void initPrograms (SourceCollections& programCollection) const;
+ virtual TestInstance* createInstance (Context& context) const;
+};
+
+class ConsistentQueryResultsTestInstance : public vkt::TestInstance
+{
+public:
+ ConsistentQueryResultsTestInstance (Context& context);
+ virtual ~ConsistentQueryResultsTestInstance (void) { }
+ virtual tcu::TestStatus iterate (void);
+protected:
+ Move<VkCommandPool> m_cmdPool;
+ Move<VkCommandBuffer> m_cmdBuffer;
+ Move<VkQueryPool> m_queryPool;
+
+ deUint64 m_timestampMask;
+ Move<VkBuffer> m_resultBuffer32Bits;
+ Move<VkBuffer> m_resultBuffer64Bits;
+ de::MovePtr<Allocation> m_resultBufferMemory32Bits;
+ de::MovePtr<Allocation> m_resultBufferMemory64Bits;
+};
+
+void ConsistentQueryResultsTest::initPrograms(SourceCollections& programCollection) const
+{
+ vkt::TestCase::initPrograms(programCollection);
+}
+
+TestInstance* ConsistentQueryResultsTest::createInstance(Context& context) const
+{
+ return new ConsistentQueryResultsTestInstance(context);
+}
+
+ConsistentQueryResultsTestInstance::ConsistentQueryResultsTestInstance(Context& context)
+ : vkt::TestInstance(context)
+{
+ const DeviceInterface& vk = context.getDeviceInterface();
+ const VkDevice vkDevice = context.getDevice();
+ const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
+ Allocator& allocator = m_context.getDefaultAllocator();
+
+ // Check support for timestamp queries
+ m_timestampMask = checkTimestampsSupported(context);
+
+ const VkQueryPoolCreateInfo queryPoolParams =
+ {
+ VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkQueryPoolCreateFlags flags;
+ VK_QUERY_TYPE_TIMESTAMP, // VkQueryType queryType;
+ 1u, // deUint32 entryCount;
+ 0u, // VkQueryPipelineStatisticFlags pipelineStatistics;
+ };
+
+ m_queryPool = createQueryPool(vk, vkDevice, &queryPoolParams);
+ m_cmdPool = createCommandPool(vk, vkDevice, VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, queueFamilyIndex);
+ m_cmdBuffer = allocateCommandBuffer(vk, vkDevice, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+
+ // Create results buffer.
+ VkBufferCreateInfo bufferCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkBufferCreateFlags flags;
+ 0u, // VkDeviceSize size;
+ VK_BUFFER_USAGE_TRANSFER_DST_BIT, // VkBufferUsageFlags usage;
+ VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
+ 1u, // deUint32 queueFamilyIndexCount;
+ &queueFamilyIndex // const deUint32* pQueueFamilyIndices;
+ };
+
+ // 32 bits.
+ bufferCreateInfo.size = sizeof(deUint32);
+ m_resultBuffer32Bits = createBuffer(vk, vkDevice, &bufferCreateInfo);
+ m_resultBufferMemory32Bits = allocator.allocate(getBufferMemoryRequirements(vk, vkDevice, *m_resultBuffer32Bits), MemoryRequirement::HostVisible);
+ VK_CHECK(vk.bindBufferMemory(vkDevice, *m_resultBuffer32Bits, m_resultBufferMemory32Bits->getMemory(), m_resultBufferMemory32Bits->getOffset()));
+
+ // 64 bits.
+ bufferCreateInfo.size = sizeof(deUint64);
+ m_resultBuffer64Bits = createBuffer(vk, vkDevice, &bufferCreateInfo);
+ m_resultBufferMemory64Bits = allocator.allocate(getBufferMemoryRequirements(vk, vkDevice, *m_resultBuffer64Bits), MemoryRequirement::HostVisible);
+ VK_CHECK(vk.bindBufferMemory(vkDevice, *m_resultBuffer64Bits, m_resultBufferMemory64Bits->getMemory(), m_resultBufferMemory64Bits->getOffset()));
+
+ 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_HOST_READ_BIT, // VkAccessFlags dstAccessMask;
+ VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
+ VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
+ DE_NULL, // VkBuffer buffer;
+ 0ull, // VkDeviceSize offset;
+ VK_WHOLE_SIZE // VkDeviceSize size;
+ };
+
+ // Prepare command buffer.
+ beginCommandBuffer(vk, *m_cmdBuffer, 0u);
+ vk.cmdResetQueryPool(*m_cmdBuffer, *m_queryPool, 0u, 1u);
+ vk.cmdWriteTimestamp(*m_cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, *m_queryPool, 0u);
+
+ // 32 bits.
+ bufferBarrier.buffer = *m_resultBuffer32Bits;
+ vk.cmdCopyQueryPoolResults(*m_cmdBuffer, *m_queryPool, 0u, 1u, *m_resultBuffer32Bits, 0u, sizeof(deUint32), VK_QUERY_RESULT_WAIT_BIT);
+ vk.cmdPipelineBarrier(*m_cmdBuffer, vk::VK_PIPELINE_STAGE_TRANSFER_BIT, vk::VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL, 1u, &bufferBarrier, 0u, DE_NULL);
+
+ // 64 bits.
+ bufferBarrier.buffer = *m_resultBuffer64Bits;
+ vk.cmdCopyQueryPoolResults(*m_cmdBuffer, *m_queryPool, 0u, 1u, *m_resultBuffer64Bits, 0u, sizeof(deUint64), (VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT));
+ vk.cmdPipelineBarrier(*m_cmdBuffer, vk::VK_PIPELINE_STAGE_TRANSFER_BIT, vk::VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL, 1u, &bufferBarrier, 0u, DE_NULL);
+
+ endCommandBuffer(vk, *m_cmdBuffer);
+}
+
+tcu::TestStatus ConsistentQueryResultsTestInstance::iterate(void)
+{
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
+ const VkQueue queue = m_context.getUniversalQueue();
+
+ deUint32 tsBuffer32Bits;
+ deUint64 tsBuffer64Bits;
+ deUint32 tsGet32Bits;
+ deUint64 tsGet64Bits;
+
+ constexpr deUint32 maxDeUint32Value = std::numeric_limits<deUint32>::max();
+
+ submitCommandsAndWait(vk, vkDevice, queue, m_cmdBuffer.get());
+
+ // Get results from buffers.
+ invalidateAlloc(vk, vkDevice, *m_resultBufferMemory32Bits);
+ invalidateAlloc(vk, vkDevice, *m_resultBufferMemory64Bits);
+ deMemcpy(&tsBuffer32Bits, m_resultBufferMemory32Bits->getHostPtr(), sizeof(tsBuffer32Bits));
+ deMemcpy(&tsBuffer64Bits, m_resultBufferMemory64Bits->getHostPtr(), sizeof(tsBuffer64Bits));
+
+ // Get results with vkGetQueryPoolResults().
+ VK_CHECK(vk.getQueryPoolResults(vkDevice, *m_queryPool, 0u, 1u, sizeof(tsGet32Bits), &tsGet32Bits, sizeof(tsGet32Bits), VK_QUERY_RESULT_WAIT_BIT));
+ VK_CHECK(vk.getQueryPoolResults(vkDevice, *m_queryPool, 0u, 1u, sizeof(tsGet64Bits), &tsGet64Bits, sizeof(tsGet64Bits), (VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT)));
+
+ // Check timestamp mask for both 64-bit results.
+ checkTimestampBits(tsBuffer64Bits, m_timestampMask);
+ checkTimestampBits(tsGet64Bits, m_timestampMask);
+
+ // Check results are consistent.
+ if (tsBuffer32Bits == tsGet32Bits &&
+ tsBuffer64Bits == tsGet64Bits &&
+ (((tsGet64Bits & maxDeUint32Value) == tsGet32Bits) ||
+ ((tsGet64Bits > maxDeUint32Value) && (maxDeUint32Value == tsGet32Bits))))
+ {
+ return tcu::TestStatus::pass("Pass");
+ }
+
+ std::ostringstream msg;
+ msg << std::hex << "Results are inconsistent:"
+ << " B32=0x" << tsBuffer32Bits
+ << " B64=0x" << tsBuffer64Bits
+ << " G32=0x" << tsGet32Bits
+ << " G64=0x" << tsGet64Bits;
+ return tcu::TestStatus::fail(msg.str());
+}
+
} // anonymous
tcu::TestCaseGroup* createTimestampTests (tcu::TestContext& testCtx)
@@ -3000,6 +3243,11 @@
"reset_query_before_copy",
"Issue a timestamp query and reset it before copying results"));
+ // Check consistency between 32 and 64 bits.
+ miscTests->addChild(new ConsistentQueryResultsTest(testCtx,
+ "consistent_results",
+ "Check consistency between 32-bit and 64-bit timestamp"));
+
timestampTests->addChild(miscTests.release());
}
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexInputTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexInputTests.cpp
index f81b0bd..6e6165b 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexInputTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexInputTests.cpp
@@ -203,6 +203,7 @@
virtual ~VertexInputTest (void) {}
virtual void initPrograms (SourceCollections& programCollection) const;
+ virtual void checkSupport (Context& context) const;
virtual TestInstance* createInstance (Context& context) const;
static bool isCompatibleType (VkFormat format, GlslType glslType);
@@ -451,6 +452,14 @@
return m_attributeInfos.size();
}
+void VertexInputTest::checkSupport (Context& context) const
+{
+ const deUint32 maxAttributes = context.getDeviceProperties().limits.maxVertexInputAttributes;
+
+ if (m_attributeInfos.size() > maxAttributes)
+ TCU_THROW(NotSupportedError, "Unsupported number of vertex input attributes, maxVertexInputAttributes: " + de::toString(maxAttributes));
+}
+
TestInstance* VertexInputTest::createInstance (Context& context) const
{
typedef VertexInputInstance::VertexInputAttributeDescription VertexInputAttributeDescription;
@@ -463,12 +472,6 @@
const deUint32 maxAttributes = limits.maxVertexInputAttributes;
- if (m_attributeInfos.size() > maxAttributes)
- {
- const std::string notSupportedStr = "Unsupported number of vertex input attributes, maxVertexInputAttributes: " + de::toString(maxAttributes);
- TCU_THROW(NotSupportedError, notSupportedStr.c_str());
- }
-
// Use VkPhysicalDeviceLimits::maxVertexInputAttributes
if (m_queryMaxAttributes)
{
diff --git a/external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemContext.cpp b/external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemContext.cpp
index 9ac2a58..e50e0a0 100644
--- a/external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemContext.cpp
+++ b/external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemContext.cpp
@@ -33,13 +33,13 @@
const std::vector<std::string> deviceExtensions)
: m_context (ctx)
, m_interface (m_context.getPlatformInterface())
- , m_instance (makeProtectedMemInstance(m_interface, m_context, instanceExtensions))
- , m_vki (m_interface, *m_instance)
- , m_phyDevice (vk::chooseDevice(m_vki, *m_instance, m_context.getTestContext().getCommandLine()))
+ , m_instance (makeProtectedMemInstance(m_context, instanceExtensions))
+ , m_vki (m_instance.getDriver())
+ , m_phyDevice (vk::chooseDevice(m_vki, m_instance, m_context.getTestContext().getCommandLine()))
, m_queueFamilyIndex (chooseProtectedMemQueueFamilyIndex(m_vki, m_phyDevice))
- , m_device (makeProtectedMemDevice(m_interface, *m_instance, m_vki, m_phyDevice, m_queueFamilyIndex, ctx.getUsedApiVersion(), deviceExtensions))
+ , m_device (makeProtectedMemDevice(m_interface, m_instance, m_vki, m_phyDevice, m_queueFamilyIndex, ctx.getUsedApiVersion(), deviceExtensions, m_context.getTestContext().getCommandLine().isValidationEnabled()))
, m_allocator (createAllocator())
- , m_deviceDriver (m_context.getPlatformInterface(), *m_instance, *m_device)
+ , m_deviceDriver (m_context.getPlatformInterface(), m_instance, *m_device)
, m_queue (getProtectedQueue(m_deviceDriver, *m_device, m_queueFamilyIndex, 0))
{
}
@@ -52,14 +52,14 @@
const std::vector<std::string> deviceExtensions)
: m_context (ctx)
, m_interface (m_context.getPlatformInterface())
- , m_instance (makeProtectedMemInstance(m_interface, m_context, instanceExtensions))
- , m_vki (m_interface, *m_instance)
- , m_phyDevice (vk::chooseDevice(m_vki, *m_instance, m_context.getTestContext().getCommandLine()))
- , m_surface (vk::wsi::createSurface(m_vki, *m_instance, wsiType, display, window))
+ , m_instance (makeProtectedMemInstance(m_context, instanceExtensions))
+ , m_vki (m_instance.getDriver())
+ , m_phyDevice (vk::chooseDevice(m_vki, m_instance, m_context.getTestContext().getCommandLine()))
+ , m_surface (vk::wsi::createSurface(m_vki, m_instance, wsiType, display, window))
, m_queueFamilyIndex (chooseProtectedMemQueueFamilyIndex(m_vki, m_phyDevice, *m_surface))
- , m_device (makeProtectedMemDevice(m_interface, *m_instance, m_vki, m_phyDevice, m_queueFamilyIndex, ctx.getUsedApiVersion(), deviceExtensions))
+ , m_device (makeProtectedMemDevice(m_interface, m_instance, m_vki, m_phyDevice, m_queueFamilyIndex, ctx.getUsedApiVersion(), deviceExtensions, m_context.getTestContext().getCommandLine().isValidationEnabled()))
, m_allocator (createAllocator())
- , m_deviceDriver (m_interface, *m_instance, *m_device)
+ , m_deviceDriver (m_interface, m_instance, *m_device)
, m_queue (getProtectedQueue(m_deviceDriver, *m_device, m_queueFamilyIndex, 0))
{
}
diff --git a/external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemContext.hpp b/external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemContext.hpp
index 3f2384f..435d17c 100644
--- a/external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemContext.hpp
+++ b/external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemContext.hpp
@@ -27,6 +27,7 @@
#include "tcuVector.hpp"
#include "vkDefs.hpp"
#include "vktTestCase.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vktProtectedMemUtils.hpp"
#include "tcuCommandLine.hpp"
@@ -64,7 +65,7 @@
vk::Allocator& getDefaultAllocator (void) const { return *m_allocator; }
const vk::InstanceDriver& getInstanceDriver (void) const { return m_vki; }
- vk::VkInstance getInstance (void) const { return *m_instance; }
+ vk::VkInstance getInstance (void) const { return m_instance; }
const vk::VkSurfaceKHR getSurface (void) const { return *m_surface; }
@@ -80,8 +81,8 @@
Context& m_context;
const vk::PlatformInterface& m_interface;
- vk::Move<vk::VkInstance> m_instance;
- vk::InstanceDriver m_vki;
+ CustomInstance m_instance;
+ const vk::InstanceDriver& m_vki;
vk::VkPhysicalDevice m_phyDevice;
const vk::Move<vk::VkSurfaceKHR> m_surface;
deUint32 m_queueFamilyIndex;
diff --git a/external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemUtils.cpp b/external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemUtils.cpp
index 90355da..f5728e0 100644
--- a/external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemUtils.cpp
+++ b/external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemUtils.cpp
@@ -23,6 +23,7 @@
*//*--------------------------------------------------------------------*/
#include "vktProtectedMemUtils.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "deString.h"
#include "deRandom.hpp"
@@ -49,35 +50,28 @@
typedef std::vector<vk::VkExtensionProperties> Extensions;
-vk::Move<vk::VkInstance> makeProtectedMemInstance (const vk::PlatformInterface& vkp, const vkt::Context& context, const std::vector<std::string>& extraExtensions)
+CustomInstance makeProtectedMemInstance (vkt::Context& context, const std::vector<std::string>& extraExtensions)
{
+ const PlatformInterface& vkp = context.getPlatformInterface();
const Extensions supportedExtensions(vk::enumerateInstanceExtensionProperties(vkp, DE_NULL));
- std::vector<std::string> enabledLayers;
std::vector<std::string> requiredExtensions = extraExtensions;
- const bool isValidationEnabled = context.getTestContext().getCommandLine().isValidationEnabled();
- if (isValidationEnabled)
- {
- if (!vk::isDebugReportSupported(vkp))
- TCU_THROW(NotSupportedError, "VK_EXT_debug_report is not supported");
-
- enabledLayers = vkt::getValidationLayers(vkp);
- if (enabledLayers.empty())
- TCU_THROW(NotSupportedError, "No validation layers found");
- }
-
- if (!isCoreInstanceExtension(context.getUsedApiVersion(), "VK_KHR_get_physical_device_properties2"))
+ deUint32 apiVersion = context.getUsedApiVersion();
+ if (!isCoreInstanceExtension(apiVersion, "VK_KHR_get_physical_device_properties2"))
requiredExtensions.push_back("VK_KHR_get_physical_device_properties2");
- for (std::vector<std::string>::const_iterator requiredExtName = requiredExtensions.begin();
- requiredExtName != requiredExtensions.end();
- ++requiredExtName)
+ // extract extension names
+ std::vector<std::string> extensions;
+ for (const auto& e : supportedExtensions)
+ extensions.push_back(e.extensionName);
+
+ for (const auto& extName : requiredExtensions)
{
- if (!isInstanceExtensionSupported(context.getUsedApiVersion(), supportedExtensions, vk::RequiredExtension(*requiredExtName)))
- TCU_THROW(NotSupportedError, (*requiredExtName + " is not supported").c_str());
+ if (!isInstanceExtensionSupported(apiVersion, extensions, extName))
+ TCU_THROW(NotSupportedError, (extName + " is not supported").c_str());
}
- return vk::createDefaultInstance(vkp, context.getUsedApiVersion(), enabledLayers, requiredExtensions);
+ return createCustomInstanceWithExtensions(context, requiredExtensions);
}
void checkProtectedQueueSupport (Context& context)
@@ -145,7 +139,8 @@
vk::VkPhysicalDevice physicalDevice,
const deUint32 queueFamilyIndex,
const deUint32 apiVersion,
- const std::vector<std::string>& extraExtensions)
+ const std::vector<std::string>& extraExtensions,
+ bool validationEnabled)
{
const Extensions supportedExtensions (vk::enumerateDeviceExtensionProperties(vkd, physicalDevice, DE_NULL));
std::vector<std::string> requiredExtensions;
@@ -159,10 +154,11 @@
// Check if the physical device supports the protected memory extension name
for (deUint32 ndx = 0; ndx < extensions.size(); ++ndx)
{
- if (!isDeviceExtensionSupported(apiVersion, supportedExtensions, vk::RequiredExtension(extensions[ndx])))
+ bool notInCore = !isCoreDeviceExtension(apiVersion, extensions[ndx]);
+ if (notInCore && !isExtensionSupported(supportedExtensions.begin(), supportedExtensions.end(), RequiredExtension(extensions[ndx])))
TCU_THROW(NotSupportedError, (extensions[ndx] + " is not supported").c_str());
- if (!isCoreDeviceExtension(apiVersion, extensions[ndx]))
+ if (notInCore)
requiredExtensions.push_back(extensions[ndx]);
}
@@ -236,7 +232,7 @@
DE_NULL // pEnabledFeatures
};
- return vk::createDevice(vkp, instance, vkd, physicalDevice, &deviceParams, DE_NULL);
+ return createCustomDevice(validationEnabled, vkp, instance, vkd, physicalDevice, &deviceParams, DE_NULL);
}
vk::VkQueue getProtectedQueue (const vk::DeviceInterface& vk,
diff --git a/external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemUtils.hpp b/external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemUtils.hpp
index 9f41e15..8671a84 100644
--- a/external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemUtils.hpp
+++ b/external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemUtils.hpp
@@ -26,6 +26,7 @@
#include "deUniquePtr.hpp"
#include "vktTestCase.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkDefs.hpp"
#include "vkRefUtil.hpp"
#include "vkMemUtil.hpp"
@@ -57,8 +58,7 @@
void checkProtectedQueueSupport (Context& context);
-vk::Move<vk::VkInstance> makeProtectedMemInstance (const vk::PlatformInterface& vkp,
- const vkt::Context& context,
+CustomInstance makeProtectedMemInstance (vkt::Context& context,
const std::vector<std::string>& extraExtensions = std::vector<std::string>());
deUint32 chooseProtectedMemQueueFamilyIndex (const vk::InstanceDriver& vkd,
vk::VkPhysicalDevice physicalDevice,
@@ -70,7 +70,8 @@
vk::VkPhysicalDevice physicalDevice,
const deUint32 queueFamilyIndex,
const deUint32 apiVersion,
- const std::vector<std::string>& extraExtensions = std::vector<std::string>());
+ const std::vector<std::string>& extraExtensions,
+ bool validationEnabled);
vk::VkQueue getProtectedQueue (const vk::DeviceInterface& vk,
vk::VkDevice device,
const deUint32 queueFamilyIndex,
diff --git a/external/vulkancts/modules/vulkan/query_pool/CMakeLists.txt b/external/vulkancts/modules/vulkan/query_pool/CMakeLists.txt
index 9f2b399..8d6c3fd 100644
--- a/external/vulkancts/modules/vulkan/query_pool/CMakeLists.txt
+++ b/external/vulkancts/modules/vulkan/query_pool/CMakeLists.txt
@@ -8,6 +8,8 @@
vktQueryPoolTests.cpp
vktQueryPoolOcclusionTests.hpp
vktQueryPoolOcclusionTests.cpp
+ vktQueryPoolPerformanceTests.hpp
+ vktQueryPoolPerformanceTests.cpp
vktQueryPoolStatisticsTests.hpp
vktQueryPoolStatisticsTests.cpp
)
diff --git a/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolOcclusionTests.cpp b/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolOcclusionTests.cpp
index 7be6768..3d15661 100644
--- a/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolOcclusionTests.cpp
+++ b/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolOcclusionTests.cpp
@@ -353,7 +353,7 @@
if (m_testVector.queryResultsMode == RESULTS_MODE_GET_RESET)
{
// Check VK_EXT_host_query_reset is supported
- m_context.requireDeviceExtension("VK_EXT_host_query_reset");
+ m_context.requireDeviceFunctionality("VK_EXT_host_query_reset");
if(m_context.getHostQueryResetFeatures().hostQueryReset == VK_FALSE)
throw tcu::NotSupportedError(std::string("Implementation doesn't support resetting queries from the host").c_str());
}
@@ -400,7 +400,7 @@
endCommandBuffer(vk, *cmdBuffer);
if (m_testVector.queryResultsMode == RESULTS_MODE_GET_RESET)
- vk.resetQueryPoolEXT(device, m_queryPool, 0, NUM_QUERIES_IN_POOL);
+ vk.resetQueryPool(device, m_queryPool, 0, NUM_QUERIES_IN_POOL);
submitCommandsAndWait(vk, device, queue, cmdBuffer.get());
@@ -601,7 +601,7 @@
if (m_testVector.queryResultsMode == RESULTS_MODE_GET_RESET)
{
// Check VK_EXT_host_query_reset is supported
- m_context.requireDeviceExtension("VK_EXT_host_query_reset");
+ m_context.requireDeviceFunctionality("VK_EXT_host_query_reset");
if(m_context.getHostQueryResetFeatures().hostQueryReset == VK_FALSE)
throw tcu::NotSupportedError(std::string("Implementation doesn't support resetting queries from the host").c_str());
}
@@ -659,7 +659,7 @@
};
if (!hasSeparateResetCmdBuf() && m_testVector.queryResultsMode == RESULTS_MODE_GET_RESET)
- vk.resetQueryPoolEXT(m_context.getDevice(), m_queryPool, 0, NUM_QUERIES_IN_POOL);
+ vk.resetQueryPool(m_context.getDevice(), m_queryPool, 0, NUM_QUERIES_IN_POOL);
vk.queueSubmit(queue, 1, &submitInfoRender, DE_NULL);
}
@@ -939,7 +939,7 @@
if (m_testVector.queryResultsMode == RESULTS_MODE_GET_RESET)
{
- vk.resetQueryPoolEXT(device, m_queryPool, 0, NUM_QUERIES_IN_POOL);
+ vk.resetQueryPool(device, m_queryPool, 0, NUM_QUERIES_IN_POOL);
vk::VkResult queryResult = vk.getQueryPoolResults(device, m_queryPool, 0, NUM_QUERIES_IN_POOL, resultsBuffer.size(), &resultsBuffer[0], m_testVector.queryResultsStride, m_queryResultFlags);
if (queryResult != vk::VK_NOT_READY)
@@ -966,7 +966,7 @@
if (m_testVector.queryResultsAvailability && *(srcPtrTyped + 1) != 0)
{
- TCU_FAIL("resetQueryPoolEXT did not disable availability bit");
+ TCU_FAIL("resetQueryPool did not disable availability bit");
}
}
else if (m_testVector.queryResultSize == RESULT_SIZE_64_BIT)
@@ -979,7 +979,7 @@
if (m_testVector.queryResultsAvailability && *(srcPtrTyped + 1) != 0)
{
- TCU_FAIL("resetQueryPoolEXT did not disable availability bit");
+ TCU_FAIL("resetQueryPool did not disable availability bit");
}
}
else
diff --git a/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolPerformanceTests.cpp b/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolPerformanceTests.cpp
new file mode 100644
index 0000000..836d960
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolPerformanceTests.cpp
@@ -0,0 +1,1209 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2018 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 Vulkan Performance Query Tests
+ *//*--------------------------------------------------------------------*/
+
+#include "vktQueryPoolPerformanceTests.hpp"
+#include "vktTestCase.hpp"
+
+#include "vktDrawImageObjectUtil.hpp"
+#include "vktDrawBufferObjectUtil.hpp"
+#include "vktDrawCreateInfoUtil.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkRefUtil.hpp"
+#include "vkPrograms.hpp"
+#include "vkTypeUtil.hpp"
+#include "vkCmdUtil.hpp"
+#include "vkQueryUtil.hpp"
+
+#include "deMath.h"
+
+#include "tcuTestLog.hpp"
+#include "tcuResource.hpp"
+#include "tcuImageCompare.hpp"
+#include "vkImageUtil.hpp"
+#include "tcuCommandLine.hpp"
+#include "tcuRGBA.hpp"
+
+namespace vkt
+{
+namespace QueryPool
+{
+namespace
+{
+
+using namespace vk;
+using namespace Draw;
+
+std::string uuidToHex(const deUint8 uuid[])
+{
+ const size_t bytesPerPart[] = {4, 2, 2, 2, 6};
+ const deUint8* ptr = &uuid[0];
+ const size_t stringSize = VK_UUID_SIZE * 2 + DE_LENGTH_OF_ARRAY(bytesPerPart) - 1;
+ std::string result;
+
+ result.reserve(stringSize);
+
+ for (size_t partNdx = 0; partNdx < DE_LENGTH_OF_ARRAY(bytesPerPart); ++partNdx)
+ {
+ const size_t bytesInPart = bytesPerPart[partNdx];
+ const size_t symbolsInPart = 2 * bytesInPart;
+ deUint64 part = 0;
+ std::string partString;
+
+ for (size_t byteInPartNdx = 0; byteInPartNdx < bytesInPart; ++byteInPartNdx)
+ {
+ part = (part << 8) | *ptr;
+ ++ptr;
+ }
+
+ partString = tcu::toHex(part).toString();
+
+ DE_ASSERT(partString.size() > symbolsInPart);
+
+ result += (symbolsInPart >= partString.size()) ? partString : partString.substr(partString.size() - symbolsInPart);
+
+ if (partNdx + 1 != DE_LENGTH_OF_ARRAY(bytesPerPart))
+ result += '-';
+ }
+
+ DE_ASSERT(ptr == &uuid[VK_UUID_SIZE]);
+ DE_ASSERT(result.size() == stringSize);
+
+ return result;
+}
+
+class EnumerateAndValidateTest : public TestInstance
+{
+public:
+ EnumerateAndValidateTest (vkt::Context& context, VkQueueFlagBits queueFlagBits);
+ tcu::TestStatus iterate (void);
+
+protected:
+ void basicValidateCounter (const deUint32 familyIndex);
+
+private:
+ VkQueueFlagBits m_queueFlagBits;
+ bool m_requiredExtensionsPresent;
+};
+
+EnumerateAndValidateTest::EnumerateAndValidateTest (vkt::Context& context, VkQueueFlagBits queueFlagBits)
+ : TestInstance(context)
+ , m_queueFlagBits(queueFlagBits)
+ , m_requiredExtensionsPresent(context.requireDeviceFunctionality("VK_KHR_performance_query"))
+{
+}
+
+tcu::TestStatus EnumerateAndValidateTest::iterate (void)
+{
+ const InstanceInterface& vki = m_context.getInstanceInterface();
+ const VkPhysicalDevice physicalDevice = m_context.getPhysicalDevice();
+ const std::vector<VkQueueFamilyProperties> queueProperties = getPhysicalDeviceQueueFamilyProperties(vki, physicalDevice);
+
+ for (deUint32 queueNdx = 0; queueNdx < queueProperties.size(); queueNdx++)
+ {
+ if ((queueProperties[queueNdx].queueFlags & m_queueFlagBits) == 0)
+ continue;
+
+ deUint32 counterCount = 0;
+ VK_CHECK(vki.enumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(physicalDevice, queueNdx, &counterCount, DE_NULL, DE_NULL));
+
+ if (counterCount == 0)
+ continue;
+
+ {
+ std::vector<VkPerformanceCounterKHR> counters (counterCount);
+ deUint32 counterCountRead = counterCount;
+ std::map<std::string, size_t> uuidValidator;
+
+ if (counterCount > 1)
+ {
+ deUint32 incompleteCounterCount = counterCount - 1;
+ VkResult result;
+
+ result = vki.enumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(physicalDevice, queueNdx, &incompleteCounterCount, &counters[0], DE_NULL);
+ if (result != VK_INCOMPLETE)
+ TCU_FAIL("VK_INCOMPLETE not returned");
+ }
+
+ VK_CHECK(vki.enumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(physicalDevice, queueNdx, &counterCountRead, &counters[0], DE_NULL));
+
+ if (counterCountRead != counterCount)
+ TCU_FAIL("Number of counters read (" + de::toString(counterCountRead) + ") is not equal to number of counters reported (" + de::toString(counterCount) + ")");
+
+ for (size_t counterNdx = 0; counterNdx < counters.size(); ++counterNdx)
+ {
+ const VkPerformanceCounterKHR& counter = counters[counterNdx];
+ const std::string uuidStr = uuidToHex(counter.uuid);
+
+ if (uuidValidator.find(uuidStr) != uuidValidator.end())
+ TCU_FAIL("Duplicate counter UUID detected " + uuidStr);
+ else
+ uuidValidator[uuidStr] = counterNdx;
+
+ if (counter.scope >= VK_PERFORMANCE_COUNTER_SCOPE_KHR_LAST)
+ TCU_FAIL("Counter scope is invalid " + de::toString(static_cast<size_t>(counter.scope)));
+
+ if (counter.storage >= VK_PERFORMANCE_COUNTER_STORAGE_KHR_LAST)
+ TCU_FAIL("Counter storage is invalid " + de::toString(static_cast<size_t>(counter.storage)));
+
+ if (counter.unit >= VK_PERFORMANCE_COUNTER_UNIT_KHR_LAST)
+ TCU_FAIL("Counter unit is invalid " + de::toString(static_cast<size_t>(counter.unit)));
+ }
+ }
+ {
+ std::vector<VkPerformanceCounterDescriptionKHR> counterDescriptors (counterCount);
+ deUint32 counterCountRead = counterCount;
+
+ VK_CHECK(vki.enumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(physicalDevice, queueNdx, &counterCountRead, DE_NULL, &counterDescriptors[0]));
+
+ if (counterCountRead != counterCount)
+ TCU_FAIL("Number of counters read (" + de::toString(counterCountRead) + ") is not equal to number of counters reported (" + de::toString(counterCount) + ")");
+
+ for (size_t counterNdx = 0; counterNdx < counterDescriptors.size(); ++counterNdx)
+ {
+ const VkPerformanceCounterDescriptionKHR& counterDescriptor = counterDescriptors[counterNdx];
+ const VkPerformanceCounterDescriptionFlagsKHR allowedFlags = VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_KHR
+ | VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_KHR;
+
+ if ((counterDescriptor.flags & ~allowedFlags) != 0)
+ TCU_FAIL("Invalid flags present in VkPerformanceCounterDescriptionFlagsKHR");
+ }
+ }
+ }
+
+ return tcu::TestStatus::pass("Pass");
+}
+
+class QueryTestBase : public TestInstance
+{
+public:
+ QueryTestBase (vkt::Context& context);
+
+protected:
+
+ void setupCounters (void);
+ Move<VkQueryPool> createQueryPool (deUint32 enabledCounterOffset, deUint32 enabledCounterStride);
+ bool acquireProfilingLock (void);
+ void releaseProfilingLock (void);
+ bool verifyQueryResults (VkQueryPool queryPool);
+ deUint32 getRequiredNumerOfPasses(void);
+
+private:
+
+ bool m_requiredExtensionsPresent;
+ deUint32 m_requiredNumerOfPasses;
+ std::map<deUint64, deUint32> m_enabledCountersCountMap; // number of counters that were enabled per query pool
+ std::vector<VkPerformanceCounterKHR> m_counters; // counters provided by the device
+};
+
+QueryTestBase::QueryTestBase(vkt::Context& context)
+ : TestInstance (context)
+ , m_requiredExtensionsPresent(context.requireDeviceFunctionality("VK_KHR_performance_query"))
+ , m_requiredNumerOfPasses(0)
+{
+}
+
+void QueryTestBase::setupCounters()
+{
+ const InstanceInterface& vki = m_context.getInstanceInterface();
+ const VkPhysicalDevice physicalDevice = m_context.getPhysicalDevice();
+ const CmdPoolCreateInfo cmdPoolCreateInfo = m_context.getUniversalQueueFamilyIndex();
+ deUint32 queueFamilyIndex = cmdPoolCreateInfo.queueFamilyIndex;
+ deUint32 counterCount;
+
+ if (!m_context.getPerformanceQueryFeatures().performanceCounterQueryPools)
+ TCU_THROW(NotSupportedError, "Performance counter query pools feature not supported");
+
+ // get the number of supported counters
+ VK_CHECK(vki.enumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(physicalDevice, queueFamilyIndex, &counterCount, NULL, NULL));
+
+ if (!counterCount)
+ TCU_THROW(NotSupportedError, "QualityWarning: there are no performance counters");
+
+ // get supported counters
+ m_counters.resize(counterCount);
+ VK_CHECK(vki.enumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(physicalDevice, queueFamilyIndex, &counterCount, &m_counters[0], DE_NULL));
+}
+
+Move<VkQueryPool> QueryTestBase::createQueryPool(deUint32 enabledCounterOffset, deUint32 enabledCounterStride)
+{
+ const InstanceInterface& vki = m_context.getInstanceInterface();
+ const DeviceInterface& vkd = m_context.getDeviceInterface();
+ const VkPhysicalDevice physicalDevice = m_context.getPhysicalDevice();
+ const VkDevice device = m_context.getDevice();
+ const CmdPoolCreateInfo cmdPoolCreateInfo = m_context.getUniversalQueueFamilyIndex();
+ const deUint32 counterCount = (deUint32)m_counters.size();
+ deUint32 enabledIndex = enabledCounterOffset ? 0 : enabledCounterStride;
+ std::vector<deUint32> enabledCounters;
+
+ // enable every <enabledCounterStride> counter that has command or render pass scope
+ for (deUint32 i = 0; i < counterCount; i++)
+ {
+ // skip counters with command buffer scope
+ if (m_counters[i].scope == VK_QUERY_SCOPE_COMMAND_BUFFER_KHR)
+ continue;
+
+ // handle offset
+ if (enabledCounterOffset)
+ {
+ if (enabledCounterOffset == enabledIndex)
+ {
+ // disable handling offset
+ enabledCounterOffset = 0;
+
+ // eneble next index in stride condition
+ enabledIndex = enabledCounterStride;
+ }
+ else
+ {
+ ++enabledIndex;
+ continue;
+ }
+ }
+
+ // handle stride
+ if (enabledIndex == enabledCounterStride)
+ {
+ enabledCounters.push_back(i);
+ enabledIndex = 0;
+ }
+ else
+ ++enabledIndex;
+ }
+
+ // get number of counters that were enabled for this query pool
+ deUint32 enabledCountersCount = static_cast<deUint32>(enabledCounters.size());
+ if (!enabledCountersCount)
+ TCU_THROW(NotSupportedError, "QualityWarning: no performance counters");
+
+ // define performance query
+ VkQueryPoolPerformanceCreateInfoKHR performanceQueryCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR,
+ NULL,
+ cmdPoolCreateInfo.queueFamilyIndex, // queue family that this performance query is performed on
+ enabledCountersCount, // number of counters to enable
+ &enabledCounters[0] // array of indices of counters to enable
+ };
+
+ // get the number of passes counters will require
+ vki.getPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(physicalDevice, &performanceQueryCreateInfo, &m_requiredNumerOfPasses);
+
+ // create query pool
+ VkQueryPoolCreateInfo queryPoolCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,
+ &performanceQueryCreateInfo,
+ 0, // flags
+ VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, // new query type
+ 1, // queryCount
+ 0
+ };
+
+ Move<VkQueryPool> queryPool = vk::createQueryPool(vkd, device, &queryPoolCreateInfo);
+
+ // memorize number of enabled counters for this query pool
+ m_enabledCountersCountMap[queryPool.get().getInternal()] = enabledCountersCount;
+
+ return queryPool;
+}
+
+bool QueryTestBase::acquireProfilingLock()
+{
+ const DeviceInterface& vkd = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+
+ // acquire profiling lock before we record command buffers
+ VkAcquireProfilingLockInfoKHR lockInfo =
+ {
+ VK_STRUCTURE_TYPE_ACQUIRE_PROFILING_LOCK_INFO_KHR,
+ NULL,
+ 0,
+ 2000000000ull // wait 2s for the lock
+ };
+
+ VkResult result = vkd.acquireProfilingLockKHR(device, &lockInfo);
+ if (result == VK_TIMEOUT)
+ {
+ m_context.getTestContext().getLog() << tcu::TestLog::Message
+ << "Timeout reached, profiling lock wasn't acquired - test had to end earlier"
+ << tcu::TestLog::EndMessage;
+ return false;
+ }
+ if (result != VK_SUCCESS)
+ TCU_FAIL("Profiling lock wasn't acquired");
+
+ return true;
+}
+
+void QueryTestBase::releaseProfilingLock()
+{
+ const DeviceInterface& vkd = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+
+ // release the profiling lock after the command buffer is no longer in the pending state
+ vkd.releaseProfilingLockKHR(device);
+}
+
+bool QueryTestBase::verifyQueryResults(VkQueryPool queryPool)
+{
+ const DeviceInterface& vkd = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+
+ // create an array to hold the results of all counters
+ deUint32 enabledCounterCount = m_enabledCountersCountMap[queryPool.getInternal()];
+ std::vector<VkPerformanceCounterResultKHR> recordedCounters(enabledCounterCount);
+
+ // verify that query result can be retrieved
+ VkResult result = vkd.getQueryPoolResults(device, queryPool, 0, 1, sizeof(VkPerformanceCounterResultKHR) * enabledCounterCount,
+ &recordedCounters[0], sizeof(VkPerformanceCounterResultKHR), VK_QUERY_RESULT_WAIT_BIT);
+ if (result == VK_NOT_READY)
+ {
+ m_context.getTestContext().getLog() << tcu::TestLog::Message
+ << "Pass but result is not ready"
+ << tcu::TestLog::EndMessage;
+ return true;
+ }
+ return (result == VK_SUCCESS);
+}
+
+deUint32 QueryTestBase::getRequiredNumerOfPasses()
+{
+ return m_requiredNumerOfPasses;
+}
+
+// Base class for all graphic tests
+class GraphicQueryTestBase : public QueryTestBase
+{
+public:
+ GraphicQueryTestBase(vkt::Context& context);
+
+protected:
+ void initStateObjects(void);
+
+protected:
+ Move<VkPipeline> m_pipeline;
+ Move<VkPipelineLayout> m_pipelineLayout;
+
+ de::SharedPtr<Image> m_colorAttachmentImage;
+ Move<VkImageView> m_attachmentView;
+
+ Move<VkRenderPass> m_renderPass;
+ Move<VkFramebuffer> m_framebuffer;
+
+ de::SharedPtr<Buffer> m_vertexBuffer;
+
+ VkFormat m_colorAttachmentFormat;
+ deUint32 m_size;
+};
+
+GraphicQueryTestBase::GraphicQueryTestBase(vkt::Context& context)
+ : QueryTestBase(context)
+ , m_colorAttachmentFormat(VK_FORMAT_R8G8B8A8_UNORM)
+ , m_size(32)
+{
+}
+
+void GraphicQueryTestBase::initStateObjects(void)
+{
+ const VkDevice device = m_context.getDevice();
+ const DeviceInterface& vkd = m_context.getDeviceInterface();
+
+ //attachment images and views
+ {
+ VkExtent3D imageExtent =
+ {
+ m_size, // width
+ m_size, // height
+ 1 // depth
+ };
+
+ const ImageCreateInfo colorImageCreateInfo(VK_IMAGE_TYPE_2D, m_colorAttachmentFormat, imageExtent, 1, 1,
+ VK_SAMPLE_COUNT_1_BIT, VK_IMAGE_TILING_OPTIMAL,
+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
+
+ m_colorAttachmentImage = Image::createAndAlloc(vkd, device, colorImageCreateInfo, m_context.getDefaultAllocator(),
+ m_context.getUniversalQueueFamilyIndex());
+
+ const ImageViewCreateInfo attachmentViewInfo(m_colorAttachmentImage->object(), VK_IMAGE_VIEW_TYPE_2D, m_colorAttachmentFormat);
+ m_attachmentView = createImageView(vkd, device, &attachmentViewInfo);
+ }
+
+ // renderpass and framebuffer
+ {
+ RenderPassCreateInfo renderPassCreateInfo;
+ renderPassCreateInfo.addAttachment(AttachmentDescription(m_colorAttachmentFormat, // format
+ VK_SAMPLE_COUNT_1_BIT, // samples
+ VK_ATTACHMENT_LOAD_OP_CLEAR, // loadOp
+ VK_ATTACHMENT_STORE_OP_DONT_CARE, // storeOp
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE, // stencilLoadOp
+ VK_ATTACHMENT_STORE_OP_DONT_CARE, // stencilLoadOp
+ VK_IMAGE_LAYOUT_GENERAL, // initialLauout
+ VK_IMAGE_LAYOUT_GENERAL)); // finalLayout
+
+ const VkAttachmentReference colorAttachmentReference =
+ {
+ 0, // attachment
+ VK_IMAGE_LAYOUT_GENERAL // layout
+ };
+
+ renderPassCreateInfo.addSubpass(SubpassDescription(VK_PIPELINE_BIND_POINT_GRAPHICS, // pipelineBindPoint
+ 0, // flags
+ 0, // inputCount
+ DE_NULL, // pInputAttachments
+ 1, // colorCount
+ &colorAttachmentReference, // pColorAttachments
+ DE_NULL, // pResolveAttachments
+ AttachmentReference(), // depthStencilAttachment
+ 0, // preserveCount
+ DE_NULL)); // preserveAttachments
+
+ m_renderPass = createRenderPass(vkd, device, &renderPassCreateInfo);
+
+ std::vector<VkImageView> attachments(1);
+ attachments[0] = *m_attachmentView;
+
+ FramebufferCreateInfo framebufferCreateInfo(*m_renderPass, attachments, m_size, m_size, 1);
+ m_framebuffer = createFramebuffer(vkd, device, &framebufferCreateInfo);
+ }
+
+ // pipeline
+ {
+ Unique<VkShaderModule> vs(createShaderModule(vkd, device, m_context.getBinaryCollection().get("vert"), 0));
+ Unique<VkShaderModule> fs(createShaderModule(vkd, device, m_context.getBinaryCollection().get("frag"), 0));
+
+ const PipelineCreateInfo::ColorBlendState::Attachment attachmentState;
+
+ const PipelineLayoutCreateInfo pipelineLayoutCreateInfo;
+ m_pipelineLayout = createPipelineLayout(vkd, device, &pipelineLayoutCreateInfo);
+
+ const VkVertexInputBindingDescription vf_binding_desc =
+ {
+ 0, // binding
+ 4 * (deUint32)sizeof(float), // stride
+ VK_VERTEX_INPUT_RATE_VERTEX // inputRate
+ };
+
+ const VkVertexInputAttributeDescription vf_attribute_desc =
+ {
+ 0, // location
+ 0, // binding
+ VK_FORMAT_R32G32B32A32_SFLOAT, // format
+ 0 // offset
+ };
+
+ const VkPipelineVertexInputStateCreateInfo vf_info =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // sType
+ NULL, // pNext
+ 0u, // flags
+ 1, // vertexBindingDescriptionCount
+ &vf_binding_desc, // pVertexBindingDescriptions
+ 1, // vertexAttributeDescriptionCount
+ &vf_attribute_desc // pVertexAttributeDescriptions
+ };
+
+ PipelineCreateInfo pipelineCreateInfo(*m_pipelineLayout, *m_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::InputAssemblerState(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST));
+ pipelineCreateInfo.addState(PipelineCreateInfo::ColorBlendState(1, &attachmentState));
+ const VkViewport viewport = makeViewport(m_size, m_size);
+ const VkRect2D scissor = makeRect2D(m_size, m_size);
+ pipelineCreateInfo.addState(PipelineCreateInfo::ViewportState(1, std::vector<VkViewport>(1, viewport), std::vector<VkRect2D>(1, scissor)));
+ pipelineCreateInfo.addState(PipelineCreateInfo::DepthStencilState(false, false, VK_COMPARE_OP_GREATER_OR_EQUAL));
+ pipelineCreateInfo.addState(PipelineCreateInfo::RasterizerState());
+ pipelineCreateInfo.addState(PipelineCreateInfo::MultiSampleState());
+ pipelineCreateInfo.addState(vf_info);
+ m_pipeline = createGraphicsPipeline(vkd, device, DE_NULL, &pipelineCreateInfo);
+ }
+
+ // vertex buffer
+ {
+ std::vector<tcu::Vec4> vertices(3);
+ vertices[0] = tcu::Vec4(0.5, 0.5, 0.0, 1.0);
+ vertices[1] = tcu::Vec4(0.5, 0.0, 0.0, 1.0);
+ vertices[2] = tcu::Vec4(0.0, 0.5, 0.0, 1.0);
+
+ const size_t kBufferSize = vertices.size() * sizeof(tcu::Vec4);
+ m_vertexBuffer = Buffer::createAndAlloc(vkd, device, BufferCreateInfo(kBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT), m_context.getDefaultAllocator(), MemoryRequirement::HostVisible);
+
+ tcu::Vec4 *ptr = reinterpret_cast<tcu::Vec4*>(m_vertexBuffer->getBoundMemory().getHostPtr());
+ deMemcpy(ptr, &vertices[0], kBufferSize);
+
+ flushMappedMemoryRange(vkd, device, m_vertexBuffer->getBoundMemory().getMemory(), m_vertexBuffer->getBoundMemory().getOffset(), VK_WHOLE_SIZE);
+ }
+}
+
+
+class GraphicQueryTest : public GraphicQueryTestBase
+{
+public:
+ GraphicQueryTest (vkt::Context& context);
+ tcu::TestStatus iterate (void);
+};
+
+GraphicQueryTest::GraphicQueryTest(vkt::Context& context)
+ : GraphicQueryTestBase(context)
+{
+}
+
+tcu::TestStatus GraphicQueryTest::iterate(void)
+{
+ const DeviceInterface& vkd = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+ const VkQueue queue = m_context.getUniversalQueue();
+ const CmdPoolCreateInfo cmdPoolCreateInfo = m_context.getUniversalQueueFamilyIndex();
+ Unique<VkCommandPool> cmdPool (createCommandPool(vkd, device, &cmdPoolCreateInfo));
+ Unique<VkCommandBuffer> cmdBuffer (allocateCommandBuffer(vkd, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
+
+ initStateObjects();
+ setupCounters();
+
+ vk::Unique<VkQueryPool> queryPool(createQueryPool(0, 1));
+
+ if (!acquireProfilingLock())
+ {
+ // lock was not acquired in given time, we can't fail the test
+ return tcu::TestStatus::pass("Pass");
+ }
+
+ // begin command buffer
+ const VkCommandBufferBeginInfo commandBufBeginParams =
+ {
+ VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
+ DE_NULL,
+ VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT,
+ (const VkCommandBufferInheritanceInfo*)DE_NULL,
+ };
+ VK_CHECK(vkd.beginCommandBuffer(*cmdBuffer, &commandBufBeginParams));
+
+ initialTransitionColor2DImage(vkd, *cmdBuffer, m_colorAttachmentImage->object(), VK_IMAGE_LAYOUT_GENERAL,
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT);
+
+ // begin render pass
+ VkClearValue renderPassClearValue;
+ deMemset(&renderPassClearValue, 0, sizeof(VkClearValue));
+
+ // reset query pool
+ vkd.cmdResetQueryPool(*cmdBuffer, *queryPool, 0, 1);
+
+ // perform query during triangle draw
+ vkd.cmdBeginQuery(*cmdBuffer, *queryPool, 0, VK_QUERY_CONTROL_PRECISE_BIT);
+
+ beginRenderPass(vkd, *cmdBuffer, *m_renderPass, *m_framebuffer,
+ makeRect2D(0, 0, m_size, m_size),
+ 1, &renderPassClearValue);
+
+ // bind pipeline
+ vkd.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+
+ // bind vertex buffer
+ VkBuffer vertexBuffer = m_vertexBuffer->object();
+ const VkDeviceSize vertexBufferOffset = 0;
+ vkd.cmdBindVertexBuffers(*cmdBuffer, 0, 1, &vertexBuffer, &vertexBufferOffset);
+
+ vkd.cmdDraw(*cmdBuffer, 3, 1, 0, 0);
+
+ endRenderPass(vkd, *cmdBuffer);
+
+ vkd.cmdEndQuery(*cmdBuffer, *queryPool, 0);
+
+ transition2DImage(vkd, *cmdBuffer, m_colorAttachmentImage->object(), VK_IMAGE_ASPECT_COLOR_BIT,
+ VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+ VK_ACCESS_TRANSFER_READ_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
+
+ endCommandBuffer(vkd, *cmdBuffer);
+
+ // submit command buffer for each pass and wait for its completion
+ for (deUint32 passIndex = 0; passIndex < getRequiredNumerOfPasses(); passIndex++)
+ {
+ const Unique<VkFence> fence(createFence(vkd, device));
+
+ VkPerformanceQuerySubmitInfoKHR performanceQuerySubmitInfo =
+ {
+ VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR,
+ NULL,
+ passIndex
+ };
+
+ const VkSubmitInfo submitInfo =
+ {
+ VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
+ &performanceQuerySubmitInfo, // pNext
+ 0u, // waitSemaphoreCount
+ DE_NULL, // pWaitSemaphores
+ (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
+ 1u, // commandBufferCount
+ &cmdBuffer.get(), // pCommandBuffers
+ 0u, // signalSemaphoreCount
+ DE_NULL, // pSignalSemaphores
+ };
+
+ VK_CHECK(vkd.queueSubmit(queue, 1u, &submitInfo, *fence));
+ VK_CHECK(vkd.waitForFences(device, 1u, &fence.get(), DE_TRUE, ~0ull));
+ }
+
+ releaseProfilingLock();
+
+ VK_CHECK(vkd.resetCommandBuffer(*cmdBuffer, 0));
+
+ if (verifyQueryResults(*queryPool))
+ return tcu::TestStatus::pass("Pass");
+ return tcu::TestStatus::fail("Fail");
+}
+
+class GraphicMultiplePoolsTest : public GraphicQueryTestBase
+{
+public:
+ GraphicMultiplePoolsTest (vkt::Context& context);
+ tcu::TestStatus iterate (void);
+};
+
+GraphicMultiplePoolsTest::GraphicMultiplePoolsTest(vkt::Context& context)
+ : GraphicQueryTestBase(context)
+{
+}
+
+tcu::TestStatus GraphicMultiplePoolsTest::iterate(void)
+{
+ if (!m_context.getPerformanceQueryFeatures().performanceCounterMultipleQueryPools)
+ throw tcu::NotSupportedError("MultipleQueryPools not supported");
+
+ const DeviceInterface& vkd = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+ const VkQueue queue = m_context.getUniversalQueue();
+ const CmdPoolCreateInfo cmdPoolCreateInfo = m_context.getUniversalQueueFamilyIndex();
+ Unique<VkCommandPool> cmdPool (createCommandPool(vkd, device, &cmdPoolCreateInfo));
+ Unique<VkCommandBuffer> cmdBuffer (allocateCommandBuffer(vkd, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
+
+ initStateObjects();
+ setupCounters();
+
+ vk::Unique<VkQueryPool> queryPool1(createQueryPool(0, 2)),
+ queryPool2(createQueryPool(1, 2));
+
+ if (!acquireProfilingLock())
+ {
+ // lock was not acquired in given time, we can't fail the test
+ return tcu::TestStatus::pass("Pass");
+ }
+
+ // begin command buffer
+ const VkCommandBufferBeginInfo commandBufBeginParams =
+ {
+ VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
+ DE_NULL,
+ VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT,
+ (const VkCommandBufferInheritanceInfo*)DE_NULL,
+ };
+ VK_CHECK(vkd.beginCommandBuffer(*cmdBuffer, &commandBufBeginParams));
+
+ initialTransitionColor2DImage(vkd, *cmdBuffer, m_colorAttachmentImage->object(), VK_IMAGE_LAYOUT_GENERAL,
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT);
+
+ // begin render pass
+ VkClearValue renderPassClearValue;
+ deMemset(&renderPassClearValue, 0, sizeof(VkClearValue));
+
+ VkBuffer vertexBuffer = m_vertexBuffer->object();
+ const VkDeviceSize vertexBufferOffset = 0;
+ const VkQueryPool queryPools[] =
+ {
+ *queryPool1,
+ *queryPool2
+ };
+
+ // reset query pools
+ vkd.cmdResetQueryPool(*cmdBuffer, queryPools[0], 0u, 1u);
+ vkd.cmdResetQueryPool(*cmdBuffer, queryPools[1], 0u, 1u);
+
+ // perform two queries during triangle draw
+ for (deUint32 loop = 0; loop < DE_LENGTH_OF_ARRAY(queryPools); ++loop)
+ {
+ const VkQueryPool queryPool = queryPools[loop];
+ vkd.cmdBeginQuery(*cmdBuffer, queryPool, 0u, (VkQueryControlFlags)0u);
+ beginRenderPass(vkd, *cmdBuffer, *m_renderPass, *m_framebuffer,
+ makeRect2D(0, 0, m_size, m_size),
+ 1, &renderPassClearValue);
+
+ vkd.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+ vkd.cmdBindVertexBuffers(*cmdBuffer, 0, 1, &vertexBuffer, &vertexBufferOffset);
+ vkd.cmdDraw(*cmdBuffer, 3, 1, 0, 0);
+
+ endRenderPass(vkd, *cmdBuffer);
+ vkd.cmdEndQuery(*cmdBuffer, queryPool, 0u);
+ }
+
+ transition2DImage(vkd, *cmdBuffer, m_colorAttachmentImage->object(), VK_IMAGE_ASPECT_COLOR_BIT,
+ VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+ VK_ACCESS_TRANSFER_READ_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
+
+ endCommandBuffer(vkd, *cmdBuffer);
+
+ // submit command buffer for each pass and wait for its completion
+ for (deUint32 passIndex = 0; passIndex < getRequiredNumerOfPasses(); passIndex++)
+ {
+ const Unique<VkFence> fence(createFence(vkd, device));
+
+ VkPerformanceQuerySubmitInfoKHR performanceQuerySubmitInfo =
+ {
+ VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR,
+ NULL,
+ passIndex
+ };
+
+ const VkSubmitInfo submitInfo =
+ {
+ VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
+ &performanceQuerySubmitInfo, // pNext
+ 0u, // waitSemaphoreCount
+ DE_NULL, // pWaitSemaphores
+ (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
+ 1u, // commandBufferCount
+ &cmdBuffer.get(), // pCommandBuffers
+ 0u, // signalSemaphoreCount
+ DE_NULL, // pSignalSemaphores
+ };
+
+ VK_CHECK(vkd.queueSubmit(queue, 1u, &submitInfo, *fence));
+ VK_CHECK(vkd.waitForFences(device, 1u, &fence.get(), DE_TRUE, ~0ull));
+ }
+
+ releaseProfilingLock();
+
+ VK_CHECK(vkd.resetCommandBuffer(*cmdBuffer, 0));
+
+ if (verifyQueryResults(*queryPool1) && verifyQueryResults(*queryPool2))
+ return tcu::TestStatus::pass("Pass");
+ return tcu::TestStatus::fail("Fail");
+}
+
+// Base class for all compute tests
+class ComputeQueryTestBase : public QueryTestBase
+{
+public:
+ ComputeQueryTestBase(vkt::Context& context);
+
+protected:
+ void initStateObjects(void);
+
+protected:
+ Move<VkPipeline> m_pipeline;
+ Move<VkPipelineLayout> m_pipelineLayout;
+ de::SharedPtr<Buffer> m_buffer;
+ Move<VkDescriptorPool> m_descriptorPool;
+ Move<VkDescriptorSet> m_descriptorSet;
+ VkDescriptorBufferInfo m_descriptorBufferInfo;
+ VkBufferMemoryBarrier m_computeFinishBarrier;
+};
+
+ComputeQueryTestBase::ComputeQueryTestBase(vkt::Context& context)
+ : QueryTestBase(context)
+{
+}
+
+void ComputeQueryTestBase::initStateObjects(void)
+{
+ const DeviceInterface& vkd = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+ const VkDeviceSize bufferSize = 32 * sizeof(deUint32);
+ const CmdPoolCreateInfo cmdPoolCreateInfo(m_context.getUniversalQueueFamilyIndex());
+ const Unique<VkCommandPool> cmdPool(createCommandPool(vkd, device, &cmdPoolCreateInfo));
+ const Unique<VkCommandBuffer> cmdBuffer(allocateCommandBuffer(vkd, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
+
+ const Unique<VkDescriptorSetLayout> descriptorSetLayout(DescriptorSetLayoutBuilder()
+ .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_SHADER_STAGE_COMPUTE_BIT)
+ .build(vkd, device));
+
+ // create pipeline layout
+ {
+ const VkPipelineLayoutCreateInfo pipelineLayoutParams =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // sType
+ DE_NULL, // pNext
+ 0u, // flags
+ 1u, // setLayoutCount
+ &(*descriptorSetLayout), // pSetLayouts
+ 0u, // pushConstantRangeCount
+ DE_NULL, // pPushConstantRanges
+ };
+ m_pipelineLayout = createPipelineLayout(vkd, device, &pipelineLayoutParams);
+ }
+
+ // create compute pipeline
+ {
+ const Unique<VkShaderModule> cs(createShaderModule(vkd, device, m_context.getBinaryCollection().get("comp"), 0u));
+ const VkPipelineShaderStageCreateInfo pipelineShaderStageParams =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // sType
+ DE_NULL, // pNext
+ (VkPipelineShaderStageCreateFlags)0u, // flags
+ VK_SHADER_STAGE_COMPUTE_BIT, // stage
+ *cs, // module
+ "main", // pName
+ DE_NULL, // pSpecializationInfo
+ };
+ const VkComputePipelineCreateInfo pipelineCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, // sType
+ DE_NULL, // pNext
+ (VkPipelineCreateFlags)0u, // flags
+ pipelineShaderStageParams, // stage
+ *m_pipelineLayout, // layout
+ DE_NULL, // basePipelineHandle
+ 0, // basePipelineIndex
+ };
+ m_pipeline = createComputePipeline(vkd, device, DE_NULL, &pipelineCreateInfo);
+ }
+
+ m_buffer = Buffer::createAndAlloc(vkd, device, BufferCreateInfo(bufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT),
+ m_context.getDefaultAllocator(), MemoryRequirement::HostVisible);
+ m_descriptorPool = DescriptorPoolBuilder()
+ .addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)
+ .build(vkd, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+ const VkDescriptorSetAllocateInfo allocateParams =
+ {
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, // sType
+ DE_NULL, // pNext
+ *m_descriptorPool, // descriptorPool
+ 1u, // setLayoutCount
+ &(*descriptorSetLayout), // pSetLayouts
+ };
+
+ m_descriptorSet = allocateDescriptorSet(vkd, device, &allocateParams);
+ const VkDescriptorBufferInfo descriptorInfo =
+ {
+ m_buffer->object(), // buffer
+ 0ull, // offset
+ bufferSize, // range
+ };
+
+ DescriptorSetUpdateBuilder()
+ .writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &descriptorInfo)
+ .update(vkd, device);
+
+ // clear buffer
+ const std::vector<deUint8> data((size_t)bufferSize, 0u);
+ const Allocation& allocation = m_buffer->getBoundMemory();
+ void* allocationData = allocation.getHostPtr();
+ invalidateMappedMemoryRange(vkd, device, allocation.getMemory(), allocation.getOffset(), bufferSize);
+ deMemcpy(allocationData, &data[0], (size_t)bufferSize);
+
+ const VkBufferMemoryBarrier barrier =
+ {
+ VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // sType
+ DE_NULL, // pNext
+ VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT, // srcAccessMask
+ VK_ACCESS_HOST_READ_BIT, // dstAccessMask
+ VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex
+ VK_QUEUE_FAMILY_IGNORED, // destQueueFamilyIndex
+ m_buffer->object(), // buffer
+ 0ull, // offset
+ bufferSize, // size
+ };
+ m_computeFinishBarrier = barrier;
+}
+
+class ComputeQueryTest : public ComputeQueryTestBase
+{
+public:
+ ComputeQueryTest (vkt::Context& context);
+ tcu::TestStatus iterate (void);
+};
+
+ComputeQueryTest::ComputeQueryTest(vkt::Context& context)
+ : ComputeQueryTestBase(context)
+{
+}
+
+tcu::TestStatus ComputeQueryTest::iterate(void)
+{
+ const DeviceInterface& vkd = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+ const VkQueue queue = m_context.getUniversalQueue();
+ const CmdPoolCreateInfo cmdPoolCreateInfo (m_context.getUniversalQueueFamilyIndex());
+ const Unique<VkCommandPool> cmdPool (createCommandPool(vkd, device, &cmdPoolCreateInfo));
+ const Unique<VkCommandBuffer> cmdBuffer (allocateCommandBuffer(vkd, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
+
+ initStateObjects();
+ setupCounters();
+
+ vk::Unique<VkQueryPool> queryPool(createQueryPool(0, 1));
+
+ if (!acquireProfilingLock())
+ {
+ // lock was not acquired in given time, we can't fail the test
+ return tcu::TestStatus::pass("Pass");
+ }
+
+ beginCommandBuffer(vkd, *cmdBuffer);
+ vkd.cmdResetQueryPool(*cmdBuffer, *queryPool, 0u, 1u);
+
+ vkd.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *m_pipeline);
+ vkd.cmdBindDescriptorSets(*cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *m_pipelineLayout, 0u, 1u, &(m_descriptorSet.get()), 0u, DE_NULL);
+
+ vkd.cmdBeginQuery(*cmdBuffer, *queryPool, 0u, (VkQueryControlFlags)0u);
+ vkd.cmdDispatch(*cmdBuffer, 2, 2, 2);
+ vkd.cmdEndQuery(*cmdBuffer, *queryPool, 0u);
+
+ vkd.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_HOST_BIT,
+ (VkDependencyFlags)0u, 0u, (const VkMemoryBarrier*)DE_NULL, 1u, &m_computeFinishBarrier, 0u, (const VkImageMemoryBarrier*)DE_NULL);
+ endCommandBuffer(vkd, *cmdBuffer);
+
+ // submit command buffer for each pass and wait for its completion
+ for (deUint32 passIndex = 0; passIndex < getRequiredNumerOfPasses(); passIndex++)
+ {
+ const Unique<VkFence> fence(createFence(vkd, device));
+
+ VkPerformanceQuerySubmitInfoKHR performanceQuerySubmitInfo =
+ {
+ VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR,
+ NULL,
+ passIndex
+ };
+
+ const VkSubmitInfo submitInfo =
+ {
+ VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
+ &performanceQuerySubmitInfo, // pNext
+ 0u, // waitSemaphoreCount
+ DE_NULL, // pWaitSemaphores
+ (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
+ 1u, // commandBufferCount
+ &cmdBuffer.get(), // pCommandBuffers
+ 0u, // signalSemaphoreCount
+ DE_NULL, // pSignalSemaphores
+ };
+
+ VK_CHECK(vkd.queueSubmit(queue, 1u, &submitInfo, *fence));
+ VK_CHECK(vkd.waitForFences(device, 1u, &fence.get(), DE_TRUE, ~0ull));
+ }
+
+ releaseProfilingLock();
+
+ VK_CHECK(vkd.resetCommandBuffer(*cmdBuffer, 0));
+
+ if (verifyQueryResults(*queryPool))
+ return tcu::TestStatus::pass("Pass");
+ return tcu::TestStatus::fail("Fail");
+}
+
+class ComputeMultiplePoolsTest : public ComputeQueryTestBase
+{
+public:
+ ComputeMultiplePoolsTest (vkt::Context& context);
+ tcu::TestStatus iterate (void);
+};
+
+ComputeMultiplePoolsTest::ComputeMultiplePoolsTest(vkt::Context& context)
+ : ComputeQueryTestBase(context)
+{
+}
+
+tcu::TestStatus ComputeMultiplePoolsTest::iterate(void)
+{
+ if (!m_context.getPerformanceQueryFeatures().performanceCounterMultipleQueryPools)
+ throw tcu::NotSupportedError("MultipleQueryPools not supported");
+
+ const DeviceInterface& vkd = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+ const VkQueue queue = m_context.getUniversalQueue();
+ const CmdPoolCreateInfo cmdPoolCreateInfo(m_context.getUniversalQueueFamilyIndex());
+ const Unique<VkCommandPool> cmdPool(createCommandPool(vkd, device, &cmdPoolCreateInfo));
+ const Unique<VkCommandBuffer> cmdBuffer(allocateCommandBuffer(vkd, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
+
+ initStateObjects();
+ setupCounters();
+
+ vk::Unique<VkQueryPool> queryPool1(createQueryPool(0, 2)),
+ queryPool2(createQueryPool(1, 2));
+
+ if (!acquireProfilingLock())
+ {
+ // lock was not acquired in given time, we can't fail the test
+ return tcu::TestStatus::pass("Pass");
+ }
+
+ const VkQueryPool queryPools[] =
+ {
+ *queryPool1,
+ *queryPool2
+ };
+
+ beginCommandBuffer(vkd, *cmdBuffer);
+ vkd.cmdResetQueryPool(*cmdBuffer, queryPools[0], 0u, 1u);
+ vkd.cmdResetQueryPool(*cmdBuffer, queryPools[1], 0u, 1u);
+
+ vkd.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *m_pipeline);
+ vkd.cmdBindDescriptorSets(*cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *m_pipelineLayout, 0u, 1u, &(m_descriptorSet.get()), 0u, DE_NULL);
+
+ // perform two queries
+ for (deUint32 loop = 0; loop < DE_LENGTH_OF_ARRAY(queryPools); ++loop)
+ {
+ const VkQueryPool queryPool = queryPools[loop];
+ vkd.cmdBeginQuery(*cmdBuffer, queryPool, 0u, (VkQueryControlFlags)0u);
+ vkd.cmdDispatch(*cmdBuffer, 2, 2, 2);
+ vkd.cmdEndQuery(*cmdBuffer, queryPool, 0u);
+ }
+
+ vkd.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_HOST_BIT,
+ (VkDependencyFlags)0u, 0u, (const VkMemoryBarrier*)DE_NULL, 1u, &m_computeFinishBarrier, 0u, (const VkImageMemoryBarrier*)DE_NULL);
+ endCommandBuffer(vkd, *cmdBuffer);
+
+ // submit command buffer for each pass and wait for its completion
+ for (deUint32 passIndex = 0; passIndex < getRequiredNumerOfPasses(); passIndex++)
+ {
+ const Unique<VkFence> fence(createFence(vkd, device));
+
+ VkPerformanceQuerySubmitInfoKHR performanceQuerySubmitInfo =
+ {
+ VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR,
+ NULL,
+ passIndex
+ };
+
+ const VkSubmitInfo submitInfo =
+ {
+ VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
+ &performanceQuerySubmitInfo, // pNext
+ 0u, // waitSemaphoreCount
+ DE_NULL, // pWaitSemaphores
+ (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
+ 1u, // commandBufferCount
+ &cmdBuffer.get(), // pCommandBuffers
+ 0u, // signalSemaphoreCount
+ DE_NULL, // pSignalSemaphores
+ };
+
+ VK_CHECK(vkd.queueSubmit(queue, 1u, &submitInfo, *fence));
+ VK_CHECK(vkd.waitForFences(device, 1u, &fence.get(), DE_TRUE, ~0ull));
+ }
+
+ releaseProfilingLock();
+
+ VK_CHECK(vkd.resetCommandBuffer(*cmdBuffer, 0));
+
+ if (verifyQueryResults(*queryPool1) && verifyQueryResults(*queryPool2))
+ return tcu::TestStatus::pass("Pass");
+ return tcu::TestStatus::fail("Fail");
+}
+
+enum TestType
+{
+ TT_ENUMERATE_AND_VALIDATE = 0,
+ TT_QUERY,
+ TT_MULTIPLE_POOLS
+};
+
+class QueryPoolPerformanceTest : public TestCase
+{
+public:
+ QueryPoolPerformanceTest (tcu::TestContext &context, TestType testType, VkQueueFlagBits queueFlagBits, const char *name)
+ : TestCase (context, name, "")
+ , m_testType (testType)
+ , m_queueFlagBits (queueFlagBits)
+ {
+ }
+
+ vkt::TestInstance* createInstance (vkt::Context& context) const
+ {
+ if (m_testType == TT_ENUMERATE_AND_VALIDATE)
+ return new EnumerateAndValidateTest(context, m_queueFlagBits);
+
+ if (m_queueFlagBits == VK_QUEUE_GRAPHICS_BIT)
+ {
+ if (m_testType == TT_QUERY)
+ return new GraphicQueryTest(context);
+ return new GraphicMultiplePoolsTest(context);
+ }
+
+ // tests for VK_QUEUE_COMPUTE_BIT
+ if (m_testType == TT_QUERY)
+ return new ComputeQueryTest(context);
+ return new ComputeMultiplePoolsTest(context);
+ }
+
+ void initPrograms (SourceCollections& programCollection) const
+ {
+ // validation test do not need programs
+ if (m_testType == TT_ENUMERATE_AND_VALIDATE)
+ return;
+
+ if (m_queueFlagBits == VK_QUEUE_COMPUTE_BIT)
+ {
+ programCollection.glslSources.add("comp")
+ << glu::ComputeSource("#version 430\n"
+ "layout (local_size_x = 1) in;\n"
+ "layout(binding = 0) writeonly buffer Output {\n"
+ " uint values[];\n"
+ "} sb_out;\n\n"
+ "void main (void) {\n"
+ " uint index = uint(gl_GlobalInvocationID.x);\n"
+ " sb_out.values[index] += gl_GlobalInvocationID.y*2;\n"
+ "}\n");
+ return;
+ }
+
+ programCollection.glslSources.add("frag")
+ << glu::FragmentSource("#version 430\n"
+ "layout(location = 0) out vec4 out_FragColor;\n"
+ "void main()\n"
+ "{\n"
+ " out_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
+ "}\n");
+
+ programCollection.glslSources.add("vert")
+ << glu::VertexSource("#version 430\n"
+ "layout(location = 0) in vec4 in_Position;\n"
+ "out gl_PerVertex { vec4 gl_Position; float gl_PointSize; };\n"
+ "void main() {\n"
+ " gl_Position = in_Position;\n"
+ " gl_PointSize = 1.0;\n"
+ "}\n");
+ }
+
+private:
+
+ TestType m_testType;
+ VkQueueFlagBits m_queueFlagBits;
+};
+
+} //anonymous
+
+QueryPoolPerformanceTests::QueryPoolPerformanceTests (tcu::TestContext &testCtx)
+ : TestCaseGroup(testCtx, "performance_query", "Tests for performance queries")
+{
+}
+
+void QueryPoolPerformanceTests::init (void)
+{
+ addChild(new QueryPoolPerformanceTest(m_testCtx, TT_ENUMERATE_AND_VALIDATE, VK_QUEUE_GRAPHICS_BIT, "enumerate_and_validate_graphic"));
+ addChild(new QueryPoolPerformanceTest(m_testCtx, TT_ENUMERATE_AND_VALIDATE, VK_QUEUE_COMPUTE_BIT, "enumerate_and_validate_compute"));
+ addChild(new QueryPoolPerformanceTest(m_testCtx, TT_QUERY, VK_QUEUE_GRAPHICS_BIT, "query_graphic"));
+ addChild(new QueryPoolPerformanceTest(m_testCtx, TT_QUERY, VK_QUEUE_COMPUTE_BIT, "query_compute"));
+ addChild(new QueryPoolPerformanceTest(m_testCtx, TT_MULTIPLE_POOLS, VK_QUEUE_GRAPHICS_BIT, "multiple_pools_graphic"));
+ addChild(new QueryPoolPerformanceTest(m_testCtx, TT_MULTIPLE_POOLS, VK_QUEUE_COMPUTE_BIT, "multiple_pools_compute"));
+}
+
+} //QueryPool
+} //vkt
diff --git a/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolPerformanceTests.hpp b/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolPerformanceTests.hpp
new file mode 100644
index 0000000..4b5901f
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolPerformanceTests.hpp
@@ -0,0 +1,48 @@
+#ifndef _VKTQUERYPOOLPERFORMANCETESTS_HPP
+#define _VKTQUERYPOOLPERFORMANCETESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2018 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 Vulkan Performance Query Tests
+ *//*--------------------------------------------------------------------*/
+
+#include "vktTestCase.hpp"
+
+namespace vkt
+{
+namespace QueryPool
+{
+
+class QueryPoolPerformanceTests : public tcu::TestCaseGroup
+{
+public:
+ QueryPoolPerformanceTests (tcu::TestContext &testCtx);
+ ~QueryPoolPerformanceTests (void) {}
+ void init (void);
+
+private:
+ QueryPoolPerformanceTests (const QueryPoolPerformanceTests &other);
+ QueryPoolPerformanceTests& operator= (const QueryPoolPerformanceTests &other);
+};
+
+} // QueryPool
+} // vkt
+
+#endif // _VKTQUERYPOOLPERFORMANCETESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolStatisticsTests.cpp b/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolStatisticsTests.cpp
index 811e4c9..08bb2d2 100644
--- a/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolStatisticsTests.cpp
+++ b/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolStatisticsTests.cpp
@@ -43,6 +43,14 @@
#include "tcuCommandLine.hpp"
#include "tcuRGBA.hpp"
#include "tcuStringTemplate.hpp"
+#include "tcuMaybe.hpp"
+
+#include <vector>
+#include <utility>
+#include <algorithm>
+
+using std::vector;
+using std::pair;
namespace vkt
{
@@ -117,6 +125,72 @@
}
}
+using ResultsVector = vector<deUint64>;
+using ResultsVectorWithAvailability = vector<pair<deUint64, deUint64>>;
+
+// Get query pool results as a vector. Note results are always converted to
+// deUint64, but the actual vkGetQueryPoolResults call will use the 64-bits flag
+// or not depending on your preferences.
+vk::VkResult GetQueryPoolResultsVector(
+ ResultsVector& output, const DeviceInterface& vk, vk::VkDevice device, vk::VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount, VkQueryResultFlags flags)
+{
+ if (flags & vk::VK_QUERY_RESULT_WITH_AVAILABILITY_BIT)
+ TCU_THROW(InternalError, "Availability flag passed when expecting results as ResultsVector");
+
+ vk::VkResult result;
+ output.resize(queryCount);
+
+ if (flags & vk::VK_QUERY_RESULT_64_BIT)
+ {
+ constexpr size_t stride = sizeof(ResultsVector::value_type);
+ const size_t totalSize = stride * output.size();
+ result = vk.getQueryPoolResults(device, queryPool, firstQuery, queryCount, totalSize, output.data(), stride, flags);
+ }
+ else
+ {
+ using IntermediateVector = vector<deUint32>;
+
+ IntermediateVector intermediate(queryCount, 0u);
+ constexpr size_t stride = sizeof(decltype(intermediate)::value_type);
+ const size_t totalSize = stride * intermediate.size();
+ result = vk.getQueryPoolResults(device, queryPool, firstQuery, queryCount, totalSize, intermediate.data(), stride, flags);
+ std::copy(begin(intermediate), end(intermediate), begin(output));
+ }
+
+ return result;
+}
+
+// Same as the normal GetQueryPoolResultsVector but returning the availability
+// bit associated to each query in addition to the query value.
+vk::VkResult GetQueryPoolResultsVector(
+ ResultsVectorWithAvailability& output, const DeviceInterface& vk, vk::VkDevice device, vk::VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount, VkQueryResultFlags flags)
+{
+ flags |= vk::VK_QUERY_RESULT_WITH_AVAILABILITY_BIT;
+
+ vk::VkResult result;
+ output.resize(queryCount);
+
+ if (flags & vk::VK_QUERY_RESULT_64_BIT)
+ {
+ constexpr size_t stride = sizeof(ResultsVectorWithAvailability::value_type);
+ const size_t totalSize = stride * output.size();
+ result = vk.getQueryPoolResults(device, queryPool, firstQuery, queryCount, totalSize, output.data(), stride, flags);
+ }
+ else
+ {
+ using IntermediateVector = vector<pair<deUint32, deUint32>>;
+
+ IntermediateVector intermediate(queryCount, pair<deUint32, deUint32>(0u, 0u));
+ constexpr size_t stride = sizeof(decltype(intermediate)::value_type);
+ const size_t totalSize = stride * intermediate.size();
+ result = vk.getQueryPoolResults(device, queryPool, firstQuery, queryCount, totalSize, intermediate.data(), stride, flags);
+ std::transform(begin(intermediate), end(intermediate), begin(output),
+ [](const pair<deUint32, deUint32>& p) { return pair<deUint64, deUint64>(p.first, p.second); });
+ }
+
+ return result;
+}
+
void beginSecondaryCommandBuffer (const DeviceInterface& vk,
const VkCommandBuffer commandBuffer,
const VkQueryPipelineStatisticFlags queryFlags,
@@ -146,7 +220,7 @@
VK_CHECK(vk.beginCommandBuffer(commandBuffer, &info));
}
-Move<VkQueryPool> makeQueryPool (const DeviceInterface& vk, const VkDevice device, VkQueryPipelineStatisticFlags statisticFlags)
+Move<VkQueryPool> makeQueryPool (const DeviceInterface& vk, const VkDevice device, deUint32 queryCount, VkQueryPipelineStatisticFlags statisticFlags )
{
const VkQueryPoolCreateInfo queryPoolCreateInfo =
{
@@ -154,12 +228,65 @@
DE_NULL, // const void* pNext
(VkQueryPoolCreateFlags)0, // VkQueryPoolCreateFlags flags
VK_QUERY_TYPE_PIPELINE_STATISTICS , // VkQueryType queryType
- 1u, // deUint32 entryCount
+ queryCount, // deUint32 entryCount
statisticFlags, // VkQueryPipelineStatisticFlags pipelineStatistics
};
return createQueryPool(vk, device, &queryPoolCreateInfo);
}
+double calculatePearsonCorrelation(const std::vector<deUint64>& x, const ResultsVector& y)
+{
+ // This function calculates Pearson correlation coefficient ( https://en.wikipedia.org/wiki/Pearson_correlation_coefficient )
+ // Two statistical variables are linear ( == fully corellated ) when fabs( Pearson corelation coefficient ) == 1
+ // Two statistical variables are independent when pearson corelation coefficient == 0
+ // If fabs( Pearson coefficient ) is > 0.8 then these two variables are almost linear
+
+ DE_ASSERT(x.size() == y.size());
+ DE_ASSERT(x.size() > 1);
+
+ // calculate mean values
+ double xMean = 0.0, yMean = 0.0;
+ for (deUint32 i = 0; i < x.size(); ++i)
+ {
+ xMean += static_cast<double>(x[i]);
+ yMean += static_cast<double>(y[i]);
+ }
+ xMean /= static_cast<double>(x.size());
+ yMean /= static_cast<double>(x.size());
+
+ // calculate standard deviations
+ double xS = 0.0, yS = 0.0;
+ for (deUint32 i = 0; i < x.size(); ++i)
+ {
+ double xv = static_cast<double>(x[i]) - xMean;
+ double yv = static_cast<double>(y[i]) - yMean;
+
+ xS += xv * xv;
+ yS += yv * yv;
+ }
+ xS = sqrt( xS / static_cast<double>(x.size() - 1) );
+ yS = sqrt( yS / static_cast<double>(x.size() - 1) );
+
+ // calculate Pearson coefficient
+ double pearson = 0.0;
+ for (deUint32 i = 0; i < x.size(); ++i)
+ {
+ double xv = (static_cast<double>(x[i]) - xMean ) / xS;
+ double yv = (static_cast<double>(y[i]) - yMean ) / yS;
+ pearson += xv * yv;
+ }
+
+ return pearson / static_cast<double>(x.size() - 1);
+}
+
+double calculatePearsonCorrelation(const std::vector<deUint64>& x, const ResultsVectorWithAvailability& ya)
+{
+ ResultsVector y;
+ for (const auto& elt : ya)
+ y.push_back(elt.first);
+ return calculatePearsonCorrelation(x, y);
+}
+
void clearBuffer (const DeviceInterface& vk, const VkDevice device, const de::SharedPtr<Buffer> buffer, const VkDeviceSize bufferSizeBytes)
{
const std::vector<deUint8> data ((size_t)bufferSizeBytes, 0u);
@@ -172,7 +299,7 @@
class StatisticQueryTestInstance : public TestInstance
{
public:
- StatisticQueryTestInstance (Context& context);
+ StatisticQueryTestInstance (Context& context, deUint32 queryCount);
protected:
struct ValueAndAvailability
{
@@ -186,11 +313,11 @@
tcu::TestStatus verifyUnavailable ();
};
-StatisticQueryTestInstance::StatisticQueryTestInstance (Context& context)
+StatisticQueryTestInstance::StatisticQueryTestInstance (Context& context, deUint32 queryCount)
: TestInstance (context)
, m_resetBuffer (Buffer::createAndAlloc(context.getDeviceInterface(),
context.getDevice(),
- BufferCreateInfo(sizeof(ValueAndAvailability), VK_BUFFER_USAGE_TRANSFER_DST_BIT),
+ BufferCreateInfo(queryCount * sizeof(ValueAndAvailability), VK_BUFFER_USAGE_TRANSFER_DST_BIT),
context.getDefaultAllocator(),
vk::MemoryRequirement::HostVisible))
{
@@ -204,7 +331,7 @@
if (hostResetQueryEnabled == DE_TRUE)
{
// Check VK_EXT_host_query_reset is supported
- m_context.requireDeviceExtension("VK_EXT_host_query_reset");
+ m_context.requireDeviceFunctionality("VK_EXT_host_query_reset");
if(m_context.getHostQueryResetFeatures().hostQueryReset == VK_FALSE)
throw tcu::NotSupportedError(std::string("Implementation doesn't support resetting queries from the host").c_str());
}
@@ -226,10 +353,19 @@
public:
struct ParametersCompute
{
+ ParametersCompute(const tcu::UVec3& localSize_, const tcu::UVec3& groupSize_, const std::string& shaderName_, ResetType resetType_, deBool query64Bits_)
+ : localSize(localSize_)
+ , groupSize(groupSize_)
+ , shaderName(shaderName_)
+ , resetType(resetType_)
+ , query64Bits(query64Bits_)
+ {}
+
tcu::UVec3 localSize;
tcu::UVec3 groupSize;
std::string shaderName;
ResetType resetType;
+ deBool query64Bits;
};
ComputeInvocationsTestInstance (Context& context, const std::vector<ParametersCompute>& parameters);
tcu::TestStatus iterate (void);
@@ -247,7 +383,7 @@
};
ComputeInvocationsTestInstance::ComputeInvocationsTestInstance (Context& context, const std::vector<ParametersCompute>& parameters)
- : StatisticQueryTestInstance (context)
+ : StatisticQueryTestInstance (context, 1u)
, m_parameters (parameters)
{
}
@@ -356,7 +492,7 @@
const Unique<VkPipeline> pipeline(createComputePipeline(vk, device, DE_NULL , &pipelineCreateInfo));
const Unique<VkCommandBuffer> cmdBuffer (allocateCommandBuffer(vk, device, cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
- const Unique<VkQueryPool> queryPool (makeQueryPool(vk, device, VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT));
+ const Unique<VkQueryPool> queryPool (makeQueryPool(vk, device, 1u, VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT));
beginCommandBuffer(vk, *cmdBuffer);
if (m_parameters[0].resetType != RESET_TYPE_HOST)
@@ -383,7 +519,7 @@
m_context.getTestContext().getLog() << tcu::TestLog::Message << "Compute shader invocations: " << getComputeExecution(m_parameters[parametersNdx]) << tcu::TestLog::EndMessage;
if (m_parameters[0].resetType == RESET_TYPE_HOST)
- vk.resetQueryPoolEXT(device, *queryPool, 0u, 1u);
+ vk.resetQueryPool(device, *queryPool, 0u, 1u);
// Wait for completion
submitCommandsAndWait(vk, device, queue, *cmdBuffer);
@@ -394,30 +530,29 @@
if (m_parameters[0].resetType == RESET_TYPE_NORMAL)
{
- deUint64 data = 0u;
- VK_CHECK(vk.getQueryPoolResults(device, *queryPool, 0u, 1u, sizeof(deUint64), &data, 0u, VK_QUERY_RESULT_64_BIT));
- if (getComputeExecution(m_parameters[parametersNdx]) != data)
+ ResultsVector data;
+ VK_CHECK(GetQueryPoolResultsVector(data, vk, device, *queryPool, 0u, 1u, (VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT)));
+ if (getComputeExecution(m_parameters[parametersNdx]) != data[0])
return tcu::TestStatus::fail("QueryPoolResults incorrect");
}
else if (m_parameters[0].resetType == RESET_TYPE_HOST)
{
- deUint64 data[2] = {0u, 0u};
- deUint64 temp = 0u;
- VK_CHECK(vk.getQueryPoolResults(device, *queryPool, 0u, 1u, sizeof(deUint64) * 2, data, 0u, VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT));
- if (getComputeExecution(m_parameters[parametersNdx]) != data[0] || data[1] == 0)
+ ResultsVectorWithAvailability data;
+ VK_CHECK(GetQueryPoolResultsVector(data, vk, device, *queryPool, 0u, 1u, (VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT)));
+ if (getComputeExecution(m_parameters[parametersNdx]) != data[0].first || data[0].second == 0)
return tcu::TestStatus::fail("QueryPoolResults incorrect");
- temp = data[0];
+ deUint64 temp = data[0].first;
- vk.resetQueryPoolEXT(device, *queryPool, 0, 1u);
- vk::VkResult res = vk.getQueryPoolResults(device, *queryPool, 0u, 1u, sizeof(deUint64) * 2, data, 0u, VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
+ vk.resetQueryPool(device, *queryPool, 0, 1u);
+ vk::VkResult res = GetQueryPoolResultsVector(data, vk, device, *queryPool, 0u, 1u, (VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT));
/* From Vulkan spec:
*
* If VK_QUERY_RESULT_WAIT_BIT and VK_QUERY_RESULT_PARTIAL_BIT are both not set then no result values are written to pData
* for queries that are in the unavailable state at the time of the call, and vkGetQueryPoolResults returns VK_NOT_READY.
* However, availability state is still written to pData for those queries if VK_QUERY_RESULT_WITH_AVAILABILITY_BIT is set.
*/
- if (res != vk::VK_NOT_READY || data[0] != temp || data[1] != 0u)
+ if (res != vk::VK_NOT_READY || data[0].first != temp || data[0].second != 0u)
return tcu::TestStatus::fail("QueryPoolResults incorrect reset");
}
else
@@ -527,7 +662,7 @@
const Unique<VkCommandBuffer> primaryCmdBuffer (allocateCommandBuffer(vk, device, cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
const Unique<VkCommandBuffer> secondaryCmdBuffer (allocateCommandBuffer(vk, device, cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY));
- const Unique<VkQueryPool> queryPool (makeQueryPool(vk, device, VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT));
+ const Unique<VkQueryPool> queryPool (makeQueryPool(vk, device, 1u, VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT));
clearBuffer(vk, device, buffer, bufferSizeBytes);
beginSecondaryCommandBuffer(vk, *secondaryCmdBuffer, VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT);
@@ -563,7 +698,7 @@
// Secondary buffer is emitted only once, so it is safe to reset the query pool here.
if (m_parameters[0].resetType == RESET_TYPE_HOST)
- vk.resetQueryPoolEXT(device, *queryPool, 0u, 1u);
+ vk.resetQueryPool(device, *queryPool, 0u, 1u);
// Wait for completion
submitCommandsAndWait(vk, device, queue, *primaryCmdBuffer);
@@ -581,30 +716,29 @@
if (m_parameters[0].resetType == RESET_TYPE_NORMAL)
{
- deUint64 result = 0u;
- VK_CHECK(vk.getQueryPoolResults(device, queryPool, 0u, 1u, sizeof(deUint64), &result, 0u, VK_QUERY_RESULT_64_BIT));
- if (expected != result)
+ ResultsVector results;
+ VK_CHECK(GetQueryPoolResultsVector(results, vk, device, queryPool, 0u, 1u, (VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT)));
+ if (expected != results[0])
return tcu::TestStatus::fail("QueryPoolResults incorrect");
}
else if (m_parameters[0].resetType == RESET_TYPE_HOST)
{
- deUint64 result[2] = {0u, 0u};
- deUint64 temp = 0u;
- VK_CHECK(vk.getQueryPoolResults(device, queryPool, 0u, 1u, sizeof(deUint64) * 2, &result, 0u, VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT));
- if (expected != result[0] || result[1] == 0)
+ ResultsVectorWithAvailability results;
+ VK_CHECK(GetQueryPoolResultsVector(results, vk, device, queryPool, 0u, 1u, (VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT)));
+ if (expected != results[0].first || results[0].second == 0u)
return tcu::TestStatus::fail("QueryPoolResults incorrect");
- temp = result[0];
+ deUint64 temp = results[0].first;
- vk.resetQueryPoolEXT(device, queryPool, 0u, 1u);
- vk::VkResult res = vk.getQueryPoolResults(device, queryPool, 0u, 1u, sizeof(deUint64) * 2, &result, 0u, VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
+ vk.resetQueryPool(device, queryPool, 0u, 1u);
+ vk::VkResult res = GetQueryPoolResultsVector(results, vk, device, queryPool, 0u, 1u, (VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT));
/* From Vulkan spec:
*
* If VK_QUERY_RESULT_WAIT_BIT and VK_QUERY_RESULT_PARTIAL_BIT are both not set then no result values are written to pData
* for queries that are in the unavailable state at the time of the call, and vkGetQueryPoolResults returns VK_NOT_READY.
* However, availability state is still written to pData for those queries if VK_QUERY_RESULT_WITH_AVAILABILITY_BIT is set.
*/
- if (res != vk::VK_NOT_READY || result[0] != temp || result[1] != 0)
+ if (res != vk::VK_NOT_READY || results[0].first != temp || results[0].second != 0u)
return tcu::TestStatus::fail("QueryPoolResults incorrect reset");
}
else
@@ -729,7 +863,7 @@
const Unique<VkCommandBuffer> primaryCmdBuffer (allocateCommandBuffer(vk, device, cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
const Unique<VkCommandBuffer> secondaryCmdBuffer (allocateCommandBuffer(vk, device, cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY));
- const Unique<VkQueryPool> queryPool (makeQueryPool(vk, device, VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT));
+ const Unique<VkQueryPool> queryPool (makeQueryPool(vk, device, 1u, VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT));
clearBuffer(vk, device, buffer, bufferSizeBytes);
beginSecondaryCommandBuffer(vk, *secondaryCmdBuffer, VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT);
@@ -772,7 +906,7 @@
endCommandBuffer(vk, *primaryCmdBuffer);
if (m_parameters[0].resetType == RESET_TYPE_HOST)
- vk.resetQueryPoolEXT(device, *queryPool, 0u, 1u);
+ vk.resetQueryPool(device, *queryPool, 0u, 1u);
// Wait for completion
submitCommandsAndWait(vk, device, queue, *primaryCmdBuffer);
@@ -793,20 +927,23 @@
};
struct ParametersGraphic
{
- ParametersGraphic (const VkQueryPipelineStatisticFlags queryStatisticFlags_, const VkPrimitiveTopology primitiveTopology_, const ResetType resetType_, const deBool vertexOnlyPipe_ = false)
+ ParametersGraphic (const VkQueryPipelineStatisticFlags queryStatisticFlags_, const VkPrimitiveTopology primitiveTopology_, const ResetType resetType_, const deBool query64Bits_, const deBool vertexOnlyPipe_ = DE_FALSE)
: queryStatisticFlags (queryStatisticFlags_)
, primitiveTopology (primitiveTopology_)
, resetType (resetType_)
+ , query64Bits (query64Bits_)
, vertexOnlyPipe (vertexOnlyPipe_)
{}
VkQueryPipelineStatisticFlags queryStatisticFlags;
VkPrimitiveTopology primitiveTopology;
ResetType resetType;
+ deBool query64Bits;
deBool vertexOnlyPipe;
};
GraphicBasicTestInstance (vkt::Context& context,
const std::vector<VertexData>& data,
- const ParametersGraphic& parametersGraphic);
+ const ParametersGraphic& parametersGraphic,
+ const std::vector<deUint64>& drawRepeats );
tcu::TestStatus iterate (void);
protected:
de::SharedPtr<Buffer> creatAndFillVertexBuffer (void);
@@ -828,15 +965,18 @@
Move<VkPipelineLayout> m_pipelineLayout;
const std::vector<VertexData>& m_data;
const ParametersGraphic& m_parametersGraphic;
+ std::vector<deUint64> m_drawRepeats;
};
GraphicBasicTestInstance::GraphicBasicTestInstance (vkt::Context& context,
const std::vector<VertexData>& data,
- const ParametersGraphic& parametersGraphic)
- : StatisticQueryTestInstance (context)
+ const ParametersGraphic& parametersGraphic,
+ const std::vector<deUint64>& drawRepeats )
+ : StatisticQueryTestInstance (context, static_cast<deUint32>(drawRepeats.size()))
, m_colorAttachmentFormat (VK_FORMAT_R8G8B8A8_UNORM)
, m_data (data)
, m_parametersGraphic (parametersGraphic)
+ , m_drawRepeats (drawRepeats)
{
}
@@ -994,7 +1134,7 @@
class VertexShaderTestInstance : public GraphicBasicTestInstance
{
public:
- VertexShaderTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic);
+ VertexShaderTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic, const std::vector<deUint64>& drawRepeats);
protected:
virtual void createPipeline (void);
virtual tcu::TestStatus executeTest (void);
@@ -1002,8 +1142,8 @@
void draw (VkCommandBuffer cmdBuffer);
};
-VertexShaderTestInstance::VertexShaderTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic)
- : GraphicBasicTestInstance (context, data, parametersGraphic)
+VertexShaderTestInstance::VertexShaderTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic, const std::vector<deUint64>& drawRepeats)
+ : GraphicBasicTestInstance (context, data, parametersGraphic, drawRepeats )
{
}
@@ -1098,7 +1238,8 @@
const CmdPoolCreateInfo cmdPoolCreateInfo (queueFamilyIndex);
const Move<VkCommandPool> cmdPool = createCommandPool(vk, device, &cmdPoolCreateInfo);
- const Unique<VkQueryPool> queryPool (makeQueryPool(vk, device, m_parametersGraphic.queryStatisticFlags));
+ const deUint32 queryCount = static_cast<deUint32>(m_drawRepeats.size());
+ const Unique<VkQueryPool> queryPool (makeQueryPool(vk, device, queryCount, m_parametersGraphic.queryStatisticFlags));
const VkDeviceSize vertexBufferOffset = 0u;
const de::SharedPtr<Buffer> vertexBufferSp = creatAndFillVertexBuffer();
@@ -1117,22 +1258,28 @@
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT);
if (m_parametersGraphic.resetType != RESET_TYPE_HOST)
- vk.cmdResetQueryPool(*cmdBuffer, *queryPool, 0u, 1u);
+ vk.cmdResetQueryPool(*cmdBuffer, *queryPool, 0u, queryCount);
beginRenderPass(vk, *cmdBuffer, *m_renderPass, *m_framebuffer, makeRect2D(0, 0, WIDTH, HEIGHT), (deUint32)renderPassClearValues.size(), &renderPassClearValues[0]);
- vk.cmdBeginQuery(*cmdBuffer, *queryPool, 0u, (VkQueryControlFlags)0u);
- vk.cmdBindVertexBuffers(*cmdBuffer, 0, 1, &vertexBuffer, &vertexBufferOffset);
- vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
- draw(*cmdBuffer);
- vk.cmdEndQuery(*cmdBuffer, *queryPool, 0u);
+ for (deUint32 i = 0; i < queryCount; ++i)
+ {
+ vk.cmdBeginQuery(*cmdBuffer, *queryPool, i, (VkQueryControlFlags)0u);
+ vk.cmdBindVertexBuffers(*cmdBuffer, 0, 1, &vertexBuffer, &vertexBufferOffset);
+ vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+
+ for(deUint64 j=0; j<m_drawRepeats[i]; ++j)
+ draw(*cmdBuffer);
+
+ vk.cmdEndQuery(*cmdBuffer, *queryPool, i);
+ }
endRenderPass(vk, *cmdBuffer);
if (m_parametersGraphic.resetType == RESET_TYPE_BEFORE_COPY)
{
- vk.cmdResetQueryPool(*cmdBuffer, *queryPool, 0u, 1u);
- vk.cmdCopyQueryPoolResults(*cmdBuffer, *queryPool, 0, 1u, m_resetBuffer->object(), 0u, sizeof(ValueAndAvailability), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
+ vk.cmdResetQueryPool(*cmdBuffer, *queryPool, 0u, queryCount);
+ vk.cmdCopyQueryPoolResults(*cmdBuffer, *queryPool, 0, queryCount, m_resetBuffer->object(), 0u, sizeof(ValueAndAvailability), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
}
transition2DImage(vk, *cmdBuffer, m_colorAttachmentImage->object(), VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL,
@@ -1141,7 +1288,7 @@
endCommandBuffer(vk, *cmdBuffer);
if (m_parametersGraphic.resetType == RESET_TYPE_HOST)
- vk.resetQueryPoolEXT(device, *queryPool, 0u, 1u);
+ vk.resetQueryPool(device, *queryPool, 0u, queryCount);
// Wait for completion
submitCommandsAndWait(vk, device, queue, *cmdBuffer);
@@ -1194,36 +1341,50 @@
0u;
break;
default:
- DE_ASSERT(0);
+ DE_FATAL("Unexpected type of statistics query");
break;
}
+ const deUint32 queryCount = static_cast<deUint32>(m_drawRepeats.size());
+
if (m_parametersGraphic.resetType == RESET_TYPE_NORMAL)
{
- deUint64 result = 0u;
- VK_CHECK(vk.getQueryPoolResults(device, queryPool, 0u, 1u, sizeof(deUint64), &result, 0u, VK_QUERY_RESULT_64_BIT));
- if (result < expectedMin)
+ ResultsVector results(queryCount, 0u);
+ VK_CHECK(GetQueryPoolResultsVector(results, vk, device, queryPool, 0u, queryCount, (VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT)));
+ if (results[0] < expectedMin)
return tcu::TestStatus::fail("QueryPoolResults incorrect");
+ if (queryCount > 1)
+ {
+ double pearson = calculatePearsonCorrelation(m_drawRepeats, results);
+ if ( fabs( pearson ) < 0.8 )
+ return tcu::TestStatus::fail("QueryPoolResults are nonlinear");
+ }
}
else if (m_parametersGraphic.resetType == RESET_TYPE_HOST)
{
- deUint64 result[2] = {0u, 0u};
- deUint64 temp = 0u;
- VK_CHECK(vk.getQueryPoolResults(device, queryPool, 0u, 1u, sizeof(deUint64) * 2, &result, 0u, VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT));
- if (result[0] < expectedMin || result[1] == 0)
+ ResultsVectorWithAvailability results(queryCount, pair<deUint64, deUint64>(0u,0u));
+ VK_CHECK(GetQueryPoolResultsVector(results, vk, device, queryPool, 0u, queryCount, (VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT)));
+ if (results[0].first < expectedMin || results[0].second == 0)
return tcu::TestStatus::fail("QueryPoolResults incorrect");
- temp = result[0];
+ if (queryCount > 1)
+ {
+ double pearson = calculatePearsonCorrelation(m_drawRepeats, results);
+ if ( fabs( pearson ) < 0.8 )
+ return tcu::TestStatus::fail("QueryPoolResults are nonlinear");
+ }
- vk.resetQueryPoolEXT(device, queryPool, 0, 1u);
- vk::VkResult res = vk.getQueryPoolResults(device, queryPool, 0u, 1u, sizeof(deUint64) * 2, &result, 0u, VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
+ deUint64 temp = results[0].first;
+
+ vk.resetQueryPool(device, queryPool, 0, queryCount);
+ vk::VkResult res = GetQueryPoolResultsVector(results, vk, device, queryPool, 0u, queryCount, (VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT));
/* From Vulkan spec:
*
* If VK_QUERY_RESULT_WAIT_BIT and VK_QUERY_RESULT_PARTIAL_BIT are both not set then no result values are written to pData
* for queries that are in the unavailable state at the time of the call, and vkGetQueryPoolResults returns VK_NOT_READY.
* However, availability state is still written to pData for those queries if VK_QUERY_RESULT_WITH_AVAILABILITY_BIT is set.
*/
- if (res != vk::VK_NOT_READY || result[0] != temp || result[1] != 0)
+ if (res != vk::VK_NOT_READY || results[0].first != temp || results[0].second != 0)
return tcu::TestStatus::fail("QueryPoolResults incorrect reset");
}
else
@@ -1269,16 +1430,18 @@
class VertexShaderSecondaryTestInstance : public VertexShaderTestInstance
{
public:
- VertexShaderSecondaryTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic);
+ VertexShaderSecondaryTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic, const std::vector<deUint64>& drawRepeats);
protected:
virtual tcu::TestStatus executeTest (void);
};
-VertexShaderSecondaryTestInstance::VertexShaderSecondaryTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic)
- : VertexShaderTestInstance (context, data, parametersGraphic)
+VertexShaderSecondaryTestInstance::VertexShaderSecondaryTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic, const std::vector<deUint64>& drawRepeats)
+ : VertexShaderTestInstance (context, data, parametersGraphic, drawRepeats)
{
}
+typedef de::SharedPtr<vk::Unique<VkCommandBuffer>> VkCommandBufferSp;
+
tcu::TestStatus VertexShaderSecondaryTestInstance::executeTest (void)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
@@ -1288,22 +1451,30 @@
const CmdPoolCreateInfo cmdPoolCreateInfo (queueFamilyIndex);
const Move<VkCommandPool> cmdPool = createCommandPool(vk, device, &cmdPoolCreateInfo);
- const Unique<VkQueryPool> queryPool (makeQueryPool(vk, device, m_parametersGraphic.queryStatisticFlags));
+ const deUint32 queryCount = static_cast<deUint32>(m_drawRepeats.size());
+ const Unique<VkQueryPool> queryPool (makeQueryPool(vk, device, queryCount, m_parametersGraphic.queryStatisticFlags));
const VkDeviceSize vertexBufferOffset = 0u;
const de::SharedPtr<Buffer> vertexBufferSp = creatAndFillVertexBuffer();
const VkBuffer vertexBuffer = vertexBufferSp->object();
const Unique<VkCommandBuffer> primaryCmdBuffer (allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
- const Unique<VkCommandBuffer> secondaryCmdBuffer (allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY));
+ std::vector<VkCommandBufferSp> secondaryCmdBuffers(queryCount);
- beginSecondaryCommandBuffer(vk, *secondaryCmdBuffer, m_parametersGraphic.queryStatisticFlags, *m_renderPass, *m_framebuffer, VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT);
- vk.cmdBindPipeline(*secondaryCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
- vk.cmdBeginQuery(*secondaryCmdBuffer, *queryPool, 0u, (VkQueryControlFlags)0u);
- vk.cmdBindVertexBuffers(*secondaryCmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
- draw(*secondaryCmdBuffer);
- vk.cmdEndQuery(*secondaryCmdBuffer, *queryPool, 0u);
- endCommandBuffer(vk, *secondaryCmdBuffer);
+ for (deUint32 i = 0; i < queryCount; ++i)
+ secondaryCmdBuffers[i] = VkCommandBufferSp(new vk::Unique<VkCommandBuffer>(allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY)));
+
+ for (deUint32 i = 0; i < queryCount; ++i)
+ {
+ beginSecondaryCommandBuffer(vk, secondaryCmdBuffers[i]->get(), m_parametersGraphic.queryStatisticFlags, *m_renderPass, *m_framebuffer, VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT);
+ vk.cmdBeginQuery(secondaryCmdBuffers[i]->get(), *queryPool, i, (VkQueryControlFlags)0u);
+ vk.cmdBindPipeline(secondaryCmdBuffers[i]->get(), VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+ vk.cmdBindVertexBuffers(secondaryCmdBuffers[i]->get(), 0u, 1u, &vertexBuffer, &vertexBufferOffset);
+ for(deUint32 j=0; j<m_drawRepeats[i]; ++j)
+ draw(secondaryCmdBuffers[i]->get());
+ vk.cmdEndQuery(secondaryCmdBuffers[i]->get(), *queryPool, i);
+ endCommandBuffer(vk, secondaryCmdBuffers[i]->get());
+ }
beginCommandBuffer(vk, *primaryCmdBuffer);
{
@@ -1316,16 +1487,17 @@
vk::VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, vk::VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | vk::VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT);
if (m_parametersGraphic.resetType != RESET_TYPE_HOST)
- vk.cmdResetQueryPool(*primaryCmdBuffer, *queryPool, 0u, 1u);
+ vk.cmdResetQueryPool(*primaryCmdBuffer, *queryPool, 0u, queryCount);
beginRenderPass(vk, *primaryCmdBuffer, *m_renderPass, *m_framebuffer, makeRect2D(0, 0, WIDTH, HEIGHT), (deUint32)renderPassClearValues.size(), &renderPassClearValues[0], VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
- vk.cmdExecuteCommands(*primaryCmdBuffer, 1u, &secondaryCmdBuffer.get());
+ for (deUint32 i = 0; i < queryCount; ++i)
+ vk.cmdExecuteCommands(*primaryCmdBuffer, 1u, &(secondaryCmdBuffers[i]->get()));
endRenderPass(vk, *primaryCmdBuffer);
if (m_parametersGraphic.resetType == RESET_TYPE_BEFORE_COPY)
{
- vk.cmdResetQueryPool(*primaryCmdBuffer, *queryPool, 0u, 1u);
- vk.cmdCopyQueryPoolResults(*primaryCmdBuffer, *queryPool, 0, 1u, m_resetBuffer->object(), 0u, sizeof(ValueAndAvailability), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
+ vk.cmdResetQueryPool(*primaryCmdBuffer, *queryPool, 0u, queryCount);
+ vk.cmdCopyQueryPoolResults(*primaryCmdBuffer, *queryPool, 0, queryCount, m_resetBuffer->object(), 0u, sizeof(ValueAndAvailability), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
}
transition2DImage(vk, *primaryCmdBuffer, m_colorAttachmentImage->object(), VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL,
@@ -1334,7 +1506,7 @@
endCommandBuffer(vk, *primaryCmdBuffer);
if (m_parametersGraphic.resetType == RESET_TYPE_HOST)
- vk.resetQueryPoolEXT(device, *queryPool, 0u, 1u);
+ vk.resetQueryPool(device, *queryPool, 0u, queryCount);
// Wait for completion
submitCommandsAndWait(vk, device, queue, *primaryCmdBuffer);
@@ -1344,14 +1516,14 @@
class VertexShaderSecondaryInheritedTestInstance : public VertexShaderTestInstance
{
public:
- VertexShaderSecondaryInheritedTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic);
+ VertexShaderSecondaryInheritedTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic, const std::vector<deUint64>& drawRepeats);
protected:
- virtual void checkExtensions (deBool hostQueryResetEnabled);
+ virtual void checkExtensions (deBool hostQueryResetEnabled);
virtual tcu::TestStatus executeTest (void);
};
-VertexShaderSecondaryInheritedTestInstance::VertexShaderSecondaryInheritedTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic)
- : VertexShaderTestInstance (context, data, parametersGraphic)
+VertexShaderSecondaryInheritedTestInstance::VertexShaderSecondaryInheritedTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic, const std::vector<deUint64>& drawRepeats)
+ : VertexShaderTestInstance (context, data, parametersGraphic, drawRepeats)
{
}
@@ -1371,20 +1543,28 @@
const CmdPoolCreateInfo cmdPoolCreateInfo (queueFamilyIndex);
const Move<VkCommandPool> cmdPool = createCommandPool(vk, device, &cmdPoolCreateInfo);
- const Unique<VkQueryPool> queryPool (makeQueryPool(vk, device, m_parametersGraphic.queryStatisticFlags));
+ const deUint32 queryCount = static_cast<deUint32>(m_drawRepeats.size());
+ const Unique<VkQueryPool> queryPool (makeQueryPool(vk, device, queryCount, m_parametersGraphic.queryStatisticFlags));
const VkDeviceSize vertexBufferOffset = 0u;
const de::SharedPtr<Buffer> vertexBufferSp = creatAndFillVertexBuffer();
const VkBuffer vertexBuffer = vertexBufferSp->object();
const Unique<VkCommandBuffer> primaryCmdBuffer (allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
- const Unique<VkCommandBuffer> secondaryCmdBuffer (allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY));
+ std::vector<VkCommandBufferSp> secondaryCmdBuffers(queryCount);
- beginSecondaryCommandBuffer(vk, *secondaryCmdBuffer, m_parametersGraphic.queryStatisticFlags, *m_renderPass, *m_framebuffer, VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT);
- vk.cmdBindPipeline(*secondaryCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
- vk.cmdBindVertexBuffers(*secondaryCmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
- draw(*secondaryCmdBuffer);
- endCommandBuffer(vk, *secondaryCmdBuffer);
+ for (deUint32 i = 0; i < queryCount; ++i)
+ secondaryCmdBuffers[i] = VkCommandBufferSp(new vk::Unique<VkCommandBuffer>(allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY)));
+
+ for (deUint32 i = 0; i < queryCount; ++i)
+ {
+ beginSecondaryCommandBuffer(vk, secondaryCmdBuffers[i]->get(), m_parametersGraphic.queryStatisticFlags, *m_renderPass, *m_framebuffer, VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT);
+ vk.cmdBindPipeline(secondaryCmdBuffers[i]->get(), VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+ vk.cmdBindVertexBuffers(secondaryCmdBuffers[i]->get(), 0u, 1u, &vertexBuffer, &vertexBufferOffset);
+ for (deUint32 j = 0; j<m_drawRepeats[i]; ++j)
+ draw(secondaryCmdBuffers[i]->get());
+ endCommandBuffer(vk, secondaryCmdBuffers[i]->get());
+ }
beginCommandBuffer(vk, *primaryCmdBuffer);
{
@@ -1397,18 +1577,21 @@
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT);
if (m_parametersGraphic.resetType != RESET_TYPE_HOST)
- vk.cmdResetQueryPool(*primaryCmdBuffer, *queryPool, 0u, 1u);
- vk.cmdBeginQuery(*primaryCmdBuffer, *queryPool, 0u, (VkQueryControlFlags)0u);
+ vk.cmdResetQueryPool(*primaryCmdBuffer, *queryPool, 0u, queryCount);
- beginRenderPass(vk, *primaryCmdBuffer, *m_renderPass, *m_framebuffer, makeRect2D(0, 0, WIDTH, HEIGHT), (deUint32)renderPassClearValues.size(), &renderPassClearValues[0], VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
- vk.cmdExecuteCommands(*primaryCmdBuffer, 1u, &secondaryCmdBuffer.get());
- endRenderPass(vk, *primaryCmdBuffer);
- vk.cmdEndQuery(*primaryCmdBuffer, *queryPool, 0u);
+ for (deUint32 i = 0; i < queryCount; ++i)
+ {
+ vk.cmdBeginQuery(*primaryCmdBuffer, *queryPool, i, (VkQueryControlFlags)0u);
+ beginRenderPass(vk, *primaryCmdBuffer, *m_renderPass, *m_framebuffer, makeRect2D(0, 0, WIDTH, HEIGHT), (deUint32)renderPassClearValues.size(), &renderPassClearValues[0], VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
+ vk.cmdExecuteCommands(*primaryCmdBuffer, 1u, &(secondaryCmdBuffers[i]->get()));
+ endRenderPass(vk, *primaryCmdBuffer);
+ vk.cmdEndQuery(*primaryCmdBuffer, *queryPool, i);
+ }
if (m_parametersGraphic.resetType == RESET_TYPE_BEFORE_COPY)
{
- vk.cmdResetQueryPool(*primaryCmdBuffer, *queryPool, 0u, 1u);
- vk.cmdCopyQueryPoolResults(*primaryCmdBuffer, *queryPool, 0, 1u, m_resetBuffer->object(), 0u, sizeof(ValueAndAvailability), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
+ vk.cmdResetQueryPool(*primaryCmdBuffer, *queryPool, 0u, queryCount);
+ vk.cmdCopyQueryPoolResults(*primaryCmdBuffer, *queryPool, 0, queryCount, m_resetBuffer->object(), 0u, sizeof(ValueAndAvailability), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
}
transition2DImage(vk, *primaryCmdBuffer, m_colorAttachmentImage->object(), VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL,
@@ -1417,7 +1600,7 @@
endCommandBuffer(vk, *primaryCmdBuffer);
if (m_parametersGraphic.resetType == RESET_TYPE_HOST)
- vk.resetQueryPoolEXT(device, *queryPool, 0u, 1u);
+ vk.resetQueryPool(device, *queryPool, 0u, queryCount);
// Wait for completion
submitCommandsAndWait(vk, device, queue, *primaryCmdBuffer);
@@ -1427,7 +1610,7 @@
class GeometryShaderTestInstance : public GraphicBasicTestInstance
{
public:
- GeometryShaderTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic);
+ GeometryShaderTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic, const std::vector<deUint64>& drawRepeats);
protected:
virtual void checkExtensions (deBool hostQueryResetEnabled);
virtual void createPipeline (void);
@@ -1436,8 +1619,8 @@
void draw (VkCommandBuffer cmdBuffer);
};
-GeometryShaderTestInstance::GeometryShaderTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic)
- : GraphicBasicTestInstance (context, data, parametersGraphic)
+GeometryShaderTestInstance::GeometryShaderTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic, const std::vector<deUint64>& drawRepeats)
+ : GraphicBasicTestInstance(context, data, parametersGraphic, drawRepeats)
{
}
@@ -1530,7 +1713,8 @@
const CmdPoolCreateInfo cmdPoolCreateInfo (queueFamilyIndex);
const Move<VkCommandPool> cmdPool = createCommandPool(vk, device, &cmdPoolCreateInfo);
- const Unique<VkQueryPool> queryPool (makeQueryPool(vk, device, m_parametersGraphic.queryStatisticFlags));
+ const deUint32 queryCount = static_cast<deUint32>(m_drawRepeats.size());
+ const Unique<VkQueryPool> queryPool (makeQueryPool(vk, device, queryCount, m_parametersGraphic.queryStatisticFlags));
const VkDeviceSize vertexBufferOffset = 0u;
const de::SharedPtr<Buffer> vertexBufferSp = creatAndFillVertexBuffer();
@@ -1549,24 +1733,28 @@
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT);
if (m_parametersGraphic.resetType != RESET_TYPE_HOST)
- vk.cmdResetQueryPool(*cmdBuffer, *queryPool, 0u, 1u);
+ vk.cmdResetQueryPool(*cmdBuffer, *queryPool, 0u, queryCount);
beginRenderPass(vk, *cmdBuffer, *m_renderPass, *m_framebuffer, makeRect2D(0, 0, WIDTH, HEIGHT), (deUint32)renderPassClearValues.size(), &renderPassClearValues[0]);
- vk.cmdBeginQuery(*cmdBuffer, *queryPool, 0u, (VkQueryControlFlags)0u);
- vk.cmdBindVertexBuffers(*cmdBuffer, 0, 1, &vertexBuffer, &vertexBufferOffset);
- vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+ for (deUint32 i = 0; i < queryCount; ++i)
+ {
+ vk.cmdBeginQuery(*cmdBuffer, *queryPool, i, (VkQueryControlFlags)0u);
+ vk.cmdBindVertexBuffers(*cmdBuffer, 0, 1, &vertexBuffer, &vertexBufferOffset);
+ vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
- draw(*cmdBuffer);
+ for (deUint64 j = 0; j<m_drawRepeats[i]; ++j)
+ draw(*cmdBuffer);
- vk.cmdEndQuery(*cmdBuffer, *queryPool, 0u);
+ vk.cmdEndQuery(*cmdBuffer, *queryPool, i);
+ }
endRenderPass(vk, *cmdBuffer);
if (m_parametersGraphic.resetType == RESET_TYPE_BEFORE_COPY)
{
- vk.cmdResetQueryPool(*cmdBuffer, *queryPool, 0u, 1u);
- vk.cmdCopyQueryPoolResults(*cmdBuffer, *queryPool, 0, 1u, m_resetBuffer->object(), 0u, sizeof(ValueAndAvailability), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
+ vk.cmdResetQueryPool(*cmdBuffer, *queryPool, 0u, queryCount);
+ vk.cmdCopyQueryPoolResults(*cmdBuffer, *queryPool, 0, queryCount, m_resetBuffer->object(), 0u, sizeof(ValueAndAvailability), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
}
transition2DImage(vk, *cmdBuffer, m_colorAttachmentImage->object(), VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL,
@@ -1575,7 +1763,7 @@
endCommandBuffer(vk, *cmdBuffer);
if (m_parametersGraphic.resetType == RESET_TYPE_HOST)
- vk.resetQueryPoolEXT(device, *queryPool, 0u, 1u);
+ vk.resetQueryPool(device, *queryPool, 0u, queryCount);
// Wait for completion
submitCommandsAndWait(vk, device, queue, *cmdBuffer);
@@ -1619,36 +1807,50 @@
0u;
break;
default:
- DE_ASSERT(0);
- break;
+ DE_FATAL("Unexpected type of statistics query");
+ break;
}
+ const deUint32 queryCount = static_cast<deUint32>(m_drawRepeats.size());
+
if (m_parametersGraphic.resetType == RESET_TYPE_NORMAL)
{
- deUint64 result = 0u;
- VK_CHECK(vk.getQueryPoolResults(device, queryPool, 0u, 1u, sizeof(deUint64), &result, 0u, VK_QUERY_RESULT_64_BIT));
- if (result < expectedMin)
+ ResultsVector results(queryCount, 0u);
+ VK_CHECK(GetQueryPoolResultsVector(results, vk, device, queryPool, 0u, queryCount, (VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT)));
+ if (results[0] < expectedMin)
return tcu::TestStatus::fail("QueryPoolResults incorrect");
+ if (queryCount > 1)
+ {
+ double pearson = calculatePearsonCorrelation(m_drawRepeats, results);
+ if ( fabs( pearson ) < 0.8 )
+ return tcu::TestStatus::fail("QueryPoolResults are nonlinear");
+ }
}
else if (m_parametersGraphic.resetType == RESET_TYPE_HOST)
{
- deUint64 result[2] = {0u, 0u};
- deUint64 temp = 0u;
- VK_CHECK(vk.getQueryPoolResults(device, queryPool, 0u, 1u, sizeof(deUint64) * 2, &result, 0u, VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT));
- if (result[0] < expectedMin || result[1] == 0)
+ ResultsVectorWithAvailability results(queryCount, pair<deUint64, deUint64>(0u, 0u));
+ VK_CHECK(GetQueryPoolResultsVector(results, vk, device, queryPool, 0u, queryCount, (VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT)));
+ if (results[0].first < expectedMin || results[0].second == 0u)
return tcu::TestStatus::fail("QueryPoolResults incorrect");
- temp = result[0];
+ if (queryCount > 1)
+ {
+ double pearson = calculatePearsonCorrelation(m_drawRepeats, results);
+ if ( fabs( pearson ) < 0.8 )
+ return tcu::TestStatus::fail("QueryPoolResults are nonlinear");
+ }
- vk.resetQueryPoolEXT(device, queryPool, 0, 1u);
- vk::VkResult res = vk.getQueryPoolResults(device, queryPool, 0u, 1u, sizeof(deUint64) * 2, &result, 0u, VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
+ deUint64 temp = results[0].first;
+
+ vk.resetQueryPool(device, queryPool, 0, queryCount);
+ vk::VkResult res = GetQueryPoolResultsVector(results, vk, device, queryPool, 0u, queryCount, (VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT));
/* From Vulkan spec:
*
* If VK_QUERY_RESULT_WAIT_BIT and VK_QUERY_RESULT_PARTIAL_BIT are both not set then no result values are written to pData
* for queries that are in the unavailable state at the time of the call, and vkGetQueryPoolResults returns VK_NOT_READY.
* However, availability state is still written to pData for those queries if VK_QUERY_RESULT_WITH_AVAILABILITY_BIT is set.
*/
- if (res != vk::VK_NOT_READY || result[0] != temp || result[1] != 0)
+ if (res != vk::VK_NOT_READY || results[0].first != temp || results[0].second != 0u)
return tcu::TestStatus::fail("QueryPoolResults incorrect reset");
}
else
@@ -1683,13 +1885,13 @@
class GeometryShaderSecondaryTestInstance : public GeometryShaderTestInstance
{
public:
- GeometryShaderSecondaryTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic);
+ GeometryShaderSecondaryTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic, const std::vector<deUint64>& drawRepeats);
protected:
virtual tcu::TestStatus executeTest (void);
};
-GeometryShaderSecondaryTestInstance::GeometryShaderSecondaryTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic)
- : GeometryShaderTestInstance (context, data, parametersGraphic)
+GeometryShaderSecondaryTestInstance::GeometryShaderSecondaryTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic, const std::vector<deUint64>& drawRepeats)
+ : GeometryShaderTestInstance (context, data, parametersGraphic, drawRepeats)
{
}
@@ -1702,22 +1904,30 @@
const CmdPoolCreateInfo cmdPoolCreateInfo (queueFamilyIndex);
const Move<VkCommandPool> cmdPool = createCommandPool(vk, device, &cmdPoolCreateInfo);
- const Unique<VkQueryPool> queryPool (makeQueryPool(vk, device, m_parametersGraphic.queryStatisticFlags));
+ const deUint32 queryCount = static_cast<deUint32>(m_drawRepeats.size());
+ const Unique<VkQueryPool> queryPool (makeQueryPool(vk, device, queryCount, m_parametersGraphic.queryStatisticFlags));
const VkDeviceSize vertexBufferOffset = 0;
const de::SharedPtr<Buffer> vertexBufferSp = creatAndFillVertexBuffer();
const VkBuffer vertexBuffer = vertexBufferSp->object();
const Unique<VkCommandBuffer> primaryCmdBuffer (allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
- const Unique<VkCommandBuffer> secondaryCmdBuffer (allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY));
+ std::vector<VkCommandBufferSp> secondaryCmdBuffers(queryCount);
- beginSecondaryCommandBuffer(vk, *secondaryCmdBuffer, m_parametersGraphic.queryStatisticFlags, *m_renderPass, *m_framebuffer, VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT);
- vk.cmdBindPipeline(*secondaryCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
- vk.cmdBeginQuery(*secondaryCmdBuffer, *queryPool, 0u, (VkQueryControlFlags)0u);
- vk.cmdBindVertexBuffers(*secondaryCmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
- draw(*secondaryCmdBuffer);
- vk.cmdEndQuery(*secondaryCmdBuffer, *queryPool, 0u);
- endCommandBuffer(vk, *secondaryCmdBuffer);
+ for (deUint32 i = 0; i < queryCount; ++i)
+ secondaryCmdBuffers[i] = VkCommandBufferSp(new vk::Unique<VkCommandBuffer>(allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY)));
+
+ for (deUint32 i = 0; i < queryCount; ++i)
+ {
+ beginSecondaryCommandBuffer(vk, secondaryCmdBuffers[i]->get(), m_parametersGraphic.queryStatisticFlags, *m_renderPass, *m_framebuffer, VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT);
+ vk.cmdBeginQuery(secondaryCmdBuffers[i]->get(), *queryPool, i, (VkQueryControlFlags)0u);
+ vk.cmdBindPipeline(secondaryCmdBuffers[i]->get(), VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+ vk.cmdBindVertexBuffers(secondaryCmdBuffers[i]->get(), 0u, 1u, &vertexBuffer, &vertexBufferOffset);
+ for (deUint32 j = 0; j<m_drawRepeats[i]; ++j)
+ draw(secondaryCmdBuffers[i]->get());
+ vk.cmdEndQuery(secondaryCmdBuffers[i]->get(), *queryPool, i);
+ endCommandBuffer(vk, secondaryCmdBuffers[i]->get());
+ }
beginCommandBuffer(vk, *primaryCmdBuffer);
{
@@ -1730,15 +1940,16 @@
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT);
if (m_parametersGraphic.resetType != RESET_TYPE_HOST)
- vk.cmdResetQueryPool(*primaryCmdBuffer, *queryPool, 0u, 1u);
+ vk.cmdResetQueryPool(*primaryCmdBuffer, *queryPool, 0u, queryCount);
beginRenderPass(vk, *primaryCmdBuffer, *m_renderPass, *m_framebuffer, makeRect2D(0, 0, WIDTH, HEIGHT), (deUint32)renderPassClearValues.size(), &renderPassClearValues[0], VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
- vk.cmdExecuteCommands(*primaryCmdBuffer, 1u, &secondaryCmdBuffer.get());
+ for (deUint32 i = 0; i < queryCount; ++i)
+ vk.cmdExecuteCommands(*primaryCmdBuffer, 1u, &(secondaryCmdBuffers[i]->get()));
endRenderPass(vk, *primaryCmdBuffer);
if (m_parametersGraphic.resetType == RESET_TYPE_BEFORE_COPY)
{
- vk.cmdResetQueryPool(*primaryCmdBuffer, *queryPool, 0u, 1u);
- vk.cmdCopyQueryPoolResults(*primaryCmdBuffer, *queryPool, 0, 1u, m_resetBuffer->object(), 0u, sizeof(ValueAndAvailability), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
+ vk.cmdResetQueryPool(*primaryCmdBuffer, *queryPool, 0u, queryCount);
+ vk.cmdCopyQueryPoolResults(*primaryCmdBuffer, *queryPool, 0, queryCount, m_resetBuffer->object(), 0u, sizeof(ValueAndAvailability), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
}
transition2DImage(vk, *primaryCmdBuffer, m_colorAttachmentImage->object(), VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL,
@@ -1747,7 +1958,7 @@
endCommandBuffer(vk, *primaryCmdBuffer);
if (m_parametersGraphic.resetType == RESET_TYPE_HOST)
- vk.resetQueryPoolEXT(device, *queryPool, 0u, 1u);
+ vk.resetQueryPool(device, *queryPool, 0u, queryCount);
// Wait for completion
submitCommandsAndWait(vk, device, queue, *primaryCmdBuffer);
@@ -1757,14 +1968,14 @@
class GeometryShaderSecondaryInheritedTestInstance : public GeometryShaderTestInstance
{
public:
- GeometryShaderSecondaryInheritedTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic);
+ GeometryShaderSecondaryInheritedTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic, const std::vector<deUint64>& drawRepeats);
protected:
virtual void checkExtensions (deBool hostQueryResetEnabled);
virtual tcu::TestStatus executeTest (void);
};
-GeometryShaderSecondaryInheritedTestInstance::GeometryShaderSecondaryInheritedTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic)
- : GeometryShaderTestInstance (context, data, parametersGraphic)
+GeometryShaderSecondaryInheritedTestInstance::GeometryShaderSecondaryInheritedTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic, const std::vector<deUint64>& drawRepeats)
+ : GeometryShaderTestInstance (context, data, parametersGraphic, drawRepeats)
{
}
@@ -1784,20 +1995,28 @@
const CmdPoolCreateInfo cmdPoolCreateInfo (queueFamilyIndex);
const Move<VkCommandPool> cmdPool = createCommandPool(vk, device, &cmdPoolCreateInfo);
- const Unique<VkQueryPool> queryPool (makeQueryPool(vk, device, m_parametersGraphic.queryStatisticFlags));
+ const deUint32 queryCount = static_cast<deUint32>(m_drawRepeats.size());
+ const Unique<VkQueryPool> queryPool (makeQueryPool(vk, device, queryCount, m_parametersGraphic.queryStatisticFlags));
const VkDeviceSize vertexBufferOffset = 0u;
const de::SharedPtr<Buffer> vertexBufferSp = creatAndFillVertexBuffer();
const VkBuffer vertexBuffer = vertexBufferSp->object();
const Unique<VkCommandBuffer> primaryCmdBuffer (allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
- const Unique<VkCommandBuffer> secondaryCmdBuffer (allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY));
+ std::vector<VkCommandBufferSp> secondaryCmdBuffers(queryCount);
- beginSecondaryCommandBuffer(vk, *secondaryCmdBuffer, m_parametersGraphic.queryStatisticFlags, *m_renderPass, *m_framebuffer, VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT);
- vk.cmdBindPipeline(*secondaryCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
- vk.cmdBindVertexBuffers(*secondaryCmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
- draw(*secondaryCmdBuffer);
- endCommandBuffer(vk, *secondaryCmdBuffer);
+ for (deUint32 i = 0; i < queryCount; ++i)
+ secondaryCmdBuffers[i] = VkCommandBufferSp(new vk::Unique<VkCommandBuffer>(allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY)));
+
+ for (deUint32 i = 0; i < queryCount; ++i)
+ {
+ beginSecondaryCommandBuffer(vk, secondaryCmdBuffers[i]->get(), m_parametersGraphic.queryStatisticFlags, *m_renderPass, *m_framebuffer, VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT);
+ vk.cmdBindPipeline(secondaryCmdBuffers[i]->get(), VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+ vk.cmdBindVertexBuffers(secondaryCmdBuffers[i]->get(), 0u, 1u, &vertexBuffer, &vertexBufferOffset);
+ for (deUint32 j = 0; j<m_drawRepeats[i]; ++j)
+ draw(secondaryCmdBuffers[i]->get());
+ endCommandBuffer(vk, secondaryCmdBuffers[i]->get());
+ }
beginCommandBuffer(vk, *primaryCmdBuffer);
{
@@ -1810,17 +2029,21 @@
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT);
if (m_parametersGraphic.resetType != RESET_TYPE_HOST)
- vk.cmdResetQueryPool(*primaryCmdBuffer, *queryPool, 0u, 1u);
- vk.cmdBeginQuery(*primaryCmdBuffer, *queryPool, 0u, (VkQueryControlFlags)0u);
- beginRenderPass(vk, *primaryCmdBuffer, *m_renderPass, *m_framebuffer, makeRect2D(0, 0, WIDTH, HEIGHT), (deUint32)renderPassClearValues.size(), &renderPassClearValues[0], VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
- vk.cmdExecuteCommands(*primaryCmdBuffer, 1u, &secondaryCmdBuffer.get());
- endRenderPass(vk, *primaryCmdBuffer);
- vk.cmdEndQuery(*primaryCmdBuffer, *queryPool, 0u);
+ vk.cmdResetQueryPool(*primaryCmdBuffer, *queryPool, 0u, queryCount);
+
+ for (deUint32 i = 0; i < queryCount; ++i)
+ {
+ vk.cmdBeginQuery(*primaryCmdBuffer, *queryPool, i, (VkQueryControlFlags)0u);
+ beginRenderPass(vk, *primaryCmdBuffer, *m_renderPass, *m_framebuffer, makeRect2D(0, 0, WIDTH, HEIGHT), (deUint32)renderPassClearValues.size(), &renderPassClearValues[0], VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
+ vk.cmdExecuteCommands(*primaryCmdBuffer, 1u, &(secondaryCmdBuffers[i]->get()));
+ endRenderPass(vk, *primaryCmdBuffer);
+ vk.cmdEndQuery(*primaryCmdBuffer, *queryPool, i);
+ }
if (m_parametersGraphic.resetType == RESET_TYPE_BEFORE_COPY)
{
- vk.cmdResetQueryPool(*primaryCmdBuffer, *queryPool, 0u, 1u);
- vk.cmdCopyQueryPoolResults(*primaryCmdBuffer, *queryPool, 0, 1u, m_resetBuffer->object(), 0u, sizeof(ValueAndAvailability), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
+ vk.cmdResetQueryPool(*primaryCmdBuffer, *queryPool, 0u, queryCount);
+ vk.cmdCopyQueryPoolResults(*primaryCmdBuffer, *queryPool, 0, queryCount, m_resetBuffer->object(), 0u, sizeof(ValueAndAvailability), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
}
transition2DImage(vk, *primaryCmdBuffer, m_colorAttachmentImage->object(), VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL,
@@ -1829,7 +2052,7 @@
endCommandBuffer(vk, *primaryCmdBuffer);
if (m_parametersGraphic.resetType == RESET_TYPE_HOST)
- vk.resetQueryPoolEXT(device, *queryPool, 0u, 1u);
+ vk.resetQueryPool(device, *queryPool, 0u, queryCount);
// Wait for completion
submitCommandsAndWait(vk, device, queue, *primaryCmdBuffer);
@@ -1839,7 +2062,7 @@
class TessellationShaderTestInstance : public GraphicBasicTestInstance
{
public:
- TessellationShaderTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic);
+ TessellationShaderTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic, const std::vector<deUint64>& drawRepeats);
protected:
virtual void checkExtensions (deBool hostQueryResetEnabled);
virtual void createPipeline (void);
@@ -1848,8 +2071,8 @@
void draw (VkCommandBuffer cmdBuffer);
};
-TessellationShaderTestInstance::TessellationShaderTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic)
- : GraphicBasicTestInstance (context, data, parametersGraphic)
+TessellationShaderTestInstance::TessellationShaderTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic, const std::vector<deUint64>& drawRepeats)
+ : GraphicBasicTestInstance (context, data, parametersGraphic, drawRepeats)
{
}
@@ -1940,7 +2163,8 @@
const CmdPoolCreateInfo cmdPoolCreateInfo (queueFamilyIndex);
const Move<VkCommandPool> cmdPool = createCommandPool(vk, device, &cmdPoolCreateInfo);
- const Unique<VkQueryPool> queryPool (makeQueryPool(vk, device, m_parametersGraphic.queryStatisticFlags));
+ const deUint32 queryCount = static_cast<deUint32>(m_drawRepeats.size());
+ const Unique<VkQueryPool> queryPool (makeQueryPool(vk, device, queryCount, m_parametersGraphic.queryStatisticFlags));
const VkDeviceSize vertexBufferOffset = 0u;
const de::SharedPtr<Buffer> vertexBufferSp = creatAndFillVertexBuffer();
@@ -1959,24 +2183,28 @@
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT);
if (m_parametersGraphic.resetType != RESET_TYPE_HOST)
- vk.cmdResetQueryPool(*cmdBuffer, *queryPool, 0u, 1u);
+ vk.cmdResetQueryPool(*cmdBuffer, *queryPool, 0u, queryCount);
beginRenderPass(vk, *cmdBuffer, *m_renderPass, *m_framebuffer, makeRect2D(0, 0, WIDTH, HEIGHT), (deUint32)renderPassClearValues.size(), &renderPassClearValues[0]);
- vk.cmdBeginQuery(*cmdBuffer, *queryPool, 0u, (VkQueryControlFlags)0u);
- vk.cmdBindVertexBuffers(*cmdBuffer, 0, 1, &vertexBuffer, &vertexBufferOffset);
- vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+ for (deUint32 i = 0; i < queryCount; ++i)
+ {
+ vk.cmdBeginQuery(*cmdBuffer, *queryPool, i, (VkQueryControlFlags)0u);
+ vk.cmdBindVertexBuffers(*cmdBuffer, 0, 1, &vertexBuffer, &vertexBufferOffset);
+ vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
- draw(*cmdBuffer);
+ for (deUint64 j = 0; j<m_drawRepeats[i]; ++j)
+ draw(*cmdBuffer);
- vk.cmdEndQuery(*cmdBuffer, *queryPool, 0u);
+ vk.cmdEndQuery(*cmdBuffer, *queryPool, i);
+ }
endRenderPass(vk, *cmdBuffer);
if (m_parametersGraphic.resetType == RESET_TYPE_BEFORE_COPY)
{
- vk.cmdResetQueryPool(*cmdBuffer, *queryPool, 0u, 1u);
- vk.cmdCopyQueryPoolResults(*cmdBuffer, *queryPool, 0, 1u, m_resetBuffer->object(), 0u, sizeof(ValueAndAvailability), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
+ vk.cmdResetQueryPool(*cmdBuffer, *queryPool, 0u, queryCount);
+ vk.cmdCopyQueryPoolResults(*cmdBuffer, *queryPool, 0, queryCount, m_resetBuffer->object(), 0u, sizeof(ValueAndAvailability), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
}
transition2DImage(vk, *cmdBuffer, m_colorAttachmentImage->object(), VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL,
@@ -1985,7 +2213,7 @@
endCommandBuffer(vk, *cmdBuffer);
if (m_parametersGraphic.resetType == RESET_TYPE_HOST)
- vk.resetQueryPoolEXT(device, *queryPool, 0u, 1u);
+ vk.resetQueryPool(device, *queryPool, 0u, queryCount);
// Wait for completion
submitCommandsAndWait(vk, device, queue, *cmdBuffer);
@@ -2007,44 +2235,55 @@
expectedMin = 100u;
break;
default:
- DE_ASSERT(0);
+ DE_FATAL("Unexpected type of statistics query");
break;
}
+ const deUint32 queryCount = static_cast<deUint32>(m_drawRepeats.size());
+
if (m_parametersGraphic.resetType == RESET_TYPE_NORMAL)
{
- deUint64 result = 0u;
- VK_CHECK(vk.getQueryPoolResults(device, queryPool, 0u, 1u, sizeof(deUint64), &result, 0u, VK_QUERY_RESULT_64_BIT));
- if (result < expectedMin)
+ ResultsVector results(queryCount, 0u);
+ VK_CHECK(GetQueryPoolResultsVector(results, vk, device, queryPool, 0u, queryCount, (VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT)));
+ if (results[0] < expectedMin)
return tcu::TestStatus::fail("QueryPoolResults incorrect");
+ if (queryCount > 1)
+ {
+ double pearson = calculatePearsonCorrelation(m_drawRepeats, results);
+ if ( fabs( pearson ) < 0.8 )
+ return tcu::TestStatus::fail("QueryPoolResults are nonlinear");
+ }
if (!checkImage())
return tcu::TestStatus::fail("Result image doesn't match expected image.");
}
else if (m_parametersGraphic.resetType == RESET_TYPE_HOST)
{
- deUint64 result[2] = {0u, 0u};
- deUint64 temp = 0u;
- VK_CHECK(vk.getQueryPoolResults(device, queryPool, 0u, 1u, sizeof(deUint64) * 2, &result, 0u, VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT));
- if (result[0] < expectedMin || result[1] == 0u)
+ ResultsVectorWithAvailability results(queryCount, pair<deUint64,deUint64>(0u,0u));
+ VK_CHECK(GetQueryPoolResultsVector(results, vk, device, queryPool, 0u, queryCount, (VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT)));
+ if (results[0].first < expectedMin || results[0].second == 0u)
return tcu::TestStatus::fail("QueryPoolResults incorrect");
- if (!checkImage())
- return tcu::TestStatus::fail("Result image doesn't match expected image.");
+ if (queryCount > 1)
+ {
+ double pearson = calculatePearsonCorrelation(m_drawRepeats, results);
+ if ( fabs( pearson ) < 0.8 )
+ return tcu::TestStatus::fail("QueryPoolResults are nonlinear");
+ }
- temp = result[0];
+ deUint64 temp = results[0].first;
- vk.resetQueryPoolEXT(device, queryPool, 0, 1u);
- vk::VkResult res = vk.getQueryPoolResults(device, queryPool, 0u, 1u, sizeof(deUint64) * 2, &result, 0u, VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
+ vk.resetQueryPool(device, queryPool, 0, queryCount);
+ vk::VkResult res = GetQueryPoolResultsVector(results, vk, device, queryPool, 0u, queryCount, (VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT));
/* From Vulkan spec:
*
* If VK_QUERY_RESULT_WAIT_BIT and VK_QUERY_RESULT_PARTIAL_BIT are both not set then no result values are written to pData
* for queries that are in the unavailable state at the time of the call, and vkGetQueryPoolResults returns VK_NOT_READY.
* However, availability state is still written to pData for those queries if VK_QUERY_RESULT_WITH_AVAILABILITY_BIT is set.
*/
- if (res != vk::VK_NOT_READY || result[0] != temp || result[1] != 0)
+ if (res != vk::VK_NOT_READY || results[0].first != temp || results[0].second != 0u)
return tcu::TestStatus::fail("QueryPoolResults incorrect reset");
- }
+ }
else
{
// With RESET_TYPE_BEFORE_COPY, we only need to verify the result after the copy include an availability bit set as zero.
@@ -2062,13 +2301,13 @@
class TessellationShaderSecondrayTestInstance : public TessellationShaderTestInstance
{
public:
- TessellationShaderSecondrayTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic);
+ TessellationShaderSecondrayTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic, const std::vector<deUint64>& drawRepeats);
protected:
virtual tcu::TestStatus executeTest (void);
};
-TessellationShaderSecondrayTestInstance::TessellationShaderSecondrayTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic)
- : TessellationShaderTestInstance (context, data, parametersGraphic)
+TessellationShaderSecondrayTestInstance::TessellationShaderSecondrayTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic, const std::vector<deUint64>& drawRepeats)
+ : TessellationShaderTestInstance (context, data, parametersGraphic, drawRepeats)
{
}
@@ -2081,22 +2320,30 @@
const CmdPoolCreateInfo cmdPoolCreateInfo (queueFamilyIndex);
const Move<VkCommandPool> cmdPool = createCommandPool(vk, device, &cmdPoolCreateInfo);
- const Unique<VkQueryPool> queryPool (makeQueryPool(vk, device, m_parametersGraphic.queryStatisticFlags));
+ const deUint32 queryCount = static_cast<deUint32>(m_drawRepeats.size());
+ const Unique<VkQueryPool> queryPool (makeQueryPool(vk, device, queryCount, m_parametersGraphic.queryStatisticFlags));
const VkDeviceSize vertexBufferOffset = 0u;
const de::SharedPtr<Buffer> vertexBufferSp = creatAndFillVertexBuffer();
const VkBuffer vertexBuffer = vertexBufferSp->object();
const Unique<VkCommandBuffer> primaryCmdBuffer (allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
- const Unique<VkCommandBuffer> secondaryCmdBuffer (allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY));
+ std::vector<VkCommandBufferSp> secondaryCmdBuffers(queryCount);
- beginSecondaryCommandBuffer(vk, *secondaryCmdBuffer, m_parametersGraphic.queryStatisticFlags, *m_renderPass, *m_framebuffer, VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT);
- vk.cmdBindPipeline(*secondaryCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
- vk.cmdBeginQuery(*secondaryCmdBuffer, *queryPool, 0u, (VkQueryControlFlags)0u);
- vk.cmdBindVertexBuffers(*secondaryCmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
- draw(*secondaryCmdBuffer);
- vk.cmdEndQuery(*secondaryCmdBuffer, *queryPool, 0u);
- endCommandBuffer(vk, *secondaryCmdBuffer);
+ for (deUint32 i = 0; i < queryCount; ++i)
+ secondaryCmdBuffers[i] = VkCommandBufferSp(new vk::Unique<VkCommandBuffer>(allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY)));
+
+ for (deUint32 i = 0; i < queryCount; ++i)
+ {
+ beginSecondaryCommandBuffer(vk, secondaryCmdBuffers[i]->get(), m_parametersGraphic.queryStatisticFlags, *m_renderPass, *m_framebuffer, VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT);
+ vk.cmdBeginQuery(secondaryCmdBuffers[i]->get(), *queryPool, i, (VkQueryControlFlags)0u);
+ vk.cmdBindPipeline(secondaryCmdBuffers[i]->get(), VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+ vk.cmdBindVertexBuffers(secondaryCmdBuffers[i]->get(), 0u, 1u, &vertexBuffer, &vertexBufferOffset);
+ for (deUint32 j = 0; j<m_drawRepeats[i]; ++j)
+ draw(secondaryCmdBuffers[i]->get());
+ vk.cmdEndQuery(secondaryCmdBuffers[i]->get(), *queryPool, i);
+ endCommandBuffer(vk, secondaryCmdBuffers[i]->get());
+ }
beginCommandBuffer(vk, *primaryCmdBuffer);
{
@@ -2112,15 +2359,16 @@
vk.cmdBindPipeline(*primaryCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
if (m_parametersGraphic.resetType != RESET_TYPE_HOST)
- vk.cmdResetQueryPool(*primaryCmdBuffer, *queryPool, 0u, 1u);
+ vk.cmdResetQueryPool(*primaryCmdBuffer, *queryPool, 0u, queryCount);
beginRenderPass(vk, *primaryCmdBuffer, *m_renderPass, *m_framebuffer, makeRect2D(0, 0, WIDTH, HEIGHT), (deUint32)renderPassClearValues.size(), &renderPassClearValues[0], VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
- vk.cmdExecuteCommands(*primaryCmdBuffer, 1u, &secondaryCmdBuffer.get());
+ for (deUint32 i = 0; i < queryCount; ++i)
+ vk.cmdExecuteCommands(*primaryCmdBuffer, 1u, &(secondaryCmdBuffers[i]->get()));
endRenderPass(vk, *primaryCmdBuffer);
if (m_parametersGraphic.resetType == RESET_TYPE_BEFORE_COPY)
{
- vk.cmdResetQueryPool(*primaryCmdBuffer, *queryPool, 0u, 1u);
+ vk.cmdResetQueryPool(*primaryCmdBuffer, *queryPool, 0u, queryCount);
vk.cmdCopyQueryPoolResults(*primaryCmdBuffer, *queryPool, 0, 1u, m_resetBuffer->object(), 0u, sizeof(ValueAndAvailability), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
}
@@ -2130,7 +2378,7 @@
endCommandBuffer(vk, *primaryCmdBuffer);
if (m_parametersGraphic.resetType == RESET_TYPE_HOST)
- vk.resetQueryPoolEXT(device, *queryPool, 0u, 1u);
+ vk.resetQueryPool(device, *queryPool, 0u, queryCount);
// Wait for completion
submitCommandsAndWait(vk, device, queue, *primaryCmdBuffer);
@@ -2140,14 +2388,14 @@
class TessellationShaderSecondrayInheritedTestInstance : public TessellationShaderTestInstance
{
public:
- TessellationShaderSecondrayInheritedTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic);
+ TessellationShaderSecondrayInheritedTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic, const std::vector<deUint64>& drawRepeats);
protected:
virtual void checkExtensions (deBool hostQueryResetEnabled);
virtual tcu::TestStatus executeTest (void);
};
-TessellationShaderSecondrayInheritedTestInstance::TessellationShaderSecondrayInheritedTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic)
- : TessellationShaderTestInstance (context, data, parametersGraphic)
+TessellationShaderSecondrayInheritedTestInstance::TessellationShaderSecondrayInheritedTestInstance (vkt::Context& context, const std::vector<VertexData>& data, const ParametersGraphic& parametersGraphic, const std::vector<deUint64>& drawRepeats)
+ : TessellationShaderTestInstance (context, data, parametersGraphic, drawRepeats)
{
}
@@ -2167,20 +2415,28 @@
const CmdPoolCreateInfo cmdPoolCreateInfo (queueFamilyIndex);
const Move<VkCommandPool> cmdPool = createCommandPool(vk, device, &cmdPoolCreateInfo);
- const Unique<VkQueryPool> queryPool (makeQueryPool(vk, device, m_parametersGraphic.queryStatisticFlags));
+ const deUint32 queryCount = static_cast<deUint32>(m_drawRepeats.size());
+ const Unique<VkQueryPool> queryPool (makeQueryPool(vk, device, queryCount, m_parametersGraphic.queryStatisticFlags));
const VkDeviceSize vertexBufferOffset = 0u;
const de::SharedPtr<Buffer> vertexBufferSp = creatAndFillVertexBuffer();
const VkBuffer vertexBuffer = vertexBufferSp->object();
const Unique<VkCommandBuffer> primaryCmdBuffer (allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
- const Unique<VkCommandBuffer> secondaryCmdBuffer (allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY));
+ std::vector<VkCommandBufferSp> secondaryCmdBuffers(queryCount);
- beginSecondaryCommandBuffer(vk, *secondaryCmdBuffer, m_parametersGraphic.queryStatisticFlags, *m_renderPass, *m_framebuffer, VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT);
- vk.cmdBindPipeline(*secondaryCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
- vk.cmdBindVertexBuffers(*secondaryCmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
- draw(*secondaryCmdBuffer);
- endCommandBuffer(vk, *secondaryCmdBuffer);
+ for (deUint32 i = 0; i < queryCount; ++i)
+ secondaryCmdBuffers[i] = VkCommandBufferSp(new vk::Unique<VkCommandBuffer>(allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY)));
+
+ for (deUint32 i = 0; i < queryCount; ++i)
+ {
+ beginSecondaryCommandBuffer(vk, secondaryCmdBuffers[i]->get(), m_parametersGraphic.queryStatisticFlags, *m_renderPass, *m_framebuffer, VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT);
+ vk.cmdBindPipeline(secondaryCmdBuffers[i]->get(), VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+ vk.cmdBindVertexBuffers(secondaryCmdBuffers[i]->get(), 0u, 1u, &vertexBuffer, &vertexBufferOffset);
+ for (deUint32 j = 0; j<m_drawRepeats[i]; ++j)
+ draw(secondaryCmdBuffers[i]->get());
+ endCommandBuffer(vk, secondaryCmdBuffers[i]->get());
+ }
beginCommandBuffer(vk, *primaryCmdBuffer);
{
@@ -2192,21 +2448,22 @@
initialTransitionDepth2DImage(vk, *primaryCmdBuffer, m_depthImage->object(), VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT);
- vk.cmdBindVertexBuffers(*primaryCmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
- vk.cmdBindPipeline(*primaryCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
if (m_parametersGraphic.resetType != RESET_TYPE_HOST)
- vk.cmdResetQueryPool(*primaryCmdBuffer, *queryPool, 0u, 1u);
- vk.cmdBeginQuery(*primaryCmdBuffer, *queryPool, 0u, (VkQueryControlFlags)0u);
+ vk.cmdResetQueryPool(*primaryCmdBuffer, *queryPool, 0u, queryCount);
- beginRenderPass(vk, *primaryCmdBuffer, *m_renderPass, *m_framebuffer, makeRect2D(0, 0, WIDTH, HEIGHT), (deUint32)renderPassClearValues.size(), &renderPassClearValues[0], VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
- vk.cmdExecuteCommands(*primaryCmdBuffer, 1u, &secondaryCmdBuffer.get());
- endRenderPass(vk, *primaryCmdBuffer);
- vk.cmdEndQuery(*primaryCmdBuffer, *queryPool, 0u);
+ for (deUint32 i = 0; i < queryCount; ++i)
+ {
+ vk.cmdBeginQuery(*primaryCmdBuffer, *queryPool, i, (VkQueryControlFlags)0u);
+ beginRenderPass(vk, *primaryCmdBuffer, *m_renderPass, *m_framebuffer, makeRect2D(0, 0, WIDTH, HEIGHT), (deUint32)renderPassClearValues.size(), &renderPassClearValues[0], VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
+ vk.cmdExecuteCommands(*primaryCmdBuffer, 1u, &(secondaryCmdBuffers[i]->get()));
+ endRenderPass(vk, *primaryCmdBuffer);
+ vk.cmdEndQuery(*primaryCmdBuffer, *queryPool, i);
+ }
if (m_parametersGraphic.resetType == RESET_TYPE_BEFORE_COPY)
{
- vk.cmdResetQueryPool(*primaryCmdBuffer, *queryPool, 0u, 1u);
- vk.cmdCopyQueryPoolResults(*primaryCmdBuffer, *queryPool, 0, 1u, m_resetBuffer->object(), 0u, sizeof(ValueAndAvailability), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
+ vk.cmdResetQueryPool(*primaryCmdBuffer, *queryPool, 0u, queryCount);
+ vk.cmdCopyQueryPoolResults(*primaryCmdBuffer, *queryPool, 0, queryCount, m_resetBuffer->object(), 0u, sizeof(ValueAndAvailability), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
}
transition2DImage(vk, *primaryCmdBuffer, m_colorAttachmentImage->object(), VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL,
@@ -2215,7 +2472,7 @@
endCommandBuffer(vk, *primaryCmdBuffer);
if (m_parametersGraphic.resetType == RESET_TYPE_HOST)
- vk.resetQueryPoolEXT(device, *queryPool, 0u, 1u);
+ vk.resetQueryPool(device, *queryPool, 0u, queryCount);
// Wait for completion
submitCommandsAndWait(vk, device, queue, *primaryCmdBuffer);
@@ -2226,8 +2483,8 @@
class QueryPoolStatisticsTest : public TestCase
{
public:
- QueryPoolStatisticsTest (tcu::TestContext &context, const char *name, const char *description, const ResetType resetType)
- : TestCase (context, name, description)
+ QueryPoolStatisticsTest (tcu::TestContext &context, const std::string& name, const std::string& description, const ResetType resetType, deBool query64Bits)
+ : TestCase (context, name.c_str(), description.c_str())
{
const tcu::UVec3 localSize[] =
{
@@ -2249,14 +2506,14 @@
{
std::ostringstream shaderName;
shaderName<< "compute_" << shaderNdx;
- const ComputeInvocationsTestInstance::ParametersCompute prameters =
- {
+ const ComputeInvocationsTestInstance::ParametersCompute parameters(
localSize[shaderNdx],
groupSize[shaderNdx],
shaderName.str(),
- resetType
- };
- m_parameters.push_back(prameters);
+ resetType,
+ query64Bits
+ );
+ m_parameters.push_back(parameters);
}
}
@@ -2296,9 +2553,10 @@
class QueryPoolGraphicStatisticsTest : public TestCase
{
public:
- QueryPoolGraphicStatisticsTest (tcu::TestContext &context, const char *name, const char *description, const GraphicBasicTestInstance::ParametersGraphic parametersGraphic)
- : TestCase (context, name, description)
+ QueryPoolGraphicStatisticsTest (tcu::TestContext &context, const std::string& name, const std::string& description, const GraphicBasicTestInstance::ParametersGraphic parametersGraphic, const std::vector<deUint64>& drawRepeats)
+ : TestCase (context, name.c_str(), description.c_str())
, m_parametersGraphic (parametersGraphic)
+ , m_drawRepeats ( drawRepeats )
{
m_data.push_back(GraphicBasicTestInstance::VertexData(tcu::Vec4(-1.0f,-1.0f, 1.0f, 1.0f), tcu::RGBA::red().toVec()));
m_data.push_back(GraphicBasicTestInstance::VertexData(tcu::Vec4(-1.0f, 0.0f, 1.0f, 1.0f), tcu::RGBA::red().toVec()));
@@ -2323,7 +2581,7 @@
vkt::TestInstance* createInstance (vkt::Context& context) const
{
- return new Instance(context, m_data, m_parametersGraphic);
+ return new Instance(context, m_data, m_parametersGraphic, m_drawRepeats);
}
void initPrograms(SourceCollections& sourceCollections) const
@@ -2491,6 +2749,7 @@
private:
std::vector<GraphicBasicTestInstance::VertexData> m_data;
const GraphicBasicTestInstance::ParametersGraphic m_parametersGraphic;
+ std::vector<deUint64> m_drawRepeats;
};
} //anonymous
@@ -2499,6 +2758,11 @@
{
}
+inline std::string bitPrefix(deBool query64bits)
+{
+ return (query64bits ? "64bits_" : "32bits_");
+}
+
void QueryPoolStatisticsTests::init (void)
{
std::string topology_name [VK_PRIMITIVE_TOPOLOGY_LAST] =
@@ -2516,6 +2780,8 @@
"patch_list"
};
+ std::vector<deUint64> sixRepeats = { 1, 3, 5, 8, 15, 24 };
+
de::MovePtr<TestCaseGroup> computeShaderInvocationsGroup (new TestCaseGroup(m_testCtx, "compute_shader_invocations", "Query pipeline statistic compute shader invocations"));
de::MovePtr<TestCaseGroup> inputAssemblyVertices (new TestCaseGroup(m_testCtx, "input_assembly_vertices", "Query pipeline statistic input assembly vertices"));
de::MovePtr<TestCaseGroup> inputAssemblyPrimitives (new TestCaseGroup(m_testCtx, "input_assembly_primitives", "Query pipeline statistic input assembly primitives"));
@@ -2559,34 +2825,40 @@
de::MovePtr<TestCaseGroup> tesControlPatchesResetBeforeCopy (new TestCaseGroup(m_testCtx, "tes_control_patches", "Query pipeline statistic tessellation control shader patches"));
de::MovePtr<TestCaseGroup> tesEvaluationShaderInvocationsResetBeforeCopy (new TestCaseGroup(m_testCtx, "tes_evaluation_shader_invocations", "Query pipeline statistic tessellation evaluation shader invocations"));
- computeShaderInvocationsGroup->addChild(new QueryPoolStatisticsTest<ComputeInvocationsTestInstance> (m_testCtx, "primary", "", RESET_TYPE_NORMAL));
- computeShaderInvocationsGroup->addChild(new QueryPoolStatisticsTest<ComputeInvocationsSecondaryTestInstance> (m_testCtx, "secondary", "", RESET_TYPE_NORMAL));
- computeShaderInvocationsGroup->addChild(new QueryPoolStatisticsTest<ComputeInvocationsSecondaryInheritedTestInstance> (m_testCtx, "secondary_inherited", "", RESET_TYPE_NORMAL));
+ for (deUint32 i = 0; i < 2; ++i)
+ {
+ deBool query64Bits = (i == 1);
+ std::string prefix = bitPrefix(query64Bits);
- computeShaderInvocationsGroupHostQueryReset->addChild(new QueryPoolStatisticsTest<ComputeInvocationsTestInstance> (m_testCtx, "primary", "", RESET_TYPE_HOST));
- computeShaderInvocationsGroupHostQueryReset->addChild(new QueryPoolStatisticsTest<ComputeInvocationsSecondaryTestInstance> (m_testCtx, "secondary", "", RESET_TYPE_HOST));
- computeShaderInvocationsGroupHostQueryReset->addChild(new QueryPoolStatisticsTest<ComputeInvocationsSecondaryInheritedTestInstance> (m_testCtx, "secondary_inherited", "", RESET_TYPE_HOST));
+ computeShaderInvocationsGroup->addChild(new QueryPoolStatisticsTest<ComputeInvocationsTestInstance> (m_testCtx, prefix + "primary", "", RESET_TYPE_NORMAL, query64Bits));
+ computeShaderInvocationsGroup->addChild(new QueryPoolStatisticsTest<ComputeInvocationsSecondaryTestInstance> (m_testCtx, prefix + "secondary", "", RESET_TYPE_NORMAL, query64Bits));
+ computeShaderInvocationsGroup->addChild(new QueryPoolStatisticsTest<ComputeInvocationsSecondaryInheritedTestInstance> (m_testCtx, prefix + "secondary_inherited", "", RESET_TYPE_NORMAL, query64Bits));
- computeShaderInvocationsGroupResetBeforeCopy->addChild(new QueryPoolStatisticsTest<ComputeInvocationsTestInstance> (m_testCtx, "primary", "", RESET_TYPE_BEFORE_COPY));
- computeShaderInvocationsGroupResetBeforeCopy->addChild(new QueryPoolStatisticsTest<ComputeInvocationsSecondaryTestInstance> (m_testCtx, "secondary", "", RESET_TYPE_BEFORE_COPY));
- computeShaderInvocationsGroupResetBeforeCopy->addChild(new QueryPoolStatisticsTest<ComputeInvocationsSecondaryInheritedTestInstance>(m_testCtx, "secondary_inherited", "", RESET_TYPE_BEFORE_COPY));
+ computeShaderInvocationsGroupHostQueryReset->addChild(new QueryPoolStatisticsTest<ComputeInvocationsTestInstance> (m_testCtx, prefix + "primary", "", RESET_TYPE_HOST, query64Bits));
+ computeShaderInvocationsGroupHostQueryReset->addChild(new QueryPoolStatisticsTest<ComputeInvocationsSecondaryTestInstance> (m_testCtx, prefix + "secondary", "", RESET_TYPE_HOST, query64Bits));
+ computeShaderInvocationsGroupHostQueryReset->addChild(new QueryPoolStatisticsTest<ComputeInvocationsSecondaryInheritedTestInstance> (m_testCtx, prefix + "secondary_inherited", "", RESET_TYPE_HOST, query64Bits));
- //VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT
- inputAssemblyVertices->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, "primary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_NORMAL)));
- inputAssemblyVertices->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, "secondary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_NORMAL)));
- inputAssemblyVertices->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, "secondary_inherited", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_NORMAL)));
+ computeShaderInvocationsGroupResetBeforeCopy->addChild(new QueryPoolStatisticsTest<ComputeInvocationsTestInstance> (m_testCtx, prefix + "primary", "", RESET_TYPE_BEFORE_COPY, query64Bits));
+ computeShaderInvocationsGroupResetBeforeCopy->addChild(new QueryPoolStatisticsTest<ComputeInvocationsSecondaryTestInstance> (m_testCtx, prefix + "secondary", "", RESET_TYPE_BEFORE_COPY, query64Bits));
+ computeShaderInvocationsGroupResetBeforeCopy->addChild(new QueryPoolStatisticsTest<ComputeInvocationsSecondaryInheritedTestInstance>(m_testCtx, prefix + "secondary_inherited", "", RESET_TYPE_BEFORE_COPY, query64Bits));
- inputAssemblyVerticesVertexOnly->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, "primary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_NORMAL, DE_TRUE)));
- inputAssemblyVerticesVertexOnly->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, "secondary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_NORMAL, DE_TRUE)));
- inputAssemblyVerticesVertexOnly->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, "secondary_inherited", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_NORMAL, DE_TRUE)));
+ //VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT
+ inputAssemblyVertices->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, prefix + "primary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
+ inputAssemblyVertices->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, prefix + "secondary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
+ inputAssemblyVertices->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + "secondary_inherited", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
- inputAssemblyVerticesHostQueryReset->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, "primary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_HOST)));
- inputAssemblyVerticesHostQueryReset->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, "secondary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_HOST)));
- inputAssemblyVerticesHostQueryReset->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance>(m_testCtx, "secondary_inherited", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_HOST)));
+ inputAssemblyVerticesVertexOnly->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, prefix + "primary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_NORMAL, query64Bits, DE_TRUE), sixRepeats));
+ inputAssemblyVerticesVertexOnly->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, prefix + "secondary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_NORMAL, query64Bits, DE_TRUE), sixRepeats));
+ inputAssemblyVerticesVertexOnly->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + "secondary_inherited", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_NORMAL, query64Bits, DE_TRUE), sixRepeats));
- inputAssemblyVerticesResetBeforeCopy->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, "primary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_BEFORE_COPY)));
- inputAssemblyVerticesResetBeforeCopy->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, "secondary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_BEFORE_COPY)));
- inputAssemblyVerticesResetBeforeCopy->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, "secondary_inherited", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_BEFORE_COPY)));
+ inputAssemblyVerticesHostQueryReset->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, prefix + "primary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_HOST, query64Bits), sixRepeats));
+ inputAssemblyVerticesHostQueryReset->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, prefix + "secondary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_HOST, query64Bits), sixRepeats));
+ inputAssemblyVerticesHostQueryReset->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance>(m_testCtx, prefix + "secondary_inherited", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_HOST, query64Bits), sixRepeats));
+
+ inputAssemblyVerticesResetBeforeCopy->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, prefix + "primary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ inputAssemblyVerticesResetBeforeCopy->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, prefix + "secondary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ inputAssemblyVerticesResetBeforeCopy->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + "secondary_inherited", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ }
//VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT
{
@@ -2608,21 +2880,27 @@
for (int topologyNdx = VK_PRIMITIVE_TOPOLOGY_POINT_LIST; topologyNdx < VK_PRIMITIVE_TOPOLOGY_PATCH_LIST; ++topologyNdx)
{
- primary->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL)));
- secondary->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL)));
- secondaryInherited->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL)));
+ for (deUint32 i = 0; i < 2; ++i)
+ {
+ deBool query64Bits = (i == 1);
+ std::string prefix = bitPrefix(query64Bits);
- primaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST)));
- secondaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST)));
- secondaryInheritedHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST)));
+ primary->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
+ secondary->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
+ secondaryInherited->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
- primaryVertexOnly->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, DE_TRUE)));
- secondaryVertexOnly->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, DE_TRUE)));
- secondaryInheritedVertexOnly->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, DE_TRUE)));
+ primaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST, query64Bits), sixRepeats));
+ secondaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST, query64Bits), sixRepeats));
+ secondaryInheritedHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST, query64Bits), sixRepeats));
- primaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY)));
- secondaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY)));
- secondaryInheritedResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY)));
+ primaryVertexOnly->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits, DE_TRUE), sixRepeats));
+ secondaryVertexOnly->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits, DE_TRUE), sixRepeats));
+ secondaryInheritedVertexOnly->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits, DE_TRUE), sixRepeats));
+
+ primaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ secondaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ secondaryInheritedResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ }
}
inputAssemblyPrimitives->addChild(primary.release());
@@ -2662,21 +2940,27 @@
for (int topologyNdx = VK_PRIMITIVE_TOPOLOGY_POINT_LIST; topologyNdx < VK_PRIMITIVE_TOPOLOGY_PATCH_LIST; ++topologyNdx)
{
- primary->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL)));
- secondary->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL)));
- secondaryInherited->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL)));
+ for (deUint32 i = 0; i < 2; ++i)
+ {
+ deBool query64Bits = (i == 1);
+ std::string prefix = bitPrefix(query64Bits);
- primaryVertexOnly->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, DE_TRUE)));
- secondaryVertexOnly->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, DE_TRUE)));
- secondaryInheritedVertexOnly->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, DE_TRUE)));
+ primary->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
+ secondary->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
+ secondaryInherited->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
- primaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST)));
- secondaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST)));
- secondaryInheritedHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST)));
+ primaryVertexOnly->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits, DE_TRUE), sixRepeats));
+ secondaryVertexOnly->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits, DE_TRUE), sixRepeats));
+ secondaryInheritedVertexOnly->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits, DE_TRUE), sixRepeats));
- primaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY)));
- secondaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY)));
- secondaryInheritedResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY)));
+ primaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST, query64Bits), sixRepeats));
+ secondaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST, query64Bits), sixRepeats));
+ secondaryInheritedHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST, query64Bits), sixRepeats));
+
+ primaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ secondaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ secondaryInheritedResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ }
}
vertexShaderInvocations->addChild(primary.release());
@@ -2712,17 +2996,23 @@
for (int topologyNdx = VK_PRIMITIVE_TOPOLOGY_POINT_LIST; topologyNdx < VK_PRIMITIVE_TOPOLOGY_PATCH_LIST; ++topologyNdx)
{
- primary->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL)));
- secondary->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL)));
- secondaryInherited->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL)));
+ for (deUint32 i = 0; i < 2; ++i)
+ {
+ deBool query64Bits = (i == 1);
+ std::string prefix = bitPrefix(query64Bits);
- primaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST)));
- secondaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST)));
- secondaryInheritedHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST)));
+ primary->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
+ secondary->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
+ secondaryInherited->addChild(new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
- primaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY)));
- secondaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY)));
- secondaryInheritedResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY)));
+ primaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST, query64Bits), sixRepeats));
+ secondaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST, query64Bits), sixRepeats));
+ secondaryInheritedHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST, query64Bits), sixRepeats));
+
+ primaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ secondaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ secondaryInheritedResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<VertexShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ }
}
fragmentShaderInvocations->addChild(primary.release());
@@ -2754,17 +3044,23 @@
for (int topologyNdx = VK_PRIMITIVE_TOPOLOGY_POINT_LIST; topologyNdx < VK_PRIMITIVE_TOPOLOGY_PATCH_LIST; ++topologyNdx)
{
- primary->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL)));
- secondary->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL)));
- secondaryInherited->addChild(new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryInheritedTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL)));
+ for (deUint32 i = 0; i < 2; ++i)
+ {
+ deBool query64Bits = (i == 1);
+ std::string prefix = bitPrefix(query64Bits);
- primaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST)));
- secondaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST)));
- secondaryInheritedHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryInheritedTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST)));
+ primary->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
+ secondary->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
+ secondaryInherited->addChild(new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
- primaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY)));
- secondaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY)));
- secondaryInheritedResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryInheritedTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY)));
+ primaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST, query64Bits), sixRepeats));
+ secondaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST, query64Bits), sixRepeats));
+ secondaryInheritedHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST, query64Bits), sixRepeats));
+
+ primaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ secondaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ secondaryInheritedResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ }
}
geometryShaderInvocations->addChild(primary.release());
@@ -2796,17 +3092,23 @@
for (int topologyNdx = VK_PRIMITIVE_TOPOLOGY_POINT_LIST; topologyNdx < VK_PRIMITIVE_TOPOLOGY_PATCH_LIST; ++topologyNdx)
{
- primary->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL)));
- secondary->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL)));
- secondaryInherited->addChild(new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryInheritedTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL)));
+ for (deUint32 i = 0; i < 2; ++i)
+ {
+ deBool query64Bits = (i == 1);
+ std::string prefix = bitPrefix(query64Bits);
- primaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST)));
- secondaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST)));
- secondaryInheritedHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryInheritedTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST)));
+ primary->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
+ secondary->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
+ secondaryInherited->addChild(new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
- primaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY)));
- secondaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY)));
- secondaryInheritedResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryInheritedTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY)));
+ primaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST, query64Bits), sixRepeats));
+ secondaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST, query64Bits), sixRepeats));
+ secondaryInheritedHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST, query64Bits), sixRepeats));
+
+ primaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ secondaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ secondaryInheritedResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ }
}
geometryShaderPrimitives->addChild(primary.release());
@@ -2838,17 +3140,23 @@
for (int topologyNdx = VK_PRIMITIVE_TOPOLOGY_POINT_LIST; topologyNdx < VK_PRIMITIVE_TOPOLOGY_PATCH_LIST; ++topologyNdx)
{
- primary->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL)));
- secondary->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL)));
- secondaryInherited->addChild(new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryInheritedTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL)));
+ for (deUint32 i = 0; i < 2; ++i)
+ {
+ deBool query64Bits = (i == 1);
+ std::string prefix = bitPrefix(query64Bits);
- primaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST)));
- secondaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST)));
- secondaryInheritedHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryInheritedTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST)));
+ primary->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
+ secondary->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
+ secondaryInherited->addChild(new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
- primaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY)));
- secondaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY)));
- secondaryInheritedResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryInheritedTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY)));
+ primaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST, query64Bits), sixRepeats));
+ secondaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST, query64Bits), sixRepeats));
+ secondaryInheritedHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST, query64Bits), sixRepeats));
+
+ primaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ secondaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ secondaryInheritedResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ }
}
clippingInvocations->addChild(primary.release());
@@ -2880,17 +3188,23 @@
for (int topologyNdx = VK_PRIMITIVE_TOPOLOGY_POINT_LIST; topologyNdx < VK_PRIMITIVE_TOPOLOGY_PATCH_LIST; ++topologyNdx)
{
- primary->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL)));
- secondary->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL)));
- secondaryInherited->addChild(new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryInheritedTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL)));
+ for (deUint32 i = 0; i < 2; ++i)
+ {
+ deBool query64Bits = (i == 1);
+ std::string prefix = bitPrefix(query64Bits);
- primaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST)));
- secondaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST)));
- secondaryInheritedHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryInheritedTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST)));
+ primary->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
+ secondary->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
+ secondaryInherited->addChild(new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
- primaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY)));
- secondaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY)));
- secondaryInheritedResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryInheritedTestInstance> (m_testCtx, topology_name[topologyNdx].c_str(), "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY)));
+ primaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST, query64Bits), sixRepeats));
+ secondaryHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST, query64Bits), sixRepeats));
+ secondaryInheritedHostQueryReset->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_HOST, query64Bits), sixRepeats));
+
+ primaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ secondaryResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ secondaryInheritedResetBeforeCopy->addChild (new QueryPoolGraphicStatisticsTest<GeometryShaderSecondaryInheritedTestInstance> (m_testCtx, prefix + topology_name[topologyNdx], "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT, (VkPrimitiveTopology)topologyNdx, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ }
}
clippingPrimitives->addChild(primary.release());
@@ -2907,30 +3221,36 @@
}
//VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT
- tesControlPatches->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderTestInstance> (m_testCtx, "tes_control_patches", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_NORMAL)));
- tesControlPatches->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderSecondrayTestInstance> (m_testCtx, "tes_control_patches_secondary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_NORMAL)));
- tesControlPatches->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderSecondrayInheritedTestInstance>(m_testCtx, "tes_control_patches_secondary_inherited", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_NORMAL)));
+ for (deUint32 i = 0; i < 2; ++i)
+ {
+ deBool query64Bits = (i == 1);
+ std::string prefix = bitPrefix(query64Bits);
- tesControlPatchesHostQueryReset->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderTestInstance> (m_testCtx, "tes_control_patches", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_HOST)));
- tesControlPatchesHostQueryReset->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderSecondrayTestInstance> (m_testCtx, "tes_control_patches_secondary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_HOST)));
- tesControlPatchesHostQueryReset->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderSecondrayInheritedTestInstance> (m_testCtx, "tes_control_patches_secondary_inherited", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_HOST)));
+ tesControlPatches->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderTestInstance> (m_testCtx, prefix + "tes_control_patches", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
+ tesControlPatches->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderSecondrayTestInstance> (m_testCtx, prefix + "tes_control_patches_secondary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
+ tesControlPatches->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderSecondrayInheritedTestInstance>(m_testCtx, prefix + "tes_control_patches_secondary_inherited", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
- tesControlPatchesResetBeforeCopy->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderTestInstance> (m_testCtx, "tes_control_patches", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_BEFORE_COPY)));
- tesControlPatchesResetBeforeCopy->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderSecondrayTestInstance> (m_testCtx, "tes_control_patches_secondary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_BEFORE_COPY)));
- tesControlPatchesResetBeforeCopy->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderSecondrayInheritedTestInstance> (m_testCtx, "tes_control_patches_secondary_inherited", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_BEFORE_COPY)));
+ tesControlPatchesHostQueryReset->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderTestInstance> (m_testCtx, prefix + "tes_control_patches", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_HOST, query64Bits), sixRepeats));
+ tesControlPatchesHostQueryReset->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderSecondrayTestInstance> (m_testCtx, prefix + "tes_control_patches_secondary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_HOST, query64Bits), sixRepeats));
+ tesControlPatchesHostQueryReset->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderSecondrayInheritedTestInstance> (m_testCtx, prefix + "tes_control_patches_secondary_inherited", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_HOST, query64Bits), sixRepeats));
- //VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT
- tesEvaluationShaderInvocations->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderTestInstance> (m_testCtx, "tes_evaluation_shader_invocations", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_NORMAL)));
- tesEvaluationShaderInvocations->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderSecondrayTestInstance> (m_testCtx, "tes_evaluation_shader_invocations_secondary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_NORMAL)));
- tesEvaluationShaderInvocations->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderSecondrayInheritedTestInstance>(m_testCtx, "tes_evaluation_shader_invocations_secondary_inherited", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_NORMAL)));
+ tesControlPatchesResetBeforeCopy->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderTestInstance> (m_testCtx, prefix + "tes_control_patches", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ tesControlPatchesResetBeforeCopy->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderSecondrayTestInstance> (m_testCtx, prefix + "tes_control_patches_secondary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ tesControlPatchesResetBeforeCopy->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderSecondrayInheritedTestInstance> (m_testCtx, prefix + "tes_control_patches_secondary_inherited", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
- tesEvaluationShaderInvocationsHostQueryReset->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderTestInstance> (m_testCtx, "tes_evaluation_shader_invocations", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_HOST)));
- tesEvaluationShaderInvocationsHostQueryReset->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderSecondrayTestInstance> (m_testCtx, "tes_evaluation_shader_invocations_secondary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_HOST)));
- tesEvaluationShaderInvocationsHostQueryReset->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderSecondrayInheritedTestInstance> (m_testCtx, "tes_evaluation_shader_invocations_secondary_inherited", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_HOST)));
+ //VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT
+ tesEvaluationShaderInvocations->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderTestInstance> (m_testCtx, prefix + "tes_evaluation_shader_invocations", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
+ tesEvaluationShaderInvocations->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderSecondrayTestInstance> (m_testCtx, prefix + "tes_evaluation_shader_invocations_secondary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
+ tesEvaluationShaderInvocations->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderSecondrayInheritedTestInstance>(m_testCtx, prefix + "tes_evaluation_shader_invocations_secondary_inherited", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_NORMAL, query64Bits), sixRepeats));
- tesEvaluationShaderInvocationsResetBeforeCopy->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderTestInstance> (m_testCtx, "tes_evaluation_shader_invocations", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_BEFORE_COPY)));
- tesEvaluationShaderInvocationsResetBeforeCopy->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderSecondrayTestInstance> (m_testCtx, "tes_evaluation_shader_invocations_secondary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_BEFORE_COPY)));
- tesEvaluationShaderInvocationsResetBeforeCopy->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderSecondrayInheritedTestInstance>(m_testCtx, "tes_evaluation_shader_invocations_secondary_inherited", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_BEFORE_COPY)));
+ tesEvaluationShaderInvocationsHostQueryReset->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderTestInstance> (m_testCtx, prefix + "tes_evaluation_shader_invocations", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_HOST, query64Bits), sixRepeats));
+ tesEvaluationShaderInvocationsHostQueryReset->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderSecondrayTestInstance> (m_testCtx, prefix + "tes_evaluation_shader_invocations_secondary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_HOST, query64Bits), sixRepeats));
+ tesEvaluationShaderInvocationsHostQueryReset->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderSecondrayInheritedTestInstance> (m_testCtx, prefix + "tes_evaluation_shader_invocations_secondary_inherited", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_HOST, query64Bits), sixRepeats));
+
+ tesEvaluationShaderInvocationsResetBeforeCopy->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderTestInstance> (m_testCtx, prefix + "tes_evaluation_shader_invocations", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ tesEvaluationShaderInvocationsResetBeforeCopy->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderSecondrayTestInstance> (m_testCtx, prefix + "tes_evaluation_shader_invocations_secondary", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ tesEvaluationShaderInvocationsResetBeforeCopy->addChild(new QueryPoolGraphicStatisticsTest<TessellationShaderSecondrayInheritedTestInstance>(m_testCtx, prefix + "tes_evaluation_shader_invocations_secondary_inherited", "", GraphicBasicTestInstance::ParametersGraphic(VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, RESET_TYPE_BEFORE_COPY, query64Bits), sixRepeats));
+ }
addChild(computeShaderInvocationsGroup.release());
addChild(inputAssemblyVertices.release());
diff --git a/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolTests.cpp b/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolTests.cpp
index 8bca5c8..4ba8cd2 100644
--- a/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolTests.cpp
+++ b/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolTests.cpp
@@ -27,6 +27,7 @@
#include "vktTestGroupUtil.hpp"
#include "vktQueryPoolOcclusionTests.hpp"
#include "vktQueryPoolStatisticsTests.hpp"
+#include "vktQueryPoolPerformanceTests.hpp"
namespace vkt
{
@@ -42,6 +43,7 @@
queryPoolTests->addChild(new QueryPoolOcclusionTests(testCtx));
queryPoolTests->addChild(new QueryPoolStatisticsTests(testCtx));
+ queryPoolTests->addChild(new QueryPoolPerformanceTests(testCtx));
}
} // anonymous
diff --git a/external/vulkancts/modules/vulkan/rasterization/CMakeLists.txt b/external/vulkancts/modules/vulkan/rasterization/CMakeLists.txt
index dfc6ac6..32a9b3d 100644
--- a/external/vulkancts/modules/vulkan/rasterization/CMakeLists.txt
+++ b/external/vulkancts/modules/vulkan/rasterization/CMakeLists.txt
@@ -14,5 +14,6 @@
libamber
)
+include_directories("../../../../../external/amber/src/include")
add_library(deqp-vk-rasterization STATIC ${DEQP_VK_RASTERIZATION_SRCS})
target_link_libraries(deqp-vk-rasterization ${DEQP_VK_RASTERIZATION_LIBS})
diff --git a/external/vulkancts/modules/vulkan/rasterization/vktRasterizationTests.cpp b/external/vulkancts/modules/vulkan/rasterization/vktRasterizationTests.cpp
index 9670ba7..498e32f 100644
--- a/external/vulkancts/modules/vulkan/rasterization/vktRasterizationTests.cpp
+++ b/external/vulkancts/modules/vulkan/rasterization/vktRasterizationTests.cpp
@@ -106,6 +106,18 @@
PRIMITIVEWIDENESS_LAST
};
+enum LineStipple
+{
+ LINESTIPPLE_DISABLED = 0,
+ LINESTIPPLE_STATIC,
+ LINESTIPPLE_DYNAMIC,
+
+ LINESTIPPLE_LAST
+};
+
+static const deUint32 lineStippleFactor = 2;
+static const deUint32 lineStipplePattern = 0x0F0F;
+
class BaseRenderingTestCase : public TestCase
{
public:
@@ -156,18 +168,22 @@
VkImage image, VkImage resolvedImage, VkFramebuffer frameBuffer, const deUint32 renderSize, VkBuffer resultBuffer, const Allocation& resultBufferMemory);
virtual float getLineWidth (void) const;
virtual float getPointSize (void) const;
+ virtual bool getLineStippleDynamic (void) const { return false; };
virtual
const VkPipelineRasterizationStateCreateInfo* getRasterizationStateCreateInfo (void) const;
virtual
+ VkPipelineRasterizationLineStateCreateInfoEXT getLineRasterizationStateCreateInfo (void) const;
+
+ virtual
const VkPipelineColorBlendStateCreateInfo* getColorBlendStateCreateInfo (void) const;
const tcu::TextureFormat& getTextureFormat (void) const;
const deUint32 m_renderSize;
const VkSampleCountFlagBits m_sampleCount;
- const deUint32 m_subpixelBits;
+ deUint32 m_subpixelBits;
const deBool m_multisampling;
const VkFormat m_imageFormat;
@@ -692,6 +708,29 @@
VK_FALSE // VkBool32 alphaToOneEnable;
};
+
+ VkPipelineRasterizationStateCreateInfo rasterizationStateInfo = *getRasterizationStateCreateInfo();
+
+ VkPipelineRasterizationLineStateCreateInfoEXT lineRasterizationStateInfo = getLineRasterizationStateCreateInfo();
+
+ rasterizationStateInfo.pNext = &lineRasterizationStateInfo;
+
+ VkPipelineDynamicStateCreateInfo dynamicStateCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ 0u, // VkPipelineDynamicStateCreateFlags flags
+ 0u, // deUint32 dynamicStateCount
+ DE_NULL // const VkDynamicState* pDynamicStates
+ };
+
+ VkDynamicState dynamicState = VK_DYNAMIC_STATE_LINE_STIPPLE_EXT;
+ if (getLineStippleDynamic())
+ {
+ dynamicStateCreateInfo.dynamicStateCount = 1;
+ dynamicStateCreateInfo.pDynamicStates = &dynamicState;
+ }
+
graphicsPipeline = makeGraphicsPipeline(vkd, // const DeviceInterface& vk
vkDevice, // const VkDevice device
*m_pipelineLayout, // const VkPipelineLayout pipelineLayout
@@ -707,10 +746,11 @@
0u, // const deUint32 subpass
0u, // const deUint32 patchControlPoints
&vertexInputStateParams, // const VkPipelineVertexInputStateCreateInfo* vertexInputStateCreateInfo
- getRasterizationStateCreateInfo(), // const VkPipelineRasterizationStateCreateInfo* rasterizationStateCreateInfo
+ &rasterizationStateInfo, // const VkPipelineRasterizationStateCreateInfo* rasterizationStateCreateInfo
&multisampleStateParams, // const VkPipelineMultisampleStateCreateInfo* multisampleStateCreateInfo
DE_NULL, // const VkPipelineDepthStencilStateCreateInfo* depthStencilStateCreateInfo,
- getColorBlendStateCreateInfo()); // const VkPipelineColorBlendStateCreateInfo* colorBlendStateCreateInfo
+ getColorBlendStateCreateInfo(), // const VkPipelineColorBlendStateCreateInfo* colorBlendStateCreateInfo,
+ &dynamicStateCreateInfo); // const VkPipelineDynamicStateCreateInfo* dynamicStateCreateInfo
}
// Create Vertex Buffer
@@ -770,6 +810,8 @@
vkd.cmdBindPipeline(*commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *graphicsPipeline);
vkd.cmdBindDescriptorSets(*commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipelineLayout, 0u, 1, &m_descriptorSet.get(), 0u, DE_NULL);
vkd.cmdBindVertexBuffers(*commandBuffer, 0, 1, &vertexBuffer.get(), &vertexBufferOffset);
+ if (getLineStippleDynamic())
+ vkd.cmdSetLineStippleEXT(*commandBuffer, lineStippleFactor, lineStipplePattern);
vkd.cmdDraw(*commandBuffer, (deUint32)positionData.size(), 1, 0, 0);
endRenderPass(vkd, *commandBuffer);
@@ -825,6 +867,21 @@
return &rasterizationStateCreateInfo;
}
+VkPipelineRasterizationLineStateCreateInfoEXT BaseRenderingTestInstance::getLineRasterizationStateCreateInfo (void) const
+{
+ VkPipelineRasterizationLineStateCreateInfoEXT lineRasterizationStateInfo =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT, // VkLineRasterizationModeEXT lineRasterizationMode;
+ VK_FALSE, // VkBool32 stippledLineEnable;
+ 1, // uint32_t lineStippleFactor;
+ 0xFFFF, // uint16_t lineStipplePattern;
+ };
+
+ return lineRasterizationStateInfo;
+}
+
const VkPipelineColorBlendStateCreateInfo* BaseRenderingTestInstance::getColorBlendStateCreateInfo (void) const
{
static const VkPipelineColorBlendAttachmentState colorBlendAttachmentState =
@@ -936,21 +993,36 @@
class BaseLineTestInstance : public BaseRenderingTestInstance
{
public:
- BaseLineTestInstance (Context& context, VkPrimitiveTopology primitiveTopology, PrimitiveWideness wideness, VkSampleCountFlagBits sampleCount, const deUint32 additionalRenderSize = 0);
+ BaseLineTestInstance (Context& context,
+ VkPrimitiveTopology primitiveTopology,
+ PrimitiveWideness wideness,
+ VkSampleCountFlagBits sampleCount,
+ LineStipple stipple,
+ VkLineRasterizationModeEXT lineRasterizationMode,
+ const deUint32 additionalRenderSize = 0);
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) const;
private:
virtual void generateLines (int iteration, std::vector<tcu::Vec4>& outData, std::vector<LineSceneSpec::SceneLine>& outLines) = DE_NULL;
+ bool resultHasAlpha (tcu::Surface& result);
+
int m_iteration;
const int m_iterationCount;
VkPrimitiveTopology m_primitiveTopology;
const PrimitiveWideness m_primitiveWideness;
bool m_allIterationsPassed;
+ bool m_qualityWarning;
float m_maxLineWidth;
std::vector<float> m_lineWidths;
-
+ LineStipple m_stipple;
+ VkLineRasterizationModeEXT m_lineRasterizationMode;
Move<VkImage> m_additionalImage;
de::MovePtr<Allocation> m_additionalImageMemory;
Move<VkImageView> m_additionalImageView;
@@ -962,17 +1034,44 @@
de::MovePtr<Allocation> m_additionalResultBufferMemory;
};
-BaseLineTestInstance::BaseLineTestInstance (Context& context, VkPrimitiveTopology primitiveTopology, PrimitiveWideness wideness, VkSampleCountFlagBits sampleCount, const deUint32 additionalRenderSize)
- : BaseRenderingTestInstance (context, sampleCount, RESOLUTION_POT, VK_FORMAT_R8G8B8A8_UNORM, additionalRenderSize)
+BaseLineTestInstance::BaseLineTestInstance (Context& context,
+ VkPrimitiveTopology primitiveTopology,
+ PrimitiveWideness wideness,
+ VkSampleCountFlagBits sampleCount,
+ LineStipple stipple,
+ VkLineRasterizationModeEXT lineRasterizationMode,
+ const deUint32 additionalRenderSize)
+ : BaseRenderingTestInstance (context, sampleCount, RESOLUTION_POT, VK_FORMAT_R8G8B8A8_UNORM, additionalRenderSize)
, m_iteration (0)
, m_iterationCount (3)
, m_primitiveTopology (primitiveTopology)
, m_primitiveWideness (wideness)
, m_allIterationsPassed (true)
+ , m_qualityWarning (false)
, m_maxLineWidth (1.0f)
+ , m_stipple (stipple)
+ , m_lineRasterizationMode (lineRasterizationMode)
{
DE_ASSERT(m_primitiveWideness < PRIMITIVEWIDENESS_LAST);
+ if (context.isDeviceFunctionalitySupported("VK_EXT_line_rasterization"))
+ {
+ VkPhysicalDeviceLineRasterizationPropertiesEXT lineRasterizationProperties =
+ {
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT, // VkStructureType sType;
+ DE_NULL, // void* pNext;
+ 0u, // deUint32 lineSubPixelPrecisionBits;
+ };
+
+ VkPhysicalDeviceProperties2 deviceProperties2;
+ deviceProperties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
+ deviceProperties2.pNext = &lineRasterizationProperties;
+
+ context.getInstanceInterface().getPhysicalDeviceProperties2(m_context.getPhysicalDevice(), &deviceProperties2);
+
+ m_subpixelBits = lineRasterizationProperties.lineSubPixelPrecisionBits;
+ }
+
// create line widths
if (m_primitiveWideness == PRIMITIVEWIDENESS_NARROW)
{
@@ -1151,6 +1250,22 @@
}
}
+bool BaseLineTestInstance::resultHasAlpha(tcu::Surface& resultImage)
+{
+ bool hasAlpha = false;
+ for (int y = 0; y < resultImage.getHeight() && !hasAlpha; ++y)
+ for (int x = 0; x < resultImage.getWidth(); ++x)
+ {
+ const tcu::RGBA color = resultImage.getPixel(x, y);
+ if (color.getAlpha() > 0 && color.getAlpha() < 0xFF)
+ {
+ hasAlpha = true;
+ break;
+ }
+ }
+ return hasAlpha;
+}
+
tcu::TestStatus BaseLineTestInstance::iterate (void)
{
const std::string iterationDescription = "Test iteration " + de::toString(m_iteration+1) + " / " + de::toString(m_iterationCount);
@@ -1164,6 +1279,13 @@
// supported?
if (lineWidth <= m_maxLineWidth)
{
+ // gen data
+ generateLines(m_iteration, drawBuffer, lines);
+
+ // draw image
+ drawPrimitives(resultImage, drawBuffer, m_primitiveTopology);
+
+ // compare
RasterizationArguments args;
LineSceneSpec scene;
@@ -1175,29 +1297,81 @@
args.greenBits = colorBits[1];
args.blueBits = colorBits[2];
- // gen data
- generateLines(m_iteration, drawBuffer, lines);
-
- // draw image
- drawPrimitives(resultImage, drawBuffer, m_primitiveTopology);
-
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;
- /* Compare, Only apply verification workaround for single sample test cases. */
- if (!verifyRelaxedLineGroupRasterization(resultImage, scene, args, m_context.getTestContext().getLog(), (0 == m_multisampling)))
- m_allIterationsPassed = false;
+ // 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_additionalRenderSize != 0)
+ if (m_lineRasterizationMode == VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT)
{
- const std::vector<tcu::Vec4> colorData(drawBuffer.size(), tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
-
- 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)))
+ // bresenham is "no AA" in GL, so set numSamples to zero.
+ args.numSamples = 0;
+ if (!verifyLineGroupRasterization(resultImage, scene, args, m_context.getTestContext().getLog()))
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)))
+ {
+ // 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()))
+ 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)))
+ {
+ // 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)))
+ 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;
@@ -1205,10 +1379,12 @@
// result
if (++m_iteration == m_iterationCount)
{
- if (m_allIterationsPassed)
- return tcu::TestStatus::pass("Pass");
- else
+ if (!m_allIterationsPassed)
return tcu::TestStatus::fail("Incorrect rasterization");
+ else if (m_qualityWarning)
+ return tcu::TestStatus(QP_TEST_RESULT_QUALITY_WARNING, "Low-quality line rasterization");
+ else
+ return tcu::TestStatus::pass("Pass");
}
else
return tcu::TestStatus::incomplete();
@@ -1220,11 +1396,31 @@
return m_lineWidths[m_iteration];
}
+VkPipelineRasterizationLineStateCreateInfoEXT BaseLineTestInstance::getLineRasterizationStateCreateInfo (void) const
+{
+ VkPipelineRasterizationLineStateCreateInfoEXT lineRasterizationStateInfo =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ m_lineRasterizationMode, // VkLineRasterizationModeEXT lineRasterizationMode;
+ getLineStippleEnable() ? VK_TRUE : VK_FALSE, // VkBool32 stippledLineEnable;
+ 1, // uint32_t lineStippleFactor;
+ 0xFFFF, // uint16_t lineStipplePattern;
+ };
+
+ if (m_stipple == LINESTIPPLE_STATIC)
+ {
+ lineRasterizationStateInfo.lineStippleFactor = lineStippleFactor;
+ lineRasterizationStateInfo.lineStipplePattern = lineStipplePattern;
+ }
+
+ return lineRasterizationStateInfo;
+}
class PointTestInstance : public BaseRenderingTestInstance
{
public:
- PointTestInstance (Context& context, PrimitiveWideness wideness, VkSampleCountFlagBits sampleCount, deUint32 renderSize);
+ PointTestInstance (Context& context, PrimitiveWideness wideness, VkSampleCountFlagBits sampleCount, /*ignored*/LineStipple stipple, /*ignored*/VkLineRasterizationModeEXT lineRasterizationMode, deUint32 renderSize);
virtual tcu::TestStatus iterate (void);
virtual float getPointSize (void) const;
@@ -1239,7 +1435,7 @@
std::vector<float> m_pointSizes;
};
-PointTestInstance::PointTestInstance (Context& context, PrimitiveWideness wideness, VkSampleCountFlagBits sampleCount, deUint32)
+PointTestInstance::PointTestInstance (Context& context, PrimitiveWideness wideness, VkSampleCountFlagBits sampleCount, /*ignored*/LineStipple stipple, /*ignored*/VkLineRasterizationModeEXT lineRasterizationMode, deUint32)
: BaseRenderingTestInstance (context, sampleCount)
, m_iteration (0)
, m_iterationCount (3)
@@ -1247,6 +1443,8 @@
, m_allIterationsPassed (true)
, m_maxPointSize (1.0f)
{
+ (void)stipple;
+ (void)lineRasterizationMode;
// create point sizes
if (m_primitiveWideness == PRIMITIVEWIDENESS_NARROW)
{
@@ -1922,27 +2120,64 @@
class WidenessTestCase : public BaseRenderingTestCase
{
public:
- WidenessTestCase (tcu::TestContext& context, const std::string& name, const std::string& description, PrimitiveWideness wideness, bool isLineTest, VkSampleCountFlagBits sampleCount = VK_SAMPLE_COUNT_1_BIT, deUint32 additionalRenderSize = 0)
+ WidenessTestCase (tcu::TestContext& context, const std::string& name, const std::string& description, PrimitiveWideness wideness, bool isLineTest, VkSampleCountFlagBits sampleCount, LineStipple stipple, VkLineRasterizationModeEXT lineRasterizationMode, deUint32 additionalRenderSize = 0)
: BaseRenderingTestCase(context, name, description, sampleCount)
, m_wideness (wideness)
, m_isLineTest (isLineTest)
+ , m_stipple(stipple)
+ , m_lineRasterizationMode(lineRasterizationMode)
, m_additionalRenderSize (additionalRenderSize)
{}
virtual TestInstance* createInstance (Context& context) const
{
- return new ConcreteTestInstance(context, m_wideness, m_sampleCount, m_additionalRenderSize);
+ return new ConcreteTestInstance(context, m_wideness, m_sampleCount, m_stipple, m_lineRasterizationMode, m_additionalRenderSize);
}
virtual void checkSupport (Context& context) const
{
if (m_isLineTest)
{
- if (!context.getDeviceProperties().limits.strictLines)
- TCU_THROW(NotSupportedError, "Strict rasterization is not supported");
-
if (m_wideness == PRIMITIVEWIDENESS_WIDE)
context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_WIDE_LINES);
+
+ switch (m_lineRasterizationMode)
+ {
+ default:
+ DE_ASSERT(0); // fallthrough
+ case VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT:
+ if (!context.getDeviceProperties().limits.strictLines)
+ TCU_THROW(NotSupportedError, "Strict rasterization is not supported");
+
+ if (getLineStippleEnable() &&
+ !context.getLineRasterizationFeaturesEXT().stippledRectangularLines)
+ TCU_THROW(NotSupportedError, "Stippled rectangular lines not supported");
+ break;
+ case VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT:
+ if (!context.getLineRasterizationFeaturesEXT().rectangularLines)
+ TCU_THROW(NotSupportedError, "Rectangular lines not supported");
+
+ if (getLineStippleEnable() &&
+ !context.getLineRasterizationFeaturesEXT().stippledRectangularLines)
+ TCU_THROW(NotSupportedError, "Stippled rectangular lines not supported");
+ break;
+ case VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT:
+ if (!context.getLineRasterizationFeaturesEXT().bresenhamLines)
+ TCU_THROW(NotSupportedError, "Bresenham lines not supported");
+
+ if (getLineStippleEnable() &&
+ !context.getLineRasterizationFeaturesEXT().stippledBresenhamLines)
+ TCU_THROW(NotSupportedError, "Stippled Bresenham lines not supported");
+ break;
+ case VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT:
+ if (!context.getLineRasterizationFeaturesEXT().smoothLines)
+ TCU_THROW(NotSupportedError, "Smooth lines not supported");
+
+ if (getLineStippleEnable() &&
+ !context.getLineRasterizationFeaturesEXT().stippledSmoothLines)
+ TCU_THROW(NotSupportedError, "Stippled smooth lines not supported");
+ break;
+ }
}
else
{
@@ -1950,17 +2185,23 @@
context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_LARGE_POINTS);
}
}
+
+ bool getLineStippleEnable (void) const { return m_stipple != LINESTIPPLE_DISABLED; }
+ virtual bool getLineStippleDynamic (void) const { return m_stipple == LINESTIPPLE_DYNAMIC; };
+
protected:
const PrimitiveWideness m_wideness;
const bool m_isLineTest;
+ const LineStipple m_stipple;
+ const VkLineRasterizationModeEXT m_lineRasterizationMode;
const deUint32 m_additionalRenderSize;
};
class LinesTestInstance : public BaseLineTestInstance
{
public:
- LinesTestInstance (Context& context, PrimitiveWideness wideness, VkSampleCountFlagBits sampleCount, deUint32 additionalRenderSize = 0)
- : BaseLineTestInstance(context, VK_PRIMITIVE_TOPOLOGY_LINE_LIST, wideness, sampleCount, additionalRenderSize)
+ LinesTestInstance (Context& context, PrimitiveWideness wideness, VkSampleCountFlagBits sampleCount, LineStipple stipple, VkLineRasterizationModeEXT lineRasterizationMode, deUint32 additionalRenderSize = 0)
+ : BaseLineTestInstance(context, VK_PRIMITIVE_TOPOLOGY_LINE_LIST, wideness, sampleCount, stipple, lineRasterizationMode, additionalRenderSize)
{}
virtual void generateLines (int iteration, std::vector<tcu::Vec4>& outData, std::vector<LineSceneSpec::SceneLine>& outLines);
@@ -2033,8 +2274,8 @@
class LineStripTestInstance : public BaseLineTestInstance
{
public:
- LineStripTestInstance (Context& context, PrimitiveWideness wideness, VkSampleCountFlagBits sampleCount, deUint32)
- : BaseLineTestInstance(context, VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, wideness, sampleCount)
+ LineStripTestInstance (Context& context, PrimitiveWideness wideness, VkSampleCountFlagBits sampleCount, LineStipple stipple, VkLineRasterizationModeEXT lineRasterizationMode, deUint32)
+ : BaseLineTestInstance(context, VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, wideness, sampleCount, stipple, lineRasterizationMode)
{}
virtual void generateLines (int iteration, std::vector<tcu::Vec4>& outData, std::vector<LineSceneSpec::SceneLine>& outLines);
@@ -2063,7 +2304,7 @@
case 2:
outData[0] = tcu::Vec4( -0.9f, -0.3f, 0.0f, 1.0f);
- outData[1] = tcu::Vec4( 1.1f, -0.9f, 0.0f, 1.0f);
+ outData[1] = tcu::Vec4( 0.9f, -0.9f, 0.0f, 1.0f);
outData[2] = tcu::Vec4( 0.7f, -0.1f, 0.0f, 1.0f);
outData[3] = tcu::Vec4( 0.11f, 0.2f, 0.0f, 1.0f);
break;
@@ -3665,14 +3906,45 @@
rasterizationTests->addChild(primitives);
- primitives->addChild(new BaseTestCase<TrianglesTestInstance> (testCtx, "triangles", "Render primitives as VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, verify rasterization result"));
- primitives->addChild(new BaseTestCase<TriangleStripTestInstance> (testCtx, "triangle_strip", "Render primitives as VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, verify rasterization result"));
- primitives->addChild(new BaseTestCase<TriangleFanTestInstance> (testCtx, "triangle_fan", "Render primitives as VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN, verify rasterization result"));
- primitives->addChild(new WidenessTestCase<LinesTestInstance> (testCtx, "lines", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result", PRIMITIVEWIDENESS_NARROW, true, VK_SAMPLE_COUNT_1_BIT, RESOLUTION_NPOT));
- primitives->addChild(new WidenessTestCase<LineStripTestInstance> (testCtx, "line_strip", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result", PRIMITIVEWIDENESS_NARROW, true));
- primitives->addChild(new WidenessTestCase<LinesTestInstance> (testCtx, "lines_wide", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result", PRIMITIVEWIDENESS_WIDE, true));
- primitives->addChild(new WidenessTestCase<LineStripTestInstance> (testCtx, "line_strip_wide", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result", PRIMITIVEWIDENESS_WIDE, true));
- primitives->addChild(new WidenessTestCase<PointTestInstance> (testCtx, "points", "Render primitives as VK_PRIMITIVE_TOPOLOGY_POINT_LIST, verify rasterization result", PRIMITIVEWIDENESS_WIDE, false));
+ tcu::TestCaseGroup* const nostippleTests = new tcu::TestCaseGroup(testCtx, "no_stipple", "No stipple");
+ tcu::TestCaseGroup* const stippleStaticTests = new tcu::TestCaseGroup(testCtx, "static_stipple", "Line stipple static");
+ tcu::TestCaseGroup* const stippleDynamicTests = new tcu::TestCaseGroup(testCtx, "dynamic_stipple", "Line stipple dynamic");
+
+ primitives->addChild(nostippleTests);
+ primitives->addChild(stippleStaticTests);
+ primitives->addChild(stippleDynamicTests);
+
+ nostippleTests->addChild(new BaseTestCase<TrianglesTestInstance> (testCtx, "triangles", "Render primitives as VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, verify rasterization result"));
+ nostippleTests->addChild(new BaseTestCase<TriangleStripTestInstance> (testCtx, "triangle_strip", "Render primitives as VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, verify rasterization result"));
+ nostippleTests->addChild(new BaseTestCase<TriangleFanTestInstance> (testCtx, "triangle_fan", "Render primitives as VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN, verify rasterization result"));
+ nostippleTests->addChild(new WidenessTestCase<PointTestInstance> (testCtx, "points", "Render primitives as VK_PRIMITIVE_TOPOLOGY_POINT_LIST, verify rasterization result", PRIMITIVEWIDENESS_WIDE, false, VK_SAMPLE_COUNT_1_BIT, LINESTIPPLE_DISABLED, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT));
+
+ for (int i = 0; i < 3; ++i) {
+
+ tcu::TestCaseGroup *g = i == 2 ? stippleDynamicTests : i == 1 ? stippleStaticTests : nostippleTests;
+
+ LineStipple stipple = (LineStipple)i;
+
+ g->addChild(new WidenessTestCase<LinesTestInstance> (testCtx, "lines", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result", PRIMITIVEWIDENESS_NARROW, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT, i == 0 ? RESOLUTION_NPOT : 0));
+ g->addChild(new WidenessTestCase<LineStripTestInstance> (testCtx, "line_strip", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result", PRIMITIVEWIDENESS_NARROW, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT));
+ g->addChild(new WidenessTestCase<LinesTestInstance> (testCtx, "lines_wide", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result", PRIMITIVEWIDENESS_WIDE, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT));
+ g->addChild(new WidenessTestCase<LineStripTestInstance> (testCtx, "line_strip_wide", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result", PRIMITIVEWIDENESS_WIDE, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT));
+
+ g->addChild(new WidenessTestCase<LinesTestInstance> (testCtx, "rectangular_lines", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result", PRIMITIVEWIDENESS_NARROW, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT));
+ g->addChild(new WidenessTestCase<LineStripTestInstance> (testCtx, "rectangular_line_strip", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result", PRIMITIVEWIDENESS_NARROW, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT));
+ g->addChild(new WidenessTestCase<LinesTestInstance> (testCtx, "rectangular_lines_wide", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result", PRIMITIVEWIDENESS_WIDE, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT));
+ g->addChild(new WidenessTestCase<LineStripTestInstance> (testCtx, "rectangular_line_strip_wide","Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result", PRIMITIVEWIDENESS_WIDE, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT));
+
+ g->addChild(new WidenessTestCase<LinesTestInstance> (testCtx, "bresenham_lines", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result", PRIMITIVEWIDENESS_NARROW, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
+ g->addChild(new WidenessTestCase<LineStripTestInstance> (testCtx, "bresenham_line_strip", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result", PRIMITIVEWIDENESS_NARROW, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
+ g->addChild(new WidenessTestCase<LinesTestInstance> (testCtx, "bresenham_lines_wide", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result", PRIMITIVEWIDENESS_WIDE, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
+ g->addChild(new WidenessTestCase<LineStripTestInstance> (testCtx, "bresenham_line_strip_wide", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result", PRIMITIVEWIDENESS_WIDE, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
+
+ g->addChild(new WidenessTestCase<LinesTestInstance> (testCtx, "smooth_lines", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result", PRIMITIVEWIDENESS_NARROW, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT));
+ g->addChild(new WidenessTestCase<LineStripTestInstance> (testCtx, "smooth_line_strip", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result", PRIMITIVEWIDENESS_NARROW, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT));
+ g->addChild(new WidenessTestCase<LinesTestInstance> (testCtx, "smooth_lines_wide", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result", PRIMITIVEWIDENESS_WIDE, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT));
+ g->addChild(new WidenessTestCase<LineStripTestInstance> (testCtx, "smooth_line_strip_wide", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result", PRIMITIVEWIDENESS_WIDE, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT));
+ }
}
// .primitive_size
@@ -3905,10 +4177,43 @@
rasterizationTests->addChild(primitives);
- primitives->addChild(new BaseTestCase<TrianglesTestInstance> (testCtx, "triangles", "Render primitives as VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, verify rasterization result", samples[samplesNdx]));
- primitives->addChild(new WidenessTestCase<LinesTestInstance> (testCtx, "lines", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result", PRIMITIVEWIDENESS_NARROW, true, samples[samplesNdx], RESOLUTION_NPOT));
- primitives->addChild(new WidenessTestCase<LinesTestInstance> (testCtx, "lines_wide", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result", PRIMITIVEWIDENESS_WIDE, true, samples[samplesNdx]));
- primitives->addChild(new WidenessTestCase<PointTestInstance> (testCtx, "points", "Render primitives as VK_PRIMITIVE_TOPOLOGY_POINT_LIST, verify rasterization result", PRIMITIVEWIDENESS_WIDE, false, samples[samplesNdx]));
+ tcu::TestCaseGroup* const nostippleTests = new tcu::TestCaseGroup(testCtx, "no_stipple", "No stipple");
+ tcu::TestCaseGroup* const stippleStaticTests = new tcu::TestCaseGroup(testCtx, "static_stipple", "Line stipple static");
+ tcu::TestCaseGroup* const stippleDynamicTests = new tcu::TestCaseGroup(testCtx, "dynamic_stipple", "Line stipple dynamic");
+
+ primitives->addChild(nostippleTests);
+ primitives->addChild(stippleStaticTests);
+ primitives->addChild(stippleDynamicTests);
+
+ nostippleTests->addChild(new BaseTestCase<TrianglesTestInstance> (testCtx, "triangles", "Render primitives as VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, verify rasterization result", samples[samplesNdx]));
+ nostippleTests->addChild(new WidenessTestCase<PointTestInstance> (testCtx, "points", "Render primitives as VK_PRIMITIVE_TOPOLOGY_POINT_LIST, verify rasterization result", PRIMITIVEWIDENESS_WIDE, false, samples[samplesNdx], LINESTIPPLE_DISABLED, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT));
+
+ for (int i = 0; i < 3; ++i) {
+
+ tcu::TestCaseGroup *g = i == 2 ? stippleDynamicTests : i == 1 ? stippleStaticTests : nostippleTests;
+
+ LineStipple stipple = (LineStipple)i;
+
+ g->addChild(new WidenessTestCase<LinesTestInstance> (testCtx, "lines", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result", PRIMITIVEWIDENESS_NARROW, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT, i == 0 ? RESOLUTION_NPOT : 0));
+ g->addChild(new WidenessTestCase<LineStripTestInstance> (testCtx, "line_strip", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result", PRIMITIVEWIDENESS_NARROW, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT));
+ g->addChild(new WidenessTestCase<LinesTestInstance> (testCtx, "lines_wide", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result", PRIMITIVEWIDENESS_WIDE, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT));
+ g->addChild(new WidenessTestCase<LineStripTestInstance> (testCtx, "line_strip_wide", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result", PRIMITIVEWIDENESS_WIDE, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT));
+
+ g->addChild(new WidenessTestCase<LinesTestInstance> (testCtx, "rectangular_lines", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result", PRIMITIVEWIDENESS_NARROW, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT));
+ g->addChild(new WidenessTestCase<LineStripTestInstance> (testCtx, "rectangular_line_strip", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result", PRIMITIVEWIDENESS_NARROW, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT));
+ g->addChild(new WidenessTestCase<LinesTestInstance> (testCtx, "rectangular_lines_wide", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result", PRIMITIVEWIDENESS_WIDE, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT));
+ g->addChild(new WidenessTestCase<LineStripTestInstance> (testCtx, "rectangular_line_strip_wide","Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result", PRIMITIVEWIDENESS_WIDE, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT));
+
+ g->addChild(new WidenessTestCase<LinesTestInstance> (testCtx, "bresenham_lines", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result", PRIMITIVEWIDENESS_NARROW, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
+ g->addChild(new WidenessTestCase<LineStripTestInstance> (testCtx, "bresenham_line_strip", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result", PRIMITIVEWIDENESS_NARROW, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
+ g->addChild(new WidenessTestCase<LinesTestInstance> (testCtx, "bresenham_lines_wide", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result", PRIMITIVEWIDENESS_WIDE, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
+ g->addChild(new WidenessTestCase<LineStripTestInstance> (testCtx, "bresenham_line_strip_wide", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result", PRIMITIVEWIDENESS_WIDE, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
+
+ g->addChild(new WidenessTestCase<LinesTestInstance> (testCtx, "smooth_lines", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result", PRIMITIVEWIDENESS_NARROW, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT));
+ g->addChild(new WidenessTestCase<LineStripTestInstance> (testCtx, "smooth_line_strip", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result", PRIMITIVEWIDENESS_NARROW, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT));
+ g->addChild(new WidenessTestCase<LinesTestInstance> (testCtx, "smooth_lines_wide", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result", PRIMITIVEWIDENESS_WIDE, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT));
+ g->addChild(new WidenessTestCase<LineStripTestInstance> (testCtx, "smooth_line_strip_wide", "Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result", PRIMITIVEWIDENESS_WIDE, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT));
+ }
}
// .fill_rules
diff --git a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassDepthStencilResolveTests.cpp b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassDepthStencilResolveTests.cpp
index 03ea711..3781700 100644
--- a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassDepthStencilResolveTests.cpp
+++ b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassDepthStencilResolveTests.cpp
@@ -100,12 +100,13 @@
VkRect2D renderArea;
VkImageAspectFlags aspectFlag;
deUint32 sampleCount;
- VkResolveModeFlagBitsKHR depthResolveMode;
- VkResolveModeFlagBitsKHR stencilResolveMode;
+ VkResolveModeFlagBits depthResolveMode;
+ VkResolveModeFlagBits stencilResolveMode;
VerifyBuffer verifyBuffer;
VkClearDepthStencilValue clearValue;
float depthExpectedValue;
deUint8 stencilExpectedValue;
+ bool separateDepthStencilLayouts;
};
float get16bitDepthComponent(deUint8* pixelPtr)
@@ -217,13 +218,16 @@
bool DepthStencilResolveTest::isFeaturesSupported()
{
- m_context.requireDeviceExtension("VK_KHR_depth_stencil_resolve");
+ m_context.requireDeviceFunctionality("VK_KHR_depth_stencil_resolve");
if (m_config.imageLayers > 1)
m_context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_GEOMETRY_SHADER);
- VkPhysicalDeviceDepthStencilResolvePropertiesKHR dsResolveProperties;
- deMemset(&dsResolveProperties, 0, sizeof(VkPhysicalDeviceDepthStencilResolvePropertiesKHR));
- dsResolveProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR;
+ if (m_config.separateDepthStencilLayouts)
+ m_context.requireDeviceFunctionality("VK_KHR_separate_depth_stencil_layouts");
+
+ VkPhysicalDeviceDepthStencilResolveProperties dsResolveProperties;
+ deMemset(&dsResolveProperties, 0, sizeof(VkPhysicalDeviceDepthStencilResolveProperties));
+ dsResolveProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES;
dsResolveProperties.pNext = DE_NULL;
VkPhysicalDeviceProperties2 deviceProperties;
@@ -236,23 +240,23 @@
instanceInterface.getPhysicalDeviceProperties2(physicalDevice, &deviceProperties);
// check if both modes are supported
- VkResolveModeFlagBitsKHR depthResolveMode = m_config.depthResolveMode;
- VkResolveModeFlagBitsKHR stencilResolveMode = m_config.stencilResolveMode;
- if ((depthResolveMode != VK_RESOLVE_MODE_NONE_KHR) &&
+ VkResolveModeFlagBits depthResolveMode = m_config.depthResolveMode;
+ VkResolveModeFlagBits stencilResolveMode = m_config.stencilResolveMode;
+ if ((depthResolveMode != VK_RESOLVE_MODE_NONE) &&
!(depthResolveMode & dsResolveProperties.supportedDepthResolveModes))
TCU_THROW(NotSupportedError, "Depth resolve mode not supported");
- if ((stencilResolveMode != VK_RESOLVE_MODE_NONE_KHR) &&
+ if ((stencilResolveMode != VK_RESOLVE_MODE_NONE) &&
!(stencilResolveMode & dsResolveProperties.supportedStencilResolveModes))
TCU_THROW(NotSupportedError, "Stencil resolve mode not supported");
// check if the implementation supports setting the depth and stencil resolve
- // modes to different values when one of those modes is VK_RESOLVE_MODE_NONE_KHR
+ // modes to different values when one of those modes is VK_RESOLVE_MODE_NONE
if (dsResolveProperties.independentResolveNone)
{
if ((!dsResolveProperties.independentResolve) &&
(depthResolveMode != stencilResolveMode) &&
- (depthResolveMode != VK_RESOLVE_MODE_NONE_KHR) &&
- (stencilResolveMode != VK_RESOLVE_MODE_NONE_KHR))
+ (depthResolveMode != VK_RESOLVE_MODE_NONE) &&
+ (stencilResolveMode != VK_RESOLVE_MODE_NONE))
TCU_THROW(NotSupportedError, "Implementation doesn't support diferent resolve modes");
}
else if (!dsResolveProperties.independentResolve && (depthResolveMode != stencilResolveMode))
@@ -382,10 +386,48 @@
{
const VkSampleCountFlagBits samples(sampleCountBitFromSampleCount(m_config.sampleCount));
- const AttachmentDescription2 multisampleAttachment // VkAttachmentDescription2KHR
+ VkImageLayout layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+ VkAttachmentReferenceStencilLayoutKHR stencilLayout =
+ {
+ VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT_KHR,
+ DE_NULL,
+ VK_IMAGE_LAYOUT_UNDEFINED,
+ };
+ void * attachmentRefStencil = DE_NULL;
+ VkImageLayout finalLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
+ VkAttachmentDescriptionStencilLayoutKHR stencilFinalLayout =
+ {
+ VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT_KHR,
+ DE_NULL,
+ VK_IMAGE_LAYOUT_UNDEFINED,
+ VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+ };
+ void * attachmentDescriptionStencil = DE_NULL;
+
+ if (m_config.separateDepthStencilLayouts)
+ {
+ if (m_config.verifyBuffer == VB_DEPTH)
+ {
+ layout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR;
+ stencilLayout.stencilLayout = VK_IMAGE_LAYOUT_GENERAL;
+ finalLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
+ stencilFinalLayout.stencilFinalLayout = VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR; // This aspect should be unused.
+ }
+ else
+ {
+ layout = VK_IMAGE_LAYOUT_GENERAL;
+ stencilLayout.stencilLayout = VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR;
+ finalLayout = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR; // This aspect should be unused.
+ stencilFinalLayout.stencilFinalLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
+ }
+ attachmentRefStencil = &stencilLayout;
+ attachmentDescriptionStencil = &stencilFinalLayout;
+ }
+
+ const AttachmentDescription2 multisampleAttachment // VkAttachmentDescription2
(
// VkStructureType sType;
- DE_NULL, // const void* pNext;
+ attachmentDescriptionStencil, // const void* pNext;
0u, // VkAttachmentDescriptionFlags flags;
m_config.format, // VkFormat format;
samples, // VkSampleCountFlagBits samples;
@@ -394,21 +436,21 @@
VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp stencilLoadOp;
VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp;
VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL // VkImageLayout finalLayout;
+ finalLayout // VkImageLayout finalLayout;
);
- const AttachmentReference2 multisampleAttachmentRef // VkAttachmentReference2KHR
+ const AttachmentReference2 multisampleAttachmentRef // VkAttachmentReference2
(
// VkStructureType sType;
- DE_NULL, // const void* pNext;
+ attachmentRefStencil, // const void* pNext;
0u, // deUint32 attachment;
- VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout layout;
+ layout, // VkImageLayout layout;
0u // VkImageAspectFlags aspectMask;
);
- const AttachmentDescription2 singlesampleAttachment // VkAttachmentDescription2KHR
+ const AttachmentDescription2 singlesampleAttachment // VkAttachmentDescription2
(
// VkStructureType sType;
- DE_NULL, // const void* pNext;
+ attachmentDescriptionStencil, // const void* pNext;
0u, // VkAttachmentDescriptionFlags flags;
m_config.format, // VkFormat format;
VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
@@ -417,14 +459,14 @@
VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp stencilLoadOp;
VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp stencilStoreOp;
VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL // VkImageLayout finalLayout;
+ finalLayout // VkImageLayout finalLayout;
);
- AttachmentReference2 singlesampleAttachmentRef // VkAttachmentReference2KHR
+ AttachmentReference2 singlesampleAttachmentRef // VkAttachmentReference2
(
// VkStructureType sType;
DE_NULL, // const void* pNext;
1u, // deUint32 attachment;
- VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout layout;
+ layout, // VkImageLayout layout;
0u // VkImageAspectFlags aspectMask;
);
@@ -432,16 +474,16 @@
attachments.push_back(multisampleAttachment);
attachments.push_back(singlesampleAttachment);
- VkSubpassDescriptionDepthStencilResolveKHR dsResolveDescription =
+ VkSubpassDescriptionDepthStencilResolve dsResolveDescription =
{
- VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE_KHR,
+ VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE,
DE_NULL, // const void* pNext;
- m_config.depthResolveMode, // VkResolveModeFlagBitsKHR depthResolveMode;
- m_config.stencilResolveMode, // VkResolveModeFlagBitsKHR stencilResolveMode;
- &singlesampleAttachmentRef // VkAttachmentReference2KHR pDepthStencilResolveAttachment;
+ m_config.depthResolveMode, // VkResolveModeFlagBits depthResolveMode;
+ m_config.stencilResolveMode, // VkResolveModeFlagBits stencilResolveMode;
+ &singlesampleAttachmentRef // VkAttachmentReference2 pDepthStencilResolveAttachment;
};
- const SubpassDescription2 subpass // VkSubpassDescription2KHR
+ const SubpassDescription2 subpass // VkSubpassDescription2
(
// VkStructureType sType;
&dsResolveDescription, // const void* pNext;
@@ -449,26 +491,26 @@
VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint;
0u, // deUint32 viewMask;
0u, // deUint32 inputAttachmentCount;
- DE_NULL, // const VkAttachmentReference2KHR* pInputAttachments;
+ DE_NULL, // const VkAttachmentReference2* pInputAttachments;
0u, // deUint32 colorAttachmentCount;
- DE_NULL, // const VkAttachmentReference2KHR* pColorAttachments;
- DE_NULL, // const VkAttachmentReference2KHR* pResolveAttachments;
- &multisampleAttachmentRef, // const VkAttachmentReference2KHR* pDepthStencilAttachment;
+ DE_NULL, // const VkAttachmentReference2* pColorAttachments;
+ DE_NULL, // const VkAttachmentReference2* pResolveAttachments;
+ &multisampleAttachmentRef, // const VkAttachmentReference2* pDepthStencilAttachment;
0u, // deUint32 preserveAttachmentCount;
DE_NULL // const deUint32* pPreserveAttachments;
);
- const RenderPassCreateInfo2 renderPassCreator // VkRenderPassCreateInfo2KHR
+ const RenderPassCreateInfo2 renderPassCreator // VkRenderPassCreateInfo2
(
// VkStructureType sType;
DE_NULL, // const void* pNext;
(VkRenderPassCreateFlags)0u, // VkRenderPassCreateFlags flags;
(deUint32)attachments.size(), // deUint32 attachmentCount;
- &attachments[0], // const VkAttachmentDescription2KHR* pAttachments;
+ &attachments[0], // const VkAttachmentDescription2* pAttachments;
1u, // deUint32 subpassCount;
- &subpass, // const VkSubpassDescription2KHR* pSubpasses;
+ &subpass, // const VkSubpassDescription2* pSubpasses;
0u, // deUint32 dependencyCount;
- DE_NULL, // const VkSubpassDependency2KHR* pDependencies;
+ DE_NULL, // const VkSubpassDependency2* pDependencies;
0u, // deUint32 correlatedViewMaskCount;
DE_NULL // const deUint32* pCorrelatedViewMasks;
);
@@ -743,7 +785,7 @@
**m_singlesampleImage,
{
- m_config.aspectFlag,
+ (m_config.separateDepthStencilLayouts) ? VkImageAspectFlags(testingDepth ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_STENCIL_BIT) : m_config.aspectFlag,
0u,
1u,
0u,
@@ -761,7 +803,7 @@
0u,
0u,
{
- testingDepth ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_STENCIL_BIT,
+ VkImageAspectFlags(testingDepth ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_STENCIL_BIT),
0u,
0u,
m_config.viewLayers,
@@ -800,6 +842,9 @@
bool DepthStencilResolveTest::verifyDepth (void)
{
+ // Invalidate allocation before attempting to read buffer memory.
+ invalidateAlloc(m_context.getDeviceInterface(), m_context.getDevice(), *m_bufferMemory);
+
deUint32 layerSize = m_config.width * m_config.height;
deUint32 valuesCount = layerSize * m_config.viewLayers;
deUint8* pixelPtr = static_cast<deUint8*>(m_bufferMemory->getHostPtr());
@@ -808,7 +853,7 @@
invalidateMappedMemoryRange(vkd, m_context.getDevice(), m_bufferMemory->getMemory(), m_bufferMemory->getOffset(), VK_WHOLE_SIZE);
float expectedValue = m_config.depthExpectedValue;
- if (m_config.depthResolveMode == VK_RESOLVE_MODE_NONE_KHR)
+ if (m_config.depthResolveMode == VK_RESOLVE_MODE_NONE)
expectedValue = m_config.clearValue.depth;
// depth data in buffer is tightly packed, ConstPixelBufferAccess
@@ -884,6 +929,9 @@
bool DepthStencilResolveTest::verifyStencil (void)
{
+ // Invalidate allocation before attempting to read buffer memory.
+ invalidateAlloc(m_context.getDeviceInterface(), m_context.getDevice(), *m_bufferMemory);
+
deUint32 layerSize = m_config.width * m_config.height;
deUint32 valuesCount = layerSize * m_config.viewLayers;
deUint8* pixelPtr = static_cast<deUint8*>(m_bufferMemory->getHostPtr());
@@ -895,7 +943,7 @@
// because of that depth and stencil need to be tested separately
deUint8 expectedValue = m_config.stencilExpectedValue;
- if (m_config.stencilResolveMode == VK_RESOLVE_MODE_NONE_KHR)
+ if (m_config.stencilResolveMode == VK_RESOLVE_MODE_NONE)
expectedValue = static_cast<deUint8>(m_config.clearValue.stencil);
for (deUint32 valueIndex = 0; valueIndex < valuesCount; valueIndex++)
@@ -1066,16 +1114,16 @@
struct ResolveModeData
{
- VkResolveModeFlagBitsKHR flag;
- std::string name;
+ VkResolveModeFlagBits flag;
+ std::string name;
};
ResolveModeData resolveModes[] =
{
- { VK_RESOLVE_MODE_NONE_KHR, "none" },
- { VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR, "zero" },
- { VK_RESOLVE_MODE_AVERAGE_BIT_KHR, "average" },
- { VK_RESOLVE_MODE_MIN_BIT_KHR, "min" },
- { VK_RESOLVE_MODE_MAX_BIT_KHR, "max" },
+ { VK_RESOLVE_MODE_NONE, "none" },
+ { VK_RESOLVE_MODE_SAMPLE_ZERO_BIT, "zero" },
+ { VK_RESOLVE_MODE_AVERAGE_BIT, "average" },
+ { VK_RESOLVE_MODE_MIN_BIT, "min" },
+ { VK_RESOLVE_MODE_MAX_BIT, "max" },
};
struct ImageTestData
@@ -1147,104 +1195,112 @@
// iterate over depth/stencil formats
for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(formats); formatNdx++)
{
- const FormatData& formatData = formats[formatNdx];
- VkFormat format = formatData.format;
- const char* formatName = formatData.name;
- const bool hasDepth = formatData.hasDepth;
- const bool hasStencil = formatData.hasStencil;
- VkImageAspectFlags aspectFlags = (hasDepth * VK_IMAGE_ASPECT_DEPTH_BIT) |
- (hasStencil * VK_IMAGE_ASPECT_STENCIL_BIT);
+ const FormatData& formatData = formats[formatNdx];
+ VkFormat format = formatData.format;
+ const char* formatName = formatData.name;
+ const bool hasDepth = formatData.hasDepth;
+ const bool hasStencil = formatData.hasStencil;
+ VkImageAspectFlags aspectFlags = (hasDepth * VK_IMAGE_ASPECT_DEPTH_BIT) |
+ (hasStencil * VK_IMAGE_ASPECT_STENCIL_BIT);
+ const int separateLayoutsLoopCount = (hasDepth && hasStencil) ? 2 : 1;
- // create test group for format
- de::MovePtr<tcu::TestCaseGroup> formatGroup(new tcu::TestCaseGroup(testCtx, formatName, formatName));
-
- // iterate over depth resolve modes
- for (size_t depthResolveModeNdx = 0; depthResolveModeNdx < DE_LENGTH_OF_ARRAY(resolveModes); depthResolveModeNdx++)
+ for (int separateDepthStencilLayouts = 0; separateDepthStencilLayouts < separateLayoutsLoopCount; ++separateDepthStencilLayouts)
{
- // iterate over stencil resolve modes
- for (size_t stencilResolveModeNdx = 0; stencilResolveModeNdx < DE_LENGTH_OF_ARRAY(resolveModes); stencilResolveModeNdx++)
+ const bool useSeparateDepthStencilLayouts = bool(separateDepthStencilLayouts);
+ const std::string groupName = std::string(formatName) + ((useSeparateDepthStencilLayouts) ? "_separate_layouts" : "");
+
+ // create test group for format
+ de::MovePtr<tcu::TestCaseGroup> formatGroup(new tcu::TestCaseGroup(testCtx, groupName.c_str(), groupName.c_str()));
+
+ // iterate over depth resolve modes
+ for (size_t depthResolveModeNdx = 0; depthResolveModeNdx < DE_LENGTH_OF_ARRAY(resolveModes); depthResolveModeNdx++)
{
- // there is no average resolve mode for stencil - go to next iteration
- ResolveModeData& sResolve = resolveModes[stencilResolveModeNdx];
- if (sResolve.flag == VK_RESOLVE_MODE_AVERAGE_BIT_KHR)
- continue;
-
- // if pDepthStencilResolveAttachment is not NULL and does not have the value VK_ATTACHMENT_UNUSED,
- // depthResolveMode and stencilResolveMode must not both be VK_RESOLVE_MODE_NONE_KHR
- ResolveModeData& dResolve = resolveModes[depthResolveModeNdx];
- if ((dResolve.flag == VK_RESOLVE_MODE_NONE_KHR) && (sResolve.flag == VK_RESOLVE_MODE_NONE_KHR))
- continue;
-
- // If there is no depth, the depth resolve mode should be NONE, or
- // match the stencil resolve mode.
- if (!hasDepth && (dResolve.flag != VK_RESOLVE_MODE_NONE_KHR) &&
- (dResolve.flag != sResolve.flag))
- continue;
-
- // If there is no stencil, the stencil resmove mode should be NONE, or
- // match the depth resolve mode.
- if (!hasStencil && (sResolve.flag != VK_RESOLVE_MODE_NONE_KHR) &&
- (dResolve.flag != sResolve.flag))
- continue;
-
- std::string baseName = "depth_" + dResolve.name + "_stencil_" + sResolve.name;
-
- if (hasDepth)
+ // iterate over stencil resolve modes
+ for (size_t stencilResolveModeNdx = 0; stencilResolveModeNdx < DE_LENGTH_OF_ARRAY(resolveModes); stencilResolveModeNdx++)
{
- std::string name = baseName + "_testing_depth";
- const char* testName = name.c_str();
- float expectedValue = depthExpectedValue[depthResolveModeNdx][sampleCountNdx];
+ // there is no average resolve mode for stencil - go to next iteration
+ ResolveModeData& sResolve = resolveModes[stencilResolveModeNdx];
+ if (sResolve.flag == VK_RESOLVE_MODE_AVERAGE_BIT)
+ continue;
- const TestConfig testConfig =
- {
- format,
- imageData.width,
- imageData.height,
- 1u,
- 1u,
- 0u,
- imageData.renderArea,
- aspectFlags,
- sampleCount,
- dResolve.flag,
- sResolve.flag,
- VB_DEPTH,
- imageData.clearValue,
- expectedValue,
- 0u
- };
- formatGroup->addChild(new DSResolveTestInstance(testCtx, tcu::NODETYPE_SELF_VALIDATE, testName, testName, testConfig));
- }
- if (hasStencil)
- {
- std::string name = baseName + "_testing_stencil";
- const char* testName = name.c_str();
- deUint8 expectedValue = stencilExpectedValue[stencilResolveModeNdx][sampleCountNdx];
+ // if pDepthStencilResolveAttachment is not NULL and does not have the value VK_ATTACHMENT_UNUSED,
+ // depthResolveMode and stencilResolveMode must not both be VK_RESOLVE_MODE_NONE_KHR
+ ResolveModeData& dResolve = resolveModes[depthResolveModeNdx];
+ if ((dResolve.flag == VK_RESOLVE_MODE_NONE) && (sResolve.flag == VK_RESOLVE_MODE_NONE))
+ continue;
- const TestConfig testConfig =
+ // If there is no depth, the depth resolve mode should be NONE, or
+ // match the stencil resolve mode.
+ if (!hasDepth && (dResolve.flag != VK_RESOLVE_MODE_NONE) &&
+ (dResolve.flag != sResolve.flag))
+ continue;
+
+ // If there is no stencil, the stencil resmove mode should be NONE, or
+ // match the depth resolve mode.
+ if (!hasStencil && (sResolve.flag != VK_RESOLVE_MODE_NONE) &&
+ (dResolve.flag != sResolve.flag))
+ continue;
+
+ std::string baseName = "depth_" + dResolve.name + "_stencil_" + sResolve.name;
+
+ if (hasDepth)
{
- format,
- imageData.width,
- imageData.height,
- 1u,
- 1u,
- 0u,
- imageData.renderArea,
- aspectFlags,
- sampleCount,
- dResolve.flag,
- sResolve.flag,
- VB_STENCIL,
- imageData.clearValue,
- 0.0f,
- expectedValue
- };
- formatGroup->addChild(new DSResolveTestInstance(testCtx, tcu::NODETYPE_SELF_VALIDATE, testName, testName, testConfig));
+ std::string name = baseName + "_testing_depth";
+ const char* testName = name.c_str();
+ float expectedValue = depthExpectedValue[depthResolveModeNdx][sampleCountNdx];
+
+ const TestConfig testConfig =
+ {
+ format,
+ imageData.width,
+ imageData.height,
+ 1u,
+ 1u,
+ 0u,
+ imageData.renderArea,
+ aspectFlags,
+ sampleCount,
+ dResolve.flag,
+ sResolve.flag,
+ VB_DEPTH,
+ imageData.clearValue,
+ expectedValue,
+ 0u,
+ useSeparateDepthStencilLayouts
+ };
+ formatGroup->addChild(new DSResolveTestInstance(testCtx, tcu::NODETYPE_SELF_VALIDATE, testName, testName, testConfig));
+ }
+ if (hasStencil)
+ {
+ std::string name = baseName + "_testing_stencil";
+ const char* testName = name.c_str();
+ deUint8 expectedValue = stencilExpectedValue[stencilResolveModeNdx][sampleCountNdx];
+
+ const TestConfig testConfig =
+ {
+ format,
+ imageData.width,
+ imageData.height,
+ 1u,
+ 1u,
+ 0u,
+ imageData.renderArea,
+ aspectFlags,
+ sampleCount,
+ dResolve.flag,
+ sResolve.flag,
+ VB_STENCIL,
+ imageData.clearValue,
+ 0.0f,
+ expectedValue,
+ useSeparateDepthStencilLayouts
+ };
+ formatGroup->addChild(new DSResolveTestInstance(testCtx, tcu::NODETYPE_SELF_VALIDATE, testName, testName, testConfig));
+ }
}
}
+ sampleGroup->addChild(formatGroup.release());
}
-
- sampleGroup->addChild(formatGroup.release());
}
imageGroup->addChild(sampleGroup.release());
@@ -1276,78 +1332,87 @@
// iterate over depth/stencil formats
for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(formats); formatNdx++)
{
- const FormatData& formatData = formats[formatNdx];
- VkFormat format = formatData.format;
- const char* formatName = formatData.name;
- const bool hasDepth = formatData.hasDepth;
- const bool hasStencil = formatData.hasStencil;
- VkImageAspectFlags aspectFlags = (hasDepth * VK_IMAGE_ASPECT_DEPTH_BIT) |
- (hasStencil * VK_IMAGE_ASPECT_STENCIL_BIT);
+ const FormatData& formatData = formats[formatNdx];
+ VkFormat format = formatData.format;
+ const char* formatName = formatData.name;
+ const bool hasDepth = formatData.hasDepth;
+ const bool hasStencil = formatData.hasStencil;
+ VkImageAspectFlags aspectFlags = (hasDepth * VK_IMAGE_ASPECT_DEPTH_BIT) |
+ (hasStencil * VK_IMAGE_ASPECT_STENCIL_BIT);
+ const int separateLayoutsLoopCount = (hasDepth && hasStencil) ? 2 : 1;
- // create test group for format
- de::MovePtr<tcu::TestCaseGroup> formatGroup(new tcu::TestCaseGroup(testCtx, formatName, formatName));
-
- for (size_t resolveModeNdx = 0; resolveModeNdx < DE_LENGTH_OF_ARRAY(resolveModes); resolveModeNdx++)
+ for (int separateDepthStencilLayouts = 0; separateDepthStencilLayouts < separateLayoutsLoopCount; ++separateDepthStencilLayouts)
{
- ResolveModeData& mode = resolveModes[resolveModeNdx];
+ const bool useSeparateDepthStencilLayouts = bool(separateDepthStencilLayouts);
+ const std::string groupName = std::string(formatName) + ((useSeparateDepthStencilLayouts) ? "_separate_layouts" : "");
- if (hasDepth)
+ // create test group for format
+ de::MovePtr<tcu::TestCaseGroup> formatGroup(new tcu::TestCaseGroup(testCtx, groupName.c_str(), groupName.c_str()));
+
+ for (size_t resolveModeNdx = 0; resolveModeNdx < DE_LENGTH_OF_ARRAY(resolveModes); resolveModeNdx++)
{
- std::string name = "depth_" + mode.name;
- const char* testName = name.c_str();
- float expectedValue = depthExpectedValue[resolveModeNdx][sampleCountNdx];
- const TestConfig testConfig =
- {
- format,
- layeredTextureTestData.width,
- layeredTextureTestData.height,
- layeredTextureTestData.imageLayers,
- 3u,
- 0u,
- layeredTextureTestData.renderArea,
- aspectFlags,
- sampleCount,
- mode.flag,
- VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR,
- VB_DEPTH,
- layeredTextureTestData.clearValue,
- expectedValue,
- 0u
- };
- formatGroup->addChild(new DSResolveTestInstance(testCtx, tcu::NODETYPE_SELF_VALIDATE, testName, testName, testConfig));
- }
+ ResolveModeData& mode = resolveModes[resolveModeNdx];
- // there is no average resolve mode for stencil - go to next iteration
- if (mode.flag == VK_RESOLVE_MODE_AVERAGE_BIT_KHR)
- continue;
-
- if (hasStencil)
- {
- std::string name = "stencil_" + mode.name;
- const char* testName = name.c_str();
- deUint8 expectedValue = stencilExpectedValue[resolveModeNdx][sampleCountNdx];
- const TestConfig testConfig =
+ if (hasDepth)
{
- format,
- layeredTextureTestData.width,
- layeredTextureTestData.height,
- layeredTextureTestData.imageLayers,
- 3u,
- 0u,
- layeredTextureTestData.renderArea,
- aspectFlags,
- sampleCount,
- VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR,
- mode.flag,
- VB_STENCIL,
- layeredTextureTestData.clearValue,
- 0.0f,
- expectedValue
- };
- formatGroup->addChild(new DSResolveTestInstance(testCtx, tcu::NODETYPE_SELF_VALIDATE, testName, testName, testConfig));
+ std::string name = "depth_" + mode.name;
+ const char* testName = name.c_str();
+ float expectedValue = depthExpectedValue[resolveModeNdx][sampleCountNdx];
+ const TestConfig testConfig =
+ {
+ format,
+ layeredTextureTestData.width,
+ layeredTextureTestData.height,
+ layeredTextureTestData.imageLayers,
+ 3u,
+ 0u,
+ layeredTextureTestData.renderArea,
+ aspectFlags,
+ sampleCount,
+ mode.flag,
+ VK_RESOLVE_MODE_SAMPLE_ZERO_BIT,
+ VB_DEPTH,
+ layeredTextureTestData.clearValue,
+ expectedValue,
+ 0u,
+ useSeparateDepthStencilLayouts
+ };
+ formatGroup->addChild(new DSResolveTestInstance(testCtx, tcu::NODETYPE_SELF_VALIDATE, testName, testName, testConfig));
+ }
+
+ // there is no average resolve mode for stencil - go to next iteration
+ if (mode.flag == VK_RESOLVE_MODE_AVERAGE_BIT)
+ continue;
+
+ if (hasStencil)
+ {
+ std::string name = "stencil_" + mode.name;
+ const char* testName = name.c_str();
+ deUint8 expectedValue = stencilExpectedValue[resolveModeNdx][sampleCountNdx];
+ const TestConfig testConfig =
+ {
+ format,
+ layeredTextureTestData.width,
+ layeredTextureTestData.height,
+ layeredTextureTestData.imageLayers,
+ 3u,
+ 0u,
+ layeredTextureTestData.renderArea,
+ aspectFlags,
+ sampleCount,
+ VK_RESOLVE_MODE_SAMPLE_ZERO_BIT,
+ mode.flag,
+ VB_STENCIL,
+ layeredTextureTestData.clearValue,
+ 0.0f,
+ expectedValue,
+ useSeparateDepthStencilLayouts
+ };
+ formatGroup->addChild(new DSResolveTestInstance(testCtx, tcu::NODETYPE_SELF_VALIDATE, testName, testName, testConfig));
+ }
}
+ sampleGroup->addChild(formatGroup.release());
}
- sampleGroup->addChild(formatGroup.release());
}
imageGroup->addChild(sampleGroup.release());
}
diff --git a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassMultisampleResolveTests.cpp b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassMultisampleResolveTests.cpp
index 504c3be..0d6188a 100644
--- a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassMultisampleResolveTests.cpp
+++ b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassMultisampleResolveTests.cpp
@@ -185,7 +185,7 @@
MultisampleRenderPassTestBase::MultisampleRenderPassTestBase (Context& context, TestConfig config, deUint32 attachmentsCount)
: TestInstance (context)
, m_featuresSupported (featuresSupported(context, config))
- , m_extensionSupported ((config.renderPassType == RENDERPASS_TYPE_RENDERPASS2) && context.requireDeviceExtension("VK_KHR_create_renderpass2"))
+ , m_extensionSupported ((config.renderPassType == RENDERPASS_TYPE_RENDERPASS2) && context.requireDeviceFunctionality("VK_KHR_create_renderpass2"))
, m_renderPassType (config.renderPassType)
, m_format (config.format)
, m_sampleCount (sampleCountBitFromSampleCount(config.sampleCount))
diff --git a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassMultisampleTests.cpp b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassMultisampleTests.cpp
index 3a9ec60..28dd49c 100644
--- a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassMultisampleTests.cpp
+++ b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassMultisampleTests.cpp
@@ -176,9 +176,9 @@
VkImageUsageFlags depthUsage = (separateStencilUsage == TEST_DEPTH) ? usage : (VkImageUsageFlags)VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
VkImageUsageFlags stencilUsage = (separateStencilUsage == TEST_STENCIL) ? usage : (VkImageUsageFlags)VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
- const VkImageStencilUsageCreateInfoEXT stencilUsageInfo =
+ const VkImageStencilUsageCreateInfo stencilUsageInfo =
{
- VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT,
+ VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO,
DE_NULL,
stencilUsage
};
@@ -272,9 +272,9 @@
if (separateStencilUsage)
{
- const VkImageStencilUsageCreateInfoEXT stencilUsageInfo =
+ const VkImageStencilUsageCreateInfo stencilUsageInfo =
{
- VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT, // VkStructureType sType
+ VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO, // VkStructureType sType
DE_NULL, // const void* pNext
stencilUsage // VkImageUsageFlags stencilUsage
};
@@ -1252,12 +1252,12 @@
{
if (renderPassType == RENDERPASS_TYPE_RENDERPASS2)
- context.requireDeviceExtension("VK_KHR_create_renderpass2");
+ context.requireDeviceFunctionality("VK_KHR_create_renderpass2");
if (separateStencilUsage)
{
- context.requireDeviceExtension ("VK_EXT_separate_stencil_usage");
- context.requireInstanceExtension("VK_KHR_get_physical_device_properties2");
+ context.requireDeviceFunctionality ("VK_EXT_separate_stencil_usage");
+ context.requireInstanceFunctionality("VK_KHR_get_physical_device_properties2");
}
return true;
diff --git a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassSampleReadTests.cpp b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassSampleReadTests.cpp
index 0fb447b..a45675e 100644
--- a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassSampleReadTests.cpp
+++ b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassSampleReadTests.cpp
@@ -797,7 +797,7 @@
SampleReadTestInstance::SampleReadTestInstance (Context& context, TestConfig config)
: TestInstance (context)
, m_extensionSupported (context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SAMPLE_RATE_SHADING) &&
- ((config.renderPassType != RENDERPASS_TYPE_RENDERPASS2) || context.requireDeviceExtension("VK_KHR_create_renderpass2")))
+ ((config.renderPassType != RENDERPASS_TYPE_RENDERPASS2) || context.requireDeviceFunctionality("VK_KHR_create_renderpass2")))
, m_renderPassType (config.renderPassType)
, m_sampleCount (config.sampleCount)
, m_width (32u)
diff --git a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassSparseRenderTargetTests.cpp b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassSparseRenderTargetTests.cpp
index 62f9d6a..85e40e2 100644
--- a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassSparseRenderTargetTests.cpp
+++ b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassSparseRenderTargetTests.cpp
@@ -410,7 +410,7 @@
SparseRenderTargetTestInstance::SparseRenderTargetTestInstance (Context& context, TestConfig testConfig)
: TestInstance (context)
- , m_extensionSupported ((testConfig.renderPassType == RENDERPASS_TYPE_RENDERPASS2) && context.requireDeviceExtension("VK_KHR_create_renderpass2"))
+ , m_extensionSupported ((testConfig.renderPassType == RENDERPASS_TYPE_RENDERPASS2) && context.requireDeviceFunctionality("VK_KHR_create_renderpass2"))
, m_renderPassType (testConfig.renderPassType)
, m_width (32u)
, m_height (32u)
diff --git a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassSubpassDependencyTests.cpp b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassSubpassDependencyTests.cpp
index 365ded4..b4c91d2 100644
--- a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassSubpassDependencyTests.cpp
+++ b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassSubpassDependencyTests.cpp
@@ -491,7 +491,7 @@
ExternalDependencyTestInstance::ExternalDependencyTestInstance (Context& context, ExternalTestConfig testConfig)
: TestInstance (context)
- , m_extensionSupported ((testConfig.renderPassType == RENDERPASS_TYPE_RENDERPASS2) && context.requireDeviceExtension("VK_KHR_create_renderpass2"))
+ , m_extensionSupported ((testConfig.renderPassType == RENDERPASS_TYPE_RENDERPASS2) && context.requireDeviceFunctionality("VK_KHR_create_renderpass2"))
, m_renderPassType (testConfig.renderPassType)
, m_width (testConfig.imageSize.x())
, m_height (testConfig.imageSize.y())
@@ -1086,7 +1086,7 @@
SubpassDependencyTestInstance::SubpassDependencyTestInstance (Context& context, SubpassTestConfig testConfig)
: TestInstance (context)
- , m_extensionSupported ((testConfig.renderPassType == RENDERPASS_TYPE_RENDERPASS2) && context.requireDeviceExtension("VK_KHR_create_renderpass2"))
+ , m_extensionSupported ((testConfig.renderPassType == RENDERPASS_TYPE_RENDERPASS2) && context.requireDeviceFunctionality("VK_KHR_create_renderpass2"))
, m_renderPassInfo (testConfig.renderPass)
, m_renderPassType (testConfig.renderPassType)
, m_width (testConfig.imageSize.x())
@@ -1805,7 +1805,7 @@
SubpassSelfDependencyBackwardsTestInstance::SubpassSelfDependencyBackwardsTestInstance (Context& context, SubpassSelfDependencyBackwardsTestConfig testConfig)
: TestInstance (context)
- , m_extensionSupported ((testConfig.renderPassType == RENDERPASS_TYPE_RENDERPASS2) && context.requireDeviceExtension("VK_KHR_create_renderpass2"))
+ , m_extensionSupported ((testConfig.renderPassType == RENDERPASS_TYPE_RENDERPASS2) && context.requireDeviceFunctionality("VK_KHR_create_renderpass2"))
, m_featuresSupported (context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_GEOMETRY_SHADER))
, m_renderPassType (testConfig.renderPassType)
, m_width (testConfig.imageSize.x())
@@ -2264,7 +2264,7 @@
SeparateChannelsTestInstance::SeparateChannelsTestInstance (Context& context, SeparateChannelsTestConfig testConfig)
: TestInstance (context)
- , m_extensionSupported ((testConfig.renderPassType == RENDERPASS_TYPE_RENDERPASS2) && context.requireDeviceExtension("VK_KHR_create_renderpass2"))
+ , m_extensionSupported ((testConfig.renderPassType == RENDERPASS_TYPE_RENDERPASS2) && context.requireDeviceFunctionality("VK_KHR_create_renderpass2"))
, m_renderPassType (testConfig.renderPassType)
, m_width (256u)
, m_height (256u)
diff --git a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassTests.cpp b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassTests.cpp
index ba3b223..abbe78c 100644
--- a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassTests.cpp
+++ b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassTests.cpp
@@ -4519,17 +4519,17 @@
vector<SubpassRenderInfo> subpassRenderInfo;
if (config.renderPassType == RENDERPASS_TYPE_RENDERPASS2)
- context.requireDeviceExtension("VK_KHR_create_renderpass2");
+ context.requireDeviceFunctionality("VK_KHR_create_renderpass2");
if (config.allocationKind == ALLOCATION_KIND_DEDICATED)
{
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_dedicated_allocation"))
+ if (!context.isDeviceFunctionalitySupported("VK_KHR_dedicated_allocation"))
TCU_THROW(NotSupportedError, "VK_KHR_dedicated_allocation is not supported");
}
if (!renderPassInfo.getInputAspects().empty())
{
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_maintenance2"))
+ if (!context.isDeviceFunctionalitySupported("VK_KHR_maintenance2"))
TCU_THROW(NotSupportedError, "Extension VK_KHR_maintenance2 not supported.");
}
@@ -4590,7 +4590,7 @@
}
}
- if (requireDepthStencilLayout && !isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_maintenance2"))
+ if (requireDepthStencilLayout && !context.isDeviceFunctionalitySupported("VK_KHR_maintenance2"))
TCU_THROW(NotSupportedError, "VK_KHR_maintenance2 is not supported");
}
diff --git a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassTestsUtil.cpp b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassTestsUtil.cpp
index 828d7c4..90d2da6 100644
--- a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassTestsUtil.cpp
+++ b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassTestsUtil.cpp
@@ -72,7 +72,7 @@
VkImageLayout initialLayout_,
VkImageLayout finalLayout_)
{
- sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR;
+ sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2;
pNext = pNext_;
flags = flags_;
format = format_;
@@ -104,7 +104,7 @@
VkImageLayout layout_,
VkImageAspectFlags aspectMask_)
{
- sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR;
+ sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2;
pNext = pNext_;
attachment = attachment_;
layout = layout_;
@@ -147,15 +147,15 @@
VkPipelineBindPoint pipelineBindPoint_,
deUint32 viewMask_,
deUint32 inputAttachmentCount_,
- const VkAttachmentReference2KHR* pInputAttachments_,
+ const VkAttachmentReference2* pInputAttachments_,
deUint32 colorAttachmentCount_,
- const VkAttachmentReference2KHR* pColorAttachments_,
- const VkAttachmentReference2KHR* pResolveAttachments_,
- const VkAttachmentReference2KHR* pDepthStencilAttachment_,
+ const VkAttachmentReference2* pColorAttachments_,
+ const VkAttachmentReference2* pResolveAttachments_,
+ const VkAttachmentReference2* pDepthStencilAttachment_,
deUint32 preserveAttachmentCount_,
const deUint32* pPreserveAttachments_)
{
- sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR;
+ sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2;
pNext = pNext_;
flags = flags_;
pipelineBindPoint = pipelineBindPoint_;
@@ -205,7 +205,7 @@
VkDependencyFlags dependencyFlags_,
deInt32 viewOffset_)
{
- sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2_KHR;
+ sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2;
pNext = pNext_;
srcSubpass = srcSubpass_;
dstSubpass = dstSubpass_;
@@ -252,15 +252,15 @@
RenderPassCreateInfo2::RenderPassCreateInfo2 (const void* pNext_,
VkRenderPassCreateFlags flags_,
deUint32 attachmentCount_,
- const VkAttachmentDescription2KHR* pAttachments_,
+ const VkAttachmentDescription2* pAttachments_,
deUint32 subpassCount_,
- const VkSubpassDescription2KHR* pSubpasses_,
+ const VkSubpassDescription2* pSubpasses_,
deUint32 dependencyCount_,
- const VkSubpassDependency2KHR* pDependencies_,
+ const VkSubpassDependency2* pDependencies_,
deUint32 correlatedViewMaskCount_,
const deUint32* pCorrelatedViewMasks_)
{
- sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR;
+ sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2;
pNext = pNext_;
flags = flags_;
attachmentCount = attachmentCount_;
@@ -275,7 +275,7 @@
Move<VkRenderPass> RenderPassCreateInfo2::createRenderPass (const DeviceInterface& vk, VkDevice device) const
{
- return vk::createRenderPass2KHR(vk, device, this);
+ return vk::createRenderPass2(vk, device, this);
}
SubpassBeginInfo1::SubpassBeginInfo1 (const void* pNext_,
@@ -290,7 +290,7 @@
SubpassBeginInfo2::SubpassBeginInfo2 (const void* pNext_,
VkSubpassContents contents_)
{
- sType = VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO_KHR;
+ sType = VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO;
pNext = pNext_;
contents = contents_;
}
@@ -304,7 +304,7 @@
SubpassEndInfo2::SubpassEndInfo2 (const void* pNext_)
{
- sType = VK_STRUCTURE_TYPE_SUBPASS_END_INFO_KHR;
+ sType = VK_STRUCTURE_TYPE_SUBPASS_END_INFO;
pNext = pNext_;
}
@@ -343,7 +343,7 @@
const VkRenderPassBeginInfo* pRenderPassBegin,
const SubpassBeginInfo* pSubpassBeginInfo)
{
- vk.cmdBeginRenderPass2KHR(cmdBuffer, pRenderPassBegin, pSubpassBeginInfo);
+ vk.cmdBeginRenderPass2(cmdBuffer, pRenderPassBegin, pSubpassBeginInfo);
}
void RenderpassSubpass2::cmdNextSubpass (const DeviceInterface& vk,
@@ -354,7 +354,7 @@
DE_ASSERT(pSubpassBeginInfo != DE_NULL);
DE_ASSERT(pSubpassEndInfo != DE_NULL);
- vk.cmdNextSubpass2KHR(cmdBuffer, pSubpassBeginInfo, pSubpassEndInfo);
+ vk.cmdNextSubpass2(cmdBuffer, pSubpassBeginInfo, pSubpassEndInfo);
}
void RenderpassSubpass2::cmdEndRenderPass (const DeviceInterface& vk,
@@ -363,7 +363,7 @@
{
DE_ASSERT(pSubpassEndInfo != DE_NULL);
- vk.cmdEndRenderPass2KHR(cmdBuffer, pSubpassEndInfo);
+ vk.cmdEndRenderPass2(cmdBuffer, pSubpassEndInfo);
}
// For internal to RP/RP2 conversions
@@ -614,7 +614,7 @@
template <typename AttachmentDesc>
AttachmentDesc createAttachmentDescription (const Attachment& attachment)
{
- const AttachmentDesc attachmentDescription // VkAttachmentDescription || VkAttachmentDescription2KHR
+ const AttachmentDesc attachmentDescription // VkAttachmentDescription || VkAttachmentDescription2
(
// || VkStructureType sType;
DE_NULL, // || const void* pNext;
@@ -635,7 +635,7 @@
template <typename AttachmentRef>
AttachmentRef createAttachmentReference (const AttachmentReference& referenceInfo)
{
- const AttachmentRef reference // VkAttachmentReference || VkAttachmentReference2KHR
+ const AttachmentRef reference // VkAttachmentReference || VkAttachmentReference2
(
// || VkStructureType sType;
DE_NULL, // || const void* pNext;
@@ -674,7 +674,7 @@
DE_ASSERT(resolveAttachmentReferences.empty() || colorAttachmentReferences.size() == resolveAttachmentReferences.size());
{
- const SubpassDesc subpassDescription // VkSubpassDescription || VkSubpassDescription2KHR
+ const SubpassDesc subpassDescription // VkSubpassDescription || VkSubpassDescription2
(
// || VkStructureType sType;
DE_NULL, // || const void* pNext;
@@ -682,11 +682,11 @@
subpass.getPipelineBindPoint(), // VkPipelineBindPoint pipelineBindPoint; || VkPipelineBindPoint pipelineBindPoint;
0u, // || deUint32 viewMask;
(deUint32)inputAttachmentReferences.size(), // deUint32 inputAttachmentCount; || deUint32 inputAttachmentCount;
- inputAttachmentReferences.empty() ? DE_NULL : &inputAttachmentReferences[0], // const VkAttachmentReference* pInputAttachments; || const VkAttachmentReference2KHR* pInputAttachments;
+ inputAttachmentReferences.empty() ? DE_NULL : &inputAttachmentReferences[0], // const VkAttachmentReference* pInputAttachments; || const VkAttachmentReference2* pInputAttachments;
(deUint32)colorAttachmentReferences.size(), // deUint32 colorAttachmentCount; || deUint32 colorAttachmentCount;
- colorAttachmentReferences.empty() ? DE_NULL : &colorAttachmentReferences[0], // const VkAttachmentReference* pColorAttachments; || const VkAttachmentReference2KHR* pColorAttachments;
- resolveAttachmentReferences.empty() ? DE_NULL : &resolveAttachmentReferences[0], // const VkAttachmentReference* pResolveAttachments; || const VkAttachmentReference2KHR* pResolveAttachments;
- &depthStencilAttachmentReferences[0], // const VkAttachmentReference* pDepthStencilAttachment; || const VkAttachmentReference2KHR* pDepthStencilAttachment;
+ colorAttachmentReferences.empty() ? DE_NULL : &colorAttachmentReferences[0], // const VkAttachmentReference* pColorAttachments; || const VkAttachmentReference2* pColorAttachments;
+ resolveAttachmentReferences.empty() ? DE_NULL : &resolveAttachmentReferences[0], // const VkAttachmentReference* pResolveAttachments; || const VkAttachmentReference2* pResolveAttachments;
+ &depthStencilAttachmentReferences[0], // const VkAttachmentReference* pDepthStencilAttachment; || const VkAttachmentReference2* pDepthStencilAttachment;
(deUint32)preserveAttachmentReferences->size(), // deUint32 preserveAttachmentCount; || deUint32 preserveAttachmentCount;
preserveAttachmentReferences->empty() ? DE_NULL : &(*preserveAttachmentReferences)[0] // const deUint32* pPreserveAttachments; || const deUint32* pPreserveAttachments;
);
@@ -698,7 +698,7 @@
template <typename SubpassDep>
SubpassDep createSubpassDependency (const SubpassDependency& dependencyInfo)
{
- const SubpassDep dependency // VkSubpassDependency || VkSubpassDependency2KHR
+ const SubpassDep dependency // VkSubpassDependency || VkSubpassDependency2
(
// || VkStructureType sType
DE_NULL, // || const void* pNext
@@ -758,17 +758,17 @@
for (size_t depNdx = 0; depNdx < renderPassInfo.getDependencies().size(); depNdx++)
dependencies.push_back(createSubpassDependency<SubpassDep>(renderPassInfo.getDependencies()[depNdx]));
- const RenderPassCreateInfo renderPassCreator // VkRenderPassCreateInfo || VkRenderPassCreateInfo2KHR
+ const RenderPassCreateInfo renderPassCreator // VkRenderPassCreateInfo || VkRenderPassCreateInfo2
(
// VkStructureType sType; || VkStructureType sType;
inputAspectCreateInfo.get(), // const void* pNext; || const void* pNext;
(VkRenderPassCreateFlags)0u, // VkRenderPassCreateFlags flags; || VkRenderPassCreateFlags flags;
(deUint32)attachments.size(), // deUint32 attachmentCount; || deUint32 attachmentCount;
- (attachments.empty() ? DE_NULL : &attachments[0]), // const VkAttachmentDescription* pAttachments; || const VkAttachmentDescription2KHR* pAttachments;
+ (attachments.empty() ? DE_NULL : &attachments[0]), // const VkAttachmentDescription* pAttachments; || const VkAttachmentDescription2* pAttachments;
(deUint32)subpasses.size(), // deUint32 subpassCount; || deUint32 subpassCount;
- (subpasses.empty() ? DE_NULL : &subpasses[0]), // const VkSubpassDescription* pSubpasses; || const VkSubpassDescription2KHR* pSubpasses;
+ (subpasses.empty() ? DE_NULL : &subpasses[0]), // const VkSubpassDescription* pSubpasses; || const VkSubpassDescription2* pSubpasses;
(deUint32)dependencies.size(), // deUint32 dependencyCount; || deUint32 dependencyCount;
- (dependencies.empty() ? DE_NULL : &dependencies[0]), // const VkSubpassDependency* pDependencies; || const VkSubpassDependency2KHR* pDependencies;
+ (dependencies.empty() ? DE_NULL : &dependencies[0]), // const VkSubpassDependency* pDependencies; || const VkSubpassDependency2* pDependencies;
0u, // || deUint32 correlatedViewMaskCount;
DE_NULL // || const deUint32* pCorrelatedViewMasks;
);
diff --git a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassTestsUtil.hpp b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassTestsUtil.hpp
index e2762dd..7ec2510 100644
--- a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassTestsUtil.hpp
+++ b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassTestsUtil.hpp
@@ -59,7 +59,7 @@
VkImageLayout finalLayout);
};
-class AttachmentDescription2 : public vk::VkAttachmentDescription2KHR
+class AttachmentDescription2 : public vk::VkAttachmentDescription2
{
public:
AttachmentDescription2 (const void* pNext,
@@ -83,7 +83,7 @@
VkImageAspectFlags aspectMask);
};
-class AttachmentReference2 : public vk::VkAttachmentReference2KHR
+class AttachmentReference2 : public vk::VkAttachmentReference2
{
public:
AttachmentReference2 (const void* pNext,
@@ -109,7 +109,7 @@
const deUint32* pPreserveAttachments);
};
-class SubpassDescription2 : public vk::VkSubpassDescription2KHR
+class SubpassDescription2 : public vk::VkSubpassDescription2
{
public:
SubpassDescription2 (const void* pNext,
@@ -117,11 +117,11 @@
VkPipelineBindPoint pipelineBindPoint,
deUint32 viewMask,
deUint32 inputAttachmentCount,
- const VkAttachmentReference2KHR* pInputAttachments,
+ const VkAttachmentReference2* pInputAttachments,
deUint32 colorAttachmentCount,
- const VkAttachmentReference2KHR* pColorAttachments,
- const VkAttachmentReference2KHR* pResolveAttachments,
- const VkAttachmentReference2KHR* pDepthStencilAttachment,
+ const VkAttachmentReference2* pColorAttachments,
+ const VkAttachmentReference2* pResolveAttachments,
+ const VkAttachmentReference2* pDepthStencilAttachment,
deUint32 preserveAttachmentCount,
const deUint32* pPreserveAttachments);
};
@@ -140,7 +140,7 @@
deInt32 viewOffset);
};
-class SubpassDependency2 : public vk::VkSubpassDependency2KHR
+class SubpassDependency2 : public vk::VkSubpassDependency2
{
public:
SubpassDependency2 (const void* pNext,
@@ -172,17 +172,17 @@
VkDevice device) const;
};
-class RenderPassCreateInfo2 : public VkRenderPassCreateInfo2KHR
+class RenderPassCreateInfo2 : public VkRenderPassCreateInfo2
{
public:
RenderPassCreateInfo2 (const void* pNext,
VkRenderPassCreateFlags flags,
deUint32 attachmentCount,
- const VkAttachmentDescription2KHR* pAttachments,
+ const VkAttachmentDescription2* pAttachments,
deUint32 subpassCount,
- const VkSubpassDescription2KHR* pSubpasses,
+ const VkSubpassDescription2* pSubpasses,
deUint32 dependencyCount,
- const VkSubpassDependency2KHR* pDependencies,
+ const VkSubpassDependency2* pDependencies,
deUint32 correlatedViewMaskCount,
const deUint32* pCorrelatedViewMasks);
@@ -199,7 +199,7 @@
VkSubpassContents contents;
};
-class SubpassBeginInfo2 : public VkSubpassBeginInfoKHR
+class SubpassBeginInfo2 : public VkSubpassBeginInfo
{
public:
SubpassBeginInfo2 (const void* pNext,
@@ -212,7 +212,7 @@
SubpassEndInfo1 (const void* pNext);
};
-class SubpassEndInfo2 : public VkSubpassEndInfoKHR
+class SubpassEndInfo2 : public VkSubpassEndInfo
{
public:
SubpassEndInfo2 (const void* pNext);
diff --git a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassUnusedAttachmentTests.cpp b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassUnusedAttachmentTests.cpp
index 11ea07d..e8afdf7 100644
--- a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassUnusedAttachmentTests.cpp
+++ b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassUnusedAttachmentTests.cpp
@@ -361,7 +361,7 @@
// Check for renderpass2 extension if used
if (testParams.renderPassType == RENDERPASS_TYPE_RENDERPASS2)
- context.requireDeviceExtension("VK_KHR_create_renderpass2");
+ context.requireDeviceFunctionality("VK_KHR_create_renderpass2");
// Create color image
{
diff --git a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassUnusedClearAttachmentTests.cpp b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassUnusedClearAttachmentTests.cpp
index edf30e6..8d68f43 100644
--- a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassUnusedClearAttachmentTests.cpp
+++ b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassUnusedClearAttachmentTests.cpp
@@ -31,6 +31,8 @@
#include <sstream>
#include <functional>
#include <vector>
+#include <string>
+#include <memory>
namespace vkt
{
@@ -40,16 +42,85 @@
namespace
{
-constexpr size_t COLOR_ATTACHMENTS_NUMBER = 4; // maxColorAttachments is guaranteed to be at least 4.
+constexpr size_t COLOR_ATTACHMENTS_NUMBER = 4; // maxColorAttachments is guaranteed to be at least 4.
+constexpr VkFormat FORMAT_COLOR = VK_FORMAT_R8G8B8A8_UNORM;
+constexpr VkFormat FORMAT_DEPTH = VK_FORMAT_D32_SFLOAT;
+constexpr VkFormat FORMAT_DEPTH_STENCIL = VK_FORMAT_D32_SFLOAT_S8_UINT;
+const deBool DE_BOOL_VALUES[] = { DE_FALSE, DE_TRUE };
+
+enum DepthStencilType
+{
+ DEPTH_STENCIL_NONE = 0,
+ DEPTH_STENCIL_DEPTH_ONLY = 1,
+ DEPTH_STENCIL_BOTH = 2,
+ DEPTH_STENCIL_MAX_ENUM = 3
+};
+
+std::string depthStencilTypeName(DepthStencilType type)
+{
+ DE_ASSERT(type >= DEPTH_STENCIL_NONE && type < DEPTH_STENCIL_MAX_ENUM);
+
+ switch (type)
+ {
+ case DEPTH_STENCIL_NONE: return "nods";
+ case DEPTH_STENCIL_DEPTH_ONLY: return "depthonly";
+ case DEPTH_STENCIL_BOTH: return "depthstencil";
+ default: return "UNKNOWN"; // Unreachable.
+ }
+
+ return "UNKNOWN"; // Unreachable.
+}
+
+VkImageAspectFlags getAspectMask(DepthStencilType type)
+{
+ VkImageAspectFlags aspectMask = 0u;
+
+ switch (type)
+ {
+ case DEPTH_STENCIL_BOTH:
+ aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT;
+ // Fallthrough.
+ case DEPTH_STENCIL_DEPTH_ONLY:
+ aspectMask |= VK_IMAGE_ASPECT_DEPTH_BIT;
+ break;
+ default:
+ break;
+ }
+
+ return aspectMask;
+}
+
+VkFormat getFormat(DepthStencilType type)
+{
+ if (type == DEPTH_STENCIL_BOTH)
+ return FORMAT_DEPTH_STENCIL;
+ if (type == DEPTH_STENCIL_DEPTH_ONLY)
+ return FORMAT_DEPTH;
+ return VK_FORMAT_UNDEFINED;
+}
+
+bool isDepthOnly(DepthStencilType type)
+{
+ return (type == DEPTH_STENCIL_DEPTH_ONLY);
+}
+
+bool hasDepthStencil(DepthStencilType type)
+{
+ return (type != DEPTH_STENCIL_NONE);
+}
struct TestParams
{
- TestParams(size_t N, RenderPassType type)
- : isUsed(N, DE_FALSE)
- , renderPassType(type)
+ TestParams(size_t numColorAttachments, DepthStencilType depthStencilType_, deBool depthStencilUsed_, RenderPassType renderPassType_)
+ : colorUsed(numColorAttachments, DE_FALSE)
+ , depthStencilType(depthStencilType_)
+ , depthStencilUsed(depthStencilUsed_)
+ , renderPassType(renderPassType_)
{}
- std::vector<deBool> isUsed;
+ std::vector<deBool> colorUsed;
+ DepthStencilType depthStencilType;
+ deBool depthStencilUsed;
RenderPassType renderPassType;
};
@@ -69,13 +140,20 @@
const tcu::UVec2 m_renderSize = { kImageWidth, kImageHeight };
VkClearValue m_initialColor;
+ VkClearValue m_initialColorDepth;
VkClearValue m_clearColor;
+ VkClearValue m_clearColorDepth;
const TestParams m_testParams;
+
std::vector<Move<VkImage>> m_colorImages;
std::vector<de::MovePtr<Allocation>> m_colorImageAllocs;
std::vector<Move<VkImageView>> m_colorAttachmentViews;
+ Move<VkImage> m_depthImage;
+ de::MovePtr<Allocation> m_depthImageAlloc;
+ Move<VkImageView> m_depthAttachmentView;
+
Move<VkRenderPass> m_renderPass;
Move<VkFramebuffer> m_framebuffer;
Move<VkShaderModule> m_vertexShaderModule;
@@ -100,10 +178,43 @@
virtual ~UnusedClearAttachmentTest (void) {}
virtual void initPrograms (SourceCollections& sourceCollections) const;
virtual TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
private:
const TestParams m_testParams;
};
+void checkFormatSupported(Context& context, VkFormat format, VkImageUsageFlags usage)
+{
+ VkResult result;
+ VkImageFormatProperties properties;
+
+ result = context.getInstanceInterface().getPhysicalDeviceImageFormatProperties(
+ context.getPhysicalDevice(), format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL, usage, 0, &properties);
+
+ if (result == VK_ERROR_FORMAT_NOT_SUPPORTED)
+ {
+ std::ostringstream msg;
+ msg << "Format " << format << " not supported for usage flags 0x" << std::hex << usage;
+ TCU_THROW(NotSupportedError, msg.str());
+ }
+
+ VK_CHECK(result);
+}
+
+void UnusedClearAttachmentTest::checkSupport (Context& context) const
+{
+ // Check for renderpass2 extension if used
+ if (m_testParams.renderPassType == RENDERPASS_TYPE_RENDERPASS2)
+ context.requireDeviceFunctionality("VK_KHR_create_renderpass2");
+
+ // Check support for the needed color, depth and stencil formats.
+ if (!m_testParams.colorUsed.empty())
+ checkFormatSupported(context, FORMAT_COLOR, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
+
+ if (hasDepthStencil(m_testParams.depthStencilType))
+ checkFormatSupported(context, getFormat(m_testParams.depthStencilType), VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT);
+}
+
TestInstance* UnusedClearAttachmentTest::createInstance (Context& context) const
{
return new UnusedClearAttachmentTestInstance(context, m_testParams);
@@ -131,18 +242,18 @@
<< "precision highp float;\n"
<< "layout(location = 0) in vec4 vtxColor;\n";
- for (size_t i = 0; i < m_testParams.isUsed.size(); ++i)
+ for (size_t i = 0; i < m_testParams.colorUsed.size(); ++i)
{
- if (m_testParams.isUsed[i])
+ if (m_testParams.colorUsed[i])
fragmentSource << "layout(location = " << i << ") out vec4 fragColor" << i << ";\n";
}
fragmentSource << "void main (void)\n"
<< "{\n";
- for (size_t i = 0; i < m_testParams.isUsed.size(); ++i)
+ for (size_t i = 0; i < m_testParams.colorUsed.size(); ++i)
{
- if (m_testParams.isUsed[i])
+ if (m_testParams.colorUsed[i])
fragmentSource << "\tfragColor" << i << " = vtxColor;\n";
}
@@ -157,13 +268,15 @@
VkDevice vkDevice,
const TestParams testParams)
{
- const VkImageAspectFlags aspectMask = testParams.renderPassType == RENDERPASS_TYPE_LEGACY ? 0 : VK_IMAGE_ASPECT_COLOR_BIT;
+ const VkImageAspectFlags colorAspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ const VkImageAspectFlags dsAspectMask = getAspectMask(testParams.depthStencilType);
+ const bool isDepthStencil = hasDepthStencil(testParams.depthStencilType);
// Create attachment descriptions.
const AttachmentDesc attachmentDescription (
DE_NULL, // const void* pNext
(VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags
- VK_FORMAT_R8G8B8A8_UNORM, // VkFormat format
+ FORMAT_COLOR, // VkFormat format
VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples
VK_ATTACHMENT_LOAD_OP_LOAD, // VkAttachmentLoadOp loadOp
VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp
@@ -172,47 +285,79 @@
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout initialLayout
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout finalLayout
);
- std::vector<AttachmentDesc> attachmentDescriptions (testParams.isUsed.size(), attachmentDescription);
+ std::vector<AttachmentDesc> attachmentDescriptions (testParams.colorUsed.size(), attachmentDescription);
+
+ if (isDepthStencil)
+ {
+ const bool depthOnly = isDepthOnly(testParams.depthStencilType);
+ const VkFormat attachFormat = getFormat(testParams.depthStencilType);
+ const VkAttachmentLoadOp stencilLoadOp = (depthOnly ? VK_ATTACHMENT_LOAD_OP_DONT_CARE : VK_ATTACHMENT_LOAD_OP_LOAD);
+ const VkAttachmentStoreOp stencilStoreOp = (depthOnly ? VK_ATTACHMENT_STORE_OP_DONT_CARE : VK_ATTACHMENT_STORE_OP_STORE);
+
+ attachmentDescriptions.emplace_back(
+ nullptr, // const void* pNext
+ (VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags
+ attachFormat, // VkFormat format
+ VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples
+ VK_ATTACHMENT_LOAD_OP_LOAD, // VkAttachmentLoadOp loadOp
+ VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp
+ stencilLoadOp, // VkAttachmentLoadOp stencilLoadOp
+ stencilStoreOp, // VkAttachmentStoreOp stencilStoreOp
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout initialLayout
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL // VkImageLayout finalLayout
+ );
+ }
// Mark attachments as used or not depending on the test parameters.
- std::vector<AttachmentRef> attachmentReferences;
- for (size_t i = 0; i < testParams.isUsed.size(); ++i)
+ std::vector<AttachmentRef> attachmentReferences;
+ for (size_t i = 0; i < testParams.colorUsed.size(); ++i)
{
attachmentReferences.push_back(AttachmentRef(
- DE_NULL, // const void* pNext
- (testParams.isUsed[i] ? static_cast<deUint32>(i) : VK_ATTACHMENT_UNUSED), // deUint32 attachment
- VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout layout
- aspectMask // VkImageAspectFlags aspectMask
+ DE_NULL, // const void* pNext
+ (testParams.colorUsed[i] ? static_cast<deUint32>(i) : VK_ATTACHMENT_UNUSED), // deUint32 attachment
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout layout
+ colorAspectMask // VkImageAspectFlags aspectMask
+ ));
+ }
+
+ std::unique_ptr<AttachmentRef> depthAttachmentRef;
+ if (isDepthStencil)
+ {
+ depthAttachmentRef.reset(new AttachmentRef(
+ DE_NULL,
+ (testParams.depthStencilUsed ? static_cast<deUint32>(testParams.colorUsed.size()) : VK_ATTACHMENT_UNUSED),
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
+ dsAspectMask
));
}
// Create subpass description with the previous color attachment references.
const SubpassDesc subpassDescription (
DE_NULL,
- (VkSubpassDescriptionFlags)0, // VkSubpassDescriptionFlags flags
- VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint
- 0u, // deUint32 viewMask
- 0u, // deUint32 inputAttachmentCount
- DE_NULL, // const VkAttachmentReference* pInputAttachments
- static_cast<deUint32>(attachmentReferences.size()), // deUint32 colorAttachmentCount
- attachmentReferences.data(), // const VkAttachmentReference* pColorAttachments
- DE_NULL, // const VkAttachmentReference* pResolveAttachments
- DE_NULL, // const VkAttachmentReference* pDepthStencilAttachment
- 0u, // deUint32 preserveAttachmentCount
- DE_NULL // const deUint32* pPreserveAttachments
+ (VkSubpassDescriptionFlags)0, // VkSubpassDescriptionFlags flags
+ VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint
+ 0u, // deUint32 viewMask
+ 0u, // deUint32 inputAttachmentCount
+ DE_NULL, // const VkAttachmentReference* pInputAttachments
+ static_cast<deUint32>(attachmentReferences.size()), // deUint32 colorAttachmentCount
+ (attachmentReferences.empty() ? DE_NULL : attachmentReferences.data()), // const VkAttachmentReference* pColorAttachments
+ DE_NULL, // const VkAttachmentReference* pResolveAttachments
+ (depthAttachmentRef ? depthAttachmentRef.get() : DE_NULL), // const VkAttachmentReference* pDepthStencilAttachment
+ 0u, // deUint32 preserveAttachmentCount
+ DE_NULL // const deUint32* pPreserveAttachments
);
const RenderPassCreateInfo renderPassInfo (
- DE_NULL, // const void* pNext
- (VkRenderPassCreateFlags)0, // VkRenderPassCreateFlags flags
- static_cast<deUint32>(attachmentDescriptions.size()), // deUint32 attachmentCount
- attachmentDescriptions.data(), // const VkAttachmentDescription* pAttachments
- 1u, // deUint32 subpassCount
- &subpassDescription, // const VkSubpassDescription* pSubpasses
- 0u, // deUint32 dependencyCount
- DE_NULL, // const VkSubpassDependency* pDependencies
- 0u, // deUint32 correlatedViewMaskCount
- DE_NULL // const deUint32* pCorrelatedViewMasks
+ DE_NULL, // const void* pNext
+ (VkRenderPassCreateFlags)0, // VkRenderPassCreateFlags flags
+ static_cast<deUint32>(attachmentDescriptions.size()), // deUint32 attachmentCount
+ (attachmentDescriptions.empty() ? DE_NULL : attachmentDescriptions.data()), // const VkAttachmentDescription* pAttachments
+ 1u, // deUint32 subpassCount
+ &subpassDescription, // const VkSubpassDescription* pSubpasses
+ 0u, // deUint32 dependencyCount
+ DE_NULL, // const VkSubpassDependency* pDependencies
+ 0u, // deUint32 correlatedViewMaskCount
+ DE_NULL // const deUint32* pCorrelatedViewMasks
);
return renderPassInfo.createRenderPass(vk, vkDevice);
@@ -229,21 +374,23 @@
m_initialColor.color.float32[2] = 0.0f;
m_initialColor.color.float32[3] = 1.0f;
+ m_initialColorDepth.depthStencil.depth = 1.0f;
+ m_initialColorDepth.depthStencil.stencil = 0u;
+
// Clear color for used attachments.
m_clearColor.color.float32[0] = 1.0f;
m_clearColor.color.float32[1] = 1.0f;
m_clearColor.color.float32[2] = 1.0f;
m_clearColor.color.float32[3] = 1.0f;
+ m_clearColorDepth.depthStencil.depth = 0.0f;
+ m_clearColorDepth.depthStencil.stencil = 255u;
+
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice vkDevice = m_context.getDevice();
const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
SimpleAllocator memAlloc (vk, vkDevice, getPhysicalDeviceMemoryProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice()));
- const VkComponentMapping componentMappingRGBA = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A };
-
- // Check for renderpass2 extension if used
- if (testParams.renderPassType == RENDERPASS_TYPE_RENDERPASS2)
- context.requireDeviceExtension("VK_KHR_create_renderpass2");
+ const VkComponentMapping componentMapping = { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY };
// Create color images.
{
@@ -253,7 +400,7 @@
DE_NULL, // const void* pNext;
0u, // VkImageCreateFlags flags;
VK_IMAGE_TYPE_2D, // VkImageType imageType;
- VK_FORMAT_R8G8B8A8_UNORM, // VkFormat format;
+ FORMAT_COLOR, // VkFormat format;
{ kImageWidth, kImageHeight, 1u }, // VkExtent3D extent;
1u, // deUint32 mipLevels;
1u, // deUint32 arrayLayers;
@@ -267,7 +414,27 @@
VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout initialLayout;
};
- for (size_t i = 0; i < testParams.isUsed.size(); ++i)
+ const VkImageCreateInfo depthImageParams =
+ {
+ VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkImageCreateFlags flags;
+ VK_IMAGE_TYPE_2D, // VkImageType imageType;
+ getFormat(m_testParams.depthStencilType), // VkFormat format;
+ { kImageWidth, kImageHeight, 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_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT
+ | VK_IMAGE_USAGE_TRANSFER_DST_BIT, // VkImageUsageFlags usage;
+ VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
+ 1u, // deUint32 queueFamilyIndexCount;
+ &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
+ VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout initialLayout;
+ };
+
+ for (size_t i = 0; i < testParams.colorUsed.size(); ++i)
{
// Create, allocate and bind image memory.
m_colorImages.emplace_back(createImage(vk, vkDevice, &colorImageParams));
@@ -283,15 +450,15 @@
0u, // VkImageViewCreateFlags flags;
*m_colorImages.back(), // VkImage image;
VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType;
- VK_FORMAT_R8G8B8A8_UNORM, // VkFormat format;
- componentMappingRGBA, // VkChannelMapping channels;
+ FORMAT_COLOR, // VkFormat format;
+ componentMapping, // VkChannelMapping channels;
{ VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u } // VkImageSubresourceRange subresourceRange;
};
m_colorAttachmentViews.emplace_back(createImageView(vk, vkDevice, &colorAttachmentViewParams));
}
- // Fill image in black and leave it prepared to be used as a color attachment.
+ // Clear image and leave it prepared to be used as a color attachment.
{
const VkImageAspectFlags aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Move<VkCommandPool> cmdPool;
@@ -362,6 +529,104 @@
submitCommandsAndWait(vk, vkDevice, m_context.getUniversalQueue(), cmdBuffer.get());
}
}
+
+ if (hasDepthStencil(m_testParams.depthStencilType))
+ {
+ const VkFormat format = getFormat(m_testParams.depthStencilType);
+ const VkImageAspectFlags aspectMask = getAspectMask(m_testParams.depthStencilType);
+
+ // Create, allocate and bind image memory.
+ m_depthImage = createImage(vk, vkDevice, &depthImageParams);
+ m_depthImageAlloc = memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_depthImage), MemoryRequirement::Any);
+ VK_CHECK(vk.bindImageMemory(vkDevice, *m_depthImage, m_depthImageAlloc->getMemory(), m_depthImageAlloc->getOffset()));
+
+ // Create image view.
+ {
+ const VkImageViewCreateInfo depthAttachmentViewParams =
+ {
+ VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkImageViewCreateFlags flags;
+ *m_depthImage, // VkImage image;
+ VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType;
+ format, // VkFormat format;
+ componentMapping, // VkChannelMapping channels;
+ { aspectMask, 0u, 1u, 0u, 1u } // VkImageSubresourceRange subresourceRange;
+ };
+
+ m_depthAttachmentView = createImageView(vk, vkDevice, &depthAttachmentViewParams);
+ }
+
+ // Clear image and leave it prepared to be used as a depth/stencil attachment.
+ {
+ Move<VkCommandPool> cmdPool;
+ Move<VkCommandBuffer> cmdBuffer;
+
+ // Create command pool and buffer
+ cmdPool = createCommandPool(vk, vkDevice, VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, queueFamilyIndex);
+ cmdBuffer = allocateCommandBuffer(vk, vkDevice, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+
+ // From undefined layout to VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL.
+ const 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_TRANSFER_DST_OPTIMAL, // VkImageLayout newLayout;
+ VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
+ VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
+ *m_depthImage, // VkImage image;
+ { // VkImageSubresourceRange subresourceRange;
+ aspectMask, // VkImageAspect aspect;
+ 0u, // deUint32 baseMipLevel;
+ 1u, // deUint32 mipLevels;
+ 0u, // deUint32 baseArraySlice;
+ 1u // deUint32 arraySize;
+ }
+ };
+
+ // From VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL to VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL.
+ const VkImageMemoryBarrier postImageBarrier =
+ {
+ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
+ VK_ACCESS_SHADER_READ_BIT, // VkAccessFlags dstAccessMask;
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout;
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout newLayout;
+ VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
+ VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
+ *m_depthImage, // VkImage image;
+ { // VkImageSubresourceRange subresourceRange;
+ aspectMask, // VkImageAspect aspect;
+ 0u, // deUint32 baseMipLevel;
+ 1u, // deUint32 mipLevels;
+ 0u, // deUint32 baseArraySlice;
+ 1u // deUint32 arraySize;
+ }
+ };
+
+ const VkImageSubresourceRange clearRange =
+ {
+ aspectMask, // VkImageAspectFlags aspectMask;
+ 0u, // deUint32 baseMipLevel;
+ 1u, // deUint32 levelCount;
+ 0u, // deUint32 baseArrayLayer;
+ 1u // deUint32 layerCount;
+ };
+
+ // Clear image and transfer layout.
+ beginCommandBuffer(vk, *cmdBuffer);
+ vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &preImageBarrier);
+ vk.cmdClearDepthStencilImage(*cmdBuffer, *m_depthImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &m_initialColorDepth.depthStencil, 1, &clearRange);
+ vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &postImageBarrier);
+ endCommandBuffer(vk, *cmdBuffer);
+
+ submitCommandsAndWait(vk, vkDevice, m_context.getUniversalQueue(), cmdBuffer.get());
+ }
+ }
}
// Create render pass.
@@ -377,17 +642,20 @@
for (auto& movePtr : m_colorAttachmentViews)
imageViews.push_back(movePtr.get());
+ if (hasDepthStencil(m_testParams.depthStencilType))
+ imageViews.push_back(m_depthAttachmentView.get());
+
const VkFramebufferCreateInfo framebufferParams =
{
- VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkFramebufferCreateFlags flags;
- *m_renderPass, // VkRenderPass renderPass;
- static_cast<deUint32>(imageViews.size()), // deUint32 attachmentCount;
- imageViews.data(), // const VkImageView* pAttachments;
- kImageWidth, // deUint32 width;
- kImageHeight, // deUint32 height;
- 1u // deUint32 layers;
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkFramebufferCreateFlags flags;
+ *m_renderPass, // VkRenderPass renderPass;
+ static_cast<deUint32>(imageViews.size()), // deUint32 attachmentCount;
+ (imageViews.empty() ? DE_NULL : imageViews.data()), // const VkImageView* pAttachments;
+ kImageWidth, // deUint32 width;
+ kImageHeight, // deUint32 height;
+ 1u // deUint32 layers;
};
m_framebuffer = createFramebuffer(vk, vkDevice, &framebufferParams);
@@ -443,19 +711,19 @@
};
std::vector<VkPipelineColorBlendAttachmentState> colorBlendAttachmentStates;
- for (size_t i = 0; i < testParams.isUsed.size(); ++i)
+ for (size_t i = 0; i < testParams.colorUsed.size(); ++i)
colorBlendAttachmentStates.push_back(colorBlendAttachmentState);
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_CLEAR, // VkLogicOp logicOp
- static_cast<deUint32>(colorBlendAttachmentStates.size()), // deUint32 attachmentCount
- colorBlendAttachmentStates.data(), // const VkPipelineColorBlendAttachmentState* pAttachments
- { 0.0f, 0.0f, 0.0f, 0.0f } // float blendConstants[4]
+ 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_CLEAR, // VkLogicOp logicOp
+ static_cast<deUint32>(colorBlendAttachmentStates.size()), // deUint32 attachmentCount
+ (colorBlendAttachmentStates.empty() ? DE_NULL : colorBlendAttachmentStates.data()), // const VkPipelineColorBlendAttachmentState* pAttachments
+ { 0.0f, 0.0f, 0.0f, 0.0f } // float blendConstants[4]
};
m_graphicsPipeline = makeGraphicsPipeline(vk, // const DeviceInterface& vk
@@ -520,7 +788,7 @@
};
std::vector<VkClearAttachment> clearAttachments;
- for (size_t i = 0; i < m_testParams.isUsed.size(); ++i)
+ for (size_t i = 0; i < m_testParams.colorUsed.size(); ++i)
{
const VkClearAttachment clearAttachment = {
VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
@@ -530,10 +798,20 @@
clearAttachments.push_back(clearAttachment);
}
+ if (hasDepthStencil(m_testParams.depthStencilType))
+ {
+ const VkClearAttachment clearAttachment = {
+ getAspectMask(m_testParams.depthStencilType), // VkImageAspectFlags aspectMask;
+ 0u, // uint32_t colorAttachment;
+ m_clearColorDepth // VkClearValue clearValue;
+ };
+ clearAttachments.push_back(clearAttachment);
+ }
+
beginCommandBuffer(vk, *m_cmdBuffer, 0u);
RenderpassSubpass::cmdBeginRenderPass(vk, *m_cmdBuffer, &renderPassBeginInfo, &subpassBeginInfo);
vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_graphicsPipeline);
- vk.cmdClearAttachments(*m_cmdBuffer, static_cast<deUint32>(clearAttachments.size()), clearAttachments.data(), 1u, &clearRect);
+ vk.cmdClearAttachments(*m_cmdBuffer, static_cast<deUint32>(clearAttachments.size()), (clearAttachments.empty() ? DE_NULL : clearAttachments.data()), 1u, &clearRect);
RenderpassSubpass::cmdEndRenderPass(vk, *m_cmdBuffer, &subpassEndInfo);
endCommandBuffer(vk, *m_cmdBuffer);
}
@@ -550,14 +828,14 @@
// Read result images.
std::vector<de::MovePtr<tcu::TextureLevel>> imagePixels;
- for (size_t i = 0; i < m_testParams.isUsed.size(); ++i)
- imagePixels.emplace_back(pipeline::readColorAttachment(vk, vkDevice, queue, queueFamilyIndex, allocator, *m_colorImages[i], VK_FORMAT_R8G8B8A8_UNORM, m_renderSize).release());
+ for (size_t i = 0; i < m_testParams.colorUsed.size(); ++i)
+ imagePixels.emplace_back(pipeline::readColorAttachment(vk, vkDevice, queue, queueFamilyIndex, allocator, *m_colorImages[i], FORMAT_COLOR, m_renderSize).release());
// Verify pixel colors match.
for (size_t i = 0; i < imagePixels.size(); ++i)
{
const tcu::ConstPixelBufferAccess& imageAccess = imagePixels[i]->getAccess();
- const float* refColor = (m_testParams.isUsed[i] ? m_clearColor.color.float32 : m_initialColor.color.float32);
+ const float* refColor = (m_testParams.colorUsed[i] ? m_clearColor.color.float32 : m_initialColor.color.float32);
for (int y = 0; y < imageAccess.getHeight(); ++y)
for (int x = 0; x < imageAccess.getWidth(); ++x)
@@ -582,6 +860,50 @@
}
}
+ if (hasDepthStencil(m_testParams.depthStencilType))
+ {
+ const bool depthOnly = isDepthOnly(m_testParams.depthStencilType);
+ const VkFormat format = getFormat(m_testParams.depthStencilType);
+ de::MovePtr<tcu::TextureLevel> depthPixels = pipeline::readDepthAttachment(vk, vkDevice, queue, queueFamilyIndex, allocator, *m_depthImage, format, m_renderSize);
+ const tcu::ConstPixelBufferAccess& depthAccess = depthPixels->getAccess();
+ const float refDepth = (m_testParams.depthStencilUsed ? m_clearColorDepth.depthStencil.depth : m_initialColorDepth.depthStencil.depth);
+
+ for (int y = 0; y < depthAccess.getHeight(); ++y)
+ for (int x = 0; x < depthAccess.getWidth(); ++x)
+ {
+ const float value = depthAccess.getPixDepth(x, y);
+ if (de::abs(value - refDepth) > 0.001f)
+ {
+ std::ostringstream msg;
+
+ msg << "Depth/stencil attachment with mismatched depth value at pixel ("
+ << x << ", " << y << "): expected value " << refDepth << " and found " << value;
+ return tcu::TestStatus::fail(msg.str());
+ }
+ }
+
+ if (!depthOnly)
+ {
+ de::MovePtr<tcu::TextureLevel> stencilPixels = pipeline::readStencilAttachment(vk, vkDevice, queue, queueFamilyIndex, allocator, *m_depthImage, format, m_renderSize, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
+ const tcu::ConstPixelBufferAccess& stencilAccess = stencilPixels->getAccess();
+ const deUint32 refStencil = (m_testParams.depthStencilUsed ? m_clearColorDepth.depthStencil.stencil : m_initialColorDepth.depthStencil.stencil);
+
+ for (int y = 0; y < stencilAccess.getHeight(); ++y)
+ for (int x = 0; x < stencilAccess.getWidth(); ++x)
+ {
+ const int value = stencilAccess.getPixStencil(x, y);
+ if (value < 0 || static_cast<deUint32>(value) != refStencil)
+ {
+ std::ostringstream msg;
+
+ msg << "Depth/stencil attachment with mismatched stencil value at pixel ("
+ << x << ", " << y << "): expected value " << refStencil << " and found " << value;
+ return tcu::TestStatus::fail(msg.str());
+ }
+ }
+ }
+ }
+
return tcu::TestStatus::pass("Pass");
}
@@ -590,12 +912,10 @@
void runCallbackOnCombination(std::vector<deBool>& array, size_t current_index, CallbackFunction callback)
{
- static const deBool values[] = { DE_FALSE, DE_TRUE };
-
DE_ASSERT(current_index < array.size());
- for (size_t i = 0; i < DE_LENGTH_OF_ARRAY(values); ++i)
+ for (size_t i = 0; i < DE_LENGTH_OF_ARRAY(DE_BOOL_VALUES); ++i)
{
- array[current_index] = values[i];
+ array[current_index] = DE_BOOL_VALUES[i];
if (current_index == array.size() - 1)
callback(array);
else
@@ -608,11 +928,15 @@
runCallbackOnCombination(array, 0, callback);
}
-std::string getTestName(const std::vector<deBool>& array)
+std::string getUsed(deBool value)
+{
+ return (value ? "used" : "unused");
+}
+std::string getCombName(const std::vector<deBool>& array)
{
std::ostringstream name;
for (size_t i = 0; i < array.size(); ++i)
- name << ((i == 0)? "" : "_") << ((array[i]) ? "used" : "unused" );
+ name << ((i == 0)? "" : "_") << "color" << getUsed(array[i]);
return name.str();
}
@@ -623,16 +947,42 @@
{
de::MovePtr<tcu::TestCaseGroup> testGroup (new tcu::TestCaseGroup(testCtx, "unused_clear_attachments", "Unused attachments with vkCmdClearAttachments"));
- std::vector<TestParams> testTypes;
- testTypes.emplace_back(1, renderPassType); // Single attachment.
- testTypes.emplace_back(COLOR_ATTACHMENTS_NUMBER, renderPassType); // Multiple attachments.
-
- for (auto& params : testTypes)
+ for (int depthStencilType = 0; depthStencilType < DEPTH_STENCIL_MAX_ENUM; ++depthStencilType)
{
- runCallbackOnCombination(params.isUsed, [&](const std::vector<deBool>& array) {
- std::string name = getTestName(array);
- testGroup->addChild(new UnusedClearAttachmentTest(testCtx, name, "", params));
- });
+ for (size_t i = 0; i < DE_LENGTH_OF_ARRAY(DE_BOOL_VALUES); ++i)
+ {
+ deBool depthStencilUse = DE_BOOL_VALUES[i];
+ DepthStencilType dsType = static_cast<DepthStencilType>(depthStencilType);
+ std::string dsCase = depthStencilTypeName(dsType);
+ std::vector<TestParams> testTypes;
+
+ if (hasDepthStencil(dsType))
+ testTypes.emplace_back(0, dsType, depthStencilUse, renderPassType); // No color attachments.
+ testTypes.emplace_back(1, dsType, depthStencilUse, renderPassType); // Single color attachment.
+ testTypes.emplace_back(COLOR_ATTACHMENTS_NUMBER, dsType, depthStencilUse, renderPassType); // Multiple color attachments.
+
+ for (auto& params : testTypes)
+ {
+ if (!params.colorUsed.empty())
+ {
+ runCallbackOnCombination(params.colorUsed, [&](const std::vector<deBool>& array) {
+ std::string name = getCombName(array) + "_" + dsCase;
+ if (hasDepthStencil(dsType))
+ name += std::string("_") + getUsed(depthStencilUse);
+ testGroup->addChild(new UnusedClearAttachmentTest(testCtx, name, "", params));
+ });
+ }
+ else
+ {
+ std::string name = dsCase + "_" + getUsed(depthStencilUse);
+ testGroup->addChild(new UnusedClearAttachmentTest(testCtx, name, "", params));
+ }
+
+ }
+
+ if (!hasDepthStencil(dsType))
+ break;
+ }
}
return testGroup.release();
diff --git a/external/vulkancts/modules/vulkan/robustness/vktRobustBufferAccessWithVariablePointersTests.cpp b/external/vulkancts/modules/vulkan/robustness/vktRobustBufferAccessWithVariablePointersTests.cpp
index 7ab9d7d..5728ffb 100644
--- a/external/vulkancts/modules/vulkan/robustness/vktRobustBufferAccessWithVariablePointersTests.cpp
+++ b/external/vulkancts/modules/vulkan/robustness/vktRobustBufferAccessWithVariablePointersTests.cpp
@@ -64,10 +64,7 @@
{
// A function for getting information on variable pointer features supported through physical device
-vk::VkPhysicalDeviceVariablePointersFeatures querySupportedVariablePointersFeatures (const deUint32 apiVersion,
- const InstanceInterface& vki,
- VkPhysicalDevice device,
- const std::vector<std::string>& instanceExtensions)
+vk::VkPhysicalDeviceVariablePointersFeatures querySupportedVariablePointersFeatures (const Context& context)
{
VkPhysicalDeviceVariablePointersFeatures extensionFeatures =
{
@@ -83,9 +80,9 @@
features.pNext = &extensionFeatures;
// Call the getter only if supported. Otherwise above "zero" defaults are used
- if (isInstanceExtensionSupported(apiVersion, instanceExtensions, "VK_KHR_get_physical_device_properties2"))
+ if (context.isInstanceFunctionalitySupported("VK_KHR_get_physical_device_properties2"))
{
- vki.getPhysicalDeviceFeatures2(device, &features);
+ context.getInstanceInterface().getPhysicalDeviceFeatures2(context.getPhysicalDevice(), &features);
}
return extensionFeatures;
@@ -1231,7 +1228,7 @@
TestInstance* RobustReadTest::createInstance (Context& context) const
{
- VkPhysicalDeviceVariablePointersFeatures pointerFeatures = querySupportedVariablePointersFeatures(context.getUsedApiVersion(), context.getInstanceInterface(), context.getPhysicalDevice(), context.getInstanceExtensions());
+ VkPhysicalDeviceVariablePointersFeatures pointerFeatures = querySupportedVariablePointersFeatures(context);
if (pointerFeatures.variablePointersStorageBuffer != DE_TRUE)
return new NotSupportedInstance(context, std::string("VariablePointersStorageBuffer support is required for this test."));
@@ -1271,7 +1268,7 @@
TestInstance* RobustWriteTest::createInstance (Context& context) const
{
- VkPhysicalDeviceVariablePointersFeatures pointerFeatures = querySupportedVariablePointersFeatures(context.getUsedApiVersion(), context.getInstanceInterface(), context.getPhysicalDevice(), context.getInstanceExtensions());
+ VkPhysicalDeviceVariablePointersFeatures pointerFeatures = querySupportedVariablePointersFeatures(context);
if (pointerFeatures.variablePointersStorageBuffer != DE_TRUE)
return new NotSupportedInstance(context, std::string("VariablePointersStorageBuffer support is required for this test."));
diff --git a/external/vulkancts/modules/vulkan/robustness/vktRobustnessUtil.cpp b/external/vulkancts/modules/vulkan/robustness/vktRobustnessUtil.cpp
index 991740d..4cdd332 100644
--- a/external/vulkancts/modules/vulkan/robustness/vktRobustnessUtil.cpp
+++ b/external/vulkancts/modules/vulkan/robustness/vktRobustnessUtil.cpp
@@ -23,6 +23,7 @@
*//*--------------------------------------------------------------------*/
#include "vktRobustnessUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkDefs.hpp"
#include "vkImageUtil.hpp"
#include "vkPrograms.hpp"
@@ -31,6 +32,7 @@
#include "vkTypeUtil.hpp"
#include "vkCmdUtil.hpp"
#include "vkObjUtil.hpp"
+#include "tcuCommandLine.hpp"
#include "deMath.h"
#include <iomanip>
#include <limits>
@@ -48,7 +50,7 @@
const float queuePriority = 1.0f;
// Create a universal queue that supports graphics and compute
- const VkDeviceQueueCreateInfo queueParams =
+ const VkDeviceQueueCreateInfo queueParams =
{
VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
@@ -61,7 +63,7 @@
VkPhysicalDeviceFeatures enabledFeatures = context.getDeviceFeatures();
enabledFeatures.robustBufferAccess = true;
- const VkDeviceCreateInfo deviceParams =
+ const VkDeviceCreateInfo deviceParams =
{
VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
@@ -75,8 +77,8 @@
&enabledFeatures // const VkPhysicalDeviceFeatures* pEnabledFeatures;
};
- return createDevice(context.getPlatformInterface(), context.getInstance(),
- context.getInstanceInterface(), context.getPhysicalDevice(), &deviceParams);
+ return createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), context.getPlatformInterface(),
+ context.getInstance(), context.getInstanceInterface(), context.getPhysicalDevice(), &deviceParams);
}
bool areEqual (float a, float b)
diff --git a/external/vulkancts/modules/vulkan/shaderexecutor/vktAtomicOperationTests.cpp b/external/vulkancts/modules/vulkan/shaderexecutor/vktAtomicOperationTests.cpp
index 24c8940..62b2cdb 100644
--- a/external/vulkancts/modules/vulkan/shaderexecutor/vktAtomicOperationTests.cpp
+++ b/external/vulkancts/modules/vulkan/shaderexecutor/vktAtomicOperationTests.cpp
@@ -470,12 +470,12 @@
{
if ((m_dataType == DATA_TYPE_INT64) || (m_dataType == DATA_TYPE_UINT64))
{
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_shader_atomic_int64"))
+ if (!context.isDeviceFunctionalitySupported("VK_KHR_shader_atomic_int64"))
TCU_THROW(NotSupportedError, "Missing extension: VK_KHR_shader_atomic_int64");
- VkPhysicalDeviceShaderAtomicInt64FeaturesKHR shaderAtomicInt64Features;
- deMemset(&shaderAtomicInt64Features, 0x0, sizeof(VkPhysicalDeviceShaderAtomicInt64FeaturesKHR));
- shaderAtomicInt64Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR;
+ VkPhysicalDeviceShaderAtomicInt64Features shaderAtomicInt64Features;
+ deMemset(&shaderAtomicInt64Features, 0x0, sizeof(VkPhysicalDeviceShaderAtomicInt64Features));
+ shaderAtomicInt64Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES;
shaderAtomicInt64Features.pNext = DE_NULL;
VkPhysicalDeviceFeatures2 features;
diff --git a/external/vulkancts/modules/vulkan/shaderexecutor/vktOpaqueTypeIndexingTests.cpp b/external/vulkancts/modules/vulkan/shaderexecutor/vktOpaqueTypeIndexingTests.cpp
index e6f4c5e..cf9d34b 100644
--- a/external/vulkancts/modules/vulkan/shaderexecutor/vktOpaqueTypeIndexingTests.cpp
+++ b/external/vulkancts/modules/vulkan/shaderexecutor/vktOpaqueTypeIndexingTests.cpp
@@ -1209,7 +1209,7 @@
if ((m_flags & FLAG_USE_STORAGE_BUFFER) != 0)
{
- if (!isDeviceExtensionSupported(m_context.getUsedApiVersion(), m_context.getDeviceExtensions(), "VK_KHR_storage_buffer_storage_class"))
+ if (!m_context.isDeviceFunctionalitySupported("VK_KHR_storage_buffer_storage_class"))
TCU_THROW(NotSupportedError, "VK_KHR_storage_buffer_storage_class is not supported");
}
diff --git a/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderBuiltinPrecisionTests.cpp b/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderBuiltinPrecisionTests.cpp
index 4fee160..27ed87f 100644
--- a/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderBuiltinPrecisionTests.cpp
+++ b/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderBuiltinPrecisionTests.cpp
@@ -145,7 +145,7 @@
if ((toCheck & EXT16BITSTORAGEFEATURES_INPUT_OUTPUT) != 0 && extensionFeatures.storageInputOutput16 == VK_FALSE)
TCU_THROW(NotSupportedError, "Requested 16bit storage features not supported");
- if (!context.getFloat16Int8Features().shaderFloat16)
+ if (!context.getShaderFloat16Int8Features().shaderFloat16)
TCU_THROW(NotSupportedError, "Requested 16-bit floats (halfs) are not supported in shader code");
}
@@ -2596,9 +2596,6 @@
template <typename T>
ExprP<T> exp (const ExprP<T>& x) { return app<Exp< Signature<T, T> > >(x); }
-//ExprP<deFloat16> exp2 (const ExprP<deFloat16>& x) { return app<Exp2< Signature<deFloat16, deFloat16> > >(x); }
-//ExprP<deFloat16> exp (const ExprP<deFloat16>& x) { return app<Exp< Signature<deFloat16, deFloat16> > >(x); }
-
template <class T>
class LogFunc : public CFloatFunc1<T>
{
@@ -2622,10 +2619,7 @@
return (0.5 <= x && x <= 2.0) ? deLdExp(1.0, -21) : ctx.format.ulp(ret, 3.0);
case glu::PRECISION_MEDIUMP:
case glu::PRECISION_LAST:
- if (ctx.isShaderFloat16Int8)
- return (0.5 <= x && x <= 2.0) ? deLdExp(1.0, -7) : ctx.format.ulp(ret, 3.0);
- else
- return (0.5 <= x && x <= 2.0) ? deLdExp(1.0, -7) : ctx.format.ulp(ret, 2.0);
+ return (0.5 <= x && x <= 2.0) ? deLdExp(1.0, -7) : ctx.format.ulp(ret, 3.0);
default:
DE_FATAL("Impossible");
}
@@ -2864,11 +2858,9 @@
template<>
double TrigFunc<Signature<float, float> >::precision(const EvalContext& ctx, double ret, double arg) const
{
- DE_ASSERT(!ctx.isShaderFloat16Int8 || (-DE_PI_DOUBLE <= arg && arg <= DE_PI_DOUBLE));
-
+ DE_UNREF(ret);
if (ctx.floatPrecision == glu::PRECISION_HIGHP)
{
- // Use precision from OpenCL fast relaxed math
if (-DE_PI_DOUBLE <= arg && arg <= DE_PI_DOUBLE)
return deLdExp(1.0, -11);
else
@@ -2883,16 +2875,11 @@
DE_ASSERT(ctx.floatPrecision == glu::PRECISION_MEDIUMP || ctx.floatPrecision == glu::PRECISION_LAST);
if (-DE_PI_DOUBLE <= arg && arg <= DE_PI_DOUBLE)
- {
- if (ctx.isShaderFloat16Int8)
- return deLdExp(1.0, -7);
- else
- return ctx.format.ulp(ret, 2.0); // from OpenCL half-float extension specification
- }
+ return deLdExp(1.0, -7);
else
{
- // |x| * 2^-10, slightly larger than 2 ULP at x == pi
- return deLdExp(deAbs(arg), -10);
+ // |x| * 2^-8, slightly larger than 2^-7 at x == pi
+ return deLdExp(deAbs(arg), -8);
}
}
}
@@ -2972,7 +2959,7 @@
if (!m_domain.contains(x))
return TCU_NAN;
- // Form the spec 5 ULP.
+ // From the spec 5 ULP.
return ctx.format.ulp(ret, 5.0);
}
@@ -2985,7 +2972,7 @@
if (ctx.floatPrecision == glu::PRECISION_HIGHP)
return ctx.format.ulp(ret, 4096.0);
else
- return ctx.format.ulp(ret, ctx.isShaderFloat16Int8 ? 5.0 : 2.0);
+ return ctx.format.ulp(ret, 5.0);
}
class ASin : public CFloatFunc1<Signature<float, float> >
@@ -5120,9 +5107,11 @@
Random& rnd,
const Interval& inputRange) const
{
+ DE_UNREF(prec);
+ // No testing of subnormals. TODO: Could integrate float controls for some operations.
const int minExp = format.getMinExp();
const int maxExp = format.getMaxExp();
- const bool haveSubnormal = format.hasSubnormal() != tcu::NO;
+ const bool haveSubnormal = false;
const float midpoint = static_cast<float>(inputRange.midpoint());
// Choose exponent so that the cumulative distribution is cubic.
@@ -5173,34 +5162,7 @@
// Produce positive numbers more often than negative.
value = (rnd.getInt(0, 3) == 0 ? -1.0f : 1.0f) * (base + significand);
- value = inputRange.contains(static_cast<double>(value)) ? value : midpoint;
-
- //not denormalized values
- {
- DE_ASSERT(sizeof(float) == sizeof(deUint32));
-
- const deUint32 mantissa = 0x007fffff;
- const deUint32 exponent = 0x7f800000;
- deUint32 valueInt = 0u;
- deMemcpy(&valueInt, &value, sizeof(deUint32));
-
- if((exponent & valueInt) == 0 && (mantissa & valueInt) != 0)
- {
- deUint32 toReturn = 0x00800000 | valueInt;
- deMemcpy(&value, &toReturn, sizeof(float));
- }
-
- // For 16bit-but-32bit-storage tests we must also avoid any value that
- // becomes a denorm in fp16. The tests don't specify a rounding mode so
- // assume the worst and use round-to-zero. Add an offset to put values
- // back into the normal range.
- // NOTE: The large offset means that all denorms will come out equal,
- // except for differences that will round away in fp16. This catches
- // some cases of operations incorrectly using the full fp32 precision.
- if (prec == glu::PRECISION_LAST && isDenorm16(deFloat32To16Round(value, DE_ROUNDINGMODE_TO_ZERO)))
- value += 1.0099f;
- }
- return value;
+ return inputRange.contains(static_cast<double>(value)) ? value : midpoint;
}
//! Generate a standard set of floats that should always be tested.
@@ -5267,7 +5229,7 @@
DE_UNREF(prec);
const int minExp = format.getMinExp();
const int maxExp = format.getMaxExp();
- const bool haveSubnormal = format.hasSubnormal() != tcu::NO;
+ const bool haveSubnormal = false;
const deUint16 midpoint = deFloat32To16Round(static_cast<float>(inputRange.midpoint()), DE_ROUNDINGMODE_TO_NEAREST_EVEN);
// Choose exponent so that the cumulative distribution is cubic.
@@ -5319,10 +5281,6 @@
float value = (rnd.getInt(0, 3) == 0 ? -1.0f : 1.0f) * (base + significand);
deFloat16 value16b = deFloat32To16Round(value, DE_ROUNDINGMODE_TO_NEAREST_EVEN);
- // Offset denormalised values to put them into the normal range
- if (isDenorm16(value16b))
- value16b = 0x4000 | value16b;
-
return inputRange.contains(static_cast<double>(value16b)) ? value16b : midpoint;
}
@@ -5712,7 +5670,7 @@
env.lookup(*m_variables.in3) = convert<In3>(fmt, round(fmt, inputs.in3[valueNdx]));
{
- EvalContext ctx (fmt, m_caseCtx.precision, env, 0, m_context.getFloat16Int8Features().shaderFloat16 != 0u);
+ EvalContext ctx (fmt, m_caseCtx.precision, env, 0, m_context.getShaderFloat16Int8Features().shaderFloat16 != 0u);
m_stmt->execute(ctx);
switch (outCount)
@@ -6260,7 +6218,7 @@
string m_name;
};
-template <template <int, class T> class GenF>
+template <template <int, class> class GenF, typename T>
class TemplateFuncCaseFactory : public FuncCaseFactory
{
public:
@@ -6268,34 +6226,15 @@
{
TestCaseGroup* group = new TestCaseGroup(ctx.testContext, ctx.name.c_str(), ctx.name.c_str());
- group->addChild(createFuncCase(ctx, "scalar", instance<GenF<1, float> >()));
- group->addChild(createFuncCase(ctx, "vec2", instance<GenF<2, float> >()));
- group->addChild(createFuncCase(ctx, "vec3", instance<GenF<3, float> >()));
- group->addChild(createFuncCase(ctx, "vec4", instance<GenF<4, float> >()));
+ group->addChild(createFuncCase(ctx, "scalar", instance<GenF<1, T> >()));
+ group->addChild(createFuncCase(ctx, "vec2", instance<GenF<2, T> >()));
+ group->addChild(createFuncCase(ctx, "vec3", instance<GenF<3, T> >()));
+ group->addChild(createFuncCase(ctx, "vec4", instance<GenF<4, T> >()));
return MovePtr<TestNode>(group);
}
- const FuncBase& getFunc (void) const { return instance<GenF<1, float> >(); }
-};
-
-template <template <int, class T> class GenF>
-class TemplateFuncCaseFactory16Bit : public FuncCaseFactory
-{
-public:
- MovePtr<TestNode> createCase (const CaseContext& ctx) const
- {
- TestCaseGroup* group = new TestCaseGroup(ctx.testContext, ctx.name.c_str(), ctx.name.c_str());
-
- group->addChild(createFuncCase(ctx, "scalar", instance<GenF<1, deFloat16> >()));
- group->addChild(createFuncCase(ctx, "vec2", instance<GenF<2, deFloat16> >()));
- group->addChild(createFuncCase(ctx, "vec3", instance<GenF<3, deFloat16> >()));
- group->addChild(createFuncCase(ctx, "vec4", instance<GenF<4, deFloat16> >()));
-
- return MovePtr<TestNode>(group);
- }
-
- const FuncBase& getFunc (void) const { return instance<GenF<1, deFloat16> >(); }
+ const FuncBase& getFunc (void) const { return instance<GenF<1, T> >(); }
};
template <template <int> class GenF>
@@ -6319,7 +6258,7 @@
const FuncBase& getFunc (void) const { return instance<GenF<2> >(); }
};
-template <template <int, int, class> class GenF>
+template <template <int, int, class> class GenF, typename T>
class MatrixFuncCaseFactory : public FuncCaseFactory
{
public:
@@ -6327,55 +6266,23 @@
{
TestCaseGroup* const group = new TestCaseGroup(ctx.testContext, ctx.name.c_str(), ctx.name.c_str());
- this->addCase<2, 2, float >(ctx, group);
- this->addCase<3, 2, float >(ctx, group);
- this->addCase<4, 2, float >(ctx, group);
- this->addCase<2, 3, float >(ctx, group);
- this->addCase<3, 3, float >(ctx, group);
- this->addCase<4, 3, float >(ctx, group);
- this->addCase<2, 4, float >(ctx, group);
- this->addCase<3, 4, float >(ctx, group);
- this->addCase<4, 4, float >(ctx, group);
+ this->addCase<2, 2>(ctx, group);
+ this->addCase<3, 2>(ctx, group);
+ this->addCase<4, 2>(ctx, group);
+ this->addCase<2, 3>(ctx, group);
+ this->addCase<3, 3>(ctx, group);
+ this->addCase<4, 3>(ctx, group);
+ this->addCase<2, 4>(ctx, group);
+ this->addCase<3, 4>(ctx, group);
+ this->addCase<4, 4>(ctx, group);
return MovePtr<TestNode>(group);
}
- const FuncBase& getFunc (void) const { return instance<GenF<2,2, float> >(); }
+ const FuncBase& getFunc (void) const { return instance<GenF<2,2, T> >(); }
private:
- template <int Rows, int Cols, class T>
- void addCase (const CaseContext& ctx, TestCaseGroup* group) const
- {
- const char* const name = dataTypeNameOf<Matrix<float, Rows, Cols> >();
- group->addChild(createFuncCase(ctx, name, instance<GenF<Rows, Cols, T> >()));
- }
-};
-
-template <template <int, int, class> class GenF>
-class MatrixFuncCaseFactory16Bit : public FuncCaseFactory
-{
-public:
- MovePtr<TestNode> createCase (const CaseContext& ctx) const
- {
- TestCaseGroup* const group = new TestCaseGroup(ctx.testContext, ctx.name.c_str(), ctx.name.c_str());
-
- this->addCase<2, 2, deFloat16 >(ctx, group);
- this->addCase<3, 2, deFloat16 >(ctx, group);
- this->addCase<4, 2, deFloat16 >(ctx, group);
- this->addCase<2, 3, deFloat16 >(ctx, group);
- this->addCase<3, 3, deFloat16 >(ctx, group);
- this->addCase<4, 3, deFloat16 >(ctx, group);
- this->addCase<2, 4, deFloat16 >(ctx, group);
- this->addCase<3, 4, deFloat16 >(ctx, group);
- this->addCase<4, 4, deFloat16 >(ctx, group);
-
- return MovePtr<TestNode>(group);
- }
-
- const FuncBase& getFunc (void) const { return instance<GenF<2, 2, deFloat16> >(); }
-
-private:
- template <int Rows, int Cols, class T>
+ template <int Rows, int Cols>
void addCase (const CaseContext& ctx, TestCaseGroup* group) const
{
const char* const name = dataTypeNameOf<Matrix<float, Rows, Cols> >();
@@ -6501,18 +6408,18 @@
addScalarFactory<Step< Signature<float, float, float> > >(*funcs);
addScalarFactory<SmoothStep< Signature<float, float, float, float> > >(*funcs);
- funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory<Length>()));
- funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory<Distance>()));
- funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory<Dot>()));
+ funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory<Length, float>()));
+ funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory<Distance, float>()));
+ funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory<Dot, float>()));
funcs->addFactory(createSimpleFuncCaseFactory<Cross>());
- funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory<Normalize>()));
- funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory<FaceForward>()));
- funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory<Reflect>()));
- funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory<Refract>()));
+ funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory<Normalize, float>()));
+ funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory<FaceForward, float>()));
+ funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory<Reflect, float>()));
+ funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory<Refract, float>()));
- funcs->addFactory(SharedPtr<const CaseFactory>(new MatrixFuncCaseFactory<MatrixCompMult>()));
- funcs->addFactory(SharedPtr<const CaseFactory>(new MatrixFuncCaseFactory<OuterProduct>()));
- funcs->addFactory(SharedPtr<const CaseFactory>(new MatrixFuncCaseFactory<Transpose>()));
+ funcs->addFactory(SharedPtr<const CaseFactory>(new MatrixFuncCaseFactory<MatrixCompMult, float>()));
+ funcs->addFactory(SharedPtr<const CaseFactory>(new MatrixFuncCaseFactory<OuterProduct, float>()));
+ funcs->addFactory(SharedPtr<const CaseFactory>(new MatrixFuncCaseFactory<Transpose, float>()));
funcs->addFactory(SharedPtr<const CaseFactory>(new SquareMatrixFuncCaseFactory<Determinant>()));
funcs->addFactory(SharedPtr<const CaseFactory>(new SquareMatrixFuncCaseFactory<Inverse>()));
@@ -6578,17 +6485,17 @@
addScalarFactory<Step< Signature<deFloat16, deFloat16, deFloat16> > >(*funcs);
addScalarFactory<SmoothStep< Signature<deFloat16, deFloat16, deFloat16, deFloat16> > >(*funcs);
- funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory16Bit<Length>()));
- funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory16Bit<Distance>()));
- funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory16Bit<Dot>()));
+ funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory<Length, deFloat16>()));
+ funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory<Distance, deFloat16>()));
+ funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory<Dot, deFloat16>()));
funcs->addFactory(createSimpleFuncCaseFactory<Cross16Bit>());
- funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory16Bit<Normalize>()));
- funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory16Bit<FaceForward>()));
- funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory16Bit<Reflect>()));
- funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory16Bit<Refract>()));
+ funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory<Normalize, deFloat16>()));
+ funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory<FaceForward, deFloat16>()));
+ funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory<Reflect, deFloat16>()));
+ funcs->addFactory(SharedPtr<const CaseFactory>(new TemplateFuncCaseFactory<Refract, deFloat16>()));
- funcs->addFactory(SharedPtr<const CaseFactory>(new MatrixFuncCaseFactory16Bit<OuterProduct>()));
- funcs->addFactory(SharedPtr<const CaseFactory>(new MatrixFuncCaseFactory16Bit<Transpose>()));
+ funcs->addFactory(SharedPtr<const CaseFactory>(new MatrixFuncCaseFactory<OuterProduct, deFloat16>()));
+ funcs->addFactory(SharedPtr<const CaseFactory>(new MatrixFuncCaseFactory<Transpose, deFloat16>()));
funcs->addFactory(SharedPtr<const CaseFactory>(new SquareMatrixFuncCaseFactory<Determinant16bit>()));
funcs->addFactory(SharedPtr<const CaseFactory>(new SquareMatrixFuncCaseFactory<Inverse16bit>()));
@@ -6606,7 +6513,7 @@
tcu::MAYBE, // subnormals
tcu::YES, // infinities
tcu::MAYBE); // NaN
- const FloatFormat mediump (-13, 13, 9, false, tcu::MAYBE);
+ const FloatFormat mediump (-14, 13, 10, false, tcu::MAYBE);
for (int precNdx = glu::PRECISION_MEDIUMP; precNdx < glu::PRECISION_LAST; ++precNdx)
{
diff --git a/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderClockTests.cpp b/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderClockTests.cpp
index 412b6c4..e89f07a 100644
--- a/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderClockTests.cpp
+++ b/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderClockTests.cpp
@@ -122,7 +122,7 @@
private:
void checkSupported(void)
{
- m_context.requireDeviceExtension("VK_KHR_shader_clock");
+ m_context.requireDeviceFunctionality("VK_KHR_shader_clock");
VkPhysicalDeviceShaderClockFeaturesKHR shaderClockFeatures;
shaderClockFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR;
diff --git a/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderCommonFunctionTests.cpp b/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderCommonFunctionTests.cpp
index 5470df7..c777ccd 100644
--- a/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderCommonFunctionTests.cpp
+++ b/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderCommonFunctionTests.cpp
@@ -529,6 +529,34 @@
}
};
+static void infNanRandomFloats(int numValues, void* const* values, const char *name, const ShaderSpec& spec)
+{
+ de::Random rnd (deStringHash(name) ^ 0xc2a39fu);
+ const glu::DataType type = spec.inputs[0].varType.getBasicType();
+ const glu::Precision precision = spec.inputs[0].varType.getPrecision();
+ const int scalarSize = glu::getDataTypeScalarSize(type);
+ const int mantissaBits = getMinMantissaBits(precision);
+ const deUint32 mantissaMask = ~getMaxUlpDiffFromBits(mantissaBits) & ((1u<<23)-1u);
+
+ for (int valNdx = 0; valNdx < numValues*scalarSize; valNdx++)
+ {
+ // Roughly 25% chance of each of Inf and NaN
+ const bool isInf = rnd.getFloat() > 0.75f;
+ const bool isNan = !isInf && rnd.getFloat() > 0.66f;
+ const deUint32 m = rnd.getUint32() & mantissaMask;
+ const deUint32 e = rnd.getUint32() & 0xffu;
+ const deUint32 sign = rnd.getUint32() & 0x1u;
+ // Ensure the 'quiet' bit is set on NaNs (also ensures we don't generate inf by mistake)
+ const deUint32 mantissa = isInf ? 0 : (isNan ? ((1u<<22) | m) : m);
+ const deUint32 exp = (isNan || isInf) ? 0xffu : deMin32(e, 0x7fu);
+ const deUint32 value = (sign << 31) | (exp << 23) | mantissa;
+
+ DE_ASSERT(tcu::Float32(value).isInf() == isInf && tcu::Float32(value).isNaN() == isNan);
+
+ ((deUint32*)values[0])[valNdx] = value;
+ }
+}
+
class IsnanCaseInstance : public CommonFunctionTestInstance
{
public:
@@ -539,26 +567,7 @@
void getInputValues (int numValues, void* const* values) const
{
- de::Random rnd (deStringHash(m_name) ^ 0xc2a39fu);
- const glu::DataType type = m_spec.inputs[0].varType.getBasicType();
- const glu::Precision precision = m_spec.inputs[0].varType.getPrecision();
- const int scalarSize = glu::getDataTypeScalarSize(type);
- const int mantissaBits = getMinMantissaBits(precision);
- const deUint32 mantissaMask = ~getMaxUlpDiffFromBits(mantissaBits) & ((1u<<23)-1u);
-
- for (int valNdx = 0; valNdx < numValues*scalarSize; valNdx++)
- {
- const bool isNan = rnd.getFloat() > 0.3f;
- const bool isInf = !isNan && rnd.getFloat() > 0.4f;
- const deUint32 mantissa = !isInf ? ((1u<<22) | (rnd.getUint32() & mantissaMask)) : 0;
- const deUint32 exp = !isNan && !isInf ? (rnd.getUint32() & 0x7fu) : 0xffu;
- const deUint32 sign = rnd.getUint32() & 0x1u;
- const deUint32 value = (sign << 31) | (exp << 23) | mantissa;
-
- DE_ASSERT(tcu::Float32(value).isInf() == isInf && tcu::Float32(value).isNaN() == isNan);
-
- ((deUint32*)values[0])[valNdx] = value;
- }
+ infNanRandomFloats(numValues, values, m_name, m_spec);
}
bool compare (const void* const* inputs, const void* const* outputs)
@@ -636,26 +645,7 @@
void getInputValues (int numValues, void* const* values) const
{
- de::Random rnd (deStringHash(m_name) ^ 0xc2a39fu);
- const glu::DataType type = m_spec.inputs[0].varType.getBasicType();
- const glu::Precision precision = m_spec.inputs[0].varType.getPrecision();
- const int scalarSize = glu::getDataTypeScalarSize(type);
- const int mantissaBits = getMinMantissaBits(precision);
- const deUint32 mantissaMask = ~getMaxUlpDiffFromBits(mantissaBits) & ((1u<<23)-1u);
-
- for (int valNdx = 0; valNdx < numValues*scalarSize; valNdx++)
- {
- const bool isInf = rnd.getFloat() > 0.3f;
- const bool isNan = !isInf && rnd.getFloat() > 0.4f;
- const deUint32 mantissa = !isInf ? ((1u<<22) | (rnd.getUint32() & mantissaMask)) : 0;
- const deUint32 exp = !isNan && !isInf ? (rnd.getUint32() & 0x7fu) : 0xffu;
- const deUint32 sign = rnd.getUint32() & 0x1u;
- const deUint32 value = (sign << 31) | (exp << 23) | mantissa;
-
- DE_ASSERT(tcu::Float32(value).isInf() == isInf && tcu::Float32(value).isNaN() == isNan);
-
- ((deUint32*)values[0])[valNdx] = value;
- }
+ infNanRandomFloats(numValues, values, m_name, m_spec);
}
bool compare (const void* const* inputs, const void* const* outputs)
diff --git a/external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderDiscardTests.cpp b/external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderDiscardTests.cpp
index 8af40be..750d354 100644
--- a/external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderDiscardTests.cpp
+++ b/external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderDiscardTests.cpp
@@ -156,7 +156,7 @@
void ShaderDiscardCase::checkSupport(Context& context) const
{
- if (m_demote && !context.getShaderDemoteToHelperInvocationFeatures().shaderDemoteToHelperInvocation)
+ if (m_demote && !context.getShaderDemoteToHelperInvocationFeaturesEXT().shaderDemoteToHelperInvocation)
TCU_THROW(NotSupportedError, "VK_EXT_shader_demote_to_helper_invocation not supported");
}
diff --git a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.cpp b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.cpp
index 4e59a9a..4476c3f 100644
--- a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.cpp
+++ b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.cpp
@@ -23,6 +23,7 @@
#include "vktSparseResourcesBase.hpp"
#include "vktSparseResourcesTestsUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkMemUtil.hpp"
#include "vkRefUtil.hpp"
#include "vkTypeUtil.hpp"
@@ -81,8 +82,8 @@
if (m_useDeviceGroups)
{
const std::vector<std::string> requiredExtensions(1, "VK_KHR_device_group_creation");
- m_deviceGroupInstance = createInstanceWithExtensions(m_context.getPlatformInterface(), m_context.getUsedApiVersion(), requiredExtensions);
- devGroupProperties = enumeratePhysicalDeviceGroups(m_context.getInstanceInterface(), m_deviceGroupInstance.get());
+ m_deviceGroupInstance = createCustomInstanceWithExtensions(m_context, requiredExtensions);
+ devGroupProperties = enumeratePhysicalDeviceGroups(m_context.getInstanceInterface(), m_deviceGroupInstance);
m_numPhysicalDevices = devGroupProperties[m_deviceGroupIdx].physicalDeviceCount;
m_physicalDevices.clear();
@@ -100,7 +101,7 @@
deviceExtensions.push_back("VK_KHR_device_group");
}
- const VkInstance& instance(m_useDeviceGroups ? m_deviceGroupInstance.get() : m_context.getInstance());
+ const VkInstance& instance(m_useDeviceGroups ? m_deviceGroupInstance : m_context.getInstance());
InstanceDriver instanceDriver(m_context.getPlatformInterface(), instance);
const VkPhysicalDevice physicalDevice = getPhysicalDevice();
deUint32 queueFamilyPropertiesCount = 0u;
@@ -188,7 +189,7 @@
&deviceFeatures, // const VkPhysicalDeviceFeatures* pEnabledFeatures;
};
- m_logicalDevice = createDevice(m_context.getPlatformInterface(), instance, instanceDriver, physicalDevice, &deviceInfo);
+ m_logicalDevice = createCustomDevice(m_context.getTestContext().getCommandLine().isValidationEnabled(), m_context.getPlatformInterface(), instance, instanceDriver, physicalDevice, &deviceInfo);
m_deviceDriver = de::MovePtr<DeviceDriver>(new DeviceDriver(m_context.getPlatformInterface(), instance, *m_logicalDevice));
m_allocator = de::MovePtr<Allocator>(new SimpleAllocator(*m_deviceDriver, *m_logicalDevice, getPhysicalDeviceMemoryProperties(instanceDriver, physicalDevice)));
diff --git a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.hpp b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.hpp
index a82eeb5..f14a37f 100644
--- a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.hpp
+++ b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.hpp
@@ -25,6 +25,7 @@
#include "vkDefs.hpp"
#include "vktTestCase.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkRef.hpp"
#include "vkPlatform.hpp"
#include "deUniquePtr.hpp"
@@ -84,7 +85,7 @@
private:
bool m_useDeviceGroups;
deUint32 m_deviceGroupIdx;
- vk::Move<vk::VkInstance> m_deviceGroupInstance;
+ CustomInstance m_deviceGroupInstance;
std::vector<vk::VkPhysicalDevice> m_physicalDevices;
std::map<vk::VkQueueFlags, std::vector<Queue> > m_queues;
de::MovePtr<vk::DeviceDriver> m_deviceDriver;
diff --git a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBufferTests.cpp b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBufferTests.cpp
index 8ac3bfe..08a367b 100755
--- a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBufferTests.cpp
+++ b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBufferTests.cpp
@@ -650,7 +650,7 @@
m_sharedQueueFamilyIndices[0] = m_sparseQueue.queueFamilyIndex;
m_sharedQueueFamilyIndices[1] = m_universalQueue.queueFamilyIndex;
- m_colorBuffer = makeBuffer(vk, getDevice(), makeBufferCreateInfo(m_colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
+ m_colorBuffer = makeBuffer(vk, getDevice(), m_colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
m_colorBufferAlloc = bindBuffer(vk, getDevice(), getAllocator(), *m_colorBuffer, MemoryRequirement::HostVisible);
deMemset(m_colorBufferAlloc->getHostPtr(), 0, static_cast<std::size_t>(m_colorBufferSize));
@@ -920,7 +920,7 @@
const VkDeviceSize stagingBufferSize = sparseAllocation->resourceSize - (hasAliasedChunk ? chunkSize : 0);
const deUint32 numBufferEntries = static_cast<deUint32>(stagingBufferSize / sizeof(IVec4));
- const Unique<VkBuffer> stagingBuffer (makeBuffer(vk, getDevice(), makeBufferCreateInfo(stagingBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT)));
+ const Unique<VkBuffer> stagingBuffer (makeBuffer(vk, getDevice(), stagingBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT));
const UniquePtr<Allocation> stagingBufferAlloc (bindBuffer(vk, getDevice(), getAllocator(), *stagingBuffer, MemoryRequirement::HostVisible));
{
@@ -990,7 +990,7 @@
const VkDeviceSize vertexBufferSize = sizeof(vertexData);
- m_vertexBuffer = makeBuffer(vk, getDevice(), makeBufferCreateInfo(vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
+ m_vertexBuffer = makeBuffer(vk, getDevice(), vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
m_vertexBufferAlloc = bindBuffer(vk, getDevice(), getAllocator(), *m_vertexBuffer, MemoryRequirement::HostVisible);
deMemcpy(m_vertexBufferAlloc->getHostPtr(), &vertexData[0], vertexBufferSize);
@@ -1163,7 +1163,7 @@
m_perDrawBufferOffset = m_sparseAllocation->resourceSize / m_sparseAllocation->numResourceChunks;
m_stagingBufferSize = 2 * m_perDrawBufferOffset;
- m_stagingBuffer = makeBuffer(vk, getDevice(), makeBufferCreateInfo(m_stagingBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT));
+ m_stagingBuffer = makeBuffer(vk, getDevice(), m_stagingBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
m_stagingBufferAlloc = bindBuffer(vk, getDevice(), getAllocator(), *m_stagingBuffer, MemoryRequirement::HostVisible);
}
@@ -1341,7 +1341,7 @@
// Vertex buffer
const DeviceInterface& vk = getDeviceInterface();
const VkDeviceSize vertexBufferSize = 2 * m_halfVertexCount * sizeof(Vec4);
- m_vertexBuffer = makeBuffer(vk, getDevice(), makeBufferCreateInfo(vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
+ m_vertexBuffer = makeBuffer(vk, getDevice(), vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
m_vertexBufferAlloc = bindBuffer(vk, getDevice(), getAllocator(), *m_vertexBuffer, MemoryRequirement::HostVisible);
{
@@ -1406,7 +1406,7 @@
// Vertex buffer
const DeviceInterface& vk = getDeviceInterface();
const VkDeviceSize vertexBufferSize = 2 * 3 * sizeof(Vec4);
- m_vertexBuffer = makeBuffer(vk, getDevice(), makeBufferCreateInfo(vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
+ m_vertexBuffer = makeBuffer(vk, getDevice(), vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
m_vertexBufferAlloc = bindBuffer(vk, getDevice(), getAllocator(), *m_vertexBuffer, MemoryRequirement::HostVisible);
{
diff --git a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesTestsUtil.cpp b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesTestsUtil.cpp
index c1218a3..ebb707c 100644
--- a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesTestsUtil.cpp
+++ b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesTestsUtil.cpp
@@ -262,20 +262,6 @@
return createComputePipeline(vk, device, DE_NULL , &pipelineCreateInfo);
}
-de::MovePtr<Allocation> bindImage (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkImage image, const MemoryRequirement requirement)
-{
- de::MovePtr<Allocation> alloc = allocator.allocate(getImageMemoryRequirements(vk, device, image), requirement);
- VK_CHECK(vk.bindImageMemory(device, image, alloc->getMemory(), alloc->getOffset()));
- return alloc;
-}
-
-de::MovePtr<Allocation> bindBuffer (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkBuffer buffer, const MemoryRequirement requirement)
-{
- de::MovePtr<Allocation> alloc(allocator.allocate(getBufferMemoryRequirements(vk, device, buffer), requirement));
- VK_CHECK(vk.bindBufferMemory(device, buffer, alloc->getMemory(), alloc->getOffset()));
- return alloc;
-}
-
void submitCommands (const DeviceInterface& vk,
const VkQueue queue,
const VkCommandBuffer commandBuffer,
diff --git a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesTestsUtil.hpp b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesTestsUtil.hpp
index 8ee2965..dce403c 100644
--- a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesTestsUtil.hpp
+++ b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesTestsUtil.hpp
@@ -139,18 +139,6 @@
const vk::VkShaderModule shaderModule,
const vk::VkSpecializationInfo* specializationInfo = 0);
-de::MovePtr<vk::Allocation> bindImage (const vk::DeviceInterface& vk,
- const vk::VkDevice device,
- vk::Allocator& allocator,
- const vk::VkImage image,
- const vk::MemoryRequirement requirement);
-
-de::MovePtr<vk::Allocation> bindBuffer (const vk::DeviceInterface& vk,
- const vk::VkDevice device,
- vk::Allocator& allocator,
- const vk::VkBuffer buffer,
- const vk::MemoryRequirement requirement);
-
vk::VkBufferImageCopy makeBufferImageCopy (const vk::VkExtent3D extent,
const deUint32 layersCount,
const deUint32 mipmapLevel = 0u,
@@ -221,16 +209,6 @@
deUint32 getSparseAspectRequirementsIndex (const std::vector<vk::VkSparseImageMemoryRequirements>& requirements,
const vk::VkImageAspectFlags aspectFlags);
-inline vk::Move<vk::VkBuffer> makeBuffer (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkBufferCreateInfo& createInfo)
-{
- return createBuffer(vk, device, &createInfo);
-}
-
-inline vk::Move<vk::VkImage> makeImage (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkImageCreateInfo& createInfo)
-{
- return createImage(vk, device, &createInfo);
-}
-
template<typename T>
inline de::SharedPtr<vk::Unique<T> > makeVkSharedPtr (vk::Move<T> vkMove)
{
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/CMakeLists.txt b/external/vulkancts/modules/vulkan/spirv_assembly/CMakeLists.txt
index acbaad7..6ea1b4b 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/CMakeLists.txt
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/CMakeLists.txt
@@ -43,6 +43,8 @@
vktSpvAsmVariableInitTests.hpp
vktSpvAsmVariablePointersTests.cpp
vktSpvAsmVariablePointersTests.hpp
+ vktSpvAsmSpirvVersion1p4Tests.cpp
+ vktSpvAsmSpirvVersion1p4Tests.hpp
vktSpvAsmSpirvVersionTests.cpp
vktSpvAsmSpirvVersionTests.hpp
vktSpvAsmLoopDepLenTests.cpp
@@ -55,6 +57,8 @@
vktSpvAsmWorkgroupMemoryTests.hpp
vktSpvAsmPtrAccessChainTests.cpp
vktSpvAsmPtrAccessChainTests.hpp
+ vktSpvAsmFloatControlsExtensionlessTests.cpp
+ vktSpvAsmFloatControlsExtensionlessTests.hpp
)
set(DEQP_VK_SPIRV_ASSEMBLY_LIBS
@@ -71,6 +75,7 @@
elseif (DE_COMPILER_IS_MSC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4068")
endif()
+include_directories("../../../../amber/src/include")
include_directories("../amber")
add_library(deqp-vk-spirv-assembly STATIC ${DEQP_VK_SPIRV_ASSEMBLY_SRCS})
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsm16bitStorageTests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsm16bitStorageTests.cpp
index 7248f07..4dad8c7 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsm16bitStorageTests.cpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsm16bitStorageTests.cpp
@@ -48,6 +48,7 @@
#include "vktSpvAsmComputeShaderCase.hpp"
#include "vktSpvAsmComputeShaderTestUtil.hpp"
#include "vktSpvAsmGraphicsShaderTestUtil.hpp"
+#include "vktSpvAsmUtils.hpp"
#include "vktTestCaseUtil.hpp"
#include "vktTestGroupUtil.hpp"
@@ -3637,6 +3638,7 @@
struct Case
{
const char* name;
+ const char* interfaceOpCall;
const char* interfaceOpFunc;
const char* postInterfaceOp;
const char* postInterfaceOpGeom;
@@ -3652,12 +3654,8 @@
{
{ // Scalar cases
"scalar",
- // Passthrough interface_op_func
- "%interface_op_func = OpFunction %f16 None %f16_f32_function\n"
- " %io_param1 = OpFunctionParameter %f32\n"
- " %entry = OpLabel\n"
- " OpReturnValue %f16_0\n"
- " OpFunctionEnd\n",
+ "OpFConvert %f16",
+ "",
" %ret0 = OpFConvert %f16 %IF_input_val\n"
" OpStore %IF_output %ret0\n",
@@ -3678,8 +3676,7 @@
" %op_a3f16 = OpTypePointer Output %a3f16\n"
"%f16_f32_function = OpTypeFunction %f16 %f32\n"
" %a3f32 = OpTypeArray %f32 %c_i32_3\n"
- " %ip_a3f32 = OpTypePointer Input %a3f32\n"
- " %f16_0 = OpConstant %f16 0\n",
+ " %ip_a3f32 = OpTypePointer Input %a3f32\n",
"f32",
"f16",
@@ -3689,11 +3686,8 @@
{ // Vector cases
"vector",
- "%interface_op_func = OpFunction %v2f16 None %v2f16_v2f32_function\n"
- " %io_param1 = OpFunctionParameter %v2f32\n"
- " %entry = OpLabel\n"
- " OpReturnValue %v2f16_0\n"
- " OpFunctionEnd\n",
+ "OpFConvert %v2f16",
+ "",
" %ret0 = OpFConvert %v2f16 %IF_input_val\n"
" OpStore %IF_output %ret0\n",
@@ -3715,9 +3709,7 @@
" %op_a3v2f16 = OpTypePointer Output %a3v2f16\n"
"%v2f16_v2f32_function = OpTypeFunction %v2f16 %v2f32\n"
" %a3v2f32 = OpTypeArray %v2f32 %c_i32_3\n"
- " %ip_a3v2f32 = OpTypePointer Input %a3v2f32\n"
- " %f16_0 = OpConstant %f16 0\n"
- " %v2f16_0 = OpConstantComposite %v2f16 %f16_0 %f16_0\n",
+ " %ip_a3v2f32 = OpTypePointer Input %a3v2f32\n",
"v2f32",
"v2f16",
@@ -3732,6 +3724,7 @@
for (deUint32 caseIdx = 0; caseIdx < DE_LENGTH_OF_ARRAY(cases); ++caseIdx)
for (deUint32 rndModeIdx = 0; rndModeIdx < DE_LENGTH_OF_ARRAY(rndModes); ++rndModeIdx)
{
+ fragments["interface_op_call"] = cases[caseIdx].interfaceOpCall;
fragments["interface_op_func"] = cases[caseIdx].interfaceOpFunc;
fragments["post_interface_op_frag"] = cases[caseIdx].postInterfaceOp;
fragments["post_interface_op_vert"] = cases[caseIdx].postInterfaceOp;
@@ -3794,6 +3787,7 @@
struct Case
{
const char* name;
+ const char* interfaceOpCall;
const char* interfaceOpFunc;
const char* preMain;
const char* inputType;
@@ -3807,12 +3801,8 @@
{ // Scalar cases
"scalar",
- "%interface_op_func = OpFunction %f32 None %f32_f16_function\n"
- " %io_param1 = OpFunctionParameter %f16\n"
- " %entry = OpLabel\n"
- " %ret = OpFConvert %f32 %io_param1\n"
- " OpReturnValue %ret\n"
- " OpFunctionEnd\n",
+ "OpFConvert %f32",
+ "",
" %f16 = OpTypeFloat 16\n"
" %ip_f16 = OpTypePointer Input %f16\n"
@@ -3830,12 +3820,8 @@
{ // Vector cases
"vector",
- "%interface_op_func = OpFunction %v2f32 None %v2f32_v2f16_function\n"
- " %io_param1 = OpFunctionParameter %v2f16\n"
- " %entry = OpLabel\n"
- " %ret = OpFConvert %v2f32 %io_param1\n"
- " OpReturnValue %ret\n"
- " OpFunctionEnd\n",
+ "OpFConvert %v2f32",
+ "",
" %f16 = OpTypeFloat 16\n"
" %v2f16 = OpTypeVector %f16 2\n"
@@ -3858,6 +3844,7 @@
for (deUint32 caseIdx = 0; caseIdx < DE_LENGTH_OF_ARRAY(cases); ++caseIdx)
{
+ fragments["interface_op_call"] = cases[caseIdx].interfaceOpCall;
fragments["interface_op_func"] = cases[caseIdx].interfaceOpFunc;
fragments["pre_main"] = cases[caseIdx].preMain;
@@ -3906,6 +3893,7 @@
struct Case
{
const char* name;
+ const char* interfaceOpCall;
const char* interfaceOpFunc;
const char* preMain;
const char* inputType;
@@ -3919,12 +3907,8 @@
{ // Scalar cases
"scalar",
- "%interface_op_func = OpFunction %f16 None %f16_f16_function\n"
- " %io_param1 = OpFunctionParameter %f16\n"
- " %entry = OpLabel\n"
- " %ret = OpCopyObject %f16 %io_param1\n"
- " OpReturnValue %ret\n"
- " OpFunctionEnd\n",
+ "OpCopyObject %f16",
+ "",
" %f16 = OpTypeFloat 16\n"
" %ip_f16 = OpTypePointer Input %f16\n"
@@ -3942,12 +3926,8 @@
{ // Vector cases
"vector",
- "%interface_op_func = OpFunction %v2f16 None %v2f16_v2f16_function\n"
- " %io_param1 = OpFunctionParameter %v2f16\n"
- " %entry = OpLabel\n"
- " %ret = OpCopyObject %v2f16 %io_param1\n"
- " OpReturnValue %ret\n"
- " OpFunctionEnd\n",
+ "OpCopyObject %v2f16",
+ "",
" %f16 = OpTypeFloat 16\n"
" %v2f16 = OpTypeVector %f16 2\n"
@@ -3967,6 +3947,7 @@
for (deUint32 caseIdx = 0; caseIdx < DE_LENGTH_OF_ARRAY(cases); ++caseIdx)
{
+ fragments["interface_op_call"] = cases[caseIdx].interfaceOpCall;
fragments["interface_op_func"] = cases[caseIdx].interfaceOpFunc;
fragments["pre_main"] = cases[caseIdx].preMain;
@@ -4195,7 +4176,6 @@
void addGraphics16BitStorageInputOutputFloat16To16x2Group (tcu::TestCaseGroup* testGroup)
{
- map<string, string> fragments;
RGBA defaultColors[4];
SpecConstants noSpecConstants;
PushConstants noPushConstants;
@@ -4274,7 +4254,6 @@
SpecConstants noSpecConstants;
PushConstants noPushConstants;
vector<string> extensions;
- map<string, string> noFragments;
GraphicsResources noResources;
StageToSpecConstantMap specConstantMap;
VulkanFeatures requiredFeatures;
@@ -4292,6 +4271,7 @@
extensions.push_back("VK_KHR_16bit_storage");
requiredFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_INPUT_OUTPUT;
+ requiredFeatures.coreFeatures.shaderInt16 = DE_TRUE;
const struct
{
@@ -4321,7 +4301,7 @@
const InstanceContext& instanceContext = createInstanceContext(pipelineStages,
defaultColors,
outputColors,
- noFragments,
+ fragments,
specConstantMap,
noPushConstants,
noResources,
@@ -4368,13 +4348,10 @@
getDefaultColors(defaultColors);
- const StringTemplate scalarInterfaceOpFunc(
- "%interface_op_func = OpFunction %${type16} None %${type16}_${type32}_function\n"
- " %io_param1 = OpFunctionParameter %${type32}\n"
- " %entry = OpLabel\n"
- " %ret = ${convert} %${type16} %io_param1\n"
- " OpReturnValue %ret\n"
- " OpFunctionEnd\n");
+ const StringTemplate scalarInterfaceOpCall(
+ "${convert} %${type16}");
+
+ const StringTemplate scalarInterfaceOpFunc("");
const StringTemplate scalarPreMain(
" %${type16} = OpTypeInt 16 ${signed}\n"
@@ -4385,13 +4362,10 @@
" %a3${type32} = OpTypeArray %${type32} %c_i32_3\n"
" %ip_a3${type32} = OpTypePointer Input %a3${type32}\n");
- const StringTemplate vecInterfaceOpFunc(
- "%interface_op_func = OpFunction %${type16} None %${type16}_${type32}_function\n"
- " %io_param1 = OpFunctionParameter %${type32}\n"
- " %entry = OpLabel\n"
- " %ret = ${convert} %${type16} %io_param1\n"
- " OpReturnValue %ret\n"
- " OpFunctionEnd\n");
+ const StringTemplate vecInterfaceOpCall(
+ "${convert} %${type16}");
+
+ const StringTemplate vecInterfaceOpFunc("");
const StringTemplate vecPreMain(
" %i16 = OpTypeInt 16 1\n"
@@ -4408,6 +4382,7 @@
struct Case
{
const char* name;
+ const StringTemplate& interfaceOpCall;
const StringTemplate& interfaceOpFunc;
const StringTemplate& preMain;
const char* type32;
@@ -4420,13 +4395,14 @@
Case cases[] =
{
- {"scalar_sint", scalarInterfaceOpFunc, scalarPreMain, "i32", "i16", "1", "OpSConvert", 4, 1},
- {"scalar_uint", scalarInterfaceOpFunc, scalarPreMain, "u32", "u16", "0", "OpUConvert", 4, 1},
- {"vector_sint", vecInterfaceOpFunc, vecPreMain, "v4i32", "v4i16", "1", "OpSConvert", 4 * 4, 4},
- {"vector_uint", vecInterfaceOpFunc, vecPreMain, "v4u32", "v4u16", "0", "OpUConvert", 4 * 4, 4},
+ {"scalar_sint", scalarInterfaceOpCall, scalarInterfaceOpFunc, scalarPreMain, "i32", "i16", "1", "OpSConvert", 4, 1},
+ {"scalar_uint", scalarInterfaceOpCall, scalarInterfaceOpFunc, scalarPreMain, "u32", "u16", "0", "OpUConvert", 4, 1},
+ {"vector_sint", vecInterfaceOpCall, vecInterfaceOpFunc, vecPreMain, "v4i32", "v4i16", "1", "OpSConvert", 4 * 4, 4},
+ {"vector_uint", vecInterfaceOpCall, vecInterfaceOpFunc, vecPreMain, "v4u32", "v4u16", "0", "OpUConvert", 4 * 4, 4},
};
VulkanFeatures requiredFeatures;
+ requiredFeatures.coreFeatures.shaderInt16 = DE_TRUE;
requiredFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_INPUT_OUTPUT;
for (deUint32 caseIdx = 0; caseIdx < DE_LENGTH_OF_ARRAY(cases); ++caseIdx)
@@ -4439,6 +4415,7 @@
specs["convert"] = cases[caseIdx].opcode;
fragments["pre_main"] = cases[caseIdx].preMain.specialize(specs);
+ fragments["interface_op_call"] = cases[caseIdx].interfaceOpCall.specialize(specs);
fragments["interface_op_func"] = cases[caseIdx].interfaceOpFunc.specialize(specs);
fragments["input_type"] = cases[caseIdx].type32;
fragments["output_type"] = cases[caseIdx].type16;
@@ -4508,13 +4485,10 @@
getDefaultColors(defaultColors);
- const StringTemplate scalarIfOpFunc (
- "%interface_op_func = OpFunction %${type32} None %${type32}_${type16}_function\n"
- " %io_param1 = OpFunctionParameter %${type16}\n"
- " %entry = OpLabel\n"
- " %ret = ${convert} %${type32} %io_param1\n"
- " OpReturnValue %ret\n"
- " OpFunctionEnd\n");
+ const StringTemplate scalarIfOpCall (
+ "${convert} %${type32}");
+
+ const StringTemplate scalarIfOpFunc ("");
const StringTemplate scalarPreMain (
" %${type16} = OpTypeInt 16 ${signed}\n"
@@ -4525,13 +4499,10 @@
" %a3${type32} = OpTypeArray %${type32} %c_i32_3\n"
" %op_a3${type32} = OpTypePointer Output %a3${type32}\n");
- const StringTemplate vecIfOpFunc (
- "%interface_op_func = OpFunction %${type32} None %${type32}_${type16}_function\n"
- " %io_param1 = OpFunctionParameter %${type16}\n"
- " %entry = OpLabel\n"
- " %ret = ${convert} %${type32} %io_param1\n"
- " OpReturnValue %ret\n"
- " OpFunctionEnd\n");
+ const StringTemplate vecIfOpCall (
+ "${convert} %${type32}");
+
+ const StringTemplate vecIfOpFunc ("");
const StringTemplate vecPreMain (
" %i16 = OpTypeInt 16 1\n"
@@ -4548,6 +4519,7 @@
struct Case
{
const char* name;
+ const StringTemplate& interfaceOpCall;
const StringTemplate& interfaceOpFunc;
const StringTemplate& preMain;
const char* type32;
@@ -4560,13 +4532,14 @@
Case cases[] =
{
- {"scalar_sint", scalarIfOpFunc, scalarPreMain, "i32", "i16", "1", "OpSConvert", 4, 1},
- {"scalar_uint", scalarIfOpFunc, scalarPreMain, "u32", "u16", "0", "OpUConvert", 4, 1},
- {"vector_sint", vecIfOpFunc, vecPreMain, "v4i32", "v4i16", "1", "OpSConvert", 4 * 4, 4},
- {"vector_uint", vecIfOpFunc, vecPreMain, "v4u32", "v4u16", "0", "OpUConvert", 4 * 4, 4},
+ {"scalar_sint", scalarIfOpCall, scalarIfOpFunc, scalarPreMain, "i32", "i16", "1", "OpSConvert", 4, 1},
+ {"scalar_uint", scalarIfOpCall, scalarIfOpFunc, scalarPreMain, "u32", "u16", "0", "OpUConvert", 4, 1},
+ {"vector_sint", vecIfOpCall, vecIfOpFunc, vecPreMain, "v4i32", "v4i16", "1", "OpSConvert", 4 * 4, 4},
+ {"vector_uint", vecIfOpCall, vecIfOpFunc, vecPreMain, "v4u32", "v4u16", "0", "OpUConvert", 4 * 4, 4},
};
VulkanFeatures requiredFeatures;
+ requiredFeatures.coreFeatures.shaderInt16 = DE_TRUE;
requiredFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_INPUT_OUTPUT;
for (deUint32 caseIdx = 0; caseIdx < DE_LENGTH_OF_ARRAY(cases); ++caseIdx)
@@ -4579,6 +4552,7 @@
specs["convert"] = cases[caseIdx].opcode;
fragments["pre_main"] = cases[caseIdx].preMain.specialize(specs);
+ fragments["interface_op_call"] = cases[caseIdx].interfaceOpCall.specialize(specs);
fragments["interface_op_func"] = cases[caseIdx].interfaceOpFunc.specialize(specs);
fragments["input_type"] = cases[caseIdx].type16;
fragments["output_type"] = cases[caseIdx].type32;
@@ -4637,13 +4611,10 @@
getDefaultColors(defaultColors);
- const StringTemplate scalarIfOpFunc (
- "%interface_op_func = OpFunction %${type16} None %${type16}_${type16}_function\n"
- " %io_param1 = OpFunctionParameter %${type16}\n"
- " %entry = OpLabel\n"
- " %ret = OpCopyObject %${type16} %io_param1\n"
- " OpReturnValue %ret\n"
- " OpFunctionEnd\n");
+ const StringTemplate scalarIfOpCall (
+ "OpCopyObject %${type16}");
+
+ const StringTemplate scalarIfOpFunc ("");
const StringTemplate scalarPreMain (
" %${type16} = OpTypeInt 16 ${signed}\n"
@@ -4654,13 +4625,10 @@
" %op_${type16} = OpTypePointer Output %${type16}\n"
" %op_a3${type16} = OpTypePointer Output %a3${type16}\n");
- const StringTemplate vecIfOpFunc (
- "%interface_op_func = OpFunction %${type16} None %${type16}_${type16}_function\n"
- " %io_param1 = OpFunctionParameter %${type16}\n"
- " %entry = OpLabel\n"
- " %ret = OpCopyObject %${type16} %io_param1\n"
- " OpReturnValue %ret\n"
- " OpFunctionEnd\n");
+ const StringTemplate vecIfOpCall (
+ "OpCopyObject %${type16}");
+
+ const StringTemplate vecIfOpFunc ("");
const StringTemplate vecPreMain (
" %i16 = OpTypeInt 16 1\n"
@@ -4677,6 +4645,7 @@
struct Case
{
const char* name;
+ const StringTemplate& interfaceOpCall;
const StringTemplate& interfaceOpFunc;
const StringTemplate& preMain;
const char* type16;
@@ -4687,10 +4656,10 @@
Case cases[] =
{
- {"scalar_sint", scalarIfOpFunc, scalarPreMain, "i16", "1", 4, 1},
- {"scalar_uint", scalarIfOpFunc, scalarPreMain, "u16", "0", 4, 1},
- {"vector_sint", vecIfOpFunc, vecPreMain, "v4i16", "1", 4 * 4, 4},
- {"vector_uint", vecIfOpFunc, vecPreMain, "v4u16", "0", 4 * 4, 4},
+ {"scalar_sint", scalarIfOpCall, scalarIfOpFunc, scalarPreMain, "i16", "1", 4, 1},
+ {"scalar_uint", scalarIfOpCall, scalarIfOpFunc, scalarPreMain, "u16", "0", 4, 1},
+ {"vector_sint", vecIfOpCall, vecIfOpFunc, vecPreMain, "v4i16", "1", 4 * 4, 4},
+ {"vector_uint", vecIfOpCall, vecIfOpFunc, vecPreMain, "v4u16", "0", 4 * 4, 4},
};
for (deUint32 caseIdx = 0; caseIdx < DE_LENGTH_OF_ARRAY(cases); ++caseIdx)
@@ -4701,6 +4670,7 @@
specs["signed"] = cases[caseIdx].sign;
fragments["pre_main"] = cases[caseIdx].preMain.specialize(specs);
+ fragments["interface_op_call"] = cases[caseIdx].interfaceOpCall.specialize(specs);
fragments["interface_op_func"] = cases[caseIdx].interfaceOpFunc.specialize(specs);
fragments["input_type"] = cases[caseIdx].type16;
fragments["output_type"] = cases[caseIdx].type16;
@@ -6732,12 +6702,10 @@
float64Data.push_back(deFloat16To64(float16Data[numIdx]));
extensions.push_back("VK_KHR_16bit_storage");
- extensions.push_back("VK_KHR_shader_float16_int8");
fragments["capability"] =
"OpCapability StorageInputOutput16\n"
- "OpCapability Float64\n"
- "OpCapability Float16\n";
+ "OpCapability Float64\n";
fragments["extension"] = "OpExtension \"SPV_KHR_16bit_storage\"\n";
getDefaultColors(defaultColors);
@@ -6745,6 +6713,7 @@
struct Case
{
const char* name;
+ const char* interfaceOpCall;
const char* interfaceOpFunc;
const char* preMain;
const char* inputType;
@@ -6758,12 +6727,8 @@
{ // Scalar cases
"scalar",
- "%interface_op_func = OpFunction %f64 None %f64_f16_function\n"
- " %io_param1 = OpFunctionParameter %f16\n"
- " %entry = OpLabel\n"
- " %ret = OpFConvert %f64 %io_param1\n"
- " OpReturnValue %ret\n"
- " OpFunctionEnd\n",
+ "OpFConvert %f64",
+ "",
" %f16 = OpTypeFloat 16\n"
" %f64 = OpTypeFloat 64\n"
@@ -6784,12 +6749,8 @@
{ // Vector cases
"vector",
- "%interface_op_func = OpFunction %v2f64 None %v2f64_v2f16_function\n"
- " %io_param1 = OpFunctionParameter %v2f16\n"
- " %entry = OpLabel\n"
- " %ret = OpFConvert %v2f64 %io_param1\n"
- " OpReturnValue %ret\n"
- " OpFunctionEnd\n",
+ "OpFConvert %v2f64",
+ "",
" %f16 = OpTypeFloat 16\n"
" %v2f16 = OpTypeVector %f16 2\n"
@@ -6817,10 +6778,10 @@
requiredFeatures.coreFeatures.shaderFloat64 = DE_TRUE;
requiredFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_INPUT_OUTPUT;
- requiredFeatures.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
for (deUint32 caseIdx = 0; caseIdx < DE_LENGTH_OF_ARRAY(cases); ++caseIdx)
{
+ fragments["interface_op_call"] = cases[caseIdx].interfaceOpCall;
fragments["interface_op_func"] = cases[caseIdx].interfaceOpFunc;
fragments["pre_main"] = cases[caseIdx].preMain;
@@ -6856,8 +6817,7 @@
const deUint32 numDataPoints = 256;
RGBA defaultColors[4];
const StringTemplate capabilities ("OpCapability ${cap}\n"
- "OpCapability Float64\n"
- "OpCapability Float16\n");
+ "OpCapability Float64\n");
vector<deFloat16> float16Data = getFloat16s(rnd, numDataPoints);
struct ConstantIndex
@@ -6875,7 +6835,6 @@
};
extensions.push_back("VK_KHR_16bit_storage");
- extensions.push_back("VK_KHR_shader_float16_int8");
fragments["extension"] = "OpExtension \"SPV_KHR_16bit_storage\"";
@@ -6988,7 +6947,6 @@
VulkanFeatures features = get16BitStorageFeatures(CAPABILITIES[capIdx].name);
features.coreFeatures.shaderFloat64 = DE_TRUE;
- features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
createTestsForAllStages(testName, defaultColors, defaultColors, fragments, resources, extensions, testGroup, features);
}
@@ -7110,7 +7068,6 @@
VulkanFeatures features = get16BitStorageFeatures(CAPABILITIES[capIdx].name);
features.coreFeatures.shaderFloat64 = DE_TRUE;
- features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
createTestsForAllStages(testName, defaultColors, defaultColors, fragments, resources, extensions, testGroup, features);
}
@@ -7228,7 +7185,6 @@
VulkanFeatures features = get16BitStorageFeatures(CAPABILITIES[capIdx].name);
features.coreFeatures.shaderFloat64 = DE_TRUE;
- features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
createTestsForAllStages(testName, defaultColors, defaultColors, fragments, resources, extensions, testGroup, features);
}
@@ -7253,16 +7209,13 @@
float64Data.push_back(deFloat16To64(float16Data[numIdx]));
extensions.push_back("VK_KHR_16bit_storage");
- extensions.push_back("VK_KHR_shader_float16_int8");
requiredFeatures.coreFeatures.shaderFloat64 = DE_TRUE;
requiredFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_PUSH_CONSTANT;
- requiredFeatures.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
fragments["capability"] =
"OpCapability StoragePushConstant16\n"
- "OpCapability Float64\n"
- "OpCapability Float16\n";
+ "OpCapability Float64\n";
fragments["extension"] = "OpExtension \"SPV_KHR_16bit_storage\"";
@@ -7457,7 +7410,6 @@
"OpCapability Shader\n"
"OpCapability ${capability}\n"
"OpCapability Float64\n"
- "OpCapability Float16\n"
"OpExtension \"SPV_KHR_16bit_storage\"\n"
"OpMemoryModel Logical GLSL450\n"
"OpEntryPoint GLCompute %main \"main\" %id\n"
@@ -7638,11 +7590,9 @@
spec.outputs.push_back(BufferSp(new Float16Buffer(float16DummyData)));
spec.extensions.push_back("VK_KHR_16bit_storage");
- spec.extensions.push_back("VK_KHR_shader_float16_int8");
spec.requestedVulkanFeatures = get16BitStorageFeatures(CAPABILITIES[capIdx].name);
spec.requestedVulkanFeatures.coreFeatures.shaderFloat64 = VK_TRUE;
- spec.requestedVulkanFeatures.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
group->addChild(new SpvAsmComputeShaderCase(testCtx, testName.c_str(), testName.c_str(), spec));
}
@@ -7660,13 +7610,11 @@
vector<double> float64Data = getFloat64s(rnd, numDataPoints);
vector<deFloat16> float16DummyData (numDataPoints, 0);
const StringTemplate capabilities ("OpCapability Float64\n"
- "OpCapability Float16\n"
"OpCapability ${cap}\n");
// We use a custom verifyIO to check the result via computing directly from inputs; the contents in outputs do not matter.
resources.outputs.push_back(Resource(BufferSp(new Float16Buffer(float16DummyData)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
extensions.push_back("VK_KHR_16bit_storage");
- extensions.push_back("VK_KHR_shader_float16_int8");
fragments["extension"] = "OpExtension \"SPV_KHR_16bit_storage\"";
@@ -7773,7 +7721,6 @@
features = get16BitStorageFeatures(CAPABILITIES[capIdx].name);
features.coreFeatures.shaderFloat64 = DE_TRUE;
- features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
createTestsForAllStages(testName, defaultColors, defaultColors, fragments, resources, extensions, testGroup, features);
@@ -7874,7 +7821,6 @@
features = get16BitStorageFeatures(CAPABILITIES[capIdx].name);
features.coreFeatures.shaderFloat64 = DE_TRUE;
- features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
createTestsForAllStages(testName, defaultColors, defaultColors, fragments, resources, extensions, testGroup, features);
}
@@ -7994,7 +7940,6 @@
features = get16BitStorageFeatures(CAPABILITIES[capIdx].name);
features.coreFeatures.shaderFloat64 = DE_TRUE;
- features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
createTestsForAllStages(testName, defaultColors, defaultColors, fragments, resources, extensions, testGroup, features);
}
@@ -8011,11 +7956,9 @@
vector<double> float64Data = getFloat64s(rnd, numDataPoints);
extensions.push_back("VK_KHR_16bit_storage");
- extensions.push_back("VK_KHR_shader_float16_int8");
fragments["capability"] =
"OpCapability StorageInputOutput16\n"
- "OpCapability Float16\n"
"OpCapability Float64\n";
fragments["extension"] = "OpExtension \"SPV_KHR_16bit_storage\"\n";
@@ -8047,6 +7990,7 @@
struct Case
{
const char* name;
+ const char* interfaceOpCall;
const char* interfaceOpFunc;
const char* postInterfaceOp;
const char* postInterfaceOpGeom;
@@ -8063,11 +8007,9 @@
{ // Scalar cases
"scalar",
- "%interface_op_func = OpFunction %f16 None %f16_f64_function\n"
- " %io_param1 = OpFunctionParameter %f64\n"
- " %entry = OpLabel\n"
- " OpReturnValue %f16_0\n"
- " OpFunctionEnd\n",
+ "OpFConvert %f16",
+
+ "",
" %ret0 = OpFConvert %f16 %IF_input_val\n"
" OpStore %IF_output %ret0\n",
@@ -8090,8 +8032,7 @@
"%f16_f64_function = OpTypeFunction %f16 %f64\n"
" %a3f64 = OpTypeArray %f64 %c_i32_3\n"
" %ip_a3f64 = OpTypePointer Input %a3f64\n"
- " %ip_f64 = OpTypePointer Input %f64\n"
- " %f16_0 = OpConstant %f16 0\n",
+ " %ip_f64 = OpTypePointer Input %f64\n",
"f64",
"f16",
@@ -8101,11 +8042,9 @@
{ // Vector cases
"vector",
- "%interface_op_func = OpFunction %v2f16 None %v2f16_v2f64_function\n"
- " %io_param1 = OpFunctionParameter %v2f64\n"
- " %entry = OpLabel\n"
- " OpReturnValue %v2f16_0\n"
- " OpFunctionEnd\n",
+ "OpFConvert %v2f16",
+
+ "",
" %ret0 = OpFConvert %v2f16 %IF_input_val\n"
" OpStore %IF_output %ret0\n",
@@ -8130,9 +8069,7 @@
"%v2f16_v2f64_function = OpTypeFunction %v2f16 %v2f64\n"
" %a3v2f64 = OpTypeArray %v2f64 %c_i32_3\n"
" %ip_a3v2f64 = OpTypePointer Input %a3v2f64\n"
- " %ip_v2f64 = OpTypePointer Input %v2f64\n"
- " %f16_0 = OpConstant %f16 0\n"
- " %v2f16_0 = OpConstantComposite %v2f16 %f16_0 %f16_0\n",
+ " %ip_v2f64 = OpTypePointer Input %v2f64\n",
"v2f64",
"v2f16",
@@ -8145,12 +8082,12 @@
requiredFeatures.coreFeatures.shaderFloat64 = DE_TRUE;
requiredFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_INPUT_OUTPUT;
- requiredFeatures.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
for (deUint32 caseIdx = 0; caseIdx < DE_LENGTH_OF_ARRAY(cases); ++caseIdx)
for (deUint32 rndModeIdx = 0; rndModeIdx < DE_LENGTH_OF_ARRAY(rndModes); ++rndModeIdx)
{
fragments["interface_op_func"] = cases[caseIdx].interfaceOpFunc;
+ fragments["interface_op_call"] = cases[caseIdx].interfaceOpCall;
fragments["post_interface_op_frag"] = cases[caseIdx].postInterfaceOp;
fragments["post_interface_op_vert"] = cases[caseIdx].postInterfaceOp;
fragments["post_interface_op_geom"] = cases[caseIdx].postInterfaceOpGeom;
@@ -8197,7 +8134,6 @@
const StringTemplate shaderTemplate (
"OpCapability Shader\n"
"OpCapability Float64\n"
- "OpCapability Float16\n"
"OpCapability ${capability}\n"
"OpExtension \"SPV_KHR_16bit_storage\"\n"
"OpMemoryModel Logical GLSL450\n"
@@ -8412,11 +8348,9 @@
spec.outputs.push_back(Resource(BufferSp(new Float64Buffer(cTypes[tyIdx].useConstantIndex ? float64DataConstIdx : float64Data))));
spec.extensions.push_back("VK_KHR_16bit_storage");
- spec.extensions.push_back("VK_KHR_shader_float16_int8");
spec.requestedVulkanFeatures = get16BitStorageFeatures(CAPABILITIES[capIdx].name);
spec.requestedVulkanFeatures.coreFeatures.shaderFloat64 = VK_TRUE;
- spec.requestedVulkanFeatures.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
group->addChild(new SpvAsmComputeShaderCase(testCtx, testName.c_str(), testName.c_str(), spec));
}
@@ -8433,7 +8367,6 @@
"OpCapability Shader\n"
"OpCapability StoragePushConstant16\n"
"OpCapability Float64\n"
- "OpCapability Float16\n"
"OpExtension \"SPV_KHR_16bit_storage\"\n"
"OpMemoryModel Logical GLSL450\n"
"OpEntryPoint GLCompute %main \"main\" %id\n"
@@ -8581,11 +8514,9 @@
spec.outputs.push_back(BufferSp(new Float64Buffer(float64Data)));
spec.extensions.push_back("VK_KHR_16bit_storage");
- spec.extensions.push_back("VK_KHR_shader_float16_int8");
spec.requestedVulkanFeatures.coreFeatures.shaderFloat64 = VK_TRUE;
spec.requestedVulkanFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_PUSH_CONSTANT;
- spec.requestedVulkanFeatures.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
group->addChild(new SpvAsmComputeShaderCase(testCtx, testName.c_str(), testName.c_str(), spec));
}
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp
index 0903e4c..bc6bfe8 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp
@@ -60,7 +60,8 @@
* The memory is created as host visible and passed back as a vk::Allocation
* instance via outMemory.
*//*--------------------------------------------------------------------*/
-Move<VkBuffer> createBufferAndBindMemory (const DeviceInterface& vkdi,
+Move<VkBuffer> createBufferAndBindMemory (vkt::Context& context,
+ const DeviceInterface& vkdi,
const VkDevice& device,
VkDescriptorType dtype,
Allocator& allocator,
@@ -72,7 +73,7 @@
VkBufferUsageFlags usageFlags = (VkBufferUsageFlags)0u;
if (physStorageBuffer)
- usageFlags |= VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT;
+ usageFlags |= VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT;
switch (dtype)
{
@@ -98,7 +99,10 @@
Move<VkBuffer> buffer (createBuffer(vkdi, device, &bufferCreateInfo));
const VkMemoryRequirements requirements = getBufferMemoryRequirements(vkdi, device, *buffer);
- AllocationMp bufferMemory = allocator.allocate(requirements, coherent ? MemoryRequirement::Coherent | MemoryRequirement::HostVisible : MemoryRequirement::HostVisible);
+ AllocationMp bufferMemory = allocator.allocate(requirements,
+ (coherent ? MemoryRequirement::Coherent : MemoryRequirement::Any) |
+ (context.isDeviceFunctionalitySupported("VK_KHR_buffer_device_address") && physStorageBuffer ? MemoryRequirement::DeviceAddress : MemoryRequirement::Any) |
+ MemoryRequirement::HostVisible);
VK_CHECK(vkdi.bindBufferMemory(device, *buffer, bufferMemory->getMemory(), bufferMemory->getOffset()));
*outMemory = bufferMemory;
@@ -419,11 +423,8 @@
vector<VkDescriptorType> descriptorTypes;
// Check all required extensions are supported
- for (std::vector<std::string>::const_iterator i = m_shaderSpec.extensions.begin(); i != m_shaderSpec.extensions.end(); ++i)
- {
- if (!de::contains(m_context.getDeviceExtensions().begin(), m_context.getDeviceExtensions().end(), *i))
- TCU_THROW(NotSupportedError, (std::string("Extension not supported: ") + *i).c_str());
- }
+ for (const auto& ext : m_shaderSpec.extensions)
+ m_context.requireDeviceFunctionality(ext);
// Core features
{
@@ -487,11 +488,17 @@
TCU_THROW(NotSupportedError, "Requested 16bit float or 8bit int feature not supported");
}
+ // Vulkan Memory Model features
+ {
+ if (!isVulkanMemoryModelFeaturesSupported(m_context, m_shaderSpec.requestedVulkanFeatures.extVulkanMemoryModel))
+ TCU_THROW(NotSupportedError, "Requested Vulkan Memory Model feature not supported");
+ }
+
// FloatControls features
if (!isFloatControlsFeaturesSupported(m_context, m_shaderSpec.requestedVulkanFeatures.floatControlsProperties))
TCU_THROW(NotSupportedError, "Requested Float Controls features not supported");
- if (m_shaderSpec.usesPhysStorageBuffer && !m_context.getBufferDeviceAddressFeatures().bufferDeviceAddress)
+ if (m_shaderSpec.usesPhysStorageBuffer && !m_context.isBufferDeviceAddressSupported())
TCU_THROW(NotSupportedError, "Request physical storage buffer feature not supported");
}
@@ -529,7 +536,7 @@
const size_t numBytes = inputBytes.size();
AllocationMp bufferAlloc;
- BufferHandleUp* buffer = new BufferHandleUp(createBufferAndBindMemory(vkdi, device, descType, allocator, numBytes, &bufferAlloc, m_shaderSpec.usesPhysStorageBuffer, m_shaderSpec.coherentMemory));
+ BufferHandleUp* buffer = new BufferHandleUp(createBufferAndBindMemory(m_context, vkdi, device, descType, allocator, numBytes, &bufferAlloc, m_shaderSpec.usesPhysStorageBuffer, m_shaderSpec.coherentMemory));
setMemory(vkdi, device, &*bufferAlloc, numBytes, &inputBytes.front(), m_shaderSpec.coherentMemory);
inputBuffers.push_back(BufferHandleSp(buffer));
@@ -546,7 +553,7 @@
const size_t numBytes = inputBytes.size();
AllocationMp bufferAlloc;
- BufferHandleUp* buffer = new BufferHandleUp(createBufferAndBindMemory(vkdi, device, descType, allocator, numBytes, &bufferAlloc, m_shaderSpec.usesPhysStorageBuffer));
+ BufferHandleUp* buffer = new BufferHandleUp(createBufferAndBindMemory(m_context, vkdi, device, descType, allocator, numBytes, &bufferAlloc, m_shaderSpec.usesPhysStorageBuffer));
AllocationMp imageAlloc;
ImageHandleUp* image = new ImageHandleUp(createImageAndBindMemory(vkdi, device, descType, allocator, queueFamilyIndex, &imageAlloc));
@@ -744,7 +751,7 @@
output->getBytes(outputBytes);
const size_t numBytes = outputBytes.size();
- BufferHandleUp* buffer = new BufferHandleUp(createBufferAndBindMemory(vkdi, device, descriptorTypes.back(), allocator, numBytes, &alloc, m_shaderSpec.usesPhysStorageBuffer, m_shaderSpec.coherentMemory));
+ BufferHandleUp* buffer = new BufferHandleUp(createBufferAndBindMemory(m_context, vkdi, device, descriptorTypes.back(), allocator, numBytes, &alloc, m_shaderSpec.usesPhysStorageBuffer, m_shaderSpec.coherentMemory));
fillMemoryWithValue(vkdi, device, &*alloc, numBytes, 0xff, m_shaderSpec.coherentMemory);
descriptorInfos.push_back(vk::makeDescriptorBufferInfo(**buffer, 0u, numBytes));
@@ -757,9 +764,11 @@
// all the descriptors with just a desciptor to this new buffer.
if (m_shaderSpec.usesPhysStorageBuffer)
{
- VkBufferDeviceAddressInfoEXT info =
+ const bool useKHR = m_context.isDeviceFunctionalitySupported("VK_KHR_buffer_device_address");
+
+ VkBufferDeviceAddressInfo info =
{
- VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
0, // VkBuffer buffer
};
@@ -767,13 +776,21 @@
for (deUint32 inputNdx = 0; inputNdx < m_shaderSpec.inputs.size(); ++inputNdx)
{
info.buffer = **inputBuffers[inputNdx];
- VkDeviceAddress addr = vkdi.getBufferDeviceAddressEXT(device, &info);
+ VkDeviceAddress addr;
+ if (useKHR)
+ addr = vkdi.getBufferDeviceAddress(device, &info);
+ else
+ addr = vkdi.getBufferDeviceAddressEXT(device, &info);
gpuAddrs.push_back(addr);
}
for (deUint32 outputNdx = 0; outputNdx < m_shaderSpec.outputs.size(); ++outputNdx)
{
info.buffer = **outputBuffers[outputNdx];
- VkDeviceAddress addr = vkdi.getBufferDeviceAddressEXT(device, &info);
+ VkDeviceAddress addr;
+ if (useKHR)
+ addr = vkdi.getBufferDeviceAddress(device, &info);
+ else
+ addr = vkdi.getBufferDeviceAddressEXT(device, &info);
gpuAddrs.push_back(addr);
}
@@ -783,7 +800,7 @@
const size_t numBytes = gpuAddrs.size() * sizeof(VkDeviceAddress);
AllocationMp bufferAlloc;
- BufferHandleUp* buffer = new BufferHandleUp(createBufferAndBindMemory(vkdi, device, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
+ BufferHandleUp* buffer = new BufferHandleUp(createBufferAndBindMemory(m_context, vkdi, device, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
allocator, numBytes, &bufferAlloc, false, m_shaderSpec.coherentMemory));
setMemory(vkdi, device, &*bufferAlloc, numBytes, &gpuAddrs.front(), m_shaderSpec.coherentMemory);
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.cpp
index 2d06d96..794b15f 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.cpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.cpp
@@ -60,14 +60,18 @@
}
}
-std::string getComputeAsmShaderPreamble (const std::string& capabilities, const std::string& extensions, const std::string& exeModes, const std::string& extraEntryPoints)
+std::string getComputeAsmShaderPreamble (const std::string& capabilities,
+ const std::string& extensions,
+ const std::string& exeModes,
+ const std::string& extraEntryPoints,
+ const std::string& extraEntryPointsArguments)
{
return
std::string("OpCapability Shader\n") +
capabilities +
extensions +
"OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint GLCompute %main \"main\" %id\n" +
+ "OpEntryPoint GLCompute %main \"main\" %id " + extraEntryPointsArguments + "\n" +
extraEntryPoints +
"OpExecutionMode %main LocalSize 1 1 1\n" +
exeModes;
@@ -107,19 +111,19 @@
"%i64arr = OpTypeRuntimeArray %i64\n";
}
-const char* getComputeAsmInputOutputBuffer (void)
-{
- return
+std::string getComputeAsmInputOutputBuffer (std::string blockStorageClass)
+{ // Uniform | StorageBuffer
+ return std::string() +
"%buf = OpTypeStruct %f32arr\n"
- "%bufptr = OpTypePointer Uniform %buf\n"
- "%indata = OpVariable %bufptr Uniform\n"
- "%outdata = OpVariable %bufptr Uniform\n";
+ "%bufptr = OpTypePointer " + blockStorageClass + " %buf\n"
+ "%indata = OpVariable %bufptr " + blockStorageClass + "\n"
+ "%outdata = OpVariable %bufptr " + blockStorageClass + "\n";
}
-const char* getComputeAsmInputOutputBufferTraits (void)
-{
- return
- "OpDecorate %buf BufferBlock\n"
+std::string getComputeAsmInputOutputBufferTraits (std::string blockStorageClass)
+{ // BufferBlock | Block
+ return std::string() +
+ "OpDecorate %buf " + blockStorageClass + "\n"
"OpDecorate %indata DescriptorSet 0\n"
"OpDecorate %indata Binding 0\n"
"OpDecorate %outdata DescriptorSet 0\n"
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.hpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.hpp
index 229413e..18f2b63 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.hpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.hpp
@@ -353,6 +353,7 @@
SpirvVersion spirvVersion;
bool coherentMemory;
bool usesPhysStorageBuffer;
+ bool spirvVersion14;
ComputeShaderSpec (void)
: entryPoint ("main")
@@ -365,6 +366,7 @@
, spirvVersion (SPIRV_VERSION_1_0)
, coherentMemory (false)
, usesPhysStorageBuffer (false)
+ , spirvVersion14 (false)
{}
};
@@ -372,7 +374,11 @@
* \brief Helper functions for SPIR-V assembly shared by various tests
*//*--------------------------------------------------------------------*/
-std::string getComputeAsmShaderPreamble (const std::string& capabilities = "", const std::string& extensions = "", const std::string& exeModes = "", const std::string& extraEntryPoints = "");
+std::string getComputeAsmShaderPreamble (const std::string& capabilities = "",
+ const std::string& extensions = "",
+ const std::string& exeModes = "",
+ const std::string& extraEntryPoints = "",
+ const std::string& extraEntryPointsArguments = "");
const char* getComputeAsmShaderPreambleWithoutLocalSize (void);
std::string getComputeAsmCommonTypes (std::string blockStorageClass = "Uniform");
const char* getComputeAsmCommonInt64Types (void);
@@ -381,13 +387,13 @@
* Declares two uniform variables (indata, outdata) of type
* "struct { float[] }". Depends on type "f32arr" (for "float[]").
*//*--------------------------------------------------------------------*/
-const char* getComputeAsmInputOutputBuffer (void);
+std::string getComputeAsmInputOutputBuffer (std::string blockStorageClass = "Uniform");
/*--------------------------------------------------------------------*//*!
* Declares buffer type and layout for uniform variables indata and
* outdata. Both of them are SSBO bounded to descriptor set 0.
* indata is at binding point 0, while outdata is at 1.
*//*--------------------------------------------------------------------*/
-const char* getComputeAsmInputOutputBufferTraits (void);
+std::string getComputeAsmInputOutputBufferTraits (std::string blockStorageClass = "BufferBlock");
bool verifyOutput (const std::vector<Resource>&,
const std::vector<AllocationSp>& outputAllocs,
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmFloatControlsExtensionlessTests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmFloatControlsExtensionlessTests.cpp
new file mode 100644
index 0000000..7551ede
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmFloatControlsExtensionlessTests.cpp
@@ -0,0 +1,262 @@
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * 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 SPIR-V Float Control SPIR-V tokens test
+ *//*--------------------------------------------------------------------*/
+
+#include "vkApiVersion.hpp"
+
+#include "vktSpvAsmFloatControlsExtensionlessTests.hpp"
+#include "vktTestCase.hpp"
+#include "vktSpvAsmComputeShaderCase.hpp"
+
+#include "deRandom.hpp"
+#include "deStringUtil.hpp"
+#include "tcuCommandLine.hpp"
+#include "vkQueryUtil.hpp"
+
+namespace vkt
+{
+namespace SpirVAssembly
+{
+
+static const char* TEST_FEATURE_DENORM_PRESERVE = "DenormPreserve";
+static const char* TEST_FEATURE_DENORM_FLUSH_TO_ZERO = "DenormFlushToZero";
+static const char* TEST_FEATURE_SIGNED_ZERO_INF_NAN_PRESERVE = "SignedZeroInfNanPreserve";
+static const char* TEST_FEATURE_ROUNDING_MODE_RTE = "RoundingModeRTE";
+static const char* TEST_FEATURE_ROUNDING_MODE_RTZ = "RoundingModeRTZ";
+
+using namespace vk;
+using std::map;
+using std::string;
+using std::vector;
+
+static void getComputeSourceCode (std::string& computeSourceCode, const std::string& featureName, const int fpWideness)
+{
+ const std::string capability = "OpCapability " + featureName + "\n";
+ const std::string exeModes = "OpExecutionMode %main " + featureName + " " + de::toString(fpWideness) + "\n";
+
+ computeSourceCode =
+ string(getComputeAsmShaderPreamble(capability, "", exeModes, "", "%indata %outdata")) +
+
+ "OpSource GLSL 430\n"
+ "OpName %main \"main\"\n"
+ "OpName %id \"gl_GlobalInvocationID\"\n"
+
+ "OpDecorate %id BuiltIn GlobalInvocationId\n"
+
+ + getComputeAsmInputOutputBufferTraits("Block") + getComputeAsmCommonTypes("StorageBuffer") + getComputeAsmInputOutputBuffer("StorageBuffer") +
+
+ "%id = OpVariable %uvec3ptr Input\n"
+ "%zero = OpConstant %i32 0\n"
+
+ "%main = OpFunction %void None %voidf\n"
+ "%label = OpLabel\n"
+ "%idval = OpLoad %uvec3 %id\n"
+ "%x = OpCompositeExtract %u32 %idval 0\n"
+
+ " OpNop\n" // Inside a function body
+
+ "%inloc = OpAccessChain %f32ptr %indata %zero %x\n"
+ "%inval = OpLoad %f32 %inloc\n"
+ "%neg = OpFNegate %f32 %inval\n"
+ "%outloc = OpAccessChain %f32ptr %outdata %zero %x\n"
+ " OpStore %outloc %neg\n"
+ " OpReturn\n"
+ " OpFunctionEnd\n";
+}
+
+static ComputeShaderSpec getComputeShaderSpec (Context& ctx, const std::string& testCaseName)
+{
+ const deUint32 baseSeed = deStringHash(testCaseName.c_str()) + static_cast<deUint32>(ctx.getTestContext().getCommandLine().getBaseSeed());
+ de::Random rnd (baseSeed);
+ const int numElements = 64;
+ vector<float> inputFloats (numElements, 0);
+ vector<float> outputFloats (numElements, 0);
+ ComputeShaderSpec spec;
+
+ for (size_t ndx = 0; ndx < numElements; ++ndx)
+ inputFloats[ndx] = rnd.getFloat(1.0f, 100.0f);
+
+ for (size_t ndx = 0; ndx < numElements; ++ndx)
+ outputFloats[ndx] = -inputFloats[ndx];
+
+ // Shader source code can be retrieved to complete definition of ComputeShaderSpec, though it is not required at this stage
+ // getComputeSourceCode (spec.assembly);
+
+ spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
+ spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));
+
+ spec.numWorkGroups = tcu::IVec3(numElements, 1, 1);
+ spec.verifyIO = &verifyOutput;
+
+ return spec;
+}
+
+VkBool32 getFloatControlsProperty(Context& context, const int fpWideness, const std::string& featureName)
+{
+ VkPhysicalDeviceFloatControlsProperties floatControlsProperties;
+ deMemset(&floatControlsProperties, 0, sizeof(floatControlsProperties));
+ floatControlsProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES;
+
+ VkPhysicalDeviceProperties2 properties;
+ deMemset(&properties, 0, sizeof(properties));
+ properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
+ properties.pNext = &floatControlsProperties;
+
+ context.getInstanceInterface().getPhysicalDeviceProperties2(context.getPhysicalDevice(), &properties);
+
+ if (fpWideness == 16)
+ {
+ if (featureName == TEST_FEATURE_DENORM_PRESERVE ) return floatControlsProperties.shaderDenormPreserveFloat16;
+ if (featureName == TEST_FEATURE_DENORM_FLUSH_TO_ZERO ) return floatControlsProperties.shaderDenormFlushToZeroFloat16;
+ if (featureName == TEST_FEATURE_SIGNED_ZERO_INF_NAN_PRESERVE) return floatControlsProperties.shaderSignedZeroInfNanPreserveFloat16;
+ if (featureName == TEST_FEATURE_ROUNDING_MODE_RTE ) return floatControlsProperties.shaderRoundingModeRTEFloat16;
+ if (featureName == TEST_FEATURE_ROUNDING_MODE_RTZ ) return floatControlsProperties.shaderRoundingModeRTZFloat16;
+ }
+
+ if (fpWideness == 32)
+ {
+ if (featureName == TEST_FEATURE_DENORM_PRESERVE ) return floatControlsProperties.shaderDenormPreserveFloat32;
+ if (featureName == TEST_FEATURE_DENORM_FLUSH_TO_ZERO ) return floatControlsProperties.shaderDenormFlushToZeroFloat32;
+ if (featureName == TEST_FEATURE_SIGNED_ZERO_INF_NAN_PRESERVE) return floatControlsProperties.shaderSignedZeroInfNanPreserveFloat32;
+ if (featureName == TEST_FEATURE_ROUNDING_MODE_RTE ) return floatControlsProperties.shaderRoundingModeRTEFloat32;
+ if (featureName == TEST_FEATURE_ROUNDING_MODE_RTZ ) return floatControlsProperties.shaderRoundingModeRTZFloat32;
+ }
+
+ if (fpWideness == 64)
+ {
+ if (featureName == TEST_FEATURE_DENORM_PRESERVE ) return floatControlsProperties.shaderDenormPreserveFloat64;
+ if (featureName == TEST_FEATURE_DENORM_FLUSH_TO_ZERO ) return floatControlsProperties.shaderDenormFlushToZeroFloat64;
+ if (featureName == TEST_FEATURE_SIGNED_ZERO_INF_NAN_PRESERVE) return floatControlsProperties.shaderSignedZeroInfNanPreserveFloat64;
+ if (featureName == TEST_FEATURE_ROUNDING_MODE_RTE ) return floatControlsProperties.shaderRoundingModeRTEFloat64;
+ if (featureName == TEST_FEATURE_ROUNDING_MODE_RTZ ) return floatControlsProperties.shaderRoundingModeRTZFloat64;
+ }
+
+ TCU_THROW(InternalError, "Unknown property requested");
+}
+
+class SpvAsmFloatControlsExtensionlessInstance : public ComputeShaderSpec, public SpvAsmComputeShaderInstance
+{
+public:
+ SpvAsmFloatControlsExtensionlessInstance (Context& ctx, const std::string& testCaseName);
+};
+
+SpvAsmFloatControlsExtensionlessInstance::SpvAsmFloatControlsExtensionlessInstance (Context& ctx, const std::string& testCaseName)
+ : ComputeShaderSpec(getComputeShaderSpec(ctx, testCaseName))
+ , SpvAsmComputeShaderInstance(ctx, *this)
+{
+}
+
+SpvAsmFloatControlsExtensionlessCase::SpvAsmFloatControlsExtensionlessCase (tcu::TestContext& testCtx, const char* name, const char* description, const char* featureName, const int fpWideness, const bool spirv14)
+ : TestCase (testCtx, name, description)
+ , m_featureName (featureName)
+ , m_fpWideness (fpWideness)
+ , m_spirv14 (spirv14)
+{
+}
+
+void SpvAsmFloatControlsExtensionlessCase::initPrograms (SourceCollections& programCollection) const
+{
+ const bool allowSpirv14 = true;
+ std::string comp;
+
+ getComputeSourceCode(comp, m_featureName, m_fpWideness);
+
+ programCollection.spirvAsmSources.add("compute") << SpirVAsmBuildOptions(programCollection.usedVulkanVersion, SPIRV_VERSION_1_4, allowSpirv14) << comp;
+}
+
+void SpvAsmFloatControlsExtensionlessCase::checkSupport (Context& context) const
+{
+ if (m_spirv14)
+ {
+ context.requireDeviceFunctionality("VK_KHR_spirv_1_4");
+ }
+ else
+ {
+ if (!context.contextSupports(vk::ApiVersion(1, 2, 0)))
+ TCU_THROW(NotSupportedError, "Test requires Vulkan 1.2");
+ }
+
+ if (m_fpWideness == 16)
+ {
+ context.requireDeviceFunctionality("VK_KHR_shader_float16_int8");
+ if (!isFloat16Int8FeaturesSupported(context, EXTFLOAT16INT8FEATURES_FLOAT16))
+ TCU_THROW(NotSupportedError, "Floating point number of width 16 bit are not supported");
+ }
+
+ if (m_fpWideness == 64)
+ {
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SHADER_FLOAT64);
+ }
+
+ if (!getFloatControlsProperty(context, m_fpWideness, m_featureName))
+ TCU_THROW(NotSupportedError, "Property is not supported");
+}
+
+TestInstance* SpvAsmFloatControlsExtensionlessCase::createInstance (Context& context) const
+{
+ return new SpvAsmFloatControlsExtensionlessInstance(context, getName());
+}
+
+tcu::TestCaseGroup* createFloatControlsExtensionlessGroup (tcu::TestContext& testCtx)
+{
+ const char* spirVersions[] = { "spirv1p4", "vulkan1_2" };
+ const int floatingPointWideness[] = { 16, 32, 64 };
+ const struct FpFeatures
+ {
+ const char* testName;
+ const char* featureName;
+ }
+ fpFeatures[] =
+ {
+ { "denorm_preserve", TEST_FEATURE_DENORM_PRESERVE },
+ { "denorm_flush_to_zero", TEST_FEATURE_DENORM_FLUSH_TO_ZERO },
+ { "signed_zero_inf_nan_preserve", TEST_FEATURE_SIGNED_ZERO_INF_NAN_PRESERVE },
+ { "rounding_mode_rte", TEST_FEATURE_ROUNDING_MODE_RTE },
+ { "rounding_mode_rtz", TEST_FEATURE_ROUNDING_MODE_RTZ },
+ };
+ de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, "float_controls_extensionless", "Tests float controls without extension"));
+
+ for (int spirVersionsNdx = 0; spirVersionsNdx < DE_LENGTH_OF_ARRAY(spirVersions); ++spirVersionsNdx)
+ {
+ const bool spirv14 = (spirVersionsNdx == 0);
+ de::MovePtr<tcu::TestCaseGroup> spirVersionGroup (new tcu::TestCaseGroup(testCtx, spirVersions[spirVersionsNdx], ""));
+
+ for (int fpWidenessNdx = 0; fpWidenessNdx < DE_LENGTH_OF_ARRAY(floatingPointWideness); ++fpWidenessNdx)
+ for (int execModeNdx = 0; execModeNdx < DE_LENGTH_OF_ARRAY(fpFeatures); ++execModeNdx)
+ {
+ const int fpWideness = floatingPointWideness[fpWidenessNdx];
+ const std::string testName = fpFeatures[execModeNdx].testName;
+ const char* featureName = fpFeatures[execModeNdx].featureName;
+ const std::string fullTestName = "fp" + de::toString(fpWideness) + "_" + testName;
+
+ spirVersionGroup->addChild(new SpvAsmFloatControlsExtensionlessCase(testCtx, fullTestName.c_str(), "", featureName, fpWideness, spirv14));
+ }
+
+ group->addChild(spirVersionGroup.release());
+ }
+
+ return group.release();
+}
+
+
+} // SpirVAssembly
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmFloatControlsExtensionlessTests.hpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmFloatControlsExtensionlessTests.hpp
new file mode 100644
index 0000000..1cc7ea8
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmFloatControlsExtensionlessTests.hpp
@@ -0,0 +1,55 @@
+#ifndef _VKTSPVASMFLOATCONTROLSEXTENSIONLESSTESTS_HPP
+#define _VKTSPVASMFLOATCONTROLSEXTENSIONLESSTESTS_HPP
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * 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 SPIR-V Float Control SPIR-V tokens test
+ *//*--------------------------------------------------------------------*/
+
+#include "vkPrograms.hpp"
+#include "vktTestCase.hpp"
+
+#include "vktSpvAsmComputeShaderTestUtil.hpp"
+
+namespace vkt
+{
+namespace SpirVAssembly
+{
+
+class SpvAsmFloatControlsExtensionlessCase : public TestCase
+{
+public:
+ SpvAsmFloatControlsExtensionlessCase (tcu::TestContext& testCtx, const char* name, const char* description, const char* featureName, const int fpWideness, const bool spirv14);
+ void initPrograms (vk::SourceCollections& programCollection) const;
+ TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
+
+protected:
+ const char* m_featureName;
+ const int m_fpWideness;
+ const bool m_spirv14;
+};
+
+tcu::TestCaseGroup* createFloatControlsExtensionlessGroup (tcu::TestContext& testCtx);
+
+} // SpirVAssembly
+} // vkt
+
+#endif // _VKTSPVASMFLOATCONTROLSEXTENSIONLESSTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmFloatControlsTests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmFloatControlsTests.cpp
index 810bb08..b89e0e6 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmFloatControlsTests.cpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmFloatControlsTests.cpp
@@ -31,7 +31,9 @@
#include "tcuStringTemplate.hpp"
#include "deUniquePtr.hpp"
#include "deFloat16.h"
+#include "vkQueryUtil.hpp"
#include "vkRefUtil.hpp"
+#include <cstring>
#include <vector>
#include <limits>
#include <fenv.h>
@@ -54,6 +56,15 @@
FP64
};
+enum FloatUsage
+{
+ // If the float type is 16bit, then the use of the type is supported by
+ // VK_KHR_16bit_storage.
+ FLOAT_STORAGE_ONLY = 0,
+ // Use of the float type goes beyond VK_KHR_16bit_storage.
+ FLOAT_ARITHMETIC
+};
+
// Enum containing float behaviors that its possible to test.
enum BehaviorFlagBits
{
@@ -110,12 +121,17 @@
V_MINUS_ONE_OR_CLOSE, // value used only fur fp16 subtraction result of preserved denorm and one
V_PI_DIV_2,
V_ZERO_OR_MINUS_ZERO, // both +0 and -0 are accepted
+ V_ZERO_OR_ONE, // both +0 and 1 are accepted
V_ZERO_OR_FP16_DENORM_TO_FP32, // both 0 and fp32 representation of fp16 denorm are accepted
V_ZERO_OR_FP16_DENORM_TO_FP64,
V_ZERO_OR_FP32_DENORM_TO_FP64,
V_DENORM_TIMES_TWO,
V_DEGREES_DENORM,
V_TRIG_ONE, // 1.0 trigonometric operations, including precision margin
+ V_MINUS_INF_OR_LOG_DENORM,
+ V_MINUS_INF_OR_LOG2_DENORM,
+ V_ZERO_OR_SQRT_DENORM,
+ V_INF_OR_INV_SQRT_DENORM,
//results of conversion operations
V_CONV_TO_FP16_RTZ_RESULT,
@@ -312,10 +328,11 @@
{
public:
TypeValuesBase();
- virtual ~TypeValuesBase() {}
+ virtual ~TypeValuesBase() = default;
- virtual BufferSp constructInputBuffer(const ValueId* twoArguments) const = 0;
- virtual BufferSp constructOutputBuffer(ValueId result) const = 0;
+ virtual BufferSp constructInputBuffer (const ValueId* twoArguments) const = 0;
+ virtual BufferSp constructOutputBuffer (ValueId result) const = 0;
+ virtual void fillInputData (const ValueId* twoArguments, vector<deUint8>& bufferData, deUint32& offset) const = 0;
protected:
const double pi;
@@ -334,8 +351,9 @@
public:
TypeValues();
- BufferSp constructInputBuffer(const ValueId* twoArguments) const;
- BufferSp constructOutputBuffer(ValueId result) const;
+ BufferSp constructInputBuffer (const ValueId* twoArguments) const override;
+ BufferSp constructOutputBuffer (ValueId result) const override;
+ void fillInputData (const ValueId* twoArguments, vector<deUint8>& bufferData, deUint32& offset) const override;
FLOAT_TYPE getValue(ValueId id) const;
@@ -370,6 +388,20 @@
}
template <typename FLOAT_TYPE>
+void TypeValues<FLOAT_TYPE>::fillInputData(const ValueId* twoArguments, vector<deUint8>& bufferData, deUint32& offset) const
+{
+ deUint32 typeSize = sizeof(FLOAT_TYPE);
+
+ FLOAT_TYPE argA = getValue(twoArguments[0]);
+ deMemcpy(&bufferData[offset], &argA, typeSize);
+ offset += typeSize;
+
+ FLOAT_TYPE argB = getValue(twoArguments[1]);
+ deMemcpy(&bufferData[offset], &argB, typeSize);
+ offset += typeSize;
+}
+
+template <typename FLOAT_TYPE>
FLOAT_TYPE TypeValues<FLOAT_TYPE>::getValue(ValueId id) const
{
return m_valueIdToFloatType.at(id);
@@ -556,7 +588,7 @@
class TypeSnippetsBase
{
public:
- virtual ~TypeSnippetsBase() {}
+ virtual ~TypeSnippetsBase() = default;
protected:
void updateSpirvSnippets();
@@ -583,14 +615,19 @@
string extensions;
string arrayStride;
+ bool loadStoreRequiresShaderFloat16;
+
public: // Type specific spir-v snippets:
// Common annotations
string typeAnnotationsSnippet;
- // Definitions of all types commonly used by tests
+ // Definitions of all types commonly used by operation tests
string typeDefinitionsSnippet;
+ // Definitions of all types commonly used by settings tests
+ string minTypeDefinitionsSnippet;
+
// Definitions of all constants commonly used by tests
string constantsDefinitionsSnippet;
@@ -599,14 +636,17 @@
typedef map<ValueId, string> SnippetMap;
SnippetMap valueIdToSnippetArgMap;
- // Spir-v snippet that reads argument from SSBO
+ // Spir-v snippets that read argument from SSBO
string argumentsFromInputSnippet;
+ string multiArgumentsFromInputSnippet;
// SSBO with stage input/output definitions
string inputAnnotationsSnippet;
string inputDefinitionsSnippet;
string outputAnnotationsSnippet;
+ string multiOutputAnnotationsSnippet;
string outputDefinitionsSnippet;
+ string multiOutputDefinitionsSnippet;
// Varying is required to pass result from vertex stage to fragment stage,
// one of requirements was to not use SSBO writes in vertex stage so we
@@ -619,6 +659,7 @@
string loadVertexResultSnippet;
string storeResultsSnippet;
+ string multiStoreResultsSnippet;
};
void TypeSnippetsBase::updateSpirvSnippets()
@@ -642,6 +683,12 @@
"%type_float_arr_1 = OpTypeArray %type_float %c_i32_1\n"
"%type_float_arr_2 = OpTypeArray %type_float %c_i32_2\n";
+ // minimal type definition set that is used by settings tests
+ const string minTypeDefinitionsTemplate =
+ "%type_float = OpTypeFloat " + bitWidth + "\n"
+ "%type_float_uptr = OpTypePointer Uniform %type_float\n"
+ "%type_float_arr_2 = OpTypeArray %type_float %c_i32_2\n";
+
// definition off all constans that are used by tests
const string constantsDefinitionsTemplate =
"%c_float_n1 = OpConstant %type_float -1\n"
@@ -663,6 +710,12 @@
"%arg2loc = OpAccessChain %type_float_uptr %ssbo_in %c_i32_0 %c_i32_1\n"
"%arg2 = OpLoad %type_float %arg2loc\n";
+ const string multiArgumentsFromInputTemplate =
+ "%arg1_float_loc = OpAccessChain %type_float_uptr %ssbo_in %c_i32_${attr} %c_i32_0\n"
+ "%arg2_float_loc = OpAccessChain %type_float_uptr %ssbo_in %c_i32_${attr} %c_i32_1\n"
+ "%arg1_float = OpLoad %type_float %arg1_float_loc\n"
+ "%arg2_float = OpLoad %type_float %arg2_float_loc\n";
+
// when tested shader stage reads from SSBO it has to have this snippet
inputAnnotationsSnippet =
"OpMemberDecorate %SSBO_in 0 Offset 0\n"
@@ -682,26 +735,46 @@
"OpDecorate %ssbo_out DescriptorSet 0\n"
"OpDecorate %ssbo_out Binding 1\n";
+ const string multiOutputAnnotationsTemplate =
+ "OpMemberDecorate %SSBO_float_out 0 Offset 0\n"
+ "OpDecorate %type_float_arr_2 ArrayStride "+ arrayStride + "\n"
+ "OpDecorate %SSBO_float_out BufferBlock\n"
+ "OpDecorate %ssbo_float_out DescriptorSet 0\n";
+
const string outputDefinitionsTemplate =
"%SSBO_out = OpTypeStruct %type_float_arr_1\n"
"%up_SSBO_out = OpTypePointer Uniform %SSBO_out\n"
"%ssbo_out = OpVariable %up_SSBO_out Uniform\n";
+ const string multiOutputDefinitionsTemplate =
+ "%SSBO_float_out = OpTypeStruct %type_float\n"
+ "%up_SSBO_float_out = OpTypePointer Uniform %SSBO_float_out\n"
+ "%ssbo_float_out = OpVariable %up_SSBO_float_out Uniform\n";
+
// this snippet is used by compute and fragment stage but not by vertex stage
const string storeResultsTemplate =
"%outloc = OpAccessChain %type_float_uptr %ssbo_out %c_i32_0 %c_i32_0\n"
"OpStore %outloc %result\n";
+ const string multiStoreResultsTemplate =
+ "%outloc" + bitWidth + " = OpAccessChain %type_float_uptr %ssbo_float_out %c_i32_0\n"
+ " OpStore %outloc" + bitWidth + " %result" + bitWidth + "\n";
+
const string typeToken = "_float";
const string typeName = "_f" + bitWidth;
- typeAnnotationsSnippet = replace(typeAnnotationsTemplate, typeToken, typeName);
- typeDefinitionsSnippet = replace(typeDefinitionsTemplate, typeToken, typeName);
- constantsDefinitionsSnippet = replace(constantsDefinitionsTemplate, typeToken, typeName);
- argumentsFromInputSnippet = replace(argumentsFromInputTemplate, typeToken, typeName);
- inputDefinitionsSnippet = replace(inputDefinitionsTemplate, typeToken, typeName);
- outputDefinitionsSnippet = replace(outputDefinitionsTemplate, typeToken, typeName);
- storeResultsSnippet = replace(storeResultsTemplate, typeToken, typeName);
+ typeAnnotationsSnippet = replace(typeAnnotationsTemplate, typeToken, typeName);
+ typeDefinitionsSnippet = replace(typeDefinitionsTemplate, typeToken, typeName);
+ minTypeDefinitionsSnippet = replace(minTypeDefinitionsTemplate, typeToken, typeName);
+ constantsDefinitionsSnippet = replace(constantsDefinitionsTemplate, typeToken, typeName);
+ argumentsFromInputSnippet = replace(argumentsFromInputTemplate, typeToken, typeName);
+ multiArgumentsFromInputSnippet = replace(multiArgumentsFromInputTemplate, typeToken, typeName);
+ inputDefinitionsSnippet = replace(inputDefinitionsTemplate, typeToken, typeName);
+ multiOutputAnnotationsSnippet = replace(multiOutputAnnotationsTemplate, typeToken, typeName);
+ outputDefinitionsSnippet = replace(outputDefinitionsTemplate, typeToken, typeName);
+ multiOutputDefinitionsSnippet = replace(multiOutputDefinitionsTemplate, typeToken, typeName);
+ storeResultsSnippet = replace(storeResultsTemplate, typeToken, typeName);
+ multiStoreResultsSnippet = replace(multiStoreResultsTemplate, typeToken, typeName);
// NOTE: only values used as _generated_ arguments in test operations
// need to be in this map, arguments that are only used by tests,
@@ -764,6 +837,8 @@
"%tmp_vec2 = OpBitcast %type_f16_vec2 %packed_result\n"
"%result = OpCompositeExtract %type_f16 %tmp_vec2 0\n";
+ loadStoreRequiresShaderFloat16 = true;
+
updateSpirvSnippets();
}
@@ -791,6 +866,8 @@
"%packed_result = OpLoad %type_u32 %BP_vertex_result\n"
"%result = OpBitcast %type_f32 %packed_result\n";
+ loadStoreRequiresShaderFloat16 = false;
+
updateSpirvSnippets();
}
@@ -818,6 +895,8 @@
"%packed_result = OpLoad %type_u32_vec2 %BP_vertex_result\n"
"%result = OpBitcast %type_f64 %packed_result\n";
+ loadStoreRequiresShaderFloat16 = false;
+
updateSpirvSnippets();
}
@@ -900,7 +979,7 @@
{ O_TRUNC, V_ZERO },
{ O_ABS, V_ZERO },
{ O_FLOOR, V_ZERO },
- { O_CEIL, V_ZERO },
+ { O_CEIL, V_ZERO_OR_ONE },
{ O_FRACT, V_ZERO },
{ O_RADIANS, V_ZERO },
{ O_DEGREES, V_ZERO },
@@ -917,11 +996,11 @@
{ O_ACOSH, V_UNUSED },
{ O_ATANH, V_ZERO },
{ O_EXP, V_ONE },
- { O_LOG, V_MINUS_INF },
+ { O_LOG, V_MINUS_INF_OR_LOG_DENORM },
{ O_EXP2, V_ONE },
- { O_LOG2, V_MINUS_INF },
- { O_SQRT, V_ZERO },
- { O_INV_SQRT, V_INF },
+ { O_LOG2, V_MINUS_INF_OR_LOG2_DENORM },
+ { O_SQRT, V_ZERO_OR_SQRT_DENORM },
+ { O_INV_SQRT, V_INF_OR_INV_SQRT_DENORM },
{ O_MAT_DET, V_ZERO },
{ O_MAT_INV, V_ZERO_OR_MINUS_ZERO },
{ O_MODF, V_ZERO },
@@ -1028,7 +1107,7 @@
{ O_TRUNC, V_ZERO },
{ O_ABS, V_ZERO },
{ O_FLOOR, V_ZERO },
- { O_CEIL, V_ZERO },
+ { O_CEIL, V_ZERO_OR_ONE },
{ O_FRACT, V_ZERO },
{ O_RADIANS, V_ZERO },
{ O_DEGREES, V_ZERO },
@@ -1045,11 +1124,11 @@
{ O_ACOSH, V_UNUSED },
{ O_ATANH, V_ZERO },
{ O_EXP, V_ONE },
- { O_LOG, V_MINUS_INF },
+ { O_LOG, V_MINUS_INF_OR_LOG_DENORM },
{ O_EXP2, V_ONE },
- { O_LOG2, V_MINUS_INF },
- { O_SQRT, V_ZERO },
- { O_INV_SQRT, V_INF },
+ { O_LOG2, V_MINUS_INF_OR_LOG2_DENORM },
+ { O_SQRT, V_ZERO_OR_SQRT_DENORM },
+ { O_INV_SQRT, V_INF_OR_INV_SQRT_DENORM },
{ O_MAT_DET, V_ZERO },
{ O_MAT_INV, V_ZERO_OR_MINUS_ZERO },
{ O_MODF, V_ZERO },
@@ -1156,10 +1235,10 @@
{ O_TRUNC, V_ZERO },
{ O_ABS, V_ZERO },
{ O_FLOOR, V_ZERO },
- { O_CEIL, V_ZERO },
+ { O_CEIL, V_ZERO_OR_ONE },
{ O_FRACT, V_ZERO },
- { O_SQRT, V_ZERO },
- { O_INV_SQRT, V_INF },
+ { O_SQRT, V_ZERO_OR_SQRT_DENORM },
+ { O_INV_SQRT, V_INF_OR_INV_SQRT_DENORM },
{ O_MAT_DET, V_ZERO },
{ O_MAT_INV, V_ZERO_OR_MINUS_ZERO },
{ O_MODF, V_ZERO },
@@ -1230,17 +1309,21 @@
// operation name is included in test case name
const char* name;
+ // How extensively is the floating point type used?
+ FloatUsage floatUsage;
+
// operation specific spir-v snippets that will be
// placed in proper places in final test shader
const char* annotations;
const char* types;
const char* constants;
const char* variables;
+ const char* functions;
const char* commands;
// conversion operations operate on one float type and produce float
// type with different bit width; restrictedInputType is used only when
- // isInputTypeRestricted is set to true and it restricts usega of this
+ // isInputTypeRestricted is set to true and it restricts usage of this
// operation to specified input type
bool isInputTypeRestricted;
FloatType restrictedInputType;
@@ -1251,12 +1334,14 @@
Operation() {}
// Minimal constructor - used by most of operations
- Operation(const char* _name, const char* _commands)
+ Operation(const char* _name, FloatUsage _floatUsage, const char* _commands)
: name(_name)
+ , floatUsage(_floatUsage)
, annotations("")
, types("")
, constants("")
, variables("")
+ , functions("")
, commands(_commands)
, isInputTypeRestricted(false)
, restrictedInputType(FP16) // not used as isInputTypeRestricted is false
@@ -1265,15 +1350,18 @@
// Conversion operations constructor (used also by conversions done in SpecConstantOp)
Operation(const char* _name,
+ FloatUsage _floatUsage,
bool specConstant,
FloatType _inputType,
const char* _constants,
const char* _commands)
: name(_name)
+ , floatUsage(_floatUsage)
, annotations("")
, types("")
, constants(_constants)
, variables("")
+ , functions("")
, commands(_commands)
, isInputTypeRestricted(true)
, restrictedInputType(_inputType)
@@ -1282,16 +1370,20 @@
// Full constructor - used by few operations, that are more complex to test
Operation(const char* _name,
+ FloatUsage _floatUsage,
const char* _annotations,
const char* _types,
const char* _constants,
const char* _variables,
+ const char* _functions,
const char* _commands)
: name(_name)
+ , floatUsage(_floatUsage)
, annotations(_annotations)
, types(_types)
, constants(_constants)
, variables(_variables)
+ , functions(_functions)
, commands(_commands)
, isInputTypeRestricted(false)
, restrictedInputType(FP16) // not used as isInputTypeRestricted is false
@@ -1300,16 +1392,19 @@
// Full constructor - used by rounding override cases
Operation(const char* _name,
+ FloatUsage _floatUsage,
FloatType _inputType,
const char* _annotations,
const char* _types,
const char* _constants,
const char* _commands)
: name(_name)
+ , floatUsage(_floatUsage)
, annotations(_annotations)
, types(_types)
, constants(_constants)
, variables("")
+ , functions("")
, commands(_commands)
, isInputTypeRestricted(true)
, restrictedInputType(_inputType)
@@ -1358,6 +1453,7 @@
string types;
string arguments;
string variables;
+ string functions;
string commands;
FloatType inFloatType;
@@ -1404,69 +1500,80 @@
// m_operations contains generic operation definitions that can be
// used for all float types
- mo[O_NEGATE] = Op("negate", "%result = OpFNegate %type_float %arg1\n");
- mo[O_COMPOSITE] = Op("composite", "%vec1 = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
+ mo[O_NEGATE] = Op("negate", FLOAT_ARITHMETIC,
+ "%result = OpFNegate %type_float %arg1\n");
+ mo[O_COMPOSITE] = Op("composite", FLOAT_ARITHMETIC,
+ "%vec1 = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
"%result = OpCompositeExtract %type_float %vec1 0\n");
- mo[O_COMPOSITE_INS] = Op("comp_ins", "%vec1 = OpCompositeConstruct %type_float_vec2 %c_float_0 %c_float_0\n"
+ mo[O_COMPOSITE_INS] = Op("comp_ins", FLOAT_ARITHMETIC,
+ "%vec1 = OpCompositeConstruct %type_float_vec2 %c_float_0 %c_float_0\n"
"%vec2 = OpCompositeInsert %type_float_vec2 %arg1 %vec1 0\n"
"%result = OpCompositeExtract %type_float %vec2 0\n");
- mo[O_COPY] = Op("copy", "%result = OpCopyObject %type_float %arg1\n");
- mo[O_D_EXTRACT] = Op("extract", "%vec1 = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
+ mo[O_COPY] = Op("copy", FLOAT_STORAGE_ONLY,
+ "%result = OpCopyObject %type_float %arg1\n");
+ mo[O_D_EXTRACT] = Op("extract", FLOAT_ARITHMETIC,
+ "%vec1 = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
"%result = OpVectorExtractDynamic %type_float %vec1 %c_i32_0\n");
- mo[O_D_INSERT] = Op("insert", "%tmpVec = OpCompositeConstruct %type_float_vec2 %c_float_2 %c_float_2\n"
+ mo[O_D_INSERT] = Op("insert", FLOAT_ARITHMETIC,
+ "%tmpVec = OpCompositeConstruct %type_float_vec2 %c_float_2 %c_float_2\n"
"%vec1 = OpVectorInsertDynamic %type_float_vec2 %tmpVec %arg1 %c_i32_0\n"
"%result = OpCompositeExtract %type_float %vec1 0\n");
- mo[O_SHUFFLE] = Op("shuffle", "%tmpVec1 = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
+ mo[O_SHUFFLE] = Op("shuffle", FLOAT_ARITHMETIC,
+ "%tmpVec1 = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
"%tmpVec2 = OpCompositeConstruct %type_float_vec2 %c_float_2 %c_float_2\n" // NOTE: its impossible to test shuffle with denorms flushed
"%vec1 = OpVectorShuffle %type_float_vec2 %tmpVec1 %tmpVec2 0 2\n" // to zero as this will be done by earlier operation
"%result = OpCompositeExtract %type_float %vec1 0\n"); // (this also applies to few other operations)
- mo[O_TRANSPOSE] = Op("transpose", "%col = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
+ mo[O_TRANSPOSE] = Op("transpose", FLOAT_ARITHMETIC,
+ "%col = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
"%mat = OpCompositeConstruct %type_float_mat2x2 %col %col\n"
"%tmat = OpTranspose %type_float_mat2x2 %mat\n"
"%tcol = OpCompositeExtract %type_float_vec2 %tmat 0\n"
"%result = OpCompositeExtract %type_float %tcol 0\n");
- mo[O_RETURN_VAL] = Op("ret_val", "",
+ mo[O_RETURN_VAL] = Op("ret_val", FLOAT_ARITHMETIC,
+ "",
"%type_test_fun = OpTypeFunction %type_float %type_float\n",
+ "",
+ "",
"%test_fun = OpFunction %type_float None %type_test_fun\n"
"%param = OpFunctionParameter %type_float\n"
"%entry = OpLabel\n"
"OpReturnValue %param\n"
"OpFunctionEnd\n",
- "",
"%result = OpFunctionCall %type_float %test_fun %arg1\n");
// conversion operations that are meant to be used only for single output type (defined by the second number in name)
const char* convertSource = "%result = OpFConvert %type_float %arg1\n";
- mo[O_CONV_FROM_FP16] = Op("conv_from_fp16", false, FP16, "", convertSource);
- mo[O_CONV_FROM_FP32] = Op("conv_from_fp32", false, FP32, "", convertSource);
- mo[O_CONV_FROM_FP64] = Op("conv_from_fp64", false, FP64, "", convertSource);
+ mo[O_CONV_FROM_FP16] = Op("conv_from_fp16", FLOAT_STORAGE_ONLY, false, FP16, "", convertSource);
+ mo[O_CONV_FROM_FP32] = Op("conv_from_fp32", FLOAT_STORAGE_ONLY, false, FP32, "", convertSource);
+ mo[O_CONV_FROM_FP64] = Op("conv_from_fp64", FLOAT_STORAGE_ONLY, false, FP64, "", convertSource);
// from all operands supported by OpSpecConstantOp we can only test FConvert opcode with literals as everything
// else requires Karnel capability (OpenCL); values of literals used in SPIR-V code must be equiwalent to
// V_CONV_FROM_FP32_ARG and V_CONV_FROM_FP64_ARG so we can use same expected rounded values as for regular OpFConvert
mo[O_SCONST_CONV_FROM_FP32_TO_FP16]
- = Op("sconst_conv_from_fp32", true, FP32,
+ = Op("sconst_conv_from_fp32", FLOAT_ARITHMETIC, true, FP32,
"%c_arg = OpConstant %type_f32 1.22334445\n"
"%result = OpSpecConstantOp %type_f16 FConvert %c_arg\n",
"");
mo[O_SCONST_CONV_FROM_FP64_TO_FP32]
- = Op("sconst_conv_from_fp64", true, FP64,
+ = Op("sconst_conv_from_fp64", FLOAT_ARITHMETIC, true, FP64,
"%c_arg = OpConstant %type_f64 1.22334455\n"
"%result = OpSpecConstantOp %type_f32 FConvert %c_arg\n",
"");
mo[O_SCONST_CONV_FROM_FP64_TO_FP16]
- = Op("sconst_conv_from_fp64", true, FP64,
+ = Op("sconst_conv_from_fp64", FLOAT_ARITHMETIC, true, FP64,
"%c_arg = OpConstant %type_f64 1.22334445\n"
"%result = OpSpecConstantOp %type_f16 FConvert %c_arg\n",
"");
- mo[O_ADD] = Op("add", "%result = OpFAdd %type_float %arg1 %arg2\n");
- mo[O_SUB] = Op("sub", "%result = OpFSub %type_float %arg1 %arg2\n");
- mo[O_MUL] = Op("mul", "%result = OpFMul %type_float %arg1 %arg2\n");
- mo[O_DIV] = Op("div", "%result = OpFDiv %type_float %arg1 %arg2\n");
- mo[O_REM] = Op("rem", "%result = OpFRem %type_float %arg1 %arg2\n");
- mo[O_MOD] = Op("mod", "%result = OpFMod %type_float %arg1 %arg2\n");
- mo[O_PHI] = Op("phi", "%comp = OpFOrdGreaterThan %type_bool %arg1 %arg2\n"
+ mo[O_ADD] = Op("add", FLOAT_ARITHMETIC, "%result = OpFAdd %type_float %arg1 %arg2\n");
+ mo[O_SUB] = Op("sub", FLOAT_ARITHMETIC, "%result = OpFSub %type_float %arg1 %arg2\n");
+ mo[O_MUL] = Op("mul", FLOAT_ARITHMETIC, "%result = OpFMul %type_float %arg1 %arg2\n");
+ mo[O_DIV] = Op("div", FLOAT_ARITHMETIC, "%result = OpFDiv %type_float %arg1 %arg2\n");
+ mo[O_REM] = Op("rem", FLOAT_ARITHMETIC, "%result = OpFRem %type_float %arg1 %arg2\n");
+ mo[O_MOD] = Op("mod", FLOAT_ARITHMETIC, "%result = OpFMod %type_float %arg1 %arg2\n");
+ mo[O_PHI] = Op("phi", FLOAT_ARITHMETIC,
+ "%comp = OpFOrdGreaterThan %type_bool %arg1 %arg2\n"
" OpSelectionMerge %comp_merge None\n"
" OpBranchConditional %comp %true_branch %false_branch\n"
"%true_branch = OpLabel\n"
@@ -1475,161 +1582,238 @@
" OpBranch %comp_merge\n"
"%comp_merge = OpLabel\n"
"%result = OpPhi %type_float %arg2 %true_branch %arg1 %false_branch\n");
- mo[O_SELECT] = Op("select", "%always_true = OpFOrdGreaterThan %type_bool %c_float_1 %c_float_0\n"
+ mo[O_SELECT] = Op("select", FLOAT_ARITHMETIC,
+ "%always_true = OpFOrdGreaterThan %type_bool %c_float_1 %c_float_0\n"
"%result = OpSelect %type_float %always_true %arg1 %arg2\n");
- mo[O_DOT] = Op("dot", "%vec1 = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
+ mo[O_DOT] = Op("dot", FLOAT_ARITHMETIC,
+ "%vec1 = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
"%vec2 = OpCompositeConstruct %type_float_vec2 %arg2 %arg2\n"
"%result = OpDot %type_float %vec1 %vec2\n");
- mo[O_VEC_MUL_S] = Op("vmuls", "%vec = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
+ mo[O_VEC_MUL_S] = Op("vmuls", FLOAT_ARITHMETIC,
+ "%vec = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
"%tmpVec = OpVectorTimesScalar %type_float_vec2 %vec %arg2\n"
"%result = OpCompositeExtract %type_float %tmpVec 0\n");
- mo[O_VEC_MUL_M] = Op("vmulm", "%col = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
+ mo[O_VEC_MUL_M] = Op("vmulm", FLOAT_ARITHMETIC,
+ "%col = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
"%mat = OpCompositeConstruct %type_float_mat2x2 %col %col\n"
"%vec = OpCompositeConstruct %type_float_vec2 %arg2 %arg2\n"
"%tmpVec = OpVectorTimesMatrix %type_float_vec2 %vec %mat\n"
"%result = OpCompositeExtract %type_float %tmpVec 0\n");
- mo[O_MAT_MUL_S] = Op("mmuls", "%col = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
+ mo[O_MAT_MUL_S] = Op("mmuls", FLOAT_ARITHMETIC,
+ "%col = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
"%mat = OpCompositeConstruct %type_float_mat2x2 %col %col\n"
"%mulMat = OpMatrixTimesScalar %type_float_mat2x2 %mat %arg2\n"
"%extCol = OpCompositeExtract %type_float_vec2 %mulMat 0\n"
"%result = OpCompositeExtract %type_float %extCol 0\n");
- mo[O_MAT_MUL_V] = Op("mmulv", "%col = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
+ mo[O_MAT_MUL_V] = Op("mmulv", FLOAT_ARITHMETIC,
+ "%col = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
"%mat = OpCompositeConstruct %type_float_mat2x2 %col %col\n"
"%vec = OpCompositeConstruct %type_float_vec2 %arg2 %arg2\n"
"%mulVec = OpMatrixTimesVector %type_float_vec2 %mat %vec\n"
"%result = OpCompositeExtract %type_float %mulVec 0\n");
- mo[O_MAT_MUL_M] = Op("mmulm", "%col1 = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
+ mo[O_MAT_MUL_M] = Op("mmulm", FLOAT_ARITHMETIC,
+ "%col1 = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
"%mat1 = OpCompositeConstruct %type_float_mat2x2 %col1 %col1\n"
"%col2 = OpCompositeConstruct %type_float_vec2 %arg2 %arg2\n"
"%mat2 = OpCompositeConstruct %type_float_mat2x2 %col2 %col2\n"
"%mulMat = OpMatrixTimesMatrix %type_float_mat2x2 %mat1 %mat2\n"
"%extCol = OpCompositeExtract %type_float_vec2 %mulMat 0\n"
"%result = OpCompositeExtract %type_float %extCol 0\n");
- mo[O_OUT_PROD] = Op("out_prod", "%vec1 = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
+ mo[O_OUT_PROD] = Op("out_prod", FLOAT_ARITHMETIC,
+ "%vec1 = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
"%vec2 = OpCompositeConstruct %type_float_vec2 %arg2 %arg2\n"
"%mulMat = OpOuterProduct %type_float_mat2x2 %vec1 %vec2\n"
"%extCol = OpCompositeExtract %type_float_vec2 %mulMat 0\n"
"%result = OpCompositeExtract %type_float %extCol 0\n");
// comparison operations
- mo[O_ORD_EQ] = Op("ord_eq", "%boolVal = OpFOrdEqual %type_bool %arg1 %arg2\n"
+ mo[O_ORD_EQ] = Op("ord_eq", FLOAT_ARITHMETIC,
+ "%boolVal = OpFOrdEqual %type_bool %arg1 %arg2\n"
"%result = OpSelect %type_float %boolVal %c_float_1 %c_float_0\n");
- mo[O_UORD_EQ] = Op("uord_eq", "%boolVal = OpFUnordEqual %type_bool %arg1 %arg2\n"
+ mo[O_UORD_EQ] = Op("uord_eq", FLOAT_ARITHMETIC,
+ "%boolVal = OpFUnordEqual %type_bool %arg1 %arg2\n"
"%result = OpSelect %type_float %boolVal %c_float_1 %c_float_0\n");
- mo[O_ORD_NEQ] = Op("ord_neq", "%boolVal = OpFOrdNotEqual %type_bool %arg1 %arg2\n"
+ mo[O_ORD_NEQ] = Op("ord_neq", FLOAT_ARITHMETIC,
+ "%boolVal = OpFOrdNotEqual %type_bool %arg1 %arg2\n"
"%result = OpSelect %type_float %boolVal %c_float_1 %c_float_0\n");
- mo[O_UORD_NEQ] = Op("uord_neq", "%boolVal = OpFUnordNotEqual %type_bool %arg1 %arg2\n"
+ mo[O_UORD_NEQ] = Op("uord_neq", FLOAT_ARITHMETIC,
+ "%boolVal = OpFUnordNotEqual %type_bool %arg1 %arg2\n"
"%result = OpSelect %type_float %boolVal %c_float_1 %c_float_0\n");
- mo[O_ORD_LS] = Op("ord_ls", "%boolVal = OpFOrdLessThan %type_bool %arg1 %arg2\n"
+ mo[O_ORD_LS] = Op("ord_ls", FLOAT_ARITHMETIC,
+ "%boolVal = OpFOrdLessThan %type_bool %arg1 %arg2\n"
"%result = OpSelect %type_float %boolVal %c_float_1 %c_float_0\n");
- mo[O_UORD_LS] = Op("uord_ls", "%boolVal = OpFUnordLessThan %type_bool %arg1 %arg2\n"
+ mo[O_UORD_LS] = Op("uord_ls", FLOAT_ARITHMETIC,
+ "%boolVal = OpFUnordLessThan %type_bool %arg1 %arg2\n"
"%result = OpSelect %type_float %boolVal %c_float_1 %c_float_0\n");
- mo[O_ORD_GT] = Op("ord_gt", "%boolVal = OpFOrdGreaterThan %type_bool %arg1 %arg2\n"
+ mo[O_ORD_GT] = Op("ord_gt", FLOAT_ARITHMETIC,
+ "%boolVal = OpFOrdGreaterThan %type_bool %arg1 %arg2\n"
"%result = OpSelect %type_float %boolVal %c_float_1 %c_float_0\n");
- mo[O_UORD_GT] = Op("uord_gt", "%boolVal = OpFUnordGreaterThan %type_bool %arg1 %arg2\n"
+ mo[O_UORD_GT] = Op("uord_gt", FLOAT_ARITHMETIC,
+ "%boolVal = OpFUnordGreaterThan %type_bool %arg1 %arg2\n"
"%result = OpSelect %type_float %boolVal %c_float_1 %c_float_0\n");
- mo[O_ORD_LE] = Op("ord_le", "%boolVal = OpFOrdLessThanEqual %type_bool %arg1 %arg2\n"
+ mo[O_ORD_LE] = Op("ord_le", FLOAT_ARITHMETIC,
+ "%boolVal = OpFOrdLessThanEqual %type_bool %arg1 %arg2\n"
"%result = OpSelect %type_float %boolVal %c_float_1 %c_float_0\n");
- mo[O_UORD_LE] = Op("uord_le", "%boolVal = OpFUnordLessThanEqual %type_bool %arg1 %arg2\n"
+ mo[O_UORD_LE] = Op("uord_le", FLOAT_ARITHMETIC,
+ "%boolVal = OpFUnordLessThanEqual %type_bool %arg1 %arg2\n"
"%result = OpSelect %type_float %boolVal %c_float_1 %c_float_0\n");
- mo[O_ORD_GE] = Op("ord_ge", "%boolVal = OpFOrdGreaterThanEqual %type_bool %arg1 %arg2\n"
+ mo[O_ORD_GE] = Op("ord_ge", FLOAT_ARITHMETIC,
+ "%boolVal = OpFOrdGreaterThanEqual %type_bool %arg1 %arg2\n"
"%result = OpSelect %type_float %boolVal %c_float_1 %c_float_0\n");
- mo[O_UORD_GE] = Op("uord_ge", "%boolVal = OpFUnordGreaterThanEqual %type_bool %arg1 %arg2\n"
+ mo[O_UORD_GE] = Op("uord_ge", FLOAT_ARITHMETIC,
+ "%boolVal = OpFUnordGreaterThanEqual %type_bool %arg1 %arg2\n"
"%result = OpSelect %type_float %boolVal %c_float_1 %c_float_0\n");
- mo[O_ATAN2] = Op("atan2", "%result = OpExtInst %type_float %std450 Atan2 %arg1 %arg2\n");
- mo[O_POW] = Op("pow", "%result = OpExtInst %type_float %std450 Pow %arg1 %arg2\n");
- mo[O_MIX] = Op("mix", "%result = OpExtInst %type_float %std450 FMix %arg1 %arg2 %c_float_0_5\n");
- mo[O_FMA] = Op("fma", "%result = OpExtInst %type_float %std450 Fma %arg1 %arg2 %c_float_0_5\n");
- mo[O_MIN] = Op("min", "%result = OpExtInst %type_float %std450 FMin %arg1 %arg2\n");
- mo[O_MAX] = Op("max", "%result = OpExtInst %type_float %std450 FMax %arg1 %arg2\n");
- mo[O_CLAMP] = Op("clamp", "%result = OpExtInst %type_float %std450 FClamp %arg1 %arg2 %arg2\n");
- mo[O_STEP] = Op("step", "%result = OpExtInst %type_float %std450 Step %arg1 %arg2\n");
- mo[O_SSTEP] = Op("sstep", "%result = OpExtInst %type_float %std450 SmoothStep %arg1 %arg2 %c_float_0_5\n");
- mo[O_DIST] = Op("distance", "%result = OpExtInst %type_float %std450 Distance %arg1 %arg2\n");
- mo[O_CROSS] = Op("cross", "%vec1 = OpCompositeConstruct %type_float_vec3 %arg1 %arg1 %arg1\n"
+ mo[O_ATAN2] = Op("atan2", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Atan2 %arg1 %arg2\n");
+ mo[O_POW] = Op("pow", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Pow %arg1 %arg2\n");
+ mo[O_MIX] = Op("mix", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 FMix %arg1 %arg2 %c_float_0_5\n");
+ mo[O_FMA] = Op("fma", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Fma %arg1 %arg2 %c_float_0_5\n");
+ mo[O_MIN] = Op("min", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 FMin %arg1 %arg2\n");
+ mo[O_MAX] = Op("max", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 FMax %arg1 %arg2\n");
+ mo[O_CLAMP] = Op("clamp", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 FClamp %arg1 %arg2 %arg2\n");
+ mo[O_STEP] = Op("step", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Step %arg1 %arg2\n");
+ mo[O_SSTEP] = Op("sstep", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 SmoothStep %arg1 %arg2 %c_float_0_5\n");
+ mo[O_DIST] = Op("distance", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Distance %arg1 %arg2\n");
+ mo[O_CROSS] = Op("cross", FLOAT_ARITHMETIC,
+ "%vec1 = OpCompositeConstruct %type_float_vec3 %arg1 %arg1 %arg1\n"
"%vec2 = OpCompositeConstruct %type_float_vec3 %arg2 %arg2 %arg2\n"
"%tmpVec = OpExtInst %type_float_vec3 %std450 Cross %vec1 %vec2\n"
"%result = OpCompositeExtract %type_float %tmpVec 0\n");
- mo[O_FACE_FWD] = Op("face_fwd", "%result = OpExtInst %type_float %std450 FaceForward %c_float_1 %arg1 %arg2\n");
- mo[O_NMIN] = Op("nmin", "%result = OpExtInst %type_float %std450 NMin %arg1 %arg2\n");
- mo[O_NMAX] = Op("nmax", "%result = OpExtInst %type_float %std450 NMax %arg1 %arg2\n");
- mo[O_NCLAMP] = Op("nclamp", "%result = OpExtInst %type_float %std450 NClamp %arg2 %arg1 %arg2\n");
+ mo[O_FACE_FWD] = Op("face_fwd", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 FaceForward %c_float_1 %arg1 %arg2\n");
+ mo[O_NMIN] = Op("nmin", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 NMin %arg1 %arg2\n");
+ mo[O_NMAX] = Op("nmax", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 NMax %arg1 %arg2\n");
+ mo[O_NCLAMP] = Op("nclamp", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 NClamp %arg2 %arg1 %arg2\n");
- mo[O_ROUND] = Op("round", "%result = OpExtInst %type_float %std450 Round %arg1\n");
- mo[O_ROUND_EV] = Op("round_ev", "%result = OpExtInst %type_float %std450 RoundEven %arg1\n");
- mo[O_TRUNC] = Op("trunc", "%result = OpExtInst %type_float %std450 Trunc %arg1\n");
- mo[O_ABS] = Op("abs", "%result = OpExtInst %type_float %std450 FAbs %arg1\n");
- mo[O_SIGN] = Op("sign", "%result = OpExtInst %type_float %std450 FSign %arg1\n");
- mo[O_FLOOR] = Op("floor", "%result = OpExtInst %type_float %std450 Floor %arg1\n");
- mo[O_CEIL] = Op("ceil", "%result = OpExtInst %type_float %std450 Ceil %arg1\n");
- mo[O_FRACT] = Op("fract", "%result = OpExtInst %type_float %std450 Fract %arg1\n");
- mo[O_RADIANS] = Op("radians", "%result = OpExtInst %type_float %std450 Radians %arg1\n");
- mo[O_DEGREES] = Op("degrees", "%result = OpExtInst %type_float %std450 Degrees %arg1\n");
- mo[O_SIN] = Op("sin", "%result = OpExtInst %type_float %std450 Sin %arg1\n");
- mo[O_COS] = Op("cos", "%result = OpExtInst %type_float %std450 Cos %arg1\n");
- mo[O_TAN] = Op("tan", "%result = OpExtInst %type_float %std450 Tan %arg1\n");
- mo[O_ASIN] = Op("asin", "%result = OpExtInst %type_float %std450 Asin %arg1\n");
- mo[O_ACOS] = Op("acos", "%result = OpExtInst %type_float %std450 Acos %arg1\n");
- mo[O_ATAN] = Op("atan", "%result = OpExtInst %type_float %std450 Atan %arg1\n");
- mo[O_SINH] = Op("sinh", "%result = OpExtInst %type_float %std450 Sinh %arg1\n");
- mo[O_COSH] = Op("cosh", "%result = OpExtInst %type_float %std450 Cosh %arg1\n");
- mo[O_TANH] = Op("tanh", "%result = OpExtInst %type_float %std450 Tanh %arg1\n");
- mo[O_ASINH] = Op("asinh", "%result = OpExtInst %type_float %std450 Asinh %arg1\n");
- mo[O_ACOSH] = Op("acosh", "%result = OpExtInst %type_float %std450 Acosh %arg1\n");
- mo[O_ATANH] = Op("atanh", "%result = OpExtInst %type_float %std450 Atanh %arg1\n");
- mo[O_EXP] = Op("exp", "%result = OpExtInst %type_float %std450 Exp %arg1\n");
- mo[O_LOG] = Op("log", "%result = OpExtInst %type_float %std450 Log %arg1\n");
- mo[O_EXP2] = Op("exp2", "%result = OpExtInst %type_float %std450 Exp2 %arg1\n");
- mo[O_LOG2] = Op("log2", "%result = OpExtInst %type_float %std450 Log2 %arg1\n");
- mo[O_SQRT] = Op("sqrt", "%result = OpExtInst %type_float %std450 Sqrt %arg1\n");
- mo[O_INV_SQRT] = Op("inv_sqrt", "%result = OpExtInst %type_float %std450 InverseSqrt %arg1\n");
- mo[O_MODF] = Op("modf", "",
+ mo[O_ROUND] = Op("round", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Round %arg1\n");
+ mo[O_ROUND_EV] = Op("round_ev", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 RoundEven %arg1\n");
+ mo[O_TRUNC] = Op("trunc", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Trunc %arg1\n");
+ mo[O_ABS] = Op("abs", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 FAbs %arg1\n");
+ mo[O_SIGN] = Op("sign", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 FSign %arg1\n");
+ mo[O_FLOOR] = Op("floor", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Floor %arg1\n");
+ mo[O_CEIL] = Op("ceil", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Ceil %arg1\n");
+ mo[O_FRACT] = Op("fract", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Fract %arg1\n");
+ mo[O_RADIANS] = Op("radians", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Radians %arg1\n");
+ mo[O_DEGREES] = Op("degrees", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Degrees %arg1\n");
+ mo[O_SIN] = Op("sin", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Sin %arg1\n");
+ mo[O_COS] = Op("cos", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Cos %arg1\n");
+ mo[O_TAN] = Op("tan", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Tan %arg1\n");
+ mo[O_ASIN] = Op("asin", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Asin %arg1\n");
+ mo[O_ACOS] = Op("acos", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Acos %arg1\n");
+ mo[O_ATAN] = Op("atan", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Atan %arg1\n");
+ mo[O_SINH] = Op("sinh", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Sinh %arg1\n");
+ mo[O_COSH] = Op("cosh", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Cosh %arg1\n");
+ mo[O_TANH] = Op("tanh", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Tanh %arg1\n");
+ mo[O_ASINH] = Op("asinh", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Asinh %arg1\n");
+ mo[O_ACOSH] = Op("acosh", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Acosh %arg1\n");
+ mo[O_ATANH] = Op("atanh", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Atanh %arg1\n");
+ mo[O_EXP] = Op("exp", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Exp %arg1\n");
+ mo[O_LOG] = Op("log", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Log %arg1\n");
+ mo[O_EXP2] = Op("exp2", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Exp2 %arg1\n");
+ mo[O_LOG2] = Op("log2", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Log2 %arg1\n");
+ mo[O_SQRT] = Op("sqrt", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Sqrt %arg1\n");
+ mo[O_INV_SQRT] = Op("inv_sqrt", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 InverseSqrt %arg1\n");
+ mo[O_MODF] = Op("modf", FLOAT_ARITHMETIC,
+ "",
"",
"",
"%tmpVarPtr = OpVariable %type_float_fptr Function\n",
+ "",
"%result = OpExtInst %type_float %std450 Modf %arg1 %tmpVarPtr\n");
- mo[O_MODF_ST] = Op("modf_st", "OpMemberDecorate %struct_ff 0 Offset ${float_width}\n"
+ mo[O_MODF_ST] = Op("modf_st", FLOAT_ARITHMETIC,
+ "OpMemberDecorate %struct_ff 0 Offset ${float_width}\n"
"OpMemberDecorate %struct_ff 1 Offset ${float_width}\n",
"%struct_ff = OpTypeStruct %type_float %type_float\n"
"%struct_ff_fptr = OpTypePointer Function %struct_ff\n",
"",
"%tmpStructPtr = OpVariable %struct_ff_fptr Function\n",
+ "",
"%tmpStruct = OpExtInst %struct_ff %std450 ModfStruct %arg1\n"
" OpStore %tmpStructPtr %tmpStruct\n"
"%tmpLoc = OpAccessChain %type_float_fptr %tmpStructPtr %c_i32_0\n"
"%result = OpLoad %type_float %tmpLoc\n");
- mo[O_FREXP] = Op("frexp", "",
+ mo[O_FREXP] = Op("frexp", FLOAT_ARITHMETIC,
+ "",
"",
"",
"%tmpVarPtr = OpVariable %type_i32_fptr Function\n",
+ "",
"%result = OpExtInst %type_float %std450 Frexp %arg1 %tmpVarPtr\n");
- mo[O_FREXP_ST] = Op("frexp_st", "OpMemberDecorate %struct_fi 0 Offset ${float_width}\n"
+ mo[O_FREXP_ST] = Op("frexp_st", FLOAT_ARITHMETIC,
+ "OpMemberDecorate %struct_fi 0 Offset ${float_width}\n"
"OpMemberDecorate %struct_fi 1 Offset 32\n",
"%struct_fi = OpTypeStruct %type_float %type_i32\n"
"%struct_fi_fptr = OpTypePointer Function %struct_fi\n",
"",
"%tmpStructPtr = OpVariable %struct_fi_fptr Function\n",
+ "",
"%tmpStruct = OpExtInst %struct_fi %std450 FrexpStruct %arg1\n"
" OpStore %tmpStructPtr %tmpStruct\n"
"%tmpLoc = OpAccessChain %type_float_fptr %tmpStructPtr %c_i32_0\n"
"%result = OpLoad %type_float %tmpLoc\n");
- mo[O_LENGHT] = Op("length", "%result = OpExtInst %type_float %std450 Length %arg1\n");
- mo[O_NORMALIZE] = Op("normalize", "%vec1 = OpCompositeConstruct %type_float_vec2 %arg1 %c_float_2\n"
+ mo[O_LENGHT] = Op("length", FLOAT_ARITHMETIC,
+ "%result = OpExtInst %type_float %std450 Length %arg1\n");
+ mo[O_NORMALIZE] = Op("normalize", FLOAT_ARITHMETIC,
+ "%vec1 = OpCompositeConstruct %type_float_vec2 %arg1 %c_float_2\n"
"%tmpVec = OpExtInst %type_float_vec2 %std450 Normalize %vec1\n"
"%result = OpCompositeExtract %type_float %tmpVec 0\n");
- mo[O_REFLECT] = Op("reflect", "%vec1 = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
+ mo[O_REFLECT] = Op("reflect", FLOAT_ARITHMETIC,
+ "%vec1 = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
"%vecN = OpCompositeConstruct %type_float_vec2 %c_float_0 %c_float_n1\n"
"%tmpVec = OpExtInst %type_float_vec2 %std450 Reflect %vec1 %vecN\n"
"%result = OpCompositeExtract %type_float %tmpVec 0\n");
- mo[O_REFRACT] = Op("refract", "%vec1 = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
+ mo[O_REFRACT] = Op("refract", FLOAT_ARITHMETIC,
+ "%vec1 = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
"%vecN = OpCompositeConstruct %type_float_vec2 %c_float_0 %c_float_n1\n"
"%tmpVec = OpExtInst %type_float_vec2 %std450 Refract %vec1 %vecN %c_float_0_5\n"
"%result = OpCompositeExtract %type_float %tmpVec 0\n");
- mo[O_MAT_DET] = Op("mat_det", "%col = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
+ mo[O_MAT_DET] = Op("mat_det", FLOAT_ARITHMETIC,
+ "%col = OpCompositeConstruct %type_float_vec2 %arg1 %arg1\n"
"%mat = OpCompositeConstruct %type_float_mat2x2 %col %col\n"
"%result = OpExtInst %type_float %std450 Determinant %mat\n");
- mo[O_MAT_INV] = Op("mat_inv", "%col1 = OpCompositeConstruct %type_float_vec2 %arg1 %c_float_1\n"
+ mo[O_MAT_INV] = Op("mat_inv", FLOAT_ARITHMETIC,
+ "%col1 = OpCompositeConstruct %type_float_vec2 %arg1 %c_float_1\n"
"%col2 = OpCompositeConstruct %type_float_vec2 %c_float_1 %c_float_1\n"
"%mat = OpCompositeConstruct %type_float_mat2x2 %col1 %col2\n"
"%invMat = OpExtInst %type_float_mat2x2 %std450 MatrixInverse %mat\n"
@@ -1638,11 +1822,13 @@
// PackHalf2x16 is a special case as it operates on fp32 vec2 and returns unsigned int,
// the verification is done in SPIR-V code (if result is correct 1.0 will be written to SSBO)
- mo[O_PH_DENORM] = Op("ph_denorm", "",
+ mo[O_PH_DENORM] = Op("ph_denorm", FLOAT_STORAGE_ONLY,
+ "",
"",
"%c_fp32_denorm_fp16 = OpConstant %type_f32 6.01e-5\n" // fp32 representation of fp16 denorm value
"%c_ref = OpConstant %type_u32 66061296\n",
"",
+ "",
"%srcVec = OpCompositeConstruct %type_f32_vec2 %c_fp32_denorm_fp16 %c_fp32_denorm_fp16\n"
"%packedInt = OpExtInst %type_u32 %std450 PackHalf2x16 %srcVec\n"
"%boolVal = OpIEqual %type_bool %c_ref %packedInt\n"
@@ -1650,20 +1836,24 @@
// UnpackHalf2x16 is a special case that operates on uint32 and returns two 32-bit floats,
// this function is tested using constants
- mo[O_UPH_DENORM] = Op("uph_denorm", "",
+ mo[O_UPH_DENORM] = Op("uph_denorm", FLOAT_STORAGE_ONLY,
+ "",
"",
"%c_u32_2_16_pack = OpConstant %type_u32 66061296\n", // == packHalf2x16(vec2(denorm))
"",
+ "",
"%tmpVec = OpExtInst %type_f32_vec2 %std450 UnpackHalf2x16 %c_u32_2_16_pack\n"
"%result = OpCompositeExtract %type_f32 %tmpVec 0\n");
// PackDouble2x32 is a special case that operates on two uint32 and returns
// double, this function is tested using constants
- mo[O_PD_DENORM] = Op("pd_denorm", "",
+ mo[O_PD_DENORM] = Op("pd_denorm", FLOAT_STORAGE_ONLY,
+ "",
"",
"%c_p1 = OpConstant %type_u32 0\n"
"%c_p2 = OpConstant %type_u32 262144\n", // == UnpackDouble2x32(denorm)
"",
+ "",
"%srcVec = OpCompositeConstruct %type_u32_vec2 %c_p1 %c_p2\n"
"%result = OpExtInst %type_f64 %std450 PackDouble2x32 %srcVec\n");
@@ -1675,26 +1865,28 @@
"%boolVec2 = OpIEqual %type_bool_vec2 %refVec2 %resVec2\n"
"%boolVal = OpAll %type_bool %boolVec2\n"
"%result = OpSelect %type_f64 %boolVal %c_f64_1 %c_f64_0\n";
- mo[O_UPD_DENORM_FLUSH] = Op("upd_denorm", "",
+ mo[O_UPD_DENORM_FLUSH] = Op("upd_denorm", FLOAT_STORAGE_ONLY, "",
unpackDouble2x32Types,
"%c_p1 = OpConstant %type_u32 0\n"
"%c_p2 = OpConstant %type_u32 0\n",
"",
+ "",
unpackDouble2x32Source);
- mo[O_UPD_DENORM_PRESERVE] = Op("upd_denorm", "",
+ mo[O_UPD_DENORM_PRESERVE] = Op("upd_denorm", FLOAT_STORAGE_ONLY, "",
unpackDouble2x32Types,
"%c_p1 = OpConstant %type_u32 1008\n"
"%c_p2 = OpConstant %type_u32 0\n",
"",
+ "",
unpackDouble2x32Source);
- mo[O_ORTE_ROUND] = Op("orte_round", FP32,
- "OpDecorate %result FPRoundingMode RTE\n",
+ mo[O_ORTE_ROUND] = Op("orte_round", FLOAT_STORAGE_ONLY, FP32,
+ "OpDecorate %result FPRoundingMode RTE\n",
"",
"",
"%result = OpFConvert %type_f16 %arg1\n");
- mo[O_ORTZ_ROUND] = Op("ortz_round", FP32,
- "OpDecorate %result FPRoundingMode RTZ\n",
+ mo[O_ORTZ_ROUND] = Op("ortz_round", FLOAT_STORAGE_ONLY, FP32,
+ "OpDecorate %result FPRoundingMode RTZ\n",
"",
"",
"%result = OpFConvert %type_f16 %arg1\n");
@@ -2026,6 +2218,99 @@
return false;
}
+template <typename FLOAT_TYPE>
+double getFloatTypeAsDouble(FLOAT_TYPE param)
+{
+ return param;
+}
+template<> double getFloatTypeAsDouble(deFloat16 param)
+{
+ return deFloat16To64(param);
+}
+
+
+double getPrecisionAt(double value, float ulp, int mantissaBits)
+{
+ if (mantissaBits == 23)
+ {
+ FloatFormat fp32Format(-126, 127, 23, true, tcu::MAYBE, tcu::YES, tcu::MAYBE);
+ return fp32Format.ulp(value, ulp);
+ }
+ else if (mantissaBits == 52)
+ {
+ FloatFormat fp32Format(-1022, 1023, 52, true, tcu::MAYBE, tcu::YES, tcu::MAYBE);
+ return fp32Format.ulp(value, ulp);
+ }
+ else
+ {
+ DE_ASSERT(mantissaBits == 10);
+ FloatFormat fp16Format(-14, 15, 10, true, tcu::MAYBE);
+ return fp16Format.ulp(value, ulp);
+ }
+}
+
+template <typename TYPE, typename FLOAT_TYPE, typename REF_FUNCTION>
+bool isLogResultCorrect(const TYPE& returnedFloat, FLOAT_TYPE param, REF_FUNCTION refFunction, TestLog& log)
+{
+ if (returnedFloat.isInf() && returnedFloat.signBit())
+ return true;
+
+ const double expected = refFunction(getFloatTypeAsDouble(param));
+ const double precision = getPrecisionAt(expected, 3.0, returnedFloat.MANTISSA_BITS);
+
+ if (deAbs(returnedFloat.asDouble() - expected) < precision)
+ return true;
+
+ log << TestLog::Message << "Expected result to be -INF or in range"
+ << " (" << expected - precision << ", " << expected + precision << "), got "
+ << returnedFloat.asDouble() << TestLog::EndMessage;
+ return false;
+}
+
+template <typename TYPE, typename FLOAT_TYPE>
+bool isInverseSqrtResultCorrect(const TYPE& returnedFloat, FLOAT_TYPE param, TestLog& log)
+{
+ if (returnedFloat.isInf() && !returnedFloat.signBit())
+ return true;
+
+ const double expected = 1.0/ deSqrt(getFloatTypeAsDouble(param));
+ const double precision = getPrecisionAt(expected, 2.0, returnedFloat.MANTISSA_BITS);
+
+ if (deAbs(returnedFloat.asDouble() - expected) < precision)
+ return true;
+
+ log << TestLog::Message << "Expected result to be INF or in range"
+ << " (" << expected - precision << ", " << expected + precision << "), got "
+ << returnedFloat.asDouble() << TestLog::EndMessage;
+ return false;
+}
+
+template <typename TYPE, typename FLOAT_TYPE>
+bool isSqrtResultCorrect(const TYPE& returnedFloat, FLOAT_TYPE param, TestLog& log)
+{
+ if (returnedFloat.isZero() && !returnedFloat.signBit())
+ return true;
+
+
+ const double expected = deSqrt(getFloatTypeAsDouble(param));
+ const double expectedInverseSqrt = 1.0 / expected;
+ const double inverseSqrtPrecision = getPrecisionAt(expectedInverseSqrt, 2.0, returnedFloat.MANTISSA_BITS);
+
+ double expectedMin = deMin(1.0 / (expectedInverseSqrt - inverseSqrtPrecision), 1.0 / (expectedInverseSqrt + inverseSqrtPrecision));
+ double expectedMax = deMax(1.0 / (expectedInverseSqrt - inverseSqrtPrecision), 1.0 / (expectedInverseSqrt + inverseSqrtPrecision));
+
+ expectedMin -= getPrecisionAt(expectedMin, 2.5, returnedFloat.MANTISSA_BITS);
+ expectedMax += getPrecisionAt(expectedMax, 2.5, returnedFloat.MANTISSA_BITS);
+
+ if (returnedFloat.asDouble() >= expectedMin && returnedFloat.asDouble() <= expectedMax)
+ return true;
+
+ log << TestLog::Message << "Expected result to be +0 or in range"
+ << " (" << expectedMin << ", " << expectedMax << "), got "
+ << returnedFloat.asDouble() << TestLog::EndMessage;
+ return false;
+}
+
// Function used to compare test result with expected output.
// TYPE can be Float16, Float32 or Float64.
// FLOAT_TYPE can be deFloat16, float, double.
@@ -2084,6 +2369,8 @@
log << TestLog::Message << "Expected 0 or -0" << TestLog::EndMessage;
return false;
}
+ if (expectedValueId == V_ZERO_OR_ONE)
+ return isZeroOrOtherValue<TYPE, FLOAT_TYPE>(returnedFloat, V_ONE, log);
if ((expectedValueId == V_ZERO_OR_FP16_DENORM_TO_FP32) || (expectedValueId == V_ZERO_OR_FP16_DENORM_TO_FP64))
return isZeroOrOtherValue<TYPE, FLOAT_TYPE>(returnedFloat, V_CONV_DENORM_SMALLER, log);
if (expectedValueId == V_ZERO_OR_FP32_DENORM_TO_FP64)
@@ -2105,6 +2392,20 @@
return isAcosResultCorrect<TYPE>(returnedFloat, log);
TypeValues<FLOAT_TYPE> typeValues;
+
+ if (expectedValueId == V_MINUS_INF_OR_LOG_DENORM)
+ return isLogResultCorrect<TYPE>(returnedFloat, typeValues.getValue(V_DENORM), deLog, log);
+
+ if (expectedValueId == V_MINUS_INF_OR_LOG2_DENORM)
+ return isLogResultCorrect<TYPE>(returnedFloat, typeValues.getValue(V_DENORM), deLog2, log);
+
+ if (expectedValueId == V_ZERO_OR_SQRT_DENORM)
+ return isSqrtResultCorrect<TYPE>(returnedFloat, typeValues.getValue(V_DENORM), log);
+
+ if (expectedValueId == V_INF_OR_INV_SQRT_DENORM)
+ return isInverseSqrtResultCorrect<TYPE>(returnedFloat, typeValues.getValue(V_DENORM), log);
+
+
typename RawConvert<FLOAT_TYPE, SType>::Value value;
value.fp = typeValues.getValue(expectedValueId);
@@ -2118,9 +2419,9 @@
template <typename TYPE, typename FLOAT_TYPE>
bool checkFloats (const vector<Resource>& ,
- const vector<AllocationSp>& outputAllocs,
- const vector<Resource>& expectedOutputs,
- TestLog& log)
+ const vector<AllocationSp>& outputAllocs,
+ const vector<Resource>& expectedOutputs,
+ TestLog& log)
{
if (outputAllocs.size() != expectedOutputs.size())
return false;
@@ -2137,6 +2438,40 @@
return true;
}
+bool checkMixedFloats (const vector<Resource>& ,
+ const vector<AllocationSp>& outputAllocs,
+ const vector<Resource>& expectedOutputs,
+ TestLog& log)
+{
+ // this function validates buffers containing floats of diferent widths, order is not important
+
+ if (outputAllocs.size() != expectedOutputs.size())
+ return false;
+
+ // create map storing functions that should be used for comparision
+ // depending on float width in bytes; this lets us later to avoid switch in while
+ typedef bool (*compareFun)(vector<deUint8>& expectedBytes, AllocationSp outputAlloc, TestLog& log);
+ const map<size_t, compareFun> compareMap =
+ {
+ { 2, compareBytes<Float16, deFloat16> },
+ { 4, compareBytes<Float32, float> },
+ { 8, compareBytes<Float64, double>},
+ };
+
+ vector<deUint8> expectedBytes;
+ bool allResultsAreCorrect = true;
+ int resultIndex = static_cast<int>(outputAllocs.size());
+
+ while (resultIndex--)
+ {
+ expectedOutputs[resultIndex].getBytes(expectedBytes);
+ size_t byteWidth = expectedOutputs[resultIndex].getByteSize();
+ allResultsAreCorrect &= compareMap.at(byteWidth)(expectedBytes, outputAllocs[resultIndex], log);
+ }
+
+ return allResultsAreCorrect;
+}
+
// Base class for ComputeTestGroupBuilder and GrephicstestGroupBuilder classes.
// It contains all functionalities that are used by both child classes.
class TestGroupBuilderBase
@@ -2144,20 +2479,21 @@
public:
TestGroupBuilderBase();
- virtual ~TestGroupBuilderBase() {}
+ virtual ~TestGroupBuilderBase() = default;
- void init();
+ virtual void createOperationTests(TestCaseGroup* parentGroup,
+ const char* groupName,
+ FloatType floatType,
+ bool argumentsFromInput) = 0;
- virtual void createTests(TestCaseGroup* group,
- FloatType floatType,
- bool argumentsFromInput) = 0;
+ virtual void createSettingsTests(TestCaseGroup* parentGroup) = 0;
protected:
typedef vector<OperationTestCase> TestCaseVect;
- // Structure containing all data required to create single test.
- struct TestCaseInfo
+ // Structure containing all data required to create single operation test.
+ struct OperationTestCaseInfo
{
FloatType outFloatType;
bool argumentsFromInput;
@@ -2166,8 +2502,38 @@
const OperationTestCase& testCase;
};
- void specializeOperation(const TestCaseInfo& testCaseInfo,
- SpecializedOperation& specializedOperation) const;
+ // Mode used by SettingsTestCaseInfo to specify what settings do we want to test.
+ enum SettingsMode
+ {
+ SM_ROUNDING = 0,
+ SM_DENORMS
+ };
+
+ // Enum containing available options. When rounding is tested only SO_RTE and SO_RTZ
+ // should be used. SO_FLUSH and SO_PRESERVE should be used only for denorm tests.
+ enum SettingsOption
+ {
+ SO_UNUSED = 0,
+ SO_RTE,
+ SO_RTZ,
+ SO_FLUSH,
+ SO_PRESERVE
+ };
+
+ // Structure containing all data required to create single settings test.
+ struct SettingsTestCaseInfo
+ {
+ const char* name;
+ SettingsMode testedMode;
+ VkShaderFloatControlsIndependence independenceSetting;
+
+ SettingsOption fp16Option;
+ SettingsOption fp32Option;
+ SettingsOption fp64Option;
+ };
+
+ void specializeOperation(const OperationTestCaseInfo& testCaseInfo,
+ SpecializedOperation& specializedOperation) const;
void getBehaviorCapabilityAndExecutionMode(BehaviorFlags behaviorFlags,
const string inBitWidth,
@@ -2220,8 +2586,8 @@
m_behaviorToName[B_RTZ_ROUNDING] = "RoundingModeRTZ";
}
-void TestGroupBuilderBase::specializeOperation(const TestCaseInfo& testCaseInfo,
- SpecializedOperation& specializedOperation) const
+void TestGroupBuilderBase::specializeOperation(const OperationTestCaseInfo& testCaseInfo,
+ SpecializedOperation& specializedOperation) const
{
const string typeToken = "_float";
const string widthToken = "${float_width}";
@@ -2245,6 +2611,7 @@
specializedOperation.annotations = replace(operation.annotations, widthToken, outTypeSnippets->bitWidth);
specializedOperation.types = replace(operation.types, typeToken, outTypePrefix);
specializedOperation.variables = replace(operation.variables, typeToken, outTypePrefix);
+ specializedOperation.functions = replace(operation.functions, typeToken, outTypePrefix);
specializedOperation.commands = replace(operation.commands, typeToken, outTypePrefix);
specializedOperation.inFloatType = inFloatType;
@@ -2357,6 +2724,87 @@
}
}
+// Test case not related to SPIR-V but executed with compute tests. It checks if specified
+// features are set to the same value when specific independence settings are used.
+tcu::TestStatus verifyIndependenceSettings(Context& context)
+{
+ if (!context.isDeviceFunctionalitySupported("VK_KHR_shader_float_controls"))
+ TCU_THROW(NotSupportedError, "VK_KHR_shader_float_controls not supported");
+
+ vk::VkPhysicalDeviceFloatControlsPropertiesKHR fcProperties;
+ fcProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR;
+ fcProperties.pNext = DE_NULL;
+
+ vk::VkPhysicalDeviceProperties2 deviceProperties;
+ deviceProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
+ deviceProperties.pNext = &fcProperties;
+
+ auto fail = [](const string& featureGroup)
+ {
+ return tcu::TestStatus::fail(featureGroup + " features should be set to the same value");
+ };
+
+ const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
+ const vk::InstanceInterface& instanceInterface = context.getInstanceInterface();
+ instanceInterface.getPhysicalDeviceProperties2(physicalDevice, &deviceProperties);
+
+ if (fcProperties.roundingModeIndependence == VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE_KHR)
+ {
+ vk::VkBool32 fp16rte = fcProperties.shaderRoundingModeRTEFloat16;
+ vk::VkBool32 fp32rte = fcProperties.shaderRoundingModeRTEFloat32;
+ vk::VkBool32 fp64rte = fcProperties.shaderRoundingModeRTEFloat64;
+ if ((fp16rte != fp32rte) || (fp32rte != fp64rte))
+ return fail("shaderRoundingModeRTEFloat*");
+
+ vk::VkBool32 fp16rtz = fcProperties.shaderRoundingModeRTZFloat16;
+ vk::VkBool32 fp32rtz = fcProperties.shaderRoundingModeRTZFloat32;
+ vk::VkBool32 fp64rtz = fcProperties.shaderRoundingModeRTZFloat64;
+ if ((fp16rtz != fp32rtz) || (fp32rtz != fp64rtz))
+ return fail("shaderRoundingModeRTZFloat*");
+ }
+ else if (fcProperties.roundingModeIndependence == VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY_KHR)
+ {
+ vk::VkBool32 fp16rte = fcProperties.shaderRoundingModeRTEFloat16;
+ vk::VkBool32 fp64rte = fcProperties.shaderRoundingModeRTEFloat64;
+ if ((fp16rte != fp64rte))
+ return fail("shaderRoundingModeRTEFloat16 and 64");
+
+ vk::VkBool32 fp16rtz = fcProperties.shaderRoundingModeRTZFloat16;
+ vk::VkBool32 fp64rtz = fcProperties.shaderRoundingModeRTZFloat64;
+ if ((fp16rtz != fp64rtz))
+ return fail("shaderRoundingModeRTZFloat16 and 64");
+ }
+
+ if (fcProperties.denormBehaviorIndependence == VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE_KHR)
+ {
+ vk::VkBool32 fp16flush = fcProperties.shaderDenormFlushToZeroFloat16;
+ vk::VkBool32 fp32flush = fcProperties.shaderDenormFlushToZeroFloat32;
+ vk::VkBool32 fp64flush = fcProperties.shaderDenormFlushToZeroFloat64;
+ if ((fp16flush != fp32flush) || (fp32flush != fp64flush))
+ return fail("shaderDenormFlushToZeroFloat*");
+
+ vk::VkBool32 fp16preserve = fcProperties.shaderDenormPreserveFloat16;
+ vk::VkBool32 fp32preserve = fcProperties.shaderDenormPreserveFloat32;
+ vk::VkBool32 fp64preserve = fcProperties.shaderDenormPreserveFloat64;
+ if ((fp16preserve != fp32preserve) || (fp32preserve != fp64preserve))
+ return fail("shaderDenormPreserveFloat*");
+ }
+ else if (fcProperties.denormBehaviorIndependence == VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY_KHR)
+ {
+ vk::VkBool32 fp16flush = fcProperties.shaderDenormFlushToZeroFloat16;
+ vk::VkBool32 fp64flush = fcProperties.shaderDenormFlushToZeroFloat64;
+ if ((fp16flush != fp64flush))
+ return fail("shaderDenormFlushToZeroFloat16 and 64");
+
+ vk::VkBool32 fp16preserve = fcProperties.shaderDenormPreserveFloat16;
+ vk::VkBool32 fp64preserve = fcProperties.shaderDenormPreserveFloat64;
+ if ((fp16preserve != fp64preserve))
+ return fail("shaderDenormPreserveFloat16 and 64");
+ }
+
+ return tcu::TestStatus::pass("Pass");
+}
+
// ComputeTestGroupBuilder contains logic that creates compute shaders
// for all test cases. As most tests in spirv-assembly it uses functionality
// implemented in vktSpvAsmComputeShaderTestUtil.cpp.
@@ -2366,27 +2814,35 @@
void init();
- void createTests(TestCaseGroup* group, FloatType floatType, bool argumentsFromInput);
+ void createOperationTests(TestCaseGroup* parentGroup,
+ const char* groupName,
+ FloatType floatType,
+ bool argumentsFromInput) override;
+
+ void createSettingsTests(TestCaseGroup* parentGroup) override;
protected:
- void fillShaderSpec(const TestCaseInfo& testCaseInfo,
- ComputeShaderSpec& csSpec) const;
+ void fillShaderSpec(const OperationTestCaseInfo& testCaseInfo,
+ ComputeShaderSpec& csSpec) const;
+ void fillShaderSpec(const SettingsTestCaseInfo& testCaseInfo,
+ ComputeShaderSpec& csSpec) const;
private:
- StringTemplate m_shaderTemplate;
- TestCasesBuilder m_testCaseBuilder;
+ StringTemplate m_operationShaderTemplate;
+ StringTemplate m_settingsShaderTemplate;
+ TestCasesBuilder m_operationTestCaseBuilder;
};
void ComputeTestGroupBuilder::init()
{
- m_testCaseBuilder.init();
+ m_operationTestCaseBuilder.init();
- // geenric compute shader template that has code common for all
+ // generic compute shader template with common code for all
// float types and all possible operations listed in OperationId enum
- m_shaderTemplate.setString(
+ m_operationShaderTemplate.setString(
"OpCapability Shader\n"
"${capabilities}"
@@ -2431,11 +2887,13 @@
"%id = OpVariable %type_u32_vec3_ptr Input\n"
// set of default constants per float type is placed here,
- // operation tests can also define additional constants;
- // note that O_RETURN_VAL defines function here and becouse
- // of that this token needs to be directly before main function
+ // operation tests can also define additional constants.
"${constants}"
+ // O_RETURN_VAL defines function here and becouse
+ // of that this token needs to be directly before main function
+ "${functions}"
+
"%main = OpFunction %type_void None %type_voidf\n"
"%label = OpLabel\n"
@@ -2453,13 +2911,72 @@
"OpReturn\n"
"OpFunctionEnd\n");
+
+ m_settingsShaderTemplate.setString(
+ "OpCapability Shader\n"
+ "${capabilities}"
+
+ "OpExtension \"SPV_KHR_float_controls\"\n"
+ "${extensions}"
+
+ "%std450 = OpExtInstImport \"GLSL.std.450\"\n"
+ "OpMemoryModel Logical GLSL450\n"
+ "OpEntryPoint GLCompute %main \"main\" %id\n"
+ "OpExecutionMode %main LocalSize 1 1 1\n"
+ "${execution_modes}"
+
+ // annotations
+ "OpDecorate %SSBO_in BufferBlock\n"
+ "OpDecorate %ssbo_in DescriptorSet 0\n"
+ "OpDecorate %ssbo_in Binding 0\n"
+ "OpDecorate %ssbo_in NonWritable\n"
+ "${io_annotations}"
+
+ "OpDecorate %id BuiltIn GlobalInvocationId\n"
+
+ // types
+ "%type_void = OpTypeVoid\n"
+ "%type_voidf = OpTypeFunction %type_void\n"
+ "%type_u32 = OpTypeInt 32 0\n"
+ "%type_i32 = OpTypeInt 32 1\n"
+ "%type_i32_fptr = OpTypePointer Function %type_i32\n"
+ "%type_u32_vec3 = OpTypeVector %type_u32 3\n"
+ "%type_u32_vec3_ptr = OpTypePointer Input %type_u32_vec3\n"
+
+ "%c_i32_0 = OpConstant %type_i32 0\n"
+ "%c_i32_1 = OpConstant %type_i32 1\n"
+ "%c_i32_2 = OpConstant %type_i32 2\n"
+
+ "${types}"
+
+ // in SSBO definition
+ "%SSBO_in = OpTypeStruct ${in_struct}\n"
+ "%up_SSBO_in = OpTypePointer Uniform %SSBO_in\n"
+ "%ssbo_in = OpVariable %up_SSBO_in Uniform\n"
+
+ // out SSBO definitions
+ "${out_definitions}"
+
+ "%id = OpVariable %type_u32_vec3_ptr Input\n"
+ "%main = OpFunction %type_void None %type_voidf\n"
+ "%label = OpLabel\n"
+
+ "${commands}"
+
+ "${save_result}"
+
+ "OpReturn\n"
+ "OpFunctionEnd\n");
}
-void ComputeTestGroupBuilder::createTests(TestCaseGroup* group, FloatType floatType, bool argumentsFromInput)
+void ComputeTestGroupBuilder::createOperationTests(TestCaseGroup* parentGroup, const char* groupName, FloatType floatType, bool argumentsFromInput)
{
- TestContext& testCtx = group->getTestContext();
+ TestContext& testCtx = parentGroup->getTestContext();
+ TestCaseGroup* group = new TestCaseGroup(testCtx, groupName, "");
+ parentGroup->addChild(group);
+
TestCaseVect testCases;
- m_testCaseBuilder.build(testCases, m_typeData[floatType].testResults, argumentsFromInput);
+ m_operationTestCaseBuilder.build(testCases, m_typeData[floatType].testResults, argumentsFromInput);
TestCaseVect::const_iterator currTestCase = testCases.begin();
TestCaseVect::const_iterator lastTestCase = testCases.end();
@@ -2472,12 +2989,12 @@
if (testCase.expectedOutput == V_UNUSED)
continue;
- TestCaseInfo testCaseInfo =
+ OperationTestCaseInfo testCaseInfo =
{
floatType,
argumentsFromInput,
VK_SHADER_STAGE_COMPUTE_BIT,
- m_testCaseBuilder.getOperation(testCase.operationId),
+ m_operationTestCaseBuilder.getOperation(testCase.operationId),
testCase
};
@@ -2490,8 +3007,77 @@
}
}
-void ComputeTestGroupBuilder::fillShaderSpec(const TestCaseInfo& testCaseInfo,
- ComputeShaderSpec& csSpec) const
+void ComputeTestGroupBuilder::createSettingsTests(TestCaseGroup* parentGroup)
+{
+ TestContext& testCtx = parentGroup->getTestContext();
+ TestCaseGroup* group = new TestCaseGroup(testCtx, "independence_settings", "");
+ parentGroup->addChild(group);
+
+ using SFCI = VkShaderFloatControlsIndependence;
+ const SFCI independence32 = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY_KHR;
+ const SFCI independenceAll = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL_KHR;
+
+ vector<SettingsTestCaseInfo> testCases =
+ {
+ // name mode independenceSetting fp16Option fp32Option fp64Option
+
+ // test rounding modes when only two float widths are available
+ { "rounding_ind_all_fp16_rte_fp32_rtz", SM_ROUNDING, independenceAll, SO_RTE, SO_RTZ, SO_UNUSED },
+ { "rounding_ind_all_fp16_rtz_fp32_rte", SM_ROUNDING, independenceAll, SO_RTZ, SO_RTE, SO_UNUSED },
+ { "rounding_ind_32_fp16_rte_fp32_rtz", SM_ROUNDING, independence32, SO_RTE, SO_RTZ, SO_UNUSED },
+ { "rounding_ind_32_fp16_rtz_fp32_rte", SM_ROUNDING, independence32, SO_RTZ, SO_RTE, SO_UNUSED },
+ { "rounding_ind_all_fp16_rte_fp64_rtz", SM_ROUNDING, independenceAll, SO_RTE, SO_UNUSED, SO_RTZ },
+ { "rounding_ind_all_fp16_rtz_fp64_rte", SM_ROUNDING, independenceAll, SO_RTZ, SO_UNUSED, SO_RTE },
+ { "rounding_ind_all_fp32_rte_fp64_rtz", SM_ROUNDING, independenceAll, SO_UNUSED, SO_RTE, SO_RTZ },
+ { "rounding_ind_all_fp32_rtz_fp64_rte", SM_ROUNDING, independenceAll, SO_UNUSED, SO_RTZ, SO_RTE },
+ { "rounding_ind_32_fp32_rte_fp64_rtz", SM_ROUNDING, independence32, SO_UNUSED, SO_RTE, SO_RTZ },
+ { "rounding_ind_32_fp32_rtz_fp64_rte", SM_ROUNDING, independence32, SO_UNUSED, SO_RTZ, SO_RTE },
+
+ // test rounding modes when three widths are available
+ { "rounding_ind_all_fp16_rtz_fp32_rte_fp64_rtz", SM_ROUNDING, independenceAll, SO_RTZ, SO_RTE, SO_RTZ },
+ { "rounding_ind_32_fp16_rtz_fp32_rte_fp64_rtz", SM_ROUNDING, independence32, SO_RTZ, SO_RTE, SO_RTZ },
+ { "rounding_ind_all_fp16_rte_fp32_rtz_fp64_rte", SM_ROUNDING, independenceAll, SO_RTE, SO_RTZ, SO_RTE },
+ { "rounding_ind_32_fp16_rte_fp32_rtz_fp64_rte", SM_ROUNDING, independence32, SO_RTE, SO_RTZ, SO_RTE },
+ { "rounding_ind_all_fp16_rtz_fp32_rtz_fp64_rte", SM_ROUNDING, independenceAll, SO_RTZ, SO_RTZ, SO_RTE },
+ { "rounding_ind_all_fp16_rtz_fp32_rte_fp64_rte", SM_ROUNDING, independenceAll, SO_RTZ, SO_RTE, SO_RTE },
+ { "rounding_ind_all_fp16_rte_fp32_rte_fp64_rtz", SM_ROUNDING, independenceAll, SO_RTE, SO_RTE, SO_RTZ },
+ { "rounding_ind_all_fp16_rte_fp32_rtz_fp64_rtz", SM_ROUNDING, independenceAll, SO_RTE, SO_RTZ, SO_RTZ },
+
+ // test denorm settings when only two float widths are available
+ { "denorm_ind_all_fp16_flush_fp32_preserve", SM_DENORMS, independenceAll, SO_FLUSH, SO_PRESERVE, SO_UNUSED },
+ { "denorm_ind_all_fp16_preserve_fp32_flush", SM_DENORMS, independenceAll, SO_PRESERVE, SO_FLUSH, SO_UNUSED },
+ { "denorm_ind_32_fp16_flush_fp32_preserve", SM_DENORMS, independence32, SO_FLUSH, SO_PRESERVE, SO_UNUSED },
+ { "denorm_ind_32_fp16_preserve_fp32_flush", SM_DENORMS, independence32, SO_PRESERVE, SO_FLUSH, SO_UNUSED },
+ { "denorm_ind_all_fp16_flush_fp64_preserve", SM_DENORMS, independenceAll, SO_FLUSH, SO_UNUSED, SO_PRESERVE },
+ { "denorm_ind_all_fp16_preserve_fp64_flush", SM_DENORMS, independenceAll, SO_PRESERVE, SO_UNUSED, SO_FLUSH },
+ { "denorm_ind_all_fp32_flush_fp64_preserve", SM_DENORMS, independenceAll, SO_UNUSED, SO_FLUSH, SO_PRESERVE },
+ { "denorm_ind_all_fp32_preserve_fp64_flush", SM_DENORMS, independenceAll, SO_UNUSED, SO_PRESERVE, SO_FLUSH },
+ { "denorm_ind_32_fp32_flush_fp64_preserve", SM_DENORMS, independence32, SO_UNUSED, SO_FLUSH, SO_PRESERVE },
+ { "denorm_ind_32_fp32_preserve_fp64_flush", SM_DENORMS, independence32, SO_UNUSED, SO_PRESERVE, SO_FLUSH },
+
+ // test denorm settings when three widths are available
+ { "denorm_ind_all_fp16_preserve_fp32_flush_fp64_preserve", SM_DENORMS, independenceAll, SO_PRESERVE, SO_FLUSH, SO_PRESERVE },
+ { "denorm_ind_32_fp16_preserve_fp32_flush_fp64_preserve", SM_DENORMS, independence32, SO_PRESERVE, SO_FLUSH, SO_PRESERVE },
+ { "denorm_ind_all_fp16_flush_fp32_preserve_fp64_flush", SM_DENORMS, independenceAll, SO_FLUSH, SO_PRESERVE, SO_FLUSH },
+ { "denorm_ind_32_fp16_flush_fp32_preserve_fp64_flush", SM_DENORMS, independence32, SO_FLUSH, SO_PRESERVE, SO_FLUSH },
+ { "denorm_ind_all_fp16_preserve_fp32_preserve_fp64_flush", SM_DENORMS, independenceAll, SO_PRESERVE, SO_PRESERVE, SO_FLUSH },
+ { "denorm_ind_all_fp16_preserve_fp32_flush_fp64_flush", SM_DENORMS, independenceAll, SO_PRESERVE, SO_FLUSH, SO_FLUSH },
+ { "denorm_ind_all_fp16_flush_fp32_flush_fp64_preserve", SM_DENORMS, independenceAll, SO_FLUSH, SO_FLUSH, SO_PRESERVE },
+ { "denorm_ind_all_fp16_flush_fp32_preserve_fp64_preserve", SM_DENORMS, independenceAll, SO_FLUSH, SO_PRESERVE, SO_PRESERVE }
+ };
+
+ for(const auto& testCase : testCases)
+ {
+ ComputeShaderSpec csSpec;
+ fillShaderSpec(testCase, csSpec);
+ group->addChild(new SpvAsmComputeShaderCase(testCtx, testCase.name, "", csSpec));
+ }
+
+ addFunctionCase(group, "independence_settings", "", verifyIndependenceSettings);
+}
+
+void ComputeTestGroupBuilder::fillShaderSpec(const OperationTestCaseInfo& testCaseInfo,
+ ComputeShaderSpec& csSpec) const
{
// LUT storing functions used to verify test results
const VerifyIOFunc checkFloatsLUT[] =
@@ -2548,20 +3134,45 @@
}
map<string, string> specializations;
- specializations["capabilities"] = capabilities;
specializations["extensions"] = extensions;
specializations["execution_mode"] = behaviorExecutionMode;
specializations["annotations"] = annotations + specOpData.annotations;
specializations["types"] = types + specOpData.types;
- specializations["constants"] = constants + specOpData.constans;
specializations["io_definitions"] = ioDefinitions;
- specializations["arguments"] = specOpData.arguments;
specializations["variables"] = specOpData.variables;
- specializations["commands"] = specOpData.commands;
+ specializations["functions"] = specOpData.functions;
specializations["save_result"] = outTypeSnippets->storeResultsSnippet;
+ specializations["arguments"] = specOpData.arguments;
+ specializations["commands"] = specOpData.commands;
+
+
+ // Build constants. They are only needed sometimes.
+ specializations["constants"] = "";
+ const bool argsUseFPConstants = DE_NULL != strstr(specOpData.arguments.c_str(), " %c_f");
+ const bool commandsUseFPConstants = DE_NULL != strstr(specOpData.commands.c_str(), " %c_f");
+ const bool needConstants = argsUseFPConstants || commandsUseFPConstants;
+ if (needConstants)
+ {
+ specializations["constants"] = constants;
+ }
+ specializations["constants"] += specOpData.constans;
+
+ // Various bits of text can use 16bit constants.
+ const bool usesFP16Constants = DE_NULL != strstr(specializations["constants"].c_str(), " %type_f16 ");
+
+ // check which format features are needed
+ bool float16FeatureRequired = (outFloatType == FP16) || (inFloatType == FP16);
+ bool float64FeatureRequired = (outFloatType == FP64) || (inFloatType == FP64);
+
+ // Determine required capabilities.
+ if ((testOperation.floatUsage == FLOAT_ARITHMETIC && float16FeatureRequired) || usesFP16Constants)
+ {
+ capabilities += "OpCapability Float16\n";
+ }
+ specializations["capabilities"] = capabilities;
// specialize shader
- const string shaderCode = m_shaderTemplate.specialize(specializations);
+ const string shaderCode = m_operationShaderTemplate.specialize(specializations);
// construct input and output buffers of proper types
TypeValuesSP inTypeValues = m_typeData.at(inFloatType).values;
@@ -2572,9 +3183,6 @@
csSpec.outputs.push_back(Resource(outBufferSp));
// check which format features are needed
- bool float16FeatureRequired = (outFloatType == FP16) || (inFloatType == FP16);
- bool float64FeatureRequired = (outFloatType == FP64) || (inFloatType == FP64);
-
setupVulkanFeatures(inFloatTypeForCaps, // usualy same as inFloatType - different only for UnpackHalf2x16
outFloatType,
testCase.behaviorFlags,
@@ -2586,15 +3194,239 @@
csSpec.verifyIO = checkFloatsLUT[outFloatType];
csSpec.extensions.push_back("VK_KHR_shader_float_controls");
+ bool needShaderFloat16 = false;
if (float16FeatureRequired)
{
csSpec.extensions.push_back("VK_KHR_16bit_storage");
csSpec.requestedVulkanFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK;
+ needShaderFloat16 |= testOperation.floatUsage == FLOAT_ARITHMETIC;
+ }
+ needShaderFloat16 |= usesFP16Constants;
+ if (needShaderFloat16)
+ {
+ csSpec.extensions.push_back("VK_KHR_shader_float16_int8");
+ csSpec.requestedVulkanFeatures.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
}
if (float64FeatureRequired)
csSpec.requestedVulkanFeatures.coreFeatures.shaderFloat64 = VK_TRUE;
}
+void ComputeTestGroupBuilder::fillShaderSpec(const SettingsTestCaseInfo& testCaseInfo,
+ ComputeShaderSpec& csSpec) const
+{
+ string capabilities;
+ string fp16behaviorName;
+ string fp32behaviorName;
+ string fp64behaviorName;
+
+ ValueId addArgs[2];
+ ValueId fp16resultValue;
+ ValueId fp32resultValue;
+ ValueId fp64resultValue;
+
+ ExtensionFloatControlsFeatures& floatControls = csSpec.requestedVulkanFeatures.floatControlsProperties;
+ bool fp16Required = testCaseInfo.fp16Option != SO_UNUSED;
+ bool fp32Required = testCaseInfo.fp32Option != SO_UNUSED;
+ bool fp64Required = testCaseInfo.fp64Option != SO_UNUSED;
+
+ if (testCaseInfo.testedMode == SM_ROUNDING)
+ {
+ // make sure that only rounding options are used
+ DE_ASSERT((testCaseInfo.fp16Option != SO_FLUSH) ||
+ (testCaseInfo.fp16Option != SO_PRESERVE) ||
+ (testCaseInfo.fp32Option != SO_FLUSH) ||
+ (testCaseInfo.fp32Option != SO_PRESERVE) ||
+ (testCaseInfo.fp64Option != SO_FLUSH) ||
+ (testCaseInfo.fp64Option != SO_PRESERVE));
+
+ bool fp16RteRounding = testCaseInfo.fp16Option == SO_RTE;
+ bool fp32RteRounding = testCaseInfo.fp32Option == SO_RTE;
+ bool fp64RteRounding = testCaseInfo.fp64Option == SO_RTE;
+
+ const string& rte = m_behaviorToName.at(B_RTE_ROUNDING);
+ const string& rtz = m_behaviorToName.at(B_RTZ_ROUNDING);
+
+ fp16behaviorName = fp16RteRounding ? rte : rtz;
+ fp32behaviorName = fp32RteRounding ? rte : rtz;
+ fp64behaviorName = fp64RteRounding ? rte : rtz;
+
+ addArgs[0] = V_ADD_ARG_A;
+ addArgs[1] = V_ADD_ARG_B;
+ fp16resultValue = fp16RteRounding ? V_ADD_RTE_RESULT : V_ADD_RTZ_RESULT;
+ fp32resultValue = fp32RteRounding ? V_ADD_RTE_RESULT : V_ADD_RTZ_RESULT;
+ fp64resultValue = fp64RteRounding ? V_ADD_RTE_RESULT : V_ADD_RTZ_RESULT;
+
+ capabilities = "OpCapability " + rte + "\n"
+ "OpCapability " + rtz + "\n";
+
+ floatControls.roundingModeIndependence = testCaseInfo.independenceSetting;
+ floatControls.denormBehaviorIndependence = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE_KHR;
+ floatControls.shaderRoundingModeRTEFloat16 = fp16RteRounding;
+ floatControls.shaderRoundingModeRTZFloat16 = fp16Required && !fp16RteRounding;
+ floatControls.shaderRoundingModeRTEFloat32 = fp32RteRounding;
+ floatControls.shaderRoundingModeRTZFloat32 = fp32Required && !fp32RteRounding;
+ floatControls.shaderRoundingModeRTEFloat64 = fp64RteRounding;
+ floatControls.shaderRoundingModeRTZFloat64 = fp64Required && !fp64RteRounding;
+ }
+ else // SM_DENORMS
+ {
+ // make sure that only denorm options are used
+ DE_ASSERT((testCaseInfo.fp16Option != SO_RTE) ||
+ (testCaseInfo.fp16Option != SO_RTZ) ||
+ (testCaseInfo.fp32Option != SO_RTE) ||
+ (testCaseInfo.fp32Option != SO_RTZ) ||
+ (testCaseInfo.fp64Option != SO_RTE) ||
+ (testCaseInfo.fp64Option != SO_RTZ));
+
+ bool fp16DenormPreserve = testCaseInfo.fp16Option == SO_PRESERVE;
+ bool fp32DenormPreserve = testCaseInfo.fp32Option == SO_PRESERVE;
+ bool fp64DenormPreserve = testCaseInfo.fp64Option == SO_PRESERVE;
+
+ const string& preserve = m_behaviorToName.at(B_DENORM_PRESERVE);
+ const string& flush = m_behaviorToName.at(B_DENORM_FLUSH);
+
+ fp16behaviorName = fp16DenormPreserve ? preserve : flush;
+ fp32behaviorName = fp32DenormPreserve ? preserve : flush;
+ fp64behaviorName = fp64DenormPreserve ? preserve : flush;
+
+ addArgs[0] = V_DENORM;
+ addArgs[1] = V_DENORM;
+ fp16resultValue = fp16DenormPreserve ? V_DENORM_TIMES_TWO : V_ZERO;
+ fp32resultValue = fp32DenormPreserve ? V_DENORM_TIMES_TWO : V_ZERO;
+ fp64resultValue = fp64DenormPreserve ? V_DENORM_TIMES_TWO : V_ZERO;
+
+ capabilities = "OpCapability " + preserve + "\n"
+ "OpCapability " + flush + "\n";
+
+ floatControls.denormBehaviorIndependence = testCaseInfo.independenceSetting;
+ floatControls.roundingModeIndependence = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE_KHR;
+ floatControls.shaderDenormPreserveFloat16 = fp16DenormPreserve;
+ floatControls.shaderDenormFlushToZeroFloat16 = fp16Required && !fp16DenormPreserve;
+ floatControls.shaderDenormPreserveFloat32 = fp32DenormPreserve;
+ floatControls.shaderDenormFlushToZeroFloat32 = fp32Required && !fp32DenormPreserve;
+ floatControls.shaderDenormPreserveFloat64 = fp64DenormPreserve;
+ floatControls.shaderDenormFlushToZeroFloat64 = fp64Required && !fp64DenormPreserve;
+ }
+
+ const auto& fp64Data = m_typeData.at(FP64);
+ const auto& fp32Data = m_typeData.at(FP32);
+ const auto& fp16Data = m_typeData.at(FP16);
+
+ deUint32 attributeIndex = 0;
+ deUint32 attributeOffset = 0;
+ string attribute;
+ string extensions = "";
+ string executionModes = "";
+ string ioAnnotations = "";
+ string types = "";
+ string inStruct = "";
+ string outDefinitions = "";
+ string commands = "";
+ string saveResult = "";
+
+ // construct single input buffer containing arguments for all float widths
+ // (maxPerStageDescriptorStorageBuffers can be min 4 and we need 3 for outputs)
+ deUint32 inputOffset = 0;
+ std::vector<deUint8> inputData ((fp64Required * sizeof(double) + sizeof(float) + fp16Required * sizeof(deFloat16)) * 2);
+
+ // to follow storage buffer layout rules we store data in ssbo in order 64 -> 16
+ if (fp64Required)
+ {
+ capabilities += fp64Data.snippets->capabilities;
+ executionModes += "OpExecutionMode %main " + fp64behaviorName + " 64\n";
+ attribute = to_string(attributeIndex);
+ ioAnnotations += "OpMemberDecorate %SSBO_in " + attribute + " Offset " + to_string(attributeOffset) +"\n" +
+ fp64Data.snippets->multiOutputAnnotationsSnippet +
+ "OpDecorate %ssbo_f64_out Binding " + to_string(attributeIndex+1) + "\n";
+ types += fp64Data.snippets->minTypeDefinitionsSnippet;
+ inStruct += " %type_f64_arr_2";
+ outDefinitions += fp64Data.snippets->multiOutputDefinitionsSnippet;
+ commands += replace(fp64Data.snippets->multiArgumentsFromInputSnippet, "${attr}", attribute) +
+ "%result64 = OpFAdd %type_f64 %arg1_f64 %arg2_f64\n";
+ saveResult += fp64Data.snippets->multiStoreResultsSnippet;
+ attributeOffset += 2 * static_cast<deUint32>(sizeof(double));
+ attributeIndex++;
+
+ fp64Data.values->fillInputData(addArgs, inputData, inputOffset);
+
+ // construct separate buffers for outputs to make validation easier
+ BufferSp fp64OutBufferSp = fp64Data.values->constructOutputBuffer(fp64resultValue);
+ csSpec.outputs.push_back(Resource(fp64OutBufferSp));
+
+ csSpec.requestedVulkanFeatures.coreFeatures.shaderFloat64 = VK_TRUE;
+ }
+ if (fp32Required)
+ {
+ executionModes += "OpExecutionMode %main " + fp32behaviorName + " 32\n";
+ attribute = to_string(attributeIndex);
+ ioAnnotations += "OpMemberDecorate %SSBO_in " + attribute + " Offset " + to_string(attributeOffset) +"\n" +
+ fp32Data.snippets->multiOutputAnnotationsSnippet +
+ "OpDecorate %ssbo_f32_out Binding " + to_string(attributeIndex+1) + "\n";
+ types += fp32Data.snippets->minTypeDefinitionsSnippet;
+ inStruct += " %type_f32_arr_2";
+ outDefinitions += fp32Data.snippets->multiOutputDefinitionsSnippet;
+ commands += replace(fp32Data.snippets->multiArgumentsFromInputSnippet, "${attr}", attribute) +
+ "%result32 = OpFAdd %type_f32 %arg1_f32 %arg2_f32\n";
+ saveResult += fp32Data.snippets->multiStoreResultsSnippet;
+ attributeOffset += 2 * static_cast<deUint32>(sizeof(float));
+ attributeIndex++;
+
+ fp32Data.values->fillInputData(addArgs, inputData, inputOffset);
+
+ BufferSp fp32OutBufferSp = fp32Data.values->constructOutputBuffer(fp32resultValue);
+ csSpec.outputs.push_back(Resource(fp32OutBufferSp));
+ }
+ if (fp16Required)
+ {
+ capabilities += fp16Data.snippets->capabilities +
+ "OpCapability Float16\n";
+ extensions += fp16Data.snippets->extensions;
+ executionModes += "OpExecutionMode %main " + fp16behaviorName + " 16\n";
+ attribute = to_string(attributeIndex);
+ ioAnnotations += "OpMemberDecorate %SSBO_in " + attribute + " Offset " + to_string(attributeOffset) +"\n" +
+ fp16Data.snippets->multiOutputAnnotationsSnippet +
+ "OpDecorate %ssbo_f16_out Binding " + to_string(attributeIndex+1) + "\n";
+ types += fp16Data.snippets->minTypeDefinitionsSnippet;
+ inStruct += " %type_f16_arr_2";
+ outDefinitions += fp16Data.snippets->multiOutputDefinitionsSnippet;
+ commands += replace(fp16Data.snippets->multiArgumentsFromInputSnippet, "${attr}", attribute) +
+ "%result16 = OpFAdd %type_f16 %arg1_f16 %arg2_f16\n";
+ saveResult += fp16Data.snippets->multiStoreResultsSnippet;
+
+ fp16Data.values->fillInputData(addArgs, inputData, inputOffset);
+
+ BufferSp fp16OutBufferSp = fp16Data.values->constructOutputBuffer(fp16resultValue);
+ csSpec.outputs.push_back(Resource(fp16OutBufferSp));
+
+ csSpec.extensions.push_back("VK_KHR_16bit_storage");
+ csSpec.requestedVulkanFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK;
+ }
+
+ BufferSp inBufferSp(new Buffer<deUint8>(inputData));
+ csSpec.inputs.push_back(Resource(inBufferSp, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
+
+ map<string, string> specializations =
+ {
+ { "capabilities", capabilities },
+ { "extensions", extensions },
+ { "execution_modes", executionModes },
+ { "io_annotations", ioAnnotations },
+ { "types", types },
+ { "in_struct", inStruct },
+ { "out_definitions", outDefinitions },
+ { "commands", commands },
+ { "save_result", saveResult }
+ };
+
+ // specialize shader
+ const string shaderCode = m_settingsShaderTemplate.specialize(specializations);
+
+ csSpec.assembly = shaderCode;
+ csSpec.numWorkGroups = IVec3(1, 1, 1);
+ csSpec.verifyIO = checkMixedFloats;
+ csSpec.extensions.push_back("VK_KHR_shader_float_controls");
+}
+
void getGraphicsShaderCode (vk::SourceCollections& dst, InstanceContext context)
{
// this function is used only by GraphicsTestGroupBuilder but it couldn't
@@ -2669,11 +3501,13 @@
"%BP_vertex_color = OpVariable %type_f32_vec4_optr Output\n"
// set of default constants per float type is placed here,
- // operation tests can also define additional constants;
- // note that O_RETURN_VAL defines function here and because
- // of that this token needs to be directly before main function
+ // operation tests can also define additional constants.
"${vert_constants}"
+ // O_RETURN_VAL defines function here and because
+ // of that this token needs to be directly before main function.
+ "${vert_functions}"
+
"%main = OpFunction %type_void None %type_voidf\n"
"%label = OpLabel\n"
@@ -2754,11 +3588,13 @@
"${frag_io_definitions}"
// set of default constants per float type is placed here,
- // operation tests can also define additional constants;
- // note that O_RETURN_VAL defines function here and because
- // of that this token needs to be directly before main function
+ // operation tests can also define additional constants.
"${frag_constants}"
+ // O_RETURN_VAL defines function here and because
+ // of that this token needs to be directly before main function.
+ "${frag_functions}"
+
"%main = OpFunction %type_void None %type_voidf\n"
"%label = OpLabel\n"
@@ -2805,11 +3641,12 @@
void init();
- void createTests(TestCaseGroup* group, FloatType floatType, bool argumentsFromInput);
+ void createOperationTests(TestCaseGroup* parentGroup, const char* groupName, FloatType floatType, bool argumentsFromInput) override;
+ void createSettingsTests(TestCaseGroup* parentGroup) override;
protected:
- InstanceContext createInstanceContext(const TestCaseInfo& testCaseInfo) const;
+ InstanceContext createInstanceContext(const OperationTestCaseInfo& testCaseInfo) const;
private:
@@ -2821,8 +3658,12 @@
m_testCaseBuilder.init();
}
-void GraphicsTestGroupBuilder::createTests(TestCaseGroup* group, FloatType floatType, bool argumentsFromInput)
+void GraphicsTestGroupBuilder::createOperationTests(TestCaseGroup* parentGroup, const char* groupName, FloatType floatType, bool argumentsFromInput)
{
+ TestContext& testCtx = parentGroup->getTestContext();
+ TestCaseGroup* group = new TestCaseGroup(testCtx, groupName, "");
+ parentGroup->addChild(group);
+
// create test cases for vertex stage
TestCaseVect testCases;
m_testCaseBuilder.build(testCases, m_typeData[floatType].testResults, argumentsFromInput);
@@ -2845,7 +3686,7 @@
if ((testCase.operationId == O_ORTZ_ROUND) || (testCase.operationId == O_ORTE_ROUND))
continue;
- TestCaseInfo testCaseInfo =
+ OperationTestCaseInfo testCaseInfo =
{
floatType,
argumentsFromInput,
@@ -2875,7 +3716,7 @@
if (testCase.expectedOutput == V_UNUSED)
continue;
- TestCaseInfo testCaseInfo =
+ OperationTestCaseInfo testCaseInfo =
{
floatType,
argumentsFromInput,
@@ -2891,7 +3732,14 @@
}
}
-InstanceContext GraphicsTestGroupBuilder::createInstanceContext(const TestCaseInfo& testCaseInfo) const
+void GraphicsTestGroupBuilder::createSettingsTests(TestCaseGroup* parentGroup)
+{
+ DE_UNREF(parentGroup);
+
+ // WG decided that testing settings only for compute stage is sufficient
+}
+
+InstanceContext GraphicsTestGroupBuilder::createInstanceContext(const OperationTestCaseInfo& testCaseInfo) const
{
// LUT storing functions used to verify test results
const VerifyIOFunc checkFloatsLUT[] =
@@ -2927,6 +3775,11 @@
TypeSnippetsSP outTypeSnippets = specOpData.outTypeSnippets;
FloatType inFloatType = specOpData.inFloatType;
+ // There may be several reasons why we need the shaderFloat16 Vulkan feature.
+ bool needsShaderFloat16 = false;
+ // There are some weird cases where we need the constants, but would otherwise drop them.
+ bool needsSpecialConstants = false;
+
// UnpackHalf2x16 is a corner case - it returns two 32-bit floats but
// internaly operates on fp16 and this type should be used by float controls
FloatType inFloatTypeForCaps = inFloatType;
@@ -2961,6 +3814,8 @@
string fragTypes;
string vertConstants;
string fragConstants;
+ string vertFunctions;
+ string fragFunctions;
string vertIODefinitions;
string fragIODefinitions;
string vertArguments;
@@ -2977,6 +3832,7 @@
{
vertAnnotations = inTypeSnippets->inputAnnotationsSnippet + inTypeSnippets->typeAnnotationsSnippet;
fragAnnotations = outTypeSnippets->outputAnnotationsSnippet + outTypeSnippets->typeAnnotationsSnippet;
+ vertFunctions = specOpData.functions;
// check if input type is different from tested type (conversion operations)
if (testOperation.isInputTypeRestricted)
@@ -3027,9 +3883,11 @@
fragCommands = "";
vertProcessResult = outTypeSnippets->storeVertexResultSnippet;
fragProcessResult = outTypeSnippets->loadVertexResultSnippet + outTypeSnippets->storeResultsSnippet;
+ needsShaderFloat16 |= outTypeSnippets->loadStoreRequiresShaderFloat16;
}
else // perform test in fragment stage - vertex stage is empty
{
+ fragFunctions = specOpData.functions;
// check if input type is different from tested type
if (testOperation.isInputTypeRestricted)
{
@@ -3082,6 +3940,51 @@
fragCommands = specOpData.commands;
vertProcessResult = "";
fragProcessResult = outTypeSnippets->storeResultsSnippet;
+
+ if (!testCaseInfo.argumentsFromInput)
+ {
+ switch(testCaseInfo.testCase.operationId)
+ {
+ case O_CONV_FROM_FP32:
+ case O_CONV_FROM_FP64:
+ needsSpecialConstants = true;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ // Another reason we need shaderFloat16 is the executable instructions uses fp16
+ // in a way not supported by the 16bit storage extension.
+ needsShaderFloat16 |= float16FeatureRequired && testOperation.floatUsage == FLOAT_ARITHMETIC;
+
+ // Constants are only needed sometimes. Drop them in the fp16 case if the code doesn't need
+ // them, and if we don't otherwise need shaderFloat16.
+ bool needsFP16Constants = needsShaderFloat16 || needsSpecialConstants;
+
+ if (!needsFP16Constants && float16FeatureRequired)
+ {
+ // Check various code fragments
+ auto hasFP16Constants = [](const std::string& spirv) { return DE_NULL != strstr(spirv.c_str(), "%c_f16"); };
+ if (hasFP16Constants(vertConstants) || hasFP16Constants(fragConstants))
+ {
+ needsFP16Constants |=
+ hasFP16Constants(vertCommands) || hasFP16Constants(vertArguments)
+ || hasFP16Constants(fragCommands) || hasFP16Constants(fragArguments);
+ if (!needsFP16Constants)
+ {
+ vertConstants = "";
+ fragConstants = "";
+ }
+ }
+ }
+ needsShaderFloat16 |= needsFP16Constants;
+
+ if (needsShaderFloat16)
+ {
+ vertCapabilities += "OpCapability Float16\n";
+ fragCapabilities += "OpCapability Float16\n";
}
map<string, string> specializations;
@@ -3094,6 +3997,7 @@
specializations["vert_io_definitions"] = vertIODefinitions;
specializations["vert_arguments"] = vertArguments;
specializations["vert_variables"] = vertVariables;
+ specializations["vert_functions"] = vertFunctions;
specializations["vert_commands"] = vertCommands;
specializations["vert_process_result"] = vertProcessResult;
specializations["frag_capabilities"] = fragCapabilities;
@@ -3102,6 +4006,7 @@
specializations["frag_annotations"] = fragAnnotations;
specializations["frag_types"] = fragTypes;
specializations["frag_constants"] = fragConstants;
+ specializations["frag_functions"] = fragFunctions;
specializations["frag_io_definitions"] = fragIODefinitions;
specializations["frag_arguments"] = fragArguments;
specializations["frag_variables"] = fragVariables;
@@ -3136,6 +4041,11 @@
vector<string> extensions;
extensions.push_back("VK_KHR_shader_float_controls");
+ if (needsShaderFloat16)
+ {
+ extensions.push_back("VK_KHR_shader_float16_int8");
+ vulkanFeatures.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
+ }
if (float16FeatureRequired)
{
extensions.push_back("VK_KHR_16bit_storage");
@@ -3187,15 +4097,12 @@
TestCaseGroup* typeGroup = new TestCaseGroup(testCtx, testGroup.groupName, "");
group->addChild(typeGroup);
- TestCaseGroup* inputArgsGroup = new TestCaseGroup(testCtx, "input_args", "");
- groupBuilder->createTests(inputArgsGroup, testGroup.floatType, true);
- typeGroup->addChild(inputArgsGroup);
-
- TestCaseGroup* generatedArgsGroup = new TestCaseGroup(testCtx, "generated_args", "");
- groupBuilder->createTests(generatedArgsGroup, testGroup.floatType, false);
- typeGroup->addChild(generatedArgsGroup);
+ groupBuilder->createOperationTests(typeGroup, "input_args", testGroup.floatType, true);
+ groupBuilder->createOperationTests(typeGroup, "generated_args", testGroup.floatType, false);
}
+ groupBuilder->createSettingsTests(group.get());
+
return group.release();
}
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.cpp
index 09028cf..6f2c5c0 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.cpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.cpp
@@ -834,7 +834,7 @@
"${capability:opt}\n"
"${extension:opt}\n"
"OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint Geometry %BP_main \"main\" %BP_out_gl_position %BP_gl_PrimitiveID %BP_gl_in %BP_out_color %BP_in_color ${IF_entrypoint:opt} \n"
+ "OpEntryPoint Geometry %BP_main \"main\" %BP_out_gl_position %BP_gl_PrimitiveID %BP_gl_in %BP_out_color %BP_in_color ${IF_entrypoint:opt} ${GL_entrypoint:opt} \n"
"OpExecutionMode %BP_main Triangles\n"
"OpExecutionMode %BP_main Invocations 1\n"
"OpExecutionMode %BP_main OutputTriangleStrip\n"
@@ -1010,12 +1010,8 @@
map<string, string> fragments = passthruFragments();
const string functype = string("%") + var_type + "_" + var_type + "_function";
- fragments["interface_op_func"] =
- string("%interface_op_func = OpFunction %") + var_type + " None " + functype + "\n"
- " %io_param1 = OpFunctionParameter %" + var_type + "\n"
- " %IF_label = OpLabel\n"
- " OpReturnValue %io_param1\n"
- " OpFunctionEnd\n";
+ fragments["interface_op_call"] = "OpCopyObject %" + var_type;
+ fragments["interface_op_func"] = "";
fragments["input_type"] = var_type;
fragments["output_type"] = var_type;
fragments["pre_main"] = "";
@@ -1089,7 +1085,7 @@
"OpDecorate %IF_output Location 2\n";
fragments["IF_carryforward"] =
"%IF_input_val = OpLoad %${input_type} %IF_input\n"
- " %IF_result = OpFunctionCall %${output_type} %interface_op_func %IF_input_val\n"
+ " %IF_result = ${interface_op_call} %IF_input_val\n"
" OpStore %IF_output %IF_result\n";
// Make sure the rest still need to be instantialized.
@@ -1100,6 +1096,7 @@
fragments["decoration"] = "${decoration:opt}";
fragments["pre_main"] = "${pre_main:opt}";
fragments["testfun"] = "${testfun}";
+ fragments["interface_op_call"] = "${interface_op_call}";
fragments["interface_op_func"] = "${interface_op_func}";
fragments["post_interface_op_vert"] = "${post_interface_op_vert:opt}";
@@ -1126,7 +1123,7 @@
"OpDecorate %IF_output Location 1\n"; // Fragment shader should write to location #1.
fragments["IF_carryforward"] =
"%IF_input_val = OpLoad %${input_type} %IF_input\n"
- " %IF_result = OpFunctionCall %${output_type} %interface_op_func %IF_input_val\n"
+ " %IF_result = ${interface_op_call} %IF_input_val\n"
" OpStore %IF_output %IF_result\n";
// Make sure the rest still need to be instantialized.
@@ -1137,6 +1134,7 @@
fragments["decoration"] = "${decoration:opt}";
fragments["pre_main"] = "${pre_main:opt}";
fragments["testfun"] = "${testfun}";
+ fragments["interface_op_call"] = "${interface_op_call}";
fragments["interface_op_func"] = "${interface_op_func}";
fragments["post_interface_op_frag"] = "${post_interface_op_frag:opt}";
@@ -1171,9 +1169,9 @@
"%IF_input_val0 = OpLoad %${input_type} %IF_input_ptr0\n"
"%IF_input_val1 = OpLoad %${input_type} %IF_input_ptr1\n"
"%IF_input_val2 = OpLoad %${input_type} %IF_input_ptr2\n"
- "%IF_input_res0 = OpFunctionCall %${output_type} %interface_op_func %IF_input_val0\n"
- "%IF_input_res1 = OpFunctionCall %${output_type} %interface_op_func %IF_input_val1\n"
- "%IF_input_res2 = OpFunctionCall %${output_type} %interface_op_func %IF_input_val2\n"
+ "%IF_input_res0 = ${interface_op_call} %IF_input_val0\n"
+ "%IF_input_res1 = ${interface_op_call} %IF_input_val1\n"
+ "%IF_input_res2 = ${interface_op_call} %IF_input_val2\n"
"OpStore %IF_output_ptr0 %IF_input_res0\n"
"OpStore %IF_output_ptr1 %IF_input_res1\n"
"OpStore %IF_output_ptr2 %IF_input_res2\n";
@@ -1187,6 +1185,7 @@
fragments["decoration_tessc"] = "${decoration_tessc:opt}";
fragments["pre_main"] = "${pre_main:opt}";
fragments["testfun"] = "${testfun}";
+ fragments["interface_op_call"] = "${interface_op_call}";
fragments["interface_op_func"] = "${interface_op_func}";
fragments["post_interface_op_tessc"] = "${post_interface_op_tessc:opt}";
@@ -1215,7 +1214,7 @@
// Only get the first value since all three values are the same anyway.
" %IF_input_ptr0 = OpAccessChain %ip_${input_type} %IF_input %c_i32_0\n"
" %IF_input_val0 = OpLoad %${input_type} %IF_input_ptr0\n"
- " %IF_input_res0 = OpFunctionCall %${output_type} %interface_op_func %IF_input_val0\n"
+ " %IF_input_res0 = ${interface_op_call} %IF_input_val0\n"
"OpStore %IF_output %IF_input_res0\n";
// Make sure the rest still need to be instantialized.
@@ -1226,6 +1225,7 @@
fragments["decoration"] = "${decoration:opt}";
fragments["pre_main"] = "${pre_main:opt}";
fragments["testfun"] = "${testfun}";
+ fragments["interface_op_call"] = "${interface_op_call}";
fragments["interface_op_func"] = "${interface_op_func}";
fragments["post_interface_op_tesse"] = "${post_interface_op_tesse:opt}";
fragments["post_interface_op_geom"] = "${post_interface_op_geom:opt}";
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.hpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.hpp
index f4e7b02..cc006f1 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.hpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.hpp
@@ -99,12 +99,14 @@
VerifyIOFunc verifyIO;
GraphicsVerifyBinaryFunc verifyBinary;
SpirvVersion spirvVersion;
+ bool spirvVersion14;
GraphicsResources()
- : inputFormat (VK_FORMAT_R32G32B32A32_SFLOAT)
- , verifyIO (DE_NULL)
- , verifyBinary (DE_NULL)
- , spirvVersion (SPIRV_VERSION_1_0)
+ : inputFormat (VK_FORMAT_R32G32B32A32_SFLOAT)
+ , verifyIO (DE_NULL)
+ , verifyBinary (DE_NULL)
+ , spirvVersion (SPIRV_VERSION_1_0)
+ , spirvVersion14 (false)
{}
};
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmIndexingTests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmIndexingTests.cpp
index c7661be..fd1a4b0 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmIndexingTests.cpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmIndexingTests.cpp
@@ -531,6 +531,7 @@
" %ip_a3u32 = OpTypePointer Input %a3u32\n"
"%v4f32_u32_function = OpTypeFunction %v4f32 %u32\n";
+ fragments["interface_op_call"] = "OpFunctionCall %v4f32 %interface_op_func";
fragments["interface_op_func"] =
"%interface_op_func = OpFunction %v4f32 None %v4f32_u32_function\n"
" %io_param1 = OpFunctionParameter %u32\n"
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp
index 11004e7..b450f0f 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp
@@ -65,6 +65,7 @@
#include "vktSpvAsmVariablePointersTests.hpp"
#include "vktSpvAsmVariableInitTests.hpp"
#include "vktSpvAsmPointerParameterTests.hpp"
+#include "vktSpvAsmSpirvVersion1p4Tests.hpp"
#include "vktSpvAsmSpirvVersionTests.hpp"
#include "vktTestCaseUtil.hpp"
#include "vktSpvAsmLoopDepLenTests.hpp"
@@ -74,6 +75,7 @@
#include "vktSpvAsmWorkgroupMemoryTests.hpp"
#include "vktSpvAsmSignedIntCompareTests.hpp"
#include "vktSpvAsmPtrAccessChainTests.hpp"
+#include "vktSpvAsmFloatControlsExtensionlessTests.hpp"
#include <cmath>
#include <limits>
@@ -690,21 +692,25 @@
, numOutputElements (_numOutputElements) {}
};
-tcu::TestCaseGroup* createOpAtomicGroup (tcu::TestContext& testCtx, bool useStorageBuffer, int numElements = 65535, bool verifyReturnValues = false)
+tcu::TestCaseGroup* createOpAtomicGroup (tcu::TestContext& testCtx, bool useStorageBuffer, int numElements = 65535, bool verifyReturnValues = false, bool volatileAtomic = false)
{
std::string groupName ("opatomic");
if (useStorageBuffer)
groupName += "_storage_buffer";
if (verifyReturnValues)
groupName += "_return_values";
+ if (volatileAtomic)
+ groupName += "_volatile";
de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, groupName.c_str(), "Test the OpAtomic* opcodes"));
vector<OpAtomicCase> cases;
const StringTemplate shaderTemplate (
string("OpCapability Shader\n") +
+ (volatileAtomic ? "OpCapability VulkanMemoryModelKHR\n" : "") +
(useStorageBuffer ? "OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n" : "") +
- "OpMemoryModel Logical GLSL450\n"
+ (volatileAtomic ? "OpExtension \"SPV_KHR_vulkan_memory_model\"\n" : "") +
+ (volatileAtomic ? "OpMemoryModel Logical VulkanKHR\n" : "OpMemoryModel Logical GLSL450\n") +
"OpEntryPoint GLCompute %main \"main\" %id\n"
"OpExecutionMode %main LocalSize 1 1 1\n" +
@@ -723,7 +729,6 @@
"OpDecorate %sumbuf ${BLOCK_DECORATION}\n"
"OpDecorate %sum DescriptorSet 0\n"
"OpDecorate %sum Binding 1\n"
- "OpMemberDecorate %sumbuf 0 Coherent\n"
"OpMemberDecorate %sumbuf 0 Offset 0\n"
"${RETVAL_BUF_DECORATE}"
@@ -745,6 +750,8 @@
"%zero = OpConstant %i32 0\n"
"%one = OpConstant %u32 1\n"
"%two = OpConstant %i32 2\n"
+ "%five = OpConstant %i32 5\n"
+ "%volbit = OpConstant %i32 32768\n"
"%main = OpFunction %void None %voidf\n"
"%label = OpLabel\n"
@@ -769,24 +776,24 @@
#define ADD_OPATOMIC_CASE_1(NAME, ASSEMBLY, RETVAL_ASSEMBLY, OPATOMIC) ADD_OPATOMIC_CASE(NAME, ASSEMBLY, RETVAL_ASSEMBLY, OPATOMIC, 1)
#define ADD_OPATOMIC_CASE_N(NAME, ASSEMBLY, RETVAL_ASSEMBLY, OPATOMIC) ADD_OPATOMIC_CASE(NAME, ASSEMBLY, RETVAL_ASSEMBLY, OPATOMIC, numElements)
- ADD_OPATOMIC_CASE_1(iadd, "%retv = OpAtomicIAdd %i32 %outloc %one %zero %inval\n",
+ ADD_OPATOMIC_CASE_1(iadd, "%retv = OpAtomicIAdd %i32 %outloc ${SCOPE} ${SEMANTICS} %inval\n",
" OpStore %retloc %retv\n", OPATOMIC_IADD );
- ADD_OPATOMIC_CASE_1(isub, "%retv = OpAtomicISub %i32 %outloc %one %zero %inval\n",
+ ADD_OPATOMIC_CASE_1(isub, "%retv = OpAtomicISub %i32 %outloc ${SCOPE} ${SEMANTICS} %inval\n",
" OpStore %retloc %retv\n", OPATOMIC_ISUB );
- ADD_OPATOMIC_CASE_1(iinc, "%retv = OpAtomicIIncrement %i32 %outloc %one %zero\n",
+ ADD_OPATOMIC_CASE_1(iinc, "%retv = OpAtomicIIncrement %i32 %outloc ${SCOPE} ${SEMANTICS}\n",
" OpStore %retloc %retv\n", OPATOMIC_IINC );
- ADD_OPATOMIC_CASE_1(idec, "%retv = OpAtomicIDecrement %i32 %outloc %one %zero\n",
+ ADD_OPATOMIC_CASE_1(idec, "%retv = OpAtomicIDecrement %i32 %outloc ${SCOPE} ${SEMANTICS}\n",
" OpStore %retloc %retv\n", OPATOMIC_IDEC );
if (!verifyReturnValues)
{
- ADD_OPATOMIC_CASE_N(load, "%inval2 = OpAtomicLoad %i32 %inloc %one %zero\n"
+ ADD_OPATOMIC_CASE_N(load, "%inval2 = OpAtomicLoad %i32 %inloc ${SCOPE} ${SEMANTICS}\n"
" OpStore %outloc %inval2\n", "", OPATOMIC_LOAD );
- ADD_OPATOMIC_CASE_N(store, " OpAtomicStore %outloc %one %zero %inval\n", "", OPATOMIC_STORE );
+ ADD_OPATOMIC_CASE_N(store, " OpAtomicStore %outloc ${SCOPE} ${SEMANTICS} %inval\n", "", OPATOMIC_STORE );
}
ADD_OPATOMIC_CASE_N(compex, "%even = OpSMod %i32 %inval %two\n"
" OpStore %outloc %even\n"
- "%retv = OpAtomicCompareExchange %i32 %outloc %one %zero %zero %minusone %zero\n",
+ "%retv = OpAtomicCompareExchange %i32 %outloc ${SCOPE} ${SEMANTICS} ${SEMANTICS} %minusone %zero\n",
" OpStore %retloc %retv\n", OPATOMIC_COMPEX );
@@ -801,6 +808,21 @@
vector<deInt32> inputInts (numElements, 0);
vector<deInt32> expected (cases[caseNdx].numOutputElements, -1);
+ if (volatileAtomic)
+ {
+ spec.extensions.push_back("VK_KHR_vulkan_memory_model");
+ spec.requestedVulkanFeatures.extVulkanMemoryModel = EXTVULKANMEMORYMODELFEATURES_ENABLE;
+
+ // volatile, queuefamily scope
+ specializations["SEMANTICS"] = "%volbit";
+ specializations["SCOPE"] = "%five";
+ }
+ else
+ {
+ // non-volatile, device scope
+ specializations["SEMANTICS"] = "%zero";
+ specializations["SCOPE"] = "%one";
+ }
specializations["INDEX"] = (cases[caseNdx].numOutputElements == 1) ? "%zero" : "%x";
specializations["INSTRUCTION"] = cases[caseNdx].assembly;
specializations["BLOCK_DECORATION"] = useStorageBuffer ? "Block" : "BufferBlock";
@@ -837,6 +859,10 @@
spec.assembly = shaderTemplate.specialize(specializations);
+ // Specialize one more time, to catch things that were in a template parameter
+ const StringTemplate assemblyTemplate(spec.assembly);
+ spec.assembly = assemblyTemplate.specialize(specializations);
+
if (useStorageBuffer)
spec.extensions.push_back("VK_KHR_storage_buffer_storage_class");
@@ -3109,6 +3135,7 @@
specFloat16.assembly =
"OpCapability Shader\n"
"OpCapability StorageUniformBufferBlock16\n"
+ "OpCapability Float16\n"
"OpExtension \"SPV_KHR_16bit_storage\"\n"
"OpMemoryModel Logical GLSL450\n"
"OpEntryPoint GLCompute %main \"main\" %id\n"
@@ -3141,9 +3168,9 @@
"%id = OpVariable %uvec3ptr Input\n"
"%zero = OpConstant %i32 0\n"
- "%float_0 = OpConstant %f16 0.0\n"
- "%float_1 = OpConstant %f16 1.0\n"
- "%float_n1 = OpConstant %f16 -1.0\n"
+ "%float_0 = OpConstant %f32 0.0\n"
+ "%float_1 = OpConstant %f32 1.0\n"
+ "%float_n1 = OpConstant %f32 -1.0\n"
"%main = OpFunction %void None %voidf\n"
"%entry = OpLabel\n"
@@ -3151,8 +3178,9 @@
"%x = OpCompositeExtract %u32 %idval 0\n"
"%inloc = OpAccessChain %f16ptr %indata %zero %x\n"
"%inval = OpLoad %f16 %inloc\n"
+ "%f32_inval = OpFConvert %f32 %inval\n"
- "%comp = OpFOrdGreaterThan %bool %inval %float_0\n"
+ "%comp = OpFOrdGreaterThan %bool %f32_inval %float_0\n"
" OpSelectionMerge %cm None\n"
" OpBranchConditional %comp %tb %fb\n"
"%tb = OpLabel\n"
@@ -3160,10 +3188,11 @@
"%fb = OpLabel\n"
" OpBranch %cm\n"
"%cm = OpLabel\n"
- "%res = OpPhi %f16 %float_1 %tb %float_n1 %fb\n"
+ "%res = OpPhi %f32 %float_1 %tb %float_n1 %fb\n"
+ "%f16_res = OpFConvert %f16 %res\n"
"%outloc = OpAccessChain %f16ptr %outdata %zero %x\n"
- " OpStore %outloc %res\n"
+ " OpStore %outloc %f16_res\n"
" OpReturn\n"
" OpFunctionEnd\n";
@@ -6119,10 +6148,8 @@
spec.outputs.push_back(BufferSp(new Float32Buffer(negativeFloats)));
spec.numWorkGroups = IVec3(numElements, 1, 1);
- spec.extensions.push_back("VK_KHR_16bit_storage");
spec.extensions.push_back("VK_KHR_shader_float16_int8");
- spec.requestedVulkanFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK;
spec.requestedVulkanFeatures.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
group->addChild(new SpvAsmComputeShaderCase(testCtx, cases[caseNdx].name, cases[caseNdx].name, spec));
@@ -7570,7 +7597,7 @@
fragments4["pre_main"] = typesAndConstants4;
fragments4["testfun"] = function4;
- fragments4["capability"] = "OpCapability StorageUniformBufferBlock16\n";
+ fragments4["capability"] = "OpCapability StorageUniformBufferBlock16\nOpCapability Float16\n";
fragments4["extension"] = "OpExtension \"SPV_KHR_16bit_storage\"";
extensions4.push_back("VK_KHR_16bit_storage");
@@ -9405,7 +9432,7 @@
if (instruction == "OpUConvert" || instruction == "OpSConvert" || instruction == "OpFConvert")
{
- // Conversions between 16 and 32 bit are provided by SPV_KHR_16bit_storage. The rest requires explicit Int16
+ // Width-only conversions between 16 and 32 bit are provided by SPV_KHR_16bit_storage. The rest requires explicit Int16
if (usesInt32(from, to) || usesFloat32(from, to))
requiresInt16Capability = false;
}
@@ -9423,8 +9450,8 @@
{
decl += "%f16 = OpTypeFloat 16\n";
- // Conversions between 16 and 32 bit are provided by SPV_KHR_16bit_storage. The rest requires explicit Float16
- if (!(usesInt32(from, to) || usesFloat32(from, to)))
+ // Width-only conversions between 16 and 32 bit are provided by SPV_KHR_16bit_storage. The rest requires explicit Float16
+ if (!usesFloat32(from, to))
caps += "OpCapability Float16\n";
}
@@ -10135,7 +10162,7 @@
de::MovePtr<tcu::TestCaseGroup> testGroup (new tcu::TestCaseGroup(testCtx, groupName.c_str(), "Float 16 logical tests"));
de::Random rnd (deStringHash(testGroup->getName()));
- const string spvCapabilities = string("OpCapability StorageUniformBufferBlock16\n") + (nanSupported ? "OpCapability SignedZeroInfNanPreserve\n" : "");
+ const string spvCapabilities = string("OpCapability StorageUniformBufferBlock16\nOpCapability Float16\n") + (nanSupported ? "OpCapability SignedZeroInfNanPreserve\n" : "");
const string spvExtensions = string("OpExtension \"SPV_KHR_16bit_storage\"\n") + (nanSupported ? "OpExtension \"SPV_KHR_float_controls\"\n" : "");
const string spvExecutionMode = nanSupported ? "OpExecutionMode %BP_main SignedZeroInfNanPreserve 16\n" : "";
const deUint32 numDataPointsScalar = 16;
@@ -10458,7 +10485,7 @@
de::MovePtr<tcu::TestCaseGroup> testGroup (new tcu::TestCaseGroup(testCtx, "function", "Float 16 function call related tests"));
de::Random rnd (deStringHash(testGroup->getName()));
- const StringTemplate capabilities ("OpCapability ${cap}\n");
+ const StringTemplate capabilities ("OpCapability ${cap}\nOpCapability Float16\n");
const deUint32 numDataPoints = 256;
const vector<deFloat16> float16InputData = getFloat16s(rnd, numDataPoints);
const vector<deFloat16> float16OutputDummy (float16InputData.size(), 0);
@@ -10812,7 +10839,7 @@
specs["type_decl"] = testType.typeDecls;
fragments["extension"] = "OpExtension \"SPV_KHR_16bit_storage\"";
- fragments["capability"] = "OpCapability StorageUniformBufferBlock16\n";
+ fragments["capability"] = "OpCapability StorageUniformBufferBlock16\nOpCapability Float16\n";
fragments["decoration"] = decoration.specialize(specs);
fragments["pre_main"] = preMain.specialize(specs);
fragments["testfun"] = testFun.specialize(specs);
@@ -11050,7 +11077,7 @@
specs["replacement"] = de::toString(replacement);
fragments["extension"] = "OpExtension \"SPV_KHR_16bit_storage\"";
- fragments["capability"] = "OpCapability StorageUniformBufferBlock16\n";
+ fragments["capability"] = "OpCapability StorageUniformBufferBlock16\nOpCapability Float16\n";
fragments["decoration"] = decoration.specialize(specs);
fragments["pre_main"] = preMain.specialize(specs);
fragments["testfun"] = testFun.specialize(specs);
@@ -11421,7 +11448,7 @@
specs["case_count"] = de::toString(caseCount);
fragments["extension"] = "OpExtension \"SPV_KHR_16bit_storage\"";
- fragments["capability"] = "OpCapability StorageUniformBufferBlock16\n";
+ fragments["capability"] = "OpCapability StorageUniformBufferBlock16\nOpCapability Float16\n";
fragments["decoration"] = decoration.specialize(specs);
fragments["pre_main"] = preMain.specialize(specs);
fragments["testfun"] = testFun.specialize(specs);
@@ -11681,7 +11708,7 @@
specs["consts"] = consts;
fragments["extension"] = "OpExtension \"SPV_KHR_16bit_storage\"";
- fragments["capability"] = "OpCapability StorageUniformBufferBlock16\n";
+ fragments["capability"] = "OpCapability StorageUniformBufferBlock16\nOpCapability Float16\n";
fragments["decoration"] = decoration.specialize(specs);
fragments["pre_main"] = preMain.specialize(specs);
fragments["testfun"] = testFun.specialize(specs);
@@ -11710,7 +11737,7 @@
const string opName (op);
const deUint32 opIndex = (opName == "OpCompositeInsert") ? 0
: (opName == "OpCompositeExtract") ? 1
- : -1;
+ : std::numeric_limits<deUint32>::max();
const StringTemplate preMain
(
@@ -11885,7 +11912,7 @@
},
};
- DE_ASSERT(opIndex >= 0 && opIndex < DE_LENGTH_OF_ARRAY(opPartsArray));
+ DE_ASSERT(opIndex < DE_LENGTH_OF_ARRAY(opPartsArray));
const char* accessPathF16[] =
{
@@ -12074,7 +12101,7 @@
specs["op_case_default_value"] = opParts.caseDefaultValue;
fragments["extension"] = "OpExtension \"SPV_KHR_16bit_storage\"";
- fragments["capability"] = "OpCapability StorageUniformBufferBlock16\n";
+ fragments["capability"] = "OpCapability StorageUniformBufferBlock16\nOpCapability Float16\n";
fragments["decoration"] = decoration.specialize(specs);
fragments["pre_main"] = preMain.specialize(specs);
fragments["testfun"] = testFun.specialize(specs);
@@ -16493,7 +16520,7 @@
specs["arg_func_call"] = funcCall;
fragments["extension"] = "OpExtension \"SPV_KHR_16bit_storage\"\n%ext_import = OpExtInstImport \"GLSL.std.450\"";
- fragments["capability"] = "OpCapability Matrix\nOpCapability StorageUniformBufferBlock16";
+ fragments["capability"] = "OpCapability Matrix\nOpCapability StorageUniformBufferBlock16\nOpCapability Float16\n";
fragments["decoration"] = decoration.specialize(specs);
fragments["pre_main"] = preMain.specialize(specs);
fragments["testfun"] = testFun.specialize(specs);
@@ -18207,6 +18234,7 @@
computeTests->addChild(createOpAtomicGroup(testCtx, false));
computeTests->addChild(createOpAtomicGroup(testCtx, true)); // Using new StorageBuffer decoration
computeTests->addChild(createOpAtomicGroup(testCtx, false, 1024, true)); // Return value validation
+ computeTests->addChild(createOpAtomicGroup(testCtx, true, 65536, false, true)); // volatile atomics
computeTests->addChild(createOpLineGroup(testCtx));
computeTests->addChild(createOpModuleProcessedGroup(testCtx));
computeTests->addChild(createOpNoLineGroup(testCtx));
@@ -18248,6 +18276,7 @@
computeTests->addChild(createOpNMinGroup(testCtx));
computeTests->addChild(createOpNMaxGroup(testCtx));
computeTests->addChild(createOpNClampGroup(testCtx));
+ computeTests->addChild(createFloatControlsExtensionlessGroup(testCtx));
{
de::MovePtr<tcu::TestCaseGroup> computeAndroidTests (new tcu::TestCaseGroup(testCtx, "android", "Android CTS Tests"));
@@ -18343,6 +18372,7 @@
instructionTests->addChild(computeTests.release());
instructionTests->addChild(graphicsTests.release());
+ instructionTests->addChild(createSpirvVersion1p4Group(testCtx));
return instructionTests.release();
}
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmSpirvVersion1p4Tests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmSpirvVersion1p4Tests.cpp
new file mode 100644
index 0000000..75b8952
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmSpirvVersion1p4Tests.cpp
@@ -0,0 +1,288 @@
+/*------------------------------------------------------------------------
+ * 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 Test new features in SPIR-V 1.4.
+ *//*--------------------------------------------------------------------*/
+
+#include <string>
+#include <vector>
+#include <amber/amber.h>
+
+#include "tcuDefs.hpp"
+
+#include "vkDefs.hpp"
+#include "vktTestGroupUtil.hpp"
+#include "vktAmberTestCase.hpp"
+#include "vktSpvAsmSpirvVersion1p4Tests.hpp"
+#include "vktTestGroupUtil.hpp"
+
+namespace vkt
+{
+namespace SpirVAssembly
+{
+namespace
+{
+
+struct Case
+{
+ Case(const char* b, const char* d) : basename(b), description(d), requirements() { }
+ Case(const char* b, const char* d, const std::vector<std::string>& e) : basename(b), description(d), requirements(e) { }
+ const char *basename;
+ const char *description;
+ // Additional Vulkan requirements, if any.
+ std::vector<std::string> requirements;
+};
+struct CaseGroup
+{
+ CaseGroup(const char* the_data_dir, const char* the_subdir) : data_dir(the_data_dir), subdir(the_subdir) { }
+ void add(const char* basename, const char* description)
+ {
+ cases.push_back(Case(basename, description));
+ }
+ void add(const char* basename, const char* description, const std::vector<std::string>& requirements)
+ {
+ cases.push_back(Case(basename, description, requirements));
+ }
+
+ const char* data_dir;
+ const char* subdir;
+ std::vector<Case> cases;
+};
+
+
+void addTestsForAmberFiles (tcu::TestCaseGroup* tests, CaseGroup group)
+{
+ tcu::TestContext& testCtx = tests->getTestContext();
+ const std::string data_dir(group.data_dir);
+ const std::string subdir(group.subdir);
+ const std::string category = data_dir + "/" + subdir;
+ std::vector<Case> cases(group.cases);
+ vk::SpirVAsmBuildOptions asm_options(VK_MAKE_VERSION(1, 1, 0), vk::SPIRV_VERSION_1_4);
+ asm_options.supports_VK_KHR_spirv_1_4 = true;
+
+ for (unsigned i = 0; i < cases.size() ; ++i)
+ {
+
+ const std::string file = std::string(cases[i].basename) + ".amber";
+ cts_amber::AmberTestCase *testCase = cts_amber::createAmberTestCase(testCtx,
+ cases[i].basename,
+ cases[i].description,
+ category.c_str(),
+ file);
+ DE_ASSERT(testCase != DE_NULL);
+ // Add Vulkan extension requirements.
+ // VK_KHR_spirv_1_4 requires Vulkan 1.1, which includes many common extensions.
+ // So for, example, these tests never have to request VK_KHR_storage_buffer_storage_class,
+ // or VK_KHR_variable_pointers since those extensions were promoted to core features
+ // in Vulkan 1.1. Note that feature bits may still be optional.
+ testCase->addRequirement("VK_KHR_spirv_1_4");
+ // The tests often use StorageBuffer storage class.
+ // We do not have to request VK_KHR_storage_buffer_storage_class because that extension
+ // is about enabling use of SPV_KHR_storage_buffer_storage_class. But SPIR-V 1.4 allows
+ // use of StorageBuffer storage class without any further declarations of extensions
+ // or capabilities. This will also hold for tests that use features introduced by
+ // extensions folded into SPIR-V 1.4 or earlier, and which don't require extra capabilities
+ // to be enabled by Vulkan. Other examples are functionality in SPV_GOOGLE_decorate_string,
+ // SPV_GOOGLE_hlsl_functionality1, and SPV_KHR_no_integer_wrap_decoration.
+ const std::vector<std::string>& reqmts = cases[i].requirements;
+ for (size_t r = 0; r < reqmts.size() ; ++r)
+ {
+ testCase->addRequirement(reqmts[r]);
+ }
+
+ testCase->setSpirVAsmBuildOptions(asm_options);
+ tests->addChild(testCase);
+ }
+}
+
+} // anonymous
+
+tcu::TestCaseGroup* createSpirvVersion1p4Group (tcu::TestContext& testCtx)
+{
+ de::MovePtr<tcu::TestCaseGroup> spirv1p4Tests(new tcu::TestCaseGroup(testCtx, "spirv1p4", "SPIR-V 1.4 new features"));
+
+ // Location of the Amber script files under the data/vulkan/amber source tree.
+ const char* data_dir = "spirv_assembly/instruction/spirv1p4";
+
+ // Set up features used for various tests.
+ std::vector<std::string> Geom;
+ Geom.push_back("Features.geometryShader");
+
+ std::vector<std::string> Tess;
+ Tess.push_back("Features.tessellationShader");
+
+ std::vector<std::string> Varptr_ssbo;
+ Varptr_ssbo.push_back("VariablePointerFeatures.variablePointersStorageBuffer");
+
+ std::vector<std::string> Varptr_full = Varptr_ssbo;
+ Varptr_full.push_back("VariablePointerFeatures.variablePointers");
+
+ std::vector<std::string> Int16;
+ Int16.push_back("Features.shaderInt16");
+
+ std::vector<std::string> Int64;
+ Int64.push_back("Features.shaderInt64");
+
+ // Define test groups
+
+ CaseGroup group(data_dir, "opcopylogical");
+ group.add("different_matrix_layout","different matrix layout");
+ group.add("different_matrix_strides","different matrix strides");
+ group.add("nested_arrays_different_inner_stride","nested_arrays_different_inner_stride");
+ group.add("nested_arrays_different_outer_stride","nested_arrays_different_inner_stride");
+ group.add("nested_arrays_different_strides","nested_arrays_different_strides");
+ group.add("same_array_two_ids","same array two ids");
+ group.add("same_struct_two_ids","same struct two ids");
+ group.add("ssbo_to_ubo","ssbo_to_ubo");
+ group.add("two_arrays_different_stride_1","two_arrays_different_stride_1");
+ group.add("two_arrays_different_stride_2","two_arrays_different_stride_2");
+ group.add("ubo_to_ssbo","ubo_to_ssbo");
+ spirv1p4Tests->addChild(createTestGroup(testCtx, "opcopylogical", "OpCopyLogical", addTestsForAmberFiles, group));
+
+ group = CaseGroup(data_dir, "opptrdiff");
+ group.add("ssbo_comparisons_diff", "pointer diff within an SSBO", Varptr_ssbo);
+ group.add("variable_pointers_vars_ssbo_2_diff", "pointer diff in SSBO with full VariablePointers", Varptr_full);
+ group.add("variable_pointers_vars_ssbo_diff", "pointer diff in SSBO, stored in private var", Varptr_ssbo);
+ group.add("variable_pointers_vars_wg_diff", "pointer diff in workgroup storage, stored in private var", Varptr_full);
+ group.add("wg_comparisons_diff", "pointer diff in workgroup storage", Varptr_full);
+ spirv1p4Tests->addChild(createTestGroup(testCtx, "opptrdiff", "OpPtrDiff", addTestsForAmberFiles, group));
+
+ group = CaseGroup(data_dir, "opptrequal");
+ group.add("different_ssbos_equal", "ptr equal against different SSBO variables", Varptr_full);
+ group.add("different_wgs_equal", "ptr equal against different WG variables", Varptr_full);
+ group.add("null_comparisons_ssbo_equal", "ptr equal null in SSBO", Varptr_ssbo);
+ group.add("null_comparisons_wg_equal", "ptr equal null in Workgrop", Varptr_full);
+ group.add("ssbo_comparisons_equal", "ptr equal in SSBO", Varptr_ssbo);
+ group.add("variable_pointers_ssbo_2_equal", "ptr equal in SSBO, store pointers in Function var", Varptr_full);
+ group.add("variable_pointers_ssbo_equal", "ptr equal in SSBO", Varptr_ssbo);
+ group.add("variable_pointers_vars_ssbo_equal", "ptr equal in SSBO, store pointers in Private var ", Varptr_ssbo);
+ group.add("variable_pointers_vars_wg_equal", "ptr equal in Workgrop, store pointers in Private var", Varptr_full);
+ group.add("variable_pointers_wg_equal", "ptr equal in Workgrop", Varptr_full);
+ group.add("wg_comparisons_equal", "ptr equal in Workgrop", Varptr_full);
+ spirv1p4Tests->addChild(createTestGroup(testCtx, "opptrequal", "OpPtrEqual", addTestsForAmberFiles, group));
+
+ group = CaseGroup(data_dir, "opptrnotequal");
+ group.add("different_ssbos_not_equal", "ptr not equal against different SSBO variables", Varptr_full);
+ group.add("different_wgs_not_equal", "ptr not equal against different WG variables", Varptr_full);
+ group.add("null_comparisons_ssbo_not_equal", "ptr not equal null SSBO", Varptr_ssbo);
+ group.add("null_comparisons_wg_not_equal", "ptr not equal null SSBO", Varptr_full);
+ group.add("ssbo_comparisons_not_equal", "ptr not equal SSBO", Varptr_ssbo);
+ group.add("variable_pointers_ssbo_2_not_equal", "ptr not equal SSBO, store pointer in Function var", Varptr_full);
+ group.add("variable_pointers_ssbo_not_equal", "ptr not equal SSBO, pointer from function return", Varptr_ssbo);
+ group.add("variable_pointers_vars_ssbo_not_equal", "ptr not equal SSBO, store pointer in Private var", Varptr_ssbo);
+ group.add("variable_pointers_vars_wg_not_equal", "ptr not equal Workgroup, store pointer in Private var", Varptr_ssbo);
+ group.add("variable_pointers_wg_not_equal", "ptr not equal Workgroup", Varptr_full);
+ group.add("wg_comparisons_not_equal", "ptr not equal Workgroup", Varptr_full);
+ spirv1p4Tests->addChild(createTestGroup(testCtx, "opptrnotequal", "OpPtrNotEqual", addTestsForAmberFiles, group));
+
+ group = CaseGroup(data_dir, "opcopymemory");
+ group.add("different_alignments", "different alignments");
+ group.add("no_source_access_operands", "no source access operands");
+ group.add("no_target_access_operands", "no target access operands");
+ spirv1p4Tests->addChild(createTestGroup(testCtx, "opcopymemory", "OpCopyMemory 2 memory access operands", addTestsForAmberFiles, group));
+
+ group = CaseGroup(data_dir, "uniformid");
+ group.add("partially_active_uniform_id","workgroup uniform load result at consumption, in nonuniform control flow");
+ group.add("subgroup_cfg_uniform_id","subgroup uniform compare result inside control flow"); // Assumes subgroup size <= LocalSize of 8
+ group.add("subgroup_uniform","subgroup uniform load result"); // Assumes subgroup size <= LocalSize 8
+ group.add("workgroup_cfg_uniform_id","workgroup uniform compare result");
+ group.add("workgroup_uniform","workgroup uniform load result");
+ spirv1p4Tests->addChild(createTestGroup(testCtx, "uniformid", "UniformId decoration", addTestsForAmberFiles, group));
+
+ group = CaseGroup(data_dir, "nonwritable");
+ group.add("function_2_nonwritable", "NonWritable decorates Function variables");
+ group.add("function_nonwritable", "NonWritable decorates 2 Function variables");
+ group.add("non_main_function_nonwritable", "NonWritable decorates Function variable in non-entrypoint function");
+ group.add("private_2_nonwritable", "NonWritable decorates Private variables");
+ group.add("private_nonwritable", "NonWritable decorates 2 Private variables");
+ spirv1p4Tests->addChild(createTestGroup(testCtx, "nonwritable", "NonWritable decoration", addTestsForAmberFiles, group));
+
+ group = CaseGroup(data_dir, "entrypoint");
+ group.add("comp_pc_entry_point", "push constant on compute shader entry point");
+ group.add("comp_ssbo_entry_point", "SSBO on compute shader entry point");
+ group.add("comp_ubo_entry_point", "UBO on compute shader entry point");
+ group.add("comp_workgroup_entry_point", "Workgroup var on compute shader entry point");
+ group.add("frag_pc_entry_point", "push constant on fragment shader entry point");
+ group.add("frag_ssbo_entry_point", "SSBO on fragment shader entry point");
+ group.add("frag_ubo_entry_point", "UBO on fragment shader entry point");
+ group.add("geom_pc_entry_point", "push constant on geometry shader entry point", Geom);
+ group.add("geom_ssbo_entry_point", "SSBO on geometry shader entry point", Geom);
+ group.add("geom_ubo_entry_point", "UBO on geometry shader entry point", Geom);
+ group.add("tess_con_pc_entry_point", "push constant on tess control shader entry point", Tess);
+ group.add("tess_con_ssbo_entry_point", "SSBO on tess control shader entry point", Tess);
+ group.add("tess_con_ubo_entry_point", "UBO on tess control shader entry point", Tess);
+ group.add("tess_eval_pc_entry_point", "push constant on tess eval shader entry point", Tess);
+ group.add("tess_eval_ssbo_entry_point", "SSBO on tess eval shader entry point", Tess);
+ group.add("tess_eval_ubo_entry_point", "UBO on tess eval shader entry point", Tess);
+ group.add("vert_pc_entry_point", "push constant on vertex shader entry point");
+ group.add("vert_ssbo_entry_point", "SSBO on vertex shader entry point");
+ group.add("vert_ubo_entry_point", "UBO on vertex shader entry point");
+ spirv1p4Tests->addChild(createTestGroup(testCtx, "entrypoint", "EntryPoint lists all module-scope variables", addTestsForAmberFiles, group));
+
+ group = CaseGroup(data_dir, "hlsl_functionality1");
+ group.add("counter_buffer", "CounterBuffer decoration");
+ group.add("decorate_string", "OpDecorateString");
+ spirv1p4Tests->addChild(createTestGroup(testCtx, "hlsl_functionality1", "Features in SPV_GOOGLE_hlsl_functionality1 in SPIR-V 1.4", addTestsForAmberFiles, group));
+
+ group = CaseGroup(data_dir, "loop_control");
+ group.add("iteration_multiple", "Loop control IterationMultiple");
+ group.add("max_iterations", "Loop control IterationMultiple");
+ group.add("min_iterations", "Loop control MinIterations");
+ group.add("partial_count", "Loop control PartialCount");
+ group.add("peel_count", "Loop control PeelCount");
+ spirv1p4Tests->addChild(createTestGroup(testCtx, "loop_control", "SPIR-V 1.4 loop controls", addTestsForAmberFiles, group));
+
+ group = CaseGroup(data_dir, "opselect");
+ group.add("array_select", "OpSelect arrays, new in SPIR-V 1.4");
+ group.add("array_stride_select", "OpSelect arrays with non-standard strides, new in SPIR-V 1.4");
+ group.add("nested_array_select", "OpSelect structs with nested arrays, new in SPIR-V 1.4");
+ group.add("nested_struct_select", "OpSelect structs with nested structs, new in SPIR-V 1.4");
+ group.add("scalar_select", "OpSelect scalars, verify SPIR-V 1.0");
+ group.add("ssbo_pointers_2_select", "OpSelect SSBO pointers to different buffers, verify SPIR-V 1.0", Varptr_full);
+ group.add("ssbo_pointers_select", "OpSelect SSBO pointers to same buffer, verify SPIR-V 1.0", Varptr_ssbo);
+ group.add("struct_select", "OpSelect structs, new in SPIR-V 1.4");
+ group.add("vector_element_select", "OpSelect vector with vector selector, verify SPIR-V 1.0");
+ group.add("vector_select", "OpSelect vector with scalar selector, new in SPIR-V 1.4");
+ group.add("wg_pointers_2_select", "OpSelect Workgroup pointers to different buffers, verify SPIR-V 1.0", Varptr_full);
+ group.add("wg_pointers_select", "OpSelect Workgroup pointers to same buffer, verify SPIR-V 1.0", Varptr_full);
+ spirv1p4Tests->addChild(createTestGroup(testCtx, "opselect", "SPIR-V 1.4 OpSelect more cases", addTestsForAmberFiles, group));
+
+ group = CaseGroup(data_dir, "uconvert");
+ group.add("spec_const_opt_extend_16_64_bit","uconvert small to int64", Int64);
+ group.add("spec_const_opt_extend_16","uconvert from int16", Int16);
+ group.add("spec_const_opt_extend_251658240_64_bits","uconvert large to int64", Int64);
+ group.add("spec_const_opt_extend_61440", "uconvert large from int16", Int16);
+ group.add("spec_const_opt_truncate_16_64_bit", "uconvert from int64", Int64);
+ group.add("spec_const_opt_truncate_16", "uconvert small to int16", Int16);
+ group.add("spec_const_opt_truncate_983040", "uconvert large to int16", Int16);
+ group.add("spec_const_opt_zero_extend_n4096", "uconvert negative from int16", Int16);
+ spirv1p4Tests->addChild(createTestGroup(testCtx, "uconvert", "SPIR-V 1.4 UConvert in OpSpecConstantOp", addTestsForAmberFiles, group));
+
+ group = CaseGroup(data_dir, "wrap");
+ group.add("no_signed_wrap", "Accept NoSignedWrap decoration");
+ group.add("no_unsigned_wrap", "Accept NoUnsignedWrap decoration");
+ spirv1p4Tests->addChild(createTestGroup(testCtx, "wrap", "SPIR-V 1.4 integer wrap decorations", addTestsForAmberFiles, group));
+
+ return spirv1p4Tests.release();
+}
+
+} // SpirVAssembly
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmSpirvVersion1p4Tests.hpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmSpirvVersion1p4Tests.hpp
new file mode 100644
index 0000000..fcf4524
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmSpirvVersion1p4Tests.hpp
@@ -0,0 +1,40 @@
+#ifndef _VKTSPVASMSPIRVVERSION1P4TESTS_HPP
+#define _VKTSPVASMSPIRVVERSION1P4TESTS_HPP
+/*------------------------------------------------------------------------
+ * 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 Test new features in SPIR-V 1.4.
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "tcuTestCase.hpp"
+
+namespace vkt
+{
+namespace SpirVAssembly
+{
+
+tcu::TestCaseGroup* createSpirvVersion1p4Group (tcu::TestContext& testCtx);
+
+} // SpirVAssembly
+} // vkt
+
+#endif // _VKTSPVASMSPIRVVERSION1P4TESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmSpirvVersionTests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmSpirvVersionTests.cpp
index 8f64746..3fb0781 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmSpirvVersionTests.cpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmSpirvVersionTests.cpp
@@ -99,6 +99,9 @@
"OpReturnValue %ret\n"
"OpFunctionEnd\n";
+ if (testParameters.spirvVersion > SPIRV_VERSION_1_3)
+ opSimpleTest["GL_entrypoint"] = "%BP_vertexIdInCurrentPatch";
+
switch (testParameters.operation)
{
case OPERATION_GRAPHICS_VERTEX: return createInstanceContext(vertFragPipelineStages, opSimpleTest);
@@ -110,20 +113,24 @@
}
}
-static void getComputeSourceCode (std::string& computeSourceCode)
+static void getComputeSourceCode (std::string& computeSourceCode, SpirvVersion spirvVersion)
{
- computeSourceCode =
- string(getComputeAsmShaderPreamble()) +
+ computeSourceCode = "";
+ if (spirvVersion > SPIRV_VERSION_1_3)
+ computeSourceCode += string(getComputeAsmShaderPreamble("", "", "", "", "%indata %outdata"));
+ else
+ computeSourceCode += string(getComputeAsmShaderPreamble());
+ computeSourceCode +=
"OpSource GLSL 430\n"
"OpName %main \"main\"\n"
"OpName %id \"gl_GlobalInvocationID\"\n"
"OpDecorate %id BuiltIn GlobalInvocationId\n" +
- string(getComputeAsmInputOutputBufferTraits()) +
- string(getComputeAsmCommonTypes()) +
- string(getComputeAsmInputOutputBuffer()) +
+ string(getComputeAsmInputOutputBufferTraits((spirvVersion > SPIRV_VERSION_1_3) ? "Block" : "BufferBlock")) +
+ string(getComputeAsmCommonTypes((spirvVersion > SPIRV_VERSION_1_3) ? "StorageBuffer" : "Uniform")) +
+ string(getComputeAsmInputOutputBuffer((spirvVersion > SPIRV_VERSION_1_3) ? "StorageBuffer" : "Uniform")) +
"%id = OpVariable %uvec3ptr Input\n"
"%zero = OpConstant %i32 0\n"
@@ -278,7 +285,7 @@
{
std::string comp;
- getComputeSourceCode(comp);
+ getComputeSourceCode(comp, m_testParameters.spirvVersion);
programCollection.spirvAsmSources.add("compute", &spirVAsmBuildOptions) << comp;
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.cpp
index 33195b7..89036df 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.cpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.cpp
@@ -53,7 +53,7 @@
VkPhysicalDevice8BitStorageFeaturesKHR extensionFeatures = context.get8BitStorageFeatures();
if ((toCheck & EXT8BITSTORAGEFEATURES_STORAGE_BUFFER) != 0 && extensionFeatures.storageBuffer8BitAccess == VK_FALSE)
- TCU_FAIL("storageBuffer8BitAccess has to be supported");
+ return false;
if ((toCheck & EXT8BITSTORAGEFEATURES_UNIFORM_STORAGE_BUFFER) != 0 && extensionFeatures.uniformAndStorageBuffer8BitAccess == VK_FALSE)
return false;
@@ -166,7 +166,7 @@
bool isFloat16Int8FeaturesSupported (const Context& context, ExtensionFloat16Int8Features toCheck)
{
- const VkPhysicalDeviceFloat16Int8FeaturesKHR& extensionFeatures = context.getFloat16Int8Features();
+ const VkPhysicalDeviceShaderFloat16Int8Features& extensionFeatures = context.getShaderFloat16Int8Features();
if ((toCheck & EXTFLOAT16INT8FEATURES_FLOAT16) != 0 && extensionFeatures.shaderFloat16 == VK_FALSE)
return false;
@@ -177,21 +177,48 @@
return true;
}
+bool isVulkanMemoryModelFeaturesSupported (const Context& context, ExtensionVulkanMemoryModelFeatures toCheck)
+{
+ const VkPhysicalDeviceVulkanMemoryModelFeaturesKHR& extensionFeatures = context.getVulkanMemoryModelFeatures();
+
+ if ((toCheck & EXTVULKANMEMORYMODELFEATURES_ENABLE) != 0 && extensionFeatures.vulkanMemoryModel == VK_FALSE)
+ return false;
+
+ if ((toCheck & EXTVULKANMEMORYMODELFEATURES_DEVICESCOPE) != 0 && extensionFeatures.vulkanMemoryModelDeviceScope == VK_FALSE)
+ return false;
+
+ if ((toCheck & EXTVULKANMEMORYMODELFEATURES_AVAILABILITYVISIBILITYCHAINS) != 0 && extensionFeatures.vulkanMemoryModelAvailabilityVisibilityChains == VK_FALSE)
+ return false;
+
+ return true;
+}
+
bool isFloatControlsFeaturesSupported (const Context& context, const ExtensionFloatControlsFeatures& toCheck)
{
- ExtensionFloatControlsFeatures refControls;
- deMemset(&refControls, 0, sizeof(ExtensionFloatControlsFeatures));
-
- // compare with all flags set to false to verify if any float control features are actualy requested by the test
- if (deMemCmp(&toCheck, &refControls, sizeof(ExtensionFloatControlsFeatures)) == 0)
+ // if all flags are set to false then no float control features are actualy requested by the test
+ if ((toCheck.shaderSignedZeroInfNanPreserveFloat16 ||
+ toCheck.shaderSignedZeroInfNanPreserveFloat32 ||
+ toCheck.shaderSignedZeroInfNanPreserveFloat64 ||
+ toCheck.shaderDenormPreserveFloat16 ||
+ toCheck.shaderDenormPreserveFloat32 ||
+ toCheck.shaderDenormPreserveFloat64 ||
+ toCheck.shaderDenormFlushToZeroFloat16 ||
+ toCheck.shaderDenormFlushToZeroFloat32 ||
+ toCheck.shaderDenormFlushToZeroFloat64 ||
+ toCheck.shaderRoundingModeRTEFloat16 ||
+ toCheck.shaderRoundingModeRTEFloat32 ||
+ toCheck.shaderRoundingModeRTEFloat64 ||
+ toCheck.shaderRoundingModeRTZFloat16 ||
+ toCheck.shaderRoundingModeRTZFloat32 ||
+ toCheck.shaderRoundingModeRTZFloat64) == false)
return true;
// return false when float control features are requested and proper extension is not supported
- const std::vector<std::string>& deviceExtensions = context.getDeviceExtensions();
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), deviceExtensions, "VK_KHR_shader_float_controls"))
+ if (!context.isDeviceFunctionalitySupported("VK_KHR_shader_float_controls"))
return false;
// perform query to get supported float control properties
+ ExtensionFloatControlsFeatures refControls;
{
refControls.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR;
refControls.pNext = DE_NULL;
@@ -206,8 +233,23 @@
instanceInterface.getPhysicalDeviceProperties2(physicalDevice, &deviceProperties);
}
+ using FCIndependence = VkShaderFloatControlsIndependence;
+ FCIndependence fcInd32 = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY_KHR;
+ FCIndependence fcIndAll = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL_KHR;
+ FCIndependence fcIndNone = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE_KHR;
+
+ bool requiredDenormBehaviorNotSupported =
+ ((toCheck.denormBehaviorIndependence == fcIndAll) && (refControls.denormBehaviorIndependence != fcIndAll)) ||
+ ((toCheck.denormBehaviorIndependence == fcInd32) && (refControls.denormBehaviorIndependence == fcIndNone));
+
+ bool requiredRoundingModeNotSupported =
+ ((toCheck.roundingModeIndependence == fcIndAll) && (refControls.roundingModeIndependence != fcIndAll)) ||
+ ((toCheck.roundingModeIndependence == fcInd32) && (refControls.roundingModeIndependence == fcIndNone));
+
// check if flags needed by the test are not supported by the device
bool requiredFeaturesNotSupported =
+ requiredDenormBehaviorNotSupported ||
+ requiredRoundingModeNotSupported ||
(toCheck.shaderDenormFlushToZeroFloat16 && !refControls.shaderDenormFlushToZeroFloat16) ||
(toCheck.shaderDenormPreserveFloat16 && !refControls.shaderDenormPreserveFloat16) ||
(toCheck.shaderRoundingModeRTEFloat16 && !refControls.shaderRoundingModeRTEFloat16) ||
@@ -238,7 +280,10 @@
case SPIRV_VERSION_1_1:
case SPIRV_VERSION_1_2:
case SPIRV_VERSION_1_3:
+ case SPIRV_VERSION_1_4:
return VK_API_VERSION_1_1;
+ case SPIRV_VERSION_1_5:
+ return VK_API_VERSION_1_2;
default:
DE_ASSERT(0);
}
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.hpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.hpp
index b0007b0..20adddc 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.hpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.hpp
@@ -249,7 +249,15 @@
EXTFLOAT16INT8FEATURES_INT8 = (1u << 2),
};
typedef deUint32 ExtensionFloat16Int8Features;
-typedef vk::VkPhysicalDeviceFloatControlsPropertiesKHR ExtensionFloatControlsFeatures;
+typedef vk::VkPhysicalDeviceFloatControlsProperties ExtensionFloatControlsFeatures;
+
+enum ExtensionVulkanMemoryModelFeaturesBits
+{
+ EXTVULKANMEMORYMODELFEATURES_ENABLE = (1u << 1),
+ EXTVULKANMEMORYMODELFEATURES_DEVICESCOPE = (1u << 2),
+ EXTVULKANMEMORYMODELFEATURES_AVAILABILITYVISIBILITYCHAINS = (1u << 3),
+};
+typedef deUint32 ExtensionVulkanMemoryModelFeatures;
struct VulkanFeatures
{
@@ -258,16 +266,21 @@
Extension8BitStorageFeatures ext8BitStorage;
Extension16BitStorageFeatures ext16BitStorage;
ExtensionVariablePointersFeatures extVariablePointers;
+ ExtensionVulkanMemoryModelFeatures extVulkanMemoryModel;
ExtensionFloatControlsFeatures floatControlsProperties;
+
VulkanFeatures (void)
: extFloat16Int8 (0)
, ext8BitStorage (0)
, ext16BitStorage (0)
, extVariablePointers (0)
+ , extVulkanMemoryModel (0)
{
deMemset(&coreFeatures, 0, sizeof(coreFeatures));
deMemset(&floatControlsProperties, 0, sizeof(ExtensionFloatControlsFeatures));
+ floatControlsProperties.denormBehaviorIndependence = vk::VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE_KHR;
+ floatControlsProperties.roundingModeIndependence = vk::VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE_KHR;
}
};
@@ -293,11 +306,6 @@
const char** missingFeature);
// Returns true if the given 16bit storage extension features in `toCheck` are all supported.
-bool isCoreFeaturesSupported (const Context& context,
- const vk::VkPhysicalDeviceFeatures& toCheck,
- const char** missingFeature);
-
-// Returns true if the given 16bit storage extension features in `toCheck` are all supported.
bool is16BitStorageFeaturesSupported (const Context& context,
Extension16BitStorageFeatures toCheck);
@@ -309,6 +317,10 @@
bool isFloat16Int8FeaturesSupported (const Context& context,
ExtensionFloat16Int8Features toCheck);
+// Returns true if the given Vulkan Memory Model extension features in `toCheck` are all supported.
+bool isVulkanMemoryModelFeaturesSupported (const Context& context,
+ ExtensionVulkanMemoryModelFeatures toCheck);
+
// Returns true if the given float controls features in `toCheck` are all supported.
bool isFloatControlsFeaturesSupported (const Context& context,
const ExtensionFloatControlsFeatures& toCheck);
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmVariablePointersTests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmVariablePointersTests.cpp
index 052e19b..e20712b 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmVariablePointersTests.cpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmVariablePointersTests.cpp
@@ -211,8 +211,6 @@
incrAmuxBOutputFloats[i] = (inputSFloats[i] < 0) ? 1 + inputAFloats[i] : 1 + inputBFloats[i];
}
- const char *extensions = physPtrs ? "VK_EXT_buffer_device_address" : "VK_KHR_variable_pointers";
-
std::string stringTemplate =
"OpCapability Shader\n"
@@ -399,7 +397,8 @@
spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputBFloats)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputSFloats)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.outputs.push_back(Resource(BufferSp(new Float32Buffer(expectedOutput))));
- spec.extensions.push_back(extensions);
+ if (!physPtrs)
+ spec.extensions.push_back("VK_KHR_variable_pointers");
group->addChild(new SpvAsmComputeShaderCase(testCtx, name.c_str(), name.c_str(), spec));
}
{ // Variable Pointer Reads (using OpFunctionCall)
@@ -422,7 +421,8 @@
spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputBFloats)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputSFloats)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.outputs.push_back(Resource(BufferSp(new Float32Buffer(expectedOutput))));
- spec.extensions.push_back(extensions);
+ if (!physPtrs)
+ spec.extensions.push_back("VK_KHR_variable_pointers");
group->addChild(new SpvAsmComputeShaderCase(testCtx, name.c_str(), name.c_str(), spec));
}
{ // Variable Pointer Reads (using OpPhi)
@@ -453,7 +453,8 @@
spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputBFloats)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputSFloats)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.outputs.push_back(Resource(BufferSp(new Float32Buffer(expectedOutput))));
- spec.extensions.push_back(extensions);
+ if (!physPtrs)
+ spec.extensions.push_back("VK_KHR_variable_pointers");
group->addChild(new SpvAsmComputeShaderCase(testCtx, name.c_str(), name.c_str(), spec));
}
{ // Variable Pointer Reads (using OpCopyObject)
@@ -479,7 +480,8 @@
spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputBFloats)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputSFloats)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.outputs.push_back(Resource(BufferSp(new Float32Buffer(expectedOutput))));
- spec.extensions.push_back(extensions);
+ if (!physPtrs)
+ spec.extensions.push_back("VK_KHR_variable_pointers");
group->addChild(new SpvAsmComputeShaderCase(testCtx, name.c_str(), name.c_str(), spec));
}
{ // Test storing into Private variables.
@@ -511,7 +513,8 @@
spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputBFloats)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputSFloats)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.outputs.push_back(Resource(BufferSp(new Float32Buffer(expectedOutput))));
- spec.extensions.push_back(extensions);
+ if (!physPtrs)
+ spec.extensions.push_back("VK_KHR_variable_pointers");
group->addChild(new SpvAsmComputeShaderCase(testCtx, name.c_str(), description.c_str(), spec));
}
}
@@ -547,7 +550,8 @@
spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputBFloats)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputSFloats)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.outputs.push_back(Resource(BufferSp(new Float32Buffer(expectedOutput))));
- spec.extensions.push_back(extensions);
+ if (!physPtrs)
+ spec.extensions.push_back("VK_KHR_variable_pointers");
group->addChild(new SpvAsmComputeShaderCase(testCtx, name.c_str(), name.c_str(), spec));
}
{ // Variable Pointer Writes
@@ -573,7 +577,8 @@
spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputBFloats)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputSFloats)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.outputs.push_back(Resource(BufferSp(new Float32Buffer(expectedIncrOutput))));
- spec.extensions.push_back(extensions);
+ if (!physPtrs)
+ spec.extensions.push_back("VK_KHR_variable_pointers");
group->addChild(new SpvAsmComputeShaderCase(testCtx, name.c_str(), name.c_str(), spec));
}
@@ -616,7 +621,8 @@
spec.inputs.push_back (Resource(BufferSp(new Float32Buffer(inputBFloats)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.inputs.push_back (Resource(BufferSp(new Float32Buffer(inputSFloats)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.outputs.push_back(Resource(BufferSp(new Float32Buffer(expectedOutput))));
- spec.extensions.push_back(extensions);
+ if (!physPtrs)
+ spec.extensions.push_back("VK_KHR_variable_pointers");
group->addChild(new SpvAsmComputeShaderCase(testCtx, name.c_str(), name.c_str(), spec));
}
}
@@ -864,8 +870,6 @@
"%inputC_b = OpAccessChain %outer_struct_ptr %inputC %c_i32_1\n"
);
- const char *extensions = physPtrs ? "VK_EXT_buffer_device_address" : "VK_KHR_variable_pointers";
-
std::string stringTemplate =
"OpCapability Shader\n"
@@ -1091,47 +1095,8 @@
spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputB)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputC)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.outputs.push_back(Resource(BufferSp(new Float32Buffer(expectedOutput))));
- spec.extensions.push_back(extensions);
- group->addChild(new SpvAsmComputeShaderCase(testCtx, name.c_str(), name.c_str(), spec));
- }
-
- // Use OpConstantNull to choose between 2 pointers
- if (physPtrs)
- {
- ComputeShaderSpec spec;
- map<string, string> specs;
- string opCodeForTests = "opconstantnull";
- string name = opCodeForTests + indexLevelNames[indexLevel] + bufferType + selectedInputStr;
- specs["extra_types"] = "%uint64 = OpTypeInt 64 0\n"
- "%c_u64_0 = OpConstant %uint64 0\n"
- "%cnull = OpConstantNull %sb_f32ptr\n";
- specs["extra_capability"] = "OpCapability PhysicalStorageBufferAddressesEXT\nOpCapability Int64\n";
- specs["input_decorations"] = inputDecorations;
- specs["input_variables"] = inputVariables;
- specs["input_intermediates"] = inputIntermediates;
- specs["selected_type"] = pointerTypeAtLevel[indexLevel];
- specs["select_inputA"] = spirvSelectInputA;
- specs["a_loc"] = inputALocations[indexLevel];
- specs["b_loc"] = inputBLocations[indexLevel];
- specs["remaining_indexes"] = remainingIndexesAtLevel[indexLevel];
- specs["selection_strategy"] = "%cnullint = OpConvertPtrToU %uint64 %cnull\n"
- "%nulleq0 = " + string(selectInputA ? "OpIEqual" : "OpINotEqual") + " %bool %cnullint %c_u64_0\n"
- "%var_ptr = OpSelect "
- + pointerTypeAtLevel[indexLevel]
- + " %nulleq0 "
- + baseANameAtLevel[indexLevel] + " "
- + baseBNameAtLevel[indexLevel] + "\n";
- expectedOutput[0] = selectedInput[baseOffset];
- spec.usesPhysStorageBuffer = physPtrs;
- spec.assembly = shaderTemplate.specialize(specs);
- spec.numWorkGroups = IVec3(1, 1, 1);
- spec.requestedVulkanFeatures = requiredFeatures;
- spec.requestedVulkanFeatures.coreFeatures.shaderInt64 = VK_TRUE;
- spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputA)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
- spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputB)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
- spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputC)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
- spec.outputs.push_back(Resource(BufferSp(new Float32Buffer(expectedOutput))));
- spec.extensions.push_back(extensions);
+ if (!physPtrs)
+ spec.extensions.push_back("VK_KHR_variable_pointers");
group->addChild(new SpvAsmComputeShaderCase(testCtx, name.c_str(), name.c_str(), spec));
}
@@ -1166,7 +1131,8 @@
spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputB)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputC)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.outputs.push_back(Resource(BufferSp(new Float32Buffer(expectedOutput))));
- spec.extensions.push_back(extensions);
+ if (!physPtrs)
+ spec.extensions.push_back("VK_KHR_variable_pointers");
group->addChild(new SpvAsmComputeShaderCase(testCtx, name.c_str(), name.c_str(), spec));
}
@@ -1210,7 +1176,8 @@
spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputB)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputC)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.outputs.push_back(Resource(BufferSp(new Float32Buffer(expectedOutput))));
- spec.extensions.push_back(extensions);
+ if (!physPtrs)
+ spec.extensions.push_back("VK_KHR_variable_pointers");
group->addChild(new SpvAsmComputeShaderCase(testCtx, name.c_str(), name.c_str(), spec));
}
@@ -1243,7 +1210,8 @@
spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputB)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputC)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.outputs.push_back(Resource(BufferSp(new Float32Buffer(expectedOutput))));
- spec.extensions.push_back(extensions);
+ if (!physPtrs)
+ spec.extensions.push_back("VK_KHR_variable_pointers");
group->addChild(new SpvAsmComputeShaderCase(testCtx, name.c_str(), name.c_str(), spec));
}
@@ -1277,7 +1245,8 @@
spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputB)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputC)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
spec.outputs.push_back(Resource(BufferSp(new Float32Buffer(expectedOutput))));
- spec.extensions.push_back(extensions);
+ if (!physPtrs)
+ spec.extensions.push_back("VK_KHR_variable_pointers");
group->addChild(new SpvAsmComputeShaderCase(testCtx, name.c_str(), name.c_str(), spec));
}
}
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmWorkgroupMemoryTests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmWorkgroupMemoryTests.cpp
index 998ea35..4df1658 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmWorkgroupMemoryTests.cpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmWorkgroupMemoryTests.cpp
@@ -333,9 +333,10 @@
shaderSpec["dataTypeDecl"] = "%f16 = OpTypeFloat 16";
shaderSpec["dataType"] = "f16";
shaderSpec["extensions"] = "OpExtension \"SPV_KHR_16bit_storage\"\n";
- shaderSpec["capabilities"] = "OpCapability StorageUniformBufferBlock16\n";
+ shaderSpec["capabilities"] = "OpCapability StorageUniformBufferBlock16\nOpCapability Float16\n";
features.ext16BitStorage = EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK;
+ features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
vector<deFloat16> inputData = getFloat16s(rnd, numElements);
vector<deFloat16> outputData;
@@ -348,6 +349,7 @@
spec.assembly = shaderSource.specialize(shaderSpec);
spec.numWorkGroups = IVec3(1, 1, 1);
spec.extensions.push_back("VK_KHR_16bit_storage");
+ spec.extensions.push_back("VK_KHR_shader_float16_int8");
spec.requestedVulkanFeatures = features;
spec.verifyIO = checkResultsFloat16;
@@ -452,10 +454,11 @@
shaderSpec["sizeBytes"] = "1";
shaderSpec["dataTypeDecl"] = "%i8 = OpTypeInt 8 1";
shaderSpec["dataType"] = "i8";
- shaderSpec["capabilities"] = "OpCapability UniformAndStorageBuffer8BitAccess\n";
+ shaderSpec["capabilities"] = "OpCapability UniformAndStorageBuffer8BitAccess\nOpCapability Int8\n";
shaderSpec["extensions"] = "OpExtension \"SPV_KHR_8bit_storage\"\n";
features.ext8BitStorage = EXT8BITSTORAGEFEATURES_UNIFORM_STORAGE_BUFFER;
+ features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_INT8;
vector<deInt8> inputData = getInt8s(rnd, numElements);
vector<deInt8> outputData;
@@ -468,6 +471,7 @@
spec.assembly = shaderSource.specialize(shaderSpec);
spec.numWorkGroups = IVec3(1, 1, 1);
spec.extensions.push_back("VK_KHR_8bit_storage");
+ spec.extensions.push_back("VK_KHR_shader_float16_int8");
spec.requestedVulkanFeatures = features;
spec.inputs.push_back(Resource(BufferSp(new Int8Buffer(inputData)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
@@ -583,10 +587,11 @@
shaderSpec["sizeBytes"] = "1";
shaderSpec["dataTypeDecl"] = "%u8 = OpTypeInt 8 0";
shaderSpec["dataType"] = "u8";
- shaderSpec["capabilities"] = "OpCapability UniformAndStorageBuffer8BitAccess\n";
+ shaderSpec["capabilities"] = "OpCapability UniformAndStorageBuffer8BitAccess\nOpCapability Int8\n";
shaderSpec["extensions"] = "OpExtension \"SPV_KHR_8bit_storage\"\n";
features.ext8BitStorage = EXT8BITSTORAGEFEATURES_UNIFORM_STORAGE_BUFFER;
+ features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_INT8;
vector<deUint8> inputData;
vector<deUint8> outputData;
@@ -603,6 +608,7 @@
spec.assembly = shaderSource.specialize(shaderSpec);
spec.numWorkGroups = IVec3(1, 1, 1);
spec.extensions.push_back("VK_KHR_8bit_storage");
+ spec.extensions.push_back("VK_KHR_shader_float16_int8");
spec.requestedVulkanFeatures = features;
spec.inputs.push_back(Resource(BufferSp(new Uint8Buffer(inputData)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
diff --git a/external/vulkancts/modules/vulkan/ssbo/vktSSBOLayoutCase.cpp b/external/vulkancts/modules/vulkan/ssbo/vktSSBOLayoutCase.cpp
index b0f9ecc..136f65a 100644
--- a/external/vulkancts/modules/vulkan/ssbo/vktSSBOLayoutCase.cpp
+++ b/external/vulkancts/modules/vulkan/ssbo/vktSSBOLayoutCase.cpp
@@ -2234,8 +2234,13 @@
vector<BlockDataPtr> mappedBlockPtrs;
vk::VkFlags usageFlags = vk::VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
+ bool memoryDeviceAddress = false;
if (m_usePhysStorageBuffer)
- usageFlags |= vk::VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT;
+ {
+ usageFlags |= vk::VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT;
+ if (m_context.isDeviceFunctionalitySupported("VK_KHR_buffer_device_address"))
+ memoryDeviceAddress = true;
+ }
// Upload base buffers
const std::vector<int> bufferSizes = computeBufferSizes(m_interface, m_refLayout);
@@ -2256,7 +2261,7 @@
blockLocations[blockNdx] = BlockLocation(blockNdx, 0, bufferSize);
vk::Move<vk::VkBuffer> buffer = createBuffer(m_context, bufferSize, usageFlags);
- de::MovePtr<vk::Allocation> alloc = allocateAndBindMemory(m_context, *buffer, vk::MemoryRequirement::HostVisible);
+ de::MovePtr<vk::Allocation> alloc = allocateAndBindMemory(m_context, *buffer, vk::MemoryRequirement::HostVisible | (memoryDeviceAddress ? vk::MemoryRequirement::DeviceAddress : vk::MemoryRequirement::Any));
descriptors[blockNdx] = makeDescriptorBufferInfo(*buffer, 0ull, bufferSize);
@@ -2288,7 +2293,7 @@
const int totalBufferSize = curOffset;
vk::Move<vk::VkBuffer> buffer = createBuffer(m_context, totalBufferSize, usageFlags);
- de::MovePtr<vk::Allocation> alloc = allocateAndBindMemory(m_context, *buffer, vk::MemoryRequirement::HostVisible);
+ de::MovePtr<vk::Allocation> alloc = allocateAndBindMemory(m_context, *buffer, vk::MemoryRequirement::HostVisible | (memoryDeviceAddress ? vk::MemoryRequirement::DeviceAddress : vk::MemoryRequirement::Any));
mapPtrs.push_back(alloc->getHostPtr());
@@ -2336,9 +2341,11 @@
// Query the buffer device addresses and push them via push constants
if (m_usePhysStorageBuffer)
{
- vk::VkBufferDeviceAddressInfoEXT info =
+ const bool useKHR = m_context.isDeviceFunctionalitySupported("VK_KHR_buffer_device_address");
+
+ vk::VkBufferDeviceAddressInfo info =
{
- vk::VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT, // VkStructureType sType;
+ vk::VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
0, // VkBuffer buffer
};
@@ -2346,7 +2353,11 @@
for (deUint32 i = 0; i < descriptors.size(); ++i)
{
info.buffer = descriptors[i].buffer;
- vk::VkDeviceAddress addr = vk.getBufferDeviceAddressEXT(device, &info);
+ vk::VkDeviceAddress addr;
+ if (useKHR)
+ addr = vk.getBufferDeviceAddress(device, &info);
+ else
+ addr = vk.getBufferDeviceAddressEXT(device, &info);
addr += descriptors[i].offset;
gpuAddrs.push_back(addr);
}
@@ -2371,7 +2382,7 @@
(vk::VkPipelineLayoutCreateFlags)0,
1u, // deUint32 descriptorSetCount;
&*descriptorSetLayout, // const VkDescriptorSetLayout* pSetLayouts;
- m_usePhysStorageBuffer ? 1u : 0u, // deUint32 pushConstantRangeCount;
+ m_usePhysStorageBuffer ? 1u : 0u, // deUint32 pushConstantRangeCount;
&pushConstRange, // const VkPushConstantRange* pPushConstantRanges;
};
vk::Move<vk::VkPipelineLayout> pipelineLayout(createPipelineLayout(vk, device, &pipelineLayoutParams));
@@ -2537,7 +2548,7 @@
TestInstance* SSBOLayoutCase::createInstance (Context& context) const
{
- if (!vk::isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_relaxed_block_layout") && usesRelaxedLayout(m_interface))
+ if (!context.isDeviceFunctionalitySupported("VK_KHR_relaxed_block_layout") && usesRelaxedLayout(m_interface))
TCU_THROW(NotSupportedError, "VK_KHR_relaxed_block_layout not supported");
if (!context.get16BitStorageFeatures().storageBuffer16BitAccess && uses16BitStorage(m_interface))
TCU_THROW(NotSupportedError, "storageBuffer16BitAccess not supported");
@@ -2545,7 +2556,7 @@
TCU_THROW(NotSupportedError, "storageBuffer8BitAccess not supported");
if (!context.getScalarBlockLayoutFeatures().scalarBlockLayout && usesScalarLayout(m_interface))
TCU_THROW(NotSupportedError, "scalarBlockLayout not supported");
- if (!context.getBufferDeviceAddressFeatures().bufferDeviceAddress && m_usePhysStorageBuffer)
+ if (m_usePhysStorageBuffer && !context.isBufferDeviceAddressSupported())
TCU_THROW(NotSupportedError, "Physical storage buffer pointers not supported");
return new SSBOLayoutCaseInstance(context, m_bufferMode, m_interface, m_refLayout, m_initialData, m_writeData, m_usePhysStorageBuffer);
}
diff --git a/external/vulkancts/modules/vulkan/subgroups/CMakeLists.txt b/external/vulkancts/modules/vulkan/subgroups/CMakeLists.txt
index 7178e16..4c4dd5a 100644
--- a/external/vulkancts/modules/vulkan/subgroups/CMakeLists.txt
+++ b/external/vulkancts/modules/vulkan/subgroups/CMakeLists.txt
@@ -31,6 +31,8 @@
vktSubgroupsShapeTests.hpp
vktSubgroupsTestsUtils.cpp
vktSubgroupsTestsUtils.hpp
+ vktSubgroupsBallotMasksTests.cpp
+ vktSubgroupsBallotMasksTests.hpp
)
set(DEQP_VK_SUBGROUPS_LIBS
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsArithmeticTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsArithmeticTests.cpp
index d0431f8..dd581d0 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsArithmeticTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsArithmeticTests.cpp
@@ -149,9 +149,13 @@
{
default:
return "min(" + lhs + ", " + rhs + ")";
+ case VK_FORMAT_R16_SFLOAT:
case VK_FORMAT_R32_SFLOAT:
case VK_FORMAT_R64_SFLOAT:
return "(isnan(" + lhs + ") ? " + rhs + " : (isnan(" + rhs + ") ? " + lhs + " : min(" + lhs + ", " + rhs + ")))";
+ case VK_FORMAT_R16G16_SFLOAT:
+ case VK_FORMAT_R16G16B16_SFLOAT:
+ case VK_FORMAT_R16G16B16A16_SFLOAT:
case VK_FORMAT_R32G32_SFLOAT:
case VK_FORMAT_R32G32B32_SFLOAT:
case VK_FORMAT_R32G32B32A32_SFLOAT:
@@ -167,9 +171,13 @@
{
default:
return "max(" + lhs + ", " + rhs + ")";
+ case VK_FORMAT_R16_SFLOAT:
case VK_FORMAT_R32_SFLOAT:
case VK_FORMAT_R64_SFLOAT:
return "(isnan(" + lhs + ") ? " + rhs + " : (isnan(" + rhs + ") ? " + lhs + " : max(" + lhs + ", " + rhs + ")))";
+ case VK_FORMAT_R16G16_SFLOAT:
+ case VK_FORMAT_R16G16B16_SFLOAT:
+ case VK_FORMAT_R16G16B16A16_SFLOAT:
case VK_FORMAT_R32G32_SFLOAT:
case VK_FORMAT_R32G32B32_SFLOAT:
case VK_FORMAT_R32G32B32A32_SFLOAT:
@@ -231,43 +239,9 @@
std::string getIdentity(int opType, vk::VkFormat format)
{
- bool isFloat = false;
- bool isInt = false;
- bool isUnsigned = false;
-
- switch (format)
- {
- default:
- DE_FATAL("Unhandled format!");
- break;
- case VK_FORMAT_R32_SINT:
- case VK_FORMAT_R32G32_SINT:
- case VK_FORMAT_R32G32B32_SINT:
- case VK_FORMAT_R32G32B32A32_SINT:
- isInt = true;
- break;
- case VK_FORMAT_R32_UINT:
- case VK_FORMAT_R32G32_UINT:
- case VK_FORMAT_R32G32B32_UINT:
- case VK_FORMAT_R32G32B32A32_UINT:
- isUnsigned = true;
- break;
- case VK_FORMAT_R32_SFLOAT:
- case VK_FORMAT_R32G32_SFLOAT:
- case VK_FORMAT_R32G32B32_SFLOAT:
- case VK_FORMAT_R32G32B32A32_SFLOAT:
- case VK_FORMAT_R64_SFLOAT:
- case VK_FORMAT_R64G64_SFLOAT:
- case VK_FORMAT_R64G64B64_SFLOAT:
- case VK_FORMAT_R64G64B64A64_SFLOAT:
- isFloat = true;
- break;
- case VK_FORMAT_R8_USCALED:
- case VK_FORMAT_R8G8_USCALED:
- case VK_FORMAT_R8G8B8_USCALED:
- case VK_FORMAT_R8G8B8A8_USCALED:
- break; // bool types are not anything
- }
+ const bool isFloat = subgroups::isFormatFloat(format);
+ const bool isInt = subgroups::isFormatSigned(format);
+ const bool isUnsigned = subgroups::isFormatUnsigned(format);
switch (opType)
{
@@ -291,11 +265,42 @@
}
else if (isInt)
{
- return subgroups::getFormatNameForGLSL(format) + "(0x7fffffff)";
+ switch (format)
+ {
+ default:
+ return subgroups::getFormatNameForGLSL(format) + "(0x7fffffff)";
+ case VK_FORMAT_R8_SINT:
+ case VK_FORMAT_R8G8_SINT:
+ case VK_FORMAT_R8G8B8_SINT:
+ case VK_FORMAT_R8G8B8A8_SINT:
+ case VK_FORMAT_R8_UINT:
+ case VK_FORMAT_R8G8_UINT:
+ case VK_FORMAT_R8G8B8_UINT:
+ case VK_FORMAT_R8G8B8A8_UINT:
+ return subgroups::getFormatNameForGLSL(format) + "(0x7f)";
+ case VK_FORMAT_R16_SINT:
+ case VK_FORMAT_R16G16_SINT:
+ case VK_FORMAT_R16G16B16_SINT:
+ case VK_FORMAT_R16G16B16A16_SINT:
+ case VK_FORMAT_R16_UINT:
+ case VK_FORMAT_R16G16_UINT:
+ case VK_FORMAT_R16G16B16_UINT:
+ case VK_FORMAT_R16G16B16A16_UINT:
+ return subgroups::getFormatNameForGLSL(format) + "(0x7fff)";
+ case VK_FORMAT_R64_SINT:
+ case VK_FORMAT_R64G64_SINT:
+ case VK_FORMAT_R64G64B64_SINT:
+ case VK_FORMAT_R64G64B64A64_SINT:
+ case VK_FORMAT_R64_UINT:
+ case VK_FORMAT_R64G64_UINT:
+ case VK_FORMAT_R64G64B64_UINT:
+ case VK_FORMAT_R64G64B64A64_UINT:
+ return subgroups::getFormatNameForGLSL(format) + "(0x7fffffffffffffffUL)";
+ }
}
else if (isUnsigned)
{
- return subgroups::getFormatNameForGLSL(format) + "(0xffffffffu)";
+ return subgroups::getFormatNameForGLSL(format) + "(-1)";
}
else
{
@@ -311,7 +316,38 @@
}
else if (isInt)
{
- return subgroups::getFormatNameForGLSL(format) + "(0x80000000)";
+ switch (format)
+ {
+ default:
+ return subgroups::getFormatNameForGLSL(format) + "(0x80000000)";
+ case VK_FORMAT_R8_SINT:
+ case VK_FORMAT_R8G8_SINT:
+ case VK_FORMAT_R8G8B8_SINT:
+ case VK_FORMAT_R8G8B8A8_SINT:
+ case VK_FORMAT_R8_UINT:
+ case VK_FORMAT_R8G8_UINT:
+ case VK_FORMAT_R8G8B8_UINT:
+ case VK_FORMAT_R8G8B8A8_UINT:
+ return subgroups::getFormatNameForGLSL(format) + "(0x80)";
+ case VK_FORMAT_R16_SINT:
+ case VK_FORMAT_R16G16_SINT:
+ case VK_FORMAT_R16G16B16_SINT:
+ case VK_FORMAT_R16G16B16A16_SINT:
+ case VK_FORMAT_R16_UINT:
+ case VK_FORMAT_R16G16_UINT:
+ case VK_FORMAT_R16G16B16_UINT:
+ case VK_FORMAT_R16G16B16A16_UINT:
+ return subgroups::getFormatNameForGLSL(format) + "(0x8000)";
+ case VK_FORMAT_R64_SINT:
+ case VK_FORMAT_R64G64_SINT:
+ case VK_FORMAT_R64G64B64_SINT:
+ case VK_FORMAT_R64G64B64A64_SINT:
+ case VK_FORMAT_R64_UINT:
+ case VK_FORMAT_R64G64_UINT:
+ case VK_FORMAT_R64G64B64_UINT:
+ case VK_FORMAT_R64G64B64A64_UINT:
+ return subgroups::getFormatNameForGLSL(format) + "(0x8000000000000000UL)";
+ }
}
else if (isUnsigned)
{
@@ -345,9 +381,28 @@
default:
return "all(equal(" + lhs + ", " + rhs + "))";
case VK_FORMAT_R8_USCALED:
+ case VK_FORMAT_R8_UINT:
+ case VK_FORMAT_R8_SINT:
+ case VK_FORMAT_R16_UINT:
+ case VK_FORMAT_R16_SINT:
case VK_FORMAT_R32_UINT:
case VK_FORMAT_R32_SINT:
+ case VK_FORMAT_R64_UINT:
+ case VK_FORMAT_R64_SINT:
return "(" + lhs + " == " + rhs + ")";
+ case VK_FORMAT_R16_SFLOAT:
+ switch (opType)
+ {
+ default:
+ return "(abs(" + lhs + " - " + rhs + ") < " + formatName + "(0.1))";
+ case OPTYPE_MIN:
+ case OPTYPE_INCLUSIVE_MIN:
+ case OPTYPE_EXCLUSIVE_MIN:
+ case OPTYPE_MAX:
+ case OPTYPE_INCLUSIVE_MAX:
+ case OPTYPE_EXCLUSIVE_MAX:
+ return "(" + lhs + " == " + rhs + ")";
+ }
case VK_FORMAT_R32_SFLOAT:
case VK_FORMAT_R64_SFLOAT:
switch (opType)
@@ -362,6 +417,22 @@
case OPTYPE_EXCLUSIVE_MAX:
return "(" + lhs + " == " + rhs + ")";
}
+ case VK_FORMAT_R16G16_SFLOAT:
+ case VK_FORMAT_R16G16B16_SFLOAT:
+ case VK_FORMAT_R16G16B16A16_SFLOAT:
+ switch (opType)
+ {
+ default:
+ return "all(lessThan(abs(" + lhs + " - " + rhs + "), " + formatName + "(0.1)))";
+ case OPTYPE_MIN:
+ case OPTYPE_INCLUSIVE_MIN:
+ case OPTYPE_EXCLUSIVE_MIN:
+ case OPTYPE_MAX:
+ case OPTYPE_INCLUSIVE_MAX:
+ case OPTYPE_EXCLUSIVE_MAX:
+ return "all(equal(" + lhs + ", " + rhs + "))";
+ }
+ break;
case VK_FORMAT_R32G32_SFLOAT:
case VK_FORMAT_R32G32B32_SFLOAT:
case VK_FORMAT_R32G32B32A32_SFLOAT:
@@ -381,6 +452,8 @@
return "all(equal(" + lhs + ", " + rhs + "))";
}
}
+ DE_FATAL("Unhandled case");
+ return "";
}
struct CaseDefinition
@@ -465,6 +538,7 @@
vertexSrc << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(location = 0) in highp vec4 in_position;\n"
<< "layout(location = 0) out float out_color;\n"
<< "layout(set = 0, binding = 0) uniform Buffer1\n"
@@ -490,6 +564,7 @@
geometry << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(points) in;\n"
<< "layout(points, max_vertices = 1) out;\n"
<< "layout(location = 0) out float out_color;\n"
@@ -518,6 +593,7 @@
controlSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(vertices = 2) out;\n"
<< "layout(location = 0) out float out_color[];\n"
<< "layout(set = 0, binding = 0) uniform Buffer1\n"
@@ -550,6 +626,7 @@
evaluationSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(isolines, equal_spacing, ccw ) in;\n"
<< "layout(location = 0) out float out_color;\n"
<< "layout(set = 0, binding = 0) uniform Buffer1\n"
@@ -640,6 +717,7 @@
src << "#version 450\n"
<< "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout (local_size_x_id = 0, local_size_y_id = 1, "
"local_size_z_id = 2) in;\n"
<< "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
@@ -672,6 +750,7 @@
"#version 450\n"
"#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(set = 0, binding = 0, std430) buffer Buffer1\n"
"{\n"
" uint result[];\n"
@@ -700,6 +779,7 @@
"#version 450\n"
"#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(vertices=1) out;\n"
"layout(set = 0, binding = 1, std430) buffer Buffer1\n"
"{\n"
@@ -731,6 +811,7 @@
"#version 450\n"
"#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(isolines) in;\n"
"layout(set = 0, binding = 2, std430) buffer Buffer1\n"
"{\n"
@@ -758,6 +839,7 @@
"#version 450\n"
"#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(${TOPOLOGY}) in;\n"
"layout(points, max_vertices = 1) out;\n"
"layout(set = 0, binding = 3, std430) buffer Buffer1\n"
@@ -787,6 +869,7 @@
"#version 450\n"
"#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(location = 0) out uint result;\n"
"layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
"{\n"
@@ -815,11 +898,8 @@
TCU_THROW(NotSupportedError, "Device does not support subgroup arithmetic operations");
}
- if (subgroups::isDoubleFormat(caseDef.format) &&
- !subgroups::isDoubleSupportedForDevice(context))
- {
- TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
- }
+ if (!subgroups::isFormatSupportedForDevice(context, caseDef.format))
+ TCU_THROW(NotSupportedError, "Device does not support the specified format in subgroup operations");
*caseDef.geometryPointSizeSupported = subgroups::isTessellationAndGeometryPointSizeSupported(context);
}
@@ -958,20 +1038,9 @@
VK_SHADER_STAGE_GEOMETRY_BIT,
};
- const VkFormat formats[] =
- {
- VK_FORMAT_R32_SINT, VK_FORMAT_R32G32_SINT, VK_FORMAT_R32G32B32_SINT,
- VK_FORMAT_R32G32B32A32_SINT, VK_FORMAT_R32_UINT, VK_FORMAT_R32G32_UINT,
- VK_FORMAT_R32G32B32_UINT, VK_FORMAT_R32G32B32A32_UINT,
- VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32G32_SFLOAT,
- VK_FORMAT_R32G32B32_SFLOAT, VK_FORMAT_R32G32B32A32_SFLOAT,
- VK_FORMAT_R64_SFLOAT, VK_FORMAT_R64G64_SFLOAT,
- VK_FORMAT_R64G64B64_SFLOAT, VK_FORMAT_R64G64B64A64_SFLOAT,
- VK_FORMAT_R8_USCALED, VK_FORMAT_R8G8_USCALED,
- VK_FORMAT_R8G8B8_USCALED, VK_FORMAT_R8G8B8A8_USCALED,
- };
+ const std::vector<VkFormat> formats = subgroups::getAllFormats();
- for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
+ for (size_t formatIndex = 0; formatIndex < formats.size(); ++formatIndex)
{
const VkFormat format = formats[formatIndex];
@@ -984,6 +1053,10 @@
{
default:
break;
+ case VK_FORMAT_R16_SFLOAT:
+ case VK_FORMAT_R16G16_SFLOAT:
+ case VK_FORMAT_R16G16B16_SFLOAT:
+ case VK_FORMAT_R16G16B16A16_SFLOAT:
case VK_FORMAT_R32_SFLOAT:
case VK_FORMAT_R32G32_SFLOAT:
case VK_FORMAT_R32G32B32_SFLOAT:
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotBroadcastTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotBroadcastTests.cpp
index 33e5e78..ff4e9d7 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotBroadcastTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotBroadcastTests.cpp
@@ -39,6 +39,7 @@
enum OpType
{
OPTYPE_BROADCAST = 0,
+ OPTYPE_BROADCAST_NONCONST,
OPTYPE_BROADCAST_FIRST,
OPTYPE_LAST
};
@@ -56,7 +57,7 @@
return vkt::subgroups::checkCompute(datas, numWorkgroups, localSize, 3);
}
-std::string getOpTypeName(int opType)
+std::string getOpTypeCaseName(int opType)
{
switch (opType)
{
@@ -64,37 +65,62 @@
DE_FATAL("Unsupported op type");
return "";
case OPTYPE_BROADCAST:
- return "subgroupBroadcast";
+ return "subgroupbroadcast";
+ case OPTYPE_BROADCAST_NONCONST:
+ return "subgroupbroadcast_nonconst";
case OPTYPE_BROADCAST_FIRST:
- return "subgroupBroadcastFirst";
+ return "subgroupbroadcastfirst";
}
}
+
struct CaseDefinition
{
int opType;
VkShaderStageFlags shaderStage;
VkFormat format;
de::SharedPtr<bool> geometryPointSizeSupported;
+ deBool extShaderSubGroupBallotTests;
};
std::string getBodySource(CaseDefinition caseDef)
{
std::ostringstream bdy;
- bdy << " uvec4 mask = subgroupBallot(true);\n";
- bdy << " uint tempResult = 0;\n";
+ std::string broadcast;
+ std::string broadcastFirst;
+ int max;
+ if (caseDef.extShaderSubGroupBallotTests)
+ {
+ broadcast = "readInvocationARB";
+ broadcastFirst = "readFirstInvocationARB";
+ max = 64;
+
+ bdy << " uint64_t mask = ballotARB(true);\n";
+ bdy << " uint sgSize = gl_SubGroupSizeARB;\n";
+ bdy << " uint sgInvocation = gl_SubGroupInvocationARB;\n";
+ }
+ else
+ {
+ broadcast = "subgroupBroadcast";
+ broadcastFirst = "subgroupBroadcastFirst";
+ max = (int)subgroups::maxSupportedSubgroupSize();
+
+ bdy << " uvec4 mask = subgroupBallot(true);\n";
+ bdy << " uint sgSize = gl_SubgroupSize;\n";
+ bdy << " uint sgInvocation = gl_SubgroupInvocationID;\n";
+ }
if (OPTYPE_BROADCAST == caseDef.opType)
{
- bdy << " tempResult = 0x3;\n";
- for (int i = 0; i < (int)subgroups::maxSupportedSubgroupSize(); i++)
+ bdy << " uint tempResult = 0x3;\n";
+ for (int i = 0; i < max; i++)
{
bdy << " {\n"
<< " const uint id = "<< i << ";\n"
- << " " << subgroups::getFormatNameForGLSL(caseDef.format)
- << " op = subgroupBroadcast(data1[gl_SubgroupInvocationID], id);\n"
- << " if ((id < gl_SubgroupSize) && subgroupBallotBitExtract(mask, id))\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+ << broadcast << "(data1[sgInvocation], id);\n"
+ << " if ((id < sgSize) && subgroupBallotBitExtract(mask, id))\n"
<< " {\n"
<< " if (op != data1[id])\n"
<< " {\n"
@@ -104,10 +130,27 @@
<< " }\n";
}
}
+ else if (OPTYPE_BROADCAST_NONCONST == caseDef.opType)
+ {
+ bdy << " uint tempResult = 0x3;\n"
+ << " for (uint id = 0; id < sgSize; id++)\n"
+ << " {\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+ << broadcast << "(data1[sgInvocation], id);\n"
+ << " if (subgroupBallotBitExtract(mask, id))\n"
+ << " {\n"
+ << " if (op != data1[id])\n"
+ << " {\n"
+ << " tempResult = 0;\n"
+ << " }\n"
+ << " }\n"
+ << " }\n";
+ }
else
{
- bdy << " uint firstActive = 0;\n"
- << " for (uint i = 0; i < gl_SubgroupSize; i++)\n"
+ bdy << " uint tempResult = 0;\n"
+ << " uint firstActive = 0;\n"
+ << " for (uint i = 0; i < sgSize; i++)\n"
<< " {\n"
<< " if (subgroupBallotBitExtract(mask, i))\n"
<< " {\n"
@@ -115,11 +158,11 @@
<< " break;\n"
<< " }\n"
<< " }\n"
- << " tempResult |= (subgroupBroadcastFirst(data1[gl_SubgroupInvocationID]) == data1[firstActive]) ? 0x1 : 0;\n"
+ << " tempResult |= (" << broadcastFirst << "(data1[sgInvocation]) == data1[firstActive]) ? 0x1 : 0;\n"
<< " // make the firstActive invocation inactive now\n"
- << " if (firstActive == gl_SubgroupInvocationID)\n"
+ << " if (firstActive == sgInvocation)\n"
<< " {\n"
- << " for (uint i = 0; i < gl_SubgroupSize; i++)\n"
+ << " for (uint i = 0; i < sgSize; i++)\n"
<< " {\n"
<< " if (subgroupBallotBitExtract(mask, i))\n"
<< " {\n"
@@ -127,7 +170,7 @@
<< " break;\n"
<< " }\n"
<< " }\n"
- << " tempResult |= (subgroupBroadcastFirst(data1[gl_SubgroupInvocationID]) == data1[firstActive]) ? 0x2 : 0;\n"
+ << " tempResult |= (" << broadcastFirst << "(data1[sgInvocation]) == data1[firstActive]) ? 0x2 : 0;\n"
<< " }\n"
<< " else\n"
<< " {\n"
@@ -138,9 +181,33 @@
return bdy.str();
}
+std::string getHelperFunctionARB(CaseDefinition caseDef)
+{
+ std::ostringstream bdy;
+
+ if (caseDef.extShaderSubGroupBallotTests == DE_FALSE)
+ return "";
+
+ bdy << "bool subgroupBallotBitExtract(uint64_t value, uint index)\n";
+ bdy << "{\n";
+ bdy << " if (index > 63)\n";
+ bdy << " return false;\n";
+ bdy << " uint64_t mask = 1ul << index;\n";
+ bdy << " if (bool((value & mask)) == true)\n";
+ bdy << " return true;\n";
+ bdy << " return false;\n";
+ bdy << "}\n";
+ return bdy.str();
+}
+
void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
{
- const vk::ShaderBuildOptions buildOptions (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ const vk::SpirvVersion spirvVersion = (caseDef.opType == OPTYPE_BROADCAST_NONCONST) ? vk::SPIRV_VERSION_1_5 : vk::SPIRV_VERSION_1_3;
+ const vk::ShaderBuildOptions buildOptions (programCollection.usedVulkanVersion, spirvVersion, 0u);
+ const string extensionHeader = (caseDef.extShaderSubGroupBallotTests ? "#extension GL_ARB_shader_ballot: enable\n"
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ "#extension GL_ARB_gpu_shader_int64: enable\n"
+ : "#extension GL_KHR_shader_subgroup_ballot: enable\n");
subgroups::setFragmentShaderFrameBuffer(programCollection);
@@ -148,12 +215,14 @@
subgroups::setVertexShaderFrameBuffer(programCollection);
std::string bdyStr = getBodySource(caseDef);
+ std::string helperStrARB = getHelperFunctionARB(caseDef);
if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
{
std::ostringstream vertex;
vertex << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
- << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << extensionHeader.c_str()
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(location = 0) in highp vec4 in_position;\n"
<< "layout(location = 0) out float out_color;\n"
<< "layout(set = 0, binding = 0) uniform Buffer1\n"
@@ -161,6 +230,7 @@
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< "\n"
+ << helperStrARB.c_str()
<< "void main (void)\n"
<< "{\n"
<< bdyStr
@@ -176,7 +246,8 @@
std::ostringstream geometry;
geometry << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
- << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << extensionHeader.c_str()
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(points) in;\n"
<< "layout(points, max_vertices = 1) out;\n"
<< "layout(location = 0) out float out_color;\n"
@@ -185,6 +256,7 @@
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" <<subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< "\n"
+ << helperStrARB.c_str()
<< "void main (void)\n"
<< "{\n"
<< bdyStr
@@ -203,7 +275,8 @@
std::ostringstream controlSource;
controlSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
- << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << extensionHeader.c_str()
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(vertices = 2) out;\n"
<< "layout(location = 0) out float out_color[];\n"
<< "layout(set = 0, binding = 0) uniform Buffer2\n"
@@ -211,6 +284,7 @@
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" <<subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< "\n"
+ << helperStrARB.c_str()
<< "void main (void)\n"
<< "{\n"
<< " if (gl_InvocationID == 0)\n"
@@ -231,7 +305,8 @@
{
std::ostringstream evaluationSource;
evaluationSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
- << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << extensionHeader.c_str()
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(isolines, equal_spacing, ccw ) in;\n"
<< "layout(location = 0) out float out_color;\n"
<< "layout(set = 0, binding = 0) uniform Buffer1\n"
@@ -239,6 +314,7 @@
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" <<subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< "\n"
+ << helperStrARB.c_str()
<< "void main (void)\n"
<< "{\n"
<< bdyStr
@@ -258,14 +334,24 @@
void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
{
+ const vk::SpirvVersion spirvVersion = (caseDef.opType == OPTYPE_BROADCAST_NONCONST) ? vk::SPIRV_VERSION_1_5 : vk::SPIRV_VERSION_1_3;
+ const vk::ShaderBuildOptions buildOptions (programCollection.usedVulkanVersion, spirvVersion, 0u);
+
std::string bdyStr = getBodySource(caseDef);
+ std::string helperStrARB = getHelperFunctionARB(caseDef);
+
+ const string extensionHeader = (caseDef.extShaderSubGroupBallotTests ? "#extension GL_ARB_shader_ballot: enable\n"
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ "#extension GL_ARB_gpu_shader_int64: enable\n"
+ : "#extension GL_KHR_shader_subgroup_ballot: enable\n");
if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
{
std::ostringstream src;
src << "#version 450\n"
- << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << extensionHeader.c_str()
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout (local_size_x_id = 0, local_size_y_id = 1, "
"local_size_z_id = 2) in;\n"
<< "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
@@ -277,6 +363,7 @@
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[];\n"
<< "};\n"
<< "\n"
+ << helperStrARB.c_str()
<< "void main (void)\n"
<< "{\n"
<< " uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
@@ -287,14 +374,14 @@
<< " result[offset] = tempResult;\n"
<< "}\n";
- programCollection.glslSources.add("comp")
- << glu::ComputeSource(src.str()) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.glslSources.add("comp") << glu::ComputeSource(src.str()) << buildOptions;
}
else
{
const string vertex =
"#version 450\n"
- "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + extensionHeader
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(set = 0, binding = 0, std430) buffer Buffer1\n"
"{\n"
" uint result[];\n"
@@ -304,6 +391,7 @@
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data1[];\n"
"};\n"
"\n"
+ + helperStrARB +
"void main (void)\n"
"{\n"
+ bdyStr +
@@ -316,7 +404,8 @@
const string tesc =
"#version 450\n"
- "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + extensionHeader
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(vertices=1) out;\n"
"layout(set = 0, binding = 1, std430) buffer Buffer1\n"
"{\n"
@@ -327,6 +416,7 @@
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data1[];\n"
"};\n"
"\n"
+ + helperStrARB +
"void main (void)\n"
"{\n"
+ bdyStr +
@@ -341,7 +431,8 @@
const string tese =
"#version 450\n"
- "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + extensionHeader
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(isolines) in;\n"
"layout(set = 0, binding = 2, std430) buffer Buffer1\n"
"{\n"
@@ -352,6 +443,7 @@
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data1[];\n"
"};\n"
"\n"
+ + helperStrARB +
"void main (void)\n"
"{\n"
+ bdyStr +
@@ -362,7 +454,8 @@
const string geometry =
"#version 450\n"
- "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + extensionHeader
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(${TOPOLOGY}) in;\n"
"layout(points, max_vertices = 1) out;\n"
"layout(set = 0, binding = 3, std430) buffer Buffer1\n"
@@ -374,6 +467,7 @@
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data1[];\n"
"};\n"
"\n"
+ + helperStrARB +
"void main (void)\n"
"{\n"
+ bdyStr +
@@ -385,12 +479,14 @@
const string fragment =
"#version 450\n"
- "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + extensionHeader
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(location = 0) out uint result;\n"
"layout(set = 0, binding = 4, std430) readonly buffer Buffer1\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data1[];\n"
"};\n"
+ + helperStrARB +
"void main (void)\n"
"{\n"
+ bdyStr +
@@ -399,16 +495,11 @@
subgroups::addNoSubgroupShader(programCollection);
- programCollection.glslSources.add("vert")
- << glu::VertexSource(vertex) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(tesc) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
- programCollection.glslSources.add("tese")
- << glu::TessellationEvaluationSource(tese) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
- subgroups::addGeometryShadersFromTemplate(geometry, vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u),
- programCollection.glslSources);
- programCollection.glslSources.add("fragment")
- << glu::FragmentSource(fragment)<< vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.glslSources.add("vert") << glu::VertexSource(vertex) << buildOptions;
+ programCollection.glslSources.add("tesc") << glu::TessellationControlSource(tesc) << buildOptions;
+ programCollection.glslSources.add("tese") << glu::TessellationEvaluationSource(tese) << buildOptions;
+ subgroups::addGeometryShadersFromTemplate(geometry, buildOptions, programCollection.glslSources);
+ programCollection.glslSources.add("fragment") << glu::FragmentSource(fragment)<< buildOptions;
}
}
@@ -422,12 +513,22 @@
TCU_THROW(NotSupportedError, "Device does not support subgroup ballot operations");
}
- if (subgroups::isDoubleFormat(caseDef.format) &&
- !subgroups::isDoubleSupportedForDevice(context))
+ if (!subgroups::isFormatSupportedForDevice(context, caseDef.format))
+ TCU_THROW(NotSupportedError, "Device does not support the specified format in subgroup operations");
+
+ if (caseDef.extShaderSubGroupBallotTests && !context.requireDeviceFunctionality("VK_EXT_shader_subgroup_ballot"))
{
- TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
+ TCU_THROW(NotSupportedError, "Device does not support VK_EXT_shader_subgroup_ballot extension");
}
+ if (caseDef.extShaderSubGroupBallotTests && !subgroups::isInt64SupportedForDevice(context))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support int64 data types");
+ }
+
+ if ((caseDef.opType == OPTYPE_BROADCAST_NONCONST) && !subgroups::isSubgroupBroadcastDynamicIdSupported(context))
+ TCU_THROW(NotSupportedError, "Device does not support SubgroupBroadcastDynamicId");
+
*caseDef.geometryPointSizeSupported = subgroups::isTessellationAndGeometryPointSizeSupported(context);
}
@@ -452,7 +553,7 @@
subgroups::SSBOData inputData[1];
inputData[0].format = caseDef.format;
inputData[0].layout = subgroups::SSBOData::LayoutStd140;
- inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+ inputData[0].numElements = caseDef.extShaderSubGroupBallotTests ? 64u : subgroups::maxSupportedSubgroupSize();
inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
@@ -489,7 +590,7 @@
subgroups::SSBOData inputData[1];
inputData[0].format = caseDef.format;
inputData[0].layout = subgroups::SSBOData::LayoutStd430;
- inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+ inputData[0].numElements = caseDef.extShaderSubGroupBallotTests ? 64u : subgroups::maxSupportedSubgroupSize();
inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT, inputData, 1, checkCompute);
@@ -522,7 +623,7 @@
subgroups::SSBOData inputData;
inputData.format = caseDef.format;
inputData.layout = subgroups::SSBOData::LayoutStd430;
- inputData.numElements = subgroups::maxSupportedSubgroupSize();
+ inputData.numElements = caseDef.extShaderSubGroupBallotTests ? 64u : subgroups::maxSupportedSubgroupSize();
inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
inputData.binding = 4u;
inputData.stages = stages;
@@ -545,6 +646,13 @@
de::MovePtr<tcu::TestCaseGroup> framebufferGroup(new tcu::TestCaseGroup(
testCtx, "framebuffer", "Subgroup ballot broadcast category tests: framebuffer"));
+ de::MovePtr<tcu::TestCaseGroup> graphicGroupARB(new tcu::TestCaseGroup(
+ testCtx, "graphics", "Subgroup ballot broadcast category tests: graphics"));
+ de::MovePtr<tcu::TestCaseGroup> computeGroupARB(new tcu::TestCaseGroup(
+ testCtx, "compute", "Subgroup ballot broadcast category tests: compute"));
+ de::MovePtr<tcu::TestCaseGroup> framebufferGroupARB(new tcu::TestCaseGroup(
+ testCtx, "framebuffer", "Subgroup ballot broadcast category tests: framebuffer"));
+
const VkShaderStageFlags stages[] =
{
VK_SHADER_STAGE_VERTEX_BIT,
@@ -553,53 +661,65 @@
VK_SHADER_STAGE_GEOMETRY_BIT,
};
- const VkFormat formats[] =
- {
- VK_FORMAT_R32_SINT, VK_FORMAT_R32G32_SINT, VK_FORMAT_R32G32B32_SINT,
- VK_FORMAT_R32G32B32A32_SINT, VK_FORMAT_R32_UINT, VK_FORMAT_R32G32_UINT,
- VK_FORMAT_R32G32B32_UINT, VK_FORMAT_R32G32B32A32_UINT,
- VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32G32_SFLOAT,
- VK_FORMAT_R32G32B32_SFLOAT, VK_FORMAT_R32G32B32A32_SFLOAT,
- VK_FORMAT_R64_SFLOAT, VK_FORMAT_R64G64_SFLOAT,
- VK_FORMAT_R64G64B64_SFLOAT, VK_FORMAT_R64G64B64A64_SFLOAT,
- VK_FORMAT_R8_USCALED, VK_FORMAT_R8G8_USCALED,
- VK_FORMAT_R8G8B8_USCALED, VK_FORMAT_R8G8B8A8_USCALED,
- };
+ const std::vector<VkFormat> formats = subgroups::getAllFormats();
- for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
+ for (size_t formatIndex = 0; formatIndex < formats.size(); ++formatIndex)
{
const VkFormat format = formats[formatIndex];
+ // Vector, boolean and double types are not supported by functions defined in VK_EXT_shader_subgroup_ballot.
+ const bool formatTypeIsSupportedARB =
+ format == VK_FORMAT_R32_SINT || format == VK_FORMAT_R32_UINT || format == VK_FORMAT_R32_SFLOAT;
for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
{
- const std::string op = de::toLower(getOpTypeName(opTypeIndex));
- const std::string name = op + "_" + subgroups::getFormatNameForGLSL(format);
+ const std::string name = getOpTypeCaseName(opTypeIndex) + "_" + subgroups::getFormatNameForGLSL(format);
{
- CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_COMPUTE_BIT, format, de::SharedPtr<bool>(new bool)};
+ CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_COMPUTE_BIT, format, de::SharedPtr<bool>(new bool), DE_FALSE};
addFunctionCaseWithPrograms(computeGroup.get(), name, "", supportedCheck, initPrograms, test, caseDef);
+ caseDef.extShaderSubGroupBallotTests = DE_TRUE;
+ if (formatTypeIsSupportedARB)
+ addFunctionCaseWithPrograms(computeGroupARB.get(), name, "", supportedCheck, initPrograms, test, caseDef);
+
}
{
- const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_ALL_GRAPHICS, format, de::SharedPtr<bool>(new bool)};
+ CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_ALL_GRAPHICS, format, de::SharedPtr<bool>(new bool), DE_FALSE};
addFunctionCaseWithPrograms(graphicGroup.get(), name, "", supportedCheck, initPrograms, test, caseDef);
+ caseDef.extShaderSubGroupBallotTests = DE_TRUE;
+ if (formatTypeIsSupportedARB)
+ addFunctionCaseWithPrograms(graphicGroupARB.get(), name, "", supportedCheck, initPrograms, test, caseDef);
+
}
for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
{
- const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex], format, de::SharedPtr<bool>(new bool)};
+ CaseDefinition caseDef = {opTypeIndex, stages[stageIndex], format, de::SharedPtr<bool>(new bool), DE_FALSE};
addFunctionCaseWithPrograms(framebufferGroup.get(), name + getShaderStageName(caseDef.shaderStage), "",
supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
+ caseDef.extShaderSubGroupBallotTests = DE_TRUE;
+ if (formatTypeIsSupportedARB)
+ addFunctionCaseWithPrograms(framebufferGroupARB.get(), name + getShaderStageName(caseDef.shaderStage), "",
+ supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
}
}
}
+ de::MovePtr<tcu::TestCaseGroup> groupARB(new tcu::TestCaseGroup(
+ testCtx, "ext_shader_subgroup_ballot", "VK_EXT_shader_subgroup_ballot category tests"));
+
+ groupARB->addChild(graphicGroupARB.release());
+ groupARB->addChild(computeGroupARB.release());
+ groupARB->addChild(framebufferGroupARB.release());
+
de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
testCtx, "ballot_broadcast", "Subgroup ballot broadcast category tests"));
group->addChild(graphicGroup.release());
group->addChild(computeGroup.release());
group->addChild(framebufferGroup.release());
+ group->addChild(groupARB.release());
+
return group.release();
}
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotMasksTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotMasksTests.cpp
new file mode 100755
index 0000000..9894e76
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotMasksTests.cpp
@@ -0,0 +1,532 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2019 The Khronos Group Inc.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "vktSubgroupsBallotMasksTests.hpp"
+#include "vktSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+
+using namespace tcu;
+using namespace std;
+using namespace vk;
+using namespace vkt;
+
+namespace
+{
+
+enum MaskType
+{
+ MASKTYPE_EQ = 0,
+ MASKTYPE_GE,
+ MASKTYPE_GT,
+ MASKTYPE_LE,
+ MASKTYPE_LT,
+ MASKTYPE_LAST
+};
+
+static bool checkVertexPipelineStages(std::vector<const void*> datas,
+ deUint32 width, deUint32)
+{
+ return vkt::subgroups::check(datas, width, 0xf);
+}
+
+static bool checkCompute(std::vector<const void*> datas,
+ const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+ deUint32)
+{
+ return vkt::subgroups::checkCompute(datas, numWorkgroups, localSize, 0xf);
+}
+
+std::string getMaskTypeName(int maskType)
+{
+ switch (maskType)
+ {
+ default:
+ DE_FATAL("Unsupported mask type");
+ return "";
+ case MASKTYPE_EQ:
+ return "gl_SubGroupEqMaskARB";
+ case MASKTYPE_GE:
+ return "gl_SubGroupGeMaskARB";
+ case MASKTYPE_GT:
+ return "gl_SubGroupGtMaskARB";
+ case MASKTYPE_LE:
+ return "gl_SubGroupLeMaskARB";
+ case MASKTYPE_LT:
+ return "gl_SubGroupLtMaskARB";
+ }
+}
+
+
+struct CaseDefinition
+{
+ int maskType;
+ VkShaderStageFlags shaderStage;
+ de::SharedPtr<bool> geometryPointSizeSupported;
+};
+
+std::string getBodySource(CaseDefinition caseDef)
+{
+ std::ostringstream bdy;
+
+ bdy << "uint64_t value = " << getMaskTypeName(caseDef.maskType) << ";\n";
+ bdy << "bool temp = true;\n";
+
+ switch(caseDef.maskType)
+ {
+ case MASKTYPE_EQ:
+ bdy << "uint64_t mask = uint64_t(1) << gl_SubGroupInvocationARB;\n";
+ bdy << "temp = (value & mask) != 0;\n";
+ break;
+ case MASKTYPE_GE:
+ bdy << "for (uint i = 0; i < gl_SubGroupSizeARB; i++) {\n";
+ bdy << " uint64_t mask = uint64_t(1) << i;\n";
+ bdy << " if (i >= gl_SubGroupInvocationARB && (value & mask) == 0)\n";
+ bdy << " temp = false;\n";
+ bdy << " if (i < gl_SubGroupInvocationARB && (value & mask) != 0)\n";
+ bdy << " temp = false;\n";
+ bdy << "};\n";
+ break;
+ case MASKTYPE_GT:
+ bdy << "for (uint i = 0; i < gl_SubGroupSizeARB; i++) {\n";
+ bdy << " uint64_t mask = uint64_t(1) << i;\n";
+ bdy << " if (i > gl_SubGroupInvocationARB && (value & mask) == 0)\n";
+ bdy << " temp = false;\n";
+ bdy << " if (i <= gl_SubGroupInvocationARB && (value & mask) != 0)\n";
+ bdy << " temp = false;\n";
+ bdy << "};\n";
+ break;
+ case MASKTYPE_LE:
+ bdy << "for (uint i = 0; i < gl_SubGroupSizeARB; i++) {\n";
+ bdy << " uint64_t mask = uint64_t(1) << i;\n";
+ bdy << " if (i <= gl_SubGroupInvocationARB && (value & mask) == 0)\n";
+ bdy << " temp = false;\n";
+ bdy << " if (i > gl_SubGroupInvocationARB && (value & mask) != 0)\n";
+ bdy << " temp = false;\n";
+ bdy << "};\n";
+ break;
+ case MASKTYPE_LT:
+ bdy << "for (uint i = 0; i < gl_SubGroupSizeARB; i++) {\n";
+ bdy << " uint64_t mask = uint64_t(1) << i;\n";
+ bdy << " if (i < gl_SubGroupInvocationARB && (value & mask) == 0)\n";
+ bdy << " temp = false;\n";
+ bdy << " if (i >= gl_SubGroupInvocationARB && (value & mask) != 0)\n";
+ bdy << " temp = false;\n";
+ bdy << "};\n";
+ break;
+ }
+
+ bdy << "uint tempResult = temp ? 0xf : 0x2;\n";
+ return bdy.str();
+}
+
+void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ const vk::ShaderBuildOptions buildOptions (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+
+ subgroups::setFragmentShaderFrameBuffer(programCollection);
+
+ if (VK_SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ subgroups::setVertexShaderFrameBuffer(programCollection);
+
+ std::string bdyStr = getBodySource(caseDef);
+
+ if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream vertex;
+ vertex << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+ << "#extension GL_ARB_shader_ballot: enable\n"
+ "#extension GL_ARB_gpu_shader_int64: enable\n"
+ << "layout(location = 0) in highp vec4 in_position;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << bdyStr
+ << " out_color = float(tempResult);\n"
+ << " gl_Position = in_position;\n"
+ << " gl_PointSize = 1.0f;\n"
+ << "}\n";
+ programCollection.glslSources.add("vert")
+ << glu::VertexSource(vertex.str()) << buildOptions;
+ }
+ else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream geometry;
+
+ geometry << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+ << "#extension GL_ARB_shader_ballot: enable\n"
+ "#extension GL_ARB_gpu_shader_int64: enable\n"
+ << "layout(points) in;\n"
+ << "layout(points, max_vertices = 1) out;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "void main (void)\n"
+ << "{\n"
+ << bdyStr
+ << " out_color = float(tempResult);\n"
+ << " gl_Position = gl_in[0].gl_Position;\n"
+ << (*caseDef.geometryPointSizeSupported ? " gl_PointSize = gl_in[0].gl_PointSize;\n" : "")
+ << " EmitVertex();\n"
+ << " EndPrimitive();\n"
+ << "}\n";
+
+ programCollection.glslSources.add("geometry")
+ << glu::GeometrySource(geometry.str()) << buildOptions;
+ }
+ else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream controlSource;
+
+ controlSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+ << "#extension GL_ARB_shader_ballot: enable\n"
+ "#extension GL_ARB_gpu_shader_int64: enable\n"
+ << "layout(vertices = 2) out;\n"
+ << "layout(location = 0) out float out_color[];\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " if (gl_InvocationID == 0)\n"
+ << " {\n"
+ << " gl_TessLevelOuter[0] = 1.0f;\n"
+ << " gl_TessLevelOuter[1] = 1.0f;\n"
+ << " }\n"
+ << bdyStr
+ << " out_color[gl_InvocationID ] = float(tempResult);\n"
+ << " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ << "}\n";
+
+ programCollection.glslSources.add("tesc")
+ << glu::TessellationControlSource(controlSource.str()) << buildOptions;
+ subgroups::setTesEvalShaderFrameBuffer(programCollection);
+ }
+ else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream evaluationSource;
+ evaluationSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+ << "#extension GL_ARB_shader_ballot: enable\n"
+ "#extension GL_ARB_gpu_shader_int64: enable\n"
+ << "layout(isolines, equal_spacing, ccw ) in;\n"
+ << "layout(location = 0) out float out_color;\n"
+ << "void main (void)\n"
+ << "{\n"
+ << bdyStr
+ << " out_color = float(tempResult);\n"
+ << " gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
+ << "}\n";
+
+ subgroups::setTesCtrlShaderFrameBuffer(programCollection);
+ programCollection.glslSources.add("tese")
+ << glu::TessellationEvaluationSource(evaluationSource.str()) << buildOptions;
+ }
+ else
+ {
+ DE_FATAL("Unsupported shader stage");
+ }
+}
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+ std::string bdyStr = getBodySource(caseDef);
+
+ if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ std::ostringstream src;
+
+ src << "#version 450\n"
+ << "#extension GL_ARB_shader_ballot: enable\n"
+ << "#extension GL_ARB_gpu_shader_int64: enable\n"
+ << "layout (local_size_x_id = 0, local_size_y_id = 1, "
+ "local_size_z_id = 2) in;\n"
+ << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+ << "{\n"
+ << " uint result[];\n"
+ << "};\n"
+ << "\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+ << " highp uint offset = globalSize.x * ((globalSize.y * "
+ "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+ "gl_GlobalInvocationID.x;\n"
+ << bdyStr
+ << " result[offset] = tempResult;\n"
+ << "}\n";
+
+ programCollection.glslSources.add("comp")
+ << glu::ComputeSource(src.str()) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ }
+ else
+ {
+ const string vertex =
+ "#version 450\n"
+ "#extension GL_ARB_shader_ballot: enable\n"
+ "#extension GL_ARB_gpu_shader_int64: enable\n"
+ "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+ "{\n"
+ " uint result[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdyStr +
+ " result[gl_VertexIndex] = tempResult;\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " float pixelPosition = pixelSize/2.0f - 1.0f;\n"
+ " gl_Position = vec4(float(gl_VertexIndex) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_PointSize = 1.0f;\n"
+ "}\n";
+
+ const string tesc =
+ "#version 450\n"
+ "#extension GL_ARB_shader_ballot: enable\n"
+ "#extension GL_ARB_gpu_shader_int64: enable\n"
+ "layout(vertices=1) out;\n"
+ "layout(set = 0, binding = 1, std430) buffer Buffer1\n"
+ "{\n"
+ " uint result[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdyStr +
+ " result[gl_PrimitiveID] = tempResult;\n"
+ " if (gl_InvocationID == 0)\n"
+ " {\n"
+ " gl_TessLevelOuter[0] = 1.0f;\n"
+ " gl_TessLevelOuter[1] = 1.0f;\n"
+ " }\n"
+ " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ "}\n";
+
+ const string tese =
+ "#version 450\n"
+ "#extension GL_ARB_shader_ballot: enable\n"
+ "#extension GL_ARB_gpu_shader_int64: enable\n"
+ "layout(isolines) in;\n"
+ "layout(set = 0, binding = 2, std430) buffer Buffer1\n"
+ "{\n"
+ " uint result[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdyStr +
+ " result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempResult;\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
+ "}\n";
+
+ const string geometry =
+ "#version 450\n"
+ "#extension GL_ARB_shader_ballot: enable\n"
+ "#extension GL_ARB_gpu_shader_int64: enable\n"
+ "layout(${TOPOLOGY}) in;\n"
+ "layout(points, max_vertices = 1) out;\n"
+ "layout(set = 0, binding = 3, std430) buffer Buffer1\n"
+ "{\n"
+ " uint result[];\n"
+ "};\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdyStr +
+ " result[gl_PrimitiveIDIn] = tempResult;\n"
+ " gl_Position = gl_in[0].gl_Position;\n"
+ " EmitVertex();\n"
+ " EndPrimitive();\n"
+ "}\n";
+
+ const string fragment =
+ "#version 450\n"
+ "#extension GL_ARB_shader_ballot: enable\n"
+ "#extension GL_ARB_gpu_shader_int64: enable\n"
+ "layout(location = 0) out uint result;\n"
+ "void main (void)\n"
+ "{\n"
+ + bdyStr +
+ " result = tempResult;\n"
+ "}\n";
+
+ subgroups::addNoSubgroupShader(programCollection);
+
+ programCollection.glslSources.add("vert")
+ << glu::VertexSource(vertex) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.glslSources.add("tesc")
+ << glu::TessellationControlSource(tesc) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.glslSources.add("tese")
+ << glu::TessellationEvaluationSource(tese) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ subgroups::addGeometryShadersFromTemplate(geometry, vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u),
+ programCollection.glslSources);
+ programCollection.glslSources.add("fragment")
+ << glu::FragmentSource(fragment)<< vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ }
+}
+
+void supportedCheck (Context& context, CaseDefinition caseDef)
+{
+ DE_UNREF(caseDef);
+ if (!subgroups::isSubgroupSupported(context))
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported");
+
+ if (!context.requireDeviceFunctionality("VK_EXT_shader_subgroup_ballot"))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support VK_EXT_shader_subgroup_ballot extension");
+ }
+
+ if (!subgroups::isInt64SupportedForDevice(context))
+ TCU_THROW(NotSupportedError, "Int64 is not supported");
+
+ *caseDef.geometryPointSizeSupported = subgroups::isTessellationAndGeometryPointSizeSupported(context);
+}
+
+tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
+{
+ if (!subgroups::areSubgroupOperationsSupportedForStage(
+ context, caseDef.shaderStage))
+ {
+ if (subgroups::areSubgroupOperationsRequiredForStage(caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ else
+ {
+ TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+ }
+ }
+
+ if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+ else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ return subgroups::makeGeometryFrameBufferTest(context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+ else if ((VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) & caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+ else
+ TCU_THROW(InternalError, "Unhandled shader stage");
+}
+
+tcu::TestStatus test (Context& context, const CaseDefinition caseDef)
+{
+ if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ {
+ if (!subgroups::areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage))
+ {
+ return tcu::TestStatus::fail(
+ "Shader stage " +
+ subgroups::getShaderStageName(caseDef.shaderStage) +
+ " is required to support subgroup operations!");
+ }
+ return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkCompute);
+ }
+ else
+ {
+ VkPhysicalDeviceSubgroupProperties subgroupProperties;
+ subgroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
+ subgroupProperties.pNext = DE_NULL;
+
+ VkPhysicalDeviceProperties2 properties;
+ properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
+ properties.pNext = &subgroupProperties;
+
+ context.getInstanceInterface().getPhysicalDeviceProperties2(context.getPhysicalDevice(), &properties);
+
+ VkShaderStageFlagBits stages = (VkShaderStageFlagBits)(caseDef.shaderStage & subgroupProperties.supportedStages);
+
+ if ( VK_SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ {
+ if ( (stages & VK_SHADER_STAGE_FRAGMENT_BIT) == 0)
+ TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+ else
+ stages = VK_SHADER_STAGE_FRAGMENT_BIT;
+ }
+
+ if ((VkShaderStageFlagBits)0u == stages)
+ TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
+
+ return subgroups::allStages(context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages, stages);
+ }
+ return tcu::TestStatus::pass("OK");
+}
+}
+
+namespace vkt
+{
+namespace subgroups
+{
+tcu::TestCaseGroup* createSubgroupsBallotMasksTests(tcu::TestContext& testCtx)
+{
+ de::MovePtr<tcu::TestCaseGroup> graphicGroup(new tcu::TestCaseGroup(
+ testCtx, "graphics", "VK_EXT_shader_subgroup_ballot masks category tests: graphics"));
+ de::MovePtr<tcu::TestCaseGroup> computeGroup(new tcu::TestCaseGroup(
+ testCtx, "compute", "VK_EXT_shader_subgroup_ballot masks category tests: compute"));
+ de::MovePtr<tcu::TestCaseGroup> framebufferGroup(new tcu::TestCaseGroup(
+ testCtx, "framebuffer", "VK_EXT_shader_subgroup_ballot masks category tests: framebuffer"));
+
+ const VkShaderStageFlags stages[] =
+ {
+ VK_SHADER_STAGE_VERTEX_BIT,
+ VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
+ VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
+ VK_SHADER_STAGE_GEOMETRY_BIT,
+ };
+ for (int maskTypeIndex = 0; maskTypeIndex < MASKTYPE_LAST; ++maskTypeIndex)
+ {
+ const string mask = de::toLower(getMaskTypeName(maskTypeIndex));
+
+ {
+ const CaseDefinition caseDef = {maskTypeIndex, VK_SHADER_STAGE_COMPUTE_BIT, de::SharedPtr<bool>(new bool)};
+ addFunctionCaseWithPrograms(computeGroup.get(), mask, "", supportedCheck, initPrograms, test, caseDef);
+ }
+
+ {
+ const CaseDefinition caseDef = {maskTypeIndex, VK_SHADER_STAGE_ALL_GRAPHICS, de::SharedPtr<bool>(new bool)};
+ addFunctionCaseWithPrograms(graphicGroup.get(), mask, "", supportedCheck, initPrograms, test, caseDef);
+ }
+
+ for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+ {
+ const CaseDefinition caseDef = {maskTypeIndex, stages[stageIndex], de::SharedPtr<bool>(new bool)};
+ addFunctionCaseWithPrograms(framebufferGroup.get(), mask + "_" + getShaderStageName(caseDef.shaderStage), "", supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
+ }
+ }
+
+ de::MovePtr<tcu::TestCaseGroup> groupARB(new tcu::TestCaseGroup(
+ testCtx, "ext_shader_subgroup_ballot", "VK_EXT_shader_subgroup_ballot masks category tests"));
+
+ de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+ testCtx, "ballot_mask", "VK_EXT_shader_subgroup_ballot mask category tests"));
+
+ groupARB->addChild(graphicGroup.release());
+ groupARB->addChild(computeGroup.release());
+ groupARB->addChild(framebufferGroup.release());
+ group->addChild(groupARB.release());
+
+ return group.release();
+}
+
+} // subgroups
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotMasksTests.hpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotMasksTests.hpp
new file mode 100644
index 0000000..c5a3a1f
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotMasksTests.hpp
@@ -0,0 +1,40 @@
+#ifndef _VKTSUBGROUPSBALLOTMASKSTESTS_HPP
+#define _VKTSUBGROUPSBALLOTMASKSTESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2019 The Khronos Group Inc.
+ * Copyright (c) 2019 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "vktTestCase.hpp"
+
+namespace vkt
+{
+namespace subgroups
+{
+
+tcu::TestCaseGroup* createSubgroupsBallotMasksTests(tcu::TestContext& testCtx);
+
+} // subgroups
+} // vkt
+
+#endif // _VKTSUBGROUPSBALLOTMASKSTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotOtherTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotOtherTests.cpp
index ebb0586..9aaf27d 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotOtherTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotOtherTests.cpp
@@ -580,7 +580,7 @@
for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
{
- const string op = de::toLower(getOpTypeName(opTypeIndex));
+ const string op = de::toLower(getOpTypeName(opTypeIndex));
{
const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_COMPUTE_BIT, de::SharedPtr<bool>(new bool)};
addFunctionCaseWithPrograms(computeGroup.get(), op, "", supportedCheck, initPrograms, test, caseDef);
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotTests.cpp
index 24472fb..32648ab 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotTests.cpp
@@ -53,6 +53,7 @@
{
VkShaderStageFlags shaderStage;
de::SharedPtr<bool> geometryPointSizeSupported;
+ deBool extShaderSubGroupBallotTests;
};
void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
@@ -60,6 +61,8 @@
const vk::SpirVAsmBuildOptions buildOptionsSpr (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3);
std::ostringstream subgroupSizeStr;
subgroupSizeStr << subgroups::maxSupportedSubgroupSize();
+ const string extensionHeader = (caseDef.extShaderSubGroupBallotTests ? "OpExtension \"SPV_KHR_shader_ballot\"\n" : "");
+ const string capabilityBallotHeader = (caseDef.extShaderSubGroupBallotTests ? "OpCapability SubgroupBallotKHR\n" : "OpCapability GroupNonUniformBallot\n");
subgroups::setFragmentShaderFrameBuffer(programCollection);
@@ -97,7 +100,8 @@
"; Schema: 0\n"
"OpCapability Shader\n"
"OpCapability GroupNonUniform\n"
- "OpCapability GroupNonUniformBallot\n"
+ + capabilityBallotHeader
+ + extensionHeader +
"%1 = OpExtInstImport \"GLSL.std.450\"\n"
"OpMemoryModel Logical GLSL450\n"
"OpEntryPoint Vertex %4 \"main\" %35 %62 %70 %72\n"
@@ -160,7 +164,7 @@
"%8 = OpVariable %7 Function\n"
"%28 = OpVariable %27 Function\n"
"OpStore %8 %9\n"
- "%15 = OpGroupNonUniformBallot %10 %14 %13\n"
+ "%15 = " + (caseDef.extShaderSubGroupBallotTests ? "OpSubgroupBallotKHR %10 %13" : "OpGroupNonUniformBallot %10 %14 %13") + "\n"
"%17 = OpIEqual %16 %11 %15\n"
"%18 = OpAll %12 %17\n"
"%19 = OpLogicalNot %12 %18\n"
@@ -175,7 +179,7 @@
"%40 = OpINotEqual %12 %39 %9\n"
"OpStore %28 %40\n"
"%41 = OpLoad %12 %28\n"
- "%42 = OpGroupNonUniformBallot %10 %14 %41\n"
+ "%42 = " + (caseDef.extShaderSubGroupBallotTests ? "OpSubgroupBallotKHR %10 %41" : "OpGroupNonUniformBallot %10 %14 %41") + "\n"
"%43 = OpIEqual %16 %11 %42\n"
"%44 = OpAll %12 %43\n"
"%45 = OpLogicalNot %12 %44\n"
@@ -184,7 +188,7 @@
"%49 = OpLoad %6 %8\n"
"%50 = OpBitwiseOr %6 %49 %48\n"
"OpStore %8 %50\n"
- "%52 = OpGroupNonUniformBallot %10 %14 %51\n"
+ "%52 = " + (caseDef.extShaderSubGroupBallotTests ? "OpSubgroupBallotKHR %10 %51" : "OpGroupNonUniformBallot %10 %14 %51") + "\n"
"%53 = OpIEqual %16 %11 %52\n"
"%54 = OpAll %12 %53\n"
"%56 = OpSelect %20 %54 %55 %22\n"
@@ -240,7 +244,8 @@
<< "OpCapability Geometry\n"
<< (*caseDef.geometryPointSizeSupported ? "OpCapability GeometryPointSize\n" : "")
<< "OpCapability GroupNonUniform\n"
- << "OpCapability GroupNonUniformBallot\n"
+ << capabilityBallotHeader.c_str()
+ << extensionHeader.c_str()
<< "%1 = OpExtInstImport \"GLSL.std.450\"\n"
<< "OpMemoryModel Logical GLSL450\n"
<< "OpEntryPoint Geometry %4 \"main\" %35 %62 %70 %74\n"
@@ -316,7 +321,7 @@
<< "%8 = OpVariable %7 Function\n"
<< "%28 = OpVariable %27 Function\n"
<< "OpStore %8 %9\n"
- << "%15 = OpGroupNonUniformBallot %10 %14 %13\n"
+ << "%15 = " << (caseDef.extShaderSubGroupBallotTests ? "OpSubgroupBallotKHR %10 %13" : "OpGroupNonUniformBallot %10 %14 %13") << "\n"
<< "%17 = OpIEqual %16 %11 %15\n"
<< "%18 = OpAll %12 %17\n"
<< "%19 = OpLogicalNot %12 %18\n"
@@ -331,7 +336,7 @@
<< "%40 = OpINotEqual %12 %39 %9\n"
<< "OpStore %28 %40\n"
<< "%41 = OpLoad %12 %28\n"
- << "%42 = OpGroupNonUniformBallot %10 %14 %41\n"
+ << "%42 = " << (caseDef.extShaderSubGroupBallotTests ? "OpSubgroupBallotKHR %10 %41" : "OpGroupNonUniformBallot %10 %14 %41") << "\n"
<< "%43 = OpIEqual %16 %11 %42\n"
<< "%44 = OpAll %12 %43\n"
<< "%45 = OpLogicalNot %12 %44\n"
@@ -340,7 +345,7 @@
<< "%49 = OpLoad %6 %8\n"
<< "%50 = OpBitwiseOr %6 %49 %48\n"
<< "OpStore %8 %50\n"
- << "%52 = OpGroupNonUniformBallot %10 %14 %51\n"
+ << "%52 = " << (caseDef.extShaderSubGroupBallotTests ? "OpSubgroupBallotKHR %10 %51" : "OpGroupNonUniformBallot %10 %14 %51") << "\n"
<< "%53 = OpIEqual %16 %11 %52\n"
<< "%54 = OpAll %12 %53\n"
<< "%56 = OpSelect %20 %54 %55 %22\n"
@@ -401,7 +406,8 @@
"; Schema: 0\n"
"OpCapability Tessellation\n"
"OpCapability GroupNonUniform\n"
- "OpCapability GroupNonUniformBallot\n"
+ + capabilityBallotHeader
+ + extensionHeader +
"%1 = OpExtInstImport \"GLSL.std.450\"\n"
"OpMemoryModel Logical GLSL450\n"
"OpEntryPoint TessellationControl %4 \"main\" %8 %20 %50 %78 %89 %95\n"
@@ -497,7 +503,7 @@
"OpBranch %14\n"
"%14 = OpLabel\n"
"OpStore %27 %28\n"
- "%33 = OpGroupNonUniformBallot %29 %32 %31\n"
+ "%33 = " + (caseDef.extShaderSubGroupBallotTests ? "OpSubgroupBallotKHR %29 %31" : "OpGroupNonUniformBallot %29 %32 %31") + "\n"
"%35 = OpIEqual %34 %30 %33\n"
"%36 = OpAll %11 %35\n"
"%37 = OpLogicalNot %11 %36\n"
@@ -512,7 +518,7 @@
"%55 = OpINotEqual %11 %54 %28\n"
"OpStore %43 %55\n"
"%56 = OpLoad %11 %43\n"
- "%57 = OpGroupNonUniformBallot %29 %32 %56\n"
+ "%57 = " + (caseDef.extShaderSubGroupBallotTests ? "OpSubgroupBallotKHR %29 %56" : "OpGroupNonUniformBallot %29 %32 %56") + "\n"
"%58 = OpIEqual %34 %30 %57\n"
"%59 = OpAll %11 %58\n"
"%60 = OpLogicalNot %11 %59\n"
@@ -521,7 +527,7 @@
"%64 = OpLoad %16 %27\n"
"%65 = OpBitwiseOr %16 %64 %63\n"
"OpStore %27 %65\n"
- "%67 = OpGroupNonUniformBallot %29 %32 %66\n"
+ "%67 = " + (caseDef.extShaderSubGroupBallotTests ? "OpSubgroupBallotKHR %29 %66" : "OpGroupNonUniformBallot %29 %32 %66") + "\n"
"%68 = OpIEqual %34 %30 %67\n"
"%69 = OpAll %11 %68\n"
"%71 = OpSelect %6 %69 %70 %10\n"
@@ -577,7 +583,8 @@
"; Schema: 0\n"
"OpCapability Tessellation\n"
"OpCapability GroupNonUniform\n"
- "OpCapability GroupNonUniformBallot\n"
+ + capabilityBallotHeader
+ + extensionHeader +
"%1 = OpExtInstImport \"GLSL.std.450\"\n"
"OpMemoryModel Logical GLSL450\n"
"OpEntryPoint TessellationEvaluation %4 \"main\" %35 %62 %70 %75 %83\n"
@@ -655,7 +662,7 @@
"%8 = OpVariable %7 Function\n"
"%28 = OpVariable %27 Function\n"
"OpStore %8 %9\n"
- "%15 = OpGroupNonUniformBallot %10 %14 %13\n"
+ "%15 = " + (caseDef.extShaderSubGroupBallotTests ? "OpSubgroupBallotKHR %10 %13" : "OpGroupNonUniformBallot %10 %14 %13") + "\n"
"%17 = OpIEqual %16 %11 %15\n"
"%18 = OpAll %12 %17\n"
"%19 = OpLogicalNot %12 %18\n"
@@ -670,7 +677,7 @@
"%40 = OpINotEqual %12 %39 %9\n"
"OpStore %28 %40\n"
"%41 = OpLoad %12 %28\n"
- "%42 = OpGroupNonUniformBallot %10 %14 %41\n"
+ "%42 = " + (caseDef.extShaderSubGroupBallotTests ? "OpSubgroupBallotKHR %10 %41" : "OpGroupNonUniformBallot %10 %14 %41") + "\n"
"%43 = OpIEqual %16 %11 %42\n"
"%44 = OpAll %12 %43\n"
"%45 = OpLogicalNot %12 %44\n"
@@ -679,7 +686,7 @@
"%49 = OpLoad %6 %8\n"
"%50 = OpBitwiseOr %6 %49 %48\n"
"OpStore %8 %50\n"
- "%52 = OpGroupNonUniformBallot %10 %14 %51\n"
+ "%52 = " + (caseDef.extShaderSubGroupBallotTests ? "OpSubgroupBallotKHR %10 %51" : "OpGroupNonUniformBallot %10 %14 %51") + "\n"
"%53 = OpIEqual %16 %11 %52\n"
"%54 = OpAll %12 %53\n"
"%56 = OpSelect %20 %54 %55 %22\n"
@@ -714,12 +721,19 @@
void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
{
+ const string extensionHeader = (caseDef.extShaderSubGroupBallotTests ?
+ "#extension GL_ARB_shader_ballot: enable\n"
+ "#extension GL_ARB_gpu_shader_int64: enable\n"
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ :
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n");
+
if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
{
std::ostringstream src;
src << "#version 450\n"
- << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << extensionHeader.c_str()
<< "layout (local_size_x_id = 0, local_size_y_id = 1, "
"local_size_z_id = 2) in;\n"
<< "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
@@ -731,7 +745,7 @@
<< " uint data[];\n"
<< "};\n"
<< "\n"
- << subgroups::getSharedMemoryBallotHelper()
+ << (caseDef.extShaderSubGroupBallotTests ? subgroups::getSharedMemoryBallotHelperARB() : subgroups::getSharedMemoryBallotHelper())
<< "void main (void)\n"
<< "{\n"
<< " uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
@@ -739,10 +753,10 @@
"gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
"gl_GlobalInvocationID.x;\n"
<< " uint tempResult = 0;\n"
- << " tempResult |= sharedMemoryBallot(true) == subgroupBallot(true) ? 0x1 : 0;\n"
+ << " tempResult |= sharedMemoryBallot(true) == " << (caseDef.extShaderSubGroupBallotTests ? "ballotARB" : "subgroupBallot") << "(true) ? 0x1 : 0;\n"
<< " bool bData = data[gl_SubgroupInvocationID] != 0;\n"
- << " tempResult |= sharedMemoryBallot(bData) == subgroupBallot(bData) ? 0x2 : 0;\n"
- << " tempResult |= uvec4(0) == subgroupBallot(false) ? 0x4 : 0;\n"
+ << " tempResult |= sharedMemoryBallot(bData) == " << (caseDef.extShaderSubGroupBallotTests ? "ballotARB" : "subgroupBallot") << "(bData) ? 0x2 : 0;\n"
+ << " tempResult |= " << (caseDef.extShaderSubGroupBallotTests ? "uint64_t(0) == ballotARB" : "uvec4(0) == subgroupBallot") << "(false) ? 0x4 : 0;\n"
<< " result[offset] = tempResult;\n"
<< "}\n";
@@ -751,9 +765,17 @@
}
else
{
+ const string cmpStr = (caseDef.extShaderSubGroupBallotTests ? "uint64_t(0) == ballotARB" : "uvec4(0) == subgroupBallot");
+ const string testSrc =
+ " uint tempResult = 0;\n"
+ " tempResult |= !bool(" + cmpStr + "(true)) ? 0x1 : 0;\n"
+ " bool bData = data[gl_SubgroupInvocationID] != 0;\n"
+ " tempResult |= !bool(" + cmpStr + "(bData)) ? 0x2 : 0;\n"
+ " tempResult |= " + cmpStr + "(false) ? 0x4 : 0;\n";
+
const string vertex =
"#version 450\n"
- "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + extensionHeader +
"layout(set = 0, binding = 0, std430) buffer Buffer1\n"
"{\n"
" uint result[];\n"
@@ -765,11 +787,7 @@
"\n"
"void main (void)\n"
"{\n"
- " uint tempResult = 0;\n"
- " tempResult |= !bool(uvec4(0) == subgroupBallot(true)) ? 0x1 : 0;\n"
- " bool bData = data[gl_SubgroupInvocationID] != 0;\n"
- " tempResult |= !bool(uvec4(0) == subgroupBallot(bData)) ? 0x2 : 0;\n"
- " tempResult |= uvec4(0) == subgroupBallot(false) ? 0x4 : 0;\n"
+ + testSrc +
" result[gl_VertexIndex] = tempResult;\n"
" float pixelSize = 2.0f/1024.0f;\n"
" float pixelPosition = pixelSize/2.0f - 1.0f;\n"
@@ -779,7 +797,7 @@
const string tesc =
"#version 450\n"
- "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + extensionHeader +
"layout(vertices=1) out;\n"
"layout(set = 0, binding = 1, std430) buffer Buffer1\n"
"{\n"
@@ -792,11 +810,7 @@
"\n"
"void main (void)\n"
"{\n"
- " uint tempResult = 0;\n"
- " tempResult |= !bool(uvec4(0) == subgroupBallot(true)) ? 0x1 : 0;\n"
- " bool bData = data[gl_SubgroupInvocationID] != 0;\n"
- " tempResult |= !bool(uvec4(0) == subgroupBallot(bData)) ? 0x2 : 0;\n"
- " tempResult |= uvec4(0) == subgroupBallot(false) ? 0x4 : 0;\n"
+ + testSrc +
" result[gl_PrimitiveID] = tempResult;\n"
" if (gl_InvocationID == 0)\n"
" {\n"
@@ -808,7 +822,7 @@
const string tese =
"#version 450\n"
- "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + extensionHeader +
"layout(isolines) in;\n"
"layout(set = 0, binding = 2, std430) buffer Buffer1\n"
"{\n"
@@ -821,11 +835,7 @@
"\n"
"void main (void)\n"
"{\n"
- " uint tempResult = 0;\n"
- " tempResult |= !bool(uvec4(0) == subgroupBallot(true)) ? 0x1 : 0;\n"
- " bool bData = data[gl_SubgroupInvocationID] != 0;\n"
- " tempResult |= !bool(uvec4(0) == subgroupBallot(bData)) ? 0x2 : 0;\n"
- " tempResult |= uvec4(0) == subgroupBallot(false) ? 0x4 : 0;\n"
+ + testSrc +
" result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempResult;\n"
" float pixelSize = 2.0f/1024.0f;\n"
" gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
@@ -833,7 +843,7 @@
const string geometry =
"#version 450\n"
- "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + extensionHeader +
"layout(${TOPOLOGY}) in;\n"
"layout(points, max_vertices = 1) out;\n"
"layout(set = 0, binding = 3, std430) buffer Buffer1\n"
@@ -847,11 +857,7 @@
"\n"
"void main (void)\n"
"{\n"
- " uint tempResult = 0;\n"
- " tempResult |= !bool(uvec4(0) == subgroupBallot(true)) ? 0x1 : 0;\n"
- " bool bData = data[gl_SubgroupInvocationID] != 0;\n"
- " tempResult |= !bool(uvec4(0) == subgroupBallot(bData)) ? 0x2 : 0;\n"
- " tempResult |= uvec4(0) == subgroupBallot(false) ? 0x4 : 0;\n"
+ + testSrc +
" result[gl_PrimitiveIDIn] = tempResult;\n"
" gl_Position = gl_in[0].gl_Position;\n"
" EmitVertex();\n"
@@ -860,7 +866,7 @@
const string fragment =
"#version 450\n"
- "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + extensionHeader +
"layout(location = 0) out uint result;\n"
"layout(set = 0, binding = 4, std430) readonly buffer Buffer1\n"
"{\n"
@@ -868,11 +874,7 @@
"};\n"
"void main (void)\n"
"{\n"
- " uint tempResult = 0;\n"
- " tempResult |= !bool(uvec4(0) == subgroupBallot(true)) ? 0x1 : 0;\n"
- " bool bData = data[gl_SubgroupInvocationID] != 0;\n"
- " tempResult |= !bool(uvec4(0) == subgroupBallot(bData)) ? 0x2 : 0;\n"
- " tempResult |= uvec4(0) == subgroupBallot(false) ? 0x4 : 0;\n"
+ + testSrc +
" result = tempResult;\n"
"}\n";
@@ -902,6 +904,16 @@
TCU_THROW(NotSupportedError, "Device does not support subgroup ballot operations");
}
+ if (caseDef.extShaderSubGroupBallotTests && !context.requireDeviceFunctionality("VK_EXT_shader_subgroup_ballot"))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support VK_EXT_shader_subgroup_ballot extension");
+ }
+
+ if (caseDef.extShaderSubGroupBallotTests && !subgroups::isInt64SupportedForDevice(context))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support int64 data types");
+ }
+
*caseDef.geometryPointSizeSupported = subgroups::isTessellationAndGeometryPointSizeSupported(context);
}
@@ -1011,6 +1023,13 @@
de::MovePtr<tcu::TestCaseGroup> framebufferGroup(new tcu::TestCaseGroup(
testCtx, "framebuffer", "Subgroup ballot category tests: framebuffer"));
+ de::MovePtr<tcu::TestCaseGroup> graphicGroupEXT(new tcu::TestCaseGroup(
+ testCtx, "graphics", "VK_EXT_shader_subgroups_ballot category tests: graphics"));
+ de::MovePtr<tcu::TestCaseGroup> computeGroupEXT(new tcu::TestCaseGroup(
+ testCtx, "compute", "VK_EXT_shader_subgroups_ballot category tests: compute"));
+ de::MovePtr<tcu::TestCaseGroup> framebufferGroupEXT(new tcu::TestCaseGroup(
+ testCtx, "framebuffer", "VK_EXT_shader_subgroups_ballot category tests: framebuffer"));
+
const VkShaderStageFlags stages[] =
{
VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
@@ -1020,22 +1039,38 @@
};
{
- const CaseDefinition caseDef = {VK_SHADER_STAGE_COMPUTE_BIT, de::SharedPtr<bool>(new bool)};
+ CaseDefinition caseDef = {VK_SHADER_STAGE_COMPUTE_BIT, de::SharedPtr<bool>(new bool), DE_FALSE};
addFunctionCaseWithPrograms(computeGroup.get(), getShaderStageName(caseDef.shaderStage), "", supportedCheck, initPrograms, test, caseDef);
+ caseDef.extShaderSubGroupBallotTests = DE_TRUE;
+ addFunctionCaseWithPrograms(computeGroupEXT.get(), getShaderStageName(caseDef.shaderStage), "", supportedCheck, initPrograms, test, caseDef);
+
}
{
- const CaseDefinition caseDef = {VK_SHADER_STAGE_ALL_GRAPHICS, de::SharedPtr<bool>(new bool)};
+ CaseDefinition caseDef = {VK_SHADER_STAGE_ALL_GRAPHICS, de::SharedPtr<bool>(new bool), DE_FALSE};
addFunctionCaseWithPrograms(graphicGroup.get(), "graphic", "", supportedCheck, initPrograms, test, caseDef);
+ caseDef.extShaderSubGroupBallotTests = DE_TRUE;
+ addFunctionCaseWithPrograms(graphicGroupEXT.get(), "graphic", "", supportedCheck, initPrograms, test, caseDef);
}
for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
{
- const CaseDefinition caseDef = {stages[stageIndex],de::SharedPtr<bool>(new bool)};
+ CaseDefinition caseDef = {stages[stageIndex],de::SharedPtr<bool>(new bool), DE_TRUE};
addFunctionCaseWithPrograms(framebufferGroup.get(), getShaderStageName(caseDef.shaderStage), "",
supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
+ caseDef.extShaderSubGroupBallotTests = DE_TRUE;
+ addFunctionCaseWithPrograms(framebufferGroupEXT.get(), getShaderStageName(caseDef.shaderStage), "",
+ supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
+
}
+ de::MovePtr<tcu::TestCaseGroup> groupEXT(new tcu::TestCaseGroup(
+ testCtx, "ext_shader_subgroup_ballot", "VK_EXT_shader_subgroups_ballot category tests"));
+
+ groupEXT->addChild(graphicGroupEXT.release());
+ groupEXT->addChild(computeGroupEXT.release());
+ groupEXT->addChild(framebufferGroupEXT.release());
+
de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
testCtx, "ballot", "Subgroup ballot category tests"));
@@ -1043,6 +1078,8 @@
group->addChild(computeGroup.release());
group->addChild(framebufferGroup.release());
+ group->addChild(groupEXT.release());
+
return group.release();
}
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBasicTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBasicTests.cpp
index c03dfa5..2b973b2 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBasicTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBasicTests.cpp
@@ -1395,6 +1395,18 @@
}
else
{
+ std::ostringstream testSrc;
+ testSrc << " uint tempRes;\n"
+ << " if (subgroupElect())\n"
+ << " {\n"
+ << " tempRes = " << ELECTED_VALUE << ";\n"
+ << " atomicAdd(numSubgroupsExecuted, 1);\n"
+ << " }\n"
+ << " else\n"
+ << " {\n"
+ << " tempRes = " << UNELECTED_VALUE << ";\n"
+ << " }\n";
+
{
std::ostringstream vertex;
vertex << "#version 450\n"
@@ -1410,15 +1422,8 @@
<< "\n"
<< "void main (void)\n"
<< "{\n"
- << " if (subgroupElect())\n"
- << " {\n"
- << " result[gl_VertexIndex] = " << ELECTED_VALUE << ";\n"
- << " atomicAdd(numSubgroupsExecuted, 1);\n"
- << " }\n"
- << " else\n"
- << " {\n"
- << " result[gl_VertexIndex] = " << UNELECTED_VALUE << ";\n"
- << " }\n"
+ << testSrc.str()
+ << " result[gl_VertexIndex] = tempRes;\n"
<< " float pixelSize = 2.0f/1024.0f;\n"
<< " float pixelPosition = pixelSize/2.0f - 1.0f;\n"
<< " gl_Position = vec4(float(gl_VertexIndex) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
@@ -1444,15 +1449,8 @@
<< "\n"
<< "void main (void)\n"
<< "{\n"
- << " if (subgroupElect())\n"
- << " {\n"
- << " result[gl_PrimitiveID] = " << ELECTED_VALUE << ";\n"
- << " atomicAdd(numSubgroupsExecuted, 1);\n"
- << " }\n"
- << " else\n"
- << " {\n"
- << " result[gl_PrimitiveID] = " << UNELECTED_VALUE << ";\n"
- << " }\n"
+ << testSrc.str()
+ << " result[gl_PrimitiveID] = tempRes;\n"
<< " if (gl_InvocationID == 0)\n"
<< " {\n"
<< " gl_TessLevelOuter[0] = 1.0f;\n"
@@ -1480,15 +1478,8 @@
<< "\n"
<< "void main (void)\n"
<< "{\n"
- << " if (subgroupElect())\n"
- << " {\n"
- << " result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = " << ELECTED_VALUE << ";\n"
- << " atomicAdd(numSubgroupsExecuted, 1);\n"
- << " }\n"
- << " else\n"
- << " {\n"
- << " result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = " << UNELECTED_VALUE << ";\n"
- << " }\n"
+ << testSrc.str()
+ << " result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempRes;\n"
<< " float pixelSize = 2.0f/1024.0f;\n"
<< " gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
<< "}\n";
@@ -1513,15 +1504,8 @@
<< "\n"
<< "void main (void)\n"
<< "{\n"
- << " if (subgroupElect())\n"
- << " {\n"
- << " result[gl_PrimitiveIDIn] = " << ELECTED_VALUE << ";\n"
- << " atomicAdd(numSubgroupsExecuted, 1);\n"
- << " }\n"
- << " else\n"
- << " {\n"
- << " result[gl_PrimitiveIDIn] = " << UNELECTED_VALUE << ";\n"
- << " }\n"
+ << testSrc.str()
+ << " result[gl_PrimitiveIDIn] = tempRes;\n"
<< " gl_Position = gl_in[0].gl_Position;\n"
<< " EmitVertex();\n"
<< " EndPrimitive();\n"
@@ -1542,15 +1526,8 @@
<< "void main (void)\n"
<< "{\n"
<< " if (gl_HelperInvocation) return;\n"
- << " if (subgroupElect())\n"
- << " {\n"
- << " data = " << ELECTED_VALUE << ";\n"
- << " atomicAdd(numSubgroupsExecuted, 1);\n"
- << " }\n"
- << " else\n"
- << " {\n"
- << " data = " << UNELECTED_VALUE << ";\n"
- << " }\n"
+ << testSrc.str()
+ << " data = tempRes;\n"
<< "}\n";
programCollection.glslSources.add("fragment")
<< glu::FragmentSource(fragment.str())<< vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsClusteredTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsClusteredTests.cpp
index b149146..1acbd85 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsClusteredTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsClusteredTests.cpp
@@ -101,9 +101,13 @@
{
default:
return "min(" + lhs + ", " + rhs + ")";
+ case VK_FORMAT_R16_SFLOAT:
case VK_FORMAT_R32_SFLOAT:
case VK_FORMAT_R64_SFLOAT:
return "(isnan(" + lhs + ") ? " + rhs + " : (isnan(" + rhs + ") ? " + lhs + " : min(" + lhs + ", " + rhs + ")))";
+ case VK_FORMAT_R16G16_SFLOAT:
+ case VK_FORMAT_R16G16B16_SFLOAT:
+ case VK_FORMAT_R16G16B16A16_SFLOAT:
case VK_FORMAT_R32G32_SFLOAT:
case VK_FORMAT_R32G32B32_SFLOAT:
case VK_FORMAT_R32G32B32A32_SFLOAT:
@@ -117,9 +121,13 @@
{
default:
return "max(" + lhs + ", " + rhs + ")";
+ case VK_FORMAT_R16_SFLOAT:
case VK_FORMAT_R32_SFLOAT:
case VK_FORMAT_R64_SFLOAT:
return "(isnan(" + lhs + ") ? " + rhs + " : (isnan(" + rhs + ") ? " + lhs + " : max(" + lhs + ", " + rhs + ")))";
+ case VK_FORMAT_R16G16_SFLOAT:
+ case VK_FORMAT_R16G16B16_SFLOAT:
+ case VK_FORMAT_R16G16B16A16_SFLOAT:
case VK_FORMAT_R32G32_SFLOAT:
case VK_FORMAT_R32G32B32_SFLOAT:
case VK_FORMAT_R32G32B32A32_SFLOAT:
@@ -175,43 +183,9 @@
std::string getIdentity(int opType, vk::VkFormat format)
{
- bool isFloat = false;
- bool isInt = false;
- bool isUnsigned = false;
-
- switch (format)
- {
- default:
- DE_FATAL("Unhandled format!");
- break;
- case VK_FORMAT_R32_SINT:
- case VK_FORMAT_R32G32_SINT:
- case VK_FORMAT_R32G32B32_SINT:
- case VK_FORMAT_R32G32B32A32_SINT:
- isInt = true;
- break;
- case VK_FORMAT_R32_UINT:
- case VK_FORMAT_R32G32_UINT:
- case VK_FORMAT_R32G32B32_UINT:
- case VK_FORMAT_R32G32B32A32_UINT:
- isUnsigned = true;
- break;
- case VK_FORMAT_R32_SFLOAT:
- case VK_FORMAT_R32G32_SFLOAT:
- case VK_FORMAT_R32G32B32_SFLOAT:
- case VK_FORMAT_R32G32B32A32_SFLOAT:
- case VK_FORMAT_R64_SFLOAT:
- case VK_FORMAT_R64G64_SFLOAT:
- case VK_FORMAT_R64G64B64_SFLOAT:
- case VK_FORMAT_R64G64B64A64_SFLOAT:
- isFloat = true;
- break;
- case VK_FORMAT_R8_USCALED:
- case VK_FORMAT_R8G8_USCALED:
- case VK_FORMAT_R8G8B8_USCALED:
- case VK_FORMAT_R8G8B8A8_USCALED:
- break; // bool types are not anything
- }
+ const bool isFloat = subgroups::isFormatFloat(format);
+ const bool isInt = subgroups::isFormatSigned(format);
+ const bool isUnsigned = subgroups::isFormatUnsigned(format);
switch (opType)
{
@@ -229,11 +203,42 @@
}
else if (isInt)
{
- return subgroups::getFormatNameForGLSL(format) + "(0x7fffffff)";
+ switch (format)
+ {
+ default:
+ return subgroups::getFormatNameForGLSL(format) + "(0x7fffffff)";
+ case VK_FORMAT_R8_SINT:
+ case VK_FORMAT_R8G8_SINT:
+ case VK_FORMAT_R8G8B8_SINT:
+ case VK_FORMAT_R8G8B8A8_SINT:
+ case VK_FORMAT_R8_UINT:
+ case VK_FORMAT_R8G8_UINT:
+ case VK_FORMAT_R8G8B8_UINT:
+ case VK_FORMAT_R8G8B8A8_UINT:
+ return subgroups::getFormatNameForGLSL(format) + "(0x7f)";
+ case VK_FORMAT_R16_SINT:
+ case VK_FORMAT_R16G16_SINT:
+ case VK_FORMAT_R16G16B16_SINT:
+ case VK_FORMAT_R16G16B16A16_SINT:
+ case VK_FORMAT_R16_UINT:
+ case VK_FORMAT_R16G16_UINT:
+ case VK_FORMAT_R16G16B16_UINT:
+ case VK_FORMAT_R16G16B16A16_UINT:
+ return subgroups::getFormatNameForGLSL(format) + "(0x7fff)";
+ case VK_FORMAT_R64_SINT:
+ case VK_FORMAT_R64G64_SINT:
+ case VK_FORMAT_R64G64B64_SINT:
+ case VK_FORMAT_R64G64B64A64_SINT:
+ case VK_FORMAT_R64_UINT:
+ case VK_FORMAT_R64G64_UINT:
+ case VK_FORMAT_R64G64B64_UINT:
+ case VK_FORMAT_R64G64B64A64_UINT:
+ return subgroups::getFormatNameForGLSL(format) + "(0x7fffffffffffffffUL)";
+ }
}
else if (isUnsigned)
{
- return subgroups::getFormatNameForGLSL(format) + "(0xffffffffu)";
+ return subgroups::getFormatNameForGLSL(format) + "(-1)";
}
else
{
@@ -247,7 +252,38 @@
}
else if (isInt)
{
- return subgroups::getFormatNameForGLSL(format) + "(0x80000000)";
+ switch (format)
+ {
+ default:
+ return subgroups::getFormatNameForGLSL(format) + "(0x80000000)";
+ case VK_FORMAT_R8_SINT:
+ case VK_FORMAT_R8G8_SINT:
+ case VK_FORMAT_R8G8B8_SINT:
+ case VK_FORMAT_R8G8B8A8_SINT:
+ case VK_FORMAT_R8_UINT:
+ case VK_FORMAT_R8G8_UINT:
+ case VK_FORMAT_R8G8B8_UINT:
+ case VK_FORMAT_R8G8B8A8_UINT:
+ return subgroups::getFormatNameForGLSL(format) + "(0x80)";
+ case VK_FORMAT_R16_SINT:
+ case VK_FORMAT_R16G16_SINT:
+ case VK_FORMAT_R16G16B16_SINT:
+ case VK_FORMAT_R16G16B16A16_SINT:
+ case VK_FORMAT_R16_UINT:
+ case VK_FORMAT_R16G16_UINT:
+ case VK_FORMAT_R16G16B16_UINT:
+ case VK_FORMAT_R16G16B16A16_UINT:
+ return subgroups::getFormatNameForGLSL(format) + "(0x8000)";
+ case VK_FORMAT_R64_SINT:
+ case VK_FORMAT_R64G64_SINT:
+ case VK_FORMAT_R64G64B64_SINT:
+ case VK_FORMAT_R64G64B64A64_SINT:
+ case VK_FORMAT_R64_UINT:
+ case VK_FORMAT_R64G64_UINT:
+ case VK_FORMAT_R64G64B64_UINT:
+ case VK_FORMAT_R64G64B64A64_UINT:
+ return subgroups::getFormatNameForGLSL(format) + "(0x8000000000000000UL)";
+ }
}
else if (isUnsigned)
{
@@ -275,9 +311,24 @@
default:
return "all(equal(" + lhs + ", " + rhs + "))";
case VK_FORMAT_R8_USCALED:
+ case VK_FORMAT_R8_UINT:
+ case VK_FORMAT_R8_SINT:
+ case VK_FORMAT_R16_UINT:
+ case VK_FORMAT_R16_SINT:
case VK_FORMAT_R32_UINT:
case VK_FORMAT_R32_SINT:
+ case VK_FORMAT_R64_UINT:
+ case VK_FORMAT_R64_SINT:
return "(" + lhs + " == " + rhs + ")";
+ case VK_FORMAT_R16_SFLOAT:
+ switch (opType)
+ {
+ default:
+ return "(abs(" + lhs + " - " + rhs + ") < 0.1)";
+ case OPTYPE_CLUSTERED_MIN:
+ case OPTYPE_CLUSTERED_MAX:
+ return "(" + lhs + " == " + rhs + ")";
+ }
case VK_FORMAT_R32_SFLOAT:
case VK_FORMAT_R64_SFLOAT:
switch (opType)
@@ -288,6 +339,17 @@
case OPTYPE_CLUSTERED_MAX:
return "(" + lhs + " == " + rhs + ")";
}
+ case VK_FORMAT_R16G16_SFLOAT:
+ case VK_FORMAT_R16G16B16_SFLOAT:
+ case VK_FORMAT_R16G16B16A16_SFLOAT:
+ switch (opType)
+ {
+ default:
+ return "all(lessThan(abs(" + lhs + " - " + rhs + "), " + formatName + "(0.1)))";
+ case OPTYPE_CLUSTERED_MIN:
+ case OPTYPE_CLUSTERED_MAX:
+ return "all(equal(" + lhs + ", " + rhs + "))";
+ }
case VK_FORMAT_R32G32_SFLOAT:
case VK_FORMAT_R32G32B32_SFLOAT:
case VK_FORMAT_R32G32B32A32_SFLOAT:
@@ -368,6 +430,7 @@
vertexSrc << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450 )<< "\n"
<< "#extension GL_KHR_shader_subgroup_clustered: enable\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(location = 0) in highp vec4 in_position;\n"
<< "layout(location = 0) out float out_color;\n"
<< "layout(set = 0, binding = 0) uniform Buffer1\n"
@@ -393,6 +456,7 @@
geometry << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< "#extension GL_KHR_shader_subgroup_clustered: enable\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(points) in;\n"
<< "layout(points, max_vertices = 1) out;\n"
<< "layout(location = 0) out float out_color;\n"
@@ -422,6 +486,7 @@
controlSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< "#extension GL_KHR_shader_subgroup_clustered: enable\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(vertices = 2) out;\n"
<< "layout(location = 0) out float out_color[];\n"
<< "layout(set = 0, binding = 0) uniform Buffer1\n"
@@ -453,6 +518,7 @@
evaluationSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< "#extension GL_KHR_shader_subgroup_clustered: enable\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(isolines, equal_spacing, ccw ) in;\n"
<< "layout(location = 0) out float out_color;\n"
<< "layout(set = 0, binding = 0) uniform Buffer1\n"
@@ -489,6 +555,7 @@
src << "#version 450\n"
<< "#extension GL_KHR_shader_subgroup_clustered: enable\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout (local_size_x_id = 0, local_size_y_id = 1, "
"local_size_z_id = 2) in;\n"
<< "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
@@ -521,6 +588,7 @@
"#version 450\n"
"#extension GL_KHR_shader_subgroup_clustered: enable\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(set = 0, binding = 0, std430) buffer Buffer1\n"
"{\n"
" uint result[];\n"
@@ -550,6 +618,7 @@
"#version 450\n"
"#extension GL_KHR_shader_subgroup_clustered: enable\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(vertices=1) out;\n"
"layout(set = 0, binding = 1, std430) buffer Buffer1\n"
"{\n"
@@ -582,6 +651,7 @@
"#version 450\n"
"#extension GL_KHR_shader_subgroup_clustered: enable\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(isolines) in;\n"
"layout(set = 0, binding = 2, std430) buffer Buffer1\n"
"{\n"
@@ -609,6 +679,7 @@
"#version 450\n"
"#extension GL_KHR_shader_subgroup_clustered: enable\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(${TOPOLOGY}) in;\n"
"layout(points, max_vertices = 1) out;\n"
"layout(set = 0, binding = 3, std430) buffer Buffer1\n"
@@ -637,6 +708,7 @@
"#version 450\n"
"#extension GL_KHR_shader_subgroup_clustered: enable\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(location = 0) out uint result;\n"
"layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
"{\n"
@@ -664,11 +736,8 @@
if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_CLUSTERED_BIT))
TCU_THROW(NotSupportedError, "Device does not support subgroup clustered operations");
- if (subgroups::isDoubleFormat(caseDef.format) &&
- !subgroups::isDoubleSupportedForDevice(context))
- {
- TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
- }
+ if (!subgroups::isFormatSupportedForDevice(context, caseDef.format))
+ TCU_THROW(NotSupportedError, "Device does not support the specified format in subgroup operations");
*caseDef.geometryPointSizeSupported = subgroups::isTessellationAndGeometryPointSizeSupported(context);
}
@@ -788,20 +857,9 @@
VK_SHADER_STAGE_GEOMETRY_BIT
};
- const VkFormat formats[] =
- {
- VK_FORMAT_R32_SINT, VK_FORMAT_R32G32_SINT, VK_FORMAT_R32G32B32_SINT,
- VK_FORMAT_R32G32B32A32_SINT, VK_FORMAT_R32_UINT, VK_FORMAT_R32G32_UINT,
- VK_FORMAT_R32G32B32_UINT, VK_FORMAT_R32G32B32A32_UINT,
- VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32G32_SFLOAT,
- VK_FORMAT_R32G32B32_SFLOAT, VK_FORMAT_R32G32B32A32_SFLOAT,
- VK_FORMAT_R64_SFLOAT, VK_FORMAT_R64G64_SFLOAT,
- VK_FORMAT_R64G64B64_SFLOAT, VK_FORMAT_R64G64B64A64_SFLOAT,
- VK_FORMAT_R8_USCALED, VK_FORMAT_R8G8_USCALED,
- VK_FORMAT_R8G8B8_USCALED, VK_FORMAT_R8G8B8A8_USCALED,
- };
+ const std::vector<VkFormat> formats = subgroups::getAllFormats();
- for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
+ for (size_t formatIndex = 0; formatIndex < formats.size(); ++formatIndex)
{
const VkFormat format = formats[formatIndex];
@@ -814,6 +872,10 @@
{
default:
break;
+ case VK_FORMAT_R16_SFLOAT:
+ case VK_FORMAT_R16G16_SFLOAT:
+ case VK_FORMAT_R16G16B16_SFLOAT:
+ case VK_FORMAT_R16G16B16A16_SFLOAT:
case VK_FORMAT_R32_SFLOAT:
case VK_FORMAT_R32G32_SFLOAT:
case VK_FORMAT_R32G32B32_SFLOAT:
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsPartitionedTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsPartitionedTests.cpp
index e467cdd..b76c091 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsPartitionedTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsPartitionedTests.cpp
@@ -240,43 +240,9 @@
std::string getIdentity(int opType, vk::VkFormat format)
{
- bool isFloat = false;
- bool isInt = false;
- bool isUnsigned = false;
-
- switch (format)
- {
- default:
- DE_FATAL("Unhandled format!");
- return "";
- case VK_FORMAT_R32_SINT:
- case VK_FORMAT_R32G32_SINT:
- case VK_FORMAT_R32G32B32_SINT:
- case VK_FORMAT_R32G32B32A32_SINT:
- isInt = true;
- break;
- case VK_FORMAT_R32_UINT:
- case VK_FORMAT_R32G32_UINT:
- case VK_FORMAT_R32G32B32_UINT:
- case VK_FORMAT_R32G32B32A32_UINT:
- isUnsigned = true;
- break;
- case VK_FORMAT_R32_SFLOAT:
- case VK_FORMAT_R32G32_SFLOAT:
- case VK_FORMAT_R32G32B32_SFLOAT:
- case VK_FORMAT_R32G32B32A32_SFLOAT:
- case VK_FORMAT_R64_SFLOAT:
- case VK_FORMAT_R64G64_SFLOAT:
- case VK_FORMAT_R64G64B64_SFLOAT:
- case VK_FORMAT_R64G64B64A64_SFLOAT:
- isFloat = true;
- break;
- case VK_FORMAT_R8_USCALED:
- case VK_FORMAT_R8G8_USCALED:
- case VK_FORMAT_R8G8B8_USCALED:
- case VK_FORMAT_R8G8B8A8_USCALED:
- break; // bool types are not anything
- }
+ const bool isFloat = subgroups::isFormatFloat(format);
+ const bool isInt = subgroups::isFormatSigned(format);
+ const bool isUnsigned = subgroups::isFormatUnsigned(format);
switch (opType)
{
@@ -300,11 +266,42 @@
}
else if (isInt)
{
- return subgroups::getFormatNameForGLSL(format) + "(0x7fffffff)";
+ switch (format)
+ {
+ default:
+ return subgroups::getFormatNameForGLSL(format) + "(0x7fffffff)";
+ case VK_FORMAT_R8_SINT:
+ case VK_FORMAT_R8G8_SINT:
+ case VK_FORMAT_R8G8B8_SINT:
+ case VK_FORMAT_R8G8B8A8_SINT:
+ case VK_FORMAT_R8_UINT:
+ case VK_FORMAT_R8G8_UINT:
+ case VK_FORMAT_R8G8B8_UINT:
+ case VK_FORMAT_R8G8B8A8_UINT:
+ return subgroups::getFormatNameForGLSL(format) + "(0x7f)";
+ case VK_FORMAT_R16_SINT:
+ case VK_FORMAT_R16G16_SINT:
+ case VK_FORMAT_R16G16B16_SINT:
+ case VK_FORMAT_R16G16B16A16_SINT:
+ case VK_FORMAT_R16_UINT:
+ case VK_FORMAT_R16G16_UINT:
+ case VK_FORMAT_R16G16B16_UINT:
+ case VK_FORMAT_R16G16B16A16_UINT:
+ return subgroups::getFormatNameForGLSL(format) + "(0x7fff)";
+ case VK_FORMAT_R64_SINT:
+ case VK_FORMAT_R64G64_SINT:
+ case VK_FORMAT_R64G64B64_SINT:
+ case VK_FORMAT_R64G64B64A64_SINT:
+ case VK_FORMAT_R64_UINT:
+ case VK_FORMAT_R64G64_UINT:
+ case VK_FORMAT_R64G64B64_UINT:
+ case VK_FORMAT_R64G64B64A64_UINT:
+ return subgroups::getFormatNameForGLSL(format) + "(0x7fffffffffffffffUL)";
+ }
}
else if (isUnsigned)
{
- return subgroups::getFormatNameForGLSL(format) + "(0xffffffffu)";
+ return subgroups::getFormatNameForGLSL(format) + "(-1)";
}
else
{
@@ -320,7 +317,38 @@
}
else if (isInt)
{
- return subgroups::getFormatNameForGLSL(format) + "(0x80000000)";
+ switch (format)
+ {
+ default:
+ return subgroups::getFormatNameForGLSL(format) + "(0x80000000)";
+ case VK_FORMAT_R8_SINT:
+ case VK_FORMAT_R8G8_SINT:
+ case VK_FORMAT_R8G8B8_SINT:
+ case VK_FORMAT_R8G8B8A8_SINT:
+ case VK_FORMAT_R8_UINT:
+ case VK_FORMAT_R8G8_UINT:
+ case VK_FORMAT_R8G8B8_UINT:
+ case VK_FORMAT_R8G8B8A8_UINT:
+ return subgroups::getFormatNameForGLSL(format) + "(0x80)";
+ case VK_FORMAT_R16_SINT:
+ case VK_FORMAT_R16G16_SINT:
+ case VK_FORMAT_R16G16B16_SINT:
+ case VK_FORMAT_R16G16B16A16_SINT:
+ case VK_FORMAT_R16_UINT:
+ case VK_FORMAT_R16G16_UINT:
+ case VK_FORMAT_R16G16B16_UINT:
+ case VK_FORMAT_R16G16B16A16_UINT:
+ return subgroups::getFormatNameForGLSL(format) + "(0x8000)";
+ case VK_FORMAT_R64_SINT:
+ case VK_FORMAT_R64G64_SINT:
+ case VK_FORMAT_R64G64B64_SINT:
+ case VK_FORMAT_R64G64B64A64_SINT:
+ case VK_FORMAT_R64_UINT:
+ case VK_FORMAT_R64G64_UINT:
+ case VK_FORMAT_R64G64B64_UINT:
+ case VK_FORMAT_R64G64B64A64_UINT:
+ return subgroups::getFormatNameForGLSL(format) + "(0x8000000000000000UL)";
+ }
}
else if (isUnsigned)
{
@@ -354,9 +382,28 @@
default:
return "all(equal(" + lhs + ", " + rhs + "))";
case VK_FORMAT_R8_USCALED:
+ case VK_FORMAT_R8_UINT:
+ case VK_FORMAT_R8_SINT:
+ case VK_FORMAT_R16_UINT:
+ case VK_FORMAT_R16_SINT:
case VK_FORMAT_R32_UINT:
case VK_FORMAT_R32_SINT:
+ case VK_FORMAT_R64_UINT:
+ case VK_FORMAT_R64_SINT:
return "(" + lhs + " == " + rhs + ")";
+ case VK_FORMAT_R16_SFLOAT:
+ switch (opType)
+ {
+ default:
+ return "(abs(" + lhs + " - " + rhs + ") < 0.1)";
+ case OPTYPE_MIN:
+ case OPTYPE_INCLUSIVE_MIN:
+ case OPTYPE_EXCLUSIVE_MIN:
+ case OPTYPE_MAX:
+ case OPTYPE_INCLUSIVE_MAX:
+ case OPTYPE_EXCLUSIVE_MAX:
+ return "(" + lhs + " == " + rhs + ")";
+ }
case VK_FORMAT_R32_SFLOAT:
case VK_FORMAT_R64_SFLOAT:
switch (opType)
@@ -371,6 +418,21 @@
case OPTYPE_EXCLUSIVE_MAX:
return "(" + lhs + " == " + rhs + ")";
}
+ case VK_FORMAT_R16G16_SFLOAT:
+ case VK_FORMAT_R16G16B16_SFLOAT:
+ case VK_FORMAT_R16G16B16A16_SFLOAT:
+ switch (opType)
+ {
+ default:
+ return "all(lessThan(abs(" + lhs + " - " + rhs + "), " + formatName + "(0.1)))";
+ case OPTYPE_MIN:
+ case OPTYPE_INCLUSIVE_MIN:
+ case OPTYPE_EXCLUSIVE_MIN:
+ case OPTYPE_MAX:
+ case OPTYPE_INCLUSIVE_MAX:
+ case OPTYPE_EXCLUSIVE_MAX:
+ return "all(equal(" + lhs + ", " + rhs + "))";
+ }
case VK_FORMAT_R32G32_SFLOAT:
case VK_FORMAT_R32G32B32_SFLOAT:
case VK_FORMAT_R32G32B32A32_SFLOAT:
@@ -506,6 +568,7 @@
<< "#extension GL_NV_shader_subgroup_partitioned: enable\n"
<< "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(location = 0) in highp vec4 in_position;\n"
<< "layout(location = 0) out float out_color;\n"
<< "layout(set = 0, binding = 0) uniform Buffer1\n"
@@ -532,6 +595,7 @@
<< "#extension GL_NV_shader_subgroup_partitioned: enable\n"
<< "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(points) in;\n"
<< "layout(points, max_vertices = 1) out;\n"
<< "layout(location = 0) out float out_color;\n"
@@ -561,6 +625,7 @@
<< "#extension GL_NV_shader_subgroup_partitioned: enable\n"
<< "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(vertices = 2) out;\n"
<< "layout(location = 0) out float out_color[];\n"
<< "layout(set = 0, binding = 0) uniform Buffer1\n"
@@ -594,6 +659,7 @@
<< "#extension GL_NV_shader_subgroup_partitioned: enable\n"
<< "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(isolines, equal_spacing, ccw ) in;\n"
<< "layout(location = 0) out float out_color;\n"
<< "layout(set = 0, binding = 0) uniform Buffer1\n"
@@ -630,6 +696,7 @@
<< "#extension GL_NV_shader_subgroup_partitioned: enable\n"
<< "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout (local_size_x_id = 0, local_size_y_id = 1, "
"local_size_z_id = 2) in;\n"
<< "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
@@ -663,6 +730,7 @@
"#extension GL_NV_shader_subgroup_partitioned: enable\n"
"#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(set = 0, binding = 0, std430) buffer Buffer1\n"
"{\n"
" uint result[];\n"
@@ -692,6 +760,7 @@
"#extension GL_NV_shader_subgroup_partitioned: enable\n"
"#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(vertices=1) out;\n"
"layout(set = 0, binding = 1, std430) buffer Buffer1\n"
"{\n"
@@ -724,6 +793,7 @@
"#extension GL_NV_shader_subgroup_partitioned: enable\n"
"#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(isolines) in;\n"
"layout(set = 0, binding = 2, std430) buffer Buffer1\n"
"{\n"
@@ -752,6 +822,7 @@
"#extension GL_NV_shader_subgroup_partitioned: enable\n"
"#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(${TOPOLOGY}) in;\n"
"layout(points, max_vertices = 1) out;\n"
"layout(set = 0, binding = 3, std430) buffer Buffer1\n"
@@ -782,6 +853,7 @@
"#extension GL_NV_shader_subgroup_partitioned: enable\n"
"#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(location = 0) out uint result;\n"
"layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
"{\n"
@@ -810,11 +882,8 @@
TCU_THROW(NotSupportedError, "Device does not support subgroup partitioned operations");
}
- if (subgroups::isDoubleFormat(caseDef.format) &&
- !subgroups::isDoubleSupportedForDevice(context))
- {
- TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
- }
+ if (!subgroups::isFormatSupportedForDevice(context, caseDef.format))
+ TCU_THROW(NotSupportedError, "Device does not support the specified format in subgroup operations");
*caseDef.geometryPointSizeSupported = subgroups::isTessellationAndGeometryPointSizeSupported(context);
}
@@ -938,8 +1007,12 @@
{
tcu::TestCaseGroup* createSubgroupsPartitionedTests(tcu::TestContext& testCtx)
{
- de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
- testCtx, "partitioned", "NV_shader_subgroup_partitioned category tests"));
+ de::MovePtr<tcu::TestCaseGroup> graphicGroup(new tcu::TestCaseGroup(
+ testCtx, "graphics", "Subgroup partitioned category tests: graphics"));
+ de::MovePtr<tcu::TestCaseGroup> computeGroup(new tcu::TestCaseGroup(
+ testCtx, "compute", "Subgroup partitioned category tests: compute"));
+ de::MovePtr<tcu::TestCaseGroup> framebufferGroup(new tcu::TestCaseGroup(
+ testCtx, "framebuffer", "Subgroup partitioned category tests: framebuffer"));
const VkShaderStageFlags stages[] =
{
@@ -949,20 +1022,9 @@
VK_SHADER_STAGE_GEOMETRY_BIT,
};
- const VkFormat formats[] =
- {
- VK_FORMAT_R32_SINT, VK_FORMAT_R32G32_SINT, VK_FORMAT_R32G32B32_SINT,
- VK_FORMAT_R32G32B32A32_SINT, VK_FORMAT_R32_UINT, VK_FORMAT_R32G32_UINT,
- VK_FORMAT_R32G32B32_UINT, VK_FORMAT_R32G32B32A32_UINT,
- VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32G32_SFLOAT,
- VK_FORMAT_R32G32B32_SFLOAT, VK_FORMAT_R32G32B32A32_SFLOAT,
- VK_FORMAT_R64_SFLOAT, VK_FORMAT_R64G64_SFLOAT,
- VK_FORMAT_R64G64B64_SFLOAT, VK_FORMAT_R64G64B64A64_SFLOAT,
- VK_FORMAT_R8_USCALED, VK_FORMAT_R8G8_USCALED,
- VK_FORMAT_R8G8B8_USCALED, VK_FORMAT_R8G8B8A8_USCALED,
- };
+ const std::vector<VkFormat> formats = subgroups::getAllFormats();
- for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
+ for (size_t formatIndex = 0; formatIndex < formats.size(); ++formatIndex)
{
const VkFormat format = formats[formatIndex];
@@ -975,6 +1037,10 @@
{
default:
break;
+ case VK_FORMAT_R16_SFLOAT:
+ case VK_FORMAT_R16G16_SFLOAT:
+ case VK_FORMAT_R16G16B16_SFLOAT:
+ case VK_FORMAT_R16G16B16A16_SFLOAT:
case VK_FORMAT_R32_SFLOAT:
case VK_FORMAT_R32G32_SFLOAT:
case VK_FORMAT_R32G32B32_SFLOAT:
@@ -1027,32 +1093,37 @@
{
const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_COMPUTE_BIT, format, de::SharedPtr<bool>(new bool)};
- addFunctionCaseWithPrograms(group.get(),
+ addFunctionCaseWithPrograms(computeGroup.get(),
de::toLower(op) + "_" +
- subgroups::getFormatNameForGLSL(format) +
- "_" + getShaderStageName(caseDef.shaderStage),
+ subgroups::getFormatNameForGLSL(format),
"", supportedCheck, initPrograms, test, caseDef);
}
{
const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_ALL_GRAPHICS, format, de::SharedPtr<bool>(new bool)};
- addFunctionCaseWithPrograms(group.get(),
+ addFunctionCaseWithPrograms(graphicGroup.get(),
de::toLower(op) + "_" +
- subgroups::getFormatNameForGLSL(format) +
- "_graphic",
+ subgroups::getFormatNameForGLSL(format),
"", supportedCheck, initPrograms, test, caseDef);
}
for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
{
const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex], format, de::SharedPtr<bool>(new bool)};
- addFunctionCaseWithPrograms(group.get(), de::toLower(op) + "_" + subgroups::getFormatNameForGLSL(format) +
- "_" + getShaderStageName(caseDef.shaderStage) + "_framebuffer", "",
+ addFunctionCaseWithPrograms(framebufferGroup.get(), de::toLower(op) + "_" + subgroups::getFormatNameForGLSL(format) +
+ "_" + getShaderStageName(caseDef.shaderStage), "",
supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
}
}
}
+ de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+ testCtx, "partitioned", "Subgroup partitioned category tests"));
+
+ group->addChild(graphicGroup.release());
+ group->addChild(computeGroup.release());
+ group->addChild(framebufferGroup.release());
+
return group.release();
}
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsQuadTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsQuadTests.cpp
index cc9ae69..c27d883 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsQuadTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsQuadTests.cpp
@@ -85,27 +85,66 @@
de::SharedPtr<bool> geometryPointSizeSupported;
};
+std::string GetExtHeader(VkFormat format)
+{
+ return "#extension GL_KHR_shader_subgroup_quad: enable\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n" +
+ subgroups::getAdditionalExtensionForFormat(format);
+}
+
+std::string GetTestSrc(const CaseDefinition &caseDef)
+{
+ const std::string swapTable[OPTYPE_LAST] = {
+ "",
+ " const uint swapTable[4] = {1, 0, 3, 2};\n",
+ " const uint swapTable[4] = {2, 3, 0, 1};\n",
+ " const uint swapTable[4] = {3, 2, 1, 0};\n",
+ };
+
+ std::ostringstream testSrc;
+ testSrc << " uvec4 mask = subgroupBallot(true);\n"
+ << swapTable[caseDef.opType];
+ if (OPTYPE_QUAD_BROADCAST == caseDef.opType)
+ {
+ testSrc << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+ << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID], " << caseDef.direction << ");\n"
+ << " uint otherID = (gl_SubgroupInvocationID & ~0x3) + " << caseDef.direction << ";\n";
+ }
+ else
+ {
+ testSrc << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+ << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID]);\n"
+ << " uint otherID = (gl_SubgroupInvocationID & ~0x3) + swapTable[gl_SubgroupInvocationID & 0x3];\n";
+ }
+ testSrc << " if (subgroupBallotBitExtract(mask, otherID))\n"
+ << " {\n"
+ << " tempRes = (op == data[otherID]) ? 1 : 0;\n"
+ << " }\n"
+ << " else\n"
+ << " {\n"
+ << " tempRes = 1;\n" // Invocation we read from was inactive, so we can't verify results!
+ << " }\n";
+
+ return testSrc.str();
+}
+
void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
{
const vk::ShaderBuildOptions buildOptions (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
- std::string swapTable[OPTYPE_LAST];
subgroups::setFragmentShaderFrameBuffer(programCollection);
if (VK_SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
subgroups::setVertexShaderFrameBuffer(programCollection);
- swapTable[OPTYPE_QUAD_BROADCAST] = "";
- swapTable[OPTYPE_QUAD_SWAP_HORIZONTAL] = " const uint swapTable[4] = {1, 0, 3, 2};\n";
- swapTable[OPTYPE_QUAD_SWAP_VERTICAL] = " const uint swapTable[4] = {2, 3, 0, 1};\n";
- swapTable[OPTYPE_QUAD_SWAP_DIAGONAL] = " const uint swapTable[4] = {3, 2, 1, 0};\n";
+ std::string extHeader = GetExtHeader(caseDef.format);
+ std::string testSrc = GetTestSrc(caseDef);
if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
{
std::ostringstream vertexSrc;
vertexSrc << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
- << "#extension GL_KHR_shader_subgroup_quad: enable\n"
- << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << extHeader.c_str()
<< "layout(location = 0) in highp vec4 in_position;\n"
<< "layout(location = 0) out float result;\n"
<< "layout(set = 0, binding = 0) uniform Buffer1\n"
@@ -115,30 +154,9 @@
<< "\n"
<< "void main (void)\n"
<< "{\n"
- << " uvec4 mask = subgroupBallot(true);\n"
- << swapTable[caseDef.opType];
-
- if (OPTYPE_QUAD_BROADCAST == caseDef.opType)
- {
- vertexSrc << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
- << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID], " << caseDef.direction << ");\n"
- << " uint otherID = (gl_SubgroupInvocationID & ~0x3) + " << caseDef.direction << ";\n";
- }
- else
- {
- vertexSrc << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
- << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID]);\n"
- << " uint otherID = (gl_SubgroupInvocationID & ~0x3) + swapTable[gl_SubgroupInvocationID & 0x3];\n";
- }
-
- vertexSrc << " if (subgroupBallotBitExtract(mask, otherID))\n"
- << " {\n"
- << " result = (op == data[otherID]) ? 1.0f : 0.0f;\n"
- << " }\n"
- << " else\n"
- << " {\n"
- << " result = 1.0f;\n" // Invocation we read from was inactive, so we can't verify results!
- << " }\n"
+ << " uint tempRes;\n"
+ << testSrc
+ << " result = float(tempRes);\n"
<< " gl_Position = in_position;\n"
<< " gl_PointSize = 1.0f;\n"
<< "}\n";
@@ -150,8 +168,7 @@
std::ostringstream geometry;
geometry << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
- << "#extension GL_KHR_shader_subgroup_quad: enable\n"
- << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << extHeader.c_str()
<< "layout(points) in;\n"
<< "layout(points, max_vertices = 1) out;\n"
<< "layout(location = 0) out float out_color;\n"
@@ -163,30 +180,9 @@
<< "\n"
<< "void main (void)\n"
<< "{\n"
- << " uvec4 mask = subgroupBallot(true);\n"
- << swapTable[caseDef.opType];
-
- if (OPTYPE_QUAD_BROADCAST == caseDef.opType)
- {
- geometry << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
- << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID], " << caseDef.direction << ");\n"
- << " uint otherID = (gl_SubgroupInvocationID & ~0x3) + " << caseDef.direction << ";\n";
- }
- else
- {
- geometry << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
- << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID]);\n"
- << " uint otherID = (gl_SubgroupInvocationID & ~0x3) + swapTable[gl_SubgroupInvocationID & 0x3];\n";
- }
-
- geometry << " if (subgroupBallotBitExtract(mask, otherID))\n"
- << " {\n"
- << " out_color = (op == data[otherID]) ? 1.0 : 0.0;\n"
- << " }\n"
- << " else\n"
- << " {\n"
- << " out_color = 1.0;\n" // Invocation we read from was inactive, so we can't verify results!
- << " }\n"
+ << " uint tempRes;\n"
+ << testSrc
+ << " out_color = float(tempRes);\n"
<< " gl_Position = gl_in[0].gl_Position;\n"
<< (*caseDef.geometryPointSizeSupported ? " gl_PointSize = gl_in[0].gl_PointSize;\n" : "")
<< " EmitVertex();\n"
@@ -201,8 +197,7 @@
std::ostringstream controlSource;
controlSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
- << "#extension GL_KHR_shader_subgroup_quad: enable\n"
- << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << extHeader.c_str()
<< "layout(vertices = 2) out;\n"
<< "layout(location = 0) out float out_color[];\n"
<< "layout(set = 0, binding = 0) uniform Buffer1\n"
@@ -217,30 +212,9 @@
<< " gl_TessLevelOuter[0] = 1.0f;\n"
<< " gl_TessLevelOuter[1] = 1.0f;\n"
<< " }\n"
- << " uvec4 mask = subgroupBallot(true);\n"
- << swapTable[caseDef.opType];
-
- if (OPTYPE_QUAD_BROADCAST == caseDef.opType)
- {
- controlSource << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
- << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID], " << caseDef.direction << ");\n"
- << " uint otherID = (gl_SubgroupInvocationID & ~0x3) + " << caseDef.direction << ";\n";
- }
- else
- {
- controlSource << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
- << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID]);\n"
- << " uint otherID = (gl_SubgroupInvocationID & ~0x3) + swapTable[gl_SubgroupInvocationID & 0x3];\n";
- }
-
- controlSource << " if (subgroupBallotBitExtract(mask, otherID))\n"
- << " {\n"
- << " out_color[gl_InvocationID] = (op == data[otherID]) ? 1.0 : 0.0;\n"
- << " }\n"
- << " else\n"
- << " {\n"
- << " out_color[gl_InvocationID] = 1.0; \n"// Invocation we read from was inactive, so we can't verify results!
- << " }\n"
+ << " uint tempRes;\n"
+ << testSrc
+ << " out_color[gl_InvocationID] = float(tempRes);\n"
<< " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
<< "}\n";
@@ -252,8 +226,7 @@
{
ostringstream evaluationSource;
evaluationSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
- << "#extension GL_KHR_shader_subgroup_quad: enable\n"
- << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << extHeader.c_str()
<< "layout(isolines, equal_spacing, ccw ) in;\n"
<< "layout(location = 0) out float out_color;\n"
<< "layout(set = 0, binding = 0) uniform Buffer1\n"
@@ -263,30 +236,9 @@
<< "\n"
<< "void main (void)\n"
<< "{\n"
- << " uvec4 mask = subgroupBallot(true);\n"
- << swapTable[caseDef.opType];
-
- if (OPTYPE_QUAD_BROADCAST == caseDef.opType)
- {
- evaluationSource << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
- << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID], " << caseDef.direction << ");\n"
- << " uint otherID = (gl_SubgroupInvocationID & ~0x3) + " << caseDef.direction << ";\n";
- }
- else
- {
- evaluationSource << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
- << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID]);\n"
- << " uint otherID = (gl_SubgroupInvocationID & ~0x3) + swapTable[gl_SubgroupInvocationID & 0x3];\n";
- }
-
- evaluationSource << " if (subgroupBallotBitExtract(mask, otherID))\n"
- << " {\n"
- << " out_color = (op == data[otherID]) ? 1.0 : 0.0;\n"
- << " }\n"
- << " else\n"
- << " {\n"
- << " out_color = 1.0;\n" // Invocation we read from was inactive, so we can't verify results!
- << " }\n"
+ << " uint tempRes;\n"
+ << testSrc
+ << " out_color = float(tempRes);\n"
<< " gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
<< "}\n";
@@ -302,19 +254,15 @@
void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
{
- std::string swapTable[OPTYPE_LAST];
- swapTable[OPTYPE_QUAD_BROADCAST] = "";
- swapTable[OPTYPE_QUAD_SWAP_HORIZONTAL] = " const uint swapTable[4] = {1, 0, 3, 2};\n";
- swapTable[OPTYPE_QUAD_SWAP_VERTICAL] = " const uint swapTable[4] = {2, 3, 0, 1};\n";
- swapTable[OPTYPE_QUAD_SWAP_DIAGONAL] = " const uint swapTable[4] = {3, 2, 1, 0};\n";
+ std::string extHeader = GetExtHeader(caseDef.format);
+ std::string sourceType = GetTestSrc(caseDef);
if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
{
std::ostringstream src;
src << "#version 450\n"
- << "#extension GL_KHR_shader_subgroup_quad: enable\n"
- << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << extHeader.c_str()
<< "layout (local_size_x_id = 0, local_size_y_id = 1, "
"local_size_z_id = 2) in;\n"
<< "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
@@ -332,31 +280,9 @@
<< " highp uint offset = globalSize.x * ((globalSize.y * "
"gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
"gl_GlobalInvocationID.x;\n"
- << " uvec4 mask = subgroupBallot(true);\n"
- << swapTable[caseDef.opType];
-
-
- if (OPTYPE_QUAD_BROADCAST == caseDef.opType)
- {
- src << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
- << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID], " << caseDef.direction << ");\n"
- << " uint otherID = (gl_SubgroupInvocationID & ~0x3) + " << caseDef.direction << ";\n";
- }
- else
- {
- src << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
- << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID]);\n"
- << " uint otherID = (gl_SubgroupInvocationID & ~0x3) + swapTable[gl_SubgroupInvocationID & 0x3];\n";
- }
-
- src << " if (subgroupBallotBitExtract(mask, otherID))\n"
- << " {\n"
- << " result[offset] = (op == data[otherID]) ? 1 : 0;\n"
- << " }\n"
- << " else\n"
- << " {\n"
- << " result[offset] = 1; // Invocation we read from was inactive, so we can't verify results!\n"
- << " }\n"
+ << " uint tempRes;\n"
+ << sourceType
+ << " result[offset] = tempRes;\n"
<< "}\n";
programCollection.glslSources.add("comp")
@@ -364,26 +290,10 @@
}
else
{
- std::ostringstream src;
- if (OPTYPE_QUAD_BROADCAST == caseDef.opType)
- {
- src << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
- << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID], " << caseDef.direction << ");\n"
- << " uint otherID = (gl_SubgroupInvocationID & ~0x3) + " << caseDef.direction << ";\n";
- }
- else
- {
- src << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
- << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID]);\n"
- << " uint otherID = (gl_SubgroupInvocationID & ~0x3) + swapTable[gl_SubgroupInvocationID & 0x3];\n";
- }
- const string sourceType = src.str();
-
{
const string vertex =
"#version 450\n"
- "#extension GL_KHR_shader_subgroup_quad: enable\n"
- "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + extHeader +
"layout(set = 0, binding = 0, std430) buffer Buffer1\n"
"{\n"
" uint result[];\n"
@@ -395,17 +305,9 @@
"\n"
"void main (void)\n"
"{\n"
- " uvec4 mask = subgroupBallot(true);\n"
- + swapTable[caseDef.opType]
+ " uint tempRes;\n"
+ sourceType +
- " if (subgroupBallotBitExtract(mask, otherID))\n"
- " {\n"
- " result[gl_VertexIndex] = (op == data[otherID]) ? 1 : 0;\n"
- " }\n"
- " else\n"
- " {\n"
- " result[gl_VertexIndex] = 1; // Invocation we read from was inactive, so we can't verify results!\n"
- " }\n"
+ " result[gl_VertexIndex] = tempRes;\n"
" float pixelSize = 2.0f/1024.0f;\n"
" float pixelPosition = pixelSize/2.0f - 1.0f;\n"
" gl_Position = vec4(float(gl_VertexIndex) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
@@ -418,8 +320,7 @@
{
const string tesc =
"#version 450\n"
- "#extension GL_KHR_shader_subgroup_quad: enable\n"
- "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + extHeader +
"layout(vertices=1) out;\n"
"layout(set = 0, binding = 1, std430) buffer Buffer1\n"
"{\n"
@@ -432,17 +333,9 @@
"\n"
"void main (void)\n"
"{\n"
- " uvec4 mask = subgroupBallot(true);\n"
- + swapTable[caseDef.opType]
+ " uint tempRes;\n"
+ sourceType +
- " if (subgroupBallotBitExtract(mask, otherID))\n"
- " {\n"
- " result[gl_PrimitiveID] = (op == data[otherID]) ? 1 : 0;\n"
- " }\n"
- " else\n"
- " {\n"
- " result[gl_PrimitiveID] = 1; // Invocation we read from was inactive, so we can't verify results!\n"
- " }\n"
+ " result[gl_PrimitiveID] = tempRes;\n"
" if (gl_InvocationID == 0)\n"
" {\n"
" gl_TessLevelOuter[0] = 1.0f;\n"
@@ -457,8 +350,7 @@
{
const string tese =
"#version 450\n"
- "#extension GL_KHR_shader_subgroup_quad: enable\n"
- "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + extHeader +
"layout(isolines) in;\n"
"layout(set = 0, binding = 2, std430) buffer Buffer1\n"
"{\n"
@@ -471,17 +363,9 @@
"\n"
"void main (void)\n"
"{\n"
- " uvec4 mask = subgroupBallot(true);\n"
- + swapTable[caseDef.opType]
+ " uint tempRes;\n"
+ sourceType +
- " if (subgroupBallotBitExtract(mask, otherID))\n"
- " {\n"
- " result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = (op == data[otherID]) ? 1 : 0;\n"
- " }\n"
- " else\n"
- " {\n"
- " result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = 1; // Invocation we read from was inactive, so we can't verify results!\n"
- " }\n"
+ " result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempRes;\n"
" float pixelSize = 2.0f/1024.0f;\n"
" gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
"}\n";
@@ -492,8 +376,7 @@
{
const string geometry =
"#version 450\n"
- "#extension GL_KHR_shader_subgroup_quad: enable\n"
- "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + extHeader +
"layout(${TOPOLOGY}) in;\n"
"layout(points, max_vertices = 1) out;\n"
"layout(set = 0, binding = 3, std430) buffer Buffer1\n"
@@ -507,17 +390,9 @@
"\n"
"void main (void)\n"
"{\n"
- " uvec4 mask = subgroupBallot(true);\n"
- + swapTable[caseDef.opType]
+ " uint tempRes;\n"
+ sourceType +
- " if (subgroupBallotBitExtract(mask, otherID))\n"
- " {\n"
- " result[gl_PrimitiveIDIn] = (op == data[otherID]) ? 1 : 0;\n"
- " }\n"
- " else\n"
- " {\n"
- " result[gl_PrimitiveIDIn] = 1; // Invocation we read from was inactive, so we can't verify results!\n"
- " }\n"
+ " result[gl_PrimitiveIDIn] = tempRes;\n"
" gl_Position = gl_in[0].gl_Position;\n"
" EmitVertex();\n"
" EndPrimitive();\n"
@@ -529,8 +404,7 @@
{
const string fragment =
"#version 450\n"
- "#extension GL_KHR_shader_subgroup_quad: enable\n"
- "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ + extHeader +
"layout(location = 0) out uint result;\n"
"layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
"{\n"
@@ -538,17 +412,9 @@
"};\n"
"void main (void)\n"
"{\n"
- " uvec4 mask = subgroupBallot(true);\n"
- + swapTable[caseDef.opType]
+ " uint tempRes;\n"
+ sourceType +
- " if (subgroupBallotBitExtract(mask, otherID))\n"
- " {\n"
- " result = (op == data[otherID]) ? 1 : 0;\n"
- " }\n"
- " else\n"
- " {\n"
- " result = 1; // Invocation we read from was inactive, so we can't verify results!\n"
- " }\n"
+ " result = tempRes;\n"
"}\n";
programCollection.glslSources.add("fragment")
<< glu::FragmentSource(fragment)<< vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
@@ -565,12 +431,8 @@
if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_QUAD_BIT))
TCU_THROW(NotSupportedError, "Device does not support subgroup quad operations");
-
- if (subgroups::isDoubleFormat(caseDef.format) &&
- !subgroups::isDoubleSupportedForDevice(context))
- {
- TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
- }
+ if (!subgroups::isFormatSupportedForDevice(context, caseDef.format))
+ TCU_THROW(NotSupportedError, "Device does not support the specified format in subgroup operations");
*caseDef.geometryPointSizeSupported = subgroups::isTessellationAndGeometryPointSizeSupported(context);
}
@@ -683,19 +545,6 @@
de::MovePtr<tcu::TestCaseGroup> framebufferGroup(new tcu::TestCaseGroup(
testCtx, "framebuffer", "Subgroup arithmetic category tests: framebuffer"));
- const VkFormat formats[] =
- {
- VK_FORMAT_R32_SINT, VK_FORMAT_R32G32_SINT, VK_FORMAT_R32G32B32_SINT,
- VK_FORMAT_R32G32B32A32_SINT, VK_FORMAT_R32_UINT, VK_FORMAT_R32G32_UINT,
- VK_FORMAT_R32G32B32_UINT, VK_FORMAT_R32G32B32A32_UINT,
- VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32G32_SFLOAT,
- VK_FORMAT_R32G32B32_SFLOAT, VK_FORMAT_R32G32B32A32_SFLOAT,
- VK_FORMAT_R64_SFLOAT, VK_FORMAT_R64G64_SFLOAT,
- VK_FORMAT_R64G64B64_SFLOAT, VK_FORMAT_R64G64B64A64_SFLOAT,
- VK_FORMAT_R8_USCALED, VK_FORMAT_R8G8_USCALED,
- VK_FORMAT_R8G8B8_USCALED, VK_FORMAT_R8G8B8A8_USCALED,
- };
-
const VkShaderStageFlags stages[] =
{
VK_SHADER_STAGE_VERTEX_BIT,
@@ -704,9 +553,11 @@
VK_SHADER_STAGE_GEOMETRY_BIT,
};
+ const std::vector<VkFormat> formats = subgroups::getAllFormats();
+
for (int direction = 0; direction < 4; ++direction)
{
- for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
+ for (size_t formatIndex = 0; formatIndex < formats.size(); ++formatIndex)
{
const VkFormat format = formats[formatIndex];
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShapeTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShapeTests.cpp
index 081ae80..537aa8c 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShapeTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShapeTests.cpp
@@ -576,7 +576,6 @@
{
const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_COMPUTE_BIT, de::SharedPtr<bool>(new bool)};
addFunctionCaseWithPrograms(computeGroup.get(), op, "", supportedCheck, initPrograms, test, caseDef);
-
}
{
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShuffleTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShuffleTests.cpp
index da90b84..052744d 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShuffleTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShuffleTests.cpp
@@ -154,6 +154,7 @@
<< "layout(location = 0) out float result;\n"
<< extSource
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(set = 0, binding = 0) uniform Buffer1\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" << subgroups::maxSupportedSubgroupSize() << "];\n"
@@ -180,6 +181,7 @@
geometry << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< extSource
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(points) in;\n"
<< "layout(points, max_vertices = 1) out;\n"
<< "layout(location = 0) out float out_color;\n"
@@ -212,6 +214,7 @@
controlSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< extSource
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(vertices = 2) out;\n"
<< "layout(location = 0) out float out_color[];\n"
<< "layout(set = 0, binding = 0) uniform Buffer1\n"
@@ -246,6 +249,7 @@
evaluationSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< extSource
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(isolines, equal_spacing, ccw ) in;\n"
<< "layout(location = 0) out float out_color;\n"
<< "layout(set = 0, binding = 0) uniform Buffer1\n"
@@ -283,7 +287,7 @@
(OPTYPE_SHUFFLE == caseDef.opType || OPTYPE_SHUFFLE_XOR == caseDef.opType) ?
"#extension GL_KHR_shader_subgroup_shuffle: enable\n" :
"#extension GL_KHR_shader_subgroup_shuffle_relative: enable\n";
- const std::string extSource = vSource + eSource;
+ const std::string extSource = vSource + eSource + subgroups::getAdditionalExtensionForFormat(caseDef.format);
const std::string testSource = TestSource(caseDef);
@@ -451,9 +455,8 @@
break;
}
- if (subgroups::isDoubleFormat(caseDef.format) &&
- !subgroups::isDoubleSupportedForDevice(context))
- TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
+ if (!subgroups::isFormatSupportedForDevice(context, caseDef.format))
+ TCU_THROW(NotSupportedError, "Device does not support the specified format in subgroup operations");
*caseDef.geometryPointSizeSupported = subgroups::isTessellationAndGeometryPointSizeSupported(context);
}
@@ -503,28 +506,6 @@
tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
{
- switch (caseDef.opType)
- {
- case OPTYPE_SHUFFLE:
- case OPTYPE_SHUFFLE_XOR:
- if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_SHUFFLE_BIT))
- {
- TCU_THROW(NotSupportedError, "Device does not support subgroup shuffle operations");
- }
- break;
- default:
- if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT))
- {
- TCU_THROW(NotSupportedError, "Device does not support subgroup shuffle relative operations");
- }
- break;
- }
-
- if (subgroups::isDoubleFormat(caseDef.format) && !subgroups::isDoubleSupportedForDevice(context))
- {
- TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
- }
-
if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
{
if (!subgroups::areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage))
@@ -607,19 +588,6 @@
de::MovePtr<tcu::TestCaseGroup> framebufferGroup(new tcu::TestCaseGroup(
testCtx, "framebuffer", "Subgroup shuffle category tests: framebuffer"));
- const VkFormat formats[] =
- {
- VK_FORMAT_R32_SINT, VK_FORMAT_R32G32_SINT, VK_FORMAT_R32G32B32_SINT,
- VK_FORMAT_R32G32B32A32_SINT, VK_FORMAT_R32_UINT, VK_FORMAT_R32G32_UINT,
- VK_FORMAT_R32G32B32_UINT, VK_FORMAT_R32G32B32A32_UINT,
- VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32G32_SFLOAT,
- VK_FORMAT_R32G32B32_SFLOAT, VK_FORMAT_R32G32B32A32_SFLOAT,
- VK_FORMAT_R64_SFLOAT, VK_FORMAT_R64G64_SFLOAT,
- VK_FORMAT_R64G64B64_SFLOAT, VK_FORMAT_R64G64B64A64_SFLOAT,
- VK_FORMAT_R8_USCALED, VK_FORMAT_R8G8_USCALED,
- VK_FORMAT_R8G8B8_USCALED, VK_FORMAT_R8G8B8A8_USCALED,
- };
-
const VkShaderStageFlags stages[] =
{
VK_SHADER_STAGE_VERTEX_BIT,
@@ -628,7 +596,9 @@
VK_SHADER_STAGE_GEOMETRY_BIT,
};
- for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
+ const std::vector<VkFormat> formats = subgroups::getAllFormats();
+
+ for (size_t formatIndex = 0; formatIndex < formats.size(); ++formatIndex)
{
const VkFormat format = formats[formatIndex];
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTests.cpp
index 916f903..3b7c5d9 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTests.cpp
@@ -36,6 +36,7 @@
#include "vktSubgroupsShuffleTests.hpp"
#include "vktSubgroupsQuadTests.hpp"
#include "vktSubgroupsShapeTests.hpp"
+#include "vktSubgroupsBallotMasksTests.hpp"
#include "vktTestGroupUtil.hpp"
namespace vkt
@@ -63,6 +64,7 @@
subgroupsTests->addChild(createSubgroupsShuffleTests(testCtx));
subgroupsTests->addChild(createSubgroupsQuadTests(testCtx));
subgroupsTests->addChild(createSubgroupsShapeTests(testCtx));
+ subgroupsTests->addChild(createSubgroupsBallotMasksTests(testCtx));
}
} // anonymous
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.cpp
index 0486700..0e9bd3f 100644
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.cpp
@@ -24,6 +24,7 @@
*/ /*--------------------------------------------------------------------*/
#include "vktSubgroupsTestsUtils.hpp"
+#include "deFloat16.h"
#include "deRandom.hpp"
#include "tcuCommandLine.hpp"
#include "tcuStringTemplate.hpp"
@@ -40,6 +41,26 @@
namespace
{
+
+deUint32 getMaxWidth ()
+{
+ return 1024u;
+}
+
+deUint32 getNextWidth (const deUint32 width)
+{
+ if (width < 128)
+ {
+ // This ensures we test every value up to 128 (the max subgroup size).
+ return width + 1;
+ }
+ else
+ {
+ // And once we hit 128 we increment to only power of 2's to reduce testing time.
+ return width * 2;
+ }
+}
+
deUint32 getFormatSizeInBytes(const VkFormat format)
{
switch (format)
@@ -47,40 +68,69 @@
default:
DE_FATAL("Unhandled format!");
return 0;
+ case VK_FORMAT_R8_SINT:
+ case VK_FORMAT_R8_UINT:
+ return static_cast<deUint32>(sizeof(deInt8));
+ case VK_FORMAT_R8G8_SINT:
+ case VK_FORMAT_R8G8_UINT:
+ return static_cast<deUint32>(sizeof(deInt8) * 2);
+ case VK_FORMAT_R8G8B8_SINT:
+ case VK_FORMAT_R8G8B8_UINT:
+ case VK_FORMAT_R8G8B8A8_SINT:
+ case VK_FORMAT_R8G8B8A8_UINT:
+ return static_cast<deUint32>(sizeof(deInt8) * 4);
+ case VK_FORMAT_R16_SINT:
+ case VK_FORMAT_R16_UINT:
+ case VK_FORMAT_R16_SFLOAT:
+ return static_cast<deUint32>(sizeof(deInt16));
+ case VK_FORMAT_R16G16_SINT:
+ case VK_FORMAT_R16G16_UINT:
+ case VK_FORMAT_R16G16_SFLOAT:
+ return static_cast<deUint32>(sizeof(deInt16) * 2);
+ case VK_FORMAT_R16G16B16_UINT:
+ case VK_FORMAT_R16G16B16_SINT:
+ case VK_FORMAT_R16G16B16_SFLOAT:
+ case VK_FORMAT_R16G16B16A16_SINT:
+ case VK_FORMAT_R16G16B16A16_UINT:
+ case VK_FORMAT_R16G16B16A16_SFLOAT:
+ return static_cast<deUint32>(sizeof(deInt16) * 4);
case VK_FORMAT_R32_SINT:
case VK_FORMAT_R32_UINT:
- return sizeof(deInt32);
+ case VK_FORMAT_R32_SFLOAT:
+ return static_cast<deUint32>(sizeof(deInt32));
case VK_FORMAT_R32G32_SINT:
case VK_FORMAT_R32G32_UINT:
+ case VK_FORMAT_R32G32_SFLOAT:
return static_cast<deUint32>(sizeof(deInt32) * 2);
case VK_FORMAT_R32G32B32_SINT:
case VK_FORMAT_R32G32B32_UINT:
+ case VK_FORMAT_R32G32B32_SFLOAT:
case VK_FORMAT_R32G32B32A32_SINT:
case VK_FORMAT_R32G32B32A32_UINT:
- return static_cast<deUint32>(sizeof(deInt32) * 4);
- case VK_FORMAT_R32_SFLOAT:
- return 4;
- case VK_FORMAT_R32G32_SFLOAT:
- return 8;
- case VK_FORMAT_R32G32B32_SFLOAT:
- return 16;
case VK_FORMAT_R32G32B32A32_SFLOAT:
- return 16;
+ return static_cast<deUint32>(sizeof(deInt32) * 4);
+ case VK_FORMAT_R64_SINT:
+ case VK_FORMAT_R64_UINT:
case VK_FORMAT_R64_SFLOAT:
- return 8;
+ return static_cast<deUint32>(sizeof(deInt64));
+ case VK_FORMAT_R64G64_SINT:
+ case VK_FORMAT_R64G64_UINT:
case VK_FORMAT_R64G64_SFLOAT:
- return 16;
+ return static_cast<deUint32>(sizeof(deInt64) * 2);
+ case VK_FORMAT_R64G64B64_SINT:
+ case VK_FORMAT_R64G64B64_UINT:
case VK_FORMAT_R64G64B64_SFLOAT:
- return 32;
+ case VK_FORMAT_R64G64B64A64_SINT:
+ case VK_FORMAT_R64G64B64A64_UINT:
case VK_FORMAT_R64G64B64A64_SFLOAT:
- return 32;
+ return static_cast<deUint32>(sizeof(deInt64) * 4);
// The below formats are used to represent bool and bvec* types. These
// types are passed to the shader as int and ivec* types, before the
// calculations are done as booleans. We need a distinct type here so
// that the shader generators can switch on it and generate the correct
// shader source for testing.
case VK_FORMAT_R8_USCALED:
- return sizeof(deInt32);
+ return static_cast<deUint32>(sizeof(deInt32));
case VK_FORMAT_R8G8_USCALED:
return static_cast<deUint32>(sizeof(deInt32) * 2);
case VK_FORMAT_R8G8B8_USCALED:
@@ -529,6 +579,35 @@
"}\n";
}
+std::string vkt::subgroups::getSharedMemoryBallotHelperARB()
+{
+ return "shared uvec4 superSecretComputeShaderHelper[gl_WorkGroupSize.x * gl_WorkGroupSize.y * gl_WorkGroupSize.z];\n"
+ "uint64_t sharedMemoryBallot(bool vote)\n"
+ "{\n"
+ " uint groupOffset = gl_SubgroupID;\n"
+ " // One invocation in the group 0's the whole group's data\n"
+ " if (subgroupElect())\n"
+ " {\n"
+ " superSecretComputeShaderHelper[groupOffset] = uvec4(0);\n"
+ " }\n"
+ " subgroupMemoryBarrierShared();\n"
+ " if (vote)\n"
+ " {\n"
+ " const highp uint invocationId = gl_SubgroupInvocationID % 32;\n"
+ " const highp uint bitToSet = 1u << invocationId;\n"
+ " switch (gl_SubgroupInvocationID / 32)\n"
+ " {\n"
+ " case 0: atomicOr(superSecretComputeShaderHelper[groupOffset].x, bitToSet); break;\n"
+ " case 1: atomicOr(superSecretComputeShaderHelper[groupOffset].y, bitToSet); break;\n"
+ " case 2: atomicOr(superSecretComputeShaderHelper[groupOffset].z, bitToSet); break;\n"
+ " case 3: atomicOr(superSecretComputeShaderHelper[groupOffset].w, bitToSet); break;\n"
+ " }\n"
+ " }\n"
+ " subgroupMemoryBarrierShared();\n"
+ " return packUint2x32(superSecretComputeShaderHelper[groupOffset].xy);\n"
+ "}\n";
+}
+
deUint32 vkt::subgroups::getSubgroupSize(Context& context)
{
VkPhysicalDeviceSubgroupProperties subgroupProperties;
@@ -945,11 +1024,11 @@
return features.vertexPipelineStoresAndAtomics ? true : false;
}
-bool vkt::subgroups::isDoubleSupportedForDevice(Context& context)
+bool vkt::subgroups::isInt64SupportedForDevice(Context& context)
{
const VkPhysicalDeviceFeatures features = getPhysicalDeviceFeatures(
context.getInstanceInterface(), context.getPhysicalDevice());
- return features.shaderFloat64 ? true : false;
+ return features.shaderInt64 ? true : false;
}
bool vkt::subgroups::isTessellationAndGeometryPointSizeSupported (Context& context)
@@ -959,20 +1038,86 @@
return features.shaderTessellationAndGeometryPointSize ? true : false;
}
-bool vkt::subgroups::isDoubleFormat(VkFormat format)
+bool vkt::subgroups::isFormatSupportedForDevice(Context& context, vk::VkFormat format)
{
+ VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures subgroupExtendedTypesFeatures;
+ deMemset(&subgroupExtendedTypesFeatures, 0, sizeof(subgroupExtendedTypesFeatures));
+ subgroupExtendedTypesFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES;
+ subgroupExtendedTypesFeatures.pNext = DE_NULL;
+
+ VkPhysicalDeviceShaderFloat16Int8Features float16Int8Features;
+ deMemset(&float16Int8Features, 0, sizeof(float16Int8Features));
+ float16Int8Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES;
+ float16Int8Features.pNext = DE_NULL;
+
+ VkPhysicalDeviceFeatures2 features2;
+ deMemset(&features2, 0, sizeof(features2));
+ features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
+ features2.pNext = DE_NULL;
+
+ if (context.isDeviceFunctionalitySupported("VK_KHR_shader_subgroup_extended_types") &&
+ context.isDeviceFunctionalitySupported("VK_KHR_shader_float16_int8"))
+ {
+ features2.pNext = &subgroupExtendedTypesFeatures;
+ subgroupExtendedTypesFeatures.pNext = &float16Int8Features;
+ }
+
+ const PlatformInterface& platformInterface = context.getPlatformInterface();
+ const VkInstance instance = context.getInstance();
+ const InstanceDriver instanceDriver (platformInterface, instance);
+
+ instanceDriver.getPhysicalDeviceFeatures2(context.getPhysicalDevice(), &features2);
+
switch (format)
{
default:
- return false;
+ return true;
+ case VK_FORMAT_R16_SFLOAT:
+ case VK_FORMAT_R16G16_SFLOAT:
+ case VK_FORMAT_R16G16B16_SFLOAT:
+ case VK_FORMAT_R16G16B16A16_SFLOAT:
+ return subgroupExtendedTypesFeatures.shaderSubgroupExtendedTypes & float16Int8Features.shaderFloat16 ? true : false;
case VK_FORMAT_R64_SFLOAT:
case VK_FORMAT_R64G64_SFLOAT:
case VK_FORMAT_R64G64B64_SFLOAT:
case VK_FORMAT_R64G64B64A64_SFLOAT:
- return true;
+ return features2.features.shaderFloat64 ? true : false;
+ case VK_FORMAT_R8_SINT:
+ case VK_FORMAT_R8G8_SINT:
+ case VK_FORMAT_R8G8B8_SINT:
+ case VK_FORMAT_R8G8B8A8_SINT:
+ case VK_FORMAT_R8_UINT:
+ case VK_FORMAT_R8G8_UINT:
+ case VK_FORMAT_R8G8B8_UINT:
+ case VK_FORMAT_R8G8B8A8_UINT:
+ return subgroupExtendedTypesFeatures.shaderSubgroupExtendedTypes & float16Int8Features.shaderInt8 ? true : false;
+ case VK_FORMAT_R16_SINT:
+ case VK_FORMAT_R16G16_SINT:
+ case VK_FORMAT_R16G16B16_SINT:
+ case VK_FORMAT_R16G16B16A16_SINT:
+ case VK_FORMAT_R16_UINT:
+ case VK_FORMAT_R16G16_UINT:
+ case VK_FORMAT_R16G16B16_UINT:
+ case VK_FORMAT_R16G16B16A16_UINT:
+ return subgroupExtendedTypesFeatures.shaderSubgroupExtendedTypes & features2.features.shaderInt16 ? true : false;
+ case VK_FORMAT_R64_SINT:
+ case VK_FORMAT_R64G64_SINT:
+ case VK_FORMAT_R64G64B64_SINT:
+ case VK_FORMAT_R64G64B64A64_SINT:
+ case VK_FORMAT_R64_UINT:
+ case VK_FORMAT_R64G64_UINT:
+ case VK_FORMAT_R64G64B64_UINT:
+ case VK_FORMAT_R64G64B64A64_UINT:
+ return subgroupExtendedTypesFeatures.shaderSubgroupExtendedTypes & features2.features.shaderInt64 ? true : false;
}
}
+bool vkt::subgroups::isSubgroupBroadcastDynamicIdSupported (Context& context)
+{
+ return context.contextSupports(vk::ApiVersion(1, 2, 0)) &&
+ vk::getPhysicalDeviceVulkan12Features(context.getInstanceInterface(), context.getPhysicalDevice()).subgroupBroadcastDynamicId;
+}
+
std::string vkt::subgroups::getFormatNameForGLSL (VkFormat format)
{
switch (format)
@@ -980,6 +1125,38 @@
default:
DE_FATAL("Unhandled format!");
return "";
+ case VK_FORMAT_R8_SINT:
+ return "int8_t";
+ case VK_FORMAT_R8G8_SINT:
+ return "i8vec2";
+ case VK_FORMAT_R8G8B8_SINT:
+ return "i8vec3";
+ case VK_FORMAT_R8G8B8A8_SINT:
+ return "i8vec4";
+ case VK_FORMAT_R8_UINT:
+ return "uint8_t";
+ case VK_FORMAT_R8G8_UINT:
+ return "u8vec2";
+ case VK_FORMAT_R8G8B8_UINT:
+ return "u8vec3";
+ case VK_FORMAT_R8G8B8A8_UINT:
+ return "u8vec4";
+ case VK_FORMAT_R16_SINT:
+ return "int16_t";
+ case VK_FORMAT_R16G16_SINT:
+ return "i16vec2";
+ case VK_FORMAT_R16G16B16_SINT:
+ return "i16vec3";
+ case VK_FORMAT_R16G16B16A16_SINT:
+ return "i16vec4";
+ case VK_FORMAT_R16_UINT:
+ return "uint16_t";
+ case VK_FORMAT_R16G16_UINT:
+ return "u16vec2";
+ case VK_FORMAT_R16G16B16_UINT:
+ return "u16vec3";
+ case VK_FORMAT_R16G16B16A16_UINT:
+ return "u16vec4";
case VK_FORMAT_R32_SINT:
return "int";
case VK_FORMAT_R32G32_SINT:
@@ -996,6 +1173,30 @@
return "uvec3";
case VK_FORMAT_R32G32B32A32_UINT:
return "uvec4";
+ case VK_FORMAT_R64_SINT:
+ return "int64_t";
+ case VK_FORMAT_R64G64_SINT:
+ return "i64vec2";
+ case VK_FORMAT_R64G64B64_SINT:
+ return "i64vec3";
+ case VK_FORMAT_R64G64B64A64_SINT:
+ return "i64vec4";
+ case VK_FORMAT_R64_UINT:
+ return "uint64_t";
+ case VK_FORMAT_R64G64_UINT:
+ return "u64vec2";
+ case VK_FORMAT_R64G64B64_UINT:
+ return "u64vec3";
+ case VK_FORMAT_R64G64B64A64_UINT:
+ return "u64vec4";
+ case VK_FORMAT_R16_SFLOAT:
+ return "float16_t";
+ case VK_FORMAT_R16G16_SFLOAT:
+ return "f16vec2";
+ case VK_FORMAT_R16G16B16_SFLOAT:
+ return "f16vec3";
+ case VK_FORMAT_R16G16B16A16_SFLOAT:
+ return "f16vec4";
case VK_FORMAT_R32_SFLOAT:
return "float";
case VK_FORMAT_R32G32_SFLOAT:
@@ -1023,6 +1224,177 @@
}
}
+std::string vkt::subgroups::getAdditionalExtensionForFormat (vk::VkFormat format)
+{
+ switch (format)
+ {
+ default:
+ return "";
+ case VK_FORMAT_R8_SINT:
+ case VK_FORMAT_R8G8_SINT:
+ case VK_FORMAT_R8G8B8_SINT:
+ case VK_FORMAT_R8G8B8A8_SINT:
+ case VK_FORMAT_R8_UINT:
+ case VK_FORMAT_R8G8_UINT:
+ case VK_FORMAT_R8G8B8_UINT:
+ case VK_FORMAT_R8G8B8A8_UINT:
+ return "#extension GL_EXT_shader_subgroup_extended_types_int8 : enable\n";
+ case VK_FORMAT_R16_SINT:
+ case VK_FORMAT_R16G16_SINT:
+ case VK_FORMAT_R16G16B16_SINT:
+ case VK_FORMAT_R16G16B16A16_SINT:
+ case VK_FORMAT_R16_UINT:
+ case VK_FORMAT_R16G16_UINT:
+ case VK_FORMAT_R16G16B16_UINT:
+ case VK_FORMAT_R16G16B16A16_UINT:
+ return "#extension GL_EXT_shader_subgroup_extended_types_int16 : enable\n";
+ case VK_FORMAT_R64_SINT:
+ case VK_FORMAT_R64G64_SINT:
+ case VK_FORMAT_R64G64B64_SINT:
+ case VK_FORMAT_R64G64B64A64_SINT:
+ case VK_FORMAT_R64_UINT:
+ case VK_FORMAT_R64G64_UINT:
+ case VK_FORMAT_R64G64B64_UINT:
+ case VK_FORMAT_R64G64B64A64_UINT:
+ return "#extension GL_EXT_shader_subgroup_extended_types_int64 : enable\n";
+ case VK_FORMAT_R16_SFLOAT:
+ case VK_FORMAT_R16G16_SFLOAT:
+ case VK_FORMAT_R16G16B16_SFLOAT:
+ case VK_FORMAT_R16G16B16A16_SFLOAT:
+ return "#extension GL_EXT_shader_subgroup_extended_types_float16 : enable\n";
+ }
+}
+
+const std::vector<vk::VkFormat> vkt::subgroups::getAllFormats()
+{
+ std::vector<VkFormat> formats;
+
+ formats.push_back(VK_FORMAT_R8_SINT);
+ formats.push_back(VK_FORMAT_R8G8_SINT);
+ formats.push_back(VK_FORMAT_R8G8B8_SINT);
+ formats.push_back(VK_FORMAT_R8G8B8A8_SINT);
+ formats.push_back(VK_FORMAT_R8_UINT);
+ formats.push_back(VK_FORMAT_R8G8_UINT);
+ formats.push_back(VK_FORMAT_R8G8B8_UINT);
+ formats.push_back(VK_FORMAT_R8G8B8A8_UINT);
+ formats.push_back(VK_FORMAT_R16_SINT);
+ formats.push_back(VK_FORMAT_R16G16_SINT);
+ formats.push_back(VK_FORMAT_R16G16B16_SINT);
+ formats.push_back(VK_FORMAT_R16G16B16A16_SINT);
+ formats.push_back(VK_FORMAT_R16_UINT);
+ formats.push_back(VK_FORMAT_R16G16_UINT);
+ formats.push_back(VK_FORMAT_R16G16B16_UINT);
+ formats.push_back(VK_FORMAT_R16G16B16A16_UINT);
+ formats.push_back(VK_FORMAT_R32_SINT);
+ formats.push_back(VK_FORMAT_R32G32_SINT);
+ formats.push_back(VK_FORMAT_R32G32B32_SINT);
+ formats.push_back(VK_FORMAT_R32G32B32A32_SINT);
+ formats.push_back(VK_FORMAT_R32_UINT);
+ formats.push_back(VK_FORMAT_R32G32_UINT);
+ formats.push_back(VK_FORMAT_R32G32B32_UINT);
+ formats.push_back(VK_FORMAT_R32G32B32A32_UINT);
+ formats.push_back(VK_FORMAT_R64_SINT);
+ formats.push_back(VK_FORMAT_R64G64_SINT);
+ formats.push_back(VK_FORMAT_R64G64B64_SINT);
+ formats.push_back(VK_FORMAT_R64G64B64A64_SINT);
+ formats.push_back(VK_FORMAT_R64_UINT);
+ formats.push_back(VK_FORMAT_R64G64_UINT);
+ formats.push_back(VK_FORMAT_R64G64B64_UINT);
+ formats.push_back(VK_FORMAT_R64G64B64A64_UINT);
+ formats.push_back(VK_FORMAT_R16_SFLOAT);
+ formats.push_back(VK_FORMAT_R16G16_SFLOAT);
+ formats.push_back(VK_FORMAT_R16G16B16_SFLOAT);
+ formats.push_back(VK_FORMAT_R16G16B16A16_SFLOAT);
+ formats.push_back(VK_FORMAT_R32_SFLOAT);
+ formats.push_back(VK_FORMAT_R32G32_SFLOAT);
+ formats.push_back(VK_FORMAT_R32G32B32_SFLOAT);
+ formats.push_back(VK_FORMAT_R32G32B32A32_SFLOAT);
+ formats.push_back(VK_FORMAT_R64_SFLOAT);
+ formats.push_back(VK_FORMAT_R64G64_SFLOAT);
+ formats.push_back(VK_FORMAT_R64G64B64_SFLOAT);
+ formats.push_back(VK_FORMAT_R64G64B64A64_SFLOAT);
+ formats.push_back(VK_FORMAT_R8_USCALED);
+ formats.push_back(VK_FORMAT_R8G8_USCALED);
+ formats.push_back(VK_FORMAT_R8G8B8_USCALED);
+ formats.push_back(VK_FORMAT_R8G8B8A8_USCALED);
+
+ return formats;
+}
+
+bool vkt::subgroups::isFormatSigned (VkFormat format)
+{
+ switch (format)
+ {
+ default:
+ return false;
+ case VK_FORMAT_R8_SINT:
+ case VK_FORMAT_R8G8_SINT:
+ case VK_FORMAT_R8G8B8_SINT:
+ case VK_FORMAT_R8G8B8A8_SINT:
+ case VK_FORMAT_R16_SINT:
+ case VK_FORMAT_R16G16_SINT:
+ case VK_FORMAT_R16G16B16_SINT:
+ case VK_FORMAT_R16G16B16A16_SINT:
+ case VK_FORMAT_R32_SINT:
+ case VK_FORMAT_R32G32_SINT:
+ case VK_FORMAT_R32G32B32_SINT:
+ case VK_FORMAT_R32G32B32A32_SINT:
+ case VK_FORMAT_R64_SINT:
+ case VK_FORMAT_R64G64_SINT:
+ case VK_FORMAT_R64G64B64_SINT:
+ case VK_FORMAT_R64G64B64A64_SINT:
+ return true;
+ }
+}
+
+bool vkt::subgroups::isFormatUnsigned (VkFormat format)
+{
+ switch (format)
+ {
+ default:
+ return false;
+ case VK_FORMAT_R8_UINT:
+ case VK_FORMAT_R8G8_UINT:
+ case VK_FORMAT_R8G8B8_UINT:
+ case VK_FORMAT_R8G8B8A8_UINT:
+ case VK_FORMAT_R16_UINT:
+ case VK_FORMAT_R16G16_UINT:
+ case VK_FORMAT_R16G16B16_UINT:
+ case VK_FORMAT_R16G16B16A16_UINT:
+ case VK_FORMAT_R32_UINT:
+ case VK_FORMAT_R32G32_UINT:
+ case VK_FORMAT_R32G32B32_UINT:
+ case VK_FORMAT_R32G32B32A32_UINT:
+ case VK_FORMAT_R64_UINT:
+ case VK_FORMAT_R64G64_UINT:
+ case VK_FORMAT_R64G64B64_UINT:
+ case VK_FORMAT_R64G64B64A64_UINT:
+ return true;
+ }
+}
+
+bool vkt::subgroups::isFormatFloat (VkFormat format)
+{
+ switch (format)
+ {
+ default:
+ return false;
+ case VK_FORMAT_R16_SFLOAT:
+ case VK_FORMAT_R16G16_SFLOAT:
+ case VK_FORMAT_R16G16B16_SFLOAT:
+ case VK_FORMAT_R16G16B16A16_SFLOAT:
+ case VK_FORMAT_R32_SFLOAT:
+ case VK_FORMAT_R32G32_SFLOAT:
+ case VK_FORMAT_R32G32B32_SFLOAT:
+ case VK_FORMAT_R32G32B32A32_SFLOAT:
+ case VK_FORMAT_R64_SFLOAT:
+ case VK_FORMAT_R64G64_SFLOAT:
+ case VK_FORMAT_R64G64B64_SFLOAT:
+ case VK_FORMAT_R64G64B64A64_SFLOAT:
+ return true;
+ }
+}
+
void vkt::subgroups::setVertexShaderFrameBuffer (SourceCollections& programCollection)
{
/*
@@ -1344,6 +1716,40 @@
default:
DE_FATAL("Illegal buffer format");
break;
+ case VK_FORMAT_R8_SINT:
+ case VK_FORMAT_R8G8_SINT:
+ case VK_FORMAT_R8G8B8_SINT:
+ case VK_FORMAT_R8G8B8A8_SINT:
+ case VK_FORMAT_R8_UINT:
+ case VK_FORMAT_R8G8_UINT:
+ case VK_FORMAT_R8G8B8_UINT:
+ case VK_FORMAT_R8G8B8A8_UINT:
+ {
+ deUint8* ptr = reinterpret_cast<deUint8*>(alloc.getHostPtr());
+
+ for (vk::VkDeviceSize k = 0; k < (size / sizeof(deUint8)); k++)
+ {
+ ptr[k] = rnd.getUint8();
+ }
+ }
+ break;
+ case VK_FORMAT_R16_SINT:
+ case VK_FORMAT_R16G16_SINT:
+ case VK_FORMAT_R16G16B16_SINT:
+ case VK_FORMAT_R16G16B16A16_SINT:
+ case VK_FORMAT_R16_UINT:
+ case VK_FORMAT_R16G16_UINT:
+ case VK_FORMAT_R16G16B16_UINT:
+ case VK_FORMAT_R16G16B16A16_UINT:
+ {
+ deUint16* ptr = reinterpret_cast<deUint16*>(alloc.getHostPtr());
+
+ for (vk::VkDeviceSize k = 0; k < (size / sizeof(deUint16)); k++)
+ {
+ ptr[k] = rnd.getUint16();
+ }
+ }
+ break;
case VK_FORMAT_R8_USCALED:
case VK_FORMAT_R8G8_USCALED:
case VK_FORMAT_R8G8B8_USCALED:
@@ -1365,6 +1771,36 @@
}
}
break;
+ case VK_FORMAT_R64_SINT:
+ case VK_FORMAT_R64G64_SINT:
+ case VK_FORMAT_R64G64B64_SINT:
+ case VK_FORMAT_R64G64B64A64_SINT:
+ case VK_FORMAT_R64_UINT:
+ case VK_FORMAT_R64G64_UINT:
+ case VK_FORMAT_R64G64B64_UINT:
+ case VK_FORMAT_R64G64B64A64_UINT:
+ {
+ deUint64* ptr = reinterpret_cast<deUint64*>(alloc.getHostPtr());
+
+ for (vk::VkDeviceSize k = 0; k < (size / sizeof(deUint64)); k++)
+ {
+ ptr[k] = rnd.getUint64();
+ }
+ }
+ break;
+ case VK_FORMAT_R16_SFLOAT:
+ case VK_FORMAT_R16G16_SFLOAT:
+ case VK_FORMAT_R16G16B16_SFLOAT:
+ case VK_FORMAT_R16G16B16A16_SFLOAT:
+ {
+ deFloat16* ptr = reinterpret_cast<deFloat16*>(alloc.getHostPtr());
+
+ for (vk::VkDeviceSize k = 0; k < (size / sizeof(deFloat16)); k++)
+ {
+ ptr[k] = deFloat32To16(rnd.getFloat());
+ }
+ }
+ break;
case VK_FORMAT_R32_SFLOAT:
case VK_FORMAT_R32G32_SFLOAT:
case VK_FORMAT_R32G32B32_SFLOAT:
@@ -1441,7 +1877,7 @@
{
const DeviceInterface& vk = context.getDeviceInterface();
const VkDevice device = context.getDevice();
- const deUint32 maxWidth = 1024u;
+ const deUint32 maxWidth = getMaxWidth();
vector<de::SharedPtr<BufferOrImage> > inputBuffers (extraDataCount);
DescriptorSetLayoutBuilder layoutBuilder;
DescriptorPoolBuilder poolBuilder;
@@ -1566,15 +2002,15 @@
flushAlloc(vk, device, alloc);
}
- for (deUint32 width = 1u; width < maxWidth; ++width)
- {
- const Unique<VkFramebuffer> framebuffer (makeFramebuffer(vk, device, *renderPass, discardableImage.getImageView(), maxWidth, 1u));
- const VkViewport viewport = makeViewport(maxWidth, 1u);
- const VkRect2D scissor = makeRect2D(maxWidth, 1u);
- const vk::VkDeviceSize imageResultSize = tcu::getPixelSize(vk::mapVkFormat(format)) * maxWidth;
- Buffer imageBufferResult (context, imageResultSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
- const VkDeviceSize vertexBufferOffset = 0u;
+ const Unique<VkFramebuffer> framebuffer (makeFramebuffer(vk, device, *renderPass, discardableImage.getImageView(), maxWidth, 1u));
+ const VkViewport viewport = makeViewport(maxWidth, 1u);
+ const VkRect2D scissor = makeRect2D(maxWidth, 1u);
+ const vk::VkDeviceSize imageResultSize = tcu::getPixelSize(vk::mapVkFormat(format)) * maxWidth;
+ Buffer imageBufferResult (context, imageResultSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+ const VkDeviceSize vertexBufferOffset = 0u;
+ for (deUint32 width = 1u; width < maxWidth; width = getNextWidth(width))
+ {
totalIterations++;
beginCommandBuffer(vk, *cmdBuffer);
@@ -1618,8 +2054,10 @@
if (0 < failedIterations)
{
+ unsigned valuesPassed = (failedIterations > totalIterations) ? 0u : (totalIterations - failedIterations);
+
context.getTestContext().getLog()
- << TestLog::Message << (totalIterations - failedIterations) << " / "
+ << TestLog::Message << valuesPassed << " / "
<< totalIterations << " values passed" << TestLog::EndMessage;
return tcu::TestStatus::fail("Failed!");
}
@@ -1661,7 +2099,7 @@
{
const DeviceInterface& vk = context.getDeviceInterface();
const VkDevice device = context.getDevice();
- const deUint32 maxWidth = 1024u;
+ const deUint32 maxWidth = getMaxWidth();
vector<de::SharedPtr<BufferOrImage> > inputBuffers (extraDataCount);
DescriptorSetLayoutBuilder layoutBuilder;
DescriptorPoolBuilder poolBuilder;
@@ -1778,15 +2216,16 @@
flushAlloc(vk, device, alloc);
}
- for (deUint32 width = 1u; width < maxWidth; width++)
+ const Unique<VkFramebuffer> framebuffer (makeFramebuffer(vk, device, *renderPass, discardableImage.getImageView(), maxWidth, 1u));
+ const VkViewport viewport = makeViewport(maxWidth, 1u);
+ const VkRect2D scissor = makeRect2D(maxWidth, 1u);
+ const vk::VkDeviceSize imageResultSize = tcu::getPixelSize(vk::mapVkFormat(format)) * maxWidth;
+ Buffer imageBufferResult (context, imageResultSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+ const VkDeviceSize vertexBufferOffset = 0u;
+
+ for (deUint32 width = 1u; width < maxWidth; width = getNextWidth(width))
{
totalIterations++;
- const Unique<VkFramebuffer> framebuffer (makeFramebuffer(vk, device, *renderPass, discardableImage.getImageView(), maxWidth, 1u));
- const VkViewport viewport = makeViewport(maxWidth, 1u);
- const VkRect2D scissor = makeRect2D(maxWidth, 1u);
- const vk::VkDeviceSize imageResultSize = tcu::getPixelSize(vk::mapVkFormat(format)) * maxWidth;
- Buffer imageBufferResult (context, imageResultSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
- const VkDeviceSize vertexBufferOffset = 0u;
for (deUint32 ndx = 0u; ndx < inputBuffers.size(); ndx++)
{
@@ -1836,9 +2275,12 @@
if (0 < failedIterations)
{
+ unsigned valuesPassed = (failedIterations > totalIterations) ? 0u : (totalIterations - failedIterations);
+
context.getTestContext().getLog()
- << TestLog::Message << (totalIterations - failedIterations) << " / "
+ << TestLog::Message << valuesPassed << " / "
<< totalIterations << " values passed" << TestLog::EndMessage;
+
return tcu::TestStatus::fail("Failed!");
}
@@ -1854,7 +2296,7 @@
{
const DeviceInterface& vk = context.getDeviceInterface();
const VkDevice device = context.getDevice();
- const deUint32 maxWidth = 1024u;
+ const deUint32 maxWidth = getMaxWidth();
vector<VkShaderStageFlagBits> stagesVector;
VkShaderStageFlags shaderStageRequired = (VkShaderStageFlags)0ull;
@@ -2044,7 +2486,7 @@
VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
resultImage.getImage(), subresourceRange);
- for (deUint32 width = 1u; width < maxWidth; width++)
+ for (deUint32 width = 1u; width < maxWidth; width = getNextWidth(width))
{
for (deUint32 ndx = stagesCount; ndx < stagesCount + extraDatasCount; ++ndx)
{
@@ -2129,7 +2571,7 @@
}
}
- if (!checkResult(datas, width , subgroupSize))
+ if (!checkResult(datas, width, subgroupSize))
failedIterations++;
}
@@ -2138,9 +2580,12 @@
if (0 < failedIterations)
{
+ unsigned valuesPassed = (failedIterations > totalIterations) ? 0u : (totalIterations - failedIterations);
+
context.getTestContext().getLog()
- << TestLog::Message << (totalIterations - failedIterations) << " / "
- << totalIterations << " values passed" << TestLog::EndMessage;
+ << TestLog::Message << valuesPassed << " / "
+ << totalIterations << " values passed" << TestLog::EndMessage;
+
return tcu::TestStatus::fail("Failed!");
}
}
@@ -2155,8 +2600,8 @@
const DeviceInterface& vk = context.getDeviceInterface();
const VkDevice device = context.getDevice();
const VkQueue queue = context.getUniversalQueue();
+ const deUint32 maxWidth = getMaxWidth();
const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
- const deUint32 maxWidth = 1024u;
vector<de::SharedPtr<BufferOrImage> > inputBuffers (extraDataCount);
DescriptorSetLayoutBuilder layoutBuilder;
const Unique<VkShaderModule> vertexShaderModule (createShaderModule(vk, device, context.getBinaryCollection().get("vert"), 0u));
@@ -2283,15 +2728,16 @@
flushAlloc(vk, device, alloc);
}
- for (deUint32 width = 1u; width < maxWidth; width++)
+ const Unique<VkFramebuffer> framebuffer (makeFramebuffer(vk, device, *renderPass, discardableImage.getImageView(), maxWidth, 1u));
+ const VkViewport viewport = makeViewport(maxWidth, 1u);
+ const VkRect2D scissor = makeRect2D(maxWidth, 1u);
+ const vk::VkDeviceSize imageResultSize = tcu::getPixelSize(vk::mapVkFormat(format)) * maxWidth;
+ Buffer imageBufferResult (context, imageResultSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+ const VkDeviceSize vertexBufferOffset = 0u;
+
+ for (deUint32 width = 1u; width < maxWidth; width = getNextWidth(width))
{
totalIterations++;
- const Unique<VkFramebuffer> framebuffer (makeFramebuffer(vk, device, *renderPass, discardableImage.getImageView(), maxWidth, 1u));
- const VkViewport viewport = makeViewport(maxWidth, 1u);
- const VkRect2D scissor = makeRect2D(maxWidth, 1u);
- const vk::VkDeviceSize imageResultSize = tcu::getPixelSize(vk::mapVkFormat(format)) * maxWidth;
- Buffer imageBufferResult (context, imageResultSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
- const VkDeviceSize vertexBufferOffset = 0u;
for (deUint32 ndx = 0u; ndx < inputBuffers.size(); ndx++)
{
@@ -2341,9 +2787,12 @@
if (0 < failedIterations)
{
+ unsigned valuesPassed = (failedIterations > totalIterations) ? 0u : (totalIterations - failedIterations);
+
context.getTestContext().getLog()
- << TestLog::Message << (totalIterations - failedIterations) << " / "
- << totalIterations << " values passed" << TestLog::EndMessage;
+ << TestLog::Message << valuesPassed << " / "
+ << totalIterations << " values passed" << TestLog::EndMessage;
+
return tcu::TestStatus::fail("Failed!");
}
@@ -2543,9 +2992,12 @@
if (0 < failedIterations)
{
+ unsigned valuesPassed = (failedIterations > totalIterations) ? 0u : (totalIterations - failedIterations);
+
context.getTestContext().getLog()
- << TestLog::Message << (totalIterations - failedIterations) << " / "
- << totalIterations << " values passed" << TestLog::EndMessage;
+ << TestLog::Message << valuesPassed << " / "
+ << totalIterations << " values passed" << TestLog::EndMessage;
+
return tcu::TestStatus::fail("Failed!");
}
@@ -2761,9 +3213,12 @@
if (0 < failedIterations)
{
+ unsigned valuesPassed = (failedIterations > totalIterations) ? 0u : (totalIterations - failedIterations);
+
context.getTestContext().getLog()
- << TestLog::Message << (totalIterations - failedIterations) << " / "
- << totalIterations << " values passed" << TestLog::EndMessage;
+ << TestLog::Message << valuesPassed << " / "
+ << totalIterations << " values passed" << TestLog::EndMessage;
+
return tcu::TestStatus::fail("Failed!");
}
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.hpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.hpp
index b474bbd..ff09876 100644
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.hpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.hpp
@@ -48,6 +48,7 @@
#include "deUniquePtr.hpp"
#include <string>
+#include <vector>
namespace vkt
{
@@ -89,6 +90,8 @@
std::string getSharedMemoryBallotHelper();
+std::string getSharedMemoryBallotHelperARB();
+
deUint32 getSubgroupSize(Context& context);
vk::VkDeviceSize maxSupportedSubgroupSize();
@@ -114,13 +117,23 @@
bool isVertexSSBOSupportedForDevice(Context& context);
-bool isDoubleSupportedForDevice(Context& context);
+bool isFormatSupportedForDevice(Context& context, vk::VkFormat format);
+
+bool isInt64SupportedForDevice(Context& context);
bool isTessellationAndGeometryPointSizeSupported(Context& context);
-bool isDoubleFormat(vk::VkFormat format);
+bool isSubgroupBroadcastDynamicIdSupported(Context& context);
-std::string getFormatNameForGLSL(vk::VkFormat format);
+std::string getFormatNameForGLSL (vk::VkFormat format);
+
+std::string getAdditionalExtensionForFormat (vk::VkFormat format);
+
+const std::vector<vk::VkFormat> getAllFormats ();
+
+bool isFormatSigned (vk::VkFormat format);
+bool isFormatUnsigned (vk::VkFormat format);
+bool isFormatFloat (vk::VkFormat format);
void addGeometryShadersFromTemplate (const std::string& glslTemplate, const vk::ShaderBuildOptions& options, vk::GlslSourceCollection& collection);
void addGeometryShadersFromTemplate (const std::string& spirvTemplate, const vk::SpirVAsmBuildOptions& options, vk::SpirVAsmCollection& collection);
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsVoteTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsVoteTests.cpp
index 49577db..d4308b3 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsVoteTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsVoteTests.cpp
@@ -118,11 +118,24 @@
de::SharedPtr<bool> geometryPointSizeSupported;
};
+bool fmtIsBoolean(VkFormat format)
+{
+ // For reasons unknown, the tests use R8_USCALED as the boolean format
+ return format == VK_FORMAT_R8_USCALED || format == VK_FORMAT_R8G8_USCALED ||
+ format == VK_FORMAT_R8G8B8_USCALED || format == VK_FORMAT_R8G8B8A8_USCALED;
+}
+
+const string extHeader(bool arbFunctions)
+{
+ return arbFunctions ? "#extension GL_ARB_shader_group_vote: enable\n"
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ : "#extension GL_KHR_shader_subgroup_vote: enable\n";
+}
+
// The test source to use in a generic stage. Fragment and compute sources are different
const string stageTestSource(CaseDefinition caseDef)
{
- const bool formatIsBoolean =
- VK_FORMAT_R8_USCALED == caseDef.format || VK_FORMAT_R8G8_USCALED == caseDef.format || VK_FORMAT_R8G8B8_USCALED == caseDef.format || VK_FORMAT_R8G8B8A8_USCALED == caseDef.format;
+ const bool formatIsBoolean = fmtIsBoolean(caseDef.format);
const string op = getOpTypeName(caseDef.opType);
const string fmt = subgroups::getFormatNameForGLSL(caseDef.format);
@@ -138,7 +151,7 @@
" result |= 0x4;\n"
: (OPTYPE_ALLEQUAL == caseDef.opType || OPTYPE_ALLEQUAL_ARB == caseDef.opType) ?
" " + fmt + " valueEqual = " + fmt + "(1.25 * float(data[gl_SubgroupInvocationID]) + 5.0);\n" +
- " " + fmt + " valueNoEqual = " + fmt + (formatIsBoolean ? "(subgroupElect());\n" : "(12.0 * float(data[gl_SubgroupInvocationID]) + gl_SubgroupInvocationID);\n") +
+ " " + fmt + " valueNoEqual = " + fmt + (formatIsBoolean ? "(subgroupElect());\n" : "(gl_SubgroupInvocationID);\n") +
" result = " + op + "(" + fmt + "(1)) ? 0x1 : 0;\n"
" result |= "
+ (formatIsBoolean ? "0x2" : op + "(" + fmt + "(gl_SubgroupInvocationID)) ? 0 : 0x2")
@@ -153,13 +166,9 @@
void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
{
const vk::ShaderBuildOptions buildOptions (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
- const bool formatIsBoolean =
- VK_FORMAT_R8_USCALED == caseDef.format || VK_FORMAT_R8G8_USCALED == caseDef.format || VK_FORMAT_R8G8B8_USCALED == caseDef.format || VK_FORMAT_R8G8B8A8_USCALED == caseDef.format;
+ const bool formatIsBoolean = fmtIsBoolean(caseDef.format);
const bool arbFunctions = caseDef.opType > OPTYPE_LAST_NON_ARB;
- const string extensionHeader = arbFunctions ?
- "#extension GL_ARB_shader_group_vote: enable\n"
- "#extension GL_KHR_shader_subgroup_basic: enable\n" :
- "#extension GL_KHR_shader_subgroup_vote: enable\n";
+ const string extensionHeader = extHeader(arbFunctions);
if (VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage)
subgroups::setFragmentShaderFrameBuffer(programCollection);
@@ -180,16 +189,19 @@
const string source = stageTestSource(caseDef);
+ const string fmt = subgroups::getFormatNameForGLSL(caseDef.format);
+
if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
{
std::ostringstream vertexSrc;
vertexSrc << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< extensionHeader.c_str()
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(location = 0) out vec4 out_color;\n"
<< "layout(location = 0) in highp vec4 in_position;\n"
<< "layout(set = 0, binding = 0) uniform Buffer1\n"
<< "{\n"
- << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << " " << fmt << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< "\n"
<< "void main (void)\n"
@@ -209,12 +221,13 @@
geometry << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< extensionHeader.c_str()
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(points) in;\n"
<< "layout(points, max_vertices = 1) out;\n"
<< "layout(location = 0) out float out_color;\n"
<< "layout(set = 0, binding = 0) uniform Buffer1\n"
<< "{\n"
- << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << " " << fmt << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< "\n"
<< "void main (void)\n"
@@ -236,11 +249,12 @@
std::ostringstream controlSource;
controlSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< extensionHeader.c_str()
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(vertices = 2) out;\n"
<< "layout(location = 0) out float out_color[];\n"
<< "layout(set = 0, binding = 0) uniform Buffer1\n"
<< "{\n"
- << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << " " << fmt << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< "\n"
<< "void main (void)\n"
@@ -266,11 +280,12 @@
evaluationSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< extensionHeader.c_str()
<< "#extension GL_EXT_tessellation_shader : require\n"
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(isolines, equal_spacing, ccw ) in;\n"
<< "layout(location = 0) out float out_color;\n"
<< "layout(set = 0, binding = 0) uniform Buffer1\n"
<< "{\n"
- << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << " " << fmt << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< "\n"
<< "void main (void)\n"
@@ -288,36 +303,38 @@
}
else if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
{
+ const string op = getOpTypeName(caseDef.opType);
const string sourceFragment =
(OPTYPE_ALL == caseDef.opType || OPTYPE_ALL_ARB == caseDef.opType) ?
- " result |= " + getOpTypeName(caseDef.opType) + "(!gl_HelperInvocation) ? 0x0 : 0x1;\n"
- " result |= " + getOpTypeName(caseDef.opType) + "(false) ? 0 : 0x1A;\n"
+ " result |= " + op + "(!gl_HelperInvocation) ? 0x0 : 0x1;\n"
+ " result |= " + op + "(false) ? 0 : 0x1A;\n"
" result |= 0x4;\n"
: (OPTYPE_ANY == caseDef.opType || OPTYPE_ANY_ARB == caseDef.opType) ?
- " result |= " + getOpTypeName(caseDef.opType) + "(gl_HelperInvocation) ? 0x1 : 0x0;\n"
- " result |= " + getOpTypeName(caseDef.opType) + "(false) ? 0 : 0x1A;\n"
+ " result |= " + op + "(gl_HelperInvocation) ? 0x1 : 0x0;\n"
+ " result |= " + op + "(false) ? 0 : 0x1A;\n"
" result |= 0x4;\n"
: (OPTYPE_ALLEQUAL == caseDef.opType || OPTYPE_ALLEQUAL_ARB == caseDef.opType) ?
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + "(1.25 * float(data[gl_SubgroupInvocationID]) + 5.0);\n" +
- " " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueNoEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + (formatIsBoolean ? "(subgroupElect());\n" : "(12.0 * float(data[gl_SubgroupInvocationID]) + int(gl_FragCoord.x*gl_SubgroupInvocationID));\n") +
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueNoEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + (formatIsBoolean ? "(subgroupElect());\n" : "(gl_SubgroupInvocationID);\n") +
" result |= " + getOpTypeName(caseDef.opType) + "("
+ subgroups::getFormatNameForGLSL(caseDef.format) + "(1)) ? 0x10 : 0;\n"
" result |= "
- + (formatIsBoolean ? "0x2" : getOpTypeName(caseDef.opType) + "(" + subgroups::getFormatNameForGLSL(caseDef.format) + "(gl_SubgroupInvocationID)) ? 0 : 0x2")
+ + (formatIsBoolean ? "0x2" : op + "(" + fmt + "(gl_SubgroupInvocationID)) ? 0 : 0x2")
+ ";\n"
- " result |= " + getOpTypeName(caseDef.opType) + "(data[0]) ? 0x4 : 0;\n"
- " result |= " + getOpTypeName(caseDef.opType) + "(valueEqual) ? 0x8 : 0x0;\n"
- " result |= " + getOpTypeName(caseDef.opType) + "(gl_HelperInvocation) ? 0x0 : 0x1;\n"
+ " result |= " + op + "(data[0]) ? 0x4 : 0;\n"
+ " result |= " + op + "(valueEqual) ? 0x8 : 0x0;\n"
+ " result |= " + op + "(gl_HelperInvocation) ? 0x0 : 0x1;\n"
" if (subgroupElect()) result |= 0x2 | 0x10;\n"
: "";
std::ostringstream fragmentSource;
fragmentSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< extensionHeader.c_str()
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout(location = 0) out uint out_color;\n"
<< "layout(set = 0, binding = 0) uniform Buffer1\n"
<< "{\n"
- << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << " " << fmt << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< ""
<< "void main()\n"
@@ -349,42 +366,43 @@
void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
{
- const bool formatIsBoolean =
- VK_FORMAT_R8_USCALED == caseDef.format || VK_FORMAT_R8G8_USCALED == caseDef.format || VK_FORMAT_R8G8B8_USCALED == caseDef.format || VK_FORMAT_R8G8B8A8_USCALED == caseDef.format;
+ const bool formatIsBoolean = fmtIsBoolean(caseDef.format);
const bool arbFunctions = caseDef.opType > OPTYPE_LAST_NON_ARB;
- const string extensionHeader = arbFunctions ?
- "#extension GL_ARB_shader_group_vote: enable\n"
- "#extension GL_KHR_shader_subgroup_basic: enable\n" :
- "#extension GL_KHR_shader_subgroup_vote: enable\n";
+ const string extensionHeader = extHeader(arbFunctions);
+
+ const string op = getOpTypeName(caseDef.opType);
+ const string fmt = subgroups::getFormatNameForGLSL(caseDef.format);
+
if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
{
std::ostringstream src;
const string source =
(OPTYPE_ALL == caseDef.opType || OPTYPE_ALL_ARB == caseDef.opType) ?
- " result = " + getOpTypeName(caseDef.opType) + "(true) ? 0x1 : 0;\n"
- " result |= " + getOpTypeName(caseDef.opType) + "(false) ? 0 : 0x1A;\n"
- " result |= " + getOpTypeName(caseDef.opType) + "(data[gl_SubgroupInvocationID] > 0) ? 0x4 : 0;\n"
+ " result = " + op + "(true) ? 0x1 : 0;\n"
+ " result |= " + op + "(false) ? 0 : 0x1A;\n"
+ " result |= " + op + "(data[gl_SubgroupInvocationID] > 0) ? 0x4 : 0;\n"
: (OPTYPE_ANY == caseDef.opType || OPTYPE_ANY_ARB == caseDef.opType) ?
- " result = " + getOpTypeName(caseDef.opType) + "(true) ? 0x1 : 0;\n"
- " result |= " + getOpTypeName(caseDef.opType) + "(false) ? 0 : 0x1A;\n"
- " result |= " + getOpTypeName(caseDef.opType) + "(data[gl_SubgroupInvocationID] == data[0]) ? 0x4 : 0;\n"
+ " result = " + op + "(true) ? 0x1 : 0;\n"
+ " result |= " + op + "(false) ? 0 : 0x1A;\n"
+ " result |= " + op + "(data[gl_SubgroupInvocationID] == data[0]) ? 0x4 : 0;\n"
: (OPTYPE_ALLEQUAL == caseDef.opType || OPTYPE_ALLEQUAL_ARB == caseDef.opType) ?
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + "(1.25 * float(data[gl_SubgroupInvocationID]) + 5.0);\n"
- " " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueNoEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + (formatIsBoolean ? "(subgroupElect());\n" : "(12.0 * float(data[gl_SubgroupInvocationID]) + offset);\n") +
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueNoEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + (formatIsBoolean ? "(subgroupElect());\n" : "(gl_SubgroupInvocationID);\n") +
" result = " + getOpTypeName(caseDef.opType) + "("
+ subgroups::getFormatNameForGLSL(caseDef.format) + "(1)) ? 0x1 : 0;\n"
" result |= "
- + (formatIsBoolean ? "0x2" : getOpTypeName(caseDef.opType) + "(" + subgroups::getFormatNameForGLSL(caseDef.format) + "(gl_SubgroupInvocationID)) ? 0 : 0x2")
+ + (formatIsBoolean ? "0x2" : op + "(" + fmt + "(gl_SubgroupInvocationID)) ? 0 : 0x2")
+ ";\n"
- " result |= " + getOpTypeName(caseDef.opType) + "(data[0]) ? 0x4 : 0x0;\n"
- " result |= "+ getOpTypeName(caseDef.opType) + "(valueEqual) ? 0x8 : 0x0;\n"
- " result |= "+ getOpTypeName(caseDef.opType) + "(valueNoEqual) ? 0x0 : 0x10;\n"
+ " result |= " + op + "(data[0]) ? 0x4 : 0x0;\n"
+ " result |= " + op + "(valueEqual) ? 0x8 : 0x0;\n"
+ " result |= " + op + "(valueNoEqual) ? 0x0 : 0x10;\n"
" if (subgroupElect()) result |= 0x2 | 0x10;\n"
: "";
src << "#version 450\n"
<< extensionHeader.c_str()
+ << subgroups::getAdditionalExtensionForFormat(caseDef.format)
<< "layout (local_size_x_id = 0, local_size_y_id = 1, "
"local_size_z_id = 2) in;\n"
<< "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
@@ -393,7 +411,7 @@
<< "};\n"
<< "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
<< "{\n"
- << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+ << " " << fmt << " data[];\n"
<< "};\n"
<< "\n"
<< "void main (void)\n"
@@ -414,19 +432,18 @@
{
const string source = stageTestSource(caseDef);
- const string formatString = subgroups::getFormatNameForGLSL(caseDef.format);
-
{
const string vertex =
"#version 450\n"
- + extensionHeader +
+ + extensionHeader
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(set = 0, binding = 0, std430) buffer Buffer1\n"
"{\n"
" uint res[];\n"
"};\n"
"layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
"{\n"
- " " + formatString + " data[];\n"
+ " " + fmt + " data[];\n"
"};\n"
"\n"
"void main (void)\n"
@@ -447,7 +464,8 @@
{
const string tesc =
"#version 450\n"
- + extensionHeader +
+ + extensionHeader
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(vertices=1) out;\n"
"layout(set = 0, binding = 1, std430) buffer Buffer1\n"
"{\n"
@@ -455,7 +473,7 @@
"};\n"
"layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
"{\n"
- " " + formatString + " data[];\n"
+ " " + fmt + " data[];\n"
"};\n"
"\n"
"void main (void)\n"
@@ -479,7 +497,8 @@
{
const string tese =
"#version 450\n"
- + extensionHeader +
+ + extensionHeader
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(isolines) in;\n"
"layout(set = 0, binding = 2, std430) buffer Buffer1\n"
"{\n"
@@ -487,7 +506,7 @@
"};\n"
"layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
"{\n"
- " " + formatString + " data[];\n"
+ " " + fmt + " data[];\n"
"};\n"
"\n"
"void main (void)\n"
@@ -507,7 +526,8 @@
{
const string geometry =
"#version 450\n"
- + extensionHeader +
+ + extensionHeader
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(${TOPOLOGY}) in;\n"
"layout(points, max_vertices = 1) out;\n"
"layout(set = 0, binding = 3, std430) buffer Buffer1\n"
@@ -516,7 +536,7 @@
"};\n"
"layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
"{\n"
- " " + formatString + " data[];\n"
+ " " + fmt + " data[];\n"
"};\n"
"\n"
"void main (void)\n"
@@ -537,33 +557,34 @@
{
const string sourceFragment =
(OPTYPE_ALL == caseDef.opType || OPTYPE_ALL_ARB == caseDef.opType) ?
- " result = " + getOpTypeName(caseDef.opType) + "(true) ? 0x1 : 0;\n"
- " result |= " + getOpTypeName(caseDef.opType) + "(false) ? 0 : 0x1A;\n"
+ " result = " + op + "(true) ? 0x1 : 0;\n"
+ " result |= " + op + "(false) ? 0 : 0x1A;\n"
" result |= 0x4;\n"
: (OPTYPE_ANY == caseDef.opType || OPTYPE_ANY_ARB == caseDef.opType) ?
- " result = " + getOpTypeName(caseDef.opType) + "(true) ? 0x1 : 0;\n"
- " result |= " + getOpTypeName(caseDef.opType) + "(false) ? 0 : 0x1A;\n"
+ " result = " + op + "(true) ? 0x1 : 0;\n"
+ " result |= " + op + "(false) ? 0 : 0x1A;\n"
" result |= 0x4;\n"
: (OPTYPE_ALLEQUAL == caseDef.opType || OPTYPE_ALLEQUAL_ARB == caseDef.opType) ?
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + "(1.25 * float(data[gl_SubgroupInvocationID]) + 5.0);\n" +
- " " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueNoEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + (formatIsBoolean ? "(subgroupElect());\n" : "(12.0 * float(data[gl_SubgroupInvocationID]) + int(gl_FragCoord.x*gl_SubgroupInvocationID));\n") +
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueNoEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + (formatIsBoolean ? "(subgroupElect());\n" : "(gl_SubgroupInvocationID);\n") +
" result = " + getOpTypeName(caseDef.opType) + "("
+ subgroups::getFormatNameForGLSL(caseDef.format) + "(1)) ? 0x1 : 0;\n"
" result |= "
- + (formatIsBoolean ? "0x2" : getOpTypeName(caseDef.opType) + "(" + subgroups::getFormatNameForGLSL(caseDef.format) + "(gl_SubgroupInvocationID)) ? 0 : 0x2")
+ + (formatIsBoolean ? "0x2" : op + "(" + fmt + "(gl_SubgroupInvocationID)) ? 0 : 0x2")
+ ";\n"
- " result |= " + getOpTypeName(caseDef.opType) + "(data[0]) ? 0x4 : 0;\n"
- " result |= " + getOpTypeName(caseDef.opType) + "(valueEqual) ? 0x8 : 0x0;\n"
- " result |= " + getOpTypeName(caseDef.opType) + "(valueNoEqual) ? 0x0 : 0x10;\n"
+ " result |= " + op + "(data[0]) ? 0x4 : 0;\n"
+ " result |= " + op + "(valueEqual) ? 0x8 : 0x0;\n"
+ " result |= " + op + "(valueNoEqual) ? 0x0 : 0x10;\n"
" if (subgroupElect()) result |= 0x2 | 0x10;\n"
: "";
const string fragment =
"#version 450\n"
- + extensionHeader +
+ + extensionHeader
+ + subgroups::getAdditionalExtensionForFormat(caseDef.format) +
"layout(location = 0) out uint result;\n"
"layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
"{\n"
- " " + formatString + " data[];\n"
+ " " + fmt + " data[];\n"
"};\n"
"void main (void)\n"
"{\n"
@@ -588,15 +609,12 @@
TCU_THROW(NotSupportedError, "Device does not support subgroup vote operations");
}
+ if (!subgroups::isFormatSupportedForDevice(context, caseDef.format))
+ TCU_THROW(NotSupportedError, "Device does not support the specified format in subgroup operations");
+
if (caseDef.opType > OPTYPE_LAST_NON_ARB)
{
- context.requireDeviceExtension("VK_EXT_shader_subgroup_vote");
- }
-
- if (subgroups::isDoubleFormat(caseDef.format) &&
- !subgroups::isDoubleSupportedForDevice(context))
- {
- TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
+ context.requireDeviceFunctionality("VK_EXT_shader_subgroup_vote");
}
*caseDef.geometryPointSizeSupported = subgroups::isTessellationAndGeometryPointSizeSupported(context);
@@ -623,7 +641,7 @@
if (caseDef.opType > OPTYPE_LAST_NON_ARB)
{
- context.requireDeviceExtension("VK_EXT_shader_subgroup_vote");
+ context.requireDeviceFunctionality("VK_EXT_shader_subgroup_vote");
}
subgroups::SSBOData inputData;
@@ -739,20 +757,9 @@
VK_SHADER_STAGE_GEOMETRY_BIT,
};
- const VkFormat formats[] =
- {
- VK_FORMAT_R32_SINT, VK_FORMAT_R32G32_SINT, VK_FORMAT_R32G32B32_SINT,
- VK_FORMAT_R32G32B32A32_SINT, VK_FORMAT_R32_UINT, VK_FORMAT_R32G32_UINT,
- VK_FORMAT_R32G32B32_UINT, VK_FORMAT_R32G32B32A32_UINT,
- VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32G32_SFLOAT,
- VK_FORMAT_R32G32B32_SFLOAT, VK_FORMAT_R32G32B32A32_SFLOAT,
- VK_FORMAT_R64_SFLOAT, VK_FORMAT_R64G64_SFLOAT,
- VK_FORMAT_R64G64B64_SFLOAT, VK_FORMAT_R64G64B64A64_SFLOAT,
- VK_FORMAT_R8_USCALED, VK_FORMAT_R8G8_USCALED,
- VK_FORMAT_R8G8B8_USCALED, VK_FORMAT_R8G8B8A8_USCALED,
- };
+ const std::vector<VkFormat> formats = subgroups::getAllFormats();
- for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
+ for (size_t formatIndex = 0; formatIndex < formats.size(); ++formatIndex)
{
const VkFormat format = formats[formatIndex];
const deBool formatIsNotVector = VK_FORMAT_R8_USCALED == format || VK_FORMAT_R32_UINT == format ||
diff --git a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationBasicSemaphoreTests.cpp b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationBasicSemaphoreTests.cpp
index 339583f..208e9a4 100644
--- a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationBasicSemaphoreTests.cpp
+++ b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationBasicSemaphoreTests.cpp
@@ -24,6 +24,7 @@
#include "vktSynchronizationBasicSemaphoreTests.hpp"
#include "vktTestCaseUtil.hpp"
#include "vktSynchronizationUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkDefs.hpp"
#include "vkPlatform.hpp"
@@ -33,6 +34,8 @@
#include "vkRef.hpp"
+#include "tcuCommandLine.hpp"
+
namespace vkt
{
namespace synchronization
@@ -44,8 +47,8 @@
struct TestConfig
{
- bool useTypeCreate;
- VkSemaphoreTypeKHR semaphoreType;
+ bool useTypeCreate;
+ VkSemaphoreType semaphoreType;
};
static const int basicChainLength = 32768;
@@ -80,18 +83,18 @@
};
const VkPipelineStageFlags stageBits[] = { VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT };
const deUint64 timelineValue = 1u;
- const VkTimelineSemaphoreSubmitInfoKHR timelineWaitInfo =
+ const VkTimelineSemaphoreSubmitInfo timelineWaitInfo =
{
- VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
1u, // deUint32 waitSemaphoreValueCount
&timelineValue, // const deUint64* pWaitSemaphoreValues
0u, // deUint32 signalSemaphoreValueCount
DE_NULL, // const deUint64* pSignalSemaphoreValues
};
- const VkTimelineSemaphoreSubmitInfoKHR timelineSignalInfo =
+ const VkTimelineSemaphoreSubmitInfo timelineSignalInfo =
{
- VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
0u, // deUint32 waitSemaphoreValueCount
DE_NULL, // const deUint64* pWaitSemaphoreValues
@@ -193,7 +196,7 @@
const VkDevice& device = context.getDevice();
const VkQueue queue = context.getUniversalQueue();
VkPipelineStageFlags flags = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
- VkSemaphoreTypeCreateInfoKHR scti = { VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR, DE_NULL, VK_SEMAPHORE_TYPE_TIMELINE_KHR, 0 };
+ VkSemaphoreTypeCreateInfo scti = { VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR, DE_NULL, VK_SEMAPHORE_TYPE_TIMELINE_KHR, 0 };
VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, &scti, 0 };
VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, DE_NULL, 0 };
VkSemaphore semaphore;
@@ -206,11 +209,11 @@
for (int i = 0; err == VK_SUCCESS && i < basicChainLength; i++)
{
- deUint64 waitValue = i;
- deUint64 signalValue = i + 1;
- VkTimelineSemaphoreSubmitInfoKHR tsi =
+ deUint64 waitValue = i;
+ deUint64 signalValue = i + 1;
+ VkTimelineSemaphoreSubmitInfo tsi =
{
- VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
i == 0 ? 0u : 1u, // deUint32 waitSemaphoreValueCount
&waitValue, // const deUint64* pWaitSemaphoreValues
@@ -234,10 +237,10 @@
VK_CHECK(vk.createFence(device, &fci, DE_NULL, &fence));
- deUint64 waitValue = basicChainLength;
- VkTimelineSemaphoreSubmitInfoKHR tsi =
+ deUint64 waitValue = basicChainLength;
+ VkTimelineSemaphoreSubmitInfo tsi =
{
- VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
1u, // deUint32 waitSemaphoreValueCount
&waitValue, // const deUint64* pWaitSemaphoreValues
@@ -307,7 +310,7 @@
Move<VkCommandBuffer> cmdBuffer[COUNT];
const VkPipelineStageFlags stageBits[] = { VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT };
VkSubmitInfo submitInfo[COUNT];
- VkTimelineSemaphoreSubmitInfoKHR timelineSubmitInfo[COUNT];
+ VkTimelineSemaphoreSubmitInfo timelineSubmitInfo[COUNT];
deUint64 timelineValues[COUNT];
Move<VkFence> fence[COUNT];
@@ -359,7 +362,7 @@
deviceInfo.queueCreateInfoCount = (queues[FIRST].queueFamilyIndex == queues[SECOND].queueFamilyIndex) ? 1 : COUNT;
deviceInfo.pQueueCreateInfos = queueInfos;
- logicalDevice = vk::createDevice(context.getPlatformInterface(), context.getInstance(), instance, physicalDevice, &deviceInfo);
+ logicalDevice = createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), context.getPlatformInterface(), context.getInstance(), instance, physicalDevice, &deviceInfo);
for (deUint32 queueReqNdx = 0; queueReqNdx < COUNT; ++queueReqNdx)
{
@@ -377,7 +380,7 @@
timelineValues[FIRST] = 1ull;
- timelineSubmitInfo[FIRST].sType = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR;
+ timelineSubmitInfo[FIRST].sType = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO;
timelineSubmitInfo[FIRST].pNext = DE_NULL;
timelineSubmitInfo[FIRST].waitSemaphoreValueCount = 0;
timelineSubmitInfo[FIRST].pWaitSemaphoreValues = DE_NULL;
@@ -396,7 +399,7 @@
timelineValues[SECOND] = 2ull;
- timelineSubmitInfo[SECOND].sType = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR;
+ timelineSubmitInfo[SECOND].sType = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO;
timelineSubmitInfo[SECOND].pNext = DE_NULL;
timelineSubmitInfo[SECOND].waitSemaphoreValueCount = 1;
timelineSubmitInfo[SECOND].pWaitSemaphoreValues = &timelineValues[FIRST];
diff --git a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationCrossInstanceSharingTests.cpp b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationCrossInstanceSharingTests.cpp
index 8afee99..4ebfbf6 100644
--- a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationCrossInstanceSharingTests.cpp
+++ b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationCrossInstanceSharingTests.cpp
@@ -35,11 +35,13 @@
#include "vktSynchronizationOperationResources.hpp"
#include "vktExternalMemoryUtil.hpp"
#include "vktTestGroupUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "deRandom.hpp"
#include "tcuResultCollector.hpp"
#include "tcuTestLog.hpp"
+#include "tcuCommandLine.hpp"
using tcu::TestLog;
using namespace vkt::ExternalMemoryUtil;
@@ -56,7 +58,7 @@
struct TestConfig
{
TestConfig (const ResourceDescription& resource_,
- vk::VkSemaphoreTypeKHR semaphoreType_,
+ vk::VkSemaphoreType semaphoreType_,
OperationName writeOp_,
OperationName readOp_,
vk::VkExternalMemoryHandleTypeFlagBits memoryHandleType_,
@@ -73,7 +75,7 @@
}
const ResourceDescription resource;
- const vk::VkSemaphoreTypeKHR semaphoreType;
+ const vk::VkSemaphoreType semaphoreType;
const OperationName writeOp;
const OperationName readOp;
const vk::VkExternalMemoryHandleTypeFlagBits memoryHandleType;
@@ -93,29 +95,29 @@
: m_context (context)
{
// Check instance support
- requireInstanceExtension("VK_KHR_get_physical_device_properties2");
+ m_context.requireInstanceFunctionality("VK_KHR_get_physical_device_properties2");
- requireInstanceExtension("VK_KHR_external_semaphore_capabilities");
- requireInstanceExtension("VK_KHR_external_memory_capabilities");
+ m_context.requireInstanceFunctionality("VK_KHR_external_semaphore_capabilities");
+ m_context.requireInstanceFunctionality("VK_KHR_external_memory_capabilities");
// Check device support
if (config.dedicated)
- requireDeviceExtension("VK_KHR_dedicated_allocation");
+ m_context.requireDeviceFunctionality("VK_KHR_dedicated_allocation");
- requireDeviceExtension("VK_KHR_external_semaphore");
- requireDeviceExtension("VK_KHR_external_memory");
+ m_context.requireDeviceFunctionality("VK_KHR_external_semaphore");
+ m_context.requireDeviceFunctionality("VK_KHR_external_memory");
if (config.semaphoreType == vk::VK_SEMAPHORE_TYPE_TIMELINE_KHR)
{
- requireDeviceExtension("VK_KHR_timeline_semaphore");
+ m_context.requireDeviceFunctionality("VK_KHR_timeline_semaphore");
}
if (config.memoryHandleType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR
|| config.semaphoreHandleType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT_KHR
|| config.semaphoreHandleType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR)
{
- requireDeviceExtension("VK_KHR_external_semaphore_fd");
- requireDeviceExtension("VK_KHR_external_memory_fd");
+ m_context.requireDeviceFunctionality("VK_KHR_external_semaphore_fd");
+ m_context.requireDeviceFunctionality("VK_KHR_external_memory_fd");
}
if (config.memoryHandleType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR
@@ -123,8 +125,8 @@
|| config.semaphoreHandleType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR
|| config.semaphoreHandleType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR)
{
- requireDeviceExtension("VK_KHR_external_semaphore_win32");
- requireDeviceExtension("VK_KHR_external_memory_win32");
+ m_context.requireDeviceFunctionality("VK_KHR_external_semaphore_win32");
+ m_context.requireDeviceFunctionality("VK_KHR_external_memory_win32");
}
TestLog& log = context.getTestContext().getLog();
@@ -258,17 +260,6 @@
}
private:
- void requireDeviceExtension(const char* name) const
- {
- if (!de::contains(m_context.getDeviceExtensions().begin(), m_context.getDeviceExtensions().end(), name))
- TCU_THROW(NotSupportedError, (std::string(name) + " is not supported").c_str());
- }
-
- void requireInstanceExtension(const char* name) const
- {
- if (!de::contains(m_context.getInstanceExtensions().begin(), m_context.getInstanceExtensions().end(), name))
- TCU_THROW(NotSupportedError, (std::string(name) + " is not supported").c_str());
- }
const Context& m_context;
};
@@ -308,150 +299,50 @@
m_vkd.freeMemory(m_device, getMemory(), DE_NULL);
}
-class DeviceId
+CustomInstance createTestInstance (Context& context)
{
-public:
- DeviceId (deUint32 vendorId,
- deUint32 driverVersion,
- const deUint8 driverUUID[VK_UUID_SIZE],
- const deUint8 deviceUUID[VK_UUID_SIZE]);
+ std::vector<std::string> extensions;
+ extensions.push_back("VK_KHR_get_physical_device_properties2");
+ extensions.push_back("VK_KHR_external_semaphore_capabilities");
+ extensions.push_back("VK_KHR_external_memory_capabilities");
- bool operator== (const DeviceId& other) const;
- bool operator|= (const DeviceId& other) const;
-
-private:
- const deUint32 m_vendorId;
- const deUint32 m_driverVersion;
- deUint8 m_driverUUID[VK_UUID_SIZE];
- deUint8 m_deviceUUID[VK_UUID_SIZE];
-};
-
-DeviceId::DeviceId (deUint32 vendorId,
- deUint32 driverVersion,
- const deUint8 driverUUID[VK_UUID_SIZE],
- const deUint8 deviceUUID[VK_UUID_SIZE])
- : m_vendorId (vendorId)
- , m_driverVersion (driverVersion)
-{
- deMemcpy(m_driverUUID, driverUUID, sizeof(m_driverUUID));
- deMemcpy(m_deviceUUID, deviceUUID, sizeof(m_deviceUUID));
+ return createCustomInstanceWithExtensions(context, extensions);
}
-bool DeviceId::operator== (const DeviceId& other) const
+vk::Move<vk::VkDevice> createTestDevice (const Context& context,
+ const vk::PlatformInterface& vkp,
+ vk::VkInstance instance,
+ const vk::InstanceInterface& vki,
+ const vk::VkPhysicalDevice physicalDevice)
{
- if (this == &other)
- return true;
-
- if (m_vendorId != other.m_vendorId)
- return false;
-
- if (m_driverVersion != other.m_driverVersion)
- return false;
-
- if (deMemCmp(m_driverUUID, other.m_driverUUID, sizeof(m_driverUUID)) != 0)
- return false;
-
- return deMemCmp(m_deviceUUID, other.m_deviceUUID, sizeof(m_deviceUUID)) == 0;
-}
-
-DeviceId getDeviceId (const vk::InstanceInterface& vki,
- vk::VkPhysicalDevice physicalDevice)
-{
- vk::VkPhysicalDeviceIDProperties propertiesId;
- vk::VkPhysicalDeviceProperties2 properties;
-
- deMemset(&properties, 0, sizeof(properties));
- deMemset(&propertiesId, 0, sizeof(propertiesId));
-
- propertiesId.sType = vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES;
-
- properties.sType = vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
- properties.pNext = &propertiesId;
-
- vki.getPhysicalDeviceProperties2(physicalDevice, &properties);
-
- return DeviceId(properties.properties.vendorID, properties.properties.driverVersion, propertiesId.driverUUID, propertiesId.deviceUUID);
-}
-
-vk::Move<vk::VkInstance> createInstance (const vk::PlatformInterface& vkp, deUint32 version)
-{
- try
- {
- std::vector<std::string> extensions;
- if (!vk::isCoreInstanceExtension(version, "VK_KHR_get_physical_device_properties2"))
- extensions.push_back("VK_KHR_get_physical_device_properties2");
- if (!vk::isCoreInstanceExtension(version, "VK_KHR_external_semaphore_capabilities"))
- extensions.push_back("VK_KHR_external_semaphore_capabilities");
- if (!vk::isCoreInstanceExtension(version, "VK_KHR_external_memory_capabilities"))
- extensions.push_back("VK_KHR_external_memory_capabilities");
-
- return vk::createDefaultInstance(vkp, version, std::vector<std::string>(), extensions);
- }
- catch (const vk::Error& error)
- {
- if (error.getError() == vk::VK_ERROR_EXTENSION_NOT_PRESENT)
- TCU_THROW(NotSupportedError, "Required external memory extensions not supported by the instance");
- else
- throw;
- }
-}
-
-vk::VkPhysicalDevice getPhysicalDevice (const vk::InstanceInterface& vki,
- vk::VkInstance instance,
- const tcu::CommandLine& cmdLine)
-{
- return vk::chooseDevice(vki, instance, cmdLine);
-}
-
-vk::VkPhysicalDevice getPhysicalDevice (const vk::InstanceInterface& vki, vk::VkInstance instance, const DeviceId& deviceId)
-{
- const std::vector<vk::VkPhysicalDevice> devices (vk::enumeratePhysicalDevices(vki, instance));
-
- for (size_t deviceNdx = 0; deviceNdx < devices.size(); deviceNdx++)
- {
- if (deviceId == getDeviceId(vki, devices[deviceNdx]))
- return devices[deviceNdx];
- }
-
- TCU_FAIL("No matching device found");
-
- return (vk::VkPhysicalDevice)0;
-}
-
-vk::Move<vk::VkDevice> createDevice (const Context& context,
- const vk::PlatformInterface& vkp,
- vk::VkInstance instance,
- const vk::InstanceInterface& vki,
- const vk::VkPhysicalDevice physicalDevice,
- bool timelineSemaphores)
-{
+ const bool validationEnabled = context.getTestContext().getCommandLine().isValidationEnabled();
const float priority = 0.0f;
const std::vector<vk::VkQueueFamilyProperties> queueFamilyProperties = vk::getPhysicalDeviceQueueFamilyProperties(vki, physicalDevice);
std::vector<deUint32> queueFamilyIndices (queueFamilyProperties.size(), 0xFFFFFFFFu);
std::vector<const char*> extensions;
- if (isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_dedicated_allocation"))
+ if (context.isDeviceFunctionalitySupported("VK_KHR_dedicated_allocation"))
extensions.push_back("VK_KHR_dedicated_allocation");
- if (isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_get_memory_requirements2"))
+ if (context.isDeviceFunctionalitySupported("VK_KHR_get_memory_requirements2"))
extensions.push_back("VK_KHR_get_memory_requirements2");
- if (isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_external_semaphore"))
+ if (context.isDeviceFunctionalitySupported("VK_KHR_external_semaphore"))
extensions.push_back("VK_KHR_external_semaphore");
- if (isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_external_memory"))
+ if (context.isDeviceFunctionalitySupported("VK_KHR_external_memory"))
extensions.push_back("VK_KHR_external_memory");
- if (isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_external_semaphore_fd"))
+ if (context.isDeviceFunctionalitySupported("VK_KHR_external_semaphore_fd"))
extensions.push_back("VK_KHR_external_semaphore_fd");
- if (isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_external_memory_fd"))
+ if (context.isDeviceFunctionalitySupported("VK_KHR_external_memory_fd"))
extensions.push_back("VK_KHR_external_memory_fd");
- if (isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_external_semaphore_win32"))
+ if (context.isDeviceFunctionalitySupported("VK_KHR_external_semaphore_win32"))
extensions.push_back("VK_KHR_external_semaphore_win32");
- if (isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_external_memory_win32"))
+ if (context.isDeviceFunctionalitySupported("VK_KHR_external_memory_win32"))
extensions.push_back("VK_KHR_external_memory_win32");
- if (timelineSemaphores)
+ if (context.isDeviceFunctionalitySupported("VK_KHR_timeline_semaphore"))
extensions.push_back("VK_KHR_timeline_semaphore");
try
@@ -497,7 +388,7 @@
0u
};
- return vk::createDevice(vkp, instance, vki, physicalDevice, &createInfo);
+ return vkt::createCustomDevice(validationEnabled, vkp, instance, vki, physicalDevice, &createInfo);
}
catch (const vk::Error& error)
{
@@ -511,34 +402,87 @@
// Class to wrap a singleton instance and device
class InstanceAndDevice
{
+ InstanceAndDevice (Context& context)
+ : m_instance (createTestInstance(context))
+ , m_vki (m_instance.getDriver())
+ , m_physicalDevice (vk::chooseDevice(m_vki, m_instance, context.getTestContext().getCommandLine()))
+ , m_logicalDevice (createTestDevice(context, context.getPlatformInterface(), m_instance, m_vki, m_physicalDevice))
+ {
+ }
+
public:
- InstanceAndDevice (const Context& context,
- const TestConfig& config)
- : m_instance (createInstance(context.getPlatformInterface(), context.getUsedApiVersion()))
- , m_vki (context.getPlatformInterface(), *m_instance)
- , m_physicalDevice (getPhysicalDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
- , m_logicalDevice (createDevice(context, context.getPlatformInterface(), *m_instance, m_vki, m_physicalDevice, config.semaphoreType == vk::VK_SEMAPHORE_TYPE_TIMELINE_KHR))
+ static vk::VkInstance getInstanceA(Context& context)
{
- }
+ if (!m_instanceA)
+ m_instanceA = SharedPtr<InstanceAndDevice>(new InstanceAndDevice(context));
- const vk::Unique<vk::VkInstance>& getInstance()
- {
- return m_instance;
+ return m_instanceA->m_instance;
}
-
- const Unique<vk::VkDevice>& getDevice()
+ static vk::VkInstance getInstanceB(Context& context)
{
- DE_ASSERT(m_instance);
- return m_logicalDevice;
+ if (!m_instanceB)
+ m_instanceB = SharedPtr<InstanceAndDevice>(new InstanceAndDevice(context));
+
+ return m_instanceB->m_instance;
+ }
+ static const vk::InstanceDriver& getDriverA()
+ {
+ DE_ASSERT(m_instanceA);
+ return m_instanceA->m_instance.getDriver();
+ }
+ static const vk::InstanceDriver& getDriverB()
+ {
+ DE_ASSERT(m_instanceB);
+ return m_instanceB->m_instance.getDriver();
+ }
+ static vk::VkPhysicalDevice getPhysicalDeviceA()
+ {
+ DE_ASSERT(m_instanceA);
+ return m_instanceA->m_physicalDevice;
+ }
+ static vk::VkPhysicalDevice getPhysicalDeviceB()
+ {
+ DE_ASSERT(m_instanceB);
+ return m_instanceB->m_physicalDevice;
+ }
+ static const Unique<vk::VkDevice>& getDeviceA()
+ {
+ DE_ASSERT(m_instanceA);
+ return m_instanceA->m_logicalDevice;
+ }
+ static const Unique<vk::VkDevice>& getDeviceB()
+ {
+ DE_ASSERT(m_instanceB);
+ return m_instanceB->m_logicalDevice;
+ }
+ static void collectMessagesA()
+ {
+ DE_ASSERT(m_instanceA);
+ m_instanceA->m_instance.collectMessages();
+ }
+ static void collectMessagesB()
+ {
+ DE_ASSERT(m_instanceB);
+ m_instanceB->m_instance.collectMessages();
+ }
+ static void destroy()
+ {
+ m_instanceA.clear();
+ m_instanceB.clear();
}
private:
- const Unique<vk::VkInstance> m_instance;
- const vk::InstanceDriver m_vki;
+ CustomInstance m_instance;
+ const vk::InstanceDriver& m_vki;
const vk::VkPhysicalDevice m_physicalDevice;
const Unique<vk::VkDevice> m_logicalDevice;
+
+ static SharedPtr<InstanceAndDevice> m_instanceA;
+ static SharedPtr<InstanceAndDevice> m_instanceB;
};
+SharedPtr<InstanceAndDevice> InstanceAndDevice::m_instanceA;
+SharedPtr<InstanceAndDevice> InstanceAndDevice::m_instanceB;
vk::VkQueue getQueue (const vk::DeviceInterface& vkd,
@@ -1055,29 +999,25 @@
const de::UniquePtr<OperationSupport> m_supportReadOp;
const NotSupportedChecker m_notSupportedChecker; // Must declare before VkInstance to effectively reduce runtimes!
- InstanceAndDevice m_instanceAndDeviceA;
- const vk::Unique<vk::VkInstance>& m_instanceA;
+ const bool m_getMemReq2Supported;
- const vk::InstanceDriver m_vkiA;
+ const vk::VkInstance m_instanceA;
+ const vk::InstanceDriver& m_vkiA;
const vk::VkPhysicalDevice m_physicalDeviceA;
const std::vector<vk::VkQueueFamilyProperties> m_queueFamiliesA;
const std::vector<deUint32> m_queueFamilyIndicesA;
-
- const bool m_getMemReq2Supported;
-
const vk::Unique<vk::VkDevice>& m_deviceA;
const vk::DeviceDriver m_vkdA;
- InstanceAndDevice m_instanceAndDeviceB;
- const vk::Unique<vk::VkInstance>& m_instanceB;
- const vk::InstanceDriver m_vkiB;
+ const vk::VkInstance m_instanceB;
+ const vk::InstanceDriver& m_vkiB;
const vk::VkPhysicalDevice m_physicalDeviceB;
const std::vector<vk::VkQueueFamilyProperties> m_queueFamiliesB;
const std::vector<deUint32> m_queueFamilyIndicesB;
const vk::Unique<vk::VkDevice>& m_deviceB;
const vk::DeviceDriver m_vkdB;
- const vk::VkExternalSemaphoreHandleTypeFlagBits m_semaphoreHandleType;
+ const vk::VkExternalSemaphoreHandleTypeFlagBits m_semaphoreHandleType;
const vk::VkExternalMemoryHandleTypeFlagBits m_memoryHandleType;
// \todo Should this be moved to the group same way as in the other tests?
@@ -1094,27 +1034,23 @@
, m_supportWriteOp (makeOperationSupport(config.writeOp, config.resource))
, m_supportReadOp (makeOperationSupport(config.readOp, config.resource))
, m_notSupportedChecker (context, m_config, *m_supportWriteOp, *m_supportReadOp)
+ , m_getMemReq2Supported (context.isDeviceFunctionalitySupported("VK_KHR_get_memory_requirements2"))
- , m_instanceAndDeviceA (context, config)
- , m_instanceA (m_instanceAndDeviceA.getInstance())
-
- , m_vkiA (context.getPlatformInterface(), *m_instanceA) // \todo [2017-06-13 pyry] Provide correct extension list
- , m_physicalDeviceA (getPhysicalDevice(m_vkiA, *m_instanceA, context.getTestContext().getCommandLine()))
+ , m_instanceA (InstanceAndDevice::getInstanceA(context))
+ , m_vkiA (InstanceAndDevice::getDriverA())
+ , m_physicalDeviceA (InstanceAndDevice::getPhysicalDeviceA())
, m_queueFamiliesA (vk::getPhysicalDeviceQueueFamilyProperties(m_vkiA, m_physicalDeviceA))
, m_queueFamilyIndicesA (getFamilyIndices(m_queueFamiliesA))
- , m_getMemReq2Supported (vk::isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_get_memory_requirements2"))
- , m_deviceA (m_instanceAndDeviceA.getDevice())
- , m_vkdA (context.getPlatformInterface(), *m_instanceA, *m_deviceA)
+ , m_deviceA (InstanceAndDevice::getDeviceA())
+ , m_vkdA (context.getPlatformInterface(), m_instanceA, *m_deviceA)
- , m_instanceAndDeviceB (context, config)
- , m_instanceB (m_instanceAndDeviceB.getInstance())
-
- , m_vkiB (context.getPlatformInterface(), *m_instanceB) // \todo [2017-06-13 pyry] Provide correct extension list
- , m_physicalDeviceB (getPhysicalDevice(m_vkiB, *m_instanceB, getDeviceId(m_vkiA, m_physicalDeviceA)))
+ , m_instanceB (InstanceAndDevice::getInstanceB(context))
+ , m_vkiB (InstanceAndDevice::getDriverB())
+ , m_physicalDeviceB (InstanceAndDevice::getPhysicalDeviceB())
, m_queueFamiliesB (vk::getPhysicalDeviceQueueFamilyProperties(m_vkiB, m_physicalDeviceB))
, m_queueFamilyIndicesB (getFamilyIndices(m_queueFamiliesB))
- , m_deviceB (m_instanceAndDeviceB.getDevice())
- , m_vkdB (context.getPlatformInterface(), *m_instanceB, *m_deviceB)
+ , m_deviceB (InstanceAndDevice::getDeviceB())
+ , m_vkdB (context.getPlatformInterface(), m_instanceB, *m_deviceB)
, m_semaphoreHandleType (m_config.semaphoreHandleType)
, m_memoryHandleType (m_config.memoryHandleType)
@@ -1134,20 +1070,20 @@
const deUint32 queueFamilyA = (deUint32)m_queueANdx;
const deUint32 queueFamilyB = (deUint32)m_queueBNdx;
- const tcu::ScopedLogSection queuePairSection (log,
+ const tcu::ScopedLogSection queuePairSection (log,
"WriteQueue-" + de::toString(queueFamilyA) + "-ReadQueue-" + de::toString(queueFamilyB),
"WriteQueue-" + de::toString(queueFamilyA) + "-ReadQueue-" + de::toString(queueFamilyB));
- const vk::Unique<vk::VkSemaphore> semaphoreA (createExportableSemaphoreType(m_vkdA, *m_deviceA, m_config.semaphoreType, m_semaphoreHandleType));
- const vk::Unique<vk::VkSemaphore> semaphoreB (createSemaphoreType(m_vkdB, *m_deviceB, m_config.semaphoreType));
+ const vk::Unique<vk::VkSemaphore> semaphoreA (createExportableSemaphoreType(m_vkdA, *m_deviceA, m_config.semaphoreType, m_semaphoreHandleType));
+ const vk::Unique<vk::VkSemaphore> semaphoreB (createSemaphoreType(m_vkdB, *m_deviceB, m_config.semaphoreType));
- deUint32 exportedMemoryTypeIndex = ~0U;
- const de::UniquePtr<Resource> resourceA (createResource(m_vkdA, *m_deviceA, m_config.resource, m_queueFamilyIndicesA, *m_supportReadOp, *m_supportWriteOp, m_memoryHandleType, exportedMemoryTypeIndex, m_config.dedicated, m_getMemReq2Supported));
+ deUint32 exportedMemoryTypeIndex = ~0U;
+ const de::UniquePtr<Resource> resourceA (createResource(m_vkdA, *m_deviceA, m_config.resource, m_queueFamilyIndicesA, *m_supportReadOp, *m_supportWriteOp, m_memoryHandleType, exportedMemoryTypeIndex, m_config.dedicated, m_getMemReq2Supported));
- NativeHandle nativeMemoryHandle;
- getMemoryNative(m_vkdA, *m_deviceA, resourceA->getMemory(), m_memoryHandleType, nativeMemoryHandle);
+ NativeHandle nativeMemoryHandle;
+ getMemoryNative(m_vkdA, *m_deviceA, resourceA->getMemory(), m_memoryHandleType, nativeMemoryHandle);
- const de::UniquePtr<Resource> resourceB (importResource(m_vkdB, *m_deviceB, m_config.resource, m_queueFamilyIndicesB, *m_supportReadOp, *m_supportWriteOp, nativeMemoryHandle, m_memoryHandleType, exportedMemoryTypeIndex, m_config.dedicated));
+ const de::UniquePtr<Resource> resourceB (importResource(m_vkdB, *m_deviceB, m_config.resource, m_queueFamilyIndicesB, *m_supportReadOp, *m_supportWriteOp, nativeMemoryHandle, m_memoryHandleType, exportedMemoryTypeIndex, m_config.dedicated));
const vk::VkQueue queueA (getQueue(m_vkdA, *m_deviceA, queueFamilyA));
@@ -1155,7 +1091,7 @@
const vk::Unique<vk::VkCommandBuffer> commandBufferA (createCommandBuffer(m_vkdA, *m_deviceA, *commandPoolA));
vk::SimpleAllocator allocatorA (m_vkdA, *m_deviceA, vk::getPhysicalDeviceMemoryProperties(m_vkiA, m_physicalDeviceA));
const std::vector<std::string> deviceExtensionsA;
- OperationContext operationContextA (m_context.getUsedApiVersion(), m_vkiA, m_vkdA, m_physicalDeviceA, *m_deviceA, allocatorA, deviceExtensionsA, m_context.getBinaryCollection(), m_pipelineCacheData);
+ OperationContext operationContextA (m_context, m_vkiA, m_vkdA, m_physicalDeviceA, *m_deviceA, allocatorA, deviceExtensionsA, m_context.getBinaryCollection(), m_pipelineCacheData);
if (!checkQueueFlags(m_queueFamiliesA[m_queueANdx].queueFlags , m_supportWriteOp->getQueueFlags(operationContextA)))
TCU_THROW(NotSupportedError, "Operation not supported by the source queue");
@@ -1165,7 +1101,7 @@
const vk::Unique<vk::VkCommandBuffer> commandBufferB (createCommandBuffer(m_vkdB, *m_deviceB, *commandPoolB));
vk::SimpleAllocator allocatorB (m_vkdB, *m_deviceB, vk::getPhysicalDeviceMemoryProperties(m_vkiB, m_physicalDeviceB));
const std::vector<std::string> deviceExtensionsB;
- OperationContext operationContextB (m_context.getUsedApiVersion(), m_vkiB, m_vkdB, m_physicalDeviceB, *m_deviceB, allocatorB, deviceExtensionsB, m_context.getBinaryCollection(), m_pipelineCacheData);
+ OperationContext operationContextB (m_context, m_vkiB, m_vkdB, m_physicalDeviceB, *m_deviceB, allocatorB, deviceExtensionsB, m_context.getBinaryCollection(), m_pipelineCacheData);
if (!checkQueueFlags(m_queueFamiliesB[m_queueBNdx].queueFlags , m_supportReadOp->getQueueFlags(operationContextB)))
TCU_THROW(NotSupportedError, "Operation not supported by the destination queue");
@@ -1191,9 +1127,9 @@
const deUint64 timelineValue = rng.getInt(1, deIntMaxValue32(32));
const vk::VkCommandBuffer commandBuffer = *commandBufferA;
const vk::VkSemaphore semaphore = *semaphoreA;
- const vk::VkTimelineSemaphoreSubmitInfoKHR semaphoreSubmitInfo =
+ const vk::VkTimelineSemaphoreSubmitInfo semaphoreSubmitInfo =
{
- vk::VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR, // VkStructureType sType;
+ vk::VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
0u, // deUint32 waitSemaphoreValueCount
DE_NULL, // const deUint64* pWaitSemaphoreValues
@@ -1227,9 +1163,9 @@
const vk::VkCommandBuffer commandBuffer = *commandBufferB;
const vk::VkSemaphore semaphore = *semaphoreB;
const vk::VkPipelineStageFlags dstStage = readSync.stageMask;
- const vk::VkTimelineSemaphoreSubmitInfoKHR semaphoreSubmitInfo =
+ const vk::VkTimelineSemaphoreSubmitInfo semaphoreSubmitInfo =
{
- vk::VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR, // VkStructureType sType;
+ vk::VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
1u, // deUint32 waitSemaphoreValueCount
&timelineValue, // const deUint64* pWaitSemaphoreValues
@@ -1262,8 +1198,8 @@
deUint64 valueA;
deUint64 valueB;
- VK_CHECK(m_vkdA.getSemaphoreCounterValueKHR(*m_deviceA, *semaphoreA, &valueA));
- VK_CHECK(m_vkdB.getSemaphoreCounterValueKHR(*m_deviceB, *semaphoreB, &valueB));
+ VK_CHECK(m_vkdA.getSemaphoreCounterValue(*m_deviceA, *semaphoreA, &valueA));
+ VK_CHECK(m_vkdB.getSemaphoreCounterValue(*m_deviceB, *semaphoreB, &valueB));
if (valueA != valueB)
return tcu::TestStatus::fail("Inconsistent values between shared semaphores");
@@ -1345,6 +1281,10 @@
m_resultCollector.fail(std::string("Exception: ") + error.getMessage());
}
+ // Collect possible validation errors.
+ InstanceAndDevice::collectMessagesA();
+ InstanceAndDevice::collectMessagesB();
+
// Move to next queue
{
m_queueBNdx++;
@@ -1415,7 +1355,7 @@
},
};
- const std::string semaphoreNames[vk::VK_SEMAPHORE_TYPE_KHR_LAST] =
+ const std::string semaphoreNames[vk::VK_SEMAPHORE_TYPE_LAST] =
{
"_binary_semaphore",
"_timeline_semaphore",
@@ -1442,11 +1382,11 @@
for (size_t caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(cases); caseNdx++)
{
- for (int semaphoreType = 0; semaphoreType < vk::VK_SEMAPHORE_TYPE_KHR_LAST; semaphoreType++)
+ for (int semaphoreType = 0; semaphoreType < vk::VK_SEMAPHORE_TYPE_LAST; semaphoreType++)
{
if (isResourceSupported(writeOp, resource) && isResourceSupported(readOp, resource))
{
- const TestConfig config (resource, (vk::VkSemaphoreTypeKHR)semaphoreType, writeOp, readOp, cases[caseNdx].memoryType, cases[caseNdx].semaphoreType, dedicated);
+ const TestConfig config (resource, (vk::VkSemaphoreType)semaphoreType, writeOp, readOp, cases[caseNdx].memoryType, cases[caseNdx].semaphoreType, dedicated);
std::string name = getResourceName(resource) + semaphoreNames[semaphoreType] + cases[caseNdx].nameSuffix;
opGroup->addChild(new InstanceFactory1<SharingTestInstance, TestConfig, Progs>(testCtx, tcu::NODETYPE_SELF_VALIDATE, name, "", Progs(), config));
@@ -1468,7 +1408,7 @@
{
DE_UNREF(group);
// Destroy singleton object
-
+ InstanceAndDevice::destroy();
}
tcu::TestCaseGroup* createCrossInstanceSharingTest (tcu::TestContext& testCtx)
diff --git a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationInternallySynchronizedObjectsTests.cpp b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationInternallySynchronizedObjectsTests.cpp
index 23fb228..687ef30 100644
--- a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationInternallySynchronizedObjectsTests.cpp
+++ b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationInternallySynchronizedObjectsTests.cpp
@@ -24,6 +24,7 @@
#include "vktSynchronizationInternallySynchronizedObjectsTests.hpp"
#include "vktTestCaseUtil.hpp"
#include "vktSynchronizationUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkRef.hpp"
#include "tcuDefs.hpp"
@@ -36,6 +37,7 @@
#include "vkObjUtil.hpp"
#include "tcuResultCollector.hpp"
+#include "tcuCommandLine.hpp"
#include "deThread.hpp"
#include "deMutex.hpp"
@@ -258,7 +260,7 @@
deviceInfo.queueCreateInfoCount = static_cast<deUint32>(queues.countQueueFamilyIndex());
deviceInfo.pQueueCreateInfos = &queueInfos[0];
- queues.setDevice(createDevice(context.getPlatformInterface(), context.getInstance(), instance, physicalDevice, &deviceInfo));
+ queues.setDevice(createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), context.getPlatformInterface(), context.getInstance(), instance, physicalDevice, &deviceInfo));
for (deUint32 queueFamilyIndex = 0; queueFamilyIndex < queues.countQueueFamilyIndex(); ++queueFamilyIndex)
{
diff --git a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperation.cpp b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperation.cpp
index e6b480e..8b552e8 100644
--- a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperation.cpp
+++ b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperation.cpp
@@ -617,8 +617,7 @@
VkQueueFlags getQueueFlags (const OperationContext& context) const
{
- if (m_bufferOp == BUFFER_OP_FILL &&
- !isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_maintenance1"))
+ if (m_bufferOp == BUFFER_OP_FILL && !context.isDeviceFunctionalitySupported("VK_KHR_maintenance1"))
{
return VK_QUEUE_COMPUTE_BIT | VK_QUEUE_GRAPHICS_BIT;
}
@@ -914,8 +913,8 @@
void recordCommands (const VkCommandBuffer cmdBuffer)
{
- const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkBufferImageCopy bufferCopyRegion = makeBufferImageCopy(m_resource.getImage().subresourceLayers, m_resource.getImage().extent);
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkBufferImageCopy bufferCopyRegion = makeBufferImageCopy(m_resource.getImage().extent, m_resource.getImage().subresourceLayers);
const VkImageMemoryBarrier stagingImageTransferSrcLayoutBarrier = makeImageMemoryBarrier(
VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
@@ -1797,7 +1796,7 @@
void recordCommands (const VkCommandBuffer cmdBuffer)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkBufferImageCopy bufferCopyRegion = makeBufferImageCopy(m_resource.getImage().subresourceLayers, m_resource.getImage().extent);
+ const VkBufferImageCopy bufferCopyRegion = makeBufferImageCopy(m_resource.getImage().extent, m_resource.getImage().subresourceLayers);
// Destination image layout
{
@@ -2693,7 +2692,7 @@
void recordCommands (const VkCommandBuffer cmdBuffer)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkBufferImageCopy copyRegion = makeBufferImageCopy(m_resource.getImage().subresourceLayers, m_resource.getImage().extent);
+ const VkBufferImageCopy copyRegion = makeBufferImageCopy(m_resource.getImage().extent, m_resource.getImage().subresourceLayers);
const VkImageMemoryBarrier layoutBarrier = makeImageMemoryBarrier(
(VkAccessFlags)0, VK_ACCESS_TRANSFER_WRITE_BIT,
@@ -2769,7 +2768,7 @@
void recordCommands (const VkCommandBuffer cmdBuffer)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkBufferImageCopy copyRegion = makeBufferImageCopy(m_subresourceLayers, m_imageExtent);
+ const VkBufferImageCopy copyRegion = makeBufferImageCopy(m_imageExtent, m_subresourceLayers);
// Resource -> Image
{
@@ -2906,10 +2905,7 @@
void recordCommands (const VkCommandBuffer cmdBuffer)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkBufferImageCopy copyRegion = makeBufferImageCopy(m_outResource.getImage().subresourceLayers, m_outResource.getImage().extent);
-
- // Resource -> Image
- {
+ const VkBufferImageCopy copyRegion = makeBufferImageCopy(m_outResource.getImage().extent, m_outResource.getImage().subresourceLayers);
const VkBufferMemoryBarrier bufferLayoutBarrier =
makeBufferMemoryBarrier(
@@ -2924,7 +2920,6 @@
1u, &bufferLayoutBarrier, 1u, &imageLayoutBarrier);
vk.cmdCopyBufferToImage(cmdBuffer, m_inResource.getBuffer().handle, m_outResource.getImage().handle, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1u, ©Region);
- }
}
SyncInfo getInSyncInfo (void) const
@@ -3054,7 +3049,7 @@
void recordCommands (const VkCommandBuffer cmdBuffer)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkBufferImageCopy copyRegion = makeBufferImageCopy(m_subresourceLayers, m_imageExtent);
+ const VkBufferImageCopy copyRegion = makeBufferImageCopy(m_imageExtent, m_subresourceLayers);
// Host buffer -> Image
{
@@ -3139,7 +3134,7 @@
void recordCommands (const VkCommandBuffer cmdBuffer)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkBufferImageCopy copyRegion = makeBufferImageCopy(m_resource.getImage().subresourceLayers, m_resource.getImage().extent);
+ const VkBufferImageCopy copyRegion = makeBufferImageCopy(m_resource.getImage().extent, m_resource.getImage().subresourceLayers);
vk.cmdCopyImageToBuffer(cmdBuffer, m_resource.getImage().handle, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, **m_hostBuffer, 1u, ©Region);
@@ -3200,7 +3195,7 @@
void recordCommands (const VkCommandBuffer cmdBuffer)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
- const VkBufferImageCopy copyRegion = makeBufferImageCopy(m_subresourceLayers, m_inResource.getImage().extent);
+ const VkBufferImageCopy copyRegion = makeBufferImageCopy(m_inResource.getImage().extent, m_subresourceLayers);
{
const VkImageMemoryBarrier imageLayoutBarrier = makeImageMemoryBarrier(
@@ -4622,7 +4617,8 @@
} // anonymous ns
OperationContext::OperationContext (Context& context, PipelineCacheData& pipelineCacheData)
- : m_vki (context.getInstanceInterface())
+ : m_context (context)
+ , m_vki (context.getInstanceInterface())
, m_vk (context.getDeviceInterface())
, m_physicalDevice (context.getPhysicalDevice())
, m_device (context.getDevice())
@@ -4635,7 +4631,8 @@
}
OperationContext::OperationContext (Context& context, PipelineCacheData& pipelineCacheData, const DeviceInterface& vk, const VkDevice device, vk::Allocator& allocator)
- : m_vki (context.getInstanceInterface())
+ : m_context (context)
+ , m_vki (context.getInstanceInterface())
, m_vk (vk)
, m_physicalDevice (context.getPhysicalDevice())
, m_device (device)
@@ -4647,7 +4644,7 @@
{
}
-OperationContext::OperationContext (const deUint32 apiVersion,
+OperationContext::OperationContext (Context& context,
const vk::InstanceInterface& vki,
const vk::DeviceInterface& vkd,
vk::VkPhysicalDevice physicalDevice,
@@ -4656,7 +4653,8 @@
const std::vector<std::string>& deviceExtensions,
vk::BinaryCollection& programCollection,
PipelineCacheData& pipelineCacheData)
- : m_vki (vki)
+ : m_context (context)
+ , m_vki (vki)
, m_vk (vkd)
, m_physicalDevice (physicalDevice)
, m_device (device)
@@ -4664,7 +4662,7 @@
, m_progCollection (programCollection)
, m_pipelineCacheData (pipelineCacheData)
, m_deviceExtensions (deviceExtensions)
- , m_usedApiVersion (apiVersion)
+ , m_usedApiVersion (context.getUsedApiVersion())
{
}
diff --git a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperation.hpp b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperation.hpp
index ef31262..7b9db4d 100644
--- a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperation.hpp
+++ b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperation.hpp
@@ -138,7 +138,7 @@
const vk::VkDevice device,
vk::Allocator& allocator);
- OperationContext (const deUint32 apiVersion,
+ OperationContext (Context& context,
const vk::InstanceInterface& vki,
const vk::DeviceInterface& vkd,
vk::VkPhysicalDevice physicalDevice,
@@ -158,8 +158,13 @@
const std::vector<std::string>& getDeviceExtensions (void) const { return m_deviceExtensions;}
deUint32 getUsedApiVersion (void) const { return m_usedApiVersion; }
+ bool isDeviceFunctionalitySupported(const std::string& extension) const
+ {
+ return m_context.isDeviceFunctionalitySupported(extension);
+ }
private:
+ const vkt::Context& m_context;
const vk::InstanceInterface& m_vki;
const vk::DeviceInterface& m_vk;
const vk::VkPhysicalDevice m_physicalDevice;
diff --git a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperationMultiQueueTests.cpp b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperationMultiQueueTests.cpp
index 4f43c05..5046ec8 100644
--- a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperationMultiQueueTests.cpp
+++ b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperationMultiQueueTests.cpp
@@ -22,6 +22,7 @@
*//*--------------------------------------------------------------------*/
#include "vktSynchronizationOperationMultiQueueTests.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkDefs.hpp"
#include "vktTestCase.hpp"
#include "vktTestCaseUtil.hpp"
@@ -42,6 +43,7 @@
#include "vktSynchronizationOperationTestData.hpp"
#include "vktSynchronizationOperationResources.hpp"
#include "vktTestGroupUtil.hpp"
+#include "tcuCommandLine.hpp"
#include <set>
@@ -112,6 +114,9 @@
const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
const std::vector<VkQueueFamilyProperties> queueFamilyProperties = getPhysicalDeviceQueueFamilyProperties(instance, physicalDevice);
+ if (timelineSemaphore)
+ context.requireDeviceFunctionality("VK_KHR_timeline_semaphore");
+
for (deUint32 queuePropertiesNdx = 0; queuePropertiesNdx < queueFamilyProperties.size(); ++queuePropertiesNdx)
{
addQueueIndex(queuePropertiesNdx,
@@ -155,10 +160,7 @@
&context.getDeviceFeatures() //const VkPhysicalDeviceFeatures* pEnabledFeatures;
};
- if (timelineSemaphore && !context.getTimelineSemaphoreFeatures().timelineSemaphore)
- TCU_THROW(NotSupportedError, "Timeline semaphore not supported");
-
- m_logicalDevice = createDevice(context.getPlatformInterface(), context.getInstance(), instance, physicalDevice, &deviceInfo);
+ m_logicalDevice = createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), context.getPlatformInterface(), context.getInstance(), instance, physicalDevice, &deviceInfo);
m_deviceDriver = MovePtr<DeviceDriver>(new DeviceDriver(context.getPlatformInterface(), context.getInstance(), *m_logicalDevice));
m_allocator = MovePtr<Allocator>(new SimpleAllocator(*m_deviceDriver, *m_logicalDevice, getPhysicalDeviceMemoryProperties(instance, physicalDevice)));
@@ -584,9 +586,9 @@
for (deUint32 opIdx = 0; opIdx < m_ops.size(); opIdx++)
{
const VkPipelineStageFlags stageBits[] = { VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT };
- const VkTimelineSemaphoreSubmitInfoKHR timelineSubmitInfo =
+ const VkTimelineSemaphoreSubmitInfo timelineSubmitInfo =
{
- VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
opIdx == 0 ? 0u : 1u, // deUint32 waitSemaphoreValueCount
opIdx == 0 ? DE_NULL : &timelineValues[opIdx - 1], // const deUint64* pWaitSemaphoreValues
diff --git a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperationSingleQueueTests.cpp b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperationSingleQueueTests.cpp
index c5a92a7..f2df751 100644
--- a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperationSingleQueueTests.cpp
+++ b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperationSingleQueueTests.cpp
@@ -353,7 +353,7 @@
std::vector<VkCommandBuffer> cmdBuffers;
const VkPipelineStageFlags stageBits[] = { VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT };
std::vector<deUint64> timelineValues;
- std::vector<VkTimelineSemaphoreSubmitInfoKHR> timelineSubmitInfos;
+ std::vector<VkTimelineSemaphoreSubmitInfo> timelineSubmitInfos;
std::vector<VkSubmitInfo> submitInfos;
for (deUint32 opNdx = 0; opNdx < m_ops.size(); opNdx++)
@@ -371,9 +371,9 @@
for (deUint32 opNdx = 0; opNdx < m_ops.size(); opNdx++)
{
- const VkTimelineSemaphoreSubmitInfoKHR timelineSubmitInfo =
+ const VkTimelineSemaphoreSubmitInfo timelineSubmitInfo =
{
- VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
opNdx == 0 ? 0u : 1u, // deUint32 waitSemaphoreValueCount
opNdx == 0 ? DE_NULL : &timelineValues[opNdx - 1], // const deUint64* pWaitSemaphoreValues
diff --git a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationSignalOrderTests.cpp b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationSignalOrderTests.cpp
index 57f1797..0d95a19 100644
--- a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationSignalOrderTests.cpp
+++ b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationSignalOrderTests.cpp
@@ -84,43 +84,34 @@
{
VkSemaphoreSignalInfoKHR ssi =
{
- VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO_KHR,// VkStructureType sType;
+ VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
semaphore, // VkSemaphore semaphore;
timelineValue, // deUint64 value;
};
- VK_CHECK(vk.signalSemaphoreKHR(device, &ssi));
+ VK_CHECK(vk.signalSemaphore(device, &ssi));
}
-Move<VkDevice> createDevice (const deUint32 apiVersion,
- const VkPhysicalDeviceFeatures& deviceFeatures,
- const PlatformInterface& vkp,
- VkInstance instance,
- const vk::InstanceInterface& vki,
- VkPhysicalDevice physicalDevice,
- VkSemaphoreTypeKHR semaphoreType,
- VkExternalSemaphoreHandleTypeFlagBits semaphoreHandleType)
+Move<VkDevice> createDevice (const Context& context)
{
const float priority = 0.0f;
- const std::vector<VkQueueFamilyProperties> queueFamilyProperties = getPhysicalDeviceQueueFamilyProperties(vki, physicalDevice);
+ const std::vector<VkQueueFamilyProperties> queueFamilyProperties = getPhysicalDeviceQueueFamilyProperties(context.getInstanceInterface(), context.getPhysicalDevice());
std::vector<deUint32> queueFamilyIndices (queueFamilyProperties.size(), 0xFFFFFFFFu);
std::vector<const char*> extensions;
- if (semaphoreType == VK_SEMAPHORE_TYPE_TIMELINE_KHR)
+ if (context.isDeviceFunctionalitySupported("VK_KHR_timeline_semaphore"))
extensions.push_back("VK_KHR_timeline_semaphore");
- if (!isCoreDeviceExtension(apiVersion, "VK_KHR_external_semaphore"))
+ if (!isCoreDeviceExtension(context.getUsedApiVersion(), "VK_KHR_external_semaphore"))
extensions.push_back("VK_KHR_external_semaphore");
- if (!isCoreDeviceExtension(apiVersion, "VK_KHR_external_memory"))
+ if (!isCoreDeviceExtension(context.getUsedApiVersion(), "VK_KHR_external_memory"))
extensions.push_back("VK_KHR_external_memory");
- if (semaphoreHandleType == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT ||
- semaphoreHandleType == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT)
+ if (context.isDeviceFunctionalitySupported("VK_KHR_external_semaphore_fd"))
extensions.push_back("VK_KHR_external_semaphore_fd");
- if (semaphoreHandleType == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT ||
- semaphoreHandleType == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT)
+ if (context.isDeviceFunctionalitySupported("VK_KHR_external_semaphore_win32"))
extensions.push_back("VK_KHR_external_semaphore_win32");
try
@@ -147,7 +138,7 @@
{
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,
DE_NULL,
- deviceFeatures,
+ context.getDeviceFeatures(),
};
const VkDeviceCreateInfo createInfo =
{
@@ -166,7 +157,7 @@
0u
};
- return createDevice(vkp, instance, vki, physicalDevice, &createInfo);
+ return createDevice(context.getPlatformInterface(), context.getInstance(), context.getInstanceInterface(), context.getPhysicalDevice(), &createInfo);
}
catch (const vk::Error& error)
{
@@ -177,6 +168,43 @@
}
}
+// Class to wrap a singleton instance and device
+class SingletonDevice
+{
+ SingletonDevice (const Context& context)
+ : m_logicalDevice (createDevice(context))
+ {
+ }
+
+public:
+
+ static const Unique<vk::VkDevice>& getDevice(const Context& context)
+ {
+ if (!m_singletonDevice)
+ m_singletonDevice = SharedPtr<SingletonDevice>(new SingletonDevice(context));
+
+ DE_ASSERT(m_singletonDevice);
+ return m_singletonDevice->m_logicalDevice;
+ }
+
+ static void destroy()
+ {
+ m_singletonDevice.clear();
+ }
+
+private:
+ const Unique<vk::VkDevice> m_logicalDevice;
+
+ static SharedPtr<SingletonDevice> m_singletonDevice;
+};
+SharedPtr<SingletonDevice> SingletonDevice::m_singletonDevice;
+
+static void cleanupGroup ()
+{
+ // Destroy singleton object
+ SingletonDevice::destroy();
+}
+
class SimpleAllocation : public Allocation
{
public:
@@ -546,7 +574,7 @@
const SharedPtr<OperationSupport> readOpSupport,
const ResourceDescription& resourceDesc,
VkExternalMemoryHandleTypeFlagBits memoryHandleType,
- VkSemaphoreTypeKHR semaphoreType,
+ VkSemaphoreType semaphoreType,
VkExternalSemaphoreHandleTypeFlagBits semaphoreHandleType,
PipelineCacheData& pipelineCacheData)
: TestInstance (context)
@@ -603,14 +631,7 @@
// We're using 2 devices to make sure we have 2 queues even on
// implementations that only have a single queue.
const VkDevice& deviceA = m_context.getDevice();
- const Unique<VkDevice> deviceB (createDevice(m_context.getUsedApiVersion(),
- m_context.getDeviceFeatures(),
- m_context.getPlatformInterface(),
- m_context.getInstance(),
- m_context.getInstanceInterface(),
- m_context.getPhysicalDevice(),
- m_semaphoreType,
- m_semaphoreHandleType));
+ const Unique<VkDevice>& deviceB (SingletonDevice::getDevice(m_context));
const DeviceInterface& vkA = m_context.getDeviceInterface();
const DeviceDriver vkB (m_context.getPlatformInterface(), m_context.getInstance(), *deviceB);
UniquePtr<SimpleAllocator> allocatorA (new SimpleAllocator(vkA, deviceA, vk::getPhysicalDeviceMemoryProperties(m_context.getInstanceInterface(),
@@ -821,9 +842,9 @@
if (m_semaphoreType == VK_SEMAPHORE_TYPE_TIMELINE_KHR)
{
- const VkSemaphoreWaitInfoKHR waitInfo =
+ const VkSemaphoreWaitInfo waitInfo =
{
- VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO_KHR,// VkStructureType sType;
+ VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
0u, // VkSemaphoreWaitFlagsKHR flags;
1u, // deUint32 semaphoreCount;
@@ -834,7 +855,7 @@
// Unblock the whole lot.
hostSignal(vkA, deviceA, semaphoreHandlesA.front(), 1);
- VK_CHECK(vkB.waitSemaphoresKHR(*deviceB, &waitInfo, ~0ull));
+ VK_CHECK(vkB.waitSemaphores(*deviceB, &waitInfo, ~0ull));
}
else
{
@@ -991,7 +1012,7 @@
SharedPtr<OperationSupport> m_readOpSupport;
const ResourceDescription& m_resourceDesc;
VkExternalMemoryHandleTypeFlagBits m_memoryHandleType;
- VkSemaphoreTypeKHR m_semaphoreType;
+ VkSemaphoreType m_semaphoreType;
VkExternalSemaphoreHandleTypeFlagBits m_semaphoreHandleType;
PipelineCacheData& m_pipelineCacheData;
de::Random m_rng;
@@ -1006,7 +1027,7 @@
OperationName readOp,
const ResourceDescription& resourceDesc,
VkExternalMemoryHandleTypeFlagBits memoryHandleType,
- VkSemaphoreTypeKHR semaphoreType,
+ VkSemaphoreType semaphoreType,
VkExternalSemaphoreHandleTypeFlagBits semaphoreHandleType,
PipelineCacheData& pipelineCacheData)
: TestCase (testCtx, name.c_str(), "")
@@ -1020,6 +1041,23 @@
{
}
+ virtual void checkSupport(Context& context) const
+ {
+ if (m_semaphoreType == VK_SEMAPHORE_TYPE_TIMELINE_KHR &&
+ !context.getTimelineSemaphoreFeatures().timelineSemaphore)
+ TCU_THROW(NotSupportedError, "Timeline semaphore not supported");
+
+ if ((m_semaphoreHandleType == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT ||
+ m_semaphoreHandleType == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT) &&
+ !context.isDeviceFunctionalitySupported("VK_KHR_external_semaphore_fd"))
+ TCU_THROW(NotSupportedError, "VK_KHR_external_semaphore_fd not supported");
+
+ if ((m_semaphoreHandleType == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT ||
+ m_semaphoreHandleType == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT) &&
+ !context.isDeviceFunctionalitySupported("VK_KHR_external_semaphore_win32"))
+ TCU_THROW(NotSupportedError, "VK_KHR_external_semaphore_win32 not supported");
+ }
+
TestInstance* createInstance (Context& context) const
{
return new QueueSubmitSignalOrderSharedTestInstance(context,
@@ -1043,7 +1081,7 @@
SharedPtr<OperationSupport> m_readOpSupport;
const ResourceDescription& m_resourceDesc;
VkExternalMemoryHandleTypeFlagBits m_memoryHandleType;
- VkSemaphoreTypeKHR m_semaphoreType;
+ VkSemaphoreType m_semaphoreType;
VkExternalSemaphoreHandleTypeFlagBits m_semaphoreHandleType;
PipelineCacheData& m_pipelineCacheData;
};
@@ -1051,7 +1089,7 @@
class QueueSubmitSignalOrderSharedTests : public tcu::TestCaseGroup
{
public:
- QueueSubmitSignalOrderSharedTests (tcu::TestContext& testCtx, VkSemaphoreTypeKHR semaphoreType, const char *name)
+ QueueSubmitSignalOrderSharedTests (tcu::TestContext& testCtx, VkSemaphoreType semaphoreType, const char *name)
: tcu::TestCaseGroup (testCtx, name, "Signal ordering of semaphores")
, m_semaphoreType (semaphoreType)
{
@@ -1175,8 +1213,13 @@
}
}
+ void deinit (void)
+ {
+ cleanupGroup();
+ }
+
private:
- VkSemaphoreTypeKHR m_semaphoreType;
+ VkSemaphoreType m_semaphoreType;
// synchronization.op tests share pipeline cache data to speed up test
// execution.
PipelineCacheData m_pipelineCacheData;
@@ -1210,21 +1253,14 @@
const SharedPtr<OperationSupport> writeOpSupport,
const SharedPtr<OperationSupport> readOpSupport,
const ResourceDescription& resourceDesc,
- VkSemaphoreTypeKHR semaphoreType,
+ VkSemaphoreType semaphoreType,
PipelineCacheData& pipelineCacheData)
: TestInstance (context)
, m_writeOpSupport (writeOpSupport)
, m_readOpSupport (readOpSupport)
, m_resourceDesc (resourceDesc)
, m_semaphoreType (semaphoreType)
- , m_device (createDevice(context.getUsedApiVersion(),
- context.getDeviceFeatures(),
- context.getPlatformInterface(),
- context.getInstance(),
- context.getInstanceInterface(),
- context.getPhysicalDevice(),
- semaphoreType,
- (VkExternalSemaphoreHandleTypeFlagBits)0))
+ , m_device (SingletonDevice::getDevice(context))
, m_deviceInterface (context.getPlatformInterface(), context.getInstance(), *m_device)
, m_allocator (new SimpleAllocator(m_deviceInterface,
*m_device,
@@ -1455,9 +1491,9 @@
if (m_semaphoreType == VK_SEMAPHORE_TYPE_TIMELINE_KHR)
{
- const VkSemaphoreWaitInfoKHR waitInfo =
+ const VkSemaphoreWaitInfo waitInfo =
{
- VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO_KHR,// VkStructureType sType;
+ VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
0u, // VkSemaphoreWaitFlagsKHR flags;
1u, // deUint32 semaphoreCount;
@@ -1468,7 +1504,7 @@
// Unblock the whole lot.
hostSignal(vk, device, semaphoreHandlesA.front(), 1);
- VK_CHECK(vk.waitSemaphoresKHR(device, &waitInfo, ~0ull));
+ VK_CHECK(vk.waitSemaphores(device, &waitInfo, ~0ull));
}
else
{
@@ -1533,8 +1569,8 @@
SharedPtr<OperationSupport> m_writeOpSupport;
SharedPtr<OperationSupport> m_readOpSupport;
const ResourceDescription& m_resourceDesc;
- VkSemaphoreTypeKHR m_semaphoreType;
- Unique<VkDevice> m_device;
+ VkSemaphoreType m_semaphoreType;
+ const Unique<VkDevice>& m_device;
const DeviceDriver m_deviceInterface;
UniquePtr<SimpleAllocator> m_allocator;
UniquePtr<OperationContext> m_operationContext;
@@ -1553,7 +1589,7 @@
OperationName writeOp,
OperationName readOp,
const ResourceDescription& resourceDesc,
- VkSemaphoreTypeKHR semaphoreType,
+ VkSemaphoreType semaphoreType,
PipelineCacheData& pipelineCacheData)
: TestCase (testCtx, name.c_str(), "")
, m_writeOpSupport (makeOperationSupport(writeOp, resourceDesc).release())
@@ -1564,6 +1600,13 @@
{
}
+ virtual void checkSupport(Context& context) const
+ {
+ if (m_semaphoreType == VK_SEMAPHORE_TYPE_TIMELINE_KHR &&
+ !context.getTimelineSemaphoreFeatures().timelineSemaphore)
+ TCU_THROW(NotSupportedError, "Timeline semaphore not supported");
+ }
+
TestInstance* createInstance (Context& context) const
{
return new QueueSubmitSignalOrderTestInstance(context,
@@ -1584,14 +1627,14 @@
SharedPtr<OperationSupport> m_writeOpSupport;
SharedPtr<OperationSupport> m_readOpSupport;
const ResourceDescription& m_resourceDesc;
- VkSemaphoreTypeKHR m_semaphoreType;
+ VkSemaphoreType m_semaphoreType;
PipelineCacheData& m_pipelineCacheData;
};
class QueueSubmitSignalOrderTests : public tcu::TestCaseGroup
{
public:
- QueueSubmitSignalOrderTests (tcu::TestContext& testCtx, VkSemaphoreTypeKHR semaphoreType, const char *name)
+ QueueSubmitSignalOrderTests (tcu::TestContext& testCtx, VkSemaphoreType semaphoreType, const char *name)
: tcu::TestCaseGroup (testCtx, name, "Signal ordering of semaphores")
, m_semaphoreType (semaphoreType)
{
@@ -1686,8 +1729,13 @@
}
}
+ void deinit (void)
+ {
+ cleanupGroup();
+ }
+
private:
- VkSemaphoreTypeKHR m_semaphoreType;
+ VkSemaphoreType m_semaphoreType;
// synchronization.op tests share pipeline cache data to speed up test
// execution.
PipelineCacheData m_pipelineCacheData;
diff --git a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationSmokeTests.cpp b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationSmokeTests.cpp
index 59df781..a3a36b5 100644
--- a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationSmokeTests.cpp
+++ b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationSmokeTests.cpp
@@ -24,6 +24,7 @@
#include "vktSynchronizationSmokeTests.hpp"
#include "vktTestCaseUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkPlatform.hpp"
#include "vkStrUtil.hpp"
@@ -34,6 +35,7 @@
#include "tcuTestLog.hpp"
#include "tcuFormatUtil.hpp"
+#include "tcuCommandLine.hpp"
#include "deUniquePtr.hpp"
#include "deThread.hpp"
@@ -87,7 +89,7 @@
"}\n");
}
-Move<VkDevice> createTestDevice (const PlatformInterface& vkp, VkInstance instance, const InstanceInterface& vki, VkPhysicalDevice physicalDevice, deUint32 *outQueueFamilyIndex)
+Move<VkDevice> createTestDevice (const PlatformInterface& vkp, VkInstance instance, const InstanceInterface& vki, VkPhysicalDevice physicalDevice, bool validationEnabled, deUint32 *outQueueFamilyIndex)
{
VkDeviceQueueCreateInfo queueInfo;
VkDeviceCreateInfo deviceInfo;
@@ -138,7 +140,7 @@
*outQueueFamilyIndex = queueInfo.queueFamilyIndex;
- return createDevice(vkp, instance, vki, physicalDevice, &deviceInfo);
+ return createCustomDevice(validationEnabled, vkp, instance, vki, physicalDevice, &deviceInfo);
};
struct BufferParameters
@@ -971,11 +973,11 @@
}
}
-static void initTimelineSemaphoreSubmitInfo (VkTimelineSemaphoreSubmitInfoKHR* submitInfo, deUint32 submitInfoCount)
+static void initTimelineSemaphoreSubmitInfo (VkTimelineSemaphoreSubmitInfo* submitInfo, deUint32 submitInfoCount)
{
for (deUint32 ndx = 0; ndx < submitInfoCount; ndx++)
{
- submitInfo[ndx].sType = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR;
+ submitInfo[ndx].sType = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO;
submitInfo[ndx].pNext = DE_NULL;
submitInfo[ndx].waitSemaphoreValueCount = 0;
submitInfo[ndx].pWaitSemaphoreValues = DE_NULL;
@@ -1088,19 +1090,19 @@
return TestStatus::pass("synchronization-fences passed");
}
-tcu::TestStatus testSemaphores (Context& context, VkSemaphoreTypeKHR semaphoreType)
+tcu::TestStatus testSemaphores (Context& context, VkSemaphoreType semaphoreType)
{
- TestLog& log = context.getTestContext().getLog();
- const PlatformInterface& platformInterface = context.getPlatformInterface();
- const InstanceInterface& instanceInterface = context.getInstanceInterface();
- const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
- deUint32 queueFamilyIdx;
- vk::Move<VkDevice> device = createTestDevice(platformInterface, context.getInstance(), instanceInterface, physicalDevice, &queueFamilyIdx);
- const DeviceDriver deviceInterface (platformInterface, context.getInstance(), *device);
- SimpleAllocator allocator (deviceInterface,
- *device,
- getPhysicalDeviceMemoryProperties(instanceInterface, physicalDevice));
- const VkQueue queue[2] =
+ TestLog& log = context.getTestContext().getLog();
+ const PlatformInterface& platformInterface = context.getPlatformInterface();
+ const InstanceInterface& instanceInterface = context.getInstanceInterface();
+ const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
+ deUint32 queueFamilyIdx;
+ vk::Move<VkDevice> device = createTestDevice(platformInterface, context.getInstance(), instanceInterface, physicalDevice, context.getTestContext().getCommandLine().isValidationEnabled(), &queueFamilyIdx);
+ const DeviceDriver deviceInterface (platformInterface, context.getInstance(), *device);
+ SimpleAllocator allocator (deviceInterface,
+ *device,
+ getPhysicalDeviceMemoryProperties(instanceInterface, physicalDevice));
+ const VkQueue queue[2] =
{
getDeviceQueue(deviceInterface, *device, queueFamilyIdx, 0),
getDeviceQueue(deviceInterface, *device, queueFamilyIdx, 1)
@@ -1110,7 +1112,7 @@
TestContext testContext2 (deviceInterface, device.get(), queueFamilyIdx, context.getBinaryCollection(), allocator);
Unique<VkSemaphore> semaphore (createSemaphoreType(deviceInterface, *device, semaphoreType));
VkSubmitInfo submitInfo[2];
- VkTimelineSemaphoreSubmitInfoKHR timelineSubmitInfo[2];
+ VkTimelineSemaphoreSubmitInfo timelineSubmitInfo[2];
const deUint64 timelineValue = 1u;
void* resultImage;
@@ -1159,12 +1161,12 @@
submitInfo[0].pSignalSemaphores = &semaphore.get();
timelineSubmitInfo[0].pSignalSemaphoreValues = &timelineValue;
timelineSubmitInfo[0].signalSemaphoreValueCount = 1;
- submitInfo[0].pNext = (semaphoreType == VK_SEMAPHORE_TYPE_TIMELINE_KHR ? &timelineSubmitInfo[0] : DE_NULL);
+ submitInfo[0].pNext = (semaphoreType == VK_SEMAPHORE_TYPE_TIMELINE ? &timelineSubmitInfo[0] : DE_NULL);
submitInfo[1].waitSemaphoreCount = 1;
submitInfo[1].pWaitSemaphores = &semaphore.get();
timelineSubmitInfo[1].pWaitSemaphoreValues = &timelineValue;
timelineSubmitInfo[1].waitSemaphoreValueCount = 1;
- submitInfo[1].pNext = (semaphoreType == VK_SEMAPHORE_TYPE_TIMELINE_KHR ? &timelineSubmitInfo[1] : DE_NULL);
+ submitInfo[1].pNext = (semaphoreType == VK_SEMAPHORE_TYPE_TIMELINE ? &timelineSubmitInfo[1] : DE_NULL);
submitInfo[1].pWaitDstStageMask = &waitDstStageMask;
VK_CHECK(deviceInterface.queueSubmit(queue[0], 1, &submitInfo[0], testContext1.fences[0]));
diff --git a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationTimelineSemaphoreTests.cpp b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationTimelineSemaphoreTests.cpp
index 3b8f959..a9f110e 100644
--- a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationTimelineSemaphoreTests.cpp
+++ b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationTimelineSemaphoreTests.cpp
@@ -84,11 +84,11 @@
deUint64 getMaxTimelineSemaphoreValueDifference(const InstanceInterface& vk,
const VkPhysicalDevice physicalDevice)
{
- VkPhysicalDeviceTimelineSemaphorePropertiesKHR timelineSemaphoreProperties;
+ VkPhysicalDeviceTimelineSemaphoreProperties timelineSemaphoreProperties;
VkPhysicalDeviceProperties2 properties;
deMemset(&timelineSemaphoreProperties, 0, sizeof(timelineSemaphoreProperties));
- timelineSemaphoreProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR;
+ timelineSemaphoreProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES;
deMemset(&properties, 0, sizeof(properties));
properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
@@ -106,9 +106,9 @@
const VkSemaphore semaphore,
const deUint64 timelineValue)
{
- VkTimelineSemaphoreSubmitInfoKHR tsi =
+ VkTimelineSemaphoreSubmitInfo tsi =
{
- VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
0u, // deUint32 waitSemaphoreValueCount
DE_NULL, // const deUint64* pWaitSemaphoreValues
@@ -152,13 +152,13 @@
{
VkSemaphoreSignalInfoKHR ssi =
{
- VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO_KHR,// VkStructureType sType;
+ VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
semaphore, // VkSemaphore semaphore;
timelineValue, // deUint64 value;
};
- VK_CHECK(vk.signalSemaphoreKHR(device, &ssi));
+ VK_CHECK(vk.signalSemaphore(device, &ssi));
}
class WaitTestInstance : public TestInstance
@@ -169,8 +169,6 @@
, m_waitAll (waitAll)
, m_signalFromDevice (signalFromDevice)
{
- if (!context.getTimelineSemaphoreFeatures().timelineSemaphore)
- TCU_THROW(NotSupportedError, "Timeline semaphore not supported");
}
tcu::TestStatus iterate (void)
@@ -215,18 +213,18 @@
}
{
- const VkSemaphoreWaitInfoKHR waitInfo =
+ const VkSemaphoreWaitInfo waitInfo =
{
- VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO_KHR, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- m_waitAll ? 0u : (VkSemaphoreWaitFlagsKHR) VK_SEMAPHORE_WAIT_ANY_BIT_KHR, // VkSemaphoreWaitFlagsKHR flags;
- (deUint32) semaphores.size(), // deUint32 semaphoreCount;
- &semaphores[0], // const VkSemaphore* pSemaphores;
- &timelineValues[0], // const deUint64* pValues;
+ VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ m_waitAll ? 0u : (VkSemaphoreWaitFlags) VK_SEMAPHORE_WAIT_ANY_BIT_KHR, // VkSemaphoreWaitFlagsKHR flags;
+ (deUint32) semaphores.size(), // deUint32 semaphoreCount;
+ &semaphores[0], // const VkSemaphore* pSemaphores;
+ &timelineValues[0], // const deUint64* pValues;
};
VkResult result;
- result = vk.waitSemaphoresKHR(device, &waitInfo, 0ull);
+ result = vk.waitSemaphores(device, &waitInfo, 0ull);
if (result != VK_SUCCESS)
return tcu::TestStatus::fail("Wait failed");
@@ -263,6 +261,11 @@
{
}
+ virtual void checkSupport(Context& context) const
+ {
+ context.requireDeviceFunctionality("VK_KHR_timeline_semaphore");
+ }
+
TestInstance* createInstance (Context& context) const
{
return new WaitTestInstance(context, m_waitAll, m_signalFromDevice);
@@ -281,8 +284,6 @@
HostWaitBeforeSignalTestInstance (Context& context)
: TestInstance (context)
{
- if (!context.getTimelineSemaphoreFeatures().timelineSemaphore)
- TCU_THROW(NotSupportedError, "Timeline semaphore not supported");
}
tcu::TestStatus iterate (void)
@@ -300,9 +301,9 @@
for (deUint32 i = 0; i < 12; i++)
{
const deUint64 newTimelineValue = (timelineValues.back() + rng.getInt(1, 10000));
- const VkTimelineSemaphoreSubmitInfoKHR timelineSubmitInfo =
+ const VkTimelineSemaphoreSubmitInfo timelineSubmitInfo =
{
- VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
1u, // deUint32 waitSemaphoreValueCount
&timelineValues.back(), // const deUint64* pWaitSemaphoreValues
@@ -340,7 +341,7 @@
};
VkResult result;
- result = vk.waitSemaphoresKHR(device, &waitInfo, 0ull);
+ result = vk.waitSemaphores(device, &waitInfo, 0ull);
if (result != VK_TIMEOUT)
return tcu::TestStatus::fail("Wait failed");
@@ -360,7 +361,7 @@
};
VkResult result;
- result = vk.waitSemaphoresKHR(device, &waitInfo, ~(0ull));
+ result = vk.waitSemaphores(device, &waitInfo, ~(0ull));
if (result != VK_SUCCESS)
return tcu::TestStatus::fail("Wait failed");
@@ -392,6 +393,11 @@
{
}
+ virtual void checkSupport(Context& context) const
+ {
+ context.requireDeviceFunctionality("VK_KHR_timeline_semaphore");
+ }
+
TestInstance* createInstance (Context& context) const
{
return new HostWaitBeforeSignalTestInstance(context);
@@ -422,7 +428,7 @@
{
deUint64 value;
- VK_CHECK(m_vkd.getSemaphoreCounterValueKHR(m_device, m_semaphore, &value));
+ VK_CHECK(m_vkd.getSemaphoreCounterValue(m_device, m_semaphore, &value));
if (value < lastValue) {
m_status = tcu::TestStatus::fail("Value not monotically increasing");
@@ -497,7 +503,7 @@
deviceSignal(vk, device, queue, DE_NULL, *semaphore, ++timelineFrontValue);
deUint64 value;
- VK_CHECK(vk.getSemaphoreCounterValueKHR(device, *semaphore, &value));
+ VK_CHECK(vk.getSemaphoreCounterValue(device, *semaphore, &value));
VK_CHECK(vk.waitForFences(device, 1, &fence.get(), VK_TRUE, ~(0ull)));
VK_CHECK(vk.resetFences(device, 1, &fence.get()));
@@ -523,9 +529,9 @@
const Unique<VkSemaphore> semaphoreDefaultValue (createSemaphoreType(vk, device, VK_SEMAPHORE_TYPE_TIMELINE_KHR));
const Unique<VkSemaphore> semaphoreInitialValue (createSemaphoreType(vk, device, VK_SEMAPHORE_TYPE_TIMELINE_KHR, 0, nonZeroValue));
deUint64 initialValue;
- VkSemaphoreWaitInfoKHR waitInfo =
+ VkSemaphoreWaitInfo waitInfo =
{
- VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
0u, // VkSemaphoreWaitFlagsKHR flags;
1u, // deUint32 semaphoreCount;
@@ -537,21 +543,21 @@
waitInfo.pSemaphores = &semaphoreDefaultValue.get();
initialValue = 0;
- result = vk.waitSemaphoresKHR(device, &waitInfo, 0ull);
+ result = vk.waitSemaphores(device, &waitInfo, 0ull);
if (result != VK_SUCCESS)
return tcu::TestStatus::fail("Wait zero initial value failed");
- VK_CHECK(vk.getSemaphoreCounterValueKHR(device, *semaphoreDefaultValue, &value));
+ VK_CHECK(vk.getSemaphoreCounterValue(device, *semaphoreDefaultValue, &value));
if (value != initialValue)
return tcu::TestStatus::fail("Invalid zero initial value");
waitInfo.pSemaphores = &semaphoreInitialValue.get();
initialValue = nonZeroValue;
- result = vk.waitSemaphoresKHR(device, &waitInfo, 0ull);
+ result = vk.waitSemaphores(device, &waitInfo, 0ull);
if (result != VK_SUCCESS)
return tcu::TestStatus::fail("Wait non zero initial value failed");
- VK_CHECK(vk.getSemaphoreCounterValueKHR(device, *semaphoreInitialValue, &value));
+ VK_CHECK(vk.getSemaphoreCounterValue(device, *semaphoreInitialValue, &value));
if (value != nonZeroValue)
return tcu::TestStatus::fail("Invalid non zero initial value");
@@ -562,11 +568,11 @@
waitInfo.pSemaphores = &semaphoreMaxValue.get();
initialValue = nonZeroMaxValue;
- result = vk.waitSemaphoresKHR(device, &waitInfo, 0ull);
+ result = vk.waitSemaphores(device, &waitInfo, 0ull);
if (result != VK_SUCCESS)
return tcu::TestStatus::fail("Wait max value failed");
- VK_CHECK(vk.getSemaphoreCounterValueKHR(device, *semaphoreMaxValue, &value));
+ VK_CHECK(vk.getSemaphoreCounterValue(device, *semaphoreMaxValue, &value));
if (value != nonZeroMaxValue)
return tcu::TestStatus::fail("Invalid max value initial value");
}
@@ -659,7 +665,7 @@
};
VkResult result;
- result = m_vkd.waitSemaphoresKHR(m_device, &waitInfo, ~(deUint64)0u);
+ result = m_vkd.waitSemaphores(m_device, &waitInfo, ~(deUint64)0u);
if (result != VK_SUCCESS)
return;
}
@@ -679,7 +685,7 @@
};
VkResult result;
- result = m_vkd.signalSemaphoreKHR(m_device, &signalInfo);
+ result = m_vkd.signalSemaphore(m_device, &signalInfo);
if (result != VK_SUCCESS)
return;
}
@@ -745,9 +751,6 @@
{
de::Random rng (1234);
- if (!context.getTimelineSemaphoreFeatures().timelineSemaphore)
- TCU_THROW(NotSupportedError, "Timeline semaphore not supported");
-
// Create a dozen couple of operations and their associated
// resource.
for (deUint32 i = 0; i < 12; i++)
@@ -769,7 +772,7 @@
HostCopyThread hostCopyThread (vk, device, *semaphore, m_iterations);
std::vector<SharedPtr<Move<VkCommandBuffer> > > ptrCmdBuffers;
std::vector<VkCommandBuffer> cmdBuffers;
- std::vector<VkTimelineSemaphoreSubmitInfoKHR> timelineSubmitInfos;
+ std::vector<VkTimelineSemaphoreSubmitInfo> timelineSubmitInfos;
std::vector<VkSubmitInfo> submitInfos;
hostCopyThread.start();
@@ -800,9 +803,9 @@
{
// Write operation
{
- const VkTimelineSemaphoreSubmitInfoKHR timelineSubmitInfo =
+ const VkTimelineSemaphoreSubmitInfo timelineSubmitInfo =
{
- VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
iterIdx == 0 ? 0u : 1u, // deUint32 waitSemaphoreValueCount
iterIdx == 0 ? DE_NULL : &m_iterations[iterIdx - 1]->cpuValue, // const deUint64* pWaitSemaphoreValues
@@ -858,9 +861,9 @@
// Read operation
{
- const VkTimelineSemaphoreSubmitInfoKHR timelineSubmitInfo =
+ const VkTimelineSemaphoreSubmitInfo timelineSubmitInfo =
{
- VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
1u, // deUint32 waitSemaphoreValueCount
&m_iterations[iterIdx]->writeValue, // const deUint64* pWaitSemaphoreValues
@@ -930,6 +933,11 @@
{
}
+ virtual void checkSupport(Context& context) const
+ {
+ context.requireDeviceFunctionality("VK_KHR_timeline_semaphore");
+ }
+
void initPrograms (SourceCollections& programCollection) const
{
m_writeOp->initPrograms(programCollection);
@@ -1095,7 +1103,7 @@
return infos;
}
-Move<VkDevice> createDevice(Context& context)
+Move<VkDevice> createDevice(const Context& context)
{
const std::vector<VkQueueFamilyProperties> queueFamilyProperties = getPhysicalDeviceQueueFamilyProperties(context.getInstanceInterface(), context.getPhysicalDevice());
std::vector<VkDeviceQueueCreateInfo> queueCreateInfos = getQueueCreateInfo(queueFamilyProperties);
@@ -1129,13 +1137,48 @@
queueCreateInfo.pQueuePriorities = &(*queuePriorities.back().get())[0];
}
- if (!context.getTimelineSemaphoreFeatures().timelineSemaphore)
- TCU_THROW(NotSupportedError, "Timeline semaphore not supported");
-
return createDevice(context.getPlatformInterface(), context.getInstance(),
context.getInstanceInterface(), context.getPhysicalDevice(), &deviceInfo);
}
+
+// Class to wrap a singleton instance and device
+class SingletonDevice
+{
+ SingletonDevice (const Context& context)
+ : m_logicalDevice (createDevice(context))
+ {
+ }
+
+public:
+
+ static const Unique<vk::VkDevice>& getDevice(const Context& context)
+ {
+ if (!m_singletonDevice)
+ m_singletonDevice = SharedPtr<SingletonDevice>(new SingletonDevice(context));
+
+ DE_ASSERT(m_singletonDevice);
+ return m_singletonDevice->m_logicalDevice;
+ }
+
+ static void destroy()
+ {
+ m_singletonDevice.clear();
+ }
+
+private:
+ const Unique<vk::VkDevice> m_logicalDevice;
+
+ static SharedPtr<SingletonDevice> m_singletonDevice;
+};
+SharedPtr<SingletonDevice> SingletonDevice::m_singletonDevice;
+
+static void cleanupGroup ()
+{
+ // Destroy singleton object
+ SingletonDevice::destroy();
+}
+
// Create a chain of operations with data copied across queues & host
// and submit the operations out of order to verify that the queues
// are properly unblocked as the work progresses.
@@ -1149,7 +1192,7 @@
PipelineCacheData& pipelineCacheData)
: TestInstance (context)
, m_resourceDesc (resourceDesc)
- , m_device (createDevice(context))
+ , m_device (SingletonDevice::getDevice(context))
, m_deviceDriver (MovePtr<DeviceDriver>(new DeviceDriver(context.getPlatformInterface(), context.getInstance(), *m_device)))
, m_allocator (new SimpleAllocator(*m_deviceDriver, *m_device,
getPhysicalDeviceMemoryProperties(context.getInstanceInterface(),
@@ -1265,9 +1308,9 @@
// exercise the wait-before-submit behavior.
deUint32 iterIdx = (deUint32)(m_iterations.size() - 2 - _iterIdx);
- const VkTimelineSemaphoreSubmitInfoKHR timelineSubmitInfo =
+ const VkTimelineSemaphoreSubmitInfo timelineSubmitInfo =
{
- VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
1u, // deUint32 waitSemaphoreValueCount
iterIdx == 0 ? &m_hostTimelineValue : &m_iterations[iterIdx - 1]->timelineValue, // const deUint64* pWaitSemaphoreValues
@@ -1327,9 +1370,9 @@
// Submit the last read operation in order.
{
const deUint32 iterIdx = (deUint32) (m_iterations.size() - 1);
- const VkTimelineSemaphoreSubmitInfoKHR timelineSubmitInfo =
+ const VkTimelineSemaphoreSubmitInfo timelineSubmitInfo =
{
- VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
1u, // deUint32 waitSemaphoreValueCount
&m_iterations[iterIdx - 1]->timelineValue, // const deUint64* pWaitSemaphoreValues
@@ -1375,7 +1418,7 @@
protected:
const ResourceDescription m_resourceDesc;
- Move<VkDevice> m_device;
+ const Unique<VkDevice>& m_device;
MovePtr<DeviceDriver> m_deviceDriver;
MovePtr<Allocator> m_allocator;
OperationContext m_opContext;
@@ -1402,6 +1445,11 @@
{
}
+ virtual void checkSupport(Context& context) const
+ {
+ context.requireDeviceFunctionality("VK_KHR_timeline_semaphore");
+ }
+
void initPrograms (SourceCollections& programCollection) const
{
m_writeOp->initPrograms(programCollection);
@@ -1518,6 +1566,11 @@
}
}
+ void deinit (void)
+ {
+ cleanupGroup();
+ }
+
private:
// synchronization.op tests share pipeline cache data to speed up test
// execution.
@@ -1541,7 +1594,7 @@
PipelineCacheData& pipelineCacheData)
: TestInstance (context)
, m_resourceDesc (resourceDesc)
- , m_device (createDevice(context))
+ , m_device (SingletonDevice::getDevice(context))
, m_deviceDriver (MovePtr<DeviceDriver>(new DeviceDriver(context.getPlatformInterface(), context.getInstance(), *m_device)))
, m_allocator (new SimpleAllocator(*m_deviceDriver, *m_device,
getPhysicalDeviceMemoryProperties(context.getInstanceInterface(),
@@ -1684,9 +1737,9 @@
VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
};
- const VkTimelineSemaphoreSubmitInfoKHR timelineSubmitInfo =
+ const VkTimelineSemaphoreSubmitInfo timelineSubmitInfo =
{
- VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
waitValuesCount, // deUint32 waitSemaphoreValueCount
waitValues, // const deUint64* pWaitSemaphoreValues
@@ -1822,7 +1875,7 @@
protected:
ResourceDescription m_resourceDesc;
- Move<VkDevice> m_device;
+ const Unique<VkDevice>& m_device;
MovePtr<DeviceDriver> m_deviceDriver;
MovePtr<Allocator> m_allocator;
OperationContext m_opContext;
@@ -1852,6 +1905,11 @@
{
}
+ virtual void checkSupport(Context& context) const
+ {
+ context.requireDeviceFunctionality("VK_KHR_timeline_semaphore");
+ }
+
void initPrograms (SourceCollections& programCollection) const
{
m_writeOp->initPrograms(programCollection);
@@ -1968,6 +2026,11 @@
}
}
+ void deinit (void)
+ {
+ cleanupGroup();
+ }
+
private:
// synchronization.op tests share pipeline cache data to speed up test
// execution.
diff --git a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationUtil.cpp b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationUtil.cpp
index b51a316..a3f594f 100644
--- a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationUtil.cpp
+++ b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationUtil.cpp
@@ -107,21 +107,6 @@
return imageInfo;
}
-VkBufferImageCopy makeBufferImageCopy (const VkImageSubresourceLayers subresourceLayers,
- const VkExtent3D extent)
-{
- const VkBufferImageCopy copyParams =
- {
- 0ull, // VkDeviceSize bufferOffset;
- 0u, // deUint32 bufferRowLength;
- 0u, // deUint32 bufferImageHeight;
- subresourceLayers, // VkImageSubresourceLayers imageSubresource;
- makeOffset3D(0, 0, 0), // VkOffset3D imageOffset;
- extent, // VkExtent3D imageExtent;
- };
- return copyParams;
-}
-
void beginRenderPassWithRasterizationDisabled (const DeviceInterface& vk,
const VkCommandBuffer commandBuffer,
const VkRenderPass renderPass,
diff --git a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationUtil.hpp b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationUtil.hpp
index cc09ba7..fb95a8d 100644
--- a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationUtil.hpp
+++ b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationUtil.hpp
@@ -227,7 +227,6 @@
vk::VkImageCreateInfo makeImageCreateInfo (const vk::VkImageType imageType, const vk::VkExtent3D& extent, const vk::VkFormat format, const vk::VkImageUsageFlags usage);
vk::Move<vk::VkCommandBuffer> makeCommandBuffer (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkCommandPool commandPool);
vk::Move<vk::VkPipeline> makeComputePipeline (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkPipelineLayout pipelineLayout, const vk::VkShaderModule shaderModule, const vk::VkSpecializationInfo* specInfo, PipelineCacheData& pipelineCacheData);
-vk::VkBufferImageCopy makeBufferImageCopy (const vk::VkImageSubresourceLayers subresourceLayers, const vk::VkExtent3D extent);
void beginRenderPassWithRasterizationDisabled (const vk::DeviceInterface& vk, const vk::VkCommandBuffer commandBuffer, const vk::VkRenderPass renderPass, const vk::VkFramebuffer framebuffer);
void requireFeatures (const vk::InstanceInterface& vki, const vk::VkPhysicalDevice physDevice, const FeatureFlags flags);
std::string getResourceName (const ResourceDescription& resource);
diff --git a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationWin32KeyedMutexTests.cpp b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationWin32KeyedMutexTests.cpp
index c4b2ca3..22eb3a8 100644
--- a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationWin32KeyedMutexTests.cpp
+++ b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationWin32KeyedMutexTests.cpp
@@ -34,9 +34,11 @@
#include "vktSynchronizationOperationTestData.hpp"
#include "vktExternalMemoryUtil.hpp"
#include "vktTestGroupUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "tcuResultCollector.hpp"
#include "tcuTestLog.hpp"
+#include "tcuCommandLine.hpp"
#if (DE_OS == DE_OS_WIN32)
# define WIN32_LEAN_AND_MEAN
@@ -144,40 +146,23 @@
m_vkd.freeMemory(m_device, getMemory(), DE_NULL);
}
-vk::Move<vk::VkInstance> createInstance (const vk::PlatformInterface& vkp, deUint32 version)
+CustomInstance createTestInstance (Context& context)
{
- try
- {
- std::vector<std::string> extensions;
- if (!isCoreInstanceExtension(version, "VK_KHR_get_physical_device_properties2"))
- extensions.push_back("VK_KHR_get_physical_device_properties2");
- if (!isCoreInstanceExtension(version, "VK_KHR_get_physical_device_properties2"))
- extensions.push_back("VK_KHR_external_memory_capabilities");
+ std::vector<std::string> extensions;
+ extensions.push_back("VK_KHR_get_physical_device_properties2");
+ extensions.push_back("VK_KHR_external_memory_capabilities");
- return vk::createDefaultInstance(vkp, version, std::vector<std::string>(), extensions);
- }
- catch (const vk::Error& error)
- {
- if (error.getError() == vk::VK_ERROR_EXTENSION_NOT_PRESENT)
- TCU_THROW(NotSupportedError, "Required external memory extensions not supported by the instance");
- else
- throw;
- }
+ return createCustomInstanceWithExtensions(context, extensions);
}
-vk::VkPhysicalDevice getPhysicalDevice (const vk::InstanceInterface& vki,
- vk::VkInstance instance,
- const tcu::CommandLine& cmdLine)
+vk::Move<vk::VkDevice> createTestDevice (Context& context,
+ vk::VkInstance instance,
+ const vk::InstanceInterface& vki,
+ vk::VkPhysicalDevice physicalDevice)
{
- return vk::chooseDevice(vki, instance, cmdLine);
-}
-
-vk::Move<vk::VkDevice> createDevice (const deUint32 apiVersion,
- const vk::PlatformInterface& vkp,
- vk::VkInstance instance,
- const vk::InstanceInterface& vki,
- vk::VkPhysicalDevice physicalDevice)
-{
+ const bool validationEnabled = context.getTestContext().getCommandLine().isValidationEnabled();
+ const deUint32 apiVersion = context.getUsedApiVersion();
+ const vk::PlatformInterface& vkp = context.getPlatformInterface();
const float priority = 0.0f;
const std::vector<vk::VkQueueFamilyProperties> queueFamilyProperties = vk::getPhysicalDeviceQueueFamilyProperties(vki, physicalDevice);
std::vector<deUint32> queueFamilyIndices (queueFamilyProperties.size(), 0xFFFFFFFFu);
@@ -230,7 +215,7 @@
0u
};
- return vk::createDevice(vkp, instance, vki, physicalDevice, &createInfo);
+ return createCustomDevice(validationEnabled, vkp, instance, vki, physicalDevice, &createInfo);
}
catch (const vk::Error& error)
{
@@ -1435,24 +1420,34 @@
// Class to wrap a singleton instance and device
class InstanceAndDevice
{
- InstanceAndDevice (const Context& context)
- : m_instance (createInstance(context.getPlatformInterface(), context.getUsedApiVersion()))
- , m_vki (context.getPlatformInterface(), *m_instance)
- , m_physicalDevice (getPhysicalDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
- , m_logicalDevice (createDevice(context.getUsedApiVersion(), context.getPlatformInterface(), *m_instance, m_vki, m_physicalDevice))
+ InstanceAndDevice (Context& context)
+ : m_instance (createTestInstance(context))
+ , m_vki (m_instance.getDriver())
+ , m_physicalDevice (vk::chooseDevice(m_vki, m_instance, context.getTestContext().getCommandLine()))
+ , m_logicalDevice (createTestDevice(context, m_instance, m_vki, m_physicalDevice))
, m_supportDX11 (new DX11OperationSupport(m_vki, m_physicalDevice))
{
}
public:
- static const vk::Unique<vk::VkInstance>& getInstance(const Context& context)
+ static vk::VkInstance getInstance(Context& context)
{
if (!m_instanceAndDevice)
m_instanceAndDevice = SharedPtr<InstanceAndDevice>(new InstanceAndDevice(context));
return m_instanceAndDevice->m_instance;
}
+ static const vk::InstanceDriver& getDriver()
+ {
+ DE_ASSERT(m_instanceAndDevice);
+ return m_instanceAndDevice->m_instance.getDriver();
+ }
+ static vk::VkPhysicalDevice getPhysicalDevice()
+ {
+ DE_ASSERT(m_instanceAndDevice);
+ return m_instanceAndDevice->m_physicalDevice;
+ }
static const Unique<vk::VkDevice>& getDevice()
{
DE_ASSERT(m_instanceAndDevice);
@@ -1463,6 +1458,11 @@
DE_ASSERT(m_instanceAndDevice);
return m_instanceAndDevice->m_supportDX11;
}
+ static void collectMessages()
+ {
+ DE_ASSERT(m_instanceAndDevice);
+ m_instanceAndDevice->m_instance.collectMessages();
+ }
static void destroy()
{
@@ -1470,8 +1470,8 @@
}
private:
- const Unique<vk::VkInstance> m_instance;
- const vk::InstanceDriver m_vki;
+ CustomInstance m_instance;
+ const vk::InstanceDriver& m_vki;
const vk::VkPhysicalDevice m_physicalDevice;
const Unique<vk::VkDevice> m_logicalDevice;
const de::UniquePtr<DX11OperationSupport> m_supportDX11;
@@ -1494,9 +1494,9 @@
const de::UniquePtr<OperationSupport> m_supportWriteOp;
const de::UniquePtr<OperationSupport> m_supportReadOp;
- const vk::Unique<vk::VkInstance>& m_instance;
+ const vk::VkInstance m_instance;
- const vk::InstanceDriver m_vki;
+ const vk::InstanceDriver& m_vki;
const vk::VkPhysicalDevice m_physicalDevice;
const std::vector<vk::VkQueueFamilyProperties> m_queueFamilies;
const std::vector<deUint32> m_queueFamilyIndices;
@@ -1522,12 +1522,12 @@
, m_instance (InstanceAndDevice::getInstance(context))
- , m_vki (context.getPlatformInterface(), *m_instance)
- , m_physicalDevice (getPhysicalDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
+ , m_vki (InstanceAndDevice::getDriver())
+ , m_physicalDevice (InstanceAndDevice::getPhysicalDevice())
, m_queueFamilies (vk::getPhysicalDeviceQueueFamilyProperties(m_vki, m_physicalDevice))
, m_queueFamilyIndices (getFamilyIndices(m_queueFamilies))
, m_device (InstanceAndDevice::getDevice())
- , m_vkd (context.getPlatformInterface(), *m_instance, *m_device)
+ , m_vkd (context.getPlatformInterface(), m_instance, *m_device)
, m_memoryHandleType ((m_config.resource.type == RESOURCE_TYPE_IMAGE) ? m_config.memoryHandleTypeImage : m_config.memoryHandleTypeBuffer)
@@ -1645,7 +1645,7 @@
const vk::Unique<vk::VkCommandBuffer> commandBufferRead (allocateCommandBuffer(m_vkd, *m_device, *commandPool, vk::VK_COMMAND_BUFFER_LEVEL_PRIMARY));
vk::SimpleAllocator allocator (m_vkd, *m_device, vk::getPhysicalDeviceMemoryProperties(m_vki, m_physicalDevice));
const std::vector<std::string> deviceExtensions;
- OperationContext operationContext (m_context.getUsedApiVersion(), m_vki, m_vkd, m_physicalDevice, *m_device, allocator, deviceExtensions, m_context.getBinaryCollection(), m_pipelineCacheData);
+ OperationContext operationContext (m_context, m_vki, m_vkd, m_physicalDevice, *m_device, allocator, deviceExtensions, m_context.getBinaryCollection(), m_pipelineCacheData);
if (!checkQueueFlags(m_queueFamilies[m_queueNdx].queueFlags, vk::VK_QUEUE_GRAPHICS_BIT))
TCU_THROW(NotSupportedError, "Operation not supported by the source queue");
@@ -1816,6 +1816,9 @@
m_resultCollector.fail(std::string("Exception: ") + error.getMessage());
}
+ // Collect possible validation errors.
+ InstanceAndDevice::collectMessages();
+
// Move to next queue
{
m_queueNdx++;
diff --git a/external/vulkancts/modules/vulkan/tessellation/vktTessellationUtil.cpp b/external/vulkancts/modules/vulkan/tessellation/vktTessellationUtil.cpp
index 4a297ed..e6893c3 100644
--- a/external/vulkancts/modules/vulkan/tessellation/vktTessellationUtil.cpp
+++ b/external/vulkancts/modules/vulkan/tessellation/vktTessellationUtil.cpp
@@ -86,21 +86,6 @@
return imageInfo;
}
-VkBufferImageCopy makeBufferImageCopy (const VkExtent3D extent,
- const VkImageSubresourceLayers subresourceLayers)
-{
- const VkBufferImageCopy copyParams =
- {
- 0ull, // VkDeviceSize bufferOffset;
- 0u, // deUint32 bufferRowLength;
- 0u, // deUint32 bufferImageHeight;
- subresourceLayers, // VkImageSubresourceLayers imageSubresource;
- makeOffset3D(0, 0, 0), // VkOffset3D imageOffset;
- extent, // VkExtent3D imageExtent;
- };
- return copyParams;
-}
-
void beginRenderPassWithRasterizationDisabled (const DeviceInterface& vk,
const VkCommandBuffer commandBuffer,
const VkRenderPass renderPass,
diff --git a/external/vulkancts/modules/vulkan/tessellation/vktTessellationWindingTests.cpp b/external/vulkancts/modules/vulkan/tessellation/vktTessellationWindingTests.cpp
index f1d81b0..452172e 100644
--- a/external/vulkancts/modules/vulkan/tessellation/vktTessellationWindingTests.cpp
+++ b/external/vulkancts/modules/vulkan/tessellation/vktTessellationWindingTests.cpp
@@ -404,7 +404,7 @@
void WindingTestInstance::requireExtension (const char* name) const
{
- if(!isDeviceExtensionSupported(m_context.getUsedApiVersion(), m_context.getDeviceExtensions(), name))
+ if(!m_context.isDeviceFunctionalitySupported(name))
TCU_THROW(NotSupportedError, (std::string(name) + " is not supported").c_str());
}
diff --git a/external/vulkancts/modules/vulkan/texture/vktSampleVerifierUtil.cpp b/external/vulkancts/modules/vulkan/texture/vktSampleVerifierUtil.cpp
index e33869b..06ac08b 100644
--- a/external/vulkancts/modules/vulkan/texture/vktSampleVerifierUtil.cpp
+++ b/external/vulkancts/modules/vulkan/texture/vktSampleVerifierUtil.cpp
@@ -653,7 +653,7 @@
bool isPackedType (const TextureFormat::ChannelType type)
{
- DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 40);
+ DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 42);
switch (type)
{
@@ -678,7 +678,7 @@
IVec4& bitOffsets,
int& baseTypeBytes)
{
- DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 40);
+ DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 42);
switch (texFormat.type)
{
diff --git a/external/vulkancts/modules/vulkan/texture/vktTextureFilteringTests.cpp b/external/vulkancts/modules/vulkan/texture/vktTextureFilteringTests.cpp
index 7c24146..5deb063 100644
--- a/external/vulkancts/modules/vulkan/texture/vktTextureFilteringTests.cpp
+++ b/external/vulkancts/modules/vulkan/texture/vktTextureFilteringTests.cpp
@@ -121,7 +121,7 @@
if ((testParameters.wrapS == Sampler::MIRRORED_ONCE ||
testParameters.wrapT == Sampler::MIRRORED_ONCE) &&
- !de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), "VK_KHR_sampler_mirror_clamp_to_edge"))
+ !context.isDeviceFunctionalitySupported("VK_KHR_sampler_mirror_clamp_to_edge"))
TCU_THROW(NotSupportedError, "VK_KHR_sampler_mirror_clamp_to_edge not supported");
// Create 2 textures.
@@ -320,7 +320,7 @@
if ((testParameters.wrapS == Sampler::MIRRORED_ONCE ||
testParameters.wrapT == Sampler::MIRRORED_ONCE) &&
- !de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), "VK_KHR_sampler_mirror_clamp_to_edge"))
+ !context.isDeviceFunctionalitySupported("VK_KHR_sampler_mirror_clamp_to_edge"))
TCU_THROW(NotSupportedError, "VK_KHR_sampler_mirror_clamp_to_edge not supported");
m_textures.reserve(2);
@@ -542,7 +542,7 @@
if ((testParameters.wrapS == Sampler::MIRRORED_ONCE ||
testParameters.wrapT == Sampler::MIRRORED_ONCE) &&
- !de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), "VK_KHR_sampler_mirror_clamp_to_edge"))
+ !context.isDeviceFunctionalitySupported("VK_KHR_sampler_mirror_clamp_to_edge"))
TCU_THROW(NotSupportedError, "VK_KHR_sampler_mirror_clamp_to_edge not supported");
// Create textures.
@@ -746,7 +746,7 @@
if ((testParameters.wrapS == Sampler::MIRRORED_ONCE ||
testParameters.wrapT == Sampler::MIRRORED_ONCE ||
testParameters.wrapR == Sampler::MIRRORED_ONCE) &&
- !de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), "VK_KHR_sampler_mirror_clamp_to_edge"))
+ !context.isDeviceFunctionalitySupported("VK_KHR_sampler_mirror_clamp_to_edge"))
TCU_THROW(NotSupportedError, "VK_KHR_sampler_mirror_clamp_to_edge not supported");
// Create textures.
diff --git a/external/vulkancts/modules/vulkan/transform_feedback/vktTransformFeedbackFuzzLayoutCase.cpp b/external/vulkancts/modules/vulkan/transform_feedback/vktTransformFeedbackFuzzLayoutCase.cpp
index 0fb8b1a..f0f617d 100644
--- a/external/vulkancts/modules/vulkan/transform_feedback/vktTransformFeedbackFuzzLayoutCase.cpp
+++ b/external/vulkancts/modules/vulkan/transform_feedback/vktTransformFeedbackFuzzLayoutCase.cpp
@@ -1559,24 +1559,6 @@
return src.str();
}
-VkBufferCreateInfo makeBufferCreateInfo (const VkDeviceSize bufferSize,
- const VkBufferUsageFlags usage)
-{
- const VkBufferCreateInfo bufferCreateInfo =
- {
- VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- (VkBufferCreateFlags)0, // VkBufferCreateFlags flags;
- bufferSize, // VkDeviceSize size;
- usage, // VkBufferUsageFlags usage;
- VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
- 0u, // deUint32 queueFamilyIndexCount;
- DE_NULL, // const deUint32* pQueueFamilyIndices;
- };
-
- return bufferCreateInfo;
-}
-
Move<VkPipeline> makeGraphicsPipeline (const DeviceInterface& vk,
const VkDevice device,
const VkPipelineLayout pipelineLayout,
@@ -1675,7 +1657,7 @@
const deUint32 componentsRequired = m_locationsRequired * componentsPerLocation;
const InstanceInterface& vki = m_context.getInstanceInterface();
const VkPhysicalDevice physDevice = m_context.getPhysicalDevice();
- const VkPhysicalDeviceTransformFeedbackFeaturesEXT& transformFeedbackFeatures = m_context.getTransformFeedbackFeatures();
+ const VkPhysicalDeviceTransformFeedbackFeaturesEXT& transformFeedbackFeatures = m_context.getTransformFeedbackFeaturesEXT();
const VkPhysicalDeviceLimits limits = getPhysicalDeviceProperties(vki, physDevice).limits;
VkPhysicalDeviceTransformFeedbackPropertiesEXT transformFeedbackProperties;
VkPhysicalDeviceProperties2 deviceProperties2;
diff --git a/external/vulkancts/modules/vulkan/transform_feedback/vktTransformFeedbackSimpleTests.cpp b/external/vulkancts/modules/vulkan/transform_feedback/vktTransformFeedbackSimpleTests.cpp
index 4ed22a3..2aff013 100644
--- a/external/vulkancts/modules/vulkan/transform_feedback/vktTransformFeedbackSimpleTests.cpp
+++ b/external/vulkancts/modules/vulkan/transform_feedback/vktTransformFeedbackSimpleTests.cpp
@@ -73,19 +73,29 @@
TEST_TYPE_MULTISTREAMS,
TEST_TYPE_DRAW_INDIRECT,
TEST_TYPE_BACKWARD_DEPENDENCY,
- TEST_TYPE_QUERY,
+ TEST_TYPE_QUERY_GET,
+ TEST_TYPE_QUERY_COPY,
TEST_TYPE_QUERY_RESET,
TEST_TYPE_LAST
};
+enum StreamId0Mode
+{
+ STREAM_ID_0_NORMAL = 0,
+ STREAM_ID_0_BEGIN_QUERY_INDEXED = 1,
+ STREAM_ID_0_END_QUERY_INDEXED = 2,
+};
+
struct TestParameters
{
- TestType testType;
- deUint32 bufferSize;
- deUint32 partCount;
- deUint32 streamId;
- deUint32 pointSize;
- deUint32 vertexStride;
+ TestType testType;
+ deUint32 bufferSize;
+ deUint32 partCount;
+ deUint32 streamId;
+ deUint32 pointSize;
+ deUint32 vertexStride;
+ StreamId0Mode streamId0Mode;
+ bool query64bits;
};
const deUint32 MINIMUM_TF_BUFFER_SIZE = (1<<27);
@@ -320,45 +330,6 @@
return barrier;
}
-VkBufferImageCopy makeBufferImageCopy (const VkExtent3D extent,
- const VkImageSubresourceLayers subresourceLayers)
-{
- const VkBufferImageCopy copyParams =
- {
- 0ull, // VkDeviceSize bufferOffset;
- 0u, // deUint32 bufferRowLength;
- 0u, // deUint32 bufferImageHeight;
- subresourceLayers, // VkImageSubresourceLayers imageSubresource;
- makeOffset3D(0, 0, 0), // VkOffset3D imageOffset;
- extent, // VkExtent3D imageExtent;
- };
- return copyParams;
-}
-
-inline Move<VkBuffer> makeBuffer (const DeviceInterface& vk, const VkDevice device, const VkBufferCreateInfo& createInfo)
-{
- return createBuffer(vk, device, &createInfo);
-}
-
-inline Move<VkImage> makeImage (const DeviceInterface& vk, const VkDevice device, const VkImageCreateInfo& createInfo)
-{
- return createImage(vk, device, &createInfo);
-}
-
-de::MovePtr<Allocation> bindImage (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkImage image, const MemoryRequirement requirement)
-{
- de::MovePtr<Allocation> alloc = allocator.allocate(getImageMemoryRequirements(vk, device, image), requirement);
- VK_CHECK(vk.bindImageMemory(device, image, alloc->getMemory(), alloc->getOffset()));
- return alloc;
-}
-
-de::MovePtr<Allocation> bindBuffer (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkBuffer buffer, const MemoryRequirement requirement)
-{
- de::MovePtr<Allocation> alloc(allocator.allocate(getBufferMemoryRequirements(vk, device, buffer), requirement));
- VK_CHECK(vk.bindBufferMemory(device, buffer, alloc->getMemory(), alloc->getOffset()));
- return alloc;
-}
-
VkQueryPoolCreateInfo makeQueryPoolCreateInfo (const deUint32 queryCountersNumber)
{
const VkQueryPoolCreateInfo queryPoolCreateInfo =
@@ -414,12 +385,12 @@
TransformFeedbackTestInstance::TransformFeedbackTestInstance (Context& context, const TestParameters& parameters)
: TestInstance (context)
- , m_extensions (context.requireDeviceExtension("VK_EXT_transform_feedback"))
+ , m_extensions (context.requireDeviceFunctionality("VK_EXT_transform_feedback"))
, m_imageExtent2D (makeExtent2D(IMAGE_SIZE, IMAGE_SIZE))
, m_parameters (parameters)
, m_rnd (0)
{
- const VkPhysicalDeviceTransformFeedbackFeaturesEXT& transformFeedbackFeatures = m_context.getTransformFeedbackFeatures();
+ const VkPhysicalDeviceTransformFeedbackFeaturesEXT& transformFeedbackFeatures = m_context.getTransformFeedbackFeaturesEXT();
VkPhysicalDeviceProperties2 deviceProperties2;
if (transformFeedbackFeatures.transformFeedback == DE_FALSE)
@@ -949,7 +920,7 @@
const InstanceInterface& vki = m_context.getInstanceInterface();
const VkPhysicalDevice physDevice = m_context.getPhysicalDevice();
const VkPhysicalDeviceFeatures features = getPhysicalDeviceFeatures(vki, physDevice);
- const VkPhysicalDeviceTransformFeedbackFeaturesEXT& transformFeedbackFeatures = m_context.getTransformFeedbackFeatures();
+ 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;
@@ -1083,7 +1054,7 @@
const InstanceInterface& vki = m_context.getInstanceInterface();
const VkPhysicalDevice physDevice = m_context.getPhysicalDevice();
const VkPhysicalDeviceFeatures features = getPhysicalDeviceFeatures(vki, physDevice);
- const VkPhysicalDeviceTransformFeedbackFeaturesEXT& transformFeedbackFeatures = m_context.getTransformFeedbackFeatures();
+ const VkPhysicalDeviceTransformFeedbackFeaturesEXT& transformFeedbackFeatures = m_context.getTransformFeedbackFeaturesEXT();
const deUint32 streamsSupported = m_transformFeedbackProperties.maxTransformFeedbackStreams;
const deUint32 streamsRequired = m_parameters.streamId + 1;
const bool geomPointSizeRequired = m_parameters.testType == TEST_TYPE_STREAMS_POINTSIZE;
@@ -1188,7 +1159,7 @@
const Unique<VkImage> colorImage (makeImage (vk, device, makeImageCreateInfo(0u, VK_IMAGE_TYPE_2D, colorFormat, m_imageExtent2D, 1u, imageUsageFlags)));
const UniquePtr<Allocation> colorImageAlloc (bindImage (vk, device, allocator, *colorImage, MemoryRequirement::Any));
const Unique<VkImageView> colorAttachment (makeImageView (vk, device, *colorImage, VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorSubresRange));
- const Unique<VkBuffer> colorBuffer (makeBuffer (vk, device, makeBufferCreateInfo(colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> colorBuffer (makeBuffer (vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> colorBufferAlloc (bindBuffer (vk, device, allocator, *colorBuffer, MemoryRequirement::HostVisible));
const Unique<VkFramebuffer> framebuffer (makeFramebuffer (vk, device, *renderPass, *colorAttachment, m_imageExtent2D.width, m_imageExtent2D.height));
@@ -1306,13 +1277,13 @@
const Unique<VkImage> colorImage (makeImage (vk, device, makeImageCreateInfo(0u, VK_IMAGE_TYPE_2D, colorFormat, m_imageExtent2D, 1u, imageUsageFlags)));
const UniquePtr<Allocation> colorImageAlloc (bindImage (vk, device, allocator, *colorImage, MemoryRequirement::Any));
const Unique<VkImageView> colorAttachment (makeImageView (vk, device, *colorImage, VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorSubresRange));
- const Unique<VkBuffer> colorBuffer (makeBuffer (vk, device, makeBufferCreateInfo(colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+ const Unique<VkBuffer> colorBuffer (makeBuffer (vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
const UniquePtr<Allocation> colorBufferAlloc (bindBuffer (vk, device, allocator, *colorBuffer, MemoryRequirement::HostVisible));
const deUint32 vertexCount = 6u;
const VkDeviceSize vertexBufferSize = vertexCount * m_parameters.vertexStride;
const VkBufferUsageFlags vertexBufferUsage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
- const Unique<VkBuffer> vertexBuffer (makeBuffer (vk, device, makeBufferCreateInfo(vertexBufferSize, vertexBufferUsage)));
+ const Unique<VkBuffer> vertexBuffer (makeBuffer (vk, device, vertexBufferSize, vertexBufferUsage));
const UniquePtr<Allocation> vertexBufferAlloc (bindBuffer (vk, device, allocator, *vertexBuffer, MemoryRequirement::HostVisible));
const VkDeviceSize vertexBufferOffset (0u);
const float vertexBufferVals[] =
@@ -1328,7 +1299,7 @@
const deUint32 counterBufferValue = m_parameters.vertexStride * vertexCount;
const VkDeviceSize counterBufferSize = sizeof(counterBufferValue);
const VkBufferUsageFlags counterBufferUsage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
- const Unique<VkBuffer> counterBuffer (makeBuffer (vk, device, makeBufferCreateInfo(counterBufferSize, counterBufferUsage)));
+ const Unique<VkBuffer> counterBuffer (makeBuffer (vk, device, counterBufferSize, counterBufferUsage));
const UniquePtr<Allocation> counterBufferAlloc (bindBuffer (vk, device, allocator, *counterBuffer, MemoryRequirement::HostVisible));
const Unique<VkFramebuffer> framebuffer (makeFramebuffer (vk, device, *renderPass, *colorAttachment, m_imageExtent2D.width, m_imageExtent2D.height));
@@ -1505,7 +1476,7 @@
const InstanceInterface& vki = m_context.getInstanceInterface();
const VkPhysicalDevice physDevice = m_context.getPhysicalDevice();
const VkPhysicalDeviceFeatures features = getPhysicalDeviceFeatures(vki, physDevice);
- const VkPhysicalDeviceTransformFeedbackFeaturesEXT& transformFeedbackFeatures = m_context.getTransformFeedbackFeatures();
+ const VkPhysicalDeviceTransformFeedbackFeaturesEXT& transformFeedbackFeatures = m_context.getTransformFeedbackFeaturesEXT();
const deUint32 streamsSupported = m_transformFeedbackProperties.maxTransformFeedbackStreams;
const deUint32 streamsRequired = m_parameters.streamId + 1;
@@ -1524,7 +1495,7 @@
if (m_parameters.testType == TEST_TYPE_QUERY_RESET)
{
// Check VK_EXT_host_query_reset is supported
- m_context.requireDeviceExtension("VK_EXT_host_query_reset");
+ m_context.requireDeviceFunctionality("VK_EXT_host_query_reset");
if(m_context.getHostQueryResetFeatures().hostQueryReset == VK_FALSE)
throw tcu::NotSupportedError(std::string("Implementation doesn't support resetting queries from the host").c_str());
}
@@ -1540,8 +1511,8 @@
const deUint32 overflowVertices = 3u;
const deUint32 bytesPerVertex = static_cast<deUint32>(4 * sizeof(float));
- const deUint32 numVerticesInBuffer = m_parameters.bufferSize / bytesPerVertex;
- const deUint32 numVerticesToWrite = numVerticesInBuffer + overflowVertices;
+ const deUint64 numVerticesInBuffer = m_parameters.bufferSize / bytesPerVertex;
+ const deUint64 numVerticesToWrite = numVerticesInBuffer + overflowVertices;
const Unique<VkRenderPass> renderPass (makeRenderPass (vk, device, VK_FORMAT_UNDEFINED));
const Unique<VkShaderModule> vertModule (createShaderModule (vk, device, m_context.getBinaryCollection().get("vert"), 0u));
@@ -1559,16 +1530,44 @@
const VkDeviceSize tfBufBindingSize = m_parameters.bufferSize;
const VkDeviceSize tfBufBindingOffset = 0ull;
+ const size_t queryResultWidth = (m_parameters.query64bits ? sizeof(deUint64) : sizeof(deUint32));
+ const vk::VkQueryControlFlags queryExtraFlags = (m_parameters.query64bits ? vk::VK_QUERY_RESULT_64_BIT : 0);
const deUint32 queryCountersNumber = 1u;
const deUint32 queryIndex = 0u;
+ constexpr deUint32 queryResultElements = 2u;
+ const deUint32 queryDataSize = static_cast<deUint32>(queryResultElements * queryResultWidth);
const VkQueryPoolCreateInfo queryPoolCreateInfo = makeQueryPoolCreateInfo(queryCountersNumber);
const Unique<VkQueryPool> queryPool (createQueryPool(vk, device, &queryPoolCreateInfo));
+ Move<VkBuffer> queryPoolResultsBuffer;
+ de::MovePtr<Allocation> queryPoolResultsBufferAlloc;
+
DE_ASSERT(numVerticesInBuffer * bytesPerVertex == m_parameters.bufferSize);
+ if (m_parameters.testType == TEST_TYPE_QUERY_COPY)
+ {
+ const VkBufferCreateInfo bufferParams =
+ {
+ VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkBufferCreateFlags flags;
+ queryDataSize, // VkDeviceSize size;
+ VK_BUFFER_USAGE_TRANSFER_DST_BIT, // VkBufferUsageFlags usage;
+ VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
+ 1u, // deUint32 queueFamilyCount;
+ &queueFamilyIndex // const deUint32* pQueueFamilyIndices;
+ };
+
+ queryPoolResultsBuffer = createBuffer(vk, device, &bufferParams);
+ queryPoolResultsBufferAlloc = allocator.allocate(getBufferMemoryRequirements(vk, device, *queryPoolResultsBuffer), MemoryRequirement::HostVisible);
+
+ VK_CHECK(vk.bindBufferMemory(device, *queryPoolResultsBuffer, queryPoolResultsBufferAlloc->getMemory(), queryPoolResultsBufferAlloc->getOffset()));
+ }
+
beginCommandBuffer(vk, *cmdBuffer);
{
- vk.cmdResetQueryPool(*cmdBuffer, *queryPool, queryIndex, queryCountersNumber);
+ if (m_parameters.testType != TEST_TYPE_QUERY_RESET)
+ vk.cmdResetQueryPool(*cmdBuffer, *queryPool, queryIndex, queryCountersNumber);
beginRenderPass(vk, *cmdBuffer, *renderPass, *framebuffer, makeRect2D(m_imageExtent2D));
{
@@ -1576,71 +1575,122 @@
vk.cmdBindTransformFeedbackBuffersEXT(*cmdBuffer, 0u, 1u, &*tfBuf, &tfBufBindingOffset, &tfBufBindingSize);
- if (m_parameters.streamId == 0)
+ if (m_parameters.streamId == 0 && m_parameters.streamId0Mode != STREAM_ID_0_BEGIN_QUERY_INDEXED)
vk.cmdBeginQuery(*cmdBuffer, *queryPool, queryIndex, 0u);
else
vk.cmdBeginQueryIndexedEXT(*cmdBuffer, *queryPool, queryIndex, 0u, m_parameters.streamId);
{
vk.cmdBeginTransformFeedbackEXT(*cmdBuffer, 0, 0, DE_NULL, DE_NULL);
{
- vk.cmdDraw(*cmdBuffer, numVerticesToWrite, 1u, 0u, 0u);
+ vk.cmdDraw(*cmdBuffer, static_cast<deUint32>(numVerticesToWrite), 1u, 0u, 0u);
}
vk.cmdEndTransformFeedbackEXT(*cmdBuffer, 0, 0, DE_NULL, DE_NULL);
}
- if (m_parameters.streamId == 0)
+ if (m_parameters.streamId == 0 && m_parameters.streamId0Mode != STREAM_ID_0_END_QUERY_INDEXED)
vk.cmdEndQuery(*cmdBuffer, *queryPool, queryIndex);
else
vk.cmdEndQueryIndexedEXT(*cmdBuffer, *queryPool, queryIndex, m_parameters.streamId);
}
endRenderPass(vk, *cmdBuffer);
+
+ if (m_parameters.testType == TEST_TYPE_QUERY_COPY)
+ {
+ vk.cmdCopyQueryPoolResults(*cmdBuffer, *queryPool, queryIndex, queryCountersNumber, *queryPoolResultsBuffer, 0u, queryDataSize, (vk::VK_QUERY_RESULT_WAIT_BIT | queryExtraFlags));
+
+ 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;
+ *queryPoolResultsBuffer, // 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);
if (m_parameters.testType == TEST_TYPE_QUERY_RESET)
- vk.resetQueryPoolEXT(device, *queryPool, queryIndex, queryCountersNumber);
+ vk.resetQueryPool(device, *queryPool, queryIndex, queryCountersNumber);
submitCommandsAndWait(vk, device, queue, *cmdBuffer);
{
- const deUint32 queryDataSize (static_cast<deUint32>(2u * sizeof(deUint32)));
- std::vector<deUint8> queryData (queryDataSize, 0u);
- const deUint32* numPrimitivesWritten = reinterpret_cast<deUint32*>(&queryData[0]);
- const deUint32* numPrimitivesNeeded = numPrimitivesWritten + 1;
+ union Results {
+ deUint32 elements32[queryResultElements];
+ deUint64 elements64[queryResultElements];
+ };
- vk.getQueryPoolResults(device, *queryPool, queryIndex, queryCountersNumber, queryDataSize, &queryData[0], queryDataSize, 0u);
+ std::vector<deUint8> queryData (queryDataSize, 0u);
+ const Results* queryResults = reinterpret_cast<Results*>(queryData.data());
- if (*numPrimitivesWritten != numVerticesInBuffer)
- return tcu::TestStatus::fail("numPrimitivesWritten=" + de::toString(*numPrimitivesWritten) + " while expected " + de::toString(numVerticesInBuffer));
+ if (m_parameters.testType != TEST_TYPE_QUERY_COPY)
+ {
+ vk.getQueryPoolResults(device, *queryPool, queryIndex, queryCountersNumber, queryDataSize, queryData.data(), queryDataSize, (vk::VK_QUERY_RESULT_WAIT_BIT | queryExtraFlags));
+ }
+ else
+ {
+ invalidateAlloc(vk, device, *queryPoolResultsBufferAlloc);
+ deMemcpy(queryData.data(), queryPoolResultsBufferAlloc->getHostPtr(), queryData.size());
+ }
- if (*numPrimitivesNeeded != numVerticesToWrite)
- return tcu::TestStatus::fail("numPrimitivesNeeded=" + de::toString(*numPrimitivesNeeded) + " while expected " + de::toString(numVerticesToWrite));
+ const deUint64 numPrimitivesWritten = (m_parameters.query64bits ? queryResults->elements64[0] : queryResults->elements32[0]);
+ const deUint64 numPrimitivesNeeded = (m_parameters.query64bits ? queryResults->elements64[1] : queryResults->elements32[1]);
+
+ if (numPrimitivesWritten != numVerticesInBuffer)
+ return tcu::TestStatus::fail("numPrimitivesWritten=" + de::toString(numPrimitivesWritten) + " while expected " + de::toString(numVerticesInBuffer));
+
+ if (numPrimitivesNeeded != numVerticesToWrite)
+ return tcu::TestStatus::fail("numPrimitivesNeeded=" + de::toString(numPrimitivesNeeded) + " while expected " + de::toString(numVerticesToWrite));
}
if (m_parameters.testType == TEST_TYPE_QUERY_RESET)
{
+ constexpr deUint32 queryResetElements = queryResultElements + 1; // For the availability bit.
- const deUint32 queryDataSize (static_cast<deUint32>(3u * sizeof(deUint32)));
- std::vector<deUint8> queryData (queryDataSize, 0u);
- deUint32* numPrimitivesWritten = reinterpret_cast<deUint32*>(&queryData[0]);
- deUint32* numPrimitivesNeeded = numPrimitivesWritten + 1;
- deUint32* availabilityState = numPrimitivesNeeded + 1;
+ union Results {
+ deUint32 elements32[queryResetElements];
+ deUint64 elements64[queryResetElements];
+ };
+
+ const deUint32 queryDataAvailSize (static_cast<deUint32>(queryResetElements * queryResultWidth));
+ std::vector<deUint8> queryData (queryDataAvailSize, 0u);
+ Results* queryResults = reinterpret_cast<Results*>(queryData.data());
// Initialize values
- *numPrimitivesNeeded = 1u;
- *numPrimitivesWritten = 1u;
- *availabilityState = 1u;
+ if (m_parameters.query64bits)
+ {
+ queryResults->elements64[0] = 1u; // numPrimitivesWritten
+ queryResults->elements64[1] = 1u; // numPrimitivesNeeded
+ queryResults->elements64[2] = 1u; // Availability bit
+ }
+ else
+ {
+ queryResults->elements32[0] = 1u; // numPrimitivesWritten
+ queryResults->elements32[1] = 1u; // numPrimitivesNeeded
+ queryResults->elements32[2] = 1u; // Availability bit
+ }
- vk.resetQueryPoolEXT(device, *queryPool, queryIndex, queryCountersNumber);
+ vk.resetQueryPool(device, *queryPool, queryIndex, queryCountersNumber);
- vk::VkResult res = vk.getQueryPoolResults(device, *queryPool, queryIndex, queryCountersNumber, queryDataSize, &queryData[0], queryDataSize, VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
- /* From Vulkan spec:
+ vk::VkResult res = vk.getQueryPoolResults(device, *queryPool, queryIndex, queryCountersNumber, queryDataAvailSize, queryData.data(), queryDataAvailSize, (vk::VK_QUERY_RESULT_WITH_AVAILABILITY_BIT | queryExtraFlags));
+ const deUint64 numPrimitivesWritten = (m_parameters.query64bits ? queryResults->elements64[0] : queryResults->elements32[0]);
+ const deUint64 numPrimitivesNeeded = (m_parameters.query64bits ? queryResults->elements64[1] : queryResults->elements32[1]);
+ const deUint64 availabilityState = (m_parameters.query64bits ? queryResults->elements64[2] : queryResults->elements32[2]);
+
+ /* From the Vulkan spec:
*
* If VK_QUERY_RESULT_WAIT_BIT and VK_QUERY_RESULT_PARTIAL_BIT are both not set then no result values are written to pData
* for queries that are in the unavailable state at the time of the call, and vkGetQueryPoolResults returns VK_NOT_READY.
* However, availability state is still written to pData for those queries if VK_QUERY_RESULT_WITH_AVAILABILITY_BIT is set.
*/
- if (res != vk::VK_NOT_READY || *availabilityState != 0u)
+ if (res != vk::VK_NOT_READY || availabilityState != 0u)
return tcu::TestStatus::fail("QueryPoolResults incorrect reset");
- if (*numPrimitivesWritten != 1u || *numPrimitivesNeeded != 1u )
+ if (numPrimitivesWritten != 1u || numPrimitivesNeeded != 1u)
return tcu::TestStatus::fail("QueryPoolResults data was modified");
}
@@ -1710,7 +1760,9 @@
if (m_parameters.testType == TEST_TYPE_BACKWARD_DEPENDENCY)
return new TransformFeedbackBackwardDependencyTestInstance(context, m_parameters);
- if (m_parameters.testType == TEST_TYPE_QUERY || m_parameters.testType == TEST_TYPE_QUERY_RESET)
+ if (m_parameters.testType == TEST_TYPE_QUERY_GET ||
+ m_parameters.testType == TEST_TYPE_QUERY_COPY ||
+ m_parameters.testType == TEST_TYPE_QUERY_RESET)
return new TransformFeedbackQueryTestInstance(context, m_parameters);
TCU_THROW(InternalError, "Specified test type not found");
@@ -2060,7 +2112,9 @@
return;
}
- if (m_parameters.testType == TEST_TYPE_QUERY || m_parameters.testType == TEST_TYPE_QUERY_RESET)
+ if (m_parameters.testType == TEST_TYPE_QUERY_GET ||
+ m_parameters.testType == TEST_TYPE_QUERY_COPY ||
+ m_parameters.testType == TEST_TYPE_QUERY_RESET)
{
// Vertex shader
{
@@ -2148,10 +2202,14 @@
for (deUint32 bufferSizesNdx = 0; bufferSizesNdx < DE_LENGTH_OF_ARRAY(bufferSizes); ++bufferSizesNdx)
{
- const deUint32 bufferSize = bufferSizes[bufferSizesNdx];
- const TestParameters parameters = { testType, bufferSize, partCount, 0u, 0u, 0u };
+ const deUint32 bufferSize = bufferSizes[bufferSizesNdx];
+ TestParameters parameters = { testType, bufferSize, partCount, 0u, 0u, 0u, STREAM_ID_0_NORMAL, false };
group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_" + de::toString(partCount) + "_" + de::toString(bufferSize)).c_str(), "Simple Transform Feedback test", parameters));
+ parameters.streamId0Mode = STREAM_ID_0_BEGIN_QUERY_INDEXED;
+ group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_beginqueryindexed_streamid_0_" + de::toString(partCount) + "_" + de::toString(bufferSize)).c_str(), "Simple Transform Feedback test", parameters));
+ parameters.streamId0Mode = STREAM_ID_0_END_QUERY_INDEXED;
+ group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_endqueryindexed_streamid_0_" + de::toString(partCount) + "_" + de::toString(bufferSize)).c_str(), "Simple Transform Feedback test", parameters));
}
}
}
@@ -2170,9 +2228,13 @@
for (deUint32 bufferCountsNdx = 0; bufferCountsNdx < DE_LENGTH_OF_ARRAY(bufferCounts); ++bufferCountsNdx)
{
const deUint32 vertexCount = bufferCounts[bufferCountsNdx];
- const TestParameters parameters = { testType, 0u, vertexCount, 0u, 0u, 0u };
+ TestParameters parameters = { testType, 0u, vertexCount, 0u, 0u, 0u, STREAM_ID_0_NORMAL, false };
group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_" + de::toString(vertexCount)).c_str(), "Triangle Strip With Adjacency Transform Feedback test", parameters));
+ parameters.streamId0Mode = STREAM_ID_0_BEGIN_QUERY_INDEXED;
+ group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_beginqueryindexed_streamid_0_" + de::toString(vertexCount)).c_str(), "Triangle Strip With Adjacency Transform Feedback test", parameters));
+ parameters.streamId0Mode = STREAM_ID_0_END_QUERY_INDEXED;
+ group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_endqueryindexed_streamid_0_" + de::toString(vertexCount)).c_str(), "Triangle Strip With Adjacency Transform Feedback test", parameters));
}
}
}
@@ -2184,26 +2246,36 @@
for (deUint32 vertexStridesNdx = 0; vertexStridesNdx < DE_LENGTH_OF_ARRAY(vertexStrides); ++vertexStridesNdx)
{
- const deUint32 vertexStride = static_cast<deUint32>(sizeof(deUint32) * vertexStrides[vertexStridesNdx]);
- const TestParameters parameters = { testType, 0u, 0u, 0u, 0u, vertexStride };
+ const deUint32 vertexStride = static_cast<deUint32>(sizeof(deUint32) * vertexStrides[vertexStridesNdx]);
+ TestParameters parameters = { testType, 0u, 0u, 0u, 0u, vertexStride, STREAM_ID_0_NORMAL, false };
group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_" + de::toString(vertexStride)).c_str(), "Rendering tests with various strides", parameters));
+ parameters.streamId0Mode = STREAM_ID_0_BEGIN_QUERY_INDEXED;
+ group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_beginqueryindexed_streamid_0_" + de::toString(vertexStride)).c_str(), "Rendering tests with various strides", parameters));
+ parameters.streamId0Mode = STREAM_ID_0_END_QUERY_INDEXED;
+ group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_endqueryindexed_streamid_0_" + de::toString(vertexStride)).c_str(), "Rendering tests with various strides", parameters));
}
}
{
- const TestType testType = TEST_TYPE_BACKWARD_DEPENDENCY;
- const std::string testName = "backward_dependency";
- const TestParameters parameters = { testType, 512u, 2u, 0u, 0u, 0u };
+ const TestType testType = TEST_TYPE_BACKWARD_DEPENDENCY;
+ const std::string testName = "backward_dependency";
+ TestParameters parameters = { testType, 512u, 2u, 0u, 0u, 0u, STREAM_ID_0_NORMAL, false };
group->addChild(new TransformFeedbackTestCase(group->getTestContext(), testName.c_str(), "Rendering test checks backward pipeline dependency", parameters));
+ parameters.streamId0Mode = STREAM_ID_0_BEGIN_QUERY_INDEXED;
+ group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_beginqueryindexed_streamid_0").c_str(), "Rendering test checks backward pipeline dependency", parameters));
+ parameters.streamId0Mode = STREAM_ID_0_END_QUERY_INDEXED;
+ group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_endqueryindexed_streamid_0").c_str(), "Rendering test checks backward pipeline dependency", parameters));
}
{
const deUint32 usedStreamId[] = { 0, 1, 3, 6, 14 };
const deUint32 vertexCount[] = { 4, 61, 127, 251, 509 };
- const TestType testType = TEST_TYPE_QUERY;
+ const TestType testType = TEST_TYPE_QUERY_GET;
const std::string testName = "query";
+ const TestType testTypeCopy = TEST_TYPE_QUERY_COPY;
+ const std::string testNameCopy = "query_copy";
const TestType testTypeHostQueryReset = TEST_TYPE_QUERY_RESET;
const std::string testNameHostQueryReset = "host_query_reset";
@@ -2213,16 +2285,37 @@
for (deUint32 vertexCountNdx = 0; vertexCountNdx < DE_LENGTH_OF_ARRAY(vertexCount); ++vertexCountNdx)
{
- const deUint32 bytesPerVertex = static_cast<deUint32>(4 * sizeof(float));
- const deUint32 bufferSize = bytesPerVertex * vertexCount[vertexCountNdx];
- const TestParameters parameters = { testType, bufferSize, 0u, streamId, 0u, 0u };
- const std::string fullTestName = testName + "_" + de::toString(streamId) + "_" + de::toString(vertexCount[vertexCountNdx]);
+ for (deUint32 i = 0; i < 2; ++i)
+ {
+ const bool query64Bits = (i == 1);
+ const std::string widthStr = (query64Bits ? "_64bits" : "_32bits");
- group->addChild(new TransformFeedbackTestCase(group->getTestContext(), fullTestName.c_str(), "Written primitives query test", parameters));
+ const deUint32 bytesPerVertex = static_cast<deUint32>(4 * sizeof(float));
+ const deUint32 bufferSize = bytesPerVertex * vertexCount[vertexCountNdx];
+ TestParameters parameters = { testType, bufferSize, 0u, streamId, 0u, 0u, STREAM_ID_0_NORMAL, query64Bits };
+ const std::string fullTestName = testName + "_" + de::toString(streamId) + "_" + de::toString(vertexCount[vertexCountNdx]) + widthStr;
+ group->addChild(new TransformFeedbackTestCase(group->getTestContext(), fullTestName.c_str(), "Written primitives query test", parameters));
- const std::string fullTestNameHostQueryReset = testNameHostQueryReset + "_" + de::toString(streamId) + "_" + de::toString(vertexCount[vertexCountNdx]);
- const TestParameters parametersHostQueryReset = { testTypeHostQueryReset, bufferSize, 0u, streamId, 0u, 0u };
- group->addChild(new TransformFeedbackTestCase(group->getTestContext(), fullTestNameHostQueryReset.c_str(), "Written primitives query test", parametersHostQueryReset));
+ const TestParameters parametersCopy = { testTypeCopy, bufferSize, 0u, streamId, 0u, 0u, STREAM_ID_0_NORMAL, query64Bits };
+ const std::string fullTestNameCopy = testNameCopy + "_" + de::toString(streamId) + "_" + de::toString(vertexCount[vertexCountNdx]) + widthStr;
+ group->addChild(new TransformFeedbackTestCase(group->getTestContext(), fullTestNameCopy.c_str(), "Written primitives query test", parametersCopy));
+
+ const TestParameters parametersHostQueryReset = { testTypeHostQueryReset, bufferSize, 0u, streamId, 0u, 0u, STREAM_ID_0_NORMAL, query64Bits };
+ const std::string fullTestNameHostQueryReset = testNameHostQueryReset + "_" + de::toString(streamId) + "_" + de::toString(vertexCount[vertexCountNdx]) + widthStr;
+ group->addChild(new TransformFeedbackTestCase(group->getTestContext(), fullTestNameHostQueryReset.c_str(), "Written primitives query test", parametersHostQueryReset));
+
+ if (streamId == 0)
+ {
+ std::string testNameStream0 = fullTestName;
+ testNameStream0 += "_beginqueryindexed_streamid_0";
+ parameters.streamId0Mode = STREAM_ID_0_BEGIN_QUERY_INDEXED;
+ group->addChild(new TransformFeedbackTestCase(group->getTestContext(), testNameStream0.c_str(), "Written primitives query test", parameters));
+ testNameStream0 = fullTestName;
+ testNameStream0 += "_endqueryindexed_streamid_0";
+ parameters.streamId0Mode = STREAM_ID_0_END_QUERY_INDEXED;
+ group->addChild(new TransformFeedbackTestCase(group->getTestContext(), testNameStream0.c_str(), "Written primitives query test", parameters));
+ }
+ }
}
}
}
@@ -2230,9 +2323,9 @@
void createTransformFeedbackStreamsSimpleTests (tcu::TestCaseGroup* group)
{
- const deUint32 usedStreamId[] = { 1, 3, 6, 14 };
- const TestType testTypes[] = { TEST_TYPE_STREAMS, TEST_TYPE_STREAMS_POINTSIZE, TEST_TYPE_STREAMS_CLIPDISTANCE, TEST_TYPE_STREAMS_CULLDISTANCE };
- const std::string testTypeNames[] = { "streams", "streams_pointsize", "streams_clipdistance", "streams_culldistance" };
+ const deUint32 usedStreamId[] = { 1, 3, 6, 14 };
+ const TestType testTypes[] = { TEST_TYPE_STREAMS, TEST_TYPE_STREAMS_POINTSIZE, TEST_TYPE_STREAMS_CLIPDISTANCE, TEST_TYPE_STREAMS_CULLDISTANCE };
+ const std::string testTypeNames[] = { "streams", "streams_pointsize", "streams_clipdistance", "streams_culldistance" };
for (deUint32 testTypesNdx = 0; testTypesNdx < DE_LENGTH_OF_ARRAY(testTypes); ++testTypesNdx)
{
@@ -2242,8 +2335,8 @@
for (deUint32 streamCountsNdx = 0; streamCountsNdx < DE_LENGTH_OF_ARRAY(usedStreamId); ++streamCountsNdx)
{
- const deUint32 streamId = usedStreamId[streamCountsNdx];
- const TestParameters parameters = { testType, 0u, 0u, streamId, pointSize, 0u };
+ const deUint32 streamId = usedStreamId[streamCountsNdx];
+ TestParameters parameters = { testType, 0u, 0u, streamId, pointSize, 0u, STREAM_ID_0_NORMAL, false };
group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_" + de::toString(streamId)).c_str(), "Streams usage test", parameters));
}
@@ -2258,7 +2351,7 @@
const deUint32 streamId = usedStreamId[bufferCountsNdx];
const deUint32 streamsUsed = 2u;
const deUint32 maxBytesPerVertex = 256u;
- const TestParameters parameters = { testType, maxBytesPerVertex * streamsUsed, streamsUsed, streamId, 0u, 0u };
+ const TestParameters parameters = { testType, maxBytesPerVertex * streamsUsed, streamsUsed, streamId, 0u, 0u, STREAM_ID_0_NORMAL, false };
group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_" + de::toString(streamId)).c_str(), "Simultaneous multiple streams usage test", parameters));
}
diff --git a/external/vulkancts/modules/vulkan/util/vktDrawUtil.cpp b/external/vulkancts/modules/vulkan/util/vktDrawUtil.cpp
index 36202da..a02e4e8 100644
--- a/external/vulkancts/modules/vulkan/util/vktDrawUtil.cpp
+++ b/external/vulkancts/modules/vulkan/util/vktDrawUtil.cpp
@@ -98,21 +98,6 @@
return allocateCommandBuffer(vk, device, &info);
}
-VkBufferImageCopy makeBufferImageCopy (const VkImageSubresourceLayers subresourceLayers,
- const VkExtent3D extent)
-{
- const VkBufferImageCopy copyParams =
- {
- 0ull, // VkDeviceSize bufferOffset;
- 0u, // deUint32 bufferRowLength;
- 0u, // deUint32 bufferImageHeight;
- subresourceLayers, // VkImageSubresourceLayers imageSubresource;
- makeOffset3D(0, 0, 0), // VkOffset3D imageOffset;
- extent, // VkExtent3D imageExtent;
- };
- return copyParams;
-}
-
std::string getPrimitiveTopologyShortName (const VkPrimitiveTopology topology)
{
std::string name(getPrimitiveTopologyName(topology));
@@ -610,8 +595,9 @@
else
m_resolveImage = m_colorImage;
- const VkBufferImageCopy copyRegion = makeBufferImageCopy(makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u),
- makeExtent3D(m_drawState.renderSize.x(), m_drawState.renderSize.y(), 1u));
+ const VkBufferImageCopy copyRegion = makeBufferImageCopy(
+ makeExtent3D(m_drawState.renderSize.x(), m_drawState.renderSize.y(), 1u),
+ makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u));
vk.cmdCopyImageToBuffer(*m_cmdBuffer, **m_resolveImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, **m_colorAttachmentBuffer, 1u, ©Region);
}
diff --git a/external/vulkancts/modules/vulkan/util/vktExternalMemoryUtil.cpp b/external/vulkancts/modules/vulkan/util/vktExternalMemoryUtil.cpp
index 602269e..ae93b90 100644
--- a/external/vulkancts/modules/vulkan/util/vktExternalMemoryUtil.cpp
+++ b/external/vulkancts/modules/vulkan/util/vktExternalMemoryUtil.cpp
@@ -714,12 +714,12 @@
vk::Move<vk::VkSemaphore> createExportableSemaphoreType (const vk::DeviceInterface& vkd,
vk::VkDevice device,
- vk::VkSemaphoreTypeKHR semaphoreType,
+ vk::VkSemaphoreType semaphoreType,
vk::VkExternalSemaphoreHandleTypeFlagBits externalType)
{
- const vk::VkSemaphoreTypeCreateInfoKHR semaphoreTypeCreateInfo =
+ const vk::VkSemaphoreTypeCreateInfo semaphoreTypeCreateInfo =
{
- vk::VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR,
+ vk::VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO,
DE_NULL,
semaphoreType,
0,
diff --git a/external/vulkancts/modules/vulkan/util/vktExternalMemoryUtil.hpp b/external/vulkancts/modules/vulkan/util/vktExternalMemoryUtil.hpp
index 3dc9be5..14d21f7 100644
--- a/external/vulkancts/modules/vulkan/util/vktExternalMemoryUtil.hpp
+++ b/external/vulkancts/modules/vulkan/util/vktExternalMemoryUtil.hpp
@@ -191,7 +191,7 @@
vk::Move<vk::VkSemaphore> createExportableSemaphoreType (const vk::DeviceInterface& vkd,
vk::VkDevice device,
- vk::VkSemaphoreTypeKHR semaphoreType,
+ vk::VkSemaphoreType semaphoreType,
vk::VkExternalSemaphoreHandleTypeFlagBits externalType);
int getSemaphoreFd (const vk::DeviceInterface& vkd,
diff --git a/external/vulkancts/modules/vulkan/vktBuildPrograms.cpp b/external/vulkancts/modules/vulkan/vktBuildPrograms.cpp
index a35bf44..5ff16ca 100644
--- a/external/vulkancts/modules/vulkan/vktBuildPrograms.cpp
+++ b/external/vulkancts/modules/vulkan/vktBuildPrograms.cpp
@@ -394,7 +394,8 @@
const bool validateBinaries,
const deUint32 usedVulkanVersion,
const vk::SpirvVersion baselineSpirvVersion,
- const vk::SpirvVersion maxSpirvVersion)
+ const vk::SpirvVersion maxSpirvVersion,
+ const bool allowSpirV14)
{
const deUint32 numThreads = deGetNumAvailableLogicalCores();
@@ -447,7 +448,8 @@
++progIter)
{
// Source program requires higher SPIR-V version than available: skip it to avoid fail
- if (progIter.getProgram().buildOptions.targetVersion > maxSpirvVersion)
+ // Unless this is SPIR-V 1.4 and is explicitly allowed.
+ if (progIter.getProgram().buildOptions.targetVersion > maxSpirvVersion && !(allowSpirV14 && progIter.getProgram().buildOptions.supports_VK_KHR_spirv_1_4 && progIter.getProgram().buildOptions.targetVersion == vk::SPIRV_VERSION_1_4))
continue;
programs.pushBack(Program(vk::ProgramIdentifier(casePath, progIter.getName()), progIter.getProgram().buildOptions.getSpirvValidatorOptions()));
@@ -461,7 +463,8 @@
++progIter)
{
// Source program requires higher SPIR-V version than available: skip it to avoid fail
- if (progIter.getProgram().buildOptions.targetVersion > maxSpirvVersion)
+ // Unless this is SPIR-V 1.4 and is explicitly allowed.
+ if (progIter.getProgram().buildOptions.targetVersion > maxSpirvVersion && !(allowSpirV14 && progIter.getProgram().buildOptions.supports_VK_KHR_spirv_1_4 && progIter.getProgram().buildOptions.targetVersion == vk::SPIRV_VERSION_1_4))
continue;
programs.pushBack(Program(vk::ProgramIdentifier(casePath, progIter.getName()), progIter.getProgram().buildOptions.getSpirvValidatorOptions()));
@@ -475,7 +478,8 @@
++progIter)
{
// Source program requires higher SPIR-V version than available: skip it to avoid fail
- if (progIter.getProgram().buildOptions.targetVersion > maxSpirvVersion)
+ // Unless this is SPIR-V 1.4 and is explicitly allowed.
+ if (progIter.getProgram().buildOptions.targetVersion > maxSpirvVersion && !(allowSpirV14 && progIter.getProgram().buildOptions.supports_VK_KHR_spirv_1_4 && progIter.getProgram().buildOptions.targetVersion == vk::SPIRV_VERSION_1_4))
continue;
programs.pushBack(Program(vk::ProgramIdentifier(casePath, progIter.getName()), progIter.getProgram().buildOptions.getSpirvValidatorOptions()));
@@ -562,6 +566,7 @@
DE_DECLARE_COMMAND_LINE_OPT(ShaderCacheTruncate, bool);
DE_DECLARE_COMMAND_LINE_OPT(SpirvOptimize, bool);
DE_DECLARE_COMMAND_LINE_OPT(SpirvOptimizationRecipe,std::string);
+DE_DECLARE_COMMAND_LINE_OPT(SpirvAllow14, bool);
static const de::cmdline::NamedValue<bool> s_enableNames[] =
{
@@ -578,19 +583,21 @@
{
{ "1.0", VK_MAKE_VERSION(1, 0, 0) },
{ "1.1", VK_MAKE_VERSION(1, 1, 0) },
+ { "1.2", VK_MAKE_VERSION(1, 2, 0) },
};
- DE_STATIC_ASSERT(vk::SPIRV_VERSION_1_3 + 1 == vk::SPIRV_VERSION_LAST);
+ DE_STATIC_ASSERT(vk::SPIRV_VERSION_1_5 + 1 == vk::SPIRV_VERSION_LAST);
parser << Option<opt::DstPath>("d", "dst-path", "Destination path", "out")
<< Option<opt::Cases>("n", "deqp-case", "Case path filter (works as in test binaries)")
<< Option<opt::Validate>("v", "validate-spv", "Validate generated SPIR-V binaries")
- << Option<opt::VulkanVersion>("t", "target-vulkan-version", "Target Vulkan version", s_vulkanVersion, "1.1")
+ << Option<opt::VulkanVersion>("t", "target-vulkan-version", "Target Vulkan version", s_vulkanVersion, "1.2")
<< Option<opt::ShaderCache>("s", "shadercache", "Enable or disable shader cache", s_enableNames, "enable")
<< Option<opt::ShaderCacheFilename>("r", "shadercache-filename", "Write shader cache to given file", "shadercache.bin")
<< Option<opt::ShaderCacheTruncate>("x", "shadercache-truncate", "Truncate shader cache before running", s_enableNames, "enable")
<< Option<opt::SpirvOptimize>("o", "deqp-optimize-spirv", "Enable optimization for SPIR-V", s_enableNames, "disable")
- << Option<opt::SpirvOptimizationRecipe>("p","deqp-optimization-recipe", "Shader optimization recipe");
+ << Option<opt::SpirvOptimizationRecipe>("p","deqp-optimization-recipe", "Shader optimization recipe")
+ << Option<opt::SpirvAllow14>("e","allow-spirv-14", "Allow SPIR-V 1.4 with Vulkan 1.1");
}
} // opt
@@ -647,7 +654,7 @@
if (cmdLine.hasOption<opt::SpirvOptimize>())
{
- deqpArgv.push_back("--deqp-optimize-spirv");
+ deqpArgv.push_back("--deqp-optimize-spirv");
if (cmdLine.getOption<opt::SpirvOptimize>())
deqpArgv.push_back("enable");
else
@@ -682,7 +689,8 @@
cmdLine.getOption<opt::Validate>(),
cmdLine.getOption<opt::VulkanVersion>(),
baselineSpirvVersion,
- maxSpirvVersion);
+ maxSpirvVersion,
+ cmdLine.getOption<opt::SpirvAllow14>());
tcu::print("DONE: %d passed, %d failed, %d not supported\n", stats.numSucceeded, stats.numFailed, stats.notSupported);
diff --git a/external/vulkancts/modules/vulkan/vktCustomInstancesDevices.cpp b/external/vulkancts/modules/vulkan/vktCustomInstancesDevices.cpp
new file mode 100644
index 0000000..c4bc5e9
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/vktCustomInstancesDevices.cpp
@@ -0,0 +1,368 @@
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2019 The Khronos Group Inc.
+ * Copyright (c) 2019 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 Auxiliar functions to help create custom devices and instances.
+ *//*--------------------------------------------------------------------*/
+
+#include "vkRefUtil.hpp"
+#include "vkQueryUtil.hpp"
+#include "vkDeviceUtil.hpp"
+#include "tcuCommandLine.hpp"
+#include "vktCustomInstancesDevices.hpp"
+
+#include <algorithm>
+
+using std::vector;
+using std::string;
+using vk::Move;
+using vk::VkInstance;
+using vk::InstanceDriver;
+using vk::DebugReportRecorder;
+
+namespace vkt
+{
+
+namespace
+{
+
+vector<const char*> getValidationLayers (const vector<vk::VkLayerProperties>& supportedLayers)
+{
+ static const char* s_magicLayer = "VK_LAYER_LUNARG_standard_validation";
+ static const char* s_defaultLayers[] =
+ {
+ "VK_LAYER_GOOGLE_threading",
+ "VK_LAYER_LUNARG_parameter_validation",
+ "VK_LAYER_LUNARG_device_limits",
+ "VK_LAYER_LUNARG_object_tracker",
+ "VK_LAYER_LUNARG_image",
+ "VK_LAYER_LUNARG_core_validation",
+ "VK_LAYER_LUNARG_swapchain",
+ "VK_LAYER_GOOGLE_unique_objects"
+ };
+
+ vector<const char*> enabledLayers;
+
+ if (vk::isLayerSupported(supportedLayers, vk::RequiredLayer(s_magicLayer)))
+ enabledLayers.push_back(s_magicLayer);
+ else
+ {
+ for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_defaultLayers); ++ndx)
+ {
+ if (isLayerSupported(supportedLayers, vk::RequiredLayer(s_defaultLayers[ndx])))
+ enabledLayers.push_back(s_defaultLayers[ndx]);
+ }
+ }
+
+ return enabledLayers;
+}
+
+} // anonymous
+
+
+vector<const char*> getValidationLayers (const vk::PlatformInterface& vkp)
+{
+ return getValidationLayers(enumerateInstanceLayerProperties(vkp));
+}
+
+vector<const char*> getValidationLayers (const vk::InstanceInterface& vki, vk::VkPhysicalDevice physicalDevice)
+{
+ return getValidationLayers(enumerateDeviceLayerProperties(vki, physicalDevice));
+}
+
+CustomInstance::CustomInstance (Context& context, Move<VkInstance> instance, bool enableDebugReportRecorder)
+ : m_context (&context)
+ , m_instance (instance)
+ , m_driver (new InstanceDriver(context.getPlatformInterface(), *m_instance))
+ , m_recorder (enableDebugReportRecorder ? (new DebugReportRecorder(*m_driver, *m_instance)) : nullptr)
+{
+}
+
+CustomInstance::CustomInstance ()
+ : m_context (nullptr)
+ , m_instance ()
+ , m_driver (nullptr)
+ , m_recorder (nullptr)
+{
+}
+
+CustomInstance::CustomInstance (CustomInstance&& other)
+ : CustomInstance()
+{
+ this->swap(other);
+}
+
+CustomInstance::~CustomInstance ()
+{
+ collectMessages();
+}
+
+CustomInstance& CustomInstance::operator= (CustomInstance&& other)
+{
+ CustomInstance destroyer;
+ destroyer.swap(other);
+ this->swap(destroyer);
+ return *this;
+}
+
+void CustomInstance::swap (CustomInstance& other)
+{
+ std::swap(m_context, other.m_context);
+ Move<VkInstance> aux = m_instance; m_instance = other.m_instance; other.m_instance = aux;
+ m_driver.swap(other.m_driver);
+ m_recorder.swap(other.m_recorder);
+}
+
+CustomInstance::operator VkInstance () const
+{
+ return *m_instance;
+}
+
+const vk::InstanceDriver& CustomInstance::getDriver() const
+{
+ return *m_driver;
+}
+
+void CustomInstance::collectMessages ()
+{
+ if (m_recorder)
+ collectAndReportDebugMessages(*m_recorder, *m_context);
+}
+
+UncheckedInstance::UncheckedInstance ()
+ : m_context (nullptr)
+ , m_allocator (nullptr)
+ , m_instance (DE_NULL)
+ , m_driver (nullptr)
+ , m_recorder (nullptr)
+{
+}
+
+UncheckedInstance::UncheckedInstance (Context& context, vk::VkInstance instance, const vk::VkAllocationCallbacks* pAllocator, bool enableDebugReportRecorder)
+ : m_context (&context)
+ , m_allocator (pAllocator)
+ , m_instance (instance)
+ , m_driver ((m_instance != DE_NULL) ? new InstanceDriver(context.getPlatformInterface(), m_instance) : nullptr)
+ , m_recorder ((enableDebugReportRecorder && m_instance != DE_NULL) ? (new DebugReportRecorder(*m_driver, m_instance)) : nullptr)
+{
+}
+
+UncheckedInstance::~UncheckedInstance ()
+{
+ if (m_recorder)
+ collectAndReportDebugMessages(*m_recorder, *m_context);
+
+ if (m_instance != DE_NULL)
+ {
+ m_recorder.reset(nullptr);
+ m_driver->destroyInstance(m_instance, m_allocator);
+ }
+}
+
+void UncheckedInstance::swap (UncheckedInstance& other)
+{
+ std::swap(m_context, other.m_context);
+ std::swap(m_allocator, other.m_allocator);
+ vk::VkInstance aux = m_instance; m_instance = other.m_instance; other.m_instance = aux;
+ m_driver.swap(other.m_driver);
+ m_recorder.swap(other.m_recorder);
+}
+
+UncheckedInstance::UncheckedInstance (UncheckedInstance&& other)
+ : UncheckedInstance()
+{
+ this->swap(other);
+}
+
+UncheckedInstance& UncheckedInstance::operator= (UncheckedInstance&& other)
+{
+ UncheckedInstance destroyer;
+ destroyer.swap(other);
+ this->swap(destroyer);
+ return *this;
+}
+
+UncheckedInstance::operator vk::VkInstance () const
+{
+ return m_instance;
+}
+UncheckedInstance::operator bool () const
+{
+ return (m_instance != DE_NULL);
+}
+
+CustomInstance createCustomInstanceWithExtensions (Context& context, const std::vector<std::string>& extensions, const vk::VkAllocationCallbacks* pAllocator, bool allowLayers)
+{
+ vector<const char*> enabledLayers;
+ vector<string> enabledLayersStr;
+ const bool validationEnabled = (context.getTestContext().getCommandLine().isValidationEnabled() && allowLayers);
+
+ if (validationEnabled)
+ {
+ enabledLayers = getValidationLayers(context.getPlatformInterface());
+ enabledLayersStr = vector<string>(begin(enabledLayers), end(enabledLayers));
+ }
+
+ // Filter extension list and throw NotSupported if a required extension is not supported.
+ const deUint32 apiVersion = context.getUsedApiVersion();
+ const vk::PlatformInterface& vkp = context.getPlatformInterface();
+ const std::vector<vk::VkExtensionProperties> availableExtensions = vk::enumerateInstanceExtensionProperties(vkp, DE_NULL);
+ vector<string> extensionPtrs;
+
+ vector<string> availableExtensionNames;
+ for (const auto& ext : availableExtensions)
+ availableExtensionNames.push_back(ext.extensionName);
+
+ for (const auto& ext : extensions)
+ {
+ if (!vk::isInstanceExtensionSupported(apiVersion, availableExtensionNames, ext))
+ TCU_THROW(NotSupportedError, ext + " is not supported");
+
+ if (!vk::isCoreInstanceExtension(apiVersion, ext))
+ extensionPtrs.push_back(ext);
+ }
+
+ Move<VkInstance> instance = vk::createDefaultInstance(vkp, apiVersion, enabledLayersStr, extensionPtrs, pAllocator);
+ return CustomInstance(context, instance, validationEnabled);
+}
+
+CustomInstance createCustomInstanceWithExtension (Context& context, const std::string& extension, const vk::VkAllocationCallbacks* pAllocator, bool allowLayers)
+{
+ return createCustomInstanceWithExtensions(context, std::vector<std::string>(1, extension), pAllocator, allowLayers);
+}
+
+CustomInstance createCustomInstanceFromContext (Context& context, const vk::VkAllocationCallbacks* pAllocator, bool allowLayers)
+{
+ return createCustomInstanceWithExtensions(context, std::vector<std::string>(), pAllocator, allowLayers);
+}
+
+const char kDebugReportExt[] = "VK_EXT_debug_report";
+
+vector<const char*> addDebugReportExt(const vk::PlatformInterface& vkp, const vk::VkInstanceCreateInfo& createInfo)
+{
+ if (!isDebugReportSupported(vkp))
+ TCU_THROW(NotSupportedError, "VK_EXT_debug_report is not supported");
+
+ vector<const char*> actualExtensions;
+ if (createInfo.enabledExtensionCount != 0u)
+ {
+ for (deUint32 i = 0u; i < createInfo.enabledExtensionCount; ++i)
+ actualExtensions.push_back(createInfo.ppEnabledExtensionNames[i]);
+ }
+
+ if (std::find_if(begin(actualExtensions), end(actualExtensions), [](const char* name) { return (strcmp(name, kDebugReportExt) == 0); })
+ == end(actualExtensions))
+ {
+ actualExtensions.push_back(kDebugReportExt);
+ }
+
+ return actualExtensions;
+}
+
+CustomInstance createCustomInstanceFromInfo (Context& context, const vk::VkInstanceCreateInfo* instanceCreateInfo, const vk::VkAllocationCallbacks* pAllocator, bool allowLayers)
+{
+ vector<const char*> enabledLayers;
+ vector<const char*> enabledExtensions;
+ vk::VkInstanceCreateInfo createInfo = *instanceCreateInfo;
+ const bool validationEnabled = context.getTestContext().getCommandLine().isValidationEnabled();
+ const vk::PlatformInterface& vkp = context.getPlatformInterface();
+
+ if (validationEnabled && allowLayers)
+ {
+ // Activate some layers if requested.
+ if (createInfo.enabledLayerCount == 0u)
+ {
+ enabledLayers = getValidationLayers(vkp);
+ createInfo.enabledLayerCount = static_cast<deUint32>(enabledLayers.size());
+ createInfo.ppEnabledLayerNames = (enabledLayers.empty() ? DE_NULL : enabledLayers.data());
+ }
+
+ // Make sure the debug report extension is enabled when validation is enabled.
+ enabledExtensions = addDebugReportExt(vkp, createInfo);
+ createInfo.enabledExtensionCount = static_cast<deUint32>(enabledExtensions.size());
+ createInfo.ppEnabledExtensionNames = enabledExtensions.data();
+ }
+
+ return CustomInstance(context, vk::createInstance(vkp, &createInfo, pAllocator), validationEnabled);
+}
+
+vk::VkResult createUncheckedInstance (Context& context, const vk::VkInstanceCreateInfo* instanceCreateInfo, const vk::VkAllocationCallbacks* pAllocator, UncheckedInstance* instance, bool allowLayers)
+{
+ vector<const char*> enabledLayers;
+ vector<const char*> enabledExtensions;
+ vk::VkInstanceCreateInfo createInfo = *instanceCreateInfo;
+ const bool validationEnabled = context.getTestContext().getCommandLine().isValidationEnabled();
+ const vk::PlatformInterface& vkp = context.getPlatformInterface();
+ const bool addLayers = (validationEnabled && allowLayers);
+
+ if (addLayers)
+ {
+ // Activate some layers if requested.
+ if (createInfo.enabledLayerCount == 0u)
+ {
+ enabledLayers = getValidationLayers(vkp);
+ createInfo.enabledLayerCount = static_cast<deUint32>(enabledLayers.size());
+ createInfo.ppEnabledLayerNames = (enabledLayers.empty() ? DE_NULL : enabledLayers.data());
+ }
+
+ // Make sure the debug report extension is enabled when validation is enabled.
+ enabledExtensions = addDebugReportExt(vkp, createInfo);
+ createInfo.enabledExtensionCount = static_cast<deUint32>(enabledExtensions.size());
+ createInfo.ppEnabledExtensionNames = enabledExtensions.data();
+ }
+
+ vk::VkInstance raw_instance = DE_NULL;
+ vk::VkResult result = vkp.createInstance(&createInfo, pAllocator, &raw_instance);
+ *instance = UncheckedInstance(context, raw_instance, pAllocator, addLayers);
+ return result;
+}
+
+vk::Move<vk::VkDevice> createCustomDevice (bool validationEnabled, const vk::PlatformInterface& vkp, vk::VkInstance instance, const vk::InstanceInterface& vki, vk::VkPhysicalDevice physicalDevice, const vk::VkDeviceCreateInfo* pCreateInfo, const vk::VkAllocationCallbacks* pAllocator)
+{
+ vector<const char*> enabledLayers;
+ vk::VkDeviceCreateInfo createInfo = *pCreateInfo;
+
+ if (createInfo.enabledLayerCount == 0u && validationEnabled)
+ {
+ enabledLayers = getValidationLayers(vki, physicalDevice);
+ createInfo.enabledLayerCount = static_cast<deUint32>(enabledLayers.size());
+ createInfo.ppEnabledLayerNames = (enabledLayers.empty() ? DE_NULL : enabledLayers.data());
+ }
+
+ return createDevice(vkp, instance, vki, physicalDevice, &createInfo, pAllocator);
+}
+
+vk::VkResult createUncheckedDevice (bool validationEnabled, const vk::InstanceInterface& vki, vk::VkPhysicalDevice physicalDevice, const vk::VkDeviceCreateInfo* pCreateInfo, const vk::VkAllocationCallbacks* pAllocator, vk::VkDevice* pDevice)
+{
+ vector<const char*> enabledLayers;
+ vk::VkDeviceCreateInfo createInfo = *pCreateInfo;
+
+ if (createInfo.enabledLayerCount == 0u && validationEnabled)
+ {
+ enabledLayers = getValidationLayers(vki, physicalDevice);
+ createInfo.enabledLayerCount = static_cast<deUint32>(enabledLayers.size());
+ createInfo.ppEnabledLayerNames = (enabledLayers.empty() ? DE_NULL : enabledLayers.data());
+ }
+
+ return vki.createDevice(physicalDevice, &createInfo, pAllocator, pDevice);
+}
+
+
+}
diff --git a/external/vulkancts/modules/vulkan/vktCustomInstancesDevices.hpp b/external/vulkancts/modules/vulkan/vktCustomInstancesDevices.hpp
new file mode 100644
index 0000000..1b798d5
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/vktCustomInstancesDevices.hpp
@@ -0,0 +1,119 @@
+#ifndef _VKTCUSTOMINSTANCESDEVICES_HPP
+#define _VKTCUSTOMINSTANCESDEVICES_HPP
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2019 The Khronos Group Inc.
+ * Copyright (c) 2019 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 Auxiliar functions to help create custom devices and instances.
+ *//*--------------------------------------------------------------------*/
+
+#include "vkDefs.hpp"
+#include "vktTestCase.hpp"
+
+#include <vector>
+#include <memory>
+
+namespace vk
+{
+ class PlatformInterface;
+ class InstanceInterface;
+}
+
+namespace tcu
+{
+ class CommandLine;
+}
+
+namespace vkt
+{
+
+std::vector<const char*> getValidationLayers (const vk::PlatformInterface& vkp);
+
+std::vector<const char*> getValidationLayers (const vk::InstanceInterface& vki, vk::VkPhysicalDevice physicalDevice);
+
+class CustomInstance
+{
+public:
+ CustomInstance ();
+ CustomInstance (Context& context, vk::Move<vk::VkInstance> instance, bool enableDebugReportRecorder);
+ CustomInstance (CustomInstance&& other);
+ ~CustomInstance ();
+ CustomInstance& operator= (CustomInstance&& other);
+ operator vk::VkInstance () const;
+ void swap (CustomInstance& other);
+ const vk::InstanceDriver& getDriver () const;
+ void collectMessages ();
+
+ CustomInstance (const CustomInstance& other) = delete;
+ CustomInstance& operator= (const CustomInstance& other) = delete;
+private:
+ Context* m_context;
+ vk::Move<vk::VkInstance> m_instance;
+ std::unique_ptr<vk::InstanceDriver> m_driver;
+ std::unique_ptr<vk::DebugReportRecorder> m_recorder;
+};
+
+class UncheckedInstance
+{
+public:
+ UncheckedInstance ();
+ UncheckedInstance (Context& context, vk::VkInstance instance, const vk::VkAllocationCallbacks* pAllocator, bool enableDebugReportRecorder);
+ UncheckedInstance (UncheckedInstance&& other);
+ ~UncheckedInstance ();
+ UncheckedInstance& operator= (UncheckedInstance&& other);
+ operator vk::VkInstance () const;
+ operator bool () const;
+ void swap (UncheckedInstance& other);
+
+ UncheckedInstance (const UncheckedInstance& other) = delete;
+ UncheckedInstance& operator= (const UncheckedInstance& other) = delete;
+private:
+ Context* m_context;
+ const vk::VkAllocationCallbacks* m_allocator;
+ vk::VkInstance m_instance;
+ std::unique_ptr<vk::InstanceDriver> m_driver;
+ std::unique_ptr<vk::DebugReportRecorder> m_recorder;
+};
+
+// Custom instances.
+
+CustomInstance createCustomInstanceWithExtensions (Context& context, const std::vector<std::string>& extension, const vk::VkAllocationCallbacks* pAllocator = DE_NULL, bool allowLayers = true);
+
+CustomInstance createCustomInstanceWithExtension (Context& context, const std::string& extension, const vk::VkAllocationCallbacks* pAllocator = DE_NULL, bool allowLayers = true);
+
+CustomInstance createCustomInstanceFromContext (Context& context, const vk::VkAllocationCallbacks* pAllocator = DE_NULL, bool allowLayers = true);
+
+CustomInstance createCustomInstanceFromInfo (Context& context, const vk::VkInstanceCreateInfo* instanceCreateInfo, const vk::VkAllocationCallbacks* pAllocator = DE_NULL, bool allowLayers = true);
+
+// Unchecked instance: creation allowed to fail.
+
+vk::VkResult createUncheckedInstance (Context& context, const vk::VkInstanceCreateInfo* instanceCreateInfo, const vk::VkAllocationCallbacks* pAllocator, UncheckedInstance* instance, bool allowLayers = true);
+
+// Custom devices.
+
+vk::Move<vk::VkDevice> createCustomDevice (bool validationEnabled, const vk::PlatformInterface& vkp, vk::VkInstance instance, const vk::InstanceInterface& vki, vk::VkPhysicalDevice physicalDevice, const vk::VkDeviceCreateInfo* pCreateInfo, const vk::VkAllocationCallbacks* pAllocator = DE_NULL);
+
+// Unchecked device: creation allowed to fail.
+
+vk::VkResult createUncheckedDevice (bool validationEnabled, const vk::InstanceInterface& vki, vk::VkPhysicalDevice physicalDevice, const vk::VkDeviceCreateInfo* pCreateInfo, const vk::VkAllocationCallbacks* pAllocator, vk::VkDevice* pDevice);
+
+}
+
+#endif // _VKTCUSTOMINSTANCESDEVICES_HPP
diff --git a/external/vulkancts/modules/vulkan/vktInfoTests.cpp b/external/vulkancts/modules/vulkan/vktInfoTests.cpp
index 666c62d..9797bfb 100644
--- a/external/vulkancts/modules/vulkan/vktInfoTests.cpp
+++ b/external/vulkancts/modules/vulkan/vktInfoTests.cpp
@@ -30,6 +30,7 @@
#include "tcuCommandLine.hpp"
#include "tcuPlatform.hpp"
#include "deStringUtil.hpp"
+#include "vktApiFeatureInfo.hpp"
#include <iomanip>
@@ -243,6 +244,10 @@
addFunctionCase(testGroup, "device", "Device Info", logDeviceInfo);
addFunctionCase(testGroup, "platform", "Platform Info", logPlatformInfo);
addFunctionCase(testGroup, "memory_limits", "Platform Memory Limits", logPlatformMemoryLimits);
+
+ api::createFeatureInfoInstanceTests (testGroup);
+ api::createFeatureInfoDeviceTests (testGroup);
+ api::createFeatureInfoDeviceGroupTests (testGroup);
}
} // vkt
diff --git a/external/vulkancts/modules/vulkan/vktTestCase.cpp b/external/vulkancts/modules/vulkan/vktTestCase.cpp
index a62283a..5caecb9 100644
--- a/external/vulkancts/modules/vulkan/vktTestCase.cpp
+++ b/external/vulkancts/modules/vulkan/vktTestCase.cpp
@@ -22,6 +22,7 @@
*//*--------------------------------------------------------------------*/
#include "vktTestCase.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkRef.hpp"
#include "vkRefUtil.hpp"
@@ -31,6 +32,7 @@
#include "vkPlatform.hpp"
#include "vkDebugReportUtil.hpp"
#include "vkDeviceFeatures.hpp"
+#include "vkDeviceProperties.hpp"
#include "tcuCommandLine.hpp"
#include "tcuTestLog.hpp"
@@ -53,37 +55,6 @@
namespace
{
-vector<string> getValidationLayers (const vector<VkLayerProperties>& supportedLayers)
-{
- static const char* s_magicLayer = "VK_LAYER_LUNARG_standard_validation";
- static const char* s_defaultLayers[] =
- {
- "VK_LAYER_GOOGLE_threading",
- "VK_LAYER_LUNARG_parameter_validation",
- "VK_LAYER_LUNARG_device_limits",
- "VK_LAYER_LUNARG_object_tracker",
- "VK_LAYER_LUNARG_image",
- "VK_LAYER_LUNARG_core_validation",
- "VK_LAYER_LUNARG_swapchain",
- "VK_LAYER_GOOGLE_unique_objects"
- };
-
- vector<string> enabledLayers;
-
- if (isLayerSupported(supportedLayers, RequiredLayer(s_magicLayer)))
- enabledLayers.push_back(s_magicLayer);
- else
- {
- for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_defaultLayers); ++ndx)
- {
- if (isLayerSupported(supportedLayers, RequiredLayer(s_defaultLayers[ndx])))
- enabledLayers.push_back(s_defaultLayers[ndx]);
- }
- }
-
- return enabledLayers;
-}
-
vector<string> filterExtensions (const vector<VkExtensionProperties>& extensions)
{
vector<string> enabledExtensions;
@@ -183,7 +154,7 @@
Move<VkInstance> createInstance (const PlatformInterface& vkp, deUint32 apiVersion, const vector<string>& enabledExtensions, const tcu::CommandLine& cmdLine)
{
const bool isValidationEnabled = cmdLine.isValidationEnabled();
- vector<string> enabledLayers;
+ vector<const char*> enabledLayers;
// \note Extensions in core are not explicitly enabled even though
// they are in the extension list advertised to tests.
@@ -201,7 +172,7 @@
TCU_THROW(NotSupportedError, "No validation layers found");
}
- return createDefaultInstance(vkp, apiVersion, enabledLayers, nonCoreExtensions);
+ return createDefaultInstance(vkp, apiVersion, vector<string>(begin(enabledLayers), end(enabledLayers)), nonCoreExtensions);
}
static deUint32 findQueueFamilyIndexWithCaps (const InstanceInterface& vkInstance, VkPhysicalDevice physicalDevice, VkQueueFlags requiredCaps)
@@ -230,8 +201,7 @@
{
VkDeviceQueueCreateInfo queueInfo[2];
VkDeviceCreateInfo deviceInfo;
- vector<string> enabledLayers;
- vector<const char*> layerPtrs;
+ vector<const char*> enabledLayers;
vector<const char*> extensionPtrs;
const float queuePriority = 1.0f;
const deUint32 numQueues = (enabledFeatures.features.sparseBinding && (queueIndex != sparseQueueIndex)) ? 2 : 1;
@@ -246,11 +216,6 @@
TCU_THROW(NotSupportedError, "No validation layers found");
}
- layerPtrs.resize(enabledLayers.size());
-
- for (size_t ndx = 0; ndx < enabledLayers.size(); ++ndx)
- layerPtrs[ndx] = enabledLayers[ndx].c_str();
-
// \note Extensions in core are not explicitly enabled even though
// they are in the extension list advertised to tests.
vector<const char*> coreExtensions;
@@ -286,8 +251,8 @@
deviceInfo.pQueueCreateInfos = queueInfo;
deviceInfo.enabledExtensionCount = (deUint32)extensionPtrs.size();
deviceInfo.ppEnabledExtensionNames = (extensionPtrs.empty() ? DE_NULL : &extensionPtrs[0]);
- deviceInfo.enabledLayerCount = (deUint32)layerPtrs.size();
- deviceInfo.ppEnabledLayerNames = (layerPtrs.empty() ? DE_NULL : &layerPtrs[0]);
+ deviceInfo.enabledLayerCount = (deUint32)enabledLayers.size();
+ deviceInfo.ppEnabledLayerNames = (enabledLayers.empty() ? DE_NULL : enabledLayers.data());
deviceInfo.pEnabledFeatures = enabledFeatures.pNext ? DE_NULL : &enabledFeatures.features;
return createDevice(vkp, instance, vki, physicalDevice, &deviceInfo);
@@ -295,16 +260,6 @@
} // anonymous
-vector<string> getValidationLayers (const PlatformInterface& vkp)
-{
- return getValidationLayers(enumerateInstanceLayerProperties(vkp));
-}
-
-vector<string> getValidationLayers (const InstanceInterface& vki, VkPhysicalDevice physicalDevice)
-{
- return getValidationLayers(enumerateDeviceLayerProperties(vki, physicalDevice));
-}
-
class DefaultDevice
{
public:
@@ -320,21 +275,28 @@
VkPhysicalDevice getPhysicalDevice (void) const { return m_physicalDevice; }
deUint32 getDeviceVersion (void) const { return m_deviceVersion; }
+
+ bool isDeviceFeatureInitialized (VkStructureType sType) const { return m_deviceFeatures.isDeviceFeatureInitialized(sType); }
const VkPhysicalDeviceFeatures& getDeviceFeatures (void) const { return m_deviceFeatures.getCoreFeatures2().features; }
const VkPhysicalDeviceFeatures2& getDeviceFeatures2 (void) const { return m_deviceFeatures.getCoreFeatures2(); }
+ const VkPhysicalDeviceVulkan11Features& getVulkan11Features (void) const { return m_deviceFeatures.getVulkan11Features(); }
+ const VkPhysicalDeviceVulkan12Features& getVulkan12Features (void) const { return m_deviceFeatures.getVulkan12Features(); }
#include "vkDeviceFeaturesForDefaultDeviceDefs.inl"
- VkDevice getDevice (void) const { return *m_device; }
- const DeviceInterface& getDeviceInterface (void) const { return m_deviceInterface; }
- const VkPhysicalDeviceProperties& getDeviceProperties (void) const { return m_deviceProperties; }
- const vector<string>& getDeviceExtensions (void) const { return m_deviceExtensions; }
+ bool isDevicePropertyInitialized (VkStructureType sType) const { return m_devicePropertiesFull.isDevicePropertyInitialized(sType); }
+ const VkPhysicalDeviceProperties& getDeviceProperties (void) const { return m_deviceProperties; }
+ const VkPhysicalDeviceProperties2& getDeviceProperties2 (void) const { return m_devicePropertiesFull.getCoreProperties2(); }
- deUint32 getUsedApiVersion (void) const { return m_usedApiVersion; }
+#include "vkDevicePropertiesForDefaultDeviceDefs.inl"
- deUint32 getUniversalQueueFamilyIndex (void) const { return m_universalQueueFamilyIndex; }
+ VkDevice getDevice (void) const { return *m_device; }
+ const DeviceInterface& getDeviceInterface (void) const { return m_deviceInterface; }
+ const vector<string>& getDeviceExtensions (void) const { return m_deviceExtensions; }
+ deUint32 getUsedApiVersion (void) const { return m_usedApiVersion; }
+ deUint32 getUniversalQueueFamilyIndex (void) const { return m_universalQueueFamilyIndex; }
VkQueue getUniversalQueue (void) const;
- deUint32 getSparseQueueFamilyIndex (void) const { return m_sparseQueueFamilyIndex; }
+ deUint32 getSparseQueueFamilyIndex (void) const { return m_sparseQueueFamilyIndex; }
VkQueue getSparseQueue (void) const;
private:
@@ -359,10 +321,10 @@
const deUint32 m_universalQueueFamilyIndex;
const deUint32 m_sparseQueueFamilyIndex;
const VkPhysicalDeviceProperties m_deviceProperties;
+ const DeviceProperties m_devicePropertiesFull;
const Unique<VkDevice> m_device;
const DeviceDriver m_deviceInterface;
-
};
static deUint32 sanitizeApiVersion(deUint32 v)
@@ -389,6 +351,7 @@
, m_universalQueueFamilyIndex (findQueueFamilyIndexWithCaps(m_instanceInterface, m_physicalDevice, VK_QUEUE_GRAPHICS_BIT|VK_QUEUE_COMPUTE_BIT))
, m_sparseQueueFamilyIndex (m_deviceFeatures.getCoreFeatures2().features.sparseBinding ? findQueueFamilyIndexWithCaps(m_instanceInterface, m_physicalDevice, VK_QUEUE_SPARSE_BINDING_BIT) : 0)
, m_deviceProperties (getPhysicalDeviceProperties(m_instanceInterface, m_physicalDevice))
+ , m_devicePropertiesFull (m_instanceInterface, m_usedApiVersion, m_physicalDevice, m_instanceExtensions, m_deviceExtensions)
, m_device (createDefaultDevice(vkPlatform, *m_instance, m_instanceInterface, m_physicalDevice, m_usedApiVersion, m_universalQueueFamilyIndex, m_sparseQueueFamilyIndex, m_deviceFeatures.getCoreFeatures2(), m_deviceExtensions, cmdLine))
, m_deviceInterface (vkPlatform, *m_instance, *m_device)
{
@@ -431,11 +394,12 @@
Context::Context (tcu::TestContext& testCtx,
const vk::PlatformInterface& platformInterface,
vk::BinaryCollection& progCollection)
- : m_testCtx (testCtx)
- , m_platformInterface (platformInterface)
- , m_progCollection (progCollection)
- , m_device (new DefaultDevice(m_platformInterface, testCtx.getCommandLine()))
- , m_allocator (createAllocator(m_device.get()))
+ : m_testCtx (testCtx)
+ , m_platformInterface (platformInterface)
+ , m_progCollection (progCollection)
+ , m_device (new DefaultDevice(m_platformInterface, testCtx.getCommandLine()))
+ , m_allocator (createAllocator(m_device.get()))
+ , m_resultSetOnValidation (false)
{
}
@@ -444,45 +408,115 @@
}
deUint32 Context::getMaximumFrameworkVulkanVersion (void) const { return m_device->getMaximumFrameworkVulkanVersion(); }
-deUint32 Context::getAvailableInstanceVersion (void) const { return m_device->getAvailableInstanceVersion(); }
-const vector<string>& Context::getInstanceExtensions (void) const { return m_device->getInstanceExtensions(); }
-vk::VkInstance Context::getInstance (void) const { return m_device->getInstance(); }
-const vk::InstanceInterface& Context::getInstanceInterface (void) const { return m_device->getInstanceInterface(); }
-vk::VkPhysicalDevice Context::getPhysicalDevice (void) const { return m_device->getPhysicalDevice(); }
-deUint32 Context::getDeviceVersion (void) const { return m_device->getDeviceVersion(); }
-const vk::VkPhysicalDeviceFeatures& Context::getDeviceFeatures (void) const { return m_device->getDeviceFeatures(); }
-const vk::VkPhysicalDeviceFeatures2& Context::getDeviceFeatures2 (void) const { return m_device->getDeviceFeatures2(); }
+deUint32 Context::getAvailableInstanceVersion (void) const { return m_device->getAvailableInstanceVersion(); }
+const vector<string>& Context::getInstanceExtensions (void) const { return m_device->getInstanceExtensions(); }
+vk::VkInstance Context::getInstance (void) const { return m_device->getInstance(); }
+const vk::InstanceInterface& Context::getInstanceInterface (void) const { return m_device->getInstanceInterface(); }
+vk::VkPhysicalDevice Context::getPhysicalDevice (void) const { return m_device->getPhysicalDevice(); }
+deUint32 Context::getDeviceVersion (void) const { return m_device->getDeviceVersion(); }
+const vk::VkPhysicalDeviceFeatures& Context::getDeviceFeatures (void) const { return m_device->getDeviceFeatures(); }
+const vk::VkPhysicalDeviceFeatures2& Context::getDeviceFeatures2 (void) const { return m_device->getDeviceFeatures2(); }
+
+bool Context::isDeviceFunctionalitySupported (const std::string& extension) const
+{
+ // check if extension was promoted to core
+ deUint32 apiVersion = getUsedApiVersion();
+ if (isCoreDeviceExtension(getUsedApiVersion(), extension))
+ {
+ // all folowing checks are for vk12 and can be skipped for previous versions
+ if (apiVersion < VK_MAKE_VERSION(1, 2, 0))
+ return true;
+
+ // handle promoted functionality that was provided under feature bit
+ const auto& vk11Features = m_device->getVulkan11Features();
+ if (extension == "VK_KHR_multiview")
+ return !!vk11Features.multiview;
+ if (extension == "VK_KHR_variable_pointers")
+ return !!vk11Features.variablePointersStorageBuffer;
+ if (extension == "VK_KHR_sampler_ycbcr_conversion")
+ return !!vk11Features.samplerYcbcrConversion;
+ if (extension == "VK_KHR_shader_draw_parameters")
+ return !!vk11Features.shaderDrawParameters;
+
+ const auto& vk12Features = m_device->getVulkan12Features();
+ if (extension == "VK_KHR_timeline_semaphore")
+ return !!vk12Features.timelineSemaphore;
+ if (extension == "VK_KHR_buffer_device_address")
+ return !!vk12Features.bufferDeviceAddress;
+ if (extension == "VK_EXT_descriptor_indexing")
+ return !!vk12Features.descriptorIndexing;
+ if (extension == "VK_KHR_draw_indirect_count")
+ return !!vk12Features.drawIndirectCount;
+ if (extension == "VK_KHR_sampler_mirror_clamp_to_edge")
+ return !!vk12Features.samplerMirrorClampToEdge;
+ if (extension == "VK_EXT_sampler_filter_minmax")
+ return !!vk12Features.samplerFilterMinmax;
+ if (extension == "VK_EXT_shader_viewport_index_layer")
+ return !!vk12Features.shaderOutputViewportIndex && !!vk12Features.shaderOutputLayer;
+
+ // no feature flags to check
+ return true;
+ }
+
+ // check if extension is on the lits of extensions for current device
+ const auto& extensions = getDeviceExtensions();
+ if (de::contains(extensions.begin(), extensions.end(), extension))
+ {
+ if (extension == "VK_KHR_timeline_semaphore")
+ return !!getTimelineSemaphoreFeatures().timelineSemaphore;
+
+ return true;
+ }
+
+ return false;
+}
+
+bool Context::isInstanceFunctionalitySupported(const std::string& extension) const
+{
+ // NOTE: current implementation uses isInstanceExtensionSupported but
+ // this will change when some instance extensions will be promoted to the
+ // core; don't use isInstanceExtensionSupported directly, use this method instead
+ return isInstanceExtensionSupported(getUsedApiVersion(), getInstanceExtensions(), extension);
+}
#include "vkDeviceFeaturesForContextDefs.inl"
-const vk::VkPhysicalDeviceProperties& Context::getDeviceProperties (void) const { return m_device->getDeviceProperties(); }
-const vector<string>& Context::getDeviceExtensions (void) const { return m_device->getDeviceExtensions(); }
-vk::VkDevice Context::getDevice (void) const { return m_device->getDevice(); }
-const vk::DeviceInterface& Context::getDeviceInterface (void) const { return m_device->getDeviceInterface(); }
-deUint32 Context::getUniversalQueueFamilyIndex (void) const { return m_device->getUniversalQueueFamilyIndex(); }
-vk::VkQueue Context::getUniversalQueue (void) const { return m_device->getUniversalQueue(); }
-deUint32 Context::getSparseQueueFamilyIndex (void) const { return m_device->getSparseQueueFamilyIndex(); }
-vk::VkQueue Context::getSparseQueue (void) const { return m_device->getSparseQueue(); }
-vk::Allocator& Context::getDefaultAllocator (void) const { return *m_allocator; }
-deUint32 Context::getUsedApiVersion (void) const { return m_device->getUsedApiVersion(); }
-bool Context::contextSupports (const deUint32 majorNum, const deUint32 minorNum, const deUint32 patchNum) const
- { return m_device->getUsedApiVersion() >= VK_MAKE_VERSION(majorNum, minorNum, patchNum); }
-bool Context::contextSupports (const ApiVersion version) const
- { return m_device->getUsedApiVersion() >= pack(version); }
-bool Context::contextSupports (const deUint32 requiredApiVersionBits) const
- { return m_device->getUsedApiVersion() >= requiredApiVersionBits; }
+const vk::VkPhysicalDeviceProperties& Context::getDeviceProperties (void) const { return m_device->getDeviceProperties(); }
+const vk::VkPhysicalDeviceProperties2& Context::getDeviceProperties2 (void) const { return m_device->getDeviceProperties2(); }
-bool Context::requireDeviceExtension (const std::string& required)
+#include "vkDevicePropertiesForContextDefs.inl"
+
+const vector<string>& Context::getDeviceExtensions (void) const { return m_device->getDeviceExtensions(); }
+vk::VkDevice Context::getDevice (void) const { return m_device->getDevice(); }
+const vk::DeviceInterface& Context::getDeviceInterface (void) const { return m_device->getDeviceInterface(); }
+deUint32 Context::getUniversalQueueFamilyIndex (void) const { return m_device->getUniversalQueueFamilyIndex(); }
+vk::VkQueue Context::getUniversalQueue (void) const { return m_device->getUniversalQueue(); }
+deUint32 Context::getSparseQueueFamilyIndex (void) const { return m_device->getSparseQueueFamilyIndex(); }
+vk::VkQueue Context::getSparseQueue (void) const { return m_device->getSparseQueue(); }
+vk::Allocator& Context::getDefaultAllocator (void) const { return *m_allocator; }
+deUint32 Context::getUsedApiVersion (void) const { return m_device->getUsedApiVersion(); }
+bool Context::contextSupports (const deUint32 majorNum, const deUint32 minorNum, const deUint32 patchNum) const
+ { return m_device->getUsedApiVersion() >= VK_MAKE_VERSION(majorNum, minorNum, patchNum); }
+bool Context::contextSupports (const ApiVersion version) const
+ { return m_device->getUsedApiVersion() >= pack(version); }
+bool Context::contextSupports (const deUint32 requiredApiVersionBits) const
+ { return m_device->getUsedApiVersion() >= requiredApiVersionBits; }
+bool Context::isDeviceFeatureInitialized (vk::VkStructureType sType) const
+ { return m_device->isDeviceFeatureInitialized(sType); }
+bool Context::isDevicePropertyInitialized (vk::VkStructureType sType) const
+ { return m_device->isDevicePropertyInitialized(sType); }
+
+bool Context::requireDeviceFunctionality (const std::string& required) const
{
- if (!isDeviceExtensionSupported(getUsedApiVersion(), getDeviceExtensions(), required))
+ if (!isDeviceFunctionalitySupported(required))
TCU_THROW(NotSupportedError, required + " is not supported");
return true;
}
-bool Context::requireInstanceExtension (const std::string& required)
+bool Context::requireInstanceFunctionality (const std::string& required) const
{
- if (!isInstanceExtensionSupported(getUsedApiVersion(), getInstanceExtensions(), required))
+ if (!isInstanceFunctionalitySupported(required))
TCU_THROW(NotSupportedError, required + " is not supported");
return true;
@@ -577,6 +611,12 @@
return (void*)m_platformInterface.getGetInstanceProcAddr();
}
+bool Context::isBufferDeviceAddressSupported(void) const
+{
+ return isDeviceFunctionalitySupported("VK_KHR_buffer_device_address") ||
+ isDeviceFunctionalitySupported("VK_EXT_buffer_device_address");
+}
+
// TestCase
void TestCase::initPrograms (SourceCollections&) const
@@ -591,4 +631,42 @@
{
}
+void collectAndReportDebugMessages(vk::DebugReportRecorder &debugReportRecorder, Context& context)
+{
+ // \note We are not logging INFORMATION and DEBUG messages
+ static const vk::VkDebugReportFlagsEXT errorFlags = vk::VK_DEBUG_REPORT_ERROR_BIT_EXT;
+ static const vk::VkDebugReportFlagsEXT logFlags = errorFlags
+ | vk::VK_DEBUG_REPORT_WARNING_BIT_EXT
+ | vk::VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT;
+
+ typedef vk::DebugReportRecorder::MessageList DebugMessages;
+
+ const DebugMessages& messages = debugReportRecorder.getMessages();
+ tcu::TestLog& log = context.getTestContext().getLog();
+
+ if (messages.begin() != messages.end())
+ {
+ const tcu::ScopedLogSection section (log, "DebugMessages", "Debug Messages");
+ int numErrors = 0;
+
+ for (DebugMessages::const_iterator curMsg = messages.begin(); curMsg != messages.end(); ++curMsg)
+ {
+ if ((curMsg->flags & logFlags) != 0)
+ log << tcu::TestLog::Message << *curMsg << tcu::TestLog::EndMessage;
+
+ if ((curMsg->flags & errorFlags) != 0)
+ numErrors += 1;
+ }
+
+ debugReportRecorder.clearMessages();
+
+ if (numErrors > 0)
+ {
+ string errorMsg = de::toString(numErrors) + " API usage errors found";
+ context.resultSetOnValidation(true);
+ context.getTestContext().setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, errorMsg.c_str());
+ }
+ }
+}
+
} // vkt
diff --git a/external/vulkancts/modules/vulkan/vktTestCase.hpp b/external/vulkancts/modules/vulkan/vktTestCase.hpp
index cf6a0e4..7553b2a 100644
--- a/external/vulkancts/modules/vulkan/vktTestCase.hpp
+++ b/external/vulkancts/modules/vulkan/vktTestCase.hpp
@@ -29,6 +29,8 @@
#include "deUniquePtr.hpp"
#include "vkPrograms.hpp"
#include "vkApiVersion.hpp"
+#include "vkDebugReportUtil.hpp"
+#include "vkPlatform.hpp"
#include "vktTestCaseDefs.hpp"
#include <vector>
#include <string>
@@ -48,10 +50,6 @@
namespace vkt
{
-std::vector<std::string> getValidationLayers (const vk::PlatformInterface& vkp);
-
-std::vector<std::string> getValidationLayers (const vk::InstanceInterface& vki, vk::VkPhysicalDevice physicalDevice);
-
class DefaultDevice;
class Context
@@ -74,12 +72,21 @@
const vk::InstanceInterface& getInstanceInterface (void) const;
vk::VkPhysicalDevice getPhysicalDevice (void) const;
deUint32 getDeviceVersion (void) const;
+ bool isDeviceFeatureInitialized (vk::VkStructureType sType) const;
const vk::VkPhysicalDeviceFeatures& getDeviceFeatures (void) const;
const vk::VkPhysicalDeviceFeatures2& getDeviceFeatures2 (void) const;
+ bool isInstanceFunctionalitySupported (const std::string& extension) const;
+ bool isDeviceFunctionalitySupported (const std::string& extension) const;
+
#include "vkDeviceFeaturesForContextDecl.inl"
+ bool isDevicePropertyInitialized (vk::VkStructureType sType) const;
const vk::VkPhysicalDeviceProperties& getDeviceProperties (void) const;
+ const vk::VkPhysicalDeviceProperties2& getDeviceProperties2 (void) const;
+
+#include "vkDevicePropertiesForContextDecl.inl"
+
const std::vector<std::string>& getDeviceExtensions (void) const;
vk::VkDevice getDevice (void) const;
const vk::DeviceInterface& getDeviceInterface (void) const;
@@ -92,12 +99,17 @@
bool contextSupports (const deUint32 majorNum, const deUint32 minorNum, const deUint32 patchNum) const;
bool contextSupports (const vk::ApiVersion version) const;
bool contextSupports (const deUint32 requiredApiVersionBits) const;
- bool requireDeviceExtension (const std::string& required);
- bool requireInstanceExtension (const std::string& required);
+ bool requireDeviceFunctionality (const std::string& required) const;
+ bool requireInstanceFunctionality (const std::string& required) const;
bool requireDeviceCoreFeature (const DeviceCoreFeature requiredDeviceCoreFeature);
void* getInstanceProcAddr ();
+ bool isBufferDeviceAddressSupported (void) const;
+
+ bool resultSetOnValidation () const { return m_resultSetOnValidation; }
+ void resultSetOnValidation (bool value) { m_resultSetOnValidation = value; }
+
protected:
tcu::TestContext& m_testCtx;
const vk::PlatformInterface& m_platformInterface;
@@ -106,6 +118,8 @@
const de::UniquePtr<DefaultDevice> m_device;
const de::UniquePtr<vk::Allocator> m_allocator;
+ bool m_resultSetOnValidation;
+
private:
Context (const Context&); // Not allowed
Context& operator= (const Context&); // Not allowed
@@ -154,6 +168,8 @@
{
}
+void collectAndReportDebugMessages(vk::DebugReportRecorder &debugReportRecorder, Context& context);
+
} // vkt
#endif // _VKTTESTCASE_HPP
diff --git a/external/vulkancts/modules/vulkan/vktTestPackage.cpp b/external/vulkancts/modules/vulkan/vktTestPackage.cpp
index c891762..f89cd3c 100644
--- a/external/vulkancts/modules/vulkan/vktTestPackage.cpp
+++ b/external/vulkancts/modules/vulkan/vktTestPackage.cpp
@@ -90,6 +90,7 @@
#include "vktMemoryModelTests.hpp"
#include "vktAmberExampleTests.hpp"
#include "vktAmberGraphicsFuzzTests.hpp"
+#include "vktImagelessFramebufferTests.hpp"
#include "vktTransformFeedbackTests.hpp"
#include "vktDescriptorIndexingTests.hpp"
#include "vktImagelessFramebufferTests.hpp"
@@ -199,6 +200,7 @@
virtual tcu::TestNode::IterateResult iterate (tcu::TestCase* testCase);
private:
+ bool spirvVersionSupported(vk::SpirvVersion);
vk::BinaryCollection m_progCollection;
vk::BinaryRegistryReader m_prebuiltBinRegistry;
@@ -264,7 +266,7 @@
for (vk::GlslSourceCollection::Iterator progIter = sourceProgs.glslSources.begin(); progIter != sourceProgs.glslSources.end(); ++progIter)
{
- if (progIter.getProgram().buildOptions.targetVersion > vk::getMaxSpirvVersionForGlsl(m_context.getUsedApiVersion()))
+ if (!spirvVersionSupported(progIter.getProgram().buildOptions.targetVersion))
TCU_THROW(NotSupportedError, "Shader requires SPIR-V higher than available");
const vk::ProgramBinary* const binProg = buildProgram<glu::ShaderProgramInfo, vk::GlslSourceCollection::Iterator>(casePath, progIter, m_prebuiltBinRegistry, log, &m_progCollection, commandLine);
@@ -288,7 +290,7 @@
for (vk::HlslSourceCollection::Iterator progIter = sourceProgs.hlslSources.begin(); progIter != sourceProgs.hlslSources.end(); ++progIter)
{
- if (progIter.getProgram().buildOptions.targetVersion > vk::getMaxSpirvVersionForGlsl(m_context.getUsedApiVersion()))
+ if (!spirvVersionSupported(progIter.getProgram().buildOptions.targetVersion))
TCU_THROW(NotSupportedError, "Shader requires SPIR-V higher than available");
const vk::ProgramBinary* const binProg = buildProgram<glu::ShaderProgramInfo, vk::HlslSourceCollection::Iterator>(casePath, progIter, m_prebuiltBinRegistry, log, &m_progCollection, commandLine);
@@ -312,7 +314,7 @@
for (vk::SpirVAsmCollection::Iterator asmIterator = sourceProgs.spirvAsmSources.begin(); asmIterator != sourceProgs.spirvAsmSources.end(); ++asmIterator)
{
- if (asmIterator.getProgram().buildOptions.targetVersion > vk::getMaxSpirvVersionForAsm(m_context.getUsedApiVersion()))
+ if (!spirvVersionSupported(asmIterator.getProgram().buildOptions.targetVersion))
TCU_THROW(NotSupportedError, "Shader requires SPIR-V higher than available");
buildProgram<vk::SpirVProgramInfo, vk::SpirVAsmCollection::Iterator>(casePath, asmIterator, m_prebuiltBinRegistry, log, &m_progCollection, commandLine);
@@ -322,6 +324,7 @@
DE_ASSERT(!m_instance);
m_instance = vktCase->createInstance(m_context);
+ m_context.resultSetOnValidation(false);
}
void TestCaseExecutor::deinit (tcu::TestCase*)
@@ -333,38 +336,7 @@
// Collect and report any debug messages
if (m_debugReportRecorder)
- {
- // \note We are not logging INFORMATION and DEBUG messages
- static const vk::VkDebugReportFlagsEXT errorFlags = vk::VK_DEBUG_REPORT_ERROR_BIT_EXT;
- static const vk::VkDebugReportFlagsEXT logFlags = errorFlags
- | vk::VK_DEBUG_REPORT_WARNING_BIT_EXT
- | vk::VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT;
-
- typedef vk::DebugReportRecorder::MessageList DebugMessages;
-
- const DebugMessages& messages = m_debugReportRecorder->getMessages();
- tcu::TestLog& log = m_context.getTestContext().getLog();
-
- if (messages.begin() != messages.end())
- {
- const tcu::ScopedLogSection section (log, "DebugMessages", "Debug Messages");
- int numErrors = 0;
-
- for (DebugMessages::const_iterator curMsg = messages.begin(); curMsg != messages.end(); ++curMsg)
- {
- if ((curMsg->flags & logFlags) != 0)
- log << tcu::TestLog::Message << *curMsg << tcu::TestLog::EndMessage;
-
- if ((curMsg->flags & errorFlags) != 0)
- numErrors += 1;
- }
-
- m_debugReportRecorder->clearMessages();
-
- if (numErrors > 0)
- m_context.getTestContext().setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, (de::toString(numErrors) + " API usage errors found").c_str());
- }
- }
+ collectAndReportDebugMessages(*m_debugReportRecorder, m_context);
}
tcu::TestNode::IterateResult TestCaseExecutor::iterate (tcu::TestCase*)
@@ -375,15 +347,29 @@
if (result.isComplete())
{
- // Vulkan tests shouldn't set result directly
- DE_ASSERT(m_context.getTestContext().getTestResult() == QP_TEST_RESULT_LAST);
- m_context.getTestContext().setTestResult(result.getCode(), result.getDescription().c_str());
+ // Vulkan tests shouldn't set result directly except when using a debug report messenger to catch validation errors.
+ DE_ASSERT(m_context.getTestContext().getTestResult() == QP_TEST_RESULT_LAST || m_context.resultSetOnValidation());
+
+ // Override result if not set previously by a debug report messenger.
+ if (!m_context.resultSetOnValidation())
+ m_context.getTestContext().setTestResult(result.getCode(), result.getDescription().c_str());
return tcu::TestNode::STOP;
}
else
return tcu::TestNode::CONTINUE;
}
+bool TestCaseExecutor::spirvVersionSupported (vk::SpirvVersion spirvVersion)
+{
+ if (spirvVersion <= vk::getMaxSpirvVersionForVulkan(m_context.getUsedApiVersion()))
+ return true;
+
+ if (spirvVersion <= vk::SPIRV_VERSION_1_4)
+ return m_context.isDeviceFunctionalitySupported("VK_KHR_spirv_1_4");
+
+ return false;
+}
+
// GLSL shader tests
void createGlslTests (tcu::TestCaseGroup* glslTests)
@@ -509,9 +495,9 @@
addChild(conditional::createTests (m_testCtx));
addChild(cts_amber::createExampleTests (m_testCtx));
addChild(cts_amber::createGraphicsFuzzTests (m_testCtx));
+ addChild(imageless::createTests (m_testCtx));
addChild(TransformFeedback::createTests (m_testCtx));
addChild(DescriptorIndexing::createTests (m_testCtx));
- addChild(imageless::createTests (m_testCtx));
addChild(FragmentShaderInterlock::createTests(m_testCtx));
}
diff --git a/external/vulkancts/modules/vulkan/wsi/vktWsiColorSpaceTests.cpp b/external/vulkancts/modules/vulkan/wsi/vktWsiColorSpaceTests.cpp
index 8a7b25f..2ff94a3 100644
--- a/external/vulkancts/modules/vulkan/wsi/vktWsiColorSpaceTests.cpp
+++ b/external/vulkancts/modules/vulkan/wsi/vktWsiColorSpaceTests.cpp
@@ -25,6 +25,7 @@
#include "vktTestCaseUtil.hpp"
#include "vktTestGroupUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkDefs.hpp"
#include "vkPlatform.hpp"
@@ -47,6 +48,7 @@
#include "tcuFormatUtil.hpp"
#include "tcuPlatform.hpp"
#include "tcuResultCollector.hpp"
+#include "tcuCommandLine.hpp"
#include "deUniquePtr.hpp"
#include "deStringUtil.hpp"
@@ -89,11 +91,10 @@
}
}
-Move<VkInstance> createInstanceWithWsi (const PlatformInterface& vkp,
- deUint32 version,
- const Extensions& supportedExtensions,
- Type wsiType,
- const VkAllocationCallbacks* pAllocator = DE_NULL)
+CustomInstance createInstanceWithWsi (Context& context,
+ const Extensions& supportedExtensions,
+ Type wsiType,
+ const VkAllocationCallbacks* pAllocator = DE_NULL)
{
vector<string> extensions;
@@ -115,7 +116,7 @@
checkAllSupported(supportedExtensions, extensions);
- return createDefaultInstance(vkp, version, vector<string>(), extensions, pAllocator);
+ return createCustomInstanceWithExtensions(context, extensions, pAllocator);
}
VkPhysicalDeviceFeatures getDeviceFeaturesForWsi (void)
@@ -131,7 +132,8 @@
VkPhysicalDevice physicalDevice,
const Extensions& supportedExtensions,
const deUint32 queueFamilyIndex,
- const VkAllocationCallbacks* pAllocator = DE_NULL)
+ const VkAllocationCallbacks* pAllocator,
+ bool validationEnabled)
{
const float queuePriorities[] = { 1.0f };
const VkDeviceQueueCreateInfo queueInfos[] =
@@ -155,7 +157,7 @@
if (isExtensionSupported(supportedExtensions, RequiredExtension("VK_EXT_hdr_metadata")))
extensions.push_back("VK_EXT_hdr_metadata");
- const VkDeviceCreateInfo deviceParams =
+ VkDeviceCreateInfo deviceParams =
{
VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
DE_NULL,
@@ -169,7 +171,7 @@
&features
};
- return createDevice(vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
+ return createCustomDevice(validationEnabled, vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
}
deUint32 getNumQueueFamilyIndices (const InstanceInterface& vki, VkPhysicalDevice physicalDevice)
@@ -208,18 +210,17 @@
struct InstanceHelper
{
const vector<VkExtensionProperties> supportedExtensions;
- const Unique<VkInstance> instance;
- const InstanceDriver vki;
+ const CustomInstance instance;
+ const InstanceDriver& vki;
InstanceHelper (Context& context, Type wsiType, const VkAllocationCallbacks* pAllocator = DE_NULL)
: supportedExtensions (enumerateInstanceExtensionProperties(context.getPlatformInterface(),
DE_NULL))
- , instance (createInstanceWithWsi(context.getPlatformInterface(),
- context.getUsedApiVersion(),
+ , instance (createInstanceWithWsi(context,
supportedExtensions,
wsiType,
pAllocator))
- , vki (context.getPlatformInterface(), *instance)
+ , vki (instance.getDriver())
{}
};
@@ -244,7 +245,8 @@
physicalDevice,
enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL),
queueFamilyIndex,
- pAllocator))
+ pAllocator,
+ context.getTestContext().getCommandLine().isValidationEnabled()))
, vkd (context.getPlatformInterface(), instance, *device)
, queue (getDeviceQueue(vkd, *device, queueFamilyIndex, 0))
{
@@ -797,8 +799,8 @@
const tcu::UVec2 desiredSize (256, 256);
const InstanceHelper instHelper (context, wsiType);
const NativeObjects native (context, instHelper.supportedExtensions, wsiType, tcu::just(desiredSize));
- const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
- const DeviceHelper devHelper (context, instHelper.vki, *instHelper.instance, *surface);
+ const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+ const DeviceHelper devHelper (context, instHelper.vki, instHelper.instance, *surface);
if (!de::contains(context.getInstanceExtensions().begin(), context.getInstanceExtensions().end(), "VK_EXT_swapchain_colorspace"))
TCU_THROW(NotSupportedError, "Extension VK_EXT_swapchain_colorspace not supported");
@@ -831,7 +833,7 @@
{
const tcu::UVec2 desiredSize (256, 256);
const InstanceHelper instHelper (context, wsiType);
- const DeviceHelper devHelper (context, instHelper.vki, *instHelper.instance, surface);
+ const DeviceHelper devHelper (context, instHelper.vki, instHelper.instance, surface);
const DeviceInterface& vkd = devHelper.vkd;
const VkDevice device = *devHelper.device;
SimpleAllocator allocator (vkd, device, getPhysicalDeviceMemoryProperties(instHelper.vki, devHelper.physicalDevice));
@@ -971,8 +973,8 @@
const tcu::UVec2 desiredSize (256, 256);
const InstanceHelper instHelper (context, wsiType);
const NativeObjects native (context, instHelper.supportedExtensions, wsiType, tcu::just(desiredSize));
- const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
- const DeviceHelper devHelper (context, instHelper.vki, *instHelper.instance, *surface);
+ const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+ const DeviceHelper devHelper (context, instHelper.vki, instHelper.instance, *surface);
if (!de::contains(context.getInstanceExtensions().begin(), context.getInstanceExtensions().end(), "VK_EXT_swapchain_colorspace"))
TCU_THROW(NotSupportedError, "Extension VK_EXT_swapchain_colorspace not supported");
@@ -992,8 +994,8 @@
const tcu::UVec2 desiredSize (256, 256);
const InstanceHelper instHelper (context, wsiType);
const NativeObjects native (context, instHelper.supportedExtensions, wsiType, tcu::just(desiredSize));
- const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
- const DeviceHelper devHelper (context, instHelper.vki, *instHelper.instance, *surface);
+ const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+ const DeviceHelper devHelper (context, instHelper.vki, instHelper.instance, *surface);
if (!de::contains(context.getInstanceExtensions().begin(), context.getInstanceExtensions().end(), "VK_EXT_swapchain_colorspace"))
TCU_THROW(NotSupportedError, "Extension VK_EXT_swapchain_colorspace not supported");
diff --git a/external/vulkancts/modules/vulkan/wsi/vktWsiDisplayTimingTests.cpp b/external/vulkancts/modules/vulkan/wsi/vktWsiDisplayTimingTests.cpp
index 767b787..ccc02a2 100644
--- a/external/vulkancts/modules/vulkan/wsi/vktWsiDisplayTimingTests.cpp
+++ b/external/vulkancts/modules/vulkan/wsi/vktWsiDisplayTimingTests.cpp
@@ -37,10 +37,12 @@
#include "vktWsiDisplayTimingTests.hpp"
#include "vktTestCaseUtil.hpp"
#include "vktTestGroupUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "tcuPlatform.hpp"
#include "tcuResultCollector.hpp"
#include "tcuTestLog.hpp"
+#include "tcuCommandLine.hpp"
#include "deClock.h"
@@ -76,10 +78,9 @@
}
}
-vk::Move<vk::VkInstance> createInstanceWithWsi (const vk::PlatformInterface& vkp,
- deUint32 version,
- const Extensions& supportedExtensions,
- vk::wsi::Type wsiType)
+CustomInstance createInstanceWithWsi (Context& context,
+ const Extensions& supportedExtensions,
+ vk::wsi::Type wsiType)
{
vector<string> extensions;
@@ -88,7 +89,7 @@
checkAllSupported(supportedExtensions, extensions);
- return vk::createDefaultInstance(vkp, version, vector<string>(), extensions);
+ return vkt::createCustomInstanceWithExtensions(context, extensions);
}
vk::VkPhysicalDeviceFeatures getDeviceNullFeatures (void)
@@ -138,6 +139,7 @@
const Extensions& supportedExtensions,
const deUint32 queueFamilyIndex,
bool requiresDisplayTiming,
+ bool validationEnabled,
const vk::VkAllocationCallbacks* pAllocator = DE_NULL)
{
const float queuePriorities[] = { 1.0f };
@@ -179,7 +181,7 @@
TCU_THROW(NotSupportedError, (string(extensions[ndx]) + " is not supported").c_str());
}
- return createDevice(vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
+ return createCustomDevice(validationEnabled, vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
}
de::MovePtr<vk::wsi::Display> createDisplay (const vk::Platform& platform,
@@ -571,8 +573,8 @@
const deUint32 m_quadCount;
const vk::PlatformInterface& m_vkp;
const Extensions m_instanceExtensions;
- const vk::Unique<vk::VkInstance> m_instance;
- const vk::InstanceDriver m_vki;
+ const CustomInstance m_instance;
+ const vk::InstanceDriver& m_vki;
const vk::VkPhysicalDevice m_physicalDevice;
const de::UniquePtr<vk::wsi::Display> m_nativeDisplay;
const de::UniquePtr<vk::wsi::Window> m_nativeWindow;
@@ -719,17 +721,17 @@
, m_quadCount (16u)
, m_vkp (context.getPlatformInterface())
, m_instanceExtensions (vk::enumerateInstanceExtensionProperties(m_vkp, DE_NULL))
- , m_instance (createInstanceWithWsi(m_vkp, context.getUsedApiVersion(), m_instanceExtensions, testConfig.wsiType))
- , m_vki (m_vkp, *m_instance)
- , m_physicalDevice (vk::chooseDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
+ , m_instance (createInstanceWithWsi(context, m_instanceExtensions, testConfig.wsiType))
+ , m_vki (m_instance.getDriver())
+ , m_physicalDevice (vk::chooseDevice(m_vki, m_instance, context.getTestContext().getCommandLine()))
, m_nativeDisplay (createDisplay(context.getTestContext().getPlatform().getVulkanPlatform(), m_instanceExtensions, testConfig.wsiType))
, m_nativeWindow (createWindow(*m_nativeDisplay, tcu::nothing<UVec2>()))
- , m_surface (vk::wsi::createSurface(m_vki, *m_instance, testConfig.wsiType, *m_nativeDisplay, *m_nativeWindow))
+ , m_surface (vk::wsi::createSurface(m_vki, m_instance, testConfig.wsiType, *m_nativeDisplay, *m_nativeWindow))
, m_queueFamilyIndex (chooseQueueFamilyIndex(m_vki, m_physicalDevice, *m_surface))
, m_deviceExtensions (vk::enumerateDeviceExtensionProperties(m_vki, m_physicalDevice, DE_NULL))
- , m_device (createDeviceWithWsi(m_vkp, *m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex, testConfig.useDisplayTiming))
- , m_vkd (m_vkp, *m_instance, *m_device)
+ , m_device (createDeviceWithWsi(m_vkp, m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex, testConfig.useDisplayTiming, context.getTestContext().getCommandLine().isValidationEnabled()))
+ , m_vkd (m_vkp, m_instance, *m_device)
, m_queue (getDeviceQueue(m_vkd, *m_device, m_queueFamilyIndex, 0u))
, m_commandPool (createCommandPool(m_vkd, *m_device, m_queueFamilyIndex))
diff --git a/external/vulkancts/modules/vulkan/wsi/vktWsiIncrementalPresentTests.cpp b/external/vulkancts/modules/vulkan/wsi/vktWsiIncrementalPresentTests.cpp
index e07d204..54889e3 100644
--- a/external/vulkancts/modules/vulkan/wsi/vktWsiIncrementalPresentTests.cpp
+++ b/external/vulkancts/modules/vulkan/wsi/vktWsiIncrementalPresentTests.cpp
@@ -25,6 +25,7 @@
#include "vktTestCaseUtil.hpp"
#include "vktTestGroupUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkRefUtil.hpp"
#include "vkWsiPlatform.hpp"
#include "vkWsiUtil.hpp"
@@ -41,6 +42,7 @@
#include "tcuPlatform.hpp"
#include "tcuResultCollector.hpp"
#include "tcuTestLog.hpp"
+#include "tcuCommandLine.hpp"
#include <vector>
#include <string>
@@ -78,10 +80,9 @@
}
}
-vk::Move<vk::VkInstance> createInstanceWithWsi (const vk::PlatformInterface& vkp,
- deUint32 version,
- const Extensions& supportedExtensions,
- vk::wsi::Type wsiType)
+CustomInstance createInstanceWithWsi (Context& context,
+ const Extensions& supportedExtensions,
+ vk::wsi::Type wsiType)
{
vector<string> extensions;
@@ -90,7 +91,7 @@
checkAllSupported(supportedExtensions, extensions);
- return vk::createDefaultInstance(vkp, version, vector<string>(), extensions);
+ return vkt::createCustomInstanceWithExtensions(context, extensions);
}
vk::VkPhysicalDeviceFeatures getDeviceNullFeatures (void)
@@ -140,6 +141,7 @@
const Extensions& supportedExtensions,
const deUint32 queueFamilyIndex,
bool requiresIncrementalPresent,
+ bool validationEnabled,
const vk::VkAllocationCallbacks* pAllocator = DE_NULL)
{
const float queuePriorities[] = { 1.0f };
@@ -181,7 +183,7 @@
TCU_THROW(NotSupportedError, (string(extensions[ndx]) + " is not supported").c_str());
}
- return createDevice(vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
+ return createCustomDevice(validationEnabled, vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
}
de::MovePtr<vk::wsi::Display> createDisplay (const vk::Platform& platform,
@@ -654,8 +656,8 @@
const bool m_useIncrementalPresent;
const vk::PlatformInterface& m_vkp;
const Extensions m_instanceExtensions;
- const vk::Unique<vk::VkInstance> m_instance;
- const vk::InstanceDriver m_vki;
+ const CustomInstance m_instance;
+ const vk::InstanceDriver& m_vki;
const vk::VkPhysicalDevice m_physicalDevice;
const de::UniquePtr<vk::wsi::Display> m_nativeDisplay;
const de::UniquePtr<vk::wsi::Window> m_nativeWindow;
@@ -830,17 +832,17 @@
, m_useIncrementalPresent (testConfig.useIncrementalPresent)
, m_vkp (context.getPlatformInterface())
, m_instanceExtensions (vk::enumerateInstanceExtensionProperties(m_vkp, DE_NULL))
- , m_instance (createInstanceWithWsi(m_vkp, context.getUsedApiVersion(), m_instanceExtensions, testConfig.wsiType))
- , m_vki (m_vkp, *m_instance)
- , m_physicalDevice (vk::chooseDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
+ , m_instance (createInstanceWithWsi(context, m_instanceExtensions, testConfig.wsiType))
+ , m_vki (m_instance.getDriver())
+ , m_physicalDevice (vk::chooseDevice(m_vki, m_instance, context.getTestContext().getCommandLine()))
, m_nativeDisplay (createDisplay(context.getTestContext().getPlatform().getVulkanPlatform(), m_instanceExtensions, testConfig.wsiType))
, m_nativeWindow (createWindow(*m_nativeDisplay, tcu::nothing<UVec2>()))
- , m_surface (vk::wsi::createSurface(m_vki, *m_instance, testConfig.wsiType, *m_nativeDisplay, *m_nativeWindow))
+ , m_surface (vk::wsi::createSurface(m_vki, m_instance, testConfig.wsiType, *m_nativeDisplay, *m_nativeWindow))
, m_queueFamilyIndex (chooseQueueFamilyIndex(m_vki, m_physicalDevice, *m_surface))
, m_deviceExtensions (vk::enumerateDeviceExtensionProperties(m_vki, m_physicalDevice, DE_NULL))
- , m_device (createDeviceWithWsi(m_vkp, *m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex, testConfig.useIncrementalPresent))
- , m_vkd (m_vkp, *m_instance, *m_device)
+ , m_device (createDeviceWithWsi(m_vkp, m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex, testConfig.useIncrementalPresent, context.getTestContext().getCommandLine().isValidationEnabled()))
+ , m_vkd (m_vkp, m_instance, *m_device)
, m_queue (getDeviceQueue(m_vkd, *m_device, m_queueFamilyIndex, 0u))
, m_commandPool (createCommandPool(m_vkd, *m_device, m_queueFamilyIndex))
@@ -1008,7 +1010,7 @@
(deUint32)rects.size(),
rects.empty() ? DE_NULL : &rects[0]
};
- const vk::VkPresentRegionsKHR regionInfo =
+ const vk::VkPresentRegionsKHR regionInfo =
{
vk::VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR,
DE_NULL,
diff --git a/external/vulkancts/modules/vulkan/wsi/vktWsiSharedPresentableImageTests.cpp b/external/vulkancts/modules/vulkan/wsi/vktWsiSharedPresentableImageTests.cpp
index 1241b0f..48e990b 100644
--- a/external/vulkancts/modules/vulkan/wsi/vktWsiSharedPresentableImageTests.cpp
+++ b/external/vulkancts/modules/vulkan/wsi/vktWsiSharedPresentableImageTests.cpp
@@ -22,6 +22,7 @@
*//*--------------------------------------------------------------------*/
#include "vktWsiSharedPresentableImageTests.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vktTestCaseUtil.hpp"
#include "vktTestGroupUtil.hpp"
@@ -41,6 +42,7 @@
#include "tcuPlatform.hpp"
#include "tcuResultCollector.hpp"
#include "tcuTestLog.hpp"
+#include "tcuCommandLine.hpp"
#include <vector>
#include <string>
@@ -78,11 +80,11 @@
}
}
-vk::Move<vk::VkInstance> createInstanceWithWsi (const vk::PlatformInterface& vkp,
- deUint32 version,
- const Extensions& supportedExtensions,
- vk::wsi::Type wsiType)
+CustomInstance createInstanceWithWsi (Context& context,
+ const Extensions& supportedExtensions,
+ vk::wsi::Type wsiType)
{
+ const deUint32 version = context.getUsedApiVersion();
vector<string> extensions;
if (!vk::isCoreInstanceExtension(version, "VK_KHR_get_physical_device_properties2"))
@@ -96,7 +98,7 @@
checkAllSupported(supportedExtensions, extensions);
- return vk::createDefaultInstance(vkp, version, vector<string>(), extensions);
+ return vkt::createCustomInstanceWithExtensions(context, extensions);
}
vk::VkPhysicalDeviceFeatures getDeviceNullFeatures (void)
@@ -146,6 +148,7 @@
const Extensions& supportedExtensions,
const deUint32 queueFamilyIndex,
bool requiresSharedPresentableImage,
+ bool validationEnabled,
const vk::VkAllocationCallbacks* pAllocator = DE_NULL)
{
const float queuePriorities[] = { 1.0f };
@@ -187,7 +190,7 @@
TCU_THROW(NotSupportedError, (string(extensions[ndx]) + " is not supported").c_str());
}
- return createDevice(vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
+ return createCustomDevice(validationEnabled, vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
}
de::MovePtr<vk::wsi::Display> createDisplay (const vk::Platform& platform,
@@ -567,8 +570,8 @@
const deUint32 m_quadCount;
const vk::PlatformInterface& m_vkp;
const Extensions m_instanceExtensions;
- const vk::Unique<vk::VkInstance> m_instance;
- const vk::InstanceDriver m_vki;
+ const CustomInstance m_instance;
+ const vk::InstanceDriver& m_vki;
const vk::VkPhysicalDevice m_physicalDevice;
const de::UniquePtr<vk::wsi::Display> m_nativeDisplay;
const de::UniquePtr<vk::wsi::Window> m_nativeWindow;
@@ -741,17 +744,17 @@
, m_quadCount (16u)
, m_vkp (context.getPlatformInterface())
, m_instanceExtensions (vk::enumerateInstanceExtensionProperties(m_vkp, DE_NULL))
- , m_instance (createInstanceWithWsi(m_vkp, context.getUsedApiVersion(), m_instanceExtensions, testConfig.wsiType))
- , m_vki (m_vkp, *m_instance)
- , m_physicalDevice (vk::chooseDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
+ , m_instance (createInstanceWithWsi(context, m_instanceExtensions, testConfig.wsiType))
+ , m_vki (m_instance.getDriver())
+ , m_physicalDevice (vk::chooseDevice(m_vki, m_instance, context.getTestContext().getCommandLine()))
, m_nativeDisplay (createDisplay(context.getTestContext().getPlatform().getVulkanPlatform(), m_instanceExtensions, testConfig.wsiType))
, m_nativeWindow (createWindow(*m_nativeDisplay, tcu::nothing<UVec2>()))
- , m_surface (vk::wsi::createSurface(m_vki, *m_instance, testConfig.wsiType, *m_nativeDisplay, *m_nativeWindow))
+ , m_surface (vk::wsi::createSurface(m_vki, m_instance, testConfig.wsiType, *m_nativeDisplay, *m_nativeWindow))
, m_queueFamilyIndex (chooseQueueFamilyIndex(m_vki, m_physicalDevice, *m_surface))
, m_deviceExtensions (vk::enumerateDeviceExtensionProperties(m_vki, m_physicalDevice, DE_NULL))
- , m_device (createDeviceWithWsi(m_vkp, *m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex, testConfig.useSharedPresentableImage))
- , m_vkd (m_vkp, *m_instance, *m_device)
+ , m_device (createDeviceWithWsi(m_vkp, m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex, testConfig.useSharedPresentableImage, context.getTestContext().getCommandLine().isValidationEnabled()))
+ , m_vkd (m_vkp, m_instance, *m_device)
, m_queue (getDeviceQueue(m_vkd, *m_device, m_queueFamilyIndex, 0u))
, m_commandPool (createCommandPool(m_vkd, *m_device, m_queueFamilyIndex))
diff --git a/external/vulkancts/modules/vulkan/wsi/vktWsiSurfaceTests.cpp b/external/vulkancts/modules/vulkan/wsi/vktWsiSurfaceTests.cpp
index f53ae27..0bb87bb 100644
--- a/external/vulkancts/modules/vulkan/wsi/vktWsiSurfaceTests.cpp
+++ b/external/vulkancts/modules/vulkan/wsi/vktWsiSurfaceTests.cpp
@@ -25,6 +25,7 @@
#include "vktTestCaseUtil.hpp"
#include "vktTestGroupUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkDefs.hpp"
#include "vkPlatform.hpp"
@@ -169,62 +170,54 @@
typedef vector<VkExtensionProperties> Extensions;
-Move<VkInstance> createInstanceWithWsi (const PlatformInterface& vkp,
- deUint32 version,
- const Extensions& supportedExtensions,
- Type wsiType,
- const vector<string> extraExtensions,
- const VkAllocationCallbacks* pAllocator = DE_NULL)
+CustomInstance createInstanceWithWsi (Context& context,
+ Type wsiType,
+ const vector<string> extraExtensions,
+ const VkAllocationCallbacks* pAllocator = DE_NULL)
{
- vector<string> extensions = extraExtensions;
+ const deUint32 version = context.getUsedApiVersion();
+ vector<string> extensions = extraExtensions;
extensions.push_back("VK_KHR_surface");
extensions.push_back(getExtensionName(wsiType));
vector<string> instanceExtensions;
-
- for (vector<string>::const_iterator extensionName = extensions.begin();
- extensionName != extensions.end();
- ++extensionName)
+ for (const auto& ext : extensions)
{
- if (!isInstanceExtensionSupported(version, supportedExtensions, RequiredExtension(*extensionName)))
- TCU_THROW(NotSupportedError, (*extensionName + " is not supported").c_str());
+ if (!context.isInstanceFunctionalitySupported(ext))
+ TCU_THROW(NotSupportedError, (ext + " is not supported").c_str());
- if (!isCoreInstanceExtension(version, *extensionName))
- instanceExtensions.push_back(*extensionName);
+ if (!isCoreInstanceExtension(version, ext))
+ instanceExtensions.push_back(ext);
}
- return vk::createDefaultInstance(vkp, version, vector<string>(), instanceExtensions, pAllocator);
+ return vkt::createCustomInstanceWithExtensions(context, instanceExtensions, pAllocator);
}
struct InstanceHelper
{
const vector<VkExtensionProperties> supportedExtensions;
- Unique<VkInstance> instance;
- const InstanceDriver vki;
+ CustomInstance instance;
+ const InstanceDriver& vki;
InstanceHelper (Context& context, Type wsiType, const VkAllocationCallbacks* pAllocator = DE_NULL)
: supportedExtensions (enumerateInstanceExtensionProperties(context.getPlatformInterface(),
DE_NULL))
- , instance (createInstanceWithWsi(context.getPlatformInterface(),
- context.getUsedApiVersion(),
- supportedExtensions,
+ , instance (createInstanceWithWsi(context,
wsiType,
vector<string>(),
pAllocator))
- , vki (context.getPlatformInterface(), *instance)
+ , vki (instance.getDriver())
{}
InstanceHelper (Context& context, Type wsiType, const vector<string>& extensions, const VkAllocationCallbacks* pAllocator = DE_NULL)
: supportedExtensions (enumerateInstanceExtensionProperties(context.getPlatformInterface(),
DE_NULL))
- , instance (createInstanceWithWsi(context.getPlatformInterface(),
- context.getUsedApiVersion(),
- supportedExtensions,
+ , instance (createInstanceWithWsi(context,
wsiType,
extensions,
pAllocator))
- , vki (context.getPlatformInterface(), *instance)
+ , vki (instance.getDriver())
{}
};
@@ -282,7 +275,7 @@
{
const InstanceHelper instHelper (context, wsiType);
const NativeObjects native (context, instHelper.supportedExtensions, wsiType);
- const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
+ const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
return tcu::TestStatus::pass("Creating surface succeeded");
}
@@ -296,7 +289,7 @@
const InstanceHelper instHelper (context, wsiType, allocationRecorder.getCallbacks());
const NativeObjects native (context, instHelper.supportedExtensions, wsiType);
const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki,
- *instHelper.instance,
+ instHelper.instance,
wsiType,
*native.display,
*native.window,
@@ -342,7 +335,7 @@
const NativeObjects native (context, instHelper.supportedExtensions, wsiType);
const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki,
- *instHelper.instance,
+ instHelper.instance,
wsiType,
*native.display,
*native.window,
@@ -393,8 +386,8 @@
const InstanceHelper instHelper (context, wsiType);
const NativeObjects native (context, instHelper.supportedExtensions, wsiType);
- const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
- const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(instHelper.vki, *instHelper.instance);
+ const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+ const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(instHelper.vki, instHelper.instance);
// On Android surface must be supported by all devices and queue families
const bool expectSupportedOnAll = wsiType == TYPE_ANDROID;
@@ -488,8 +481,8 @@
const InstanceHelper instHelper (context, wsiType);
const NativeObjects native (context, instHelper.supportedExtensions, wsiType);
- const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
- const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(instHelper.vki, *instHelper.instance);
+ const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+ const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(instHelper.vki, instHelper.instance);
for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx)
{
@@ -516,8 +509,8 @@
const InstanceHelper instHelper (context, wsiType, vector<string>(1, string("VK_KHR_get_surface_capabilities2")));
const NativeObjects native (context, instHelper.supportedExtensions, wsiType);
- const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
- const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(instHelper.vki, *instHelper.instance);
+ const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+ const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(instHelper.vki, instHelper.instance);
for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx)
{
@@ -577,8 +570,8 @@
requiredExtensions.push_back("VK_KHR_surface_protected_capabilities");
const InstanceHelper instHelper (context, wsiType, requiredExtensions);
const NativeObjects native (context, instHelper.supportedExtensions, wsiType);
- const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
- const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(instHelper.vki, *instHelper.instance);
+ const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+ const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(instHelper.vki, instHelper.instance);
for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx)
{
@@ -670,8 +663,8 @@
const InstanceHelper instHelper (context, wsiType);
const NativeObjects native (context, instHelper.supportedExtensions, wsiType);
- const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
- const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(instHelper.vki, *instHelper.instance);
+ const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+ const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(instHelper.vki, instHelper.instance);
for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx)
{
@@ -716,8 +709,8 @@
const InstanceHelper instHelper (context, wsiType, vector<string>(1, string("VK_KHR_get_surface_capabilities2")));
const NativeObjects native (context, instHelper.supportedExtensions, wsiType);
- const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
- const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(instHelper.vki, *instHelper.instance);
+ const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+ const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(instHelper.vki, instHelper.instance);
for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx)
{
@@ -826,8 +819,8 @@
const InstanceHelper instHelper (context, wsiType);
const NativeObjects native (context, instHelper.supportedExtensions, wsiType);
- const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
- const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(instHelper.vki, *instHelper.instance);
+ const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+ const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(instHelper.vki, instHelper.instance);
for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx)
{
@@ -879,7 +872,7 @@
deUint8 buffer [sizeof(VkDeviceGroupPresentCapabilitiesKHR) + GUARD_SIZE];
deUint32 queueFamilyIndex = 0;
VkDeviceGroupPresentCapabilitiesKHR* presentCapabilities;
- VkPhysicalDevice physicalDevice = chooseDevice(instHelper.vki, *instHelper.instance, cmdLine);
+ VkPhysicalDevice physicalDevice = chooseDevice(instHelper.vki, instHelper.instance, cmdLine);
const Extensions& supportedExtensions = enumerateDeviceExtensionProperties(instHelper.vki, physicalDevice, DE_NULL);
std::vector<const char*> deviceExtensions;
@@ -893,7 +886,7 @@
TCU_THROW(NotSupportedError, (string(deviceExtensions[ndx]) + " is not supported").c_str());
}
- const vector<VkPhysicalDeviceGroupProperties> deviceGroupProps = enumeratePhysicalDeviceGroups(instHelper.vki, *instHelper.instance);
+ const vector<VkPhysicalDeviceGroupProperties> deviceGroupProps = enumeratePhysicalDeviceGroups(instHelper.vki, instHelper.instance);
const std::vector<VkQueueFamilyProperties> queueProps = getPhysicalDeviceQueueFamilyProperties(instHelper.vki, deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx]);
for (size_t queueNdx = 0; queueNdx < queueProps.size(); queueNdx++)
@@ -917,6 +910,7 @@
deviceGroupProps[devGroupIdx].physicalDeviceCount, //physicalDeviceCount
deviceGroupProps[devGroupIdx].physicalDevices //physicalDevices
};
+
const VkDeviceCreateInfo deviceCreateInfo =
{
VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, //sType;
@@ -930,8 +924,9 @@
(deviceExtensions.empty() ? DE_NULL : &deviceExtensions[0]), //ppEnabledExtensionNames;
DE_NULL, //pEnabledFeatures;
};
- Move<VkDevice> deviceGroup = createDevice(context.getPlatformInterface(), *instHelper.instance, instHelper.vki, deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx], &deviceCreateInfo);
- const DeviceDriver vk (context.getPlatformInterface(), *instHelper.instance, *deviceGroup);
+
+ Move<VkDevice> deviceGroup = createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), context.getPlatformInterface(), instHelper.instance, instHelper.vki, deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx], &deviceCreateInfo);
+ const DeviceDriver vk (context.getPlatformInterface(), instHelper.instance, *deviceGroup);
presentCapabilities = reinterpret_cast<VkDeviceGroupPresentCapabilitiesKHR*>(buffer);
@@ -972,7 +967,7 @@
tcu::ResultCollector results (log);
const InstanceHelper instHelper (context, wsiType, vector<string>(1, string("VK_KHR_device_group_creation")));
const NativeObjects native (context, instHelper.supportedExtensions, wsiType);
- const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
+ const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
const float queuePriority = 1.0f;
const tcu::CommandLine& cmdLine = context.getTestContext().getCommandLine();
const deUint32 devGroupIdx = cmdLine.getVKDeviceGroupId() - 1;
@@ -988,7 +983,7 @@
VkRect2D* presentRectangles;
VkDeviceGroupPresentModeFlagsKHR* presentModeFlags;
vector<deUint8> rectanglesBuffer;
- VkPhysicalDevice physicalDevice = chooseDevice(instHelper.vki, *instHelper.instance, cmdLine);
+ VkPhysicalDevice physicalDevice = chooseDevice(instHelper.vki, instHelper.instance, cmdLine);
const Extensions& supportedExtensions = enumerateDeviceExtensionProperties(instHelper.vki, physicalDevice, DE_NULL);
std::vector<const char*> deviceExtensions;
@@ -1002,7 +997,7 @@
TCU_THROW(NotSupportedError, (string(deviceExtensions[ndx]) + " is not supported").c_str());
}
- const vector<VkPhysicalDeviceGroupProperties> deviceGroupProps = enumeratePhysicalDeviceGroups(instHelper.vki, *instHelper.instance);
+ const vector<VkPhysicalDeviceGroupProperties> deviceGroupProps = enumeratePhysicalDeviceGroups(instHelper.vki, instHelper.instance);
const std::vector<VkQueueFamilyProperties> queueProps = getPhysicalDeviceQueueFamilyProperties(instHelper.vki, deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx]);
for (size_t queueNdx = 0; queueNdx < queueProps.size(); queueNdx++)
{
@@ -1025,7 +1020,8 @@
deviceGroupProps[devGroupIdx].physicalDeviceCount, //physicalDeviceCount
deviceGroupProps[devGroupIdx].physicalDevices //physicalDevices
};
- const VkDeviceCreateInfo deviceCreateInfo =
+
+ const VkDeviceCreateInfo deviceCreateInfo =
{
VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, //sType;
&deviceGroupInfo, //pNext;
@@ -1039,8 +1035,8 @@
DE_NULL, //pEnabledFeatures;
};
- Move<VkDevice> deviceGroup = createDevice(context.getPlatformInterface(), *instHelper.instance, instHelper.vki, deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx], &deviceCreateInfo);
- const DeviceDriver vk (context.getPlatformInterface(), *instHelper.instance, *deviceGroup);
+ Move<VkDevice> deviceGroup = createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), context.getPlatformInterface(), instHelper.instance, instHelper.vki, deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx], &deviceCreateInfo);
+ const DeviceDriver vk (context.getPlatformInterface(), instHelper.instance, *deviceGroup);
presentModeFlags = reinterpret_cast<VkDeviceGroupPresentModeFlagsKHR*>(buffer);
deMemset(buffer, GUARD_VALUE, sizeof(buffer));
@@ -1124,7 +1120,7 @@
instHelper.supportedExtensions,
wsiType));
- const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(instHelper.vki, *instHelper.instance);
+ const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(instHelper.vki, instHelper.instance);
const UVec2 sizes[] =
{
UVec2(64, 64),
@@ -1138,7 +1134,7 @@
{
const UVec2& testSize = sizes[sizeNdx];
const UniquePtr<Window> nativeWindow (createWindow(*nativeDisplay, tcu::just(testSize)));
- const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *nativeDisplay, *nativeWindow));
+ const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, instHelper.instance, wsiType, *nativeDisplay, *nativeWindow));
for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx)
{
@@ -1169,8 +1165,8 @@
wsiType));
UniquePtr<Window> nativeWindow (createWindow(*nativeDisplay, tcu::nothing<UVec2>()));
- const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(instHelper.vki, *instHelper.instance);
- const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *nativeDisplay, *nativeWindow));
+ const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(instHelper.vki, instHelper.instance);
+ const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, instHelper.instance, wsiType, *nativeDisplay, *nativeWindow));
const UVec2 sizes[] =
{
@@ -1218,13 +1214,13 @@
const VkSurfaceKHR nullHandle = DE_NULL;
// Default allocator
- instHelper.vki.destroySurfaceKHR(*instHelper.instance, nullHandle, DE_NULL);
+ instHelper.vki.destroySurfaceKHR(instHelper.instance, nullHandle, DE_NULL);
// Custom allocator
{
AllocationCallbackRecorder recordingAllocator (getSystemAllocator(), 1u);
- instHelper.vki.destroySurfaceKHR(*instHelper.instance, nullHandle, recordingAllocator.getCallbacks());
+ instHelper.vki.destroySurfaceKHR(instHelper.instance, nullHandle, recordingAllocator.getCallbacks());
if (recordingAllocator.getNumRecords() != 0u)
return tcu::TestStatus::fail("Implementation allocated/freed the memory");
diff --git a/external/vulkancts/modules/vulkan/wsi/vktWsiSwapchainTests.cpp b/external/vulkancts/modules/vulkan/wsi/vktWsiSwapchainTests.cpp
index 0fdc83b..46f7558 100644
--- a/external/vulkancts/modules/vulkan/wsi/vktWsiSwapchainTests.cpp
+++ b/external/vulkancts/modules/vulkan/wsi/vktWsiSwapchainTests.cpp
@@ -25,6 +25,7 @@
#include "vktTestCaseUtil.hpp"
#include "vktTestGroupUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkDefs.hpp"
#include "vkPlatform.hpp"
@@ -90,12 +91,11 @@
}
}
-Move<VkInstance> createInstanceWithWsi (const PlatformInterface& vkp,
- deUint32 version,
- const Extensions& supportedExtensions,
- Type wsiType,
- const vector<string> extraExtensions,
- const VkAllocationCallbacks* pAllocator = DE_NULL)
+CustomInstance createInstanceWithWsi (Context& context,
+ const Extensions& supportedExtensions,
+ Type wsiType,
+ const vector<string> extraExtensions,
+ const VkAllocationCallbacks* pAllocator = DE_NULL)
{
vector<string> extensions = extraExtensions;
@@ -117,7 +117,7 @@
checkAllSupported(supportedExtensions, extensions);
- return vk::createDefaultInstance(vkp, version, vector<string>(), extensions, pAllocator);
+ return vkt::createCustomInstanceWithExtensions(context, extensions, pAllocator);
}
VkPhysicalDeviceFeatures getDeviceFeaturesForWsi (void)
@@ -133,6 +133,7 @@
VkPhysicalDevice physicalDevice,
const Extensions& supportedExtensions,
const deUint32 queueFamilyIndex,
+ bool validationEnabled,
const VkAllocationCallbacks* pAllocator = DE_NULL)
{
const float queuePriorities[] = { 1.0f };
@@ -149,6 +150,7 @@
};
const VkPhysicalDeviceFeatures features = getDeviceFeaturesForWsi();
const char* const extensions[] = { "VK_KHR_swapchain" };
+
const VkDeviceCreateInfo deviceParams =
{
VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
@@ -169,7 +171,7 @@
TCU_THROW(NotSupportedError, (string(extensions[ndx]) + " is not supported").c_str());
}
- return createDevice(vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
+ return createCustomDevice(validationEnabled, vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
}
vector<deUint32> getSupportedQueueFamilyIndices (const InstanceInterface& vki, VkPhysicalDevice physicalDevice, VkSurfaceKHR surface)
@@ -203,31 +205,29 @@
struct InstanceHelper
{
const vector<VkExtensionProperties> supportedExtensions;
- const Unique<VkInstance> instance;
- const InstanceDriver vki;
+ const CustomInstance instance;
+ const InstanceDriver& vki;
InstanceHelper (Context& context, Type wsiType, const VkAllocationCallbacks* pAllocator = DE_NULL)
: supportedExtensions (enumerateInstanceExtensionProperties(context.getPlatformInterface(),
DE_NULL))
- , instance (createInstanceWithWsi(context.getPlatformInterface(),
- context.getUsedApiVersion(),
+ , instance (createInstanceWithWsi(context,
supportedExtensions,
wsiType,
vector<string>(),
pAllocator))
- , vki (context.getPlatformInterface(), *instance)
+ , vki (instance.getDriver())
{}
InstanceHelper (Context& context, Type wsiType, const vector<string>& extensions, const VkAllocationCallbacks* pAllocator = DE_NULL)
: supportedExtensions (enumerateInstanceExtensionProperties(context.getPlatformInterface(),
DE_NULL))
- , instance (createInstanceWithWsi(context.getPlatformInterface(),
- context.getUsedApiVersion(),
+ , instance (createInstanceWithWsi(context,
supportedExtensions,
wsiType,
extensions,
pAllocator))
- , vki (context.getPlatformInterface(), *instance)
+ , vki (instance.getDriver())
{}
};
@@ -252,6 +252,7 @@
physicalDevice,
enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL),
queueFamilyIndex,
+ context.getTestContext().getCommandLine().isValidationEnabled(),
pAllocator))
, vkd (context.getPlatformInterface(), context.getInstance(), *device)
, queue (getDeviceQueue(vkd, *device, queueFamilyIndex, 0))
@@ -582,8 +583,8 @@
tcu::TestLog& log = context.getTestContext().getLog();
const InstanceHelper instHelper (context, params.wsiType);
const NativeObjects native (context, instHelper.supportedExtensions, params.wsiType);
- 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 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<VkSwapchainCreateInfoKHR> cases (generateSwapchainParameterCases(params.wsiType, params.dimension, instHelper.vki, devHelper.physicalDevice, *surface));
const VkSurfaceCapabilitiesKHR capabilities(getPhysicalDeviceSurfaceCapabilities(instHelper.vki, devHelper.physicalDevice, *surface));
@@ -678,12 +679,12 @@
const InstanceHelper instHelper (context, params.wsiType, failingAllocator.getCallbacks());
const NativeObjects native (context, instHelper.supportedExtensions, params.wsiType);
const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki,
- *instHelper.instance,
+ instHelper.instance,
params.wsiType,
*native.display,
*native.window,
failingAllocator.getCallbacks()));
- const DeviceHelper devHelper (context, instHelper.vki, *instHelper.instance, *surface, failingAllocator.getCallbacks());
+ const DeviceHelper devHelper (context, instHelper.vki, instHelper.instance, *surface, failingAllocator.getCallbacks());
const vector<VkSwapchainCreateInfoKHR> allCases (generateSwapchainParameterCases(params.wsiType, params.dimension, instHelper.vki, devHelper.physicalDevice, *surface));
if (maxCases < allCases.size())
@@ -748,11 +749,11 @@
const InstanceHelper instHelper (context, wsiType, vector<string>(1, string("VK_KHR_device_group_creation")));
const NativeObjects native (context, instHelper.supportedExtensions, wsiType, tcu::just(desiredSize));
const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki,
- *instHelper.instance,
+ instHelper.instance,
wsiType,
*native.display,
*native.window));
- const DeviceHelper devHelper (context, instHelper.vki, *instHelper.instance, *surface);
+ const DeviceHelper devHelper (context, instHelper.vki, instHelper.instance, *surface);
const Extensions& deviceExtensions = enumerateDeviceExtensionProperties(instHelper.vki, devHelper.physicalDevice, DE_NULL);
// structures this tests checks were added in revision 69
@@ -1489,10 +1490,8 @@
DE_UNREF(deviceMask); // needed for compatibility with acquireNextImage2KHR
}
- bool featureAvailable(const deUint32 deviceVersion, const Extensions& supportedExtensions)
+ bool featureAvailable(Context&)
{
- DE_UNREF(deviceVersion);
- DE_UNREF(supportedExtensions);
return true; // needed for compatibility with acquireNextImage2KHR
}
@@ -1535,9 +1534,9 @@
m_info.deviceMask = deviceMask;
}
- bool featureAvailable(const deUint32 deviceVersion, const Extensions& supportedExtensions)
+ bool featureAvailable(Context& context)
{
- return isDeviceExtensionSupported(deviceVersion, supportedExtensions, RequiredExtension("VK_KHR_device_group"));
+ return context.isDeviceFunctionalitySupported("VK_KHR_device_group");
}
VkResult call(VkSemaphore semaphore, VkFence fence, deUint32* imageIndex)
@@ -1563,8 +1562,8 @@
const tcu::UVec2 desiredSize (256, 256);
const InstanceHelper instHelper (context, wsiType);
const NativeObjects native (context, instHelper.supportedExtensions, wsiType, tcu::just(desiredSize));
- const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
- const DeviceHelper devHelper (context, instHelper.vki, *instHelper.instance, *surface);
+ const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+ const DeviceHelper devHelper (context, instHelper.vki, instHelper.instance, *surface);
const DeviceInterface& vkd = devHelper.vkd;
const VkDevice device = *devHelper.device;
SimpleAllocator allocator (vkd, device, getPhysicalDeviceMemoryProperties(instHelper.vki, devHelper.physicalDevice));
@@ -1573,7 +1572,7 @@
const vector<VkImage> swapchainImages = getSwapchainImages(vkd, device, *swapchain);
AcquireWrapperType acquireImageWrapper(vkd, device, 1u, *swapchain, std::numeric_limits<deUint64>::max());
- if (!acquireImageWrapper.featureAvailable(context.getUsedApiVersion(), instHelper.supportedExtensions))
+ if (!acquireImageWrapper.featureAvailable(context))
TCU_THROW(NotSupportedError, "Required extension is not supported");
const TriangleRenderer renderer (vkd,
@@ -1680,7 +1679,7 @@
{
const InstanceHelper instHelper (context, wsiType, vector<string>(1, string("VK_KHR_device_group_creation")));
const tcu::CommandLine& cmdLine = context.getTestContext().getCommandLine();
- VkPhysicalDevice physicalDevice = chooseDevice(instHelper.vki, *instHelper.instance, cmdLine);
+ VkPhysicalDevice physicalDevice = chooseDevice(instHelper.vki, instHelper.instance, cmdLine);
const Extensions& supportedExtensions = enumerateDeviceExtensionProperties(instHelper.vki, physicalDevice, DE_NULL);
std::vector<const char*> deviceExtensions;
@@ -1696,11 +1695,11 @@
const tcu::UVec2 desiredSize (256, 256);
const NativeObjects native (context, instHelper.supportedExtensions, wsiType, tcu::just(desiredSize));
- const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
+ const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
const deUint32 devGroupIdx = cmdLine.getVKDeviceGroupId() - 1;
const deUint32 deviceIdx = context.getTestContext().getCommandLine().getVKDeviceId() - 1u;
- const vector<VkPhysicalDeviceGroupProperties> deviceGroupProps = enumeratePhysicalDeviceGroups(instHelper.vki, *instHelper.instance);
+ const vector<VkPhysicalDeviceGroupProperties> deviceGroupProps = enumeratePhysicalDeviceGroups(instHelper.vki, instHelper.instance);
deUint32 physicalDevicesInGroupCount = deviceGroupProps[devGroupIdx].physicalDeviceCount;
const VkPhysicalDevice* physicalDevicesInGroup = deviceGroupProps[devGroupIdx].physicalDevices;
deUint32 queueFamilyIndex = chooseQueueFamilyIndex(instHelper.vki, physicalDevicesInGroup[deviceIdx], *surface);
@@ -1726,7 +1725,8 @@
1u, // queueCount
&queuePriority, // pQueuePriorities
};
- const VkDeviceCreateInfo deviceCreateInfo =
+
+ const VkDeviceCreateInfo deviceCreateInfo =
{
VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, // sType
&groupDeviceInfo, // pNext
@@ -1739,8 +1739,9 @@
&deviceExtensions[0], // ppEnabledExtensionNames
DE_NULL, // pEnabledFeatures
};
- Move<VkDevice> groupDevice = createDevice(context.getPlatformInterface(), *instHelper.instance, instHelper.vki, physicalDevicesInGroup[deviceIdx], &deviceCreateInfo);
- const DeviceDriver vkd (context.getPlatformInterface(), *instHelper.instance, *groupDevice);
+
+ Move<VkDevice> groupDevice = createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), context.getPlatformInterface(), instHelper.instance, instHelper.vki, physicalDevicesInGroup[deviceIdx], &deviceCreateInfo);
+ const DeviceDriver vkd (context.getPlatformInterface(), instHelper.instance, *groupDevice);
VkQueue queue (getDeviceQueue(vkd, *groupDevice, queueFamilyIndex, 0));
SimpleAllocator allocator (vkd, *groupDevice, getPhysicalDeviceMemoryProperties(instHelper.vki, physicalDevicesInGroup[deviceIdx]));
@@ -1908,7 +1909,7 @@
{
const InstanceHelper instHelper (context, wsiType, vector<string>(1, string("VK_KHR_device_group_creation")));
const tcu::CommandLine& cmdLine = context.getTestContext().getCommandLine();
- VkPhysicalDevice physicalDevice = chooseDevice(instHelper.vki, *instHelper.instance, cmdLine);
+ VkPhysicalDevice physicalDevice = chooseDevice(instHelper.vki, instHelper.instance, cmdLine);
const Extensions& deviceExtensions = enumerateDeviceExtensionProperties(instHelper.vki, physicalDevice, DE_NULL);
// structures this tests checks were added in revision 69
@@ -1926,11 +1927,11 @@
const tcu::UVec2 desiredSize (256, 256);
const NativeObjects native (context, instHelper.supportedExtensions, wsiType, tcu::just(desiredSize));
- const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
+ const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
const deUint32 devGroupIdx = cmdLine.getVKDeviceGroupId() - 1;
const deUint32 deviceIdx = context.getTestContext().getCommandLine().getVKDeviceId() - 1u;
- const vector<VkPhysicalDeviceGroupProperties> deviceGroupProps = enumeratePhysicalDeviceGroups(instHelper.vki, *instHelper.instance);
+ const vector<VkPhysicalDeviceGroupProperties> deviceGroupProps = enumeratePhysicalDeviceGroups(instHelper.vki, instHelper.instance);
deUint32 physicalDevicesInGroupCount = deviceGroupProps[devGroupIdx].physicalDeviceCount;
const VkPhysicalDevice* physicalDevicesInGroup = deviceGroupProps[devGroupIdx].physicalDevices;
deUint32 queueFamilyIndex = chooseQueueFamilyIndex(instHelper.vki, physicalDevicesInGroup[deviceIdx], *surface);
@@ -1960,6 +1961,7 @@
1u, // queueCount
&queuePriority, // pQueuePriorities
};
+
const VkDeviceCreateInfo deviceCreateInfo =
{
VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, // sType
@@ -1973,8 +1975,9 @@
&requiredExtensions[0], // ppEnabledExtensionNames
DE_NULL, // pEnabledFeatures
};
- Move<VkDevice> groupDevice = createDevice(context.getPlatformInterface(), *instHelper.instance, instHelper.vki, physicalDevicesInGroup[deviceIdx], &deviceCreateInfo);
- const DeviceDriver vkd (context.getPlatformInterface(), *instHelper.instance, *groupDevice);
+
+ Move<VkDevice> groupDevice = createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), context.getPlatformInterface(), instHelper.instance, instHelper.vki, physicalDevicesInGroup[deviceIdx], &deviceCreateInfo);
+ const DeviceDriver vkd (context.getPlatformInterface(), instHelper.instance, *groupDevice);
VkQueue queue (getDeviceQueue(vkd, *groupDevice, queueFamilyIndex, 0));
SimpleAllocator allocator (vkd, *groupDevice, getPhysicalDeviceMemoryProperties(instHelper.vki, physicalDevicesInGroup[deviceIdx]));
@@ -2304,8 +2307,8 @@
const tcu::UVec2 desiredSize (256, 256);
const InstanceHelper instHelper (context, wsiType);
const NativeObjects native (context, instHelper.supportedExtensions, wsiType, tcu::just(desiredSize));
- const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
- const DeviceHelper devHelper (context, instHelper.vki, *instHelper.instance, *surface);
+ const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+ const DeviceHelper devHelper (context, instHelper.vki, instHelper.instance, *surface);
const PlatformProperties& platformProperties = getPlatformProperties(wsiType);
const VkSurfaceCapabilitiesKHR capabilities = getPhysicalDeviceSurfaceCapabilities(instHelper.vki, devHelper.physicalDevice, *surface);
const DeviceInterface& vkd = devHelper.vkd;
@@ -2442,8 +2445,8 @@
const tcu::UVec2 desiredSize (256, 256);
const InstanceHelper instHelper (context, wsiType);
const NativeObjects native (context, instHelper.supportedExtensions, wsiType, tcu::just(desiredSize));
- const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
- const DeviceHelper devHelper (context, instHelper.vki, *instHelper.instance, *surface);
+ const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+ const DeviceHelper devHelper (context, instHelper.vki, instHelper.instance, *surface);
const VkSwapchainCreateInfoKHR swapchainInfo = getBasicSwapchainParameters(wsiType, instHelper.vki, devHelper.physicalDevice, *surface, desiredSize, 2);
const Unique<VkSwapchainKHR> swapchain (createSwapchainKHR(devHelper.vkd, *devHelper.device, &swapchainInfo));
@@ -2466,8 +2469,8 @@
const tcu::UVec2 desiredSize(256, 256);
const InstanceHelper instHelper(context, wsiType);
const NativeObjects native(context, instHelper.supportedExtensions, wsiType, tcu::just(desiredSize));
- const Unique<VkSurfaceKHR> surface(createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
- const DeviceHelper devHelper(context, instHelper.vki, *instHelper.instance, *surface);
+ const Unique<VkSurfaceKHR> surface(createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+ const DeviceHelper devHelper(context, instHelper.vki, instHelper.instance, *surface);
const VkSwapchainCreateInfoKHR swapchainInfo = getBasicSwapchainParameters(wsiType, instHelper.vki, devHelper.physicalDevice, *surface, desiredSize, 2);
const Unique<VkSwapchainKHR> swapchain(createSwapchainKHR(devHelper.vkd, *devHelper.device, &swapchainInfo));
@@ -2495,8 +2498,8 @@
{
const InstanceHelper instHelper (context, wsiType);
const NativeObjects native (context, instHelper.supportedExtensions, wsiType);
- const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
- const DeviceHelper devHelper (context, instHelper.vki, *instHelper.instance, *surface);
+ const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+ const DeviceHelper devHelper (context, instHelper.vki, instHelper.instance, *surface);
const VkSwapchainKHR nullHandle = DE_NULL;
// Default allocator
diff --git a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrConversionTests.cpp b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrConversionTests.cpp
index a744f7b..821f4eb 100644
--- a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrConversionTests.cpp
+++ b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrConversionTests.cpp
@@ -577,7 +577,7 @@
void checkSupport (Context& context, const TestConfig config)
{
#if !defined(FAKE_COLOR_CONVERSION)
- if (!vk::isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_sampler_ycbcr_conversion"))
+ if (!context.isDeviceFunctionalitySupported("VK_KHR_sampler_ycbcr_conversion"))
TCU_THROW(NotSupportedError, "Extension VK_KHR_sampler_ycbcr_conversion not supported");
try
diff --git a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrFormatTests.cpp b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrFormatTests.cpp
index ac78252..3e8b885 100644
--- a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrFormatTests.cpp
+++ b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrFormatTests.cpp
@@ -23,6 +23,7 @@
#include "vktYCbCrFormatTests.hpp"
#include "vktTestCaseUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vktTestGroupUtil.hpp"
#include "vktShaderExecutor.hpp"
#include "vktYCbCrUtil.hpp"
@@ -294,7 +295,7 @@
if (params.useArrayLayers)
{
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_EXT_ycbcr_image_arrays"))
+ if (!context.isDeviceFunctionalitySupported("VK_EXT_ycbcr_image_arrays"))
TCU_THROW(NotSupportedError, "VK_EXT_ycbcr_image_arrays is not supported");
VkImageFormatProperties properties = getPhysicalDeviceImageFormatProperties(context.getInstanceInterface(), context.getPhysicalDevice(),
@@ -427,9 +428,8 @@
},
};
VkResult propsResult;
- const PlatformInterface& vkp = context.getPlatformInterface();
- const Unique<VkInstance> instance (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_get_physical_device_properties2"));
- const InstanceDriver vki (vkp, *instance);
+ const CustomInstance instance (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+ const InstanceDriver& vki (instance.getDriver());
// Verify that a yuv image consumes at least one descriptor
propsResult = vki.getPhysicalDeviceImageFormatProperties2(context.getPhysicalDevice(), &imageFormatInfo, &extProperties);
diff --git a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.cpp b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.cpp
index a5f3bf8..104c785 100644
--- a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.cpp
+++ b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.cpp
@@ -213,11 +213,8 @@
reqExts.push_back("VK_KHR_get_memory_requirements2");
}
- for (vector<string>::const_iterator extIter = reqExts.begin(); extIter != reqExts.end(); ++extIter)
- {
- if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), *extIter))
- TCU_THROW(NotSupportedError, (*extIter + " is not supported").c_str());
- }
+ for (const string& ext : reqExts)
+ context.requireDeviceFunctionality(ext);
if (features.samplerYcbcrConversion == VK_FALSE)
{
@@ -1322,39 +1319,7 @@
}
case vk::VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601:
- {
- const tcu::Interval y (rangeExpandLuma(range, conversionFormat[1], bitDepth[1], input[1]));
- const tcu::Interval cr (rangeExpandChroma(range, conversionFormat[0], bitDepth[0], input[0]));
- const tcu::Interval cb (rangeExpandChroma(range, conversionFormat[2], bitDepth[2], input[2]));
-
- const tcu::Interval yClamped (clampMaybe(y, 0.0, 1.0));
- const tcu::Interval crClamped (clampMaybe(cr, -0.5, 0.5));
- const tcu::Interval cbClamped (clampMaybe(cb, -0.5, 0.5));
-
- output[0] = conversionFormat[0].roundOut(yClamped + conversionFormat[0].roundOut(1.402 * crClamped, false), false);
- output[1] = conversionFormat[1].roundOut(conversionFormat[1].roundOut(yClamped - conversionFormat[1].roundOut((0.202008 / 0.587) * cbClamped, false), false) - conversionFormat[1].roundOut((0.419198 / 0.587) * crClamped, false), false);
- output[2] = conversionFormat[2].roundOut(yClamped + conversionFormat[2].roundOut(1.772 * cbClamped, false), false);
- output[3] = input[3];
- break;
- }
-
case vk::VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709:
- {
- const tcu::Interval y (rangeExpandLuma(range, conversionFormat[1], bitDepth[1], input[1]));
- const tcu::Interval cr (rangeExpandChroma(range, conversionFormat[0], bitDepth[0], input[0]));
- const tcu::Interval cb (rangeExpandChroma(range, conversionFormat[2], bitDepth[2], input[2]));
-
- const tcu::Interval yClamped (clampMaybe(y, 0.0, 1.0));
- const tcu::Interval crClamped (clampMaybe(cr, -0.5, 0.5));
- const tcu::Interval cbClamped (clampMaybe(cb, -0.5, 0.5));
-
- output[0] = conversionFormat[0].roundOut(yClamped + conversionFormat[0].roundOut(1.5748 * crClamped, false), false);
- output[1] = conversionFormat[1].roundOut(conversionFormat[1].roundOut(yClamped - conversionFormat[1].roundOut((0.13397432 / 0.7152) * cbClamped, false), false) - conversionFormat[1].roundOut((0.33480248 / 0.7152) * crClamped, false), false);
- output[2] = conversionFormat[2].roundOut(yClamped + conversionFormat[2].roundOut(1.8556 * cbClamped, false), false);
- output[3] = input[3];
- break;
- }
-
case vk::VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020:
{
const tcu::Interval y (rangeExpandLuma(range, conversionFormat[1], bitDepth[1], input[1]));
@@ -1365,9 +1330,24 @@
const tcu::Interval crClamped (clampMaybe(cr, -0.5, 0.5));
const tcu::Interval cbClamped (clampMaybe(cb, -0.5, 0.5));
- output[0] = conversionFormat[0].roundOut(yClamped + conversionFormat[0].roundOut(1.4746 * crClamped, false), false);
- output[1] = conversionFormat[1].roundOut(conversionFormat[1].roundOut(yClamped - conversionFormat[1].roundOut(conversionFormat[1].roundOut(0.11156702 / 0.6780, false) * cbClamped, false), false) - conversionFormat[1].roundOut(conversionFormat[1].roundOut(0.38737742 / 0.6780, false) * crClamped, false), false);
- output[2] = conversionFormat[2].roundOut(yClamped + conversionFormat[2].roundOut(1.8814 * cbClamped, false), false);
+ if (colorModel == vk::VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601)
+ {
+ output[0] = conversionFormat[0].roundOut(yClamped + conversionFormat[0].roundOut(1.402 * crClamped, false), false);
+ output[1] = conversionFormat[1].roundOut(conversionFormat[1].roundOut(yClamped - conversionFormat[1].roundOut((0.202008 / 0.587) * cbClamped, false), false) - conversionFormat[1].roundOut((0.419198 / 0.587) * crClamped, false), false);
+ output[2] = conversionFormat[2].roundOut(yClamped + conversionFormat[2].roundOut(1.772 * cbClamped, false), false);
+ }
+ else if (colorModel == vk::VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709)
+ {
+ output[0] = conversionFormat[0].roundOut(yClamped + conversionFormat[0].roundOut(1.5748 * crClamped, false), false);
+ output[1] = conversionFormat[1].roundOut(conversionFormat[1].roundOut(yClamped - conversionFormat[1].roundOut((0.13397432 / 0.7152) * cbClamped, false), false) - conversionFormat[1].roundOut((0.33480248 / 0.7152) * crClamped, false), false);
+ output[2] = conversionFormat[2].roundOut(yClamped + conversionFormat[2].roundOut(1.8556 * cbClamped, false), false);
+ }
+ else
+ {
+ output[0] = conversionFormat[0].roundOut(yClamped + conversionFormat[0].roundOut(1.4746 * crClamped, false), false);
+ output[1] = conversionFormat[1].roundOut(conversionFormat[1].roundOut(yClamped - conversionFormat[1].roundOut(conversionFormat[1].roundOut(0.11156702 / 0.6780, false) * cbClamped, false), false) - conversionFormat[1].roundOut(conversionFormat[1].roundOut(0.38737742 / 0.6780, false) * crClamped, false), false);
+ output[2] = conversionFormat[2].roundOut(yClamped + conversionFormat[2].roundOut(1.8814 * cbClamped, false), false);
+ }
output[3] = input[3];
break;
}
@@ -1430,6 +1410,15 @@
return tcu::IVec2(deFloorToInt32(ij.lo()), deFloorToInt32(ij.hi()));
}
+tcu::IVec2 calculateIJRange (vk::VkFilter filter,
+ const tcu::FloatFormat& coordFormat,
+ const tcu::Interval& uv)
+{
+ DE_ASSERT(filter == vk::VK_FILTER_NEAREST || filter == vk::VK_FILTER_LINEAR);
+ return (filter == vk::VK_FILTER_LINEAR) ? calculateLinearIJRange(coordFormat, uv)
+ : calculateNearestIJRange(coordFormat, uv);
+}
+
tcu::Interval calculateAB (const deUint32 subTexelPrecisionBits,
const tcu::Interval& uv,
int ij)
@@ -1516,42 +1505,16 @@
int i,
int j)
{
- const int subI = divFloor(i, 2);
+ const int subI = offset == vk::VK_CHROMA_LOCATION_COSITED_EVEN
+ ? divFloor(i, 2)
+ : (i % 2 == 0 ? divFloor(i, 2) - 1 : divFloor(i, 2));
+ const double a = offset == vk::VK_CHROMA_LOCATION_COSITED_EVEN
+ ? (i % 2 == 0 ? 0.0 : 0.5)
+ : (i % 2 == 0 ? 0.25 : 0.75);
- if (offset == vk::VK_CHROMA_LOCATION_COSITED_EVEN)
- {
- if (i % 2 == 0)
- return lookupWrapped(access, conversionFormat, addressModeU, addressModeV, tcu::IVec2(subI, j));
- else
- {
- const tcu::Interval a (filteringFormat.roundOut(0.5 * lookupWrapped(access, conversionFormat, addressModeU, addressModeV, tcu::IVec2(subI, j)), false));
- const tcu::Interval b (filteringFormat.roundOut(0.5 * lookupWrapped(access, conversionFormat, addressModeU, addressModeV, tcu::IVec2(subI + 1, j)), false));
-
- return filteringFormat.roundOut(a + b, false);
- }
- }
- else if (offset == vk::VK_CHROMA_LOCATION_MIDPOINT)
- {
- if (i % 2 == 0)
- {
- const tcu::Interval a (filteringFormat.roundOut(0.25 * lookupWrapped(access, conversionFormat, addressModeU, addressModeV, tcu::IVec2(subI - 1, j)), false));
- const tcu::Interval b (filteringFormat.roundOut(0.75 * lookupWrapped(access, conversionFormat, addressModeU, addressModeV, tcu::IVec2(subI, j)), false));
-
- return filteringFormat.roundOut(a + b, false);
- }
- else
- {
- const tcu::Interval a (filteringFormat.roundOut(0.25 * lookupWrapped(access, conversionFormat, addressModeU, addressModeV, tcu::IVec2(subI + 1, j)), false));
- const tcu::Interval b (filteringFormat.roundOut(0.75 * lookupWrapped(access, conversionFormat, addressModeU, addressModeV, tcu::IVec2(subI, j)), false));
-
- return filteringFormat.roundOut(a + b, false);
- }
- }
- else
- {
- DE_FATAL("Unknown sample location");
- return tcu::Interval();
- }
+ const tcu::Interval A (filteringFormat.roundOut( a * lookupWrapped(access, conversionFormat, addressModeU, addressModeV, tcu::IVec2(subI, j)), false));
+ const tcu::Interval B (filteringFormat.roundOut((1.0 - a) * lookupWrapped(access, conversionFormat, addressModeU, addressModeV, tcu::IVec2(subI + 1, j)), false));
+ return filteringFormat.roundOut(A + B, false);
}
tcu::Interval reconstructLinearXYChromaSample (const tcu::FloatFormat& filteringFormat,
@@ -1578,11 +1541,7 @@
? (j % 2 == 0 ? 0.0 : 0.5)
: (j % 2 == 0 ? 0.25 : 0.75);
- return linearInterpolate(filteringFormat, a, b,
- lookupWrapped(access, conversionFormat, addressModeU, addressModeV, tcu::IVec2(subI, subJ)),
- lookupWrapped(access, conversionFormat, addressModeU, addressModeV, tcu::IVec2(subI + 1, subJ)),
- lookupWrapped(access, conversionFormat, addressModeU, addressModeV, tcu::IVec2(subI, subJ + 1)),
- lookupWrapped(access, conversionFormat, addressModeU, addressModeV, tcu::IVec2(subI + 1, subJ + 1)));
+ return linearSample(access, conversionFormat, filteringFormat, addressModeU, addressModeV, tcu::IVec2(subI, subJ), a, b);
}
const ChannelAccess& swizzle (vk::VkComponentSwizzle swizzle,
@@ -1695,6 +1654,11 @@
DE_ASSERT(rAccess.getSize().x() == gAccess.getSize().x() || 2 * rAccess.getSize().x() == gAccess.getSize().x());
DE_ASSERT(rAccess.getSize().y() == gAccess.getSize().y() || 2 * rAccess.getSize().y() == gAccess.getSize().y());
+ DE_ASSERT(filter == vk::VK_FILTER_NEAREST || filter == vk::VK_FILTER_LINEAR);
+ DE_ASSERT(chromaFilter == vk::VK_FILTER_NEAREST || chromaFilter == vk::VK_FILTER_LINEAR);
+ DE_ASSERT(subsampledX || !subsampledY);
+
+
for (size_t ndx = 0; ndx < sts.size(); ndx++)
{
const Vec2 st (sts[ndx]);
@@ -1709,160 +1673,53 @@
uvBounds[ndx][2] = (float)v.lo();
uvBounds[ndx][3] = (float)v.hi();
- if (filter == vk::VK_FILTER_NEAREST)
+ const IVec2 iRange (calculateIJRange(filter, coordFormat, u));
+ const IVec2 jRange (calculateIJRange(filter, coordFormat, v));
+
+ ijBounds[ndx][0] = iRange[0];
+ ijBounds[ndx][1] = iRange[1];
+
+ ijBounds[ndx][2] = jRange[0];
+ ijBounds[ndx][3] = jRange[1];
+
+ for (int j = jRange.x(); j <= jRange.y(); j++)
+ for (int i = iRange.x(); i <= iRange.y(); i++)
{
- const IVec2 iRange (calculateNearestIJRange(coordFormat, u));
- const IVec2 jRange (calculateNearestIJRange(coordFormat, v));
-
- ijBounds[ndx][0] = iRange[0];
- ijBounds[ndx][1] = iRange[1];
-
- ijBounds[ndx][2] = jRange[0];
- ijBounds[ndx][3] = jRange[1];
-
- for (int j = jRange.x(); j <= jRange.y(); j++)
- for (int i = iRange.x(); i <= iRange.y(); i++)
+ if (filter == vk::VK_FILTER_NEAREST)
{
const Interval gValue (lookupWrapped(gAccess, conversionFormat[1], addressModeU, addressModeV, IVec2(i, j)));
const Interval aValue (lookupWrapped(aAccess, conversionFormat[3], addressModeU, addressModeV, IVec2(i, j)));
- if (subsampledX || subsampledY)
+ if (explicitReconstruction || !(subsampledX || subsampledY))
{
- if (explicitReconstruction)
+ Interval rValue, bValue;
+ if (chromaFilter == vk::VK_FILTER_NEAREST || !subsampledX)
{
- if (chromaFilter == vk::VK_FILTER_NEAREST)
+ // Reconstruct using nearest if needed, otherwise, just take what's already there.
+ const int subI = subsampledX ? i / 2 : i;
+ const int subJ = subsampledY ? j / 2 : j;
+ rValue = lookupWrapped(rAccess, conversionFormat[0], addressModeU, addressModeV, IVec2(subI, subJ));
+ bValue = lookupWrapped(bAccess, conversionFormat[2], addressModeU, addressModeV, IVec2(subI, subJ));
+ }
+ else // vk::VK_FILTER_LINEAR
+ {
+ if (subsampledY)
{
- // Nearest, Reconstructed chroma with explicit nearest filtering
- const int subI = subsampledX ? i / 2 : i;
- const int subJ = subsampledY ? j / 2 : j;
- const Interval srcColor[] =
- {
- lookupWrapped(rAccess, conversionFormat[0], addressModeU, addressModeV, IVec2(subI, subJ)),
- gValue,
- lookupWrapped(bAccess, conversionFormat[2], addressModeU, addressModeV, IVec2(subI, subJ)),
- aValue
- };
- Interval dstColor[4];
-
- convertColor(colorModel, range, conversionFormat, bitDepth, srcColor, dstColor);
-
- for (size_t compNdx = 0; compNdx < 4; compNdx++)
- bounds[compNdx] |= highp.roundOut(dstColor[compNdx], false);
- }
- else if (chromaFilter == vk::VK_FILTER_LINEAR)
- {
- if (subsampledX && subsampledY)
- {
- // Nearest, Reconstructed both chroma samples with explicit linear filtering
- const Interval rValue (reconstructLinearXYChromaSample(filteringFormat[0], conversionFormat[0], xChromaOffset, yChromaOffset, addressModeU, addressModeV, rAccess, i, j));
- const Interval bValue (reconstructLinearXYChromaSample(filteringFormat[2], conversionFormat[2], xChromaOffset, yChromaOffset, addressModeU, addressModeV, bAccess, i, j));
- const Interval srcColor[] =
- {
- rValue,
- gValue,
- bValue,
- aValue
- };
- Interval dstColor[4];
-
- convertColor(colorModel, range, conversionFormat, bitDepth, srcColor, dstColor);
-
- for (size_t compNdx = 0; compNdx < 4; compNdx++)
- bounds[compNdx] |= highp.roundOut(dstColor[compNdx], false);
- }
- else if (subsampledX)
- {
- // Nearest, Reconstructed x chroma samples with explicit linear filtering
- const Interval rValue (reconstructLinearXChromaSample(filteringFormat[0], conversionFormat[0], xChromaOffset, addressModeU, addressModeV, rAccess, i, j));
- const Interval bValue (reconstructLinearXChromaSample(filteringFormat[2], conversionFormat[2], xChromaOffset, addressModeU, addressModeV, bAccess, i, j));
- const Interval srcColor[] =
- {
- rValue,
- gValue,
- bValue,
- aValue
- };
- Interval dstColor[4];
-
- convertColor(colorModel, range, conversionFormat, bitDepth, srcColor, dstColor);
-
- for (size_t compNdx = 0; compNdx < 4; compNdx++)
- bounds[compNdx] |= highp.roundOut(dstColor[compNdx], false);
- }
- else
- DE_FATAL("Unexpected chroma reconstruction");
+ rValue = reconstructLinearXYChromaSample(filteringFormat[0], conversionFormat[0], xChromaOffset, yChromaOffset, addressModeU, addressModeV, rAccess, i, j);
+ bValue = reconstructLinearXYChromaSample(filteringFormat[2], conversionFormat[2], xChromaOffset, yChromaOffset, addressModeU, addressModeV, bAccess, i, j);
}
else
- DE_FATAL("Unknown filter");
- }
- else
- {
- const Interval chromaU (subsampledX ? calculateImplicitChromaUV(coordFormat, xChromaOffset, u) : u);
- const Interval chromaV (subsampledY ? calculateImplicitChromaUV(coordFormat, yChromaOffset, v) : v);
-
- if (chromaFilter == vk::VK_FILTER_NEAREST)
{
- // Nearest, reconstructed chroma samples with implicit nearest filtering
- const IVec2 chromaIRange (subsampledX ? calculateNearestIJRange(coordFormat, chromaU) : IVec2(i, i));
- const IVec2 chromaJRange (subsampledY ? calculateNearestIJRange(coordFormat, chromaV) : IVec2(j, j));
-
- for (int chromaJ = chromaJRange.x(); chromaJ <= chromaJRange.y(); chromaJ++)
- for (int chromaI = chromaIRange.x(); chromaI <= chromaIRange.y(); chromaI++)
- {
- const Interval srcColor[] =
- {
- lookupWrapped(rAccess, conversionFormat[0], addressModeU, addressModeV, IVec2(chromaI, chromaJ)),
- gValue,
- lookupWrapped(bAccess, conversionFormat[2], addressModeU, addressModeV, IVec2(chromaI, chromaJ)),
- aValue
- };
- Interval dstColor[4];
-
- convertColor(colorModel, range, conversionFormat, bitDepth, srcColor, dstColor);
-
- for (size_t compNdx = 0; compNdx < 4; compNdx++)
- bounds[compNdx] |= highp.roundOut(dstColor[compNdx], false);
- }
+ rValue = reconstructLinearXChromaSample(filteringFormat[0], conversionFormat[0], xChromaOffset, addressModeU, addressModeV, rAccess, i, j);
+ bValue = reconstructLinearXChromaSample(filteringFormat[2], conversionFormat[2], xChromaOffset, addressModeU, addressModeV, bAccess, i, j);
}
- else if (chromaFilter == vk::VK_FILTER_LINEAR)
- {
- // Nearest, reconstructed chroma samples with implicit linear filtering
- const IVec2 chromaIRange (subsampledX ? calculateLinearIJRange(coordFormat, chromaU) : IVec2(i, i));
- const IVec2 chromaJRange (subsampledY ? calculateLinearIJRange(coordFormat, chromaV) : IVec2(j, j));
-
- for (int chromaJ = chromaJRange.x(); chromaJ <= chromaJRange.y(); chromaJ++)
- for (int chromaI = chromaIRange.x(); chromaI <= chromaIRange.y(); chromaI++)
- {
- const Interval chromaA (calculateAB(subTexelPrecisionBits, chromaU, chromaI));
- const Interval chromaB (calculateAB(subTexelPrecisionBits, chromaV, chromaJ));
-
- const Interval srcColor[] =
- {
- linearSample(rAccess, conversionFormat[0], filteringFormat[0], addressModeU, addressModeV, IVec2(chromaI, chromaJ), chromaA, chromaB),
- gValue,
- linearSample(bAccess, conversionFormat[2], filteringFormat[2], addressModeU, addressModeV, IVec2(chromaI, chromaJ), chromaA, chromaB),
- aValue
- };
- Interval dstColor[4];
-
- convertColor(colorModel, range, conversionFormat, bitDepth, srcColor, dstColor);
-
- for (size_t compNdx = 0; compNdx < 4; compNdx++)
- bounds[compNdx] |= highp.roundOut(dstColor[compNdx], false);
- }
- }
- else
- DE_FATAL("Unknown filter");
}
- }
- else
- {
- // Linear, no chroma subsampling
- const Interval srcColor[] =
+
+ const Interval srcColor[] =
{
- lookupWrapped(rAccess, conversionFormat[0], addressModeU, addressModeV, IVec2(i, j)),
+ rValue,
gValue,
- lookupWrapped(bAccess, conversionFormat[2], addressModeU, addressModeV, IVec2(i, j)),
+ bValue,
aValue
};
Interval dstColor[4];
@@ -1872,21 +1729,51 @@
for (size_t compNdx = 0; compNdx < 4; compNdx++)
bounds[compNdx] |= highp.roundOut(dstColor[compNdx], false);
}
+ else
+ {
+ const Interval chromaU (subsampledX ? calculateImplicitChromaUV(coordFormat, xChromaOffset, u) : u);
+ const Interval chromaV (subsampledY ? calculateImplicitChromaUV(coordFormat, yChromaOffset, v) : v);
+
+ // Reconstructed chroma samples with implicit filtering
+ const IVec2 chromaIRange (subsampledX ? calculateIJRange(chromaFilter, coordFormat, chromaU) : IVec2(i, i));
+ const IVec2 chromaJRange (subsampledY ? calculateIJRange(chromaFilter, coordFormat, chromaV) : IVec2(j, j));
+
+ for (int chromaJ = chromaJRange.x(); chromaJ <= chromaJRange.y(); chromaJ++)
+ for (int chromaI = chromaIRange.x(); chromaI <= chromaIRange.y(); chromaI++)
+ {
+ Interval rValue, bValue;
+
+ if (chromaFilter == vk::VK_FILTER_NEAREST)
+ {
+ rValue = lookupWrapped(rAccess, conversionFormat[0], addressModeU, addressModeV, IVec2(chromaI, chromaJ));
+ bValue = lookupWrapped(bAccess, conversionFormat[2], addressModeU, addressModeV, IVec2(chromaI, chromaJ));
+ }
+ else // vk::VK_FILTER_LINEAR
+ {
+ const Interval chromaA (calculateAB(subTexelPrecisionBits, chromaU, chromaI));
+ const Interval chromaB (calculateAB(subTexelPrecisionBits, chromaV, chromaJ));
+
+ rValue = linearSample(rAccess, conversionFormat[0], filteringFormat[0], addressModeU, addressModeV, IVec2(chromaI, chromaJ), chromaA, chromaB);
+ bValue = linearSample(bAccess, conversionFormat[2], filteringFormat[2], addressModeU, addressModeV, IVec2(chromaI, chromaJ), chromaA, chromaB);
+ }
+
+ const Interval srcColor[] =
+ {
+ rValue,
+ gValue,
+ bValue,
+ aValue
+ };
+
+ Interval dstColor[4];
+ convertColor(colorModel, range, conversionFormat, bitDepth, srcColor, dstColor);
+
+ for (size_t compNdx = 0; compNdx < 4; compNdx++)
+ bounds[compNdx] |= highp.roundOut(dstColor[compNdx], false);
+ }
+ }
}
- }
- else if (filter == vk::VK_FILTER_LINEAR)
- {
- const IVec2 iRange (calculateLinearIJRange(coordFormat, u));
- const IVec2 jRange (calculateLinearIJRange(coordFormat, v));
-
- ijBounds[ndx][0] = iRange[0];
- ijBounds[ndx][1] = iRange[1];
-
- ijBounds[ndx][2] = jRange[0];
- ijBounds[ndx][3] = jRange[1];
-
- for (int j = jRange.x(); j <= jRange.y(); j++)
- for (int i = iRange.x(); i <= iRange.y(); i++)
+ else // filter == vk::VK_FILTER_LINEAR
{
const Interval lumaA (calculateAB(subTexelPrecisionBits, u, i));
const Interval lumaB (calculateAB(subTexelPrecisionBits, v, j));
@@ -1894,163 +1781,54 @@
const Interval gValue (linearSample(gAccess, conversionFormat[1], filteringFormat[1], addressModeU, addressModeV, IVec2(i, j), lumaA, lumaB));
const Interval aValue (linearSample(aAccess, conversionFormat[3], filteringFormat[3], addressModeU, addressModeV, IVec2(i, j), lumaA, lumaB));
- if (subsampledX || subsampledY)
+ if (explicitReconstruction || !(subsampledX || subsampledY))
{
- if (explicitReconstruction)
+ Interval rValue, bValue;
+ if (chromaFilter == vk::VK_FILTER_NEAREST || !subsampledX)
{
- if (chromaFilter == vk::VK_FILTER_NEAREST)
+ rValue = linearInterpolate(filteringFormat[0], lumaA, lumaB,
+ lookupWrapped(rAccess, conversionFormat[0], addressModeU, addressModeV, IVec2(i / (subsampledX ? 2 : 1), j / (subsampledY ? 2 : 1))),
+ lookupWrapped(rAccess, conversionFormat[0], addressModeU, addressModeV, IVec2((i + 1) / (subsampledX ? 2 : 1), j / (subsampledY ? 2 : 1))),
+ lookupWrapped(rAccess, conversionFormat[0], addressModeU, addressModeV, IVec2(i / (subsampledX ? 2 : 1), (j + 1) / (subsampledY ? 2 : 1))),
+ lookupWrapped(rAccess, conversionFormat[0], addressModeU, addressModeV, IVec2((i + 1) / (subsampledX ? 2 : 1), (j + 1) / (subsampledY ? 2 : 1))));
+ bValue = linearInterpolate(filteringFormat[2], lumaA, lumaB,
+ lookupWrapped(bAccess, conversionFormat[2], addressModeU, addressModeV, IVec2(i / (subsampledX ? 2 : 1), j / (subsampledY ? 2 : 1))),
+ lookupWrapped(bAccess, conversionFormat[2], addressModeU, addressModeV, IVec2((i + 1) / (subsampledX ? 2 : 1), j / (subsampledY ? 2 : 1))),
+ lookupWrapped(bAccess, conversionFormat[2], addressModeU, addressModeV, IVec2(i / (subsampledX ? 2 : 1), (j + 1) / (subsampledY ? 2 : 1))),
+ lookupWrapped(bAccess, conversionFormat[2], addressModeU, addressModeV, IVec2((i + 1) / (subsampledX ? 2 : 1), (j + 1) / (subsampledY ? 2 : 1))));
+ }
+ else // vk::VK_FILTER_LINEAR
+ {
+ if (subsampledY)
{
- const Interval srcColor[] =
- {
- linearInterpolate(filteringFormat[0], lumaA, lumaB,
- lookupWrapped(rAccess, conversionFormat[0], addressModeU, addressModeV, IVec2(i / (subsampledX ? 2 : 1), j / (subsampledY ? 2 : 1))),
- lookupWrapped(rAccess, conversionFormat[0], addressModeU, addressModeV, IVec2((i + 1) / (subsampledX ? 2 : 1), j / (subsampledY ? 2 : 1))),
- lookupWrapped(rAccess, conversionFormat[0], addressModeU, addressModeV, IVec2(i / (subsampledX ? 2 : 1), (j + 1) / (subsampledY ? 2 : 1))),
- lookupWrapped(rAccess, conversionFormat[0], addressModeU, addressModeV, IVec2((i + 1) / (subsampledX ? 2 : 1), (j + 1) / (subsampledY ? 2 : 1)))),
- gValue,
- linearInterpolate(filteringFormat[2], lumaA, lumaB,
- lookupWrapped(bAccess, conversionFormat[2], addressModeU, addressModeV, IVec2(i / (subsampledX ? 2 : 1), j / (subsampledY ? 2 : 1))),
- lookupWrapped(bAccess, conversionFormat[2], addressModeU, addressModeV, IVec2((i + 1) / (subsampledX ? 2 : 1), j / (subsampledY ? 2 : 1))),
- lookupWrapped(bAccess, conversionFormat[2], addressModeU, addressModeV, IVec2(i / (subsampledX ? 2 : 1), (j + 1) / (subsampledY ? 2 : 1))),
- lookupWrapped(bAccess, conversionFormat[2], addressModeU, addressModeV, IVec2((i + 1) / (subsampledX ? 2 : 1), (j + 1) / (subsampledY ? 2 : 1)))),
- aValue
- };
- Interval dstColor[4];
-
- convertColor(colorModel, range, conversionFormat, bitDepth, srcColor, dstColor);
-
- for (size_t compNdx = 0; compNdx < 4; compNdx++)
- bounds[compNdx] |= highp.roundOut(dstColor[compNdx], false);
- }
- else if (chromaFilter == vk::VK_FILTER_LINEAR)
- {
- if (subsampledX && subsampledY)
- {
- // Linear, Reconstructed xx chroma samples with explicit linear filtering
- const Interval rValue (linearInterpolate(filteringFormat[0], lumaA, lumaB,
- reconstructLinearXYChromaSample(filteringFormat[0], conversionFormat[0], xChromaOffset, yChromaOffset, addressModeU, addressModeV, rAccess, i, j),
- reconstructLinearXYChromaSample(filteringFormat[0], conversionFormat[0], xChromaOffset, yChromaOffset, addressModeU, addressModeV, rAccess, i + 1, j),
- reconstructLinearXYChromaSample(filteringFormat[0], conversionFormat[0], xChromaOffset, yChromaOffset, addressModeU, addressModeV, rAccess, i , j + 1),
- reconstructLinearXYChromaSample(filteringFormat[0], conversionFormat[0], xChromaOffset, yChromaOffset, addressModeU, addressModeV, rAccess, i + 1, j + 1)));
- const Interval bValue (linearInterpolate(filteringFormat[2], lumaA, lumaB,
- reconstructLinearXYChromaSample(filteringFormat[2], conversionFormat[2], xChromaOffset, yChromaOffset, addressModeU, addressModeV, bAccess, i, j),
- reconstructLinearXYChromaSample(filteringFormat[2], conversionFormat[2], xChromaOffset, yChromaOffset, addressModeU, addressModeV, bAccess, i + 1, j),
- reconstructLinearXYChromaSample(filteringFormat[2], conversionFormat[2], xChromaOffset, yChromaOffset, addressModeU, addressModeV, bAccess, i , j + 1),
- reconstructLinearXYChromaSample(filteringFormat[2], conversionFormat[2], xChromaOffset, yChromaOffset, addressModeU, addressModeV, bAccess, i + 1, j + 1)));
- const Interval srcColor[] =
- {
- rValue,
- gValue,
- bValue,
- aValue
- };
- Interval dstColor[4];
-
- convertColor(colorModel, range, conversionFormat, bitDepth, srcColor, dstColor);
-
- for (size_t compNdx = 0; compNdx < 4; compNdx++)
- bounds[compNdx] |= highp.roundOut(dstColor[compNdx], false);
-
- }
- else if (subsampledX)
- {
- // Linear, Reconstructed x chroma samples with explicit linear filtering
- const Interval rValue (linearInterpolate(filteringFormat[0], lumaA, lumaB,
- reconstructLinearXChromaSample(filteringFormat[0], conversionFormat[0], xChromaOffset, addressModeU, addressModeV, rAccess, i, j),
- reconstructLinearXChromaSample(filteringFormat[0], conversionFormat[0], xChromaOffset, addressModeU, addressModeV, rAccess, i + 1, j),
- reconstructLinearXChromaSample(filteringFormat[0], conversionFormat[0], xChromaOffset, addressModeU, addressModeV, rAccess, i , j + 1),
- reconstructLinearXChromaSample(filteringFormat[0], conversionFormat[0], xChromaOffset, addressModeU, addressModeV, rAccess, i + 1, j + 1)));
- const Interval bValue (linearInterpolate(filteringFormat[2], lumaA, lumaB,
- reconstructLinearXChromaSample(filteringFormat[2], conversionFormat[2], xChromaOffset, addressModeU, addressModeV, bAccess, i, j),
- reconstructLinearXChromaSample(filteringFormat[2], conversionFormat[2], xChromaOffset, addressModeU, addressModeV, bAccess, i + 1, j),
- reconstructLinearXChromaSample(filteringFormat[2], conversionFormat[2], xChromaOffset, addressModeU, addressModeV, bAccess, i , j + 1),
- reconstructLinearXChromaSample(filteringFormat[2], conversionFormat[2], xChromaOffset, addressModeU, addressModeV, bAccess, i + 1, j + 1)));
- const Interval srcColor[] =
- {
- rValue,
- gValue,
- bValue,
- aValue
- };
- Interval dstColor[4];
-
- convertColor(colorModel, range, conversionFormat, bitDepth, srcColor, dstColor);
-
- for (size_t compNdx = 0; compNdx < 4; compNdx++)
- bounds[compNdx] |= highp.roundOut(dstColor[compNdx], false);
- }
- else
- DE_FATAL("Unknown subsampling config");
+ // Linear, Reconstructed xx chroma samples with explicit linear filtering
+ rValue = linearInterpolate(filteringFormat[0], lumaA, lumaB,
+ reconstructLinearXYChromaSample(filteringFormat[0], conversionFormat[0], xChromaOffset, yChromaOffset, addressModeU, addressModeV, rAccess, i, j),
+ reconstructLinearXYChromaSample(filteringFormat[0], conversionFormat[0], xChromaOffset, yChromaOffset, addressModeU, addressModeV, rAccess, i + 1, j),
+ reconstructLinearXYChromaSample(filteringFormat[0], conversionFormat[0], xChromaOffset, yChromaOffset, addressModeU, addressModeV, rAccess, i , j + 1),
+ reconstructLinearXYChromaSample(filteringFormat[0], conversionFormat[0], xChromaOffset, yChromaOffset, addressModeU, addressModeV, rAccess, i + 1, j + 1));
+ bValue = linearInterpolate(filteringFormat[2], lumaA, lumaB,
+ reconstructLinearXYChromaSample(filteringFormat[2], conversionFormat[2], xChromaOffset, yChromaOffset, addressModeU, addressModeV, bAccess, i, j),
+ reconstructLinearXYChromaSample(filteringFormat[2], conversionFormat[2], xChromaOffset, yChromaOffset, addressModeU, addressModeV, bAccess, i + 1, j),
+ reconstructLinearXYChromaSample(filteringFormat[2], conversionFormat[2], xChromaOffset, yChromaOffset, addressModeU, addressModeV, bAccess, i , j + 1),
+ reconstructLinearXYChromaSample(filteringFormat[2], conversionFormat[2], xChromaOffset, yChromaOffset, addressModeU, addressModeV, bAccess, i + 1, j + 1));
}
else
- DE_FATAL("Unknown chroma filter");
- }
- else
- {
- const Interval chromaU (subsampledX ? calculateImplicitChromaUV(coordFormat, xChromaOffset, u) : u);
- const Interval chromaV (subsampledY ? calculateImplicitChromaUV(coordFormat, yChromaOffset, v) : v);
-
- if (chromaFilter == vk::VK_FILTER_NEAREST)
{
- const IVec2 chromaIRange (calculateNearestIJRange(coordFormat, chromaU));
- const IVec2 chromaJRange (calculateNearestIJRange(coordFormat, chromaV));
-
- for (int chromaJ = chromaJRange.x(); chromaJ <= chromaJRange.y(); chromaJ++)
- for (int chromaI = chromaIRange.x(); chromaI <= chromaIRange.y(); chromaI++)
- {
- const Interval srcColor[] =
- {
- lookupWrapped(rAccess, conversionFormat[1], addressModeU, addressModeV, IVec2(chromaI, chromaJ)),
- gValue,
- lookupWrapped(bAccess, conversionFormat[3], addressModeU, addressModeV, IVec2(chromaI, chromaJ)),
- aValue
- };
- Interval dstColor[4];
-
- convertColor(colorModel, range, conversionFormat, bitDepth, srcColor, dstColor);
-
- for (size_t compNdx = 0; compNdx < 4; compNdx++)
- bounds[compNdx] |= highp.roundOut(dstColor[compNdx], false);
- }
+ // Linear, Reconstructed x chroma samples with explicit linear filtering
+ rValue = linearInterpolate(filteringFormat[0], lumaA, lumaB,
+ reconstructLinearXChromaSample(filteringFormat[0], conversionFormat[0], xChromaOffset, addressModeU, addressModeV, rAccess, i, j),
+ reconstructLinearXChromaSample(filteringFormat[0], conversionFormat[0], xChromaOffset, addressModeU, addressModeV, rAccess, i + 1, j),
+ reconstructLinearXChromaSample(filteringFormat[0], conversionFormat[0], xChromaOffset, addressModeU, addressModeV, rAccess, i , j + 1),
+ reconstructLinearXChromaSample(filteringFormat[0], conversionFormat[0], xChromaOffset, addressModeU, addressModeV, rAccess, i + 1, j + 1));
+ bValue = linearInterpolate(filteringFormat[2], lumaA, lumaB,
+ reconstructLinearXChromaSample(filteringFormat[2], conversionFormat[2], xChromaOffset, addressModeU, addressModeV, bAccess, i, j),
+ reconstructLinearXChromaSample(filteringFormat[2], conversionFormat[2], xChromaOffset, addressModeU, addressModeV, bAccess, i + 1, j),
+ reconstructLinearXChromaSample(filteringFormat[2], conversionFormat[2], xChromaOffset, addressModeU, addressModeV, bAccess, i , j + 1),
+ reconstructLinearXChromaSample(filteringFormat[2], conversionFormat[2], xChromaOffset, addressModeU, addressModeV, bAccess, i + 1, j + 1));
}
- else if (chromaFilter == vk::VK_FILTER_LINEAR)
- {
- const IVec2 chromaIRange (calculateNearestIJRange(coordFormat, chromaU));
- const IVec2 chromaJRange (calculateNearestIJRange(coordFormat, chromaV));
-
- for (int chromaJ = chromaJRange.x(); chromaJ <= chromaJRange.y(); chromaJ++)
- for (int chromaI = chromaIRange.x(); chromaI <= chromaIRange.y(); chromaI++)
- {
- const Interval chromaA (calculateAB(subTexelPrecisionBits, chromaU, chromaI));
- const Interval chromaB (calculateAB(subTexelPrecisionBits, chromaV, chromaJ));
-
- const Interval rValue (linearSample(rAccess, conversionFormat[0], filteringFormat[0], addressModeU, addressModeV, IVec2(chromaI, chromaJ), chromaA, chromaB));
- const Interval bValue (linearSample(bAccess, conversionFormat[2], filteringFormat[2], addressModeU, addressModeV, IVec2(chromaI, chromaJ), chromaA, chromaB));
-
- const Interval srcColor[] =
- {
- rValue,
- gValue,
- bValue,
- aValue
- };
- Interval dstColor[4];
- convertColor(colorModel, range, conversionFormat, bitDepth, srcColor, dstColor);
-
- for (size_t compNdx = 0; compNdx < 4; compNdx++)
- bounds[compNdx] |= highp.roundOut(dstColor[compNdx], false);
- }
- }
- else
- DE_FATAL("Unknown chroma filter");
}
- }
- else
- {
- const Interval chromaA (lumaA);
- const Interval chromaB (lumaB);
- const Interval rValue (linearSample(rAccess, conversionFormat[0], filteringFormat[0], addressModeU, addressModeV, IVec2(i, j), chromaA, chromaB));
- const Interval bValue (linearSample(bAccess, conversionFormat[2], filteringFormat[2], addressModeU, addressModeV, IVec2(i, j), chromaA, chromaB));
+
const Interval srcColor[] =
{
rValue,
@@ -2065,10 +1843,50 @@
for (size_t compNdx = 0; compNdx < 4; compNdx++)
bounds[compNdx] |= highp.roundOut(dstColor[compNdx], false);
}
+ else
+ {
+ const Interval chromaU (subsampledX ? calculateImplicitChromaUV(coordFormat, xChromaOffset, u) : u);
+ const Interval chromaV (subsampledY ? calculateImplicitChromaUV(coordFormat, yChromaOffset, v) : v);
+
+ // TODO: It looks incorrect to ignore the chroma filter here. Is it?
+ const IVec2 chromaIRange (calculateNearestIJRange(coordFormat, chromaU));
+ const IVec2 chromaJRange (calculateNearestIJRange(coordFormat, chromaV));
+
+ for (int chromaJ = chromaJRange.x(); chromaJ <= chromaJRange.y(); chromaJ++)
+ for (int chromaI = chromaIRange.x(); chromaI <= chromaIRange.y(); chromaI++)
+ {
+ Interval rValue, bValue;
+
+ if (chromaFilter == vk::VK_FILTER_NEAREST)
+ {
+ rValue = lookupWrapped(rAccess, conversionFormat[1], addressModeU, addressModeV, IVec2(chromaI, chromaJ));
+ bValue = lookupWrapped(bAccess, conversionFormat[3], addressModeU, addressModeV, IVec2(chromaI, chromaJ));
+ }
+ else // vk::VK_FILTER_LINEAR
+ {
+ const Interval chromaA (calculateAB(subTexelPrecisionBits, chromaU, chromaI));
+ const Interval chromaB (calculateAB(subTexelPrecisionBits, chromaV, chromaJ));
+
+ rValue = linearSample(rAccess, conversionFormat[0], filteringFormat[0], addressModeU, addressModeV, IVec2(chromaI, chromaJ), chromaA, chromaB);
+ bValue = linearSample(bAccess, conversionFormat[2], filteringFormat[2], addressModeU, addressModeV, IVec2(chromaI, chromaJ), chromaA, chromaB);
+ }
+
+ const Interval srcColor[] =
+ {
+ rValue,
+ gValue,
+ bValue,
+ aValue
+ };
+ Interval dstColor[4];
+ convertColor(colorModel, range, conversionFormat, bitDepth, srcColor, dstColor);
+
+ for (size_t compNdx = 0; compNdx < 4; compNdx++)
+ bounds[compNdx] |= highp.roundOut(dstColor[compNdx], false);
+ }
+ }
}
}
- else
- DE_FATAL("Unknown filter");
minBounds[ndx] = Vec4((float)bounds[0].lo(), (float)bounds[1].lo(), (float)bounds[2].lo(), (float)bounds[3].lo());
maxBounds[ndx] = Vec4((float)bounds[0].hi(), (float)bounds[1].hi(), (float)bounds[2].hi(), (float)bounds[3].hi());
diff --git a/external/vulkancts/mustpass/AndroidTest.xml b/external/vulkancts/mustpass/AndroidTest.xml
index 71ba707..c125fe5 100644
--- a/external/vulkancts/mustpass/AndroidTest.xml
+++ b/external/vulkancts/mustpass/AndroidTest.xml
@@ -30,4 +30,8 @@
<option name="deqp-package" value="dEQP-VK"/>
<option name="deqp-caselist-file" value="vk-default-no-waivers.txt"/>
</test>
+ <test class="com.drawelements.deqp.runner.DeqpTestRunner">
+ <option name="deqp-package" value="dEQP-VK"/>
+ <option name="deqp-caselist-file" value="vk-fraction-mandatory-tests.txt"/>
+ </test>
</configuration>
diff --git a/external/vulkancts/mustpass/master/src/fraction-mandatory-tests.txt b/external/vulkancts/mustpass/master/src/fraction-mandatory-tests.txt
new file mode 100644
index 0000000..9aa9167
--- /dev/null
+++ b/external/vulkancts/mustpass/master/src/fraction-mandatory-tests.txt
@@ -0,0 +1 @@
+dEQP-VK.info.*
diff --git a/external/vulkancts/mustpass/master/vk-default-no-waivers.txt b/external/vulkancts/mustpass/master/vk-default-no-waivers.txt
index 16886ab..16c0eb1 100644
--- a/external/vulkancts/mustpass/master/vk-default-no-waivers.txt
+++ b/external/vulkancts/mustpass/master/vk-default-no-waivers.txt
Binary files differ
diff --git a/external/vulkancts/mustpass/master/vk-default.txt b/external/vulkancts/mustpass/master/vk-default.txt
index f01e0f6..9e7da6a 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/vk-fraction-mandatory-tests.txt b/external/vulkancts/mustpass/master/vk-fraction-mandatory-tests.txt
new file mode 100644
index 0000000..8161969
--- /dev/null
+++ b/external/vulkancts/mustpass/master/vk-fraction-mandatory-tests.txt
@@ -0,0 +1,18 @@
+dEQP-VK.info.build
+dEQP-VK.info.device
+dEQP-VK.info.platform
+dEQP-VK.info.memory_limits
+dEQP-VK.info.physical_devices
+dEQP-VK.info.physical_device_groups
+dEQP-VK.info.instance_layers
+dEQP-VK.info.instance_extensions
+dEQP-VK.info.device_features
+dEQP-VK.info.device_properties
+dEQP-VK.info.device_queue_family_properties
+dEQP-VK.info.device_memory_properties
+dEQP-VK.info.device_layers
+dEQP-VK.info.device_extensions
+dEQP-VK.info.device_no_khx_extensions
+dEQP-VK.info.device_memory_budget
+dEQP-VK.info.device_mandatory_features
+dEQP-VK.info.device_group_peer_memory_features
diff --git a/external/vulkancts/scripts/build_mustpass.py b/external/vulkancts/scripts/build_mustpass.py
index a4e7159..5702d42 100644
--- a/external/vulkancts/scripts/build_mustpass.py
+++ b/external/vulkancts/scripts/build_mustpass.py
@@ -64,6 +64,8 @@
exclude("test-issues.txt"),
exclude("excluded-tests.txt"),
exclude("android-tests.txt")]),
+ Configuration(name = "fraction-mandatory-tests",
+ filters = [include("fraction-mandatory-tests.txt")]),
])
MUSTPASS_LISTS = [
@@ -71,4 +73,4 @@
]
if __name__ == "__main__":
- genMustpassLists(MUSTPASS_LISTS, ANY_GENERATOR, parseBuildConfigFromCmdLineArgs())
+ genMustpassLists(MUSTPASS_LISTS, ANY_GENERATOR, parseBuildConfigFromCmdLineArgs())
\ No newline at end of file
diff --git a/external/vulkancts/scripts/build_spirv_binaries.py b/external/vulkancts/scripts/build_spirv_binaries.py
index 9dc1c52..f048228 100644
--- a/external/vulkancts/scripts/build_spirv_binaries.py
+++ b/external/vulkancts/scripts/build_spirv_binaries.py
@@ -44,7 +44,6 @@
DEFAULT_BUILD_DIR = os.path.join(tempfile.gettempdir(), "spirv-binaries", "{targetName}-{buildType}")
DEFAULT_TARGET = "null"
DEFAULT_DST_DIR = os.path.join(DEQP_DIR, "external", "vulkancts", "data", "vulkan", "prebuilt")
-DEFAULT_VULKAN_VERSION = "1.1"
def getBuildConfig (buildPathPtrn, targetName, buildType):
buildPath = buildPathPtrn.format(
@@ -98,8 +97,8 @@
parser.add_argument("-u",
"--target-vulkan-version",
dest="vulkanVersion",
- default="1.1",
- choices=["1.0", "1.1"],
+ default="1.2",
+ choices=["1.0", "1.1", "1.2"],
help="Target Vulkan version")
return parser.parse_args()
diff --git a/external/vulkancts/scripts/gen_ext_deps.py b/external/vulkancts/scripts/gen_ext_deps.py
index c643b52..6635857 100644
--- a/external/vulkancts/scripts/gen_ext_deps.py
+++ b/external/vulkancts/scripts/gen_ext_deps.py
@@ -27,35 +27,32 @@
import khr_util.format
import khr_util.registry_cache
+from collections import defaultdict
VK_SOURCE = khr_util.registry_cache.RegistrySource(
"https://github.com/KhronosGroup/Vulkan-Docs.git",
"xml/vk.xml",
- "9f2171b41192282a9957c43a37d5d8c6a982abed",
- "e7d8761b09a76c85d5f949bf6c930407dcea34f679b09ed6b4bf1398bd2e7742")
+ "59750fe4c72a9295a94e22474060d3a1635e92c8",
+ "af1a2dd66cf70ed5a2bc1c9888d499886ad46a1e0646af95fbb8b9eb4aa818b3")
VK_INL_FILE = os.path.join(os.path.dirname(__file__), "..", "framework", "vulkan", "vkApiExtensionDependencyInfo.inl")
VK_INL_HEADER = khr_util.format.genInlHeader("Khronos Vulkan API description (vk.xml)", VK_SOURCE.getRevision())
def VK_MAKE_VERSION(major, minor, patch):
return (((major) << 22) | ((minor) << 12) | (patch))
-VK_API_VERSION_1_0 = VK_MAKE_VERSION(1, 0, 0)
-VK_API_VERSION_1_1 = VK_MAKE_VERSION(1, 1, 0)
VK_EXT_NOT_PROMOTED = 0xFFFFFFFF
-VK_EXT_TYPE_INST = 0
-VK_EXT_TYPE_DEV = 1
-VK_INST_EXT_DEP_1_0 = 'instanceExtensionDependencies_1_0'
-VK_INST_EXT_DEP_1_1 = 'instanceExtensionDependencies_1_1'
-VK_DEV_EXT_DEP_1_0 = 'deviceExtensionDependencies_1_0'
-VK_DEV_EXT_DEP_1_1 = 'deviceExtensionDependencies_1_1'
+VK_EXT_TYPE_INSTANCE = 0
+VK_EXT_TYPE_DEVICE = 1
+VK_EXT_DEP_INSTANCE = 'instanceExtensionDependencies'
+VK_EXT_DEP_DEVICE = 'deviceExtensionDependencies'
+VK_EXT_API_VERSIONS = 'releasedApiVersions'
VK_XML_EXT_DEPS = 'requires'
VK_XML_EXT_NAME = 'name'
VK_XML_EXT_PROMO = 'promotedto'
-VK_XML_EXT_PROMO_1_1 = 'VK_VERSION_1_1'
VK_XML_EXT_REQUIRES_CORE = 'requiresCore'
-VK_XML_EXT_REQUIRES_CORE_1_1 = '1.1'
VK_XML_EXT_SUPPORTED = 'supported'
VK_XML_EXT_SUPPORTED_VULKAN = 'vulkan'
+VK_XML_EXT_API = 'api'
VK_XML_EXT_TYPE = 'type'
VK_XML_EXT_TYPE_DEVICE = 'device'
VK_XML_EXT_TYPE_INSTANCE = 'instance'
@@ -64,31 +61,35 @@
khr_util.format.writeInlFile(filename, VK_INL_HEADER, lines)
def genExtDepArray(extDepsName, extDepsDict):
- yield 'static const std::pair<const char*, const char*>\t%s[]\t=' % extDepsName
+ yield 'static const std::tuple<deUint32, deUint32, const char*, const char*>\t{}[]\t='.format(extDepsName)
yield '{'
- for ext in sorted(extDepsDict.keys()):
- for dep in extDepsDict[ext]:
- yield '\tstd::make_pair("%s", "%s"),' % (ext, dep)
+ for ( major, minor, ext, extDeps ) in extDepsDict:
+ for dep in extDeps:
+ yield '\tstd::make_tuple({}, {}, "{}", "{}"),'.format(major, minor, ext, dep)
yield '};'
-def genExtDepInl(allExtDepsDict):
+def genApiVersions(name, apiVersions):
+ yield 'static const std::tuple<deUint32, deUint32, deUint32>\t{}[]\t='.format(name)
+ yield '{'
+ for ( version, major, minor ) in apiVersions:
+ yield '\tstd::make_tuple({}, {}, {}),'.format(version, major, minor)
+ yield '};'
+
+def genExtDepInl(dependenciesAndVersions):
+ allExtDepsDict, apiVersions = dependenciesAndVersions
+ apiVersions.reverse()
lines = []
- if VK_INST_EXT_DEP_1_0 in allExtDepsDict:
- lines = lines + [line for line in genExtDepArray(VK_INST_EXT_DEP_1_0, allExtDepsDict[VK_INST_EXT_DEP_1_0])]
- if VK_INST_EXT_DEP_1_1 in allExtDepsDict:
- lines = lines + [line for line in genExtDepArray(VK_INST_EXT_DEP_1_1, allExtDepsDict[VK_INST_EXT_DEP_1_1])]
- if VK_DEV_EXT_DEP_1_0 in allExtDepsDict:
- lines = lines + [line for line in genExtDepArray(VK_DEV_EXT_DEP_1_0, allExtDepsDict[VK_DEV_EXT_DEP_1_0])]
- if VK_DEV_EXT_DEP_1_1 in allExtDepsDict:
- lines = lines + [line for line in genExtDepArray(VK_DEV_EXT_DEP_1_1, allExtDepsDict[VK_DEV_EXT_DEP_1_1])]
+ lines = lines + [line for line in genExtDepArray(VK_EXT_DEP_INSTANCE, allExtDepsDict[VK_EXT_TYPE_INSTANCE])]
+ lines = lines + [line for line in genExtDepArray(VK_EXT_DEP_DEVICE, allExtDepsDict[VK_EXT_TYPE_DEVICE])]
+ lines = lines + [line for line in genApiVersions(VK_EXT_API_VERSIONS, apiVersions)]
writeInlFile(VK_INL_FILE, lines)
class extInfo:
def __init__(self):
- self.type = VK_EXT_TYPE_INST
- self.core = VK_API_VERSION_1_0
+ self.type = VK_EXT_TYPE_INSTANCE
+ self.core = VK_MAKE_VERSION(1, 0, 0)
self.promo = VK_EXT_NOT_PROMOTED
self.deps = []
@@ -103,51 +104,65 @@
return deps
-def genExtDeps(extInfoDict):
- allExtDepsDict = {}
- allExtDepsDict[VK_INST_EXT_DEP_1_0] = {}
- allExtDepsDict[VK_INST_EXT_DEP_1_1] = {}
- allExtDepsDict[VK_DEV_EXT_DEP_1_0] = {}
- allExtDepsDict[VK_DEV_EXT_DEP_1_1] = {}
+def genExtDeps(extensionsAndVersions):
+ extInfoDict, apiVersionID = extensionsAndVersions
+
+ allExtDepsDict = defaultdict(list)
+ apiVersions = []
+
+ for (major,minor) in apiVersionID:
+ apiVersions.append((VK_MAKE_VERSION(major, minor, 0),major,minor))
+ apiVersions.sort(key=lambda x: x[0])
for ext, info in extInfoDict.items():
if info.deps == None:
continue
- if info.type == VK_EXT_TYPE_INST:
- allExtDepsDict[VK_INST_EXT_DEP_1_1][ext] = genExtDepsOnApiVersion(ext, extInfoDict, VK_API_VERSION_1_1);
- if info.core >= VK_API_VERSION_1_1:
- continue
- allExtDepsDict[VK_INST_EXT_DEP_1_0][ext] = genExtDepsOnApiVersion(ext, extInfoDict, VK_API_VERSION_1_0);
- else:
- allExtDepsDict[VK_DEV_EXT_DEP_1_1][ext] = genExtDepsOnApiVersion(ext, extInfoDict, VK_API_VERSION_1_1);
- if info.core >= VK_API_VERSION_1_1:
- continue
- allExtDepsDict[VK_DEV_EXT_DEP_1_0][ext] = genExtDepsOnApiVersion(ext, extInfoDict, VK_API_VERSION_1_0);
+ for (version,major,minor) in apiVersions:
+ if info.core <= version:
+ extDeps = genExtDepsOnApiVersion(ext, extInfoDict, version)
+ if extDeps == None:
+ continue
+ allExtDepsDict[info.type].append( ( major, minor, ext, extDeps ) )
- return allExtDepsDict
+ for key, value in allExtDepsDict.items():
+ value.sort(key=lambda x: x[2])
+ return allExtDepsDict, apiVersions
def getExtInfoDict(vkRegistry):
extInfoDict = {}
+ apiVersionID = []
+
+ for feature in vkRegistry.features:
+ if feature.attrib[VK_XML_EXT_API] != VK_XML_EXT_SUPPORTED_VULKAN:
+ continue
+ featureName = feature.attrib[VK_XML_EXT_NAME].split('_')
+ if len(featureName)!=4 or featureName[0] != 'VK' or featureName[1] != 'VERSION' :
+ continue
+ apiVersionID.append( (int(featureName[2]), int(featureName[3])) )
+
+ apiVersionsByName = {}
+ apiVersionsByNumber = {}
+ for (major,minor) in apiVersionID:
+ apiVersionsByName['VK_VERSION_{}_{}'.format(major,minor)] = VK_MAKE_VERSION(major, minor, 0);
+ apiVersionsByNumber['{}.{}'.format(major,minor)] = VK_MAKE_VERSION(major, minor, 0);
for ext in vkRegistry.extensions:
- if (ext.attrib[VK_XML_EXT_SUPPORTED] != VK_XML_EXT_SUPPORTED_VULKAN):
+ if ext.attrib[VK_XML_EXT_SUPPORTED] != VK_XML_EXT_SUPPORTED_VULKAN:
continue
name = ext.attrib[VK_XML_EXT_NAME]
extInfoDict[name] = extInfo()
if ext.attrib[VK_XML_EXT_TYPE] == VK_XML_EXT_TYPE_DEVICE:
- extInfoDict[name].type = VK_EXT_TYPE_DEV
- if VK_XML_EXT_REQUIRES_CORE in ext.attrib:
- if ext.attrib[VK_XML_EXT_REQUIRES_CORE] == VK_XML_EXT_REQUIRES_CORE_1_1:
- extInfoDict[name].core = VK_API_VERSION_1_1
- if VK_XML_EXT_PROMO in ext.attrib:
- if ext.attrib[VK_XML_EXT_PROMO] == VK_XML_EXT_PROMO_1_1:
- extInfoDict[name].promo = VK_API_VERSION_1_1
+ extInfoDict[name].type = VK_EXT_TYPE_DEVICE
+ if VK_XML_EXT_REQUIRES_CORE in ext.attrib and ext.attrib[VK_XML_EXT_REQUIRES_CORE] in apiVersionsByNumber:
+ extInfoDict[name].core = apiVersionsByNumber[ext.attrib[VK_XML_EXT_REQUIRES_CORE]]
+ if VK_XML_EXT_PROMO in ext.attrib and ext.attrib[VK_XML_EXT_PROMO] in apiVersionsByName :
+ extInfoDict[name].promo = apiVersionsByName[ext.attrib[VK_XML_EXT_PROMO]]
if VK_XML_EXT_DEPS in ext.attrib:
extInfoDict[name].deps = ext.attrib[VK_XML_EXT_DEPS].split(',')
- return extInfoDict
+ return extInfoDict, apiVersionID
def getVKRegistry():
return khr_util.registry_cache.getRegistry(VK_SOURCE)
diff --git a/external/vulkancts/scripts/gen_framework.py b/external/vulkancts/scripts/gen_framework.py
index c1bc006..f2ac957 100644
--- a/external/vulkancts/scripts/gen_framework.py
+++ b/external/vulkancts/scripts/gen_framework.py
@@ -42,12 +42,10 @@
"""
DEFINITIONS = [
- ("VK_API_VERSION_1_0", "deUint32"),
- ("VK_API_VERSION_1_1", "deUint32"),
("VK_MAX_PHYSICAL_DEVICE_NAME_SIZE", "size_t"),
("VK_MAX_EXTENSION_NAME_SIZE", "size_t"),
- ("VK_MAX_DRIVER_NAME_SIZE_KHR", "size_t"),
- ("VK_MAX_DRIVER_INFO_SIZE_KHR", "size_t"),
+ ("VK_MAX_DRIVER_NAME_SIZE", "size_t"),
+ ("VK_MAX_DRIVER_INFO_SIZE", "size_t"),
("VK_UUID_SIZE", "size_t"),
("VK_LUID_SIZE", "size_t"),
("VK_MAX_MEMORY_TYPES", "size_t"),
@@ -124,8 +122,8 @@
("LPCWSTR", "char*"),
]
-EXTENSION_POSTFIXES = ["KHR", "EXT", "NV", "NVX", "KHX", "NN", "MVK", "FUCHSIA", "GGP"]
-EXTENSION_POSTFIXES_STANDARD = ["KHR"]
+EXTENSION_POSTFIXES = ["KHR", "EXT", "NV", "NVX", "KHX", "NN", "MVK", "FUCHSIA", "GGP", "AMD"]
+EXTENSION_POSTFIXES_STANDARD = ["KHR", "EXT"]
def prefixName (prefix, name):
name = re.sub(r'([a-z0-9])([A-Z])', r'\1_\2', name[2:])
@@ -143,15 +141,18 @@
name = name.replace("TEXTURE_LOD", "TEXTURE_LOD_")
name = name.replace("VIEWPORT_W", "VIEWPORT_W_")
name = name.replace("_IDPROPERTIES", "_ID_PROPERTIES")
- name = name.replace("PHYSICAL_DEVICE_FLOAT_16_INT_8_FEATURES", "PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES")
+ name = name.replace("PHYSICAL_DEVICE_SHADER_FLOAT_16_INT_8_FEATURES", "PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES")
name = name.replace("_PCIBUS_", "_PCI_BUS_")
name = name.replace("ASTCD", "ASTC_D")
name = name.replace("AABBNV", "AABB_NV")
name = name.replace("IMAGE_PIPE", "IMAGEPIPE")
- name = name.replace("FUNCTIONS_2", "FUNCTIONS2_FEATURES")
name = name.replace("SMBUILTINS", "SM_BUILTINS")
name = name.replace("ASTCHDRFEATURES", "ASTC_HDR_FEATURES")
name = name.replace("UINT_8", "UINT8")
+ name = name.replace("VULKAN_11_FEATURES", "VULKAN_1_1_FEATURES")
+ name = name.replace("VULKAN_11_PROPERTIES", "VULKAN_1_1_PROPERTIES")
+ name = name.replace("VULKAN_12_FEATURES", "VULKAN_1_2_FEATURES")
+ name = name.replace("VULKAN_12_PROPERTIES", "VULKAN_1_2_PROPERTIES")
name = name.replace("INT_8_", "INT8_")
return prefix + name
@@ -163,21 +164,15 @@
self.patch = versionTuple[2]
def getInHex (self):
- if self.major == 1 and self.minor == 0 and self.patch == 0:
- return "VK_API_VERSION_1_0"
- elif self.major == 1 and self.minor == 1 and self.patch == 0:
- return "VK_API_VERSION_1_1"
- else:
- hex = (self.major << 22) | (self.minor << 12) | self.patch
- return '0x%Xu' % (hex)
+ if self.patch == 0:
+ return "VK_API_VERSION_%d_%d" % (self.major, self.minor)
+ return '0x%Xu' % (hash(self))
def isStandardVersion (self):
if self.patch != 0:
return False
if self.major != 1:
return False
- if self.minor != 1 and self.minor != 0:
- return False
return True
def getBestRepresentation (self):
@@ -396,7 +391,8 @@
return 'EXT:\n%s ->\nENUMS:\n%s\nCOMPOS:\n%s\nFUNCS:\n%s\nBITF:\n%s\nHAND:\n%s\nDEFS:\n%s\n' % (self.name, self.enums, self.compositeTypes, self.functions, self.bitfields, self.handles, self.definitions, self.versionInCore)
class API:
- def __init__ (self, definitions, handles, enums, bitfields, compositeTypes, functions, extensions):
+ def __init__ (self, versions, definitions, handles, enums, bitfields, compositeTypes, functions, extensions):
+ self.versions = versions
self.definitions = definitions
self.handles = handles
self.enums = enums
@@ -451,7 +447,6 @@
def parsePreprocDefinedValue (src, name):
value = parsePreprocDefinedValueOptional(src, name)
if value is None:
-
raise Exception("No such definition: %s" % name)
return value
@@ -494,6 +489,14 @@
types.append(parseCompositeType(typeMap[type], typename, contents))
return types
+def parseVersions (src):
+ # returns list of tuples each with four items:
+ # 1. string with version token (without ' 1' at the end)
+ # 2. starting point off version specific definitions in vulkan.h.in
+ # 3. major version number
+ # 4. minor version number
+ return [(m.group()[:-2], m.start(), int(m.group(1)), int(m.group(2))) for m in re.finditer('VK_VERSION_([1-9])_([0-9]) 1', src)]
+
def parseHandles (src):
matches = re.findall(r'VK_DEFINE(_NON_DISPATCHABLE|)_HANDLE\((' + IDENT_PTRN + r')\)[ \t]*[\n\r]', src)
handles = []
@@ -517,16 +520,15 @@
return name[0:-len(extPostfix)]
return None
-def populateAliases (objects):
- objectsByName = {}
- for object in objects:
- objectsByName[object.name] = object
- for object in objects:
+def populateExtensionAliases(allObjects, extensionObjects):
+ for object in extensionObjects:
withoutPostfix = removeTypeExtPostfix(object.name)
- if withoutPostfix != None and withoutPostfix in objectsByName:
- objectsByName[withoutPostfix].alias = object
+ if withoutPostfix != None and withoutPostfix in allObjects:
+ # max 1 alias is assumed by functions in this file
+ assert allObjects[withoutPostfix].alias == None
+ allObjects[withoutPostfix].alias = object
object.isAlias = True
- for object in objects:
+ for object in extensionObjects:
object.checkAliasValidity()
def populateAliasesWithTypedefs (objects, src):
@@ -570,30 +572,33 @@
functions.append(Function(name.strip(), returnType.strip(), parseArgList(argList)))
return functions
-def parseFunctionsByVersion (src):
- ptrnVer10 = 'VK_VERSION_1_0 1'
- ptrnVer11 = 'VK_VERSION_1_1 1'
- matchVer10 = re.search(ptrnVer10, src)
- matchVer11 = re.search(ptrnVer11, src)
+def parseFunctionsByVersion (src, versions):
+ # construct list of locations where version definitions start, and add the end of the file to it
+ sectionLocations = [versionDef[1] for versionDef in versions]
+ sectionLocations.append(len(src))
+
+ # construct function declaration pattern
ptrn = r'VKAPI_ATTR\s+(' + TYPE_PTRN + ')\s+VKAPI_CALL\s+(' + IDENT_PTRN + r')\s*\(([^)]*)\)\s*;'
regPtrn = re.compile(ptrn)
- matches = regPtrn.findall(src, matchVer10.start(), matchVer11.start())
functions = []
- for returnType, name, argList in matches:
- functions.append(Function(name.strip(), returnType.strip(), parseArgList(argList), 'VK_VERSION_1_0'))
- matches = regPtrn.findall(src, matchVer11.start())
- for returnType, name, argList in matches:
- functions.append(Function(name.strip(), returnType.strip(), parseArgList(argList), 'VK_VERSION_1_1'))
+
+ # iterate over all versions and find all function definitions
+ for index, v in enumerate(versions):
+ matches = regPtrn.findall(src, sectionLocations[index], sectionLocations[index+1])
+ for returnType, name, argList in matches:
+ functions.append(Function(name.strip(), returnType.strip(), parseArgList(argList), v[0]))
return functions
def splitByExtension (src):
ptrn = r'#define\s+[A-Z0-9_]+_EXTENSION_NAME\s+"([^"]+)"'
+ # Construct long pattern that will be used to split whole source by extensions
match = "#define\s+("
for part in re.finditer(ptrn, src):
match += part.group(1)+"|"
match = match[:-1] + ")\s+1"
parts = re.split(match, src)
- # First part is core
+
+ # First part is core, following tuples contain extension name and all its definitions
byExtension = [(None, parts[0])]
for ndx in range(1, len(parts), 2):
byExtension.append((parts[ndx], parts[ndx+1]))
@@ -604,10 +609,12 @@
def skipDefinition (extensionName, definition):
if extensionName == None:
return True
+ extNameUpper = extensionName.upper()
+ extNameUpper = extNameUpper.replace("VK_INTEL_SHADER_INTEGER_FUNCTIONS2", "VK_INTEL_SHADER_INTEGER_FUNCTIONS_2")
# SPEC_VERSION enums
- if definition[0].startswith(extensionName.upper()) and definition[1].isdigit():
+ if definition[0].startswith(extNameUpper) and definition[1].isdigit():
return False
- if definition[0].startswith(extensionName.upper()):
+ if definition[0].startswith(extNameUpper):
return True
if definition[1].isdigit():
return True
@@ -618,9 +625,12 @@
return [Definition(None, match[0], match[1]) for match in matches if not skipDefinition(extensionName, match)]
-def parseExtensions (src, allFunctions, allCompositeTypes, allEnums, allBitfields, allHandles, allDefinitions):
+def parseExtensions (src, versions, allFunctions, allCompositeTypes, allEnums, allBitfields, allHandles, allDefinitions):
def getCoreVersion (extensionName, extensionsData):
+ # returns None when extension was not added to core for any Vulkan version
+ # returns array containing DEVICE or INSTANCE string followed by the vulkan version in which this extension is core
+ # note that this function is also called for vulkan 1.0 source for which extName is None
if not extensionName:
return None
ptrn = extensionName + r'\s+(DEVICE|INSTANCE)\s+([0-9_]+)'
@@ -640,7 +650,8 @@
definitionsByName = {definition.name: definition for definition in allDefinitions}
for extensionName, extensionSrc in splitSrc:
- definitions = [Definition(type, name, parsePreprocDefinedValueOptional(extensionSrc, name)) for name, type in DEFINITIONS]
+ definitions = [Definition("deUint32", v.getInHex(), parsePreprocDefinedValueOptional(extensionSrc, v.getInHex())) for v in versions]
+ definitions.extend([Definition(type, name, parsePreprocDefinedValueOptional(extensionSrc, name)) for name, type in DEFINITIONS])
definitions = [definition for definition in definitions if definition.value != None]
additionalDefinitions = parseDefinitions(extensionName, extensionSrc)
handles = parseHandles(extensionSrc)
@@ -659,6 +670,14 @@
extHandles = [handlesByName[handle.name] for handle in handles]
extDefinitions = [definitionsByName[definition.name] for definition in definitions]
+ if extCoreVersion != None:
+ populateExtensionAliases(functionsByName, extFunctions)
+ populateExtensionAliases(handlesByName, extHandles)
+ populateExtensionAliases(enumsByName, extEnums)
+ populateExtensionAliases(bitfieldsByName, extBitfields)
+ populateExtensionAliases(compositeTypesByName, extCompositeTypes)
+
+
extensions.append(Extension(extensionName, extHandles, extEnums, extBitfields, extCompositeTypes, extFunctions, extDefinitions, additionalDefinitions, extCoreVersion))
return extensions
@@ -669,7 +688,11 @@
return matches
def parseAPI (src):
- definitions = [Definition(type, name, parsePreprocDefinedValue(src, name)) for name, type in DEFINITIONS]
+ versionsData = parseVersions(src)
+ versions = [Version((v[2], v[3], 0)) for v in versionsData]
+ definitions = [Definition("deUint32", v.getInHex(), parsePreprocDefinedValue(src, v.getInHex())) for v in versions]
+ definitions.extend([Definition(type, name, parsePreprocDefinedValue(src, name)) for name, type in DEFINITIONS])
+
handles = parseHandles(src)
rawEnums = parseEnums(src)
bitfieldNames = parseBitfieldNames(src)
@@ -677,7 +700,7 @@
bitfields = []
bitfieldEnums = set([getBitEnumNameForBitfield(n) for n in bitfieldNames if getBitEnumNameForBitfield(n) in [enum.name for enum in rawEnums]])
compositeTypes = parseCompositeTypes(src)
- allFunctions = parseFunctionsByVersion(src)
+ allFunctions = parseFunctionsByVersion(src, versionsData)
for enum in rawEnums:
if enum.name in bitfieldEnums:
@@ -690,23 +713,18 @@
# Add empty bitfield
bitfields.append(Bitfield(bitfieldName, []))
+ extensions = parseExtensions(src, versions, allFunctions, compositeTypes, enums, bitfields, handles, definitions)
+
# Populate alias fields
populateAliasesWithTypedefs(compositeTypes, src)
populateAliasesWithTypedefs(enums, src)
populateAliasesWithTypedefs(bitfields, src)
- populateAliases(allFunctions)
- populateAliases(handles)
- populateAliases(enums)
- populateAliases(bitfields)
- populateAliases(compositeTypes)
-
for enum in enums:
removeAliasedValues(enum)
- extensions = parseExtensions(src, allFunctions, compositeTypes, enums, bitfields, handles, definitions)
-
return API(
+ versions = versions,
definitions = definitions,
handles = handles,
enums = enums,
@@ -1491,9 +1509,8 @@
writeInlFile(filename, INL_HEADER, lines)
def writeCoreFunctionalities(api, filename):
- functionOriginValues = ["FUNCTIONORIGIN_PLATFORM", "FUNCTIONORIGIN_INSTANCE", "FUNCTIONORIGIN_DEVICE"]
-
- lines = addVersionDefines([Version((1, 0, 0)), Version((1, 1, 0))]) + [
+ functionOriginValues = ["FUNCTIONORIGIN_PLATFORM", "FUNCTIONORIGIN_INSTANCE", "FUNCTIONORIGIN_DEVICE"]
+ lines = addVersionDefines(api.versions) + [
"",
'enum FunctionOrigin', '{'] + [line for line in indentLines([
'\t' + functionOriginValues[0] + '\t= 0,',
@@ -1507,67 +1524,45 @@
"",
"void initApisMap (ApisMap& apis)",
"{",
- " apis.clear();",
- " apis.insert(::std::pair<deUint32, FunctionInfosList>(" + str(Version((1, 0, 0))) + ", FunctionInfosList()));",
- " apis.insert(::std::pair<deUint32, FunctionInfosList>(" + str(Version((1, 1, 0))) + ", FunctionInfosList()));",
+ " apis.clear();"] + [
+ " apis.insert(::std::pair<deUint32, FunctionInfosList>(" + str(v) + ", FunctionInfosList()));" for v in api.versions] + [
""]
- def list10Funcs ():
- for fun in api.functions:
- if fun.apiVersion == 'VK_VERSION_1_0':
- insert = ' apis[' + str(Version((1, 0, 0))) + '].push_back(FunctionInfo("' + fun.name + '",\t' + functionOriginValues[fun.getType()] + '));'
- yield insert
-
- def listAllFuncs ():
+ apiVersions = []
+ for index, v in enumerate(api.versions):
+ funcs = []
+ apiVersions.append("VK_VERSION_{0}_{1}".format(v.major, v.minor))
+ # iterate over all functions that are core in latest vulkan version
+ # note that first item in api.extension array are actually all definitions that are in vulkan.h.in before section with extensions
for fun in api.extensions[0].functions:
- insert = ' apis[' + str(Version((1, 1, 0))) + '].push_back(FunctionInfo("' + fun.name + '",\t' + functionOriginValues[fun.getType()] + '));'
- yield insert
+ if fun.apiVersion in apiVersions:
+ funcs.append(' apis[' + str(v) + '].push_back(FunctionInfo("' + fun.name + '",\t' + functionOriginValues[fun.getType()] + '));')
+ lines = lines + [line for line in indentLines(funcs)] + [""]
- lines = lines + [line for line in indentLines(list10Funcs())]
- lines.append("")
- lines = lines + [line for line in indentLines(listAllFuncs())]
-
- lines.append("}")
- lines.append("")
- lines = lines + removeVersionDefines([Version((1, 0, 0)), Version((1, 1, 0))])
-
+ lines = lines + ["}", ""] + removeVersionDefines(api.versions)
writeInlFile(filename, INL_HEADER, lines)
def generateDeviceFeaturesDefs(src):
# look for definitions
ptrnSType = r'VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_(\w+)_FEATURES(\w*)\s*='
matches = re.findall(ptrnSType, src, re.M)
- # remove duplicates
- i = 0
- sType = 0
- sSuffix = 1
- while i < len(matches):
- j = i + 1
- while j < len(matches):
- if matches[i][sType] == matches[j][sType]:
- if not matches[i][sSuffix]:
- matches.pop(i)
- i = i - 1
- break
- if not matches[j][sSuffix]:
- matches.pop(j)
- j = j - 1
- j = j + 1
- i = i + 1
+ matches = sorted(matches, key=lambda m: m[0])
# construct final list
defs = []
for sType, sSuffix in matches:
structName = re.sub("[_0-9][a-z]", lambda match: match.group(0).upper(), sType.capitalize()).replace('_', '')
- ptrnStructName = r'\s*typedef\s+struct\s+(VkPhysicalDevice' + structName + 'Features\w*)'
+ ptrnStructName = r'\s*typedef\s+struct\s+(VkPhysicalDevice' + structName + 'Features' + sSuffix[1:] + ')'
matchStructName = re.search(ptrnStructName, src, re.M)
if matchStructName:
# handle special cases
if sType == "EXCLUSIVE_SCISSOR":
sType = "SCISSOR_EXCLUSIVE"
+ if sType in {'VULKAN_1_1', 'VULKAN_1_2'}:
+ continue
# end handling special cases
- ptrnExtensionName = r'^\s*#define\s+(\w+' + sType + '_EXTENSION_NAME).+$'
+ ptrnExtensionName = r'^\s*#define\s+(\w+' + sSuffix + '_' + sType + '_EXTENSION_NAME).+$'
matchExtensionName = re.search(ptrnExtensionName, src, re.M)
- ptrnSpecVersion = r'^\s*#define\s+(\w+' + sType + '_SPEC_VERSION).+$'
+ ptrnSpecVersion = r'^\s*#define\s+(\w+' + sSuffix + '_' + sType + '_SPEC_VERSION).+$'
matchSpecVersion = re.search(ptrnSpecVersion, src, re.M)
defs.append( (sType, sSuffix, matchStructName.group(1), \
matchExtensionName.group(0) if matchExtensionName else None,
@@ -1575,7 +1570,96 @@
matchSpecVersion.group (1) if matchSpecVersion else '0') )
return defs
-def writeDeviceFeatures(dfDefs, filename):
+def generateDevicePropertiesDefs(src):
+ # look for definitions
+ ptrnSType = r'VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_(\w+)_PROPERTIES(\w*)\s*='
+ matches = re.findall(ptrnSType, src, re.M)
+ matches = sorted(matches, key=lambda m: m[0])
+ # construct final list
+ defs = []
+ for sType, sSuffix in matches:
+ # skip VkPhysicalDeviceGroupProperties
+ if sType == "GROUP":
+ continue
+ structName = re.sub("[_0-9][a-z]", lambda match: match.group(0).upper(), sType.capitalize()).replace('_', '')
+ ptrnStructName = r'\s*typedef\s+struct\s+(VkPhysicalDevice' + structName + 'Properties' + sSuffix[1:] + ')'
+ matchStructName = re.search(ptrnStructName, src, re.M)
+ if matchStructName:
+ if sType in {'VULKAN_1_1', 'VULKAN_1_2'}:
+ continue
+ extType = sType
+ if extType == "MAINTENANCE_3":
+ extType = "MAINTENANCE3"
+ elif extType == "DISCARD_RECTANGLE":
+ extType = "DISCARD_RECTANGLES"
+ # end handling special cases
+ ptrnExtensionName = r'^\s*#define\s+(\w+' + sSuffix + '_' + extType + '_EXTENSION_NAME).+$'
+ matchExtensionName = re.search(ptrnExtensionName, src, re.M)
+ ptrnSpecVersion = r'^\s*#define\s+(\w+' + sSuffix + '_' + extType + '_SPEC_VERSION).+$'
+ matchSpecVersion = re.search(ptrnSpecVersion, src, re.M)
+ defs.append( (sType, sSuffix, matchStructName.group(1), \
+ matchExtensionName.group(0) if matchExtensionName else None,
+ matchExtensionName.group(1) if matchExtensionName else None,
+ matchSpecVersion.group (1) if matchSpecVersion else '0') )
+ return defs
+
+def writeDeviceFeatures(api, dfDefs, filename):
+ # find VkPhysicalDeviceVulkan[1-9][0-9]Features blob structurs
+ # and construct dictionary with all of their attributes
+ blobMembers = {}
+ blobStructs = {}
+ blobPattern = re.compile("^VkPhysicalDeviceVulkan([1-9][0-9])Features$")
+ for structureType in api.compositeTypes:
+ match = blobPattern.match(structureType.name)
+ if match:
+ allMembers = [member.name for member in structureType.members]
+ vkVersion = match.group(1)
+ blobMembers[vkVersion] = allMembers[2:]
+ blobStructs[vkVersion] = set()
+ initFromBlobDefinitions = []
+ emptyInitDefinitions = []
+ # iterate over all feature structures
+ allFeaturesPattern = re.compile("^VkPhysicalDevice\w+Features")
+ nonExtFeaturesPattern = re.compile("^VkPhysicalDevice\w+Features$")
+ for structureType in api.compositeTypes:
+ # skip structures that are not feature structures
+ if not allFeaturesPattern.match(structureType.name):
+ continue
+ # skip structures that were previously identified as blobs
+ if blobPattern.match(structureType.name):
+ continue
+ if structureType.isAlias:
+ continue
+ # skip sType and pNext and just grab third and next attributes
+ structureMembers = structureType.members[2:]
+ notPartOfBlob = True
+ if nonExtFeaturesPattern.match(structureType.name):
+ # check if this member is part of any of the blobs
+ for blobName, blobMemberList in blobMembers.items():
+ # if just one member is not part of this blob go to the next blob
+ # (we asume that all members are part of blob - no need to check all)
+ if structureMembers[0].name not in blobMemberList:
+ continue
+ # add another feature structure name to this blob
+ blobStructs[blobName].add(structureType)
+ # add specialization for this feature structure
+ memberCopying = ""
+ for member in structureMembers:
+ memberCopying += "\tfeatureType.{0} = allBlobs.vk{1}.{0};\n".format(member.name, blobName)
+ wholeFunction = \
+ "template<> void initFromBlob<{0}>({0}& featureType, const AllBlobs& allBlobs)\n" \
+ "{{\n" \
+ "{1}" \
+ "}}".format(structureType.name, memberCopying)
+ initFromBlobDefinitions.append(wholeFunction)
+ notPartOfBlob = False
+ # assuming that all members are part of blob, goto next
+ break
+ # add empty template definition as on Fedora there are issue with
+ # linking using just generic template - all specializations are needed
+ if notPartOfBlob:
+ emptyFunction = "template<> void initFromBlob<{0}>({0}&, const AllBlobs&) {{}}"
+ emptyInitDefinitions.append(emptyFunction.format(structureType.name))
extensionDefines = []
makeFeatureDescDefinitions = []
featureStructWrappers = []
@@ -1595,41 +1679,127 @@
# construct makeFeatureDesc template function definitions
sTypeName = "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_{0}_FEATURES{1}".format(sType, sSuffix)
makeFeatureDescDefinitions.append("template<> FeatureDesc makeFeatureDesc<{0}>(void) " \
- "{{ return FeatureDesc({1}, {2}, {3}, {4}); }}".format(extStruct, sTypeName, extensionNameDefinition, specVer, len(dfDefs)-idx))
+ "{{ return FeatureDesc{{{1}, {2}, {3}, {4}}}; }}".format(extStruct, sTypeName, extensionNameDefinition, specVer, len(dfDefs)-idx))
# construct CreateFeatureStruct wrapper block
featureStructWrappers.append("\t{{ createFeatureStructWrapper<{0}>, {1}, {2} }},".format(extStruct, extensionNameDefinition, specVer))
+ # construct method that will check if structure sType is part of blob
+ blobChecker = "bool isPartOfBlobFeatures (VkStructureType sType)\n{\n" \
+ "\tconst std::vector<VkStructureType> sTypeVect =" \
+ "\t{\n"
+ # iterate over blobs with list of structures
+ for blobName in sorted(blobStructs.keys()):
+ blobChecker += "\t\t// Vulkan{0}\n".format(blobName)
+ # iterate over all feature structures in current blob
+ structuresList = list(blobStructs[blobName])
+ structuresList = sorted(structuresList, key=lambda s: s.name)
+ for structType in structuresList:
+ # find definition of this structure in dfDefs
+ structName = structType.name
+ # handle special cases
+ if structName == 'VkPhysicalDeviceShaderDrawParameterFeatures':
+ structName = 'VkPhysicalDeviceShaderDrawParametersFeatures'
+ # end handling special cases
+ structDef = [s for s in dfDefs if s[2] == structName][0]
+ sType = structDef[0]
+ sSuffix = structDef[1]
+ # handle special cases
+ if sType == "SCISSOR_EXCLUSIVE":
+ sType = "EXCLUSIVE_SCISSOR"
+ # end handling special cases
+ sTypeName = "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_{0}_FEATURES{1}".format(sType, sSuffix)
+ blobChecker += "\t\t{0},\n".format(sTypeName)
+ blobChecker += "\t};\n" \
+ "\treturn de::contains(sTypeVect.begin(), sTypeVect.end(), sType);\n" \
+ "}\n"
# combine all definition lists
stream = [
'#include "vkDeviceFeatures.hpp"\n',
'namespace vk\n{']
stream.extend(extensionDefines)
stream.append('\n')
+ stream.extend(initFromBlobDefinitions)
+ stream.append('\n// generic template is not enough for some compilers')
+ stream.extend(emptyInitDefinitions)
+ stream.append('\n')
stream.extend(makeFeatureDescDefinitions)
stream.append('\n')
- stream.append('static const FeatureStructMapItem featureStructCreatorMap[] =\n{')
+ stream.append('static const FeatureStructCreationData featureStructCreationArray[] =\n{')
stream.extend(featureStructWrappers)
+ stream.append('};\n')
+ stream.append(blobChecker)
+ stream.append('} // vk\n')
+ writeInlFile(filename, INL_HEADER, stream)
+
+def writeDeviceProperties(dfDefs, filename):
+ extensionDefines = []
+ makePropertyDescDefinitions = []
+ propertyStructWrappers = []
+ for idx, (sType, sSuffix, extStruct, extLine, extName, specVer) in enumerate(dfDefs):
+ extensionNameDefinition = extName
+ if not extensionNameDefinition:
+ extensionNameDefinition = 'DECL{0}_{1}_EXTENSION_NAME'.format((sSuffix if sSuffix else ''), sType)
+ # construct defines with names
+ if extLine:
+ extensionDefines.append(extLine)
+ else:
+ extensionDefines.append('#define {0} "not_existent_property"'.format(extensionNameDefinition))
+ # construct makePropertyDesc template function definitions
+ sTypeName = "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_{0}_PROPERTIES{1}".format(sType, sSuffix)
+ makePropertyDescDefinitions.append("template<> PropertyDesc makePropertyDesc<{0}>(void) " \
+ "{{ return PropertyDesc({1}, {2}, {3}, {4}); }}".format(extStruct, sTypeName, extensionNameDefinition, specVer, len(dfDefs)-idx))
+ # construct CreateProperty struct wrapper block
+ propertyStructWrappers.append("\t{{ createPropertyStructWrapper<{0}>, {1}, {2} }},".format(extStruct, extensionNameDefinition, specVer))
+ # combine all definition lists
+ stream = [
+ '#include "vkDeviceProperties.hpp"\n',
+ 'namespace vk\n{']
+ stream.extend(extensionDefines)
+ stream.append('\n')
+ stream.extend(makePropertyDescDefinitions)
+ stream.append('\n')
+ stream.append('static const PropertyStructMapItem propertyStructCreatorMap[] =\n{')
+ stream.extend(propertyStructWrappers)
stream.append('};\n} // vk\n')
writeInlFile(filename, INL_HEADER, stream)
def genericDeviceFeaturesWriter(dfDefs, pattern, filename):
stream = []
- for _, _, extStruct, _, _, _ in dfDefs:
- nameSubStr = extStruct.replace("VkPhysicalDevice", "").replace("KHR", "").replace("EXT", "").replace("NV", "")
+ for sType, sSuffix, extStruct, _, _, _ in dfDefs:
+ nameSubStr = extStruct.replace("VkPhysicalDevice", "").replace("KHR", "").replace("NV", "")
stream.append(pattern.format(extStruct, nameSubStr))
writeInlFile(filename, INL_HEADER, indentLines(stream))
-def writeDefaultDeviceDefs(dfDefs, filename):
+def writeDeviceFeaturesDefaultDeviceDefs(dfDefs, filename):
pattern = "const {0}&\tget{1}\t(void) const {{ return m_deviceFeatures.getFeatureType<{0}>();\t}}"
genericDeviceFeaturesWriter(dfDefs, pattern, filename)
-def writeContextDecl(dfDefs, filename):
+def writeDeviceFeaturesContextDecl(dfDefs, filename):
pattern = "const vk::{0}&\tget{1}\t(void) const;"
genericDeviceFeaturesWriter(dfDefs, pattern, filename)
-def writeContextDefs(dfDefs, filename):
+def writeDeviceFeaturesContextDefs(dfDefs, filename):
pattern = "const vk::{0}&\tContext::get{1}\t(void) const {{ return m_device->get{1}();\t}}"
genericDeviceFeaturesWriter(dfDefs, pattern, filename)
+def genericDevicePropertiesWriter(dfDefs, pattern, filename):
+ stream = []
+ for _, _, extStruct, _, _, _ in dfDefs:
+ nameSubStr = extStruct.replace("VkPhysicalDevice", "").replace("KHR", "").replace("NV", "")
+ stream.append(pattern.format(extStruct, nameSubStr))
+ writeInlFile(filename, INL_HEADER, indentLines(stream))
+
+def writeDevicePropertiesDefaultDeviceDefs(dfDefs, filename):
+ pattern = "const {0}&\tget{1}\t(void) const {{ return m_devicePropertiesFull.getPropertyType<{0}>();\t}}"
+ genericDevicePropertiesWriter(dfDefs, pattern, filename)
+
+def writeDevicePropertiesContextDecl(dfDefs, filename):
+ pattern = "const vk::{0}&\tget{1}\t(void) const;"
+ genericDevicePropertiesWriter(dfDefs, pattern, filename)
+
+def writeDevicePropertiesContextDefs(dfDefs, filename):
+ pattern = "const vk::{0}&\tContext::get{1}\t(void) const {{ return m_device->get{1}();\t}}"
+ genericDevicePropertiesWriter(dfDefs, pattern, filename)
+
def splitWithQuotation(line):
result = []
splitted = re.findall(r'[^"\s]\S*|".+?"', line)
@@ -1655,7 +1825,7 @@
dictStructs[m[0]].append(allRequirements[0])
stream.extend(['bool checkMandatoryFeatures(const vkt::Context& context)\n{',
- '\tif ( !vk::isInstanceExtensionSupported(context.getUsedApiVersion(), context.getInstanceExtensions(), "VK_KHR_get_physical_device_properties2") )',
+ '\tif (!context.isInstanceFunctionalitySupported("VK_KHR_get_physical_device_properties2"))',
'\t\tTCU_THROW(NotSupportedError, "Extension VK_KHR_get_physical_device_properties2 is not present");',
'',
'\tVkPhysicalDevice\t\t\t\t\tphysicalDevice\t\t= context.getPhysicalDevice();',
@@ -1671,6 +1841,10 @@
listStruct = sorted(dictStructs.items(), key=lambda tup: tup[0]) # sort to have same results for py2 and py3
for k, v in listStruct:
+ if (v[1].startswith("ApiVersion")):
+ cond = '\tif (context.contextSupports(vk::' + v[1] + '))'
+ else:
+ cond = '\tif (vk::isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "' + v[1] + '"))'
stream.extend(['\tvk::' + k + ' ' + v[0]+ ';',
'\tdeMemset(&' + v[0] + ', 0, sizeof(' + v[0] + '));',
''])
@@ -1753,41 +1927,47 @@
instanceFuncs = [Function.TYPE_INSTANCE]
deviceFuncs = [Function.TYPE_DEVICE]
- dfd = generateDeviceFeaturesDefs(src)
- writeDeviceFeatures (dfd, os.path.join(VULKAN_DIR, "vkDeviceFeatures.inl"))
- writeDefaultDeviceDefs (dfd, os.path.join(VULKAN_DIR, "vkDeviceFeaturesForDefaultDeviceDefs.inl"))
- writeContextDecl (dfd, os.path.join(VULKAN_DIR, "vkDeviceFeaturesForContextDecl.inl"))
- writeContextDefs (dfd, os.path.join(VULKAN_DIR, "vkDeviceFeaturesForContextDefs.inl"))
+ dfd = generateDeviceFeaturesDefs(src)
+ writeDeviceFeatures (api, dfd, os.path.join(VULKAN_DIR, "vkDeviceFeatures.inl"))
+ writeDeviceFeaturesDefaultDeviceDefs (dfd, os.path.join(VULKAN_DIR, "vkDeviceFeaturesForDefaultDeviceDefs.inl"))
+ writeDeviceFeaturesContextDecl (dfd, os.path.join(VULKAN_DIR, "vkDeviceFeaturesForContextDecl.inl"))
+ writeDeviceFeaturesContextDefs (dfd, os.path.join(VULKAN_DIR, "vkDeviceFeaturesForContextDefs.inl"))
- writeHandleType (api, os.path.join(VULKAN_DIR, "vkHandleType.inl"))
- writeBasicTypes (api, os.path.join(VULKAN_DIR, "vkBasicTypes.inl"))
- writeCompositeTypes (api, os.path.join(VULKAN_DIR, "vkStructTypes.inl"))
- writeInterfaceDecl (api, os.path.join(VULKAN_DIR, "vkVirtualPlatformInterface.inl"), platformFuncs, False)
- writeInterfaceDecl (api, os.path.join(VULKAN_DIR, "vkVirtualInstanceInterface.inl"), instanceFuncs, False)
- writeInterfaceDecl (api, os.path.join(VULKAN_DIR, "vkVirtualDeviceInterface.inl"), deviceFuncs, False)
- writeInterfaceDecl (api, os.path.join(VULKAN_DIR, "vkConcretePlatformInterface.inl"), platformFuncs, True)
- writeInterfaceDecl (api, os.path.join(VULKAN_DIR, "vkConcreteInstanceInterface.inl"), instanceFuncs, True)
- writeInterfaceDecl (api, os.path.join(VULKAN_DIR, "vkConcreteDeviceInterface.inl"), deviceFuncs, True)
- writeFunctionPtrTypes (api, os.path.join(VULKAN_DIR, "vkFunctionPointerTypes.inl"))
- writeFunctionPointers (api, os.path.join(VULKAN_DIR, "vkPlatformFunctionPointers.inl"), platformFuncs)
- writeFunctionPointers (api, os.path.join(VULKAN_DIR, "vkInstanceFunctionPointers.inl"), instanceFuncs)
- writeFunctionPointers (api, os.path.join(VULKAN_DIR, "vkDeviceFunctionPointers.inl"), deviceFuncs)
- writeInitFunctionPointers (api, os.path.join(VULKAN_DIR, "vkInitPlatformFunctionPointers.inl"), platformFuncs, lambda f: f.name != "vkGetInstanceProcAddr")
- writeInitFunctionPointers (api, os.path.join(VULKAN_DIR, "vkInitInstanceFunctionPointers.inl"), instanceFuncs)
- writeInitFunctionPointers (api, os.path.join(VULKAN_DIR, "vkInitDeviceFunctionPointers.inl"), deviceFuncs)
- writeFuncPtrInterfaceImpl (api, os.path.join(VULKAN_DIR, "vkPlatformDriverImpl.inl"), platformFuncs, "PlatformDriver")
- writeFuncPtrInterfaceImpl (api, os.path.join(VULKAN_DIR, "vkInstanceDriverImpl.inl"), instanceFuncs, "InstanceDriver")
- writeFuncPtrInterfaceImpl (api, os.path.join(VULKAN_DIR, "vkDeviceDriverImpl.inl"), deviceFuncs, "DeviceDriver")
- writeStrUtilProto (api, os.path.join(VULKAN_DIR, "vkStrUtil.inl"))
- writeStrUtilImpl (api, os.path.join(VULKAN_DIR, "vkStrUtilImpl.inl"))
- writeRefUtilProto (api, os.path.join(VULKAN_DIR, "vkRefUtil.inl"))
- writeRefUtilImpl (api, os.path.join(VULKAN_DIR, "vkRefUtilImpl.inl"))
- writeStructTraitsImpl (api, os.path.join(VULKAN_DIR, "vkGetStructureTypeImpl.inl"))
- writeNullDriverImpl (api, os.path.join(VULKAN_DIR, "vkNullDriverImpl.inl"))
- writeTypeUtil (api, os.path.join(VULKAN_DIR, "vkTypeUtil.inl"))
- writeSupportedExtenions (api, os.path.join(VULKAN_DIR, "vkSupportedExtensions.inl"))
- writeCoreFunctionalities (api, os.path.join(VULKAN_DIR, "vkCoreFunctionalities.inl"))
- writeExtensionFunctions (api, os.path.join(VULKAN_DIR, "vkExtensionFunctions.inl"))
- writeMandatoryFeatures ( os.path.join(VULKAN_DIR, "vkMandatoryFeatures.inl"))
- writeExtensionList ( os.path.join(VULKAN_DIR, "vkInstanceExtensions.inl"), 'INSTANCE')
- writeExtensionList ( os.path.join(VULKAN_DIR, "vkDeviceExtensions.inl"), 'DEVICE')
+ dpd = generateDevicePropertiesDefs(src)
+ writeDeviceProperties (dpd, os.path.join(VULKAN_DIR, "vkDeviceProperties.inl"))
+ writeDevicePropertiesDefaultDeviceDefs (dpd, os.path.join(VULKAN_DIR, "vkDevicePropertiesForDefaultDeviceDefs.inl"))
+ writeDevicePropertiesContextDecl (dpd, os.path.join(VULKAN_DIR, "vkDevicePropertiesForContextDecl.inl"))
+ writeDevicePropertiesContextDefs (dpd, os.path.join(VULKAN_DIR, "vkDevicePropertiesForContextDefs.inl"))
+
+ writeHandleType (api, os.path.join(VULKAN_DIR, "vkHandleType.inl"))
+ writeBasicTypes (api, os.path.join(VULKAN_DIR, "vkBasicTypes.inl"))
+ writeCompositeTypes (api, os.path.join(VULKAN_DIR, "vkStructTypes.inl"))
+ writeInterfaceDecl (api, os.path.join(VULKAN_DIR, "vkVirtualPlatformInterface.inl"), platformFuncs, False)
+ writeInterfaceDecl (api, os.path.join(VULKAN_DIR, "vkVirtualInstanceInterface.inl"), instanceFuncs, False)
+ writeInterfaceDecl (api, os.path.join(VULKAN_DIR, "vkVirtualDeviceInterface.inl"), deviceFuncs, False)
+ writeInterfaceDecl (api, os.path.join(VULKAN_DIR, "vkConcretePlatformInterface.inl"), platformFuncs, True)
+ writeInterfaceDecl (api, os.path.join(VULKAN_DIR, "vkConcreteInstanceInterface.inl"), instanceFuncs, True)
+ writeInterfaceDecl (api, os.path.join(VULKAN_DIR, "vkConcreteDeviceInterface.inl"), deviceFuncs, True)
+ writeFunctionPtrTypes (api, os.path.join(VULKAN_DIR, "vkFunctionPointerTypes.inl"))
+ writeFunctionPointers (api, os.path.join(VULKAN_DIR, "vkPlatformFunctionPointers.inl"), platformFuncs)
+ writeFunctionPointers (api, os.path.join(VULKAN_DIR, "vkInstanceFunctionPointers.inl"), instanceFuncs)
+ writeFunctionPointers (api, os.path.join(VULKAN_DIR, "vkDeviceFunctionPointers.inl"), deviceFuncs)
+ writeInitFunctionPointers (api, os.path.join(VULKAN_DIR, "vkInitPlatformFunctionPointers.inl"), platformFuncs, lambda f: f.name != "vkGetInstanceProcAddr")
+ writeInitFunctionPointers (api, os.path.join(VULKAN_DIR, "vkInitInstanceFunctionPointers.inl"), instanceFuncs)
+ writeInitFunctionPointers (api, os.path.join(VULKAN_DIR, "vkInitDeviceFunctionPointers.inl"), deviceFuncs)
+ writeFuncPtrInterfaceImpl (api, os.path.join(VULKAN_DIR, "vkPlatformDriverImpl.inl"), platformFuncs, "PlatformDriver")
+ writeFuncPtrInterfaceImpl (api, os.path.join(VULKAN_DIR, "vkInstanceDriverImpl.inl"), instanceFuncs, "InstanceDriver")
+ writeFuncPtrInterfaceImpl (api, os.path.join(VULKAN_DIR, "vkDeviceDriverImpl.inl"), deviceFuncs, "DeviceDriver")
+ writeStrUtilProto (api, os.path.join(VULKAN_DIR, "vkStrUtil.inl"))
+ writeStrUtilImpl (api, os.path.join(VULKAN_DIR, "vkStrUtilImpl.inl"))
+ writeRefUtilProto (api, os.path.join(VULKAN_DIR, "vkRefUtil.inl"))
+ writeRefUtilImpl (api, os.path.join(VULKAN_DIR, "vkRefUtilImpl.inl"))
+ writeStructTraitsImpl (api, os.path.join(VULKAN_DIR, "vkGetStructureTypeImpl.inl"))
+ writeNullDriverImpl (api, os.path.join(VULKAN_DIR, "vkNullDriverImpl.inl"))
+ writeTypeUtil (api, os.path.join(VULKAN_DIR, "vkTypeUtil.inl"))
+ writeSupportedExtenions (api, os.path.join(VULKAN_DIR, "vkSupportedExtensions.inl"))
+ writeCoreFunctionalities (api, os.path.join(VULKAN_DIR, "vkCoreFunctionalities.inl"))
+ writeExtensionFunctions (api, os.path.join(VULKAN_DIR, "vkExtensionFunctions.inl"))
+ writeMandatoryFeatures ( os.path.join(VULKAN_DIR, "vkMandatoryFeatures.inl"))
+ writeExtensionList ( os.path.join(VULKAN_DIR, "vkInstanceExtensions.inl"), 'INSTANCE')
+ writeExtensionList ( os.path.join(VULKAN_DIR, "vkDeviceExtensions.inl"), 'DEVICE')
diff --git a/external/vulkancts/scripts/src/extensions_data.txt b/external/vulkancts/scripts/src/extensions_data.txt
index d9302cb..690cc0e 100644
--- a/external/vulkancts/scripts/src/extensions_data.txt
+++ b/external/vulkancts/scripts/src/extensions_data.txt
@@ -1,7 +1,7 @@
// This is manually created file used by gen_framework.py.
// It contains additional data for extensions that are required to
// generate code for cts. Currently every line contains:
-// * extension name (at this point only KHR extensions are needed)
+// * extension name
// * information wheter this is device or instance extension
// * version number in which this extension is part of core
@@ -25,7 +25,7 @@
VK_KHR_swapchain DEVICE
VK_KHR_swapchain_mutable_format DEVICE
VK_KHR_display_swapchain DEVICE
-VK_KHR_sampler_mirror_clamp_to_edge DEVICE
+VK_KHR_sampler_mirror_clamp_to_edge DEVICE 1_2_0
VK_KHR_multiview DEVICE 1_1_0
VK_KHR_device_group DEVICE 1_1_0
VK_KHR_shader_draw_parameters DEVICE 1_1_0
@@ -38,12 +38,12 @@
VK_KHR_external_semaphore_win32 DEVICE
VK_KHR_external_semaphore_fd DEVICE
VK_KHR_push_descriptor DEVICE
-VK_KHR_shader_float16_int8 DEVICE
+VK_KHR_shader_float16_int8 DEVICE 1_2_0
VK_KHR_16bit_storage DEVICE 1_1_0
VK_KHR_incremental_present DEVICE
-VK_KHR_8bit_storage DEVICE
+VK_KHR_8bit_storage DEVICE 1_2_0
VK_KHR_descriptor_update_template DEVICE 1_1_0
-VK_KHR_create_renderpass2 DEVICE
+VK_KHR_create_renderpass2 DEVICE 1_2_0
VK_KHR_shared_presentable_image DEVICE
VK_KHR_external_fence DEVICE 1_1_0
VK_KHR_external_fence_win32 DEVICE
@@ -54,18 +54,28 @@
VK_KHR_storage_buffer_storage_class DEVICE 1_1_0
VK_KHR_relaxed_block_layout DEVICE 1_1_0
VK_KHR_get_memory_requirements2 DEVICE 1_1_0
-VK_KHR_image_format_list DEVICE
+VK_KHR_image_format_list DEVICE 1_2_0
VK_KHR_sampler_ycbcr_conversion DEVICE 1_1_0
VK_KHR_bind_memory2 DEVICE 1_1_0
VK_KHR_maintenance3 DEVICE 1_1_0
-VK_KHR_driver_properties DEVICE
-VK_KHR_shader_float_controls DEVICE
-VK_KHR_depth_stencil_resolve DEVICE
-VK_KHR_draw_indirect_count DEVICE
-VK_KHR_shader_atomic_int64 DEVICE
-VK_KHR_vulkan_memory_model DEVICE
-VK_KHR_uniform_buffer_standard_layout DEVICE
-VK_KHR_imageless_framebuffer DEVICE
+VK_KHR_driver_properties DEVICE 1_2_0
+VK_KHR_shader_float_controls DEVICE 1_2_0
+VK_KHR_depth_stencil_resolve DEVICE 1_2_0
+VK_KHR_draw_indirect_count DEVICE 1_2_0
+VK_KHR_shader_atomic_int64 DEVICE 1_2_0
+VK_KHR_vulkan_memory_model DEVICE 1_2_0
+VK_KHR_uniform_buffer_standard_layout DEVICE 1_2_0
+VK_KHR_imageless_framebuffer DEVICE 1_2_0
+VK_KHR_shader_subgroup_extended_types DEVICE 1_2_0
+VK_EXT_sampler_filter_minmax DEVICE 1_2_0
+VK_EXT_shader_viewport_index_layer DEVICE 1_2_0
+VK_EXT_descriptor_indexing DEVICE 1_2_0
+VK_EXT_scalar_block_layout DEVICE 1_2_0
+VK_KHR_buffer_device_address DEVICE 1_2_0
+VK_EXT_host_query_reset DEVICE 1_2_0
+VK_KHR_separate_depth_stencil_layouts DEVICE 1_2_0
+VK_KHR_timeline_semaphore DEVICE 1_2_0
+VK_KHR_spirv_1_4 DEVICE 1_2_0
+VK_EXT_separate_stencil_usage DEVICE 1_2_0
VK_KHR_pipeline_executable_properties DEVICE
-VK_KHR_timeline_semaphore DEVICE
VK_KHR_shader_clock DEVICE
diff --git a/external/vulkancts/scripts/src/mandatory_features.txt b/external/vulkancts/scripts/src/mandatory_features.txt
index 19e151c..643dd0b 100644
--- a/external/vulkancts/scripts/src/mandatory_features.txt
+++ b/external/vulkancts/scripts/src/mandatory_features.txt
@@ -10,6 +10,7 @@
VkPhysicalDeviceFeatures shaderSampledImageArrayDynamicIndexing REQUIREMENTS ( VK_EXT_descriptor_indexing )
VkPhysicalDeviceFeatures shaderStorageBufferArrayDynamicIndexing REQUIREMENTS ( VK_EXT_descriptor_indexing )
VkPhysicalDevice8BitStorageFeaturesKHR storageBuffer8BitAccess REQUIREMENTS ( VK_KHR_8bit_storage )
+VkPhysicalDeviceVulkan11Features multiview REQUIREMENTS ( "ApiVersion(1, 2, 0)" )
VkPhysicalDeviceMultiviewFeatures multiview REQUIREMENTS ( "ApiVersion(1, 1, 0)" )
VkPhysicalDeviceMultiviewFeatures multiview REQUIREMENTS ( VK_KHR_multiview )
VkPhysicalDeviceVariablePointersFeatures variablePointersStorageBuffer REQUIREMENTS ( VK_KHR_variable_pointers )
@@ -31,4 +32,25 @@
VkPhysicalDeviceScalarBlockLayoutFeaturesEXT scalarBlockLayout REQUIREMENTS ( VK_EXT_scalar_block_layout )
VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR uniformBufferStandardLayout REQUIREMENTS ( VK_KHR_uniform_buffer_standard_layout )
VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR pipelineExecutableInfo REQUIREMENTS ( VK_KHR_pipeline_executable_properties )
+VkPhysicalDeviceSubgroupSizeControlFeaturesEXT subgroupSizeControl REQUIREMENTS ( VK_EXT_subgroup_size_control )
+VkPhysicalDeviceSubgroupSizeControlFeaturesEXT computeFullSubgroups REQUIREMENTS ( VK_EXT_subgroup_size_control )
+VkPhysicalDeviceVulkan12Features subgroupBroadcastDynamicId REQUIREMENTS ( "ApiVersion(1, 2, 0)" )
+VkPhysicalDeviceVulkan12Features imagelessFramebuffer REQUIREMENTS ( "ApiVersion(1, 2, 0)" )
+VkPhysicalDeviceVulkan12Features uniformBufferStandardLayout REQUIREMENTS ( "ApiVersion(1, 2, 0)" )
+VkPhysicalDeviceVulkan12Features separateDepthStencilLayouts REQUIREMENTS ( "ApiVersion(1, 2, 0)" )
+VkPhysicalDeviceVulkan12Features hostQueryReset REQUIREMENTS ( "ApiVersion(1, 2, 0)" )
VkPhysicalDeviceTimelineSemaphoreFeaturesKHR timelineSemaphore REQUIREMENTS ( VK_KHR_timeline_semaphore )
+VkPhysicalDeviceVulkan12Features timelineSemaphore REQUIREMENTS ( "ApiVersion(1, 2, 0)" )
+VkPhysicalDeviceVulkan12Features shaderUniformTexelBufferArrayDynamicIndexing REQUIREMENTS ( "ApiVersion(1, 2, 0)" physicalDeviceVulkan12Features.descriptorIndexing )
+VkPhysicalDeviceVulkan12Features shaderStorageTexelBufferArrayDynamicIndexing REQUIREMENTS ( "ApiVersion(1, 2, 0)" physicalDeviceVulkan12Features.descriptorIndexing )
+VkPhysicalDeviceVulkan12Features shaderSampledImageArrayNonUniformIndexing REQUIREMENTS ( "ApiVersion(1, 2, 0)" physicalDeviceVulkan12Features.descriptorIndexing )
+VkPhysicalDeviceVulkan12Features shaderStorageBufferArrayNonUniformIndexing REQUIREMENTS ( "ApiVersion(1, 2, 0)" physicalDeviceVulkan12Features.descriptorIndexing )
+VkPhysicalDeviceVulkan12Features shaderUniformTexelBufferArrayNonUniformIndexing REQUIREMENTS ( "ApiVersion(1, 2, 0)" physicalDeviceVulkan12Features.descriptorIndexing )
+VkPhysicalDeviceVulkan12Features descriptorBindingSampledImageUpdateAfterBind REQUIREMENTS ( "ApiVersion(1, 2, 0)" physicalDeviceVulkan12Features.descriptorIndexing )
+VkPhysicalDeviceVulkan12Features descriptorBindingStorageImageUpdateAfterBind REQUIREMENTS ( "ApiVersion(1, 2, 0)" physicalDeviceVulkan12Features.descriptorIndexing )
+VkPhysicalDeviceVulkan12Features descriptorBindingStorageBufferUpdateAfterBind REQUIREMENTS ( "ApiVersion(1, 2, 0)" physicalDeviceVulkan12Features.descriptorIndexing )
+VkPhysicalDeviceVulkan12Features descriptorBindingUniformTexelBufferUpdateAfterBind REQUIREMENTS ( "ApiVersion(1, 2, 0)" physicalDeviceVulkan12Features.descriptorIndexing )
+VkPhysicalDeviceVulkan12Features descriptorBindingStorageTexelBufferUpdateAfterBind REQUIREMENTS ( "ApiVersion(1, 2, 0)" physicalDeviceVulkan12Features.descriptorIndexing )
+VkPhysicalDeviceVulkan12Features descriptorBindingUpdateUnusedWhilePending REQUIREMENTS ( "ApiVersion(1, 2, 0)" physicalDeviceVulkan12Features.descriptorIndexing )
+VkPhysicalDeviceVulkan12Features descriptorBindingPartiallyBound REQUIREMENTS ( "ApiVersion(1, 2, 0)" physicalDeviceVulkan12Features.descriptorIndexing )
+VkPhysicalDeviceVulkan12Features runtimeDescriptorArray REQUIREMENTS ( "ApiVersion(1, 2, 0)" physicalDeviceVulkan12Features.descriptorIndexing )
diff --git a/external/vulkancts/scripts/src/vulkan_android.h b/external/vulkancts/scripts/src/vulkan_android.h
index 1861802..9b8d3e2 100644
--- a/external/vulkancts/scripts/src/vulkan_android.h
+++ b/external/vulkancts/scripts/src/vulkan_android.h
@@ -1,10 +1,6 @@
#ifndef VULKAN_ANDROID_H_
#define VULKAN_ANDROID_H_ 1
-#ifdef __cplusplus
-extern "C" {
-#endif
-
/*
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
@@ -27,6 +23,11 @@
*/
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
#define VK_KHR_android_surface 1
struct ANativeWindow;
diff --git a/external/vulkancts/scripts/src/vulkan_core.h b/external/vulkancts/scripts/src/vulkan_core.h
old mode 100755
new mode 100644
index 47073a0..6da5489
--- a/external/vulkancts/scripts/src/vulkan_core.h
+++ b/external/vulkancts/scripts/src/vulkan_core.h
@@ -1,10 +1,6 @@
#ifndef VULKAN_CORE_H_
#define VULKAN_CORE_H_ 1
-#ifdef __cplusplus
-extern "C" {
-#endif
-
/*
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
@@ -27,6 +23,11 @@
*/
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
#define VK_VERSION_1_0 1
#include "vk_platform.h"
@@ -43,7 +44,7 @@
#define VK_VERSION_MINOR(version) (((uint32_t)(version) >> 12) & 0x3ff)
#define VK_VERSION_PATCH(version) ((uint32_t)(version) & 0xfff)
// Version of this file
-#define VK_HEADER_VERSION 108
+#define VK_HEADER_VERSION 123
#define VK_NULL_HANDLE 0
@@ -134,6 +135,8 @@
VK_ERROR_FRAGMENTED_POOL = -12,
VK_ERROR_OUT_OF_POOL_MEMORY = -1000069000,
VK_ERROR_INVALID_EXTERNAL_HANDLE = -1000072003,
+ VK_ERROR_FRAGMENTATION = -1000161000,
+ VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS = -1000257000,
VK_ERROR_SURFACE_LOST_KHR = -1000000000,
VK_ERROR_NATIVE_WINDOW_IN_USE_KHR = -1000000001,
VK_SUBOPTIMAL_KHR = 1000001003,
@@ -142,12 +145,13 @@
VK_ERROR_VALIDATION_FAILED_EXT = -1000011001,
VK_ERROR_INVALID_SHADER_NV = -1000012000,
VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT = -1000158000,
- VK_ERROR_FRAGMENTATION_EXT = -1000161000,
VK_ERROR_NOT_PERMITTED_EXT = -1000174001,
- VK_ERROR_INVALID_DEVICE_ADDRESS_EXT = -1000244000,
VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT = -1000255000,
VK_ERROR_OUT_OF_POOL_MEMORY_KHR = VK_ERROR_OUT_OF_POOL_MEMORY,
VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR = VK_ERROR_INVALID_EXTERNAL_HANDLE,
+ VK_ERROR_FRAGMENTATION_EXT = VK_ERROR_FRAGMENTATION,
+ VK_ERROR_INVALID_DEVICE_ADDRESS_EXT = VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS,
+ VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR = VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS,
VK_RESULT_BEGIN_RANGE = VK_ERROR_FRAGMENTED_POOL,
VK_RESULT_END_RANGE = VK_INCOMPLETE,
VK_RESULT_RANGE_SIZE = (VK_INCOMPLETE - VK_ERROR_FRAGMENTED_POOL + 1),
@@ -269,6 +273,56 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES = 1000168000,
VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT = 1000168001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES = 1000063000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES = 49,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES = 50,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES = 51,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES = 52,
+ VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO = 1000147000,
+ VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2 = 1000109000,
+ VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2 = 1000109001,
+ VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2 = 1000109002,
+ VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2 = 1000109003,
+ VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2 = 1000109004,
+ VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO = 1000109005,
+ VK_STRUCTURE_TYPE_SUBPASS_END_INFO = 1000109006,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES = 1000177000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES = 1000196000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES = 1000180000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES = 1000082000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES = 1000197000,
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO = 1000161000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES = 1000161001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES = 1000161002,
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO = 1000161003,
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT = 1000161004,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES = 1000199000,
+ VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE = 1000199001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES = 1000221000,
+ VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO = 1000246000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES = 1000130000,
+ VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO = 1000130001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES = 1000211000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES = 1000108000,
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO = 1000108001,
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO = 1000108002,
+ VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO = 1000108003,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES = 1000253000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES = 1000175000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES = 1000241000,
+ VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT = 1000241001,
+ VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT = 1000241002,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES = 1000261000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES = 1000207000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES = 1000207001,
+ VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO = 1000207002,
+ VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO = 1000207003,
+ VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO = 1000207004,
+ VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO = 1000207005,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES = 1000257000,
+ VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO = 1000244001,
+ VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO = 1000257002,
+ VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO = 1000257003,
+ VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO = 1000257004,
VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR = 1000001000,
VK_STRUCTURE_TYPE_PRESENT_INFO_KHR = 1000001001,
VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR = 1000060007,
@@ -307,6 +361,7 @@
VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV = 1000058000,
VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT = 1000061000,
VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN = 1000062000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT = 1000066000,
VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT = 1000067000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT = 1000067001,
VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073000,
@@ -327,7 +382,6 @@
VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT = 1000081000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT = 1000081001,
VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT = 1000081002,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR = 1000082000,
VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR = 1000084000,
VK_STRUCTURE_TYPE_OBJECT_TABLE_CREATE_INFO_NVX = 1000086000,
VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NVX = 1000086001,
@@ -351,23 +405,19 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT = 1000102000,
VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT = 1000102001,
VK_STRUCTURE_TYPE_HDR_METADATA_EXT = 1000105000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR = 1000108000,
- VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR = 1000108001,
- VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR = 1000108002,
- VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO_KHR = 1000108003,
- VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR = 1000109000,
- VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR = 1000109001,
- VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR = 1000109002,
- VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2_KHR = 1000109003,
- VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR = 1000109004,
- VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO_KHR = 1000109005,
- VK_STRUCTURE_TYPE_SUBPASS_END_INFO_KHR = 1000109006,
VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR = 1000111000,
VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR = 1000114000,
VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR = 1000114001,
VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR = 1000114002,
VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR = 1000115000,
VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR = 1000115001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR = 1000116000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR = 1000116001,
+ VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR = 1000116002,
+ VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR = 1000116003,
+ VK_STRUCTURE_TYPE_ACQUIRE_PROFILING_LOCK_INFO_KHR = 1000116004,
+ VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_KHR = 1000116005,
+ VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_DESCRIPTION_KHR = 1000116006,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR = 1000119000,
VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR = 1000119001,
VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR = 1000119002,
@@ -389,8 +439,6 @@
VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129003,
VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129004,
VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID = 1000129005,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT = 1000130000,
- VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT = 1000130001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT = 1000138000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT = 1000138001,
VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT = 1000138002,
@@ -400,12 +448,13 @@
VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT = 1000143002,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT = 1000143003,
VK_STRUCTURE_TYPE_MULTISAMPLE_PROPERTIES_EXT = 1000143004,
- VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR = 1000147000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT = 1000148000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT = 1000148001,
VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT = 1000148002,
VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV = 1000149000,
VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV = 1000152000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV = 1000154000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV = 1000154001,
VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT = 1000158000,
VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT = 1000158001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT = 1000158002,
@@ -414,11 +463,6 @@
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,
- VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT = 1000161000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT = 1000161001,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT = 1000161002,
- VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT = 1000161003,
- VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT = 1000161004,
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,
@@ -439,11 +483,9 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT = 1000170000,
VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT = 1000170001,
VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT = 1000174000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR = 1000177000,
VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT = 1000178000,
VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT = 1000178001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT = 1000178002,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR = 1000180000,
VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD = 1000183000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR = 1000181000,
VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT = 1000184000,
@@ -454,10 +496,6 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT = 1000190002,
VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP = 1000191000,
VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT = 1000192000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR = 1000196000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR = 1000197000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR = 1000199000,
- VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE_KHR = 1000199001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV = 1000201000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV = 1000202000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV = 1000202001,
@@ -467,14 +505,13 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV = 1000205002,
VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV = 1000206000,
VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV = 1000206001,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR = 1000207000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR = 1000207001,
- VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR = 1000207002,
- VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR = 1000207003,
- VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO_KHR = 1000207004,
- VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO_KHR = 1000207005,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS2_FEATURES_INTEL = 1000209000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR = 1000211000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL = 1000209000,
+ VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL = 1000210000,
+ VK_STRUCTURE_TYPE_INITIALIZE_PERFORMANCE_API_INFO_INTEL = 1000210001,
+ VK_STRUCTURE_TYPE_PERFORMANCE_MARKER_INFO_INTEL = 1000210002,
+ VK_STRUCTURE_TYPE_PERFORMANCE_STREAM_MARKER_INFO_INTEL = 1000210003,
+ VK_STRUCTURE_TYPE_PERFORMANCE_OVERRIDE_INFO_INTEL = 1000210004,
+ VK_STRUCTURE_TYPE_PERFORMANCE_CONFIGURATION_ACQUIRE_INFO_INTEL = 1000210005,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT = 1000212000,
VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD = 1000213000,
VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD = 1000213001,
@@ -483,16 +520,18 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT = 1000218000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT = 1000218001,
VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT = 1000218002,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT = 1000221000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT = 1000225000,
+ VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT = 1000225001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT = 1000225002,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD = 1000227000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD = 1000229000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT = 1000237000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT = 1000238000,
VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT = 1000238001,
VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR = 1000239000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV = 1000240000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT = 1000244000,
- VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT = 1000244001,
VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT = 1000244002,
- VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT = 1000246000,
VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT = 1000247000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV = 1000249000,
VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_NV = 1000249001,
@@ -502,20 +541,23 @@
VK_STRUCTURE_TYPE_FRAMEBUFFER_MIXED_SAMPLES_COMBINATION_NV = 1000250002,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT = 1000251000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT = 1000252000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR = 1000253000,
VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT = 1000255000,
VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT = 1000255002,
VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT = 1000255001,
VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT = 1000256000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT = 1000261000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT = 1000259000,
+ VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT = 1000259001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT = 1000259002,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT = 1000265000,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT = 1000276000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR = 1000269000,
VK_STRUCTURE_TYPE_PIPELINE_INFO_KHR = 1000269001,
VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_PROPERTIES_KHR = 1000269002,
VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR = 1000269003,
VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_STATISTIC_KHR = 1000269004,
VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR = 1000269005,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT = 1000276000,
+ 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_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,
@@ -551,9 +593,22 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO,
VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES,
VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES,
VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO,
VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES2_EXT = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES,
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO,
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO,
+ VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO_KHR = VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO,
+ VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2,
+ VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,
+ VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2,
+ VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2_KHR = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2,
+ VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2,
+ VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO_KHR = VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO,
+ VK_STRUCTURE_TYPE_SUBPASS_END_INFO_KHR = VK_STRUCTURE_TYPE_SUBPASS_END_INFO,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO,
VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES,
VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO,
@@ -565,11 +620,14 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES,
VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS,
VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES,
+ VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO,
VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR = VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2,
VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2,
VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2_KHR = VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2,
VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2,
VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2_KHR = VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2,
+ VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO,
VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,
VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO_KHR = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO,
VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO_KHR = VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO,
@@ -578,9 +636,41 @@
VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES_KHR = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES,
VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO,
VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO,
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES,
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO,
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES,
VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT_KHR = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES,
+ VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE_KHR = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES,
+ VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO,
+ VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO,
+ VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO_KHR = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO,
+ VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO_KHR = VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES,
+ VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT_KHR = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT,
+ VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT_KHR = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_ADDRESS_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT,
+ VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,
+ VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES,
+ VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_KHR = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,
+ VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO,
+ VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO_KHR = VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO,
+ VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES,
VK_STRUCTURE_TYPE_BEGIN_RANGE = VK_STRUCTURE_TYPE_APPLICATION_INFO,
VK_STRUCTURE_TYPE_END_RANGE = VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO,
VK_STRUCTURE_TYPE_RANGE_SIZE = (VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO - VK_STRUCTURE_TYPE_APPLICATION_INFO + 1),
@@ -835,6 +925,20 @@
VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG = 1000054005,
VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG = 1000054006,
VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG = 1000054007,
+ VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT = 1000066000,
+ VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT = 1000066001,
+ VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT = 1000066002,
+ VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT = 1000066003,
+ VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT = 1000066004,
+ VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT = 1000066005,
+ VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT = 1000066006,
+ VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT = 1000066007,
+ VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT = 1000066008,
+ VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT = 1000066009,
+ VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT = 1000066010,
+ 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_G8B8G8R8_422_UNORM_KHR = VK_FORMAT_G8B8G8R8_422_UNORM,
VK_FORMAT_B8G8R8G8_422_UNORM_KHR = VK_FORMAT_B8G8R8G8_422_UNORM,
VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR = VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM,
@@ -912,7 +1016,9 @@
VK_QUERY_TYPE_PIPELINE_STATISTICS = 1,
VK_QUERY_TYPE_TIMESTAMP = 2,
VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT = 1000028004,
+ VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR = 1000116000,
VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV = 1000165000,
+ VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL = 1000210000,
VK_QUERY_TYPE_BEGIN_RANGE = VK_QUERY_TYPE_OCCLUSION,
VK_QUERY_TYPE_END_RANGE = VK_QUERY_TYPE_TIMESTAMP,
VK_QUERY_TYPE_RANGE_SIZE = (VK_QUERY_TYPE_TIMESTAMP - VK_QUERY_TYPE_OCCLUSION + 1),
@@ -940,12 +1046,20 @@
VK_IMAGE_LAYOUT_PREINITIALIZED = 8,
VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL = 1000117000,
VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL = 1000117001,
+ VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL = 1000241000,
+ VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL = 1000241001,
+ 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_SHARED_PRESENT_KHR = 1000111000,
VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV = 1000164003,
VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT = 1000218000,
VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL,
VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL,
+ VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
+ VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
+ VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL,
+ VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL,
VK_IMAGE_LAYOUT_BEGIN_RANGE = VK_IMAGE_LAYOUT_UNDEFINED,
VK_IMAGE_LAYOUT_END_RANGE = VK_IMAGE_LAYOUT_PREINITIALIZED,
VK_IMAGE_LAYOUT_RANGE_SIZE = (VK_IMAGE_LAYOUT_PREINITIALIZED - VK_IMAGE_LAYOUT_UNDEFINED + 1),
@@ -1180,6 +1294,7 @@
VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV = 1000164004,
VK_DYNAMIC_STATE_VIEWPORT_COARSE_SAMPLE_ORDER_NV = 1000164006,
VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV = 1000205001,
+ VK_DYNAMIC_STATE_LINE_STIPPLE_EXT = 1000259000,
VK_DYNAMIC_STATE_BEGIN_RANGE = VK_DYNAMIC_STATE_VIEWPORT,
VK_DYNAMIC_STATE_END_RANGE = VK_DYNAMIC_STATE_STENCIL_REFERENCE,
VK_DYNAMIC_STATE_RANGE_SIZE = (VK_DYNAMIC_STATE_STENCIL_REFERENCE - VK_DYNAMIC_STATE_VIEWPORT + 1),
@@ -1212,6 +1327,7 @@
VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE = 2,
VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER = 3,
VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE = 4,
+ VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE_KHR = VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,
VK_SAMPLER_ADDRESS_MODE_BEGIN_RANGE = VK_SAMPLER_ADDRESS_MODE_REPEAT,
VK_SAMPLER_ADDRESS_MODE_END_RANGE = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,
VK_SAMPLER_ADDRESS_MODE_RANGE_SIZE = (VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER - VK_SAMPLER_ADDRESS_MODE_REPEAT + 1),
@@ -1348,6 +1464,7 @@
VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT = 1000128000,
VK_OBJECT_TYPE_VALIDATION_CACHE_EXT = 1000160000,
VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV = 1000165000,
+ VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL = 1000210000,
VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR = VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE,
VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_KHR = VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION,
VK_OBJECT_TYPE_BEGIN_RANGE = VK_OBJECT_TYPE_UNKNOWN,
@@ -1390,11 +1507,12 @@
VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT = 0x00200000,
VK_FORMAT_FEATURE_DISJOINT_BIT = 0x00400000,
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_SAMPLED_IMAGE_FILTER_MINMAX_BIT_EXT = 0x00010000,
VK_FORMAT_FEATURE_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x01000000,
VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT,
VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR = VK_FORMAT_FEATURE_TRANSFER_DST_BIT,
+ VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT_EXT = VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT,
VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT_KHR = VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT,
VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT_KHR = VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT,
VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT_KHR = VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT,
@@ -1477,6 +1595,8 @@
VK_MEMORY_PROPERTY_HOST_CACHED_BIT = 0x00000008,
VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT = 0x00000010,
VK_MEMORY_PROPERTY_PROTECTED_BIT = 0x00000020,
+ VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD = 0x00000040,
+ VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD = 0x00000080,
VK_MEMORY_PROPERTY_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkMemoryPropertyFlagBits;
typedef VkFlags VkMemoryPropertyFlags;
@@ -1600,7 +1720,9 @@
VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT = 0x00000002,
VK_BUFFER_CREATE_SPARSE_ALIASED_BIT = 0x00000004,
VK_BUFFER_CREATE_PROTECTED_BIT = 0x00000008,
- VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_EXT = 0x00000010,
+ VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT = 0x00000010,
+ VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_EXT = VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT,
+ VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR = VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT,
VK_BUFFER_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkBufferCreateFlagBits;
typedef VkFlags VkBufferCreateFlags;
@@ -1615,11 +1737,13 @@
VK_BUFFER_USAGE_INDEX_BUFFER_BIT = 0x00000040,
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_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT = 0x00000800,
VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT = 0x00001000,
VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT = 0x00000200,
VK_BUFFER_USAGE_RAY_TRACING_BIT_NV = 0x00000400,
- VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT = 0x00020000,
+ VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
+ VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
VK_BUFFER_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkBufferUsageFlagBits;
typedef VkFlags VkBufferUsageFlags;
@@ -1630,6 +1754,10 @@
VK_IMAGE_VIEW_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkImageViewCreateFlagBits;
typedef VkFlags VkImageViewCreateFlags;
+
+typedef enum VkShaderModuleCreateFlagBits {
+ VK_SHADER_MODULE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
+} VkShaderModuleCreateFlagBits;
typedef VkFlags VkShaderModuleCreateFlags;
typedef VkFlags VkPipelineCacheCreateFlags;
@@ -1647,6 +1775,12 @@
VK_PIPELINE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkPipelineCreateFlagBits;
typedef VkFlags VkPipelineCreateFlags;
+
+typedef enum VkPipelineShaderStageCreateFlagBits {
+ VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT = 0x00000001,
+ VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT = 0x00000002,
+ VK_PIPELINE_SHADER_STAGE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
+} VkPipelineShaderStageCreateFlagBits;
typedef VkFlags VkPipelineShaderStageCreateFlags;
typedef enum VkShaderStageFlagBits {
@@ -1706,25 +1840,32 @@
typedef VkFlags VkSamplerCreateFlags;
typedef enum VkDescriptorSetLayoutCreateFlagBits {
+ VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT = 0x00000002,
VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR = 0x00000001,
- VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT = 0x00000002,
+ VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT,
VK_DESCRIPTOR_SET_LAYOUT_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkDescriptorSetLayoutCreateFlagBits;
typedef VkFlags VkDescriptorSetLayoutCreateFlags;
typedef enum VkDescriptorPoolCreateFlagBits {
VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT = 0x00000001,
- VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT = 0x00000002,
+ VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT = 0x00000002,
+ VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT = VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT,
VK_DESCRIPTOR_POOL_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkDescriptorPoolCreateFlagBits;
typedef VkFlags VkDescriptorPoolCreateFlags;
typedef VkFlags VkDescriptorPoolResetFlags;
typedef enum VkFramebufferCreateFlagBits {
- VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR = 0x00000001,
+ VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT = 0x00000001,
+ VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR = VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,
VK_FRAMEBUFFER_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkFramebufferCreateFlagBits;
typedef VkFlags VkFramebufferCreateFlags;
+
+typedef enum VkRenderPassCreateFlagBits {
+ VK_RENDER_PASS_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
+} VkRenderPassCreateFlagBits;
typedef VkFlags VkRenderPassCreateFlags;
typedef enum VkAttachmentDescriptionFlagBits {
@@ -1820,7 +1961,8 @@
typedef enum VkStencilFaceFlagBits {
VK_STENCIL_FACE_FRONT_BIT = 0x00000001,
VK_STENCIL_FACE_BACK_BIT = 0x00000002,
- VK_STENCIL_FRONT_AND_BACK = 0x00000003,
+ VK_STENCIL_FACE_FRONT_AND_BACK = 0x00000003,
+ VK_STENCIL_FRONT_AND_BACK = VK_STENCIL_FACE_FRONT_AND_BACK,
VK_STENCIL_FACE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkStencilFaceFlagBits;
typedef VkFlags VkStencilFaceFlags;
@@ -3987,7 +4129,11 @@
typedef enum VkMemoryAllocateFlagBits {
VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT = 0x00000001,
+ VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT = 0x00000002,
+ VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT = 0x00000004,
VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT_KHR = VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT,
+ VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT,
+ VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT,
VK_MEMORY_ALLOCATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkMemoryAllocateFlagBits;
typedef VkFlags VkMemoryAllocateFlags;
@@ -4754,6 +4900,760 @@
#endif
+#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
+
+typedef uint64_t VkDeviceAddress;
+#define VK_MAX_DRIVER_NAME_SIZE 256
+#define VK_MAX_DRIVER_INFO_SIZE 256
+
+typedef enum VkDriverId {
+ VK_DRIVER_ID_AMD_PROPRIETARY = 1,
+ VK_DRIVER_ID_AMD_OPEN_SOURCE = 2,
+ VK_DRIVER_ID_MESA_RADV = 3,
+ VK_DRIVER_ID_NVIDIA_PROPRIETARY = 4,
+ VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS = 5,
+ VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA = 6,
+ VK_DRIVER_ID_IMAGINATION_PROPRIETARY = 7,
+ VK_DRIVER_ID_QUALCOMM_PROPRIETARY = 8,
+ VK_DRIVER_ID_ARM_PROPRIETARY = 9,
+ VK_DRIVER_ID_GOOGLE_SWIFTSHADER = 10,
+ VK_DRIVER_ID_GGP_PROPRIETARY = 11,
+ VK_DRIVER_ID_BROADCOM_PROPRIETARY = 12,
+ 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,
+ VK_DRIVER_ID_NVIDIA_PROPRIETARY_KHR = VK_DRIVER_ID_NVIDIA_PROPRIETARY,
+ VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS_KHR = VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS,
+ VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA_KHR = VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA,
+ VK_DRIVER_ID_IMAGINATION_PROPRIETARY_KHR = VK_DRIVER_ID_IMAGINATION_PROPRIETARY,
+ VK_DRIVER_ID_QUALCOMM_PROPRIETARY_KHR = VK_DRIVER_ID_QUALCOMM_PROPRIETARY,
+ VK_DRIVER_ID_ARM_PROPRIETARY_KHR = VK_DRIVER_ID_ARM_PROPRIETARY,
+ VK_DRIVER_ID_GOOGLE_SWIFTSHADER_KHR = VK_DRIVER_ID_GOOGLE_SWIFTSHADER,
+ VK_DRIVER_ID_GGP_PROPRIETARY_KHR = VK_DRIVER_ID_GGP_PROPRIETARY,
+ VK_DRIVER_ID_BROADCOM_PROPRIETARY_KHR = VK_DRIVER_ID_BROADCOM_PROPRIETARY,
+ VK_DRIVER_ID_BEGIN_RANGE = VK_DRIVER_ID_AMD_PROPRIETARY,
+ VK_DRIVER_ID_END_RANGE = VK_DRIVER_ID_BROADCOM_PROPRIETARY,
+ VK_DRIVER_ID_RANGE_SIZE = (VK_DRIVER_ID_BROADCOM_PROPRIETARY - VK_DRIVER_ID_AMD_PROPRIETARY + 1),
+ VK_DRIVER_ID_MAX_ENUM = 0x7FFFFFFF
+} VkDriverId;
+
+typedef enum VkShaderFloatControlsIndependence {
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY = 0,
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL = 1,
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE = 2,
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY_KHR = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY,
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL_KHR = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL,
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE_KHR = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE,
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_BEGIN_RANGE = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY,
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_END_RANGE = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE,
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_RANGE_SIZE = (VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE - VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY + 1),
+ VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_MAX_ENUM = 0x7FFFFFFF
+} VkShaderFloatControlsIndependence;
+
+typedef enum VkSamplerReductionMode {
+ VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE = 0,
+ VK_SAMPLER_REDUCTION_MODE_MIN = 1,
+ VK_SAMPLER_REDUCTION_MODE_MAX = 2,
+ VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT = VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE,
+ VK_SAMPLER_REDUCTION_MODE_MIN_EXT = VK_SAMPLER_REDUCTION_MODE_MIN,
+ VK_SAMPLER_REDUCTION_MODE_MAX_EXT = VK_SAMPLER_REDUCTION_MODE_MAX,
+ VK_SAMPLER_REDUCTION_MODE_BEGIN_RANGE = VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE,
+ VK_SAMPLER_REDUCTION_MODE_END_RANGE = VK_SAMPLER_REDUCTION_MODE_MAX,
+ VK_SAMPLER_REDUCTION_MODE_RANGE_SIZE = (VK_SAMPLER_REDUCTION_MODE_MAX - VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE + 1),
+ VK_SAMPLER_REDUCTION_MODE_MAX_ENUM = 0x7FFFFFFF
+} VkSamplerReductionMode;
+
+typedef enum VkSemaphoreType {
+ VK_SEMAPHORE_TYPE_BINARY = 0,
+ VK_SEMAPHORE_TYPE_TIMELINE = 1,
+ VK_SEMAPHORE_TYPE_BINARY_KHR = VK_SEMAPHORE_TYPE_BINARY,
+ VK_SEMAPHORE_TYPE_TIMELINE_KHR = VK_SEMAPHORE_TYPE_TIMELINE,
+ VK_SEMAPHORE_TYPE_BEGIN_RANGE = VK_SEMAPHORE_TYPE_BINARY,
+ VK_SEMAPHORE_TYPE_END_RANGE = VK_SEMAPHORE_TYPE_TIMELINE,
+ VK_SEMAPHORE_TYPE_RANGE_SIZE = (VK_SEMAPHORE_TYPE_TIMELINE - VK_SEMAPHORE_TYPE_BINARY + 1),
+ VK_SEMAPHORE_TYPE_MAX_ENUM = 0x7FFFFFFF
+} VkSemaphoreType;
+
+typedef enum VkResolveModeFlagBits {
+ VK_RESOLVE_MODE_NONE = 0,
+ VK_RESOLVE_MODE_SAMPLE_ZERO_BIT = 0x00000001,
+ VK_RESOLVE_MODE_AVERAGE_BIT = 0x00000002,
+ VK_RESOLVE_MODE_MIN_BIT = 0x00000004,
+ VK_RESOLVE_MODE_MAX_BIT = 0x00000008,
+ VK_RESOLVE_MODE_NONE_KHR = VK_RESOLVE_MODE_NONE,
+ VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT,
+ VK_RESOLVE_MODE_AVERAGE_BIT_KHR = VK_RESOLVE_MODE_AVERAGE_BIT,
+ VK_RESOLVE_MODE_MIN_BIT_KHR = VK_RESOLVE_MODE_MIN_BIT,
+ VK_RESOLVE_MODE_MAX_BIT_KHR = VK_RESOLVE_MODE_MAX_BIT,
+ VK_RESOLVE_MODE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
+} VkResolveModeFlagBits;
+typedef VkFlags VkResolveModeFlags;
+
+typedef enum VkDescriptorBindingFlagBits {
+ VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT = 0x00000001,
+ VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT = 0x00000002,
+ VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT = 0x00000004,
+ VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT = 0x00000008,
+ VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT = VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT,
+ VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT = VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT,
+ VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT = VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT,
+ VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT = VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT,
+ VK_DESCRIPTOR_BINDING_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
+} VkDescriptorBindingFlagBits;
+typedef VkFlags VkDescriptorBindingFlags;
+
+typedef enum VkSemaphoreWaitFlagBits {
+ VK_SEMAPHORE_WAIT_ANY_BIT = 0x00000001,
+ VK_SEMAPHORE_WAIT_ANY_BIT_KHR = VK_SEMAPHORE_WAIT_ANY_BIT,
+ VK_SEMAPHORE_WAIT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
+} VkSemaphoreWaitFlagBits;
+typedef VkFlags VkSemaphoreWaitFlags;
+typedef struct VkPhysicalDeviceVulkan11Features {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 storageBuffer16BitAccess;
+ VkBool32 uniformAndStorageBuffer16BitAccess;
+ VkBool32 storagePushConstant16;
+ VkBool32 storageInputOutput16;
+ VkBool32 multiview;
+ VkBool32 multiviewGeometryShader;
+ VkBool32 multiviewTessellationShader;
+ VkBool32 variablePointersStorageBuffer;
+ VkBool32 variablePointers;
+ VkBool32 protectedMemory;
+ VkBool32 samplerYcbcrConversion;
+ VkBool32 shaderDrawParameters;
+} VkPhysicalDeviceVulkan11Features;
+
+typedef struct VkPhysicalDeviceVulkan11Properties {
+ VkStructureType sType;
+ void* pNext;
+ uint8_t deviceUUID[VK_UUID_SIZE];
+ uint8_t driverUUID[VK_UUID_SIZE];
+ uint8_t deviceLUID[VK_LUID_SIZE];
+ uint32_t deviceNodeMask;
+ VkBool32 deviceLUIDValid;
+ uint32_t subgroupSize;
+ VkShaderStageFlags subgroupSupportedStages;
+ VkSubgroupFeatureFlags subgroupSupportedOperations;
+ VkBool32 subgroupQuadOperationsInAllStages;
+ VkPointClippingBehavior pointClippingBehavior;
+ uint32_t maxMultiviewViewCount;
+ uint32_t maxMultiviewInstanceIndex;
+ VkBool32 protectedNoFault;
+ uint32_t maxPerSetDescriptors;
+ VkDeviceSize maxMemoryAllocationSize;
+} VkPhysicalDeviceVulkan11Properties;
+
+typedef struct VkPhysicalDeviceVulkan12Features {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 samplerMirrorClampToEdge;
+ VkBool32 drawIndirectCount;
+ VkBool32 storageBuffer8BitAccess;
+ VkBool32 uniformAndStorageBuffer8BitAccess;
+ VkBool32 storagePushConstant8;
+ VkBool32 shaderBufferInt64Atomics;
+ VkBool32 shaderSharedInt64Atomics;
+ VkBool32 shaderFloat16;
+ VkBool32 shaderInt8;
+ VkBool32 descriptorIndexing;
+ VkBool32 shaderInputAttachmentArrayDynamicIndexing;
+ VkBool32 shaderUniformTexelBufferArrayDynamicIndexing;
+ VkBool32 shaderStorageTexelBufferArrayDynamicIndexing;
+ VkBool32 shaderUniformBufferArrayNonUniformIndexing;
+ VkBool32 shaderSampledImageArrayNonUniformIndexing;
+ VkBool32 shaderStorageBufferArrayNonUniformIndexing;
+ VkBool32 shaderStorageImageArrayNonUniformIndexing;
+ VkBool32 shaderInputAttachmentArrayNonUniformIndexing;
+ VkBool32 shaderUniformTexelBufferArrayNonUniformIndexing;
+ VkBool32 shaderStorageTexelBufferArrayNonUniformIndexing;
+ VkBool32 descriptorBindingUniformBufferUpdateAfterBind;
+ VkBool32 descriptorBindingSampledImageUpdateAfterBind;
+ VkBool32 descriptorBindingStorageImageUpdateAfterBind;
+ VkBool32 descriptorBindingStorageBufferUpdateAfterBind;
+ VkBool32 descriptorBindingUniformTexelBufferUpdateAfterBind;
+ VkBool32 descriptorBindingStorageTexelBufferUpdateAfterBind;
+ VkBool32 descriptorBindingUpdateUnusedWhilePending;
+ VkBool32 descriptorBindingPartiallyBound;
+ VkBool32 descriptorBindingVariableDescriptorCount;
+ VkBool32 runtimeDescriptorArray;
+ VkBool32 samplerFilterMinmax;
+ VkBool32 scalarBlockLayout;
+ VkBool32 imagelessFramebuffer;
+ VkBool32 uniformBufferStandardLayout;
+ VkBool32 shaderSubgroupExtendedTypes;
+ VkBool32 separateDepthStencilLayouts;
+ VkBool32 hostQueryReset;
+ VkBool32 timelineSemaphore;
+ VkBool32 bufferDeviceAddress;
+ VkBool32 bufferDeviceAddressCaptureReplay;
+ VkBool32 bufferDeviceAddressMultiDevice;
+ VkBool32 vulkanMemoryModel;
+ VkBool32 vulkanMemoryModelDeviceScope;
+ VkBool32 vulkanMemoryModelAvailabilityVisibilityChains;
+ VkBool32 shaderOutputViewportIndex;
+ VkBool32 shaderOutputLayer;
+ VkBool32 subgroupBroadcastDynamicId;
+} VkPhysicalDeviceVulkan12Features;
+
+typedef struct VkConformanceVersion {
+ uint8_t major;
+ uint8_t minor;
+ uint8_t subminor;
+ uint8_t patch;
+} VkConformanceVersion;
+
+typedef struct VkPhysicalDeviceVulkan12Properties {
+ VkStructureType sType;
+ void* pNext;
+ VkDriverId driverID;
+ char driverName[VK_MAX_DRIVER_NAME_SIZE];
+ char driverInfo[VK_MAX_DRIVER_INFO_SIZE];
+ VkConformanceVersion conformanceVersion;
+ VkShaderFloatControlsIndependence denormBehaviorIndependence;
+ VkShaderFloatControlsIndependence roundingModeIndependence;
+ VkBool32 shaderSignedZeroInfNanPreserveFloat16;
+ VkBool32 shaderSignedZeroInfNanPreserveFloat32;
+ VkBool32 shaderSignedZeroInfNanPreserveFloat64;
+ VkBool32 shaderDenormPreserveFloat16;
+ VkBool32 shaderDenormPreserveFloat32;
+ VkBool32 shaderDenormPreserveFloat64;
+ VkBool32 shaderDenormFlushToZeroFloat16;
+ VkBool32 shaderDenormFlushToZeroFloat32;
+ VkBool32 shaderDenormFlushToZeroFloat64;
+ VkBool32 shaderRoundingModeRTEFloat16;
+ VkBool32 shaderRoundingModeRTEFloat32;
+ VkBool32 shaderRoundingModeRTEFloat64;
+ VkBool32 shaderRoundingModeRTZFloat16;
+ VkBool32 shaderRoundingModeRTZFloat32;
+ VkBool32 shaderRoundingModeRTZFloat64;
+ uint32_t maxUpdateAfterBindDescriptorsInAllPools;
+ VkBool32 shaderUniformBufferArrayNonUniformIndexingNative;
+ VkBool32 shaderSampledImageArrayNonUniformIndexingNative;
+ VkBool32 shaderStorageBufferArrayNonUniformIndexingNative;
+ VkBool32 shaderStorageImageArrayNonUniformIndexingNative;
+ VkBool32 shaderInputAttachmentArrayNonUniformIndexingNative;
+ VkBool32 robustBufferAccessUpdateAfterBind;
+ VkBool32 quadDivergentImplicitLod;
+ uint32_t maxPerStageDescriptorUpdateAfterBindSamplers;
+ uint32_t maxPerStageDescriptorUpdateAfterBindUniformBuffers;
+ uint32_t maxPerStageDescriptorUpdateAfterBindStorageBuffers;
+ uint32_t maxPerStageDescriptorUpdateAfterBindSampledImages;
+ uint32_t maxPerStageDescriptorUpdateAfterBindStorageImages;
+ uint32_t maxPerStageDescriptorUpdateAfterBindInputAttachments;
+ uint32_t maxPerStageUpdateAfterBindResources;
+ uint32_t maxDescriptorSetUpdateAfterBindSamplers;
+ uint32_t maxDescriptorSetUpdateAfterBindUniformBuffers;
+ uint32_t maxDescriptorSetUpdateAfterBindUniformBuffersDynamic;
+ uint32_t maxDescriptorSetUpdateAfterBindStorageBuffers;
+ uint32_t maxDescriptorSetUpdateAfterBindStorageBuffersDynamic;
+ uint32_t maxDescriptorSetUpdateAfterBindSampledImages;
+ uint32_t maxDescriptorSetUpdateAfterBindStorageImages;
+ uint32_t maxDescriptorSetUpdateAfterBindInputAttachments;
+ VkResolveModeFlags supportedDepthResolveModes;
+ VkResolveModeFlags supportedStencilResolveModes;
+ VkBool32 independentResolveNone;
+ VkBool32 independentResolve;
+ VkBool32 filterMinmaxSingleComponentFormats;
+ VkBool32 filterMinmaxImageComponentMapping;
+ uint64_t maxTimelineSemaphoreValueDifference;
+ VkSampleCountFlags framebufferIntegerColorSampleCounts;
+} VkPhysicalDeviceVulkan12Properties;
+
+typedef struct VkImageFormatListCreateInfo {
+ VkStructureType sType;
+ const void* pNext;
+ uint32_t viewFormatCount;
+ const VkFormat* pViewFormats;
+} VkImageFormatListCreateInfo;
+
+typedef struct VkAttachmentDescription2 {
+ VkStructureType sType;
+ const void* pNext;
+ VkAttachmentDescriptionFlags flags;
+ VkFormat format;
+ VkSampleCountFlagBits samples;
+ VkAttachmentLoadOp loadOp;
+ VkAttachmentStoreOp storeOp;
+ VkAttachmentLoadOp stencilLoadOp;
+ VkAttachmentStoreOp stencilStoreOp;
+ VkImageLayout initialLayout;
+ VkImageLayout finalLayout;
+} VkAttachmentDescription2;
+
+typedef struct VkAttachmentReference2 {
+ VkStructureType sType;
+ const void* pNext;
+ uint32_t attachment;
+ VkImageLayout layout;
+ VkImageAspectFlags aspectMask;
+} VkAttachmentReference2;
+
+typedef struct VkSubpassDescription2 {
+ VkStructureType sType;
+ const void* pNext;
+ VkSubpassDescriptionFlags flags;
+ VkPipelineBindPoint pipelineBindPoint;
+ uint32_t viewMask;
+ uint32_t inputAttachmentCount;
+ const VkAttachmentReference2* pInputAttachments;
+ uint32_t colorAttachmentCount;
+ const VkAttachmentReference2* pColorAttachments;
+ const VkAttachmentReference2* pResolveAttachments;
+ const VkAttachmentReference2* pDepthStencilAttachment;
+ uint32_t preserveAttachmentCount;
+ const uint32_t* pPreserveAttachments;
+} VkSubpassDescription2;
+
+typedef struct VkSubpassDependency2 {
+ VkStructureType sType;
+ const void* pNext;
+ uint32_t srcSubpass;
+ uint32_t dstSubpass;
+ VkPipelineStageFlags srcStageMask;
+ VkPipelineStageFlags dstStageMask;
+ VkAccessFlags srcAccessMask;
+ VkAccessFlags dstAccessMask;
+ VkDependencyFlags dependencyFlags;
+ int32_t viewOffset;
+} VkSubpassDependency2;
+
+typedef struct VkRenderPassCreateInfo2 {
+ VkStructureType sType;
+ const void* pNext;
+ VkRenderPassCreateFlags flags;
+ uint32_t attachmentCount;
+ const VkAttachmentDescription2* pAttachments;
+ uint32_t subpassCount;
+ const VkSubpassDescription2* pSubpasses;
+ uint32_t dependencyCount;
+ const VkSubpassDependency2* pDependencies;
+ uint32_t correlatedViewMaskCount;
+ const uint32_t* pCorrelatedViewMasks;
+} VkRenderPassCreateInfo2;
+
+typedef struct VkSubpassBeginInfo {
+ VkStructureType sType;
+ const void* pNext;
+ VkSubpassContents contents;
+} VkSubpassBeginInfo;
+
+typedef struct VkSubpassEndInfo {
+ VkStructureType sType;
+ const void* pNext;
+} VkSubpassEndInfo;
+
+typedef struct VkPhysicalDevice8BitStorageFeatures {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 storageBuffer8BitAccess;
+ VkBool32 uniformAndStorageBuffer8BitAccess;
+ VkBool32 storagePushConstant8;
+} VkPhysicalDevice8BitStorageFeatures;
+
+typedef struct VkPhysicalDeviceDriverProperties {
+ VkStructureType sType;
+ void* pNext;
+ VkDriverId driverID;
+ char driverName[VK_MAX_DRIVER_NAME_SIZE];
+ char driverInfo[VK_MAX_DRIVER_INFO_SIZE];
+ VkConformanceVersion conformanceVersion;
+} VkPhysicalDeviceDriverProperties;
+
+typedef struct VkPhysicalDeviceShaderAtomicInt64Features {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 shaderBufferInt64Atomics;
+ VkBool32 shaderSharedInt64Atomics;
+} VkPhysicalDeviceShaderAtomicInt64Features;
+
+typedef struct VkPhysicalDeviceShaderFloat16Int8Features {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 shaderFloat16;
+ VkBool32 shaderInt8;
+} VkPhysicalDeviceShaderFloat16Int8Features;
+
+typedef struct VkPhysicalDeviceFloatControlsProperties {
+ VkStructureType sType;
+ void* pNext;
+ VkShaderFloatControlsIndependence denormBehaviorIndependence;
+ VkShaderFloatControlsIndependence roundingModeIndependence;
+ VkBool32 shaderSignedZeroInfNanPreserveFloat16;
+ VkBool32 shaderSignedZeroInfNanPreserveFloat32;
+ VkBool32 shaderSignedZeroInfNanPreserveFloat64;
+ VkBool32 shaderDenormPreserveFloat16;
+ VkBool32 shaderDenormPreserveFloat32;
+ VkBool32 shaderDenormPreserveFloat64;
+ VkBool32 shaderDenormFlushToZeroFloat16;
+ VkBool32 shaderDenormFlushToZeroFloat32;
+ VkBool32 shaderDenormFlushToZeroFloat64;
+ VkBool32 shaderRoundingModeRTEFloat16;
+ VkBool32 shaderRoundingModeRTEFloat32;
+ VkBool32 shaderRoundingModeRTEFloat64;
+ VkBool32 shaderRoundingModeRTZFloat16;
+ VkBool32 shaderRoundingModeRTZFloat32;
+ VkBool32 shaderRoundingModeRTZFloat64;
+} VkPhysicalDeviceFloatControlsProperties;
+
+typedef struct VkDescriptorSetLayoutBindingFlagsCreateInfo {
+ VkStructureType sType;
+ const void* pNext;
+ uint32_t bindingCount;
+ const VkDescriptorBindingFlags* pBindingFlags;
+} VkDescriptorSetLayoutBindingFlagsCreateInfo;
+
+typedef struct VkPhysicalDeviceDescriptorIndexingFeatures {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 shaderInputAttachmentArrayDynamicIndexing;
+ VkBool32 shaderUniformTexelBufferArrayDynamicIndexing;
+ VkBool32 shaderStorageTexelBufferArrayDynamicIndexing;
+ VkBool32 shaderUniformBufferArrayNonUniformIndexing;
+ VkBool32 shaderSampledImageArrayNonUniformIndexing;
+ VkBool32 shaderStorageBufferArrayNonUniformIndexing;
+ VkBool32 shaderStorageImageArrayNonUniformIndexing;
+ VkBool32 shaderInputAttachmentArrayNonUniformIndexing;
+ VkBool32 shaderUniformTexelBufferArrayNonUniformIndexing;
+ VkBool32 shaderStorageTexelBufferArrayNonUniformIndexing;
+ VkBool32 descriptorBindingUniformBufferUpdateAfterBind;
+ VkBool32 descriptorBindingSampledImageUpdateAfterBind;
+ VkBool32 descriptorBindingStorageImageUpdateAfterBind;
+ VkBool32 descriptorBindingStorageBufferUpdateAfterBind;
+ VkBool32 descriptorBindingUniformTexelBufferUpdateAfterBind;
+ VkBool32 descriptorBindingStorageTexelBufferUpdateAfterBind;
+ VkBool32 descriptorBindingUpdateUnusedWhilePending;
+ VkBool32 descriptorBindingPartiallyBound;
+ VkBool32 descriptorBindingVariableDescriptorCount;
+ VkBool32 runtimeDescriptorArray;
+} VkPhysicalDeviceDescriptorIndexingFeatures;
+
+typedef struct VkPhysicalDeviceDescriptorIndexingProperties {
+ VkStructureType sType;
+ void* pNext;
+ uint32_t maxUpdateAfterBindDescriptorsInAllPools;
+ VkBool32 shaderUniformBufferArrayNonUniformIndexingNative;
+ VkBool32 shaderSampledImageArrayNonUniformIndexingNative;
+ VkBool32 shaderStorageBufferArrayNonUniformIndexingNative;
+ VkBool32 shaderStorageImageArrayNonUniformIndexingNative;
+ VkBool32 shaderInputAttachmentArrayNonUniformIndexingNative;
+ VkBool32 robustBufferAccessUpdateAfterBind;
+ VkBool32 quadDivergentImplicitLod;
+ uint32_t maxPerStageDescriptorUpdateAfterBindSamplers;
+ uint32_t maxPerStageDescriptorUpdateAfterBindUniformBuffers;
+ uint32_t maxPerStageDescriptorUpdateAfterBindStorageBuffers;
+ uint32_t maxPerStageDescriptorUpdateAfterBindSampledImages;
+ uint32_t maxPerStageDescriptorUpdateAfterBindStorageImages;
+ uint32_t maxPerStageDescriptorUpdateAfterBindInputAttachments;
+ uint32_t maxPerStageUpdateAfterBindResources;
+ uint32_t maxDescriptorSetUpdateAfterBindSamplers;
+ uint32_t maxDescriptorSetUpdateAfterBindUniformBuffers;
+ uint32_t maxDescriptorSetUpdateAfterBindUniformBuffersDynamic;
+ uint32_t maxDescriptorSetUpdateAfterBindStorageBuffers;
+ uint32_t maxDescriptorSetUpdateAfterBindStorageBuffersDynamic;
+ uint32_t maxDescriptorSetUpdateAfterBindSampledImages;
+ uint32_t maxDescriptorSetUpdateAfterBindStorageImages;
+ uint32_t maxDescriptorSetUpdateAfterBindInputAttachments;
+} VkPhysicalDeviceDescriptorIndexingProperties;
+
+typedef struct VkDescriptorSetVariableDescriptorCountAllocateInfo {
+ VkStructureType sType;
+ const void* pNext;
+ uint32_t descriptorSetCount;
+ const uint32_t* pDescriptorCounts;
+} VkDescriptorSetVariableDescriptorCountAllocateInfo;
+
+typedef struct VkDescriptorSetVariableDescriptorCountLayoutSupport {
+ VkStructureType sType;
+ void* pNext;
+ uint32_t maxVariableDescriptorCount;
+} VkDescriptorSetVariableDescriptorCountLayoutSupport;
+
+typedef struct VkSubpassDescriptionDepthStencilResolve {
+ VkStructureType sType;
+ const void* pNext;
+ VkResolveModeFlagBits depthResolveMode;
+ VkResolveModeFlagBits stencilResolveMode;
+ const VkAttachmentReference2* pDepthStencilResolveAttachment;
+} VkSubpassDescriptionDepthStencilResolve;
+
+typedef struct VkPhysicalDeviceDepthStencilResolveProperties {
+ VkStructureType sType;
+ void* pNext;
+ VkResolveModeFlags supportedDepthResolveModes;
+ VkResolveModeFlags supportedStencilResolveModes;
+ VkBool32 independentResolveNone;
+ VkBool32 independentResolve;
+} VkPhysicalDeviceDepthStencilResolveProperties;
+
+typedef struct VkPhysicalDeviceScalarBlockLayoutFeatures {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 scalarBlockLayout;
+} VkPhysicalDeviceScalarBlockLayoutFeatures;
+
+typedef struct VkImageStencilUsageCreateInfo {
+ VkStructureType sType;
+ const void* pNext;
+ VkImageUsageFlags stencilUsage;
+} VkImageStencilUsageCreateInfo;
+
+typedef struct VkSamplerReductionModeCreateInfo {
+ VkStructureType sType;
+ const void* pNext;
+ VkSamplerReductionMode reductionMode;
+} VkSamplerReductionModeCreateInfo;
+
+typedef struct VkPhysicalDeviceSamplerFilterMinmaxProperties {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 filterMinmaxSingleComponentFormats;
+ VkBool32 filterMinmaxImageComponentMapping;
+} VkPhysicalDeviceSamplerFilterMinmaxProperties;
+
+typedef struct VkPhysicalDeviceVulkanMemoryModelFeatures {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 vulkanMemoryModel;
+ VkBool32 vulkanMemoryModelDeviceScope;
+ VkBool32 vulkanMemoryModelAvailabilityVisibilityChains;
+} VkPhysicalDeviceVulkanMemoryModelFeatures;
+
+typedef struct VkPhysicalDeviceImagelessFramebufferFeatures {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 imagelessFramebuffer;
+} VkPhysicalDeviceImagelessFramebufferFeatures;
+
+typedef struct VkFramebufferAttachmentImageInfo {
+ VkStructureType sType;
+ const void* pNext;
+ VkImageCreateFlags flags;
+ VkImageUsageFlags usage;
+ uint32_t width;
+ uint32_t height;
+ uint32_t layerCount;
+ uint32_t viewFormatCount;
+ const VkFormat* pViewFormats;
+} VkFramebufferAttachmentImageInfo;
+
+typedef struct VkFramebufferAttachmentsCreateInfo {
+ VkStructureType sType;
+ const void* pNext;
+ uint32_t attachmentImageInfoCount;
+ const VkFramebufferAttachmentImageInfo* pAttachmentImageInfos;
+} VkFramebufferAttachmentsCreateInfo;
+
+typedef struct VkRenderPassAttachmentBeginInfo {
+ VkStructureType sType;
+ const void* pNext;
+ uint32_t attachmentCount;
+ const VkImageView* pAttachments;
+} VkRenderPassAttachmentBeginInfo;
+
+typedef struct VkPhysicalDeviceUniformBufferStandardLayoutFeatures {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 uniformBufferStandardLayout;
+} VkPhysicalDeviceUniformBufferStandardLayoutFeatures;
+
+typedef struct VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 shaderSubgroupExtendedTypes;
+} VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures;
+
+typedef struct VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 separateDepthStencilLayouts;
+} VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures;
+
+typedef struct VkAttachmentReferenceStencilLayout {
+ VkStructureType sType;
+ void* pNext;
+ VkImageLayout stencilLayout;
+} VkAttachmentReferenceStencilLayout;
+
+typedef struct VkAttachmentDescriptionStencilLayout {
+ VkStructureType sType;
+ void* pNext;
+ VkImageLayout stencilInitialLayout;
+ VkImageLayout stencilFinalLayout;
+} VkAttachmentDescriptionStencilLayout;
+
+typedef struct VkPhysicalDeviceHostQueryResetFeatures {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 hostQueryReset;
+} VkPhysicalDeviceHostQueryResetFeatures;
+
+typedef struct VkPhysicalDeviceTimelineSemaphoreFeatures {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 timelineSemaphore;
+} VkPhysicalDeviceTimelineSemaphoreFeatures;
+
+typedef struct VkPhysicalDeviceTimelineSemaphoreProperties {
+ VkStructureType sType;
+ void* pNext;
+ uint64_t maxTimelineSemaphoreValueDifference;
+} VkPhysicalDeviceTimelineSemaphoreProperties;
+
+typedef struct VkSemaphoreTypeCreateInfo {
+ VkStructureType sType;
+ const void* pNext;
+ VkSemaphoreType semaphoreType;
+ uint64_t initialValue;
+} VkSemaphoreTypeCreateInfo;
+
+typedef struct VkTimelineSemaphoreSubmitInfo {
+ VkStructureType sType;
+ const void* pNext;
+ uint32_t waitSemaphoreValueCount;
+ const uint64_t* pWaitSemaphoreValues;
+ uint32_t signalSemaphoreValueCount;
+ const uint64_t* pSignalSemaphoreValues;
+} VkTimelineSemaphoreSubmitInfo;
+
+typedef struct VkSemaphoreWaitInfo {
+ VkStructureType sType;
+ const void* pNext;
+ VkSemaphoreWaitFlags flags;
+ uint32_t semaphoreCount;
+ const VkSemaphore* pSemaphores;
+ const uint64_t* pValues;
+} VkSemaphoreWaitInfo;
+
+typedef struct VkSemaphoreSignalInfo {
+ VkStructureType sType;
+ const void* pNext;
+ VkSemaphore semaphore;
+ uint64_t value;
+} VkSemaphoreSignalInfo;
+
+typedef struct VkPhysicalDeviceBufferDeviceAddressFeatures {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 bufferDeviceAddress;
+ VkBool32 bufferDeviceAddressCaptureReplay;
+ VkBool32 bufferDeviceAddressMultiDevice;
+} VkPhysicalDeviceBufferDeviceAddressFeatures;
+
+typedef struct VkBufferDeviceAddressInfo {
+ VkStructureType sType;
+ const void* pNext;
+ VkBuffer buffer;
+} VkBufferDeviceAddressInfo;
+
+typedef struct VkBufferOpaqueCaptureAddressCreateInfo {
+ VkStructureType sType;
+ const void* pNext;
+ uint64_t opaqueCaptureAddress;
+} VkBufferOpaqueCaptureAddressCreateInfo;
+
+typedef struct VkMemoryOpaqueCaptureAddressAllocateInfo {
+ VkStructureType sType;
+ const void* pNext;
+ uint64_t opaqueCaptureAddress;
+} VkMemoryOpaqueCaptureAddressAllocateInfo;
+
+typedef struct VkDeviceMemoryOpaqueCaptureAddressInfo {
+ VkStructureType sType;
+ const void* pNext;
+ VkDeviceMemory memory;
+} VkDeviceMemoryOpaqueCaptureAddressInfo;
+
+typedef void (VKAPI_PTR *PFN_vkCmdDrawIndirectCount)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride);
+typedef void (VKAPI_PTR *PFN_vkCmdDrawIndexedIndirectCount)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride);
+typedef VkResult (VKAPI_PTR *PFN_vkCreateRenderPass2)(VkDevice device, const VkRenderPassCreateInfo2* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass);
+typedef void (VKAPI_PTR *PFN_vkCmdBeginRenderPass2)(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, const VkSubpassBeginInfo* pSubpassBeginInfo);
+typedef void (VKAPI_PTR *PFN_vkCmdNextSubpass2)(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo* pSubpassBeginInfo, const VkSubpassEndInfo* pSubpassEndInfo);
+typedef void (VKAPI_PTR *PFN_vkCmdEndRenderPass2)(VkCommandBuffer commandBuffer, const VkSubpassEndInfo* pSubpassEndInfo);
+typedef void (VKAPI_PTR *PFN_vkResetQueryPool)(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount);
+typedef VkResult (VKAPI_PTR *PFN_vkGetSemaphoreCounterValue)(VkDevice device, VkSemaphore semaphore, uint64_t* pValue);
+typedef VkResult (VKAPI_PTR *PFN_vkWaitSemaphores)(VkDevice device, const VkSemaphoreWaitInfo* pWaitInfo, uint64_t timeout);
+typedef VkResult (VKAPI_PTR *PFN_vkSignalSemaphore)(VkDevice device, const VkSemaphoreSignalInfo* pSignalInfo);
+typedef VkDeviceAddress (VKAPI_PTR *PFN_vkGetBufferDeviceAddress)(VkDevice device, const VkBufferDeviceAddressInfo* pInfo);
+typedef uint64_t (VKAPI_PTR *PFN_vkGetBufferOpaqueCaptureAddress)(VkDevice device, const VkBufferDeviceAddressInfo* pInfo);
+typedef uint64_t (VKAPI_PTR *PFN_vkGetDeviceMemoryOpaqueCaptureAddress)(VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirectCount(
+ VkCommandBuffer commandBuffer,
+ VkBuffer buffer,
+ VkDeviceSize offset,
+ VkBuffer countBuffer,
+ VkDeviceSize countBufferOffset,
+ uint32_t maxDrawCount,
+ uint32_t stride);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirectCount(
+ VkCommandBuffer commandBuffer,
+ VkBuffer buffer,
+ VkDeviceSize offset,
+ VkBuffer countBuffer,
+ VkDeviceSize countBufferOffset,
+ uint32_t maxDrawCount,
+ uint32_t stride);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass2(
+ VkDevice device,
+ const VkRenderPassCreateInfo2* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkRenderPass* pRenderPass);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdBeginRenderPass2(
+ VkCommandBuffer commandBuffer,
+ const VkRenderPassBeginInfo* pRenderPassBegin,
+ const VkSubpassBeginInfo* pSubpassBeginInfo);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass2(
+ VkCommandBuffer commandBuffer,
+ const VkSubpassBeginInfo* pSubpassBeginInfo,
+ const VkSubpassEndInfo* pSubpassEndInfo);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass2(
+ VkCommandBuffer commandBuffer,
+ const VkSubpassEndInfo* pSubpassEndInfo);
+
+VKAPI_ATTR void VKAPI_CALL vkResetQueryPool(
+ VkDevice device,
+ VkQueryPool queryPool,
+ uint32_t firstQuery,
+ uint32_t queryCount);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreCounterValue(
+ VkDevice device,
+ VkSemaphore semaphore,
+ uint64_t* pValue);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkWaitSemaphores(
+ VkDevice device,
+ const VkSemaphoreWaitInfo* pWaitInfo,
+ uint64_t timeout);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkSignalSemaphore(
+ VkDevice device,
+ const VkSemaphoreSignalInfo* pSignalInfo);
+
+VKAPI_ATTR VkDeviceAddress VKAPI_CALL vkGetBufferDeviceAddress(
+ VkDevice device,
+ const VkBufferDeviceAddressInfo* pInfo);
+
+VKAPI_ATTR uint64_t VKAPI_CALL vkGetBufferOpaqueCaptureAddress(
+ VkDevice device,
+ const VkBufferDeviceAddressInfo* pInfo);
+
+VKAPI_ATTR uint64_t VKAPI_CALL vkGetDeviceMemoryOpaqueCaptureAddress(
+ VkDevice device,
+ const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo);
+#endif
+
+
#define VK_KHR_surface 1
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSurfaceKHR)
#define VK_KHR_SURFACE_SPEC_VERSION 25
@@ -5036,7 +5936,7 @@
#define VK_KHR_display 1
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDisplayKHR)
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDisplayModeKHR)
-#define VK_KHR_DISPLAY_SPEC_VERSION 21
+#define VK_KHR_DISPLAY_SPEC_VERSION 23
#define VK_KHR_DISPLAY_EXTENSION_NAME "VK_KHR_display"
typedef enum VkDisplayPlaneAlphaFlagBitsKHR {
@@ -5159,7 +6059,7 @@
#define VK_KHR_display_swapchain 1
-#define VK_KHR_DISPLAY_SWAPCHAIN_SPEC_VERSION 9
+#define VK_KHR_DISPLAY_SWAPCHAIN_SPEC_VERSION 10
#define VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME "VK_KHR_display_swapchain"
typedef struct VkDisplayPresentInfoKHR {
VkStructureType sType;
@@ -5182,7 +6082,7 @@
#define VK_KHR_sampler_mirror_clamp_to_edge 1
-#define VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_SPEC_VERSION 1
+#define VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_SPEC_VERSION 3
#define VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME "VK_KHR_sampler_mirror_clamp_to_edge"
@@ -5198,7 +6098,7 @@
#define VK_KHR_get_physical_device_properties2 1
-#define VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION 1
+#define VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION 2
#define VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME "VK_KHR_get_physical_device_properties2"
typedef VkPhysicalDeviceFeatures2 VkPhysicalDeviceFeatures2KHR;
@@ -5263,7 +6163,7 @@
#define VK_KHR_device_group 1
-#define VK_KHR_DEVICE_GROUP_SPEC_VERSION 3
+#define VK_KHR_DEVICE_GROUP_SPEC_VERSION 4
#define VK_KHR_DEVICE_GROUP_EXTENSION_NAME "VK_KHR_device_group"
typedef VkPeerMemoryFeatureFlags VkPeerMemoryFeatureFlagsKHR;
@@ -5541,12 +6441,9 @@
#define VK_KHR_shader_float16_int8 1
#define VK_KHR_SHADER_FLOAT16_INT8_SPEC_VERSION 1
#define VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME "VK_KHR_shader_float16_int8"
-typedef struct VkPhysicalDeviceFloat16Int8FeaturesKHR {
- VkStructureType sType;
- void* pNext;
- VkBool32 shaderFloat16;
- VkBool32 shaderInt8;
-} VkPhysicalDeviceFloat16Int8FeaturesKHR;
+typedef VkPhysicalDeviceShaderFloat16Int8Features VkPhysicalDeviceShaderFloat16Int8FeaturesKHR;
+
+typedef VkPhysicalDeviceShaderFloat16Int8Features VkPhysicalDeviceFloat16Int8FeaturesKHR;
@@ -5616,148 +6513,62 @@
const void* pData);
#endif
+
#define VK_KHR_imageless_framebuffer 1
#define VK_KHR_IMAGELESS_FRAMEBUFFER_SPEC_VERSION 1
#define VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME "VK_KHR_imageless_framebuffer"
+typedef VkPhysicalDeviceImagelessFramebufferFeatures VkPhysicalDeviceImagelessFramebufferFeaturesKHR;
-typedef struct VkPhysicalDeviceImagelessFramebufferFeaturesKHR {
- VkStructureType sType;
- void* pNext;
- VkBool32 imagelessFramebuffer;
-} VkPhysicalDeviceImagelessFramebufferFeaturesKHR;
+typedef VkFramebufferAttachmentsCreateInfo VkFramebufferAttachmentsCreateInfoKHR;
-typedef struct VkFramebufferAttachmentImageInfoKHR {
- VkStructureType sType;
- const void* pNext;
- VkImageCreateFlags flags;
- VkImageUsageFlags usage;
- uint32_t width;
- uint32_t height;
- uint32_t layerCount;
- uint32_t viewFormatCount;
- const VkFormat* pViewFormats;
-} VkFramebufferAttachmentImageInfoKHR;
+typedef VkFramebufferAttachmentImageInfo VkFramebufferAttachmentImageInfoKHR;
-typedef struct VkFramebufferAttachmentsCreateInfoKHR {
- VkStructureType sType;
- const void* pNext;
- uint32_t attachmentImageInfoCount;
- const VkFramebufferAttachmentImageInfoKHR* pAttachmentImageInfos;
-} VkFramebufferAttachmentsCreateInfoKHR;
-
-typedef struct VkRenderPassAttachmentBeginInfoKHR {
- VkStructureType sType;
- const void* pNext;
- uint32_t attachmentCount;
- const VkImageView* pAttachments;
-} VkRenderPassAttachmentBeginInfoKHR;
+typedef VkRenderPassAttachmentBeginInfo VkRenderPassAttachmentBeginInfoKHR;
#define VK_KHR_create_renderpass2 1
#define VK_KHR_CREATE_RENDERPASS_2_SPEC_VERSION 1
#define VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME "VK_KHR_create_renderpass2"
-typedef struct VkAttachmentDescription2KHR {
- VkStructureType sType;
- const void* pNext;
- VkAttachmentDescriptionFlags flags;
- VkFormat format;
- VkSampleCountFlagBits samples;
- VkAttachmentLoadOp loadOp;
- VkAttachmentStoreOp storeOp;
- VkAttachmentLoadOp stencilLoadOp;
- VkAttachmentStoreOp stencilStoreOp;
- VkImageLayout initialLayout;
- VkImageLayout finalLayout;
-} VkAttachmentDescription2KHR;
+typedef VkRenderPassCreateInfo2 VkRenderPassCreateInfo2KHR;
-typedef struct VkAttachmentReference2KHR {
- VkStructureType sType;
- const void* pNext;
- uint32_t attachment;
- VkImageLayout layout;
- VkImageAspectFlags aspectMask;
-} VkAttachmentReference2KHR;
+typedef VkAttachmentDescription2 VkAttachmentDescription2KHR;
-typedef struct VkSubpassDescription2KHR {
- VkStructureType sType;
- const void* pNext;
- VkSubpassDescriptionFlags flags;
- VkPipelineBindPoint pipelineBindPoint;
- uint32_t viewMask;
- uint32_t inputAttachmentCount;
- const VkAttachmentReference2KHR* pInputAttachments;
- uint32_t colorAttachmentCount;
- const VkAttachmentReference2KHR* pColorAttachments;
- const VkAttachmentReference2KHR* pResolveAttachments;
- const VkAttachmentReference2KHR* pDepthStencilAttachment;
- uint32_t preserveAttachmentCount;
- const uint32_t* pPreserveAttachments;
-} VkSubpassDescription2KHR;
+typedef VkAttachmentReference2 VkAttachmentReference2KHR;
-typedef struct VkSubpassDependency2KHR {
- VkStructureType sType;
- const void* pNext;
- uint32_t srcSubpass;
- uint32_t dstSubpass;
- VkPipelineStageFlags srcStageMask;
- VkPipelineStageFlags dstStageMask;
- VkAccessFlags srcAccessMask;
- VkAccessFlags dstAccessMask;
- VkDependencyFlags dependencyFlags;
- int32_t viewOffset;
-} VkSubpassDependency2KHR;
+typedef VkSubpassDescription2 VkSubpassDescription2KHR;
-typedef struct VkRenderPassCreateInfo2KHR {
- VkStructureType sType;
- const void* pNext;
- VkRenderPassCreateFlags flags;
- uint32_t attachmentCount;
- const VkAttachmentDescription2KHR* pAttachments;
- uint32_t subpassCount;
- const VkSubpassDescription2KHR* pSubpasses;
- uint32_t dependencyCount;
- const VkSubpassDependency2KHR* pDependencies;
- uint32_t correlatedViewMaskCount;
- const uint32_t* pCorrelatedViewMasks;
-} VkRenderPassCreateInfo2KHR;
+typedef VkSubpassDependency2 VkSubpassDependency2KHR;
-typedef struct VkSubpassBeginInfoKHR {
- VkStructureType sType;
- const void* pNext;
- VkSubpassContents contents;
-} VkSubpassBeginInfoKHR;
+typedef VkSubpassBeginInfo VkSubpassBeginInfoKHR;
-typedef struct VkSubpassEndInfoKHR {
- VkStructureType sType;
- const void* pNext;
-} VkSubpassEndInfoKHR;
+typedef VkSubpassEndInfo VkSubpassEndInfoKHR;
-typedef VkResult (VKAPI_PTR *PFN_vkCreateRenderPass2KHR)(VkDevice device, const VkRenderPassCreateInfo2KHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass);
-typedef void (VKAPI_PTR *PFN_vkCmdBeginRenderPass2KHR)(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, const VkSubpassBeginInfoKHR* pSubpassBeginInfo);
-typedef void (VKAPI_PTR *PFN_vkCmdNextSubpass2KHR)(VkCommandBuffer commandBuffer, const VkSubpassBeginInfoKHR* pSubpassBeginInfo, const VkSubpassEndInfoKHR* pSubpassEndInfo);
-typedef void (VKAPI_PTR *PFN_vkCmdEndRenderPass2KHR)(VkCommandBuffer commandBuffer, const VkSubpassEndInfoKHR* pSubpassEndInfo);
+typedef VkResult (VKAPI_PTR *PFN_vkCreateRenderPass2KHR)(VkDevice device, const VkRenderPassCreateInfo2* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass);
+typedef void (VKAPI_PTR *PFN_vkCmdBeginRenderPass2KHR)(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, const VkSubpassBeginInfo* pSubpassBeginInfo);
+typedef void (VKAPI_PTR *PFN_vkCmdNextSubpass2KHR)(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo* pSubpassBeginInfo, const VkSubpassEndInfo* pSubpassEndInfo);
+typedef void (VKAPI_PTR *PFN_vkCmdEndRenderPass2KHR)(VkCommandBuffer commandBuffer, const VkSubpassEndInfo* pSubpassEndInfo);
#ifndef VK_NO_PROTOTYPES
VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass2KHR(
VkDevice device,
- const VkRenderPassCreateInfo2KHR* pCreateInfo,
+ const VkRenderPassCreateInfo2* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkRenderPass* pRenderPass);
VKAPI_ATTR void VKAPI_CALL vkCmdBeginRenderPass2KHR(
VkCommandBuffer commandBuffer,
const VkRenderPassBeginInfo* pRenderPassBegin,
- const VkSubpassBeginInfoKHR* pSubpassBeginInfo);
+ const VkSubpassBeginInfo* pSubpassBeginInfo);
VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass2KHR(
VkCommandBuffer commandBuffer,
- const VkSubpassBeginInfoKHR* pSubpassBeginInfo,
- const VkSubpassEndInfoKHR* pSubpassEndInfo);
+ const VkSubpassBeginInfo* pSubpassBeginInfo,
+ const VkSubpassEndInfo* pSubpassEndInfo);
VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass2KHR(
VkCommandBuffer commandBuffer,
- const VkSubpassEndInfoKHR* pSubpassEndInfo);
+ const VkSubpassEndInfo* pSubpassEndInfo);
#endif
@@ -5849,6 +6660,150 @@
#endif
+#define VK_KHR_performance_query 1
+#define VK_KHR_PERFORMANCE_QUERY_SPEC_VERSION 1
+#define VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME "VK_KHR_performance_query"
+
+typedef enum VkPerformanceCounterUnitKHR {
+ VK_PERFORMANCE_COUNTER_UNIT_GENERIC_KHR = 0,
+ VK_PERFORMANCE_COUNTER_UNIT_PERCENTAGE_KHR = 1,
+ VK_PERFORMANCE_COUNTER_UNIT_NANOSECONDS_KHR = 2,
+ VK_PERFORMANCE_COUNTER_UNIT_BYTES_KHR = 3,
+ VK_PERFORMANCE_COUNTER_UNIT_BYTES_PER_SECOND_KHR = 4,
+ VK_PERFORMANCE_COUNTER_UNIT_KELVIN_KHR = 5,
+ VK_PERFORMANCE_COUNTER_UNIT_WATTS_KHR = 6,
+ VK_PERFORMANCE_COUNTER_UNIT_VOLTS_KHR = 7,
+ VK_PERFORMANCE_COUNTER_UNIT_AMPS_KHR = 8,
+ VK_PERFORMANCE_COUNTER_UNIT_HERTZ_KHR = 9,
+ VK_PERFORMANCE_COUNTER_UNIT_CYCLES_KHR = 10,
+ VK_PERFORMANCE_COUNTER_UNIT_BEGIN_RANGE_KHR = VK_PERFORMANCE_COUNTER_UNIT_GENERIC_KHR,
+ VK_PERFORMANCE_COUNTER_UNIT_END_RANGE_KHR = VK_PERFORMANCE_COUNTER_UNIT_CYCLES_KHR,
+ VK_PERFORMANCE_COUNTER_UNIT_RANGE_SIZE_KHR = (VK_PERFORMANCE_COUNTER_UNIT_CYCLES_KHR - VK_PERFORMANCE_COUNTER_UNIT_GENERIC_KHR + 1),
+ VK_PERFORMANCE_COUNTER_UNIT_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkPerformanceCounterUnitKHR;
+
+typedef enum VkPerformanceCounterScopeKHR {
+ VK_QUERY_SCOPE_COMMAND_BUFFER_KHR = 0,
+ VK_QUERY_SCOPE_RENDER_PASS_KHR = 1,
+ VK_QUERY_SCOPE_COMMAND_KHR = 2,
+ VK_PERFORMANCE_COUNTER_SCOPE_BEGIN_RANGE_KHR = VK_QUERY_SCOPE_COMMAND_BUFFER_KHR,
+ VK_PERFORMANCE_COUNTER_SCOPE_END_RANGE_KHR = VK_QUERY_SCOPE_COMMAND_KHR,
+ VK_PERFORMANCE_COUNTER_SCOPE_RANGE_SIZE_KHR = (VK_QUERY_SCOPE_COMMAND_KHR - VK_QUERY_SCOPE_COMMAND_BUFFER_KHR + 1),
+ VK_PERFORMANCE_COUNTER_SCOPE_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkPerformanceCounterScopeKHR;
+
+typedef enum VkPerformanceCounterStorageKHR {
+ VK_PERFORMANCE_COUNTER_STORAGE_INT32_KHR = 0,
+ VK_PERFORMANCE_COUNTER_STORAGE_INT64_KHR = 1,
+ VK_PERFORMANCE_COUNTER_STORAGE_UINT32_KHR = 2,
+ VK_PERFORMANCE_COUNTER_STORAGE_UINT64_KHR = 3,
+ VK_PERFORMANCE_COUNTER_STORAGE_FLOAT32_KHR = 4,
+ VK_PERFORMANCE_COUNTER_STORAGE_FLOAT64_KHR = 5,
+ VK_PERFORMANCE_COUNTER_STORAGE_BEGIN_RANGE_KHR = VK_PERFORMANCE_COUNTER_STORAGE_INT32_KHR,
+ VK_PERFORMANCE_COUNTER_STORAGE_END_RANGE_KHR = VK_PERFORMANCE_COUNTER_STORAGE_FLOAT64_KHR,
+ VK_PERFORMANCE_COUNTER_STORAGE_RANGE_SIZE_KHR = (VK_PERFORMANCE_COUNTER_STORAGE_FLOAT64_KHR - VK_PERFORMANCE_COUNTER_STORAGE_INT32_KHR + 1),
+ VK_PERFORMANCE_COUNTER_STORAGE_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkPerformanceCounterStorageKHR;
+
+typedef enum VkPerformanceCounterDescriptionFlagBitsKHR {
+ VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_KHR = 0x00000001,
+ VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_KHR = 0x00000002,
+ VK_PERFORMANCE_COUNTER_DESCRIPTION_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkPerformanceCounterDescriptionFlagBitsKHR;
+typedef VkFlags VkPerformanceCounterDescriptionFlagsKHR;
+
+typedef enum VkAcquireProfilingLockFlagBitsKHR {
+ VK_ACQUIRE_PROFILING_LOCK_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkAcquireProfilingLockFlagBitsKHR;
+typedef VkFlags VkAcquireProfilingLockFlagsKHR;
+typedef struct VkPhysicalDevicePerformanceQueryFeaturesKHR {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 performanceCounterQueryPools;
+ VkBool32 performanceCounterMultipleQueryPools;
+} VkPhysicalDevicePerformanceQueryFeaturesKHR;
+
+typedef struct VkPhysicalDevicePerformanceQueryPropertiesKHR {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 allowCommandBufferQueryCopies;
+} VkPhysicalDevicePerformanceQueryPropertiesKHR;
+
+typedef struct VkPerformanceCounterKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkPerformanceCounterUnitKHR unit;
+ VkPerformanceCounterScopeKHR scope;
+ VkPerformanceCounterStorageKHR storage;
+ uint8_t uuid[VK_UUID_SIZE];
+} VkPerformanceCounterKHR;
+
+typedef struct VkPerformanceCounterDescriptionKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkPerformanceCounterDescriptionFlagsKHR flags;
+ char name[VK_MAX_DESCRIPTION_SIZE];
+ char category[VK_MAX_DESCRIPTION_SIZE];
+ char description[VK_MAX_DESCRIPTION_SIZE];
+} VkPerformanceCounterDescriptionKHR;
+
+typedef struct VkQueryPoolPerformanceCreateInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ uint32_t queueFamilyIndex;
+ uint32_t counterIndexCount;
+ const uint32_t* pCounterIndices;
+} VkQueryPoolPerformanceCreateInfoKHR;
+
+typedef union VkPerformanceCounterResultKHR {
+ int32_t int32;
+ int64_t int64;
+ uint32_t uint32;
+ uint64_t uint64;
+ float float32;
+ double float64;
+} VkPerformanceCounterResultKHR;
+
+typedef struct VkAcquireProfilingLockInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkAcquireProfilingLockFlagsKHR flags;
+ uint64_t timeout;
+} VkAcquireProfilingLockInfoKHR;
+
+typedef struct VkPerformanceQuerySubmitInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ uint32_t counterPassIndex;
+} VkPerformanceQuerySubmitInfoKHR;
+
+typedef VkResult (VKAPI_PTR *PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, uint32_t* pCounterCount, VkPerformanceCounterKHR* pCounters, VkPerformanceCounterDescriptionKHR* pCounterDescriptions);
+typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR)(VkPhysicalDevice physicalDevice, const VkQueryPoolPerformanceCreateInfoKHR* pPerformanceQueryCreateInfo, uint32_t* pNumPasses);
+typedef VkResult (VKAPI_PTR *PFN_vkAcquireProfilingLockKHR)(VkDevice device, const VkAcquireProfilingLockInfoKHR* pInfo);
+typedef void (VKAPI_PTR *PFN_vkReleaseProfilingLockKHR)(VkDevice device);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
+ VkPhysicalDevice physicalDevice,
+ uint32_t queueFamilyIndex,
+ uint32_t* pCounterCount,
+ VkPerformanceCounterKHR* pCounters,
+ VkPerformanceCounterDescriptionKHR* pCounterDescriptions);
+
+VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(
+ VkPhysicalDevice physicalDevice,
+ const VkQueryPoolPerformanceCreateInfoKHR* pPerformanceQueryCreateInfo,
+ uint32_t* pNumPasses);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkAcquireProfilingLockKHR(
+ VkDevice device,
+ const VkAcquireProfilingLockInfoKHR* pInfo);
+
+VKAPI_ATTR void VKAPI_CALL vkReleaseProfilingLockKHR(
+ VkDevice device);
+#endif
+
+
#define VK_KHR_maintenance2 1
#define VK_KHR_MAINTENANCE2_SPEC_VERSION 1
#define VK_KHR_MAINTENANCE2_EXTENSION_NAME "VK_KHR_maintenance2"
@@ -6034,19 +6989,14 @@
#define VK_KHR_image_format_list 1
#define VK_KHR_IMAGE_FORMAT_LIST_SPEC_VERSION 1
#define VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME "VK_KHR_image_format_list"
-typedef struct VkImageFormatListCreateInfoKHR {
- VkStructureType sType;
- const void* pNext;
- uint32_t viewFormatCount;
- const VkFormat* pViewFormats;
-} VkImageFormatListCreateInfoKHR;
+typedef VkImageFormatListCreateInfo VkImageFormatListCreateInfoKHR;
#define VK_KHR_sampler_ycbcr_conversion 1
typedef VkSamplerYcbcrConversion VkSamplerYcbcrConversionKHR;
-#define VK_KHR_SAMPLER_YCBCR_CONVERSION_SPEC_VERSION 1
+#define VK_KHR_SAMPLER_YCBCR_CONVERSION_SPEC_VERSION 14
#define VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME "VK_KHR_sampler_ycbcr_conversion"
typedef VkSamplerYcbcrModelConversion VkSamplerYcbcrModelConversionKHR;
@@ -6150,128 +7100,59 @@
#endif
+#define VK_KHR_shader_subgroup_extended_types 1
+#define VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_SPEC_VERSION 1
+#define VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME "VK_KHR_shader_subgroup_extended_types"
+typedef VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR;
+
+
+
#define VK_KHR_8bit_storage 1
#define VK_KHR_8BIT_STORAGE_SPEC_VERSION 1
#define VK_KHR_8BIT_STORAGE_EXTENSION_NAME "VK_KHR_8bit_storage"
-typedef struct VkPhysicalDevice8BitStorageFeaturesKHR {
- VkStructureType sType;
- void* pNext;
- VkBool32 storageBuffer8BitAccess;
- VkBool32 uniformAndStorageBuffer8BitAccess;
- VkBool32 storagePushConstant8;
-} VkPhysicalDevice8BitStorageFeaturesKHR;
+typedef VkPhysicalDevice8BitStorageFeatures VkPhysicalDevice8BitStorageFeaturesKHR;
#define VK_KHR_shader_atomic_int64 1
#define VK_KHR_SHADER_ATOMIC_INT64_SPEC_VERSION 1
#define VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME "VK_KHR_shader_atomic_int64"
-typedef struct VkPhysicalDeviceShaderAtomicInt64FeaturesKHR {
- VkStructureType sType;
- void* pNext;
- VkBool32 shaderBufferInt64Atomics;
- VkBool32 shaderSharedInt64Atomics;
-} VkPhysicalDeviceShaderAtomicInt64FeaturesKHR;
+typedef VkPhysicalDeviceShaderAtomicInt64Features VkPhysicalDeviceShaderAtomicInt64FeaturesKHR;
#define VK_KHR_driver_properties 1
-#define VK_MAX_DRIVER_NAME_SIZE_KHR 256
-#define VK_MAX_DRIVER_INFO_SIZE_KHR 256
#define VK_KHR_DRIVER_PROPERTIES_SPEC_VERSION 1
#define VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME "VK_KHR_driver_properties"
+#define VK_MAX_DRIVER_NAME_SIZE_KHR VK_MAX_DRIVER_NAME_SIZE
+#define VK_MAX_DRIVER_INFO_SIZE_KHR VK_MAX_DRIVER_INFO_SIZE
+typedef VkDriverId VkDriverIdKHR;
-typedef enum VkDriverIdKHR {
- VK_DRIVER_ID_AMD_PROPRIETARY_KHR = 1,
- VK_DRIVER_ID_AMD_OPEN_SOURCE_KHR = 2,
- VK_DRIVER_ID_MESA_RADV_KHR = 3,
- VK_DRIVER_ID_NVIDIA_PROPRIETARY_KHR = 4,
- VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS_KHR = 5,
- VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA_KHR = 6,
- VK_DRIVER_ID_IMAGINATION_PROPRIETARY_KHR = 7,
- VK_DRIVER_ID_QUALCOMM_PROPRIETARY_KHR = 8,
- VK_DRIVER_ID_ARM_PROPRIETARY_KHR = 9,
- VK_DRIVER_ID_GOOGLE_PASTEL_KHR = 10,
- VK_DRIVER_ID_GGP_PROPRIETARY_KHR = 11,
- VK_DRIVER_ID_BEGIN_RANGE_KHR = VK_DRIVER_ID_AMD_PROPRIETARY_KHR,
- VK_DRIVER_ID_END_RANGE_KHR = VK_DRIVER_ID_GGP_PROPRIETARY_KHR,
- VK_DRIVER_ID_RANGE_SIZE_KHR = (VK_DRIVER_ID_GGP_PROPRIETARY_KHR - VK_DRIVER_ID_AMD_PROPRIETARY_KHR + 1),
- VK_DRIVER_ID_MAX_ENUM_KHR = 0x7FFFFFFF
-} VkDriverIdKHR;
-typedef struct VkConformanceVersionKHR {
- uint8_t major;
- uint8_t minor;
- uint8_t subminor;
- uint8_t patch;
-} VkConformanceVersionKHR;
+typedef VkConformanceVersion VkConformanceVersionKHR;
-typedef struct VkPhysicalDeviceDriverPropertiesKHR {
- VkStructureType sType;
- void* pNext;
- VkDriverIdKHR driverID;
- char driverName[VK_MAX_DRIVER_NAME_SIZE_KHR];
- char driverInfo[VK_MAX_DRIVER_INFO_SIZE_KHR];
- VkConformanceVersionKHR conformanceVersion;
-} VkPhysicalDeviceDriverPropertiesKHR;
+typedef VkPhysicalDeviceDriverProperties VkPhysicalDeviceDriverPropertiesKHR;
#define VK_KHR_shader_float_controls 1
-#define VK_KHR_SHADER_FLOAT_CONTROLS_SPEC_VERSION 1
+#define VK_KHR_SHADER_FLOAT_CONTROLS_SPEC_VERSION 4
#define VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME "VK_KHR_shader_float_controls"
-typedef struct VkPhysicalDeviceFloatControlsPropertiesKHR {
- VkStructureType sType;
- void* pNext;
- VkBool32 separateDenormSettings;
- VkBool32 separateRoundingModeSettings;
- VkBool32 shaderSignedZeroInfNanPreserveFloat16;
- VkBool32 shaderSignedZeroInfNanPreserveFloat32;
- VkBool32 shaderSignedZeroInfNanPreserveFloat64;
- VkBool32 shaderDenormPreserveFloat16;
- VkBool32 shaderDenormPreserveFloat32;
- VkBool32 shaderDenormPreserveFloat64;
- VkBool32 shaderDenormFlushToZeroFloat16;
- VkBool32 shaderDenormFlushToZeroFloat32;
- VkBool32 shaderDenormFlushToZeroFloat64;
- VkBool32 shaderRoundingModeRTEFloat16;
- VkBool32 shaderRoundingModeRTEFloat32;
- VkBool32 shaderRoundingModeRTEFloat64;
- VkBool32 shaderRoundingModeRTZFloat16;
- VkBool32 shaderRoundingModeRTZFloat32;
- VkBool32 shaderRoundingModeRTZFloat64;
-} VkPhysicalDeviceFloatControlsPropertiesKHR;
+typedef VkShaderFloatControlsIndependence VkShaderFloatControlsIndependenceKHR;
+
+typedef VkPhysicalDeviceFloatControlsProperties VkPhysicalDeviceFloatControlsPropertiesKHR;
#define VK_KHR_depth_stencil_resolve 1
#define VK_KHR_DEPTH_STENCIL_RESOLVE_SPEC_VERSION 1
#define VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME "VK_KHR_depth_stencil_resolve"
+typedef VkResolveModeFlagBits VkResolveModeFlagBitsKHR;
-typedef enum VkResolveModeFlagBitsKHR {
- VK_RESOLVE_MODE_NONE_KHR = 0,
- VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR = 0x00000001,
- VK_RESOLVE_MODE_AVERAGE_BIT_KHR = 0x00000002,
- VK_RESOLVE_MODE_MIN_BIT_KHR = 0x00000004,
- VK_RESOLVE_MODE_MAX_BIT_KHR = 0x00000008,
- VK_RESOLVE_MODE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
-} VkResolveModeFlagBitsKHR;
-typedef VkFlags VkResolveModeFlagsKHR;
-typedef struct VkSubpassDescriptionDepthStencilResolveKHR {
- VkStructureType sType;
- const void* pNext;
- VkResolveModeFlagBitsKHR depthResolveMode;
- VkResolveModeFlagBitsKHR stencilResolveMode;
- const VkAttachmentReference2KHR* pDepthStencilResolveAttachment;
-} VkSubpassDescriptionDepthStencilResolveKHR;
+typedef VkResolveModeFlags VkResolveModeFlagsKHR;
-typedef struct VkPhysicalDeviceDepthStencilResolvePropertiesKHR {
- VkStructureType sType;
- void* pNext;
- VkResolveModeFlagsKHR supportedDepthResolveModes;
- VkResolveModeFlagsKHR supportedStencilResolveModes;
- VkBool32 independentResolveNone;
- VkBool32 independentResolve;
-} VkPhysicalDeviceDepthStencilResolvePropertiesKHR;
+typedef VkSubpassDescriptionDepthStencilResolve VkSubpassDescriptionDepthStencilResolveKHR;
+
+typedef VkPhysicalDeviceDepthStencilResolveProperties VkPhysicalDeviceDepthStencilResolvePropertiesKHR;
@@ -6280,19 +7161,60 @@
#define VK_KHR_SWAPCHAIN_MUTABLE_FORMAT_EXTENSION_NAME "VK_KHR_swapchain_mutable_format"
+#define VK_KHR_timeline_semaphore 1
+#define VK_KHR_TIMELINE_SEMAPHORE_SPEC_VERSION 2
+#define VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME "VK_KHR_timeline_semaphore"
+typedef VkSemaphoreType VkSemaphoreTypeKHR;
+
+typedef VkSemaphoreWaitFlagBits VkSemaphoreWaitFlagBitsKHR;
+
+typedef VkSemaphoreWaitFlags VkSemaphoreWaitFlagsKHR;
+
+typedef VkPhysicalDeviceTimelineSemaphoreFeatures VkPhysicalDeviceTimelineSemaphoreFeaturesKHR;
+
+typedef VkPhysicalDeviceTimelineSemaphoreProperties VkPhysicalDeviceTimelineSemaphorePropertiesKHR;
+
+typedef VkSemaphoreTypeCreateInfo VkSemaphoreTypeCreateInfoKHR;
+
+typedef VkTimelineSemaphoreSubmitInfo VkTimelineSemaphoreSubmitInfoKHR;
+
+typedef VkSemaphoreWaitInfo VkSemaphoreWaitInfoKHR;
+
+typedef VkSemaphoreSignalInfo VkSemaphoreSignalInfoKHR;
+
+typedef VkResult (VKAPI_PTR *PFN_vkGetSemaphoreCounterValueKHR)(VkDevice device, VkSemaphore semaphore, uint64_t* pValue);
+typedef VkResult (VKAPI_PTR *PFN_vkWaitSemaphoresKHR)(VkDevice device, const VkSemaphoreWaitInfo* pWaitInfo, uint64_t timeout);
+typedef VkResult (VKAPI_PTR *PFN_vkSignalSemaphoreKHR)(VkDevice device, const VkSemaphoreSignalInfo* pSignalInfo);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreCounterValueKHR(
+ VkDevice device,
+ VkSemaphore semaphore,
+ uint64_t* pValue);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkWaitSemaphoresKHR(
+ VkDevice device,
+ const VkSemaphoreWaitInfo* pWaitInfo,
+ uint64_t timeout);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkSignalSemaphoreKHR(
+ VkDevice device,
+ const VkSemaphoreSignalInfo* pSignalInfo);
+#endif
+
+
#define VK_KHR_vulkan_memory_model 1
#define VK_KHR_VULKAN_MEMORY_MODEL_SPEC_VERSION 3
#define VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME "VK_KHR_vulkan_memory_model"
-typedef struct VkPhysicalDeviceVulkanMemoryModelFeaturesKHR {
- VkStructureType sType;
- void* pNext;
- VkBool32 vulkanMemoryModel;
- VkBool32 vulkanMemoryModelDeviceScope;
- VkBool32 vulkanMemoryModelAvailabilityVisibilityChains;
-} VkPhysicalDeviceVulkanMemoryModelFeaturesKHR;
+typedef VkPhysicalDeviceVulkanMemoryModelFeatures VkPhysicalDeviceVulkanMemoryModelFeaturesKHR;
+#define VK_KHR_spirv_1_4 1
+#define VK_KHR_SPIRV_1_4_SPEC_VERSION 1
+#define VK_KHR_SPIRV_1_4_EXTENSION_NAME "VK_KHR_spirv_1_4"
+
+
#define VK_KHR_surface_protected_capabilities 1
#define VK_KHR_SURFACE_PROTECTED_CAPABILITIES_SPEC_VERSION 1
#define VK_KHR_SURFACE_PROTECTED_CAPABILITIES_EXTENSION_NAME "VK_KHR_surface_protected_capabilities"
@@ -6304,17 +7226,56 @@
+#define VK_KHR_separate_depth_stencil_layouts 1
+#define VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_SPEC_VERSION 1
+#define VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME "VK_KHR_separate_depth_stencil_layouts"
+typedef VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR;
+
+typedef VkAttachmentReferenceStencilLayout VkAttachmentReferenceStencilLayoutKHR;
+
+typedef VkAttachmentDescriptionStencilLayout VkAttachmentDescriptionStencilLayoutKHR;
+
+
+
#define VK_KHR_uniform_buffer_standard_layout 1
#define VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_SPEC_VERSION 1
#define VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME "VK_KHR_uniform_buffer_standard_layout"
-typedef struct VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR {
- VkStructureType sType;
- void* pNext;
- VkBool32 uniformBufferStandardLayout;
-} VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR;
+typedef VkPhysicalDeviceUniformBufferStandardLayoutFeatures VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR;
+#define VK_KHR_buffer_device_address 1
+#define VK_KHR_BUFFER_DEVICE_ADDRESS_SPEC_VERSION 1
+#define VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME "VK_KHR_buffer_device_address"
+typedef VkPhysicalDeviceBufferDeviceAddressFeatures VkPhysicalDeviceBufferDeviceAddressFeaturesKHR;
+
+typedef VkBufferDeviceAddressInfo VkBufferDeviceAddressInfoKHR;
+
+typedef VkBufferOpaqueCaptureAddressCreateInfo VkBufferOpaqueCaptureAddressCreateInfoKHR;
+
+typedef VkMemoryOpaqueCaptureAddressAllocateInfo VkMemoryOpaqueCaptureAddressAllocateInfoKHR;
+
+typedef VkDeviceMemoryOpaqueCaptureAddressInfo VkDeviceMemoryOpaqueCaptureAddressInfoKHR;
+
+typedef VkDeviceAddress (VKAPI_PTR *PFN_vkGetBufferDeviceAddressKHR)(VkDevice device, const VkBufferDeviceAddressInfo* pInfo);
+typedef uint64_t (VKAPI_PTR *PFN_vkGetBufferOpaqueCaptureAddressKHR)(VkDevice device, const VkBufferDeviceAddressInfo* pInfo);
+typedef uint64_t (VKAPI_PTR *PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR)(VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR VkDeviceAddress VKAPI_CALL vkGetBufferDeviceAddressKHR(
+ VkDevice device,
+ const VkBufferDeviceAddressInfo* pInfo);
+
+VKAPI_ATTR uint64_t VKAPI_CALL vkGetBufferOpaqueCaptureAddressKHR(
+ VkDevice device,
+ const VkBufferDeviceAddressInfo* pInfo);
+
+VKAPI_ATTR uint64_t VKAPI_CALL vkGetDeviceMemoryOpaqueCaptureAddressKHR(
+ VkDevice device,
+ const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo);
+#endif
+
+
#define VK_KHR_pipeline_executable_properties 1
#define VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_SPEC_VERSION 1
#define VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME "VK_KHR_pipeline_executable_properties"
@@ -6408,89 +7369,6 @@
#endif
-#define VK_KHR_timeline_semaphore 1
-#define VK_KHR_TIMELINE_SEMAPHORE_SPEC_VERSION 2
-#define VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME "VK_KHR_timeline_semaphore"
-
-typedef enum VkSemaphoreTypeKHR {
- VK_SEMAPHORE_TYPE_BINARY_KHR = 0,
- VK_SEMAPHORE_TYPE_TIMELINE_KHR = 1,
- VK_SEMAPHORE_TYPE_BEGIN_RANGE_KHR = VK_SEMAPHORE_TYPE_BINARY_KHR,
- VK_SEMAPHORE_TYPE_END_RANGE_KHR = VK_SEMAPHORE_TYPE_TIMELINE_KHR,
- VK_SEMAPHORE_TYPE_RANGE_SIZE_KHR = (VK_SEMAPHORE_TYPE_TIMELINE_KHR - VK_SEMAPHORE_TYPE_BINARY_KHR + 1),
- VK_SEMAPHORE_TYPE_MAX_ENUM_KHR = 0x7FFFFFFF
-} VkSemaphoreTypeKHR;
-
-typedef enum VkSemaphoreWaitFlagBitsKHR {
- VK_SEMAPHORE_WAIT_ANY_BIT_KHR = 0x00000001,
- VK_SEMAPHORE_WAIT_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
-} VkSemaphoreWaitFlagBitsKHR;
-typedef VkFlags VkSemaphoreWaitFlagsKHR;
-typedef struct VkPhysicalDeviceTimelineSemaphoreFeaturesKHR {
- VkStructureType sType;
- void* pNext;
- VkBool32 timelineSemaphore;
-} VkPhysicalDeviceTimelineSemaphoreFeaturesKHR;
-
-typedef struct VkPhysicalDeviceTimelineSemaphorePropertiesKHR {
- VkStructureType sType;
- void* pNext;
- uint64_t maxTimelineSemaphoreValueDifference;
-} VkPhysicalDeviceTimelineSemaphorePropertiesKHR;
-
-typedef struct VkSemaphoreTypeCreateInfoKHR {
- VkStructureType sType;
- const void* pNext;
- VkSemaphoreTypeKHR semaphoreType;
- uint64_t initialValue;
-} VkSemaphoreTypeCreateInfoKHR;
-
-typedef struct VkTimelineSemaphoreSubmitInfoKHR {
- VkStructureType sType;
- const void* pNext;
- uint32_t waitSemaphoreValueCount;
- const uint64_t* pWaitSemaphoreValues;
- uint32_t signalSemaphoreValueCount;
- const uint64_t* pSignalSemaphoreValues;
-} VkTimelineSemaphoreSubmitInfoKHR;
-
-typedef struct VkSemaphoreWaitInfoKHR {
- VkStructureType sType;
- const void* pNext;
- VkSemaphoreWaitFlagsKHR flags;
- uint32_t semaphoreCount;
- const VkSemaphore* pSemaphores;
- const uint64_t* pValues;
-} VkSemaphoreWaitInfoKHR;
-
-typedef struct VkSemaphoreSignalInfoKHR {
- VkStructureType sType;
- const void* pNext;
- VkSemaphore semaphore;
- uint64_t value;
-} VkSemaphoreSignalInfoKHR;
-
-typedef VkResult (VKAPI_PTR *PFN_vkGetSemaphoreCounterValueKHR)(VkDevice device, VkSemaphore semaphore, uint64_t* pValue);
-typedef VkResult (VKAPI_PTR *PFN_vkWaitSemaphoresKHR)(VkDevice device, const VkSemaphoreWaitInfoKHR* pWaitInfo, uint64_t timeout);
-typedef VkResult (VKAPI_PTR *PFN_vkSignalSemaphoreKHR)(VkDevice device, const VkSemaphoreSignalInfoKHR* pSignalInfo);
-
-#ifndef VK_NO_PROTOTYPES
-VKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreCounterValueKHR(
- VkDevice device,
- VkSemaphore semaphore,
- uint64_t* pValue);
-
-VKAPI_ATTR VkResult VKAPI_CALL vkWaitSemaphoresKHR(
- VkDevice device,
- const VkSemaphoreWaitInfoKHR* pWaitInfo,
- uint64_t timeout);
-
-VKAPI_ATTR VkResult VKAPI_CALL vkSignalSemaphoreKHR(
- VkDevice device,
- const VkSemaphoreSignalInfoKHR* pSignalInfo);
-#endif
-
-
#define VK_EXT_debug_report 1
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDebugReportCallbackEXT)
#define VK_EXT_DEBUG_REPORT_SPEC_VERSION 9
@@ -6837,7 +7715,7 @@
#define VK_AMD_draw_indirect_count 1
-#define VK_AMD_DRAW_INDIRECT_COUNT_SPEC_VERSION 1
+#define VK_AMD_DRAW_INDIRECT_COUNT_SPEC_VERSION 2
#define VK_AMD_DRAW_INDIRECT_COUNT_EXTENSION_NAME "VK_AMD_draw_indirect_count"
typedef void (VKAPI_PTR *PFN_vkCmdDrawIndirectCountAMD)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride);
typedef void (VKAPI_PTR *PFN_vkCmdDrawIndexedIndirectCountAMD)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride);
@@ -7014,7 +7892,7 @@
#define VK_EXT_validation_flags 1
-#define VK_EXT_VALIDATION_FLAGS_SPEC_VERSION 1
+#define VK_EXT_VALIDATION_FLAGS_SPEC_VERSION 2
#define VK_EXT_VALIDATION_FLAGS_EXTENSION_NAME "VK_EXT_validation_flags"
typedef enum VkValidationCheckEXT {
@@ -7044,6 +7922,17 @@
#define VK_EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME "VK_EXT_shader_subgroup_vote"
+#define VK_EXT_texture_compression_astc_hdr 1
+#define VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_SPEC_VERSION 1
+#define VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_EXTENSION_NAME "VK_EXT_texture_compression_astc_hdr"
+typedef struct VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT {
+ VkStructureType sType;
+ const void* pNext;
+ VkBool32 textureCompressionASTC_HDR;
+} VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT;
+
+
+
#define VK_EXT_astc_decode_mode 1
#define VK_EXT_ASTC_DECODE_MODE_SPEC_VERSION 1
#define VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME "VK_EXT_astc_decode_mode"
@@ -7062,7 +7951,7 @@
#define VK_EXT_conditional_rendering 1
-#define VK_EXT_CONDITIONAL_RENDERING_SPEC_VERSION 1
+#define VK_EXT_CONDITIONAL_RENDERING_SPEC_VERSION 2
#define VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME "VK_EXT_conditional_rendering"
typedef enum VkConditionalRenderingFlagBitsEXT {
@@ -7694,7 +8583,7 @@
#define VK_EXT_hdr_metadata 1
-#define VK_EXT_HDR_METADATA_SPEC_VERSION 1
+#define VK_EXT_HDR_METADATA_SPEC_VERSION 2
#define VK_EXT_HDR_METADATA_EXTENSION_NAME "VK_EXT_hdr_metadata"
typedef struct VkXYColorEXT {
float x;
@@ -7878,30 +8767,13 @@
#define VK_EXT_sampler_filter_minmax 1
-#define VK_EXT_SAMPLER_FILTER_MINMAX_SPEC_VERSION 1
+#define VK_EXT_SAMPLER_FILTER_MINMAX_SPEC_VERSION 2
#define VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME "VK_EXT_sampler_filter_minmax"
+typedef VkSamplerReductionMode VkSamplerReductionModeEXT;
-typedef enum VkSamplerReductionModeEXT {
- VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT = 0,
- VK_SAMPLER_REDUCTION_MODE_MIN_EXT = 1,
- VK_SAMPLER_REDUCTION_MODE_MAX_EXT = 2,
- VK_SAMPLER_REDUCTION_MODE_BEGIN_RANGE_EXT = VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT,
- VK_SAMPLER_REDUCTION_MODE_END_RANGE_EXT = VK_SAMPLER_REDUCTION_MODE_MAX_EXT,
- VK_SAMPLER_REDUCTION_MODE_RANGE_SIZE_EXT = (VK_SAMPLER_REDUCTION_MODE_MAX_EXT - VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT + 1),
- VK_SAMPLER_REDUCTION_MODE_MAX_ENUM_EXT = 0x7FFFFFFF
-} VkSamplerReductionModeEXT;
-typedef struct VkSamplerReductionModeCreateInfoEXT {
- VkStructureType sType;
- const void* pNext;
- VkSamplerReductionModeEXT reductionMode;
-} VkSamplerReductionModeCreateInfoEXT;
+typedef VkSamplerReductionModeCreateInfo VkSamplerReductionModeCreateInfoEXT;
-typedef struct VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT {
- VkStructureType sType;
- void* pNext;
- VkBool32 filterMinmaxSingleComponentFormats;
- VkBool32 filterMinmaxImageComponentMapping;
-} VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT;
+typedef VkPhysicalDeviceSamplerFilterMinmaxProperties VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT;
@@ -8118,6 +8990,24 @@
#define VK_NV_FILL_RECTANGLE_EXTENSION_NAME "VK_NV_fill_rectangle"
+#define VK_NV_shader_sm_builtins 1
+#define VK_NV_SHADER_SM_BUILTINS_SPEC_VERSION 1
+#define VK_NV_SHADER_SM_BUILTINS_EXTENSION_NAME "VK_NV_shader_sm_builtins"
+typedef struct VkPhysicalDeviceShaderSMBuiltinsPropertiesNV {
+ VkStructureType sType;
+ void* pNext;
+ uint32_t shaderSMCount;
+ uint32_t shaderWarpsPerSM;
+} VkPhysicalDeviceShaderSMBuiltinsPropertiesNV;
+
+typedef struct VkPhysicalDeviceShaderSMBuiltinsFeaturesNV {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 shaderSMBuiltins;
+} VkPhysicalDeviceShaderSMBuiltinsFeaturesNV;
+
+
+
#define VK_EXT_post_depth_coverage 1
#define VK_EXT_POST_DEPTH_COVERAGE_SPEC_VERSION 1
#define VK_EXT_POST_DEPTH_COVERAGE_EXTENSION_NAME "VK_EXT_post_depth_coverage"
@@ -8250,87 +9140,19 @@
#define VK_EXT_descriptor_indexing 1
#define VK_EXT_DESCRIPTOR_INDEXING_SPEC_VERSION 2
#define VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME "VK_EXT_descriptor_indexing"
+typedef VkDescriptorBindingFlagBits VkDescriptorBindingFlagBitsEXT;
-typedef enum VkDescriptorBindingFlagBitsEXT {
- VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT = 0x00000001,
- VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT = 0x00000002,
- VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT = 0x00000004,
- VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT = 0x00000008,
- VK_DESCRIPTOR_BINDING_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF
-} VkDescriptorBindingFlagBitsEXT;
-typedef VkFlags VkDescriptorBindingFlagsEXT;
-typedef struct VkDescriptorSetLayoutBindingFlagsCreateInfoEXT {
- VkStructureType sType;
- const void* pNext;
- uint32_t bindingCount;
- const VkDescriptorBindingFlagsEXT* pBindingFlags;
-} VkDescriptorSetLayoutBindingFlagsCreateInfoEXT;
+typedef VkDescriptorBindingFlags VkDescriptorBindingFlagsEXT;
-typedef struct VkPhysicalDeviceDescriptorIndexingFeaturesEXT {
- VkStructureType sType;
- void* pNext;
- VkBool32 shaderInputAttachmentArrayDynamicIndexing;
- VkBool32 shaderUniformTexelBufferArrayDynamicIndexing;
- VkBool32 shaderStorageTexelBufferArrayDynamicIndexing;
- VkBool32 shaderUniformBufferArrayNonUniformIndexing;
- VkBool32 shaderSampledImageArrayNonUniformIndexing;
- VkBool32 shaderStorageBufferArrayNonUniformIndexing;
- VkBool32 shaderStorageImageArrayNonUniformIndexing;
- VkBool32 shaderInputAttachmentArrayNonUniformIndexing;
- VkBool32 shaderUniformTexelBufferArrayNonUniformIndexing;
- VkBool32 shaderStorageTexelBufferArrayNonUniformIndexing;
- VkBool32 descriptorBindingUniformBufferUpdateAfterBind;
- VkBool32 descriptorBindingSampledImageUpdateAfterBind;
- VkBool32 descriptorBindingStorageImageUpdateAfterBind;
- VkBool32 descriptorBindingStorageBufferUpdateAfterBind;
- VkBool32 descriptorBindingUniformTexelBufferUpdateAfterBind;
- VkBool32 descriptorBindingStorageTexelBufferUpdateAfterBind;
- VkBool32 descriptorBindingUpdateUnusedWhilePending;
- VkBool32 descriptorBindingPartiallyBound;
- VkBool32 descriptorBindingVariableDescriptorCount;
- VkBool32 runtimeDescriptorArray;
-} VkPhysicalDeviceDescriptorIndexingFeaturesEXT;
+typedef VkDescriptorSetLayoutBindingFlagsCreateInfo VkDescriptorSetLayoutBindingFlagsCreateInfoEXT;
-typedef struct VkPhysicalDeviceDescriptorIndexingPropertiesEXT {
- VkStructureType sType;
- void* pNext;
- uint32_t maxUpdateAfterBindDescriptorsInAllPools;
- VkBool32 shaderUniformBufferArrayNonUniformIndexingNative;
- VkBool32 shaderSampledImageArrayNonUniformIndexingNative;
- VkBool32 shaderStorageBufferArrayNonUniformIndexingNative;
- VkBool32 shaderStorageImageArrayNonUniformIndexingNative;
- VkBool32 shaderInputAttachmentArrayNonUniformIndexingNative;
- VkBool32 robustBufferAccessUpdateAfterBind;
- VkBool32 quadDivergentImplicitLod;
- uint32_t maxPerStageDescriptorUpdateAfterBindSamplers;
- uint32_t maxPerStageDescriptorUpdateAfterBindUniformBuffers;
- uint32_t maxPerStageDescriptorUpdateAfterBindStorageBuffers;
- uint32_t maxPerStageDescriptorUpdateAfterBindSampledImages;
- uint32_t maxPerStageDescriptorUpdateAfterBindStorageImages;
- uint32_t maxPerStageDescriptorUpdateAfterBindInputAttachments;
- uint32_t maxPerStageUpdateAfterBindResources;
- uint32_t maxDescriptorSetUpdateAfterBindSamplers;
- uint32_t maxDescriptorSetUpdateAfterBindUniformBuffers;
- uint32_t maxDescriptorSetUpdateAfterBindUniformBuffersDynamic;
- uint32_t maxDescriptorSetUpdateAfterBindStorageBuffers;
- uint32_t maxDescriptorSetUpdateAfterBindStorageBuffersDynamic;
- uint32_t maxDescriptorSetUpdateAfterBindSampledImages;
- uint32_t maxDescriptorSetUpdateAfterBindStorageImages;
- uint32_t maxDescriptorSetUpdateAfterBindInputAttachments;
-} VkPhysicalDeviceDescriptorIndexingPropertiesEXT;
+typedef VkPhysicalDeviceDescriptorIndexingFeatures VkPhysicalDeviceDescriptorIndexingFeaturesEXT;
-typedef struct VkDescriptorSetVariableDescriptorCountAllocateInfoEXT {
- VkStructureType sType;
- const void* pNext;
- uint32_t descriptorSetCount;
- const uint32_t* pDescriptorCounts;
-} VkDescriptorSetVariableDescriptorCountAllocateInfoEXT;
+typedef VkPhysicalDeviceDescriptorIndexingProperties VkPhysicalDeviceDescriptorIndexingPropertiesEXT;
-typedef struct VkDescriptorSetVariableDescriptorCountLayoutSupportEXT {
- VkStructureType sType;
- void* pNext;
- uint32_t maxVariableDescriptorCount;
-} VkDescriptorSetVariableDescriptorCountLayoutSupportEXT;
+typedef VkDescriptorSetVariableDescriptorCountAllocateInfo VkDescriptorSetVariableDescriptorCountAllocateInfoEXT;
+
+typedef VkDescriptorSetVariableDescriptorCountLayoutSupport VkDescriptorSetVariableDescriptorCountLayoutSupportEXT;
@@ -8451,6 +9273,15 @@
#define VK_NV_RAY_TRACING_EXTENSION_NAME "VK_NV_ray_tracing"
#define VK_SHADER_UNUSED_NV (~0U)
+typedef enum VkAccelerationStructureTypeNV {
+ VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV = 0,
+ VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV = 1,
+ VK_ACCELERATION_STRUCTURE_TYPE_BEGIN_RANGE_NV = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV,
+ VK_ACCELERATION_STRUCTURE_TYPE_END_RANGE_NV = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV,
+ VK_ACCELERATION_STRUCTURE_TYPE_RANGE_SIZE_NV = (VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV - VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV + 1),
+ VK_ACCELERATION_STRUCTURE_TYPE_MAX_ENUM_NV = 0x7FFFFFFF
+} VkAccelerationStructureTypeNV;
+
typedef enum VkRayTracingShaderGroupTypeNV {
VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV = 0,
VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_NV = 1,
@@ -8470,15 +9301,6 @@
VK_GEOMETRY_TYPE_MAX_ENUM_NV = 0x7FFFFFFF
} VkGeometryTypeNV;
-typedef enum VkAccelerationStructureTypeNV {
- VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV = 0,
- VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV = 1,
- VK_ACCELERATION_STRUCTURE_TYPE_BEGIN_RANGE_NV = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV,
- VK_ACCELERATION_STRUCTURE_TYPE_END_RANGE_NV = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV,
- VK_ACCELERATION_STRUCTURE_TYPE_RANGE_SIZE_NV = (VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV - VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV + 1),
- VK_ACCELERATION_STRUCTURE_TYPE_MAX_ENUM_NV = 0x7FFFFFFF
-} VkAccelerationStructureTypeNV;
-
typedef enum VkCopyAccelerationStructureModeNV {
VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_NV = 0,
VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_NV = 1,
@@ -8746,7 +9568,7 @@
#define VK_NV_representative_fragment_test 1
-#define VK_NV_REPRESENTATIVE_FRAGMENT_TEST_SPEC_VERSION 1
+#define VK_NV_REPRESENTATIVE_FRAGMENT_TEST_SPEC_VERSION 2
#define VK_NV_REPRESENTATIVE_FRAGMENT_TEST_EXTENSION_NAME "VK_NV_representative_fragment_test"
typedef struct VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV {
VkStructureType sType;
@@ -8763,7 +9585,7 @@
#define VK_EXT_filter_cubic 1
-#define VK_EXT_FILTER_CUBIC_SPEC_VERSION 1
+#define VK_EXT_FILTER_CUBIC_SPEC_VERSION 2
#define VK_EXT_FILTER_CUBIC_EXTENSION_NAME "VK_EXT_filter_cubic"
typedef struct VkPhysicalDeviceImageViewImageFormatInfoEXT {
VkStructureType sType;
@@ -8775,7 +9597,7 @@
VkStructureType sType;
void* pNext;
VkBool32 filterCubic;
- VkBool32 filterCubicMinmax ;
+ VkBool32 filterCubicMinmax;
} VkFilterCubicImageViewImageFormatPropertiesEXT;
@@ -8850,6 +9672,22 @@
#endif
+#define VK_AMD_pipeline_compiler_control 1
+#define VK_AMD_PIPELINE_COMPILER_CONTROL_SPEC_VERSION 1
+#define VK_AMD_PIPELINE_COMPILER_CONTROL_EXTENSION_NAME "VK_AMD_pipeline_compiler_control"
+
+typedef enum VkPipelineCompilerControlFlagBitsAMD {
+ VK_PIPELINE_COMPILER_CONTROL_FLAG_BITS_MAX_ENUM_AMD = 0x7FFFFFFF
+} VkPipelineCompilerControlFlagBitsAMD;
+typedef VkFlags VkPipelineCompilerControlFlagsAMD;
+typedef struct VkPipelineCompilerControlCreateInfoAMD {
+ VkStructureType sType;
+ const void* pNext;
+ VkPipelineCompilerControlFlagsAMD compilerControlFlags;
+} VkPipelineCompilerControlCreateInfoAMD;
+
+
+
#define VK_EXT_calibrated_timestamps 1
#define VK_EXT_CALIBRATED_TIMESTAMPS_SPEC_VERSION 1
#define VK_EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME "VK_EXT_calibrated_timestamps"
@@ -8889,7 +9727,7 @@
#define VK_AMD_shader_core_properties 1
-#define VK_AMD_SHADER_CORE_PROPERTIES_SPEC_VERSION 1
+#define VK_AMD_SHADER_CORE_PROPERTIES_SPEC_VERSION 2
#define VK_AMD_SHADER_CORE_PROPERTIES_EXTENSION_NAME "VK_AMD_shader_core_properties"
typedef struct VkPhysicalDeviceShaderCorePropertiesAMD {
VkStructureType sType;
@@ -9079,7 +9917,7 @@
#define VK_NV_shader_image_footprint 1
-#define VK_NV_SHADER_IMAGE_FOOTPRINT_SPEC_VERSION 1
+#define VK_NV_SHADER_IMAGE_FOOTPRINT_SPEC_VERSION 2
#define VK_NV_SHADER_IMAGE_FOOTPRINT_EXTENSION_NAME "VK_NV_shader_image_footprint"
typedef struct VkPhysicalDeviceShaderImageFootprintFeaturesNV {
VkStructureType sType;
@@ -9148,16 +9986,167 @@
#define VK_INTEL_shader_integer_functions2 1
-#define VK_INTEL_SHADER_INTEGER_FUNCTIONS2_SPEC_VERSION 1
-#define VK_INTEL_SHADER_INTEGER_FUNCTIONS2_EXTENSION_NAME "VK_INTEL_shader_integer_functions2"
-typedef struct VkPhysicalDeviceShaderIntegerFunctions2INTEL {
+#define VK_INTEL_SHADER_INTEGER_FUNCTIONS_2_SPEC_VERSION 1
+#define VK_INTEL_SHADER_INTEGER_FUNCTIONS_2_EXTENSION_NAME "VK_INTEL_shader_integer_functions2"
+typedef struct VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL {
VkStructureType sType;
void* pNext;
VkBool32 shaderIntegerFunctions2;
-} VkPhysicalDeviceShaderIntegerFunctions2INTEL;
+} VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL;
+#define VK_INTEL_performance_query 1
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPerformanceConfigurationINTEL)
+#define VK_INTEL_PERFORMANCE_QUERY_SPEC_VERSION 1
+#define VK_INTEL_PERFORMANCE_QUERY_EXTENSION_NAME "VK_INTEL_performance_query"
+
+typedef enum VkPerformanceConfigurationTypeINTEL {
+ VK_PERFORMANCE_CONFIGURATION_TYPE_COMMAND_QUEUE_METRICS_DISCOVERY_ACTIVATED_INTEL = 0,
+ VK_PERFORMANCE_CONFIGURATION_TYPE_BEGIN_RANGE_INTEL = VK_PERFORMANCE_CONFIGURATION_TYPE_COMMAND_QUEUE_METRICS_DISCOVERY_ACTIVATED_INTEL,
+ VK_PERFORMANCE_CONFIGURATION_TYPE_END_RANGE_INTEL = VK_PERFORMANCE_CONFIGURATION_TYPE_COMMAND_QUEUE_METRICS_DISCOVERY_ACTIVATED_INTEL,
+ VK_PERFORMANCE_CONFIGURATION_TYPE_RANGE_SIZE_INTEL = (VK_PERFORMANCE_CONFIGURATION_TYPE_COMMAND_QUEUE_METRICS_DISCOVERY_ACTIVATED_INTEL - VK_PERFORMANCE_CONFIGURATION_TYPE_COMMAND_QUEUE_METRICS_DISCOVERY_ACTIVATED_INTEL + 1),
+ VK_PERFORMANCE_CONFIGURATION_TYPE_MAX_ENUM_INTEL = 0x7FFFFFFF
+} VkPerformanceConfigurationTypeINTEL;
+
+typedef enum VkQueryPoolSamplingModeINTEL {
+ VK_QUERY_POOL_SAMPLING_MODE_MANUAL_INTEL = 0,
+ VK_QUERY_POOL_SAMPLING_MODE_BEGIN_RANGE_INTEL = VK_QUERY_POOL_SAMPLING_MODE_MANUAL_INTEL,
+ VK_QUERY_POOL_SAMPLING_MODE_END_RANGE_INTEL = VK_QUERY_POOL_SAMPLING_MODE_MANUAL_INTEL,
+ VK_QUERY_POOL_SAMPLING_MODE_RANGE_SIZE_INTEL = (VK_QUERY_POOL_SAMPLING_MODE_MANUAL_INTEL - VK_QUERY_POOL_SAMPLING_MODE_MANUAL_INTEL + 1),
+ VK_QUERY_POOL_SAMPLING_MODE_MAX_ENUM_INTEL = 0x7FFFFFFF
+} VkQueryPoolSamplingModeINTEL;
+
+typedef enum VkPerformanceOverrideTypeINTEL {
+ VK_PERFORMANCE_OVERRIDE_TYPE_NULL_HARDWARE_INTEL = 0,
+ VK_PERFORMANCE_OVERRIDE_TYPE_FLUSH_GPU_CACHES_INTEL = 1,
+ VK_PERFORMANCE_OVERRIDE_TYPE_BEGIN_RANGE_INTEL = VK_PERFORMANCE_OVERRIDE_TYPE_NULL_HARDWARE_INTEL,
+ VK_PERFORMANCE_OVERRIDE_TYPE_END_RANGE_INTEL = VK_PERFORMANCE_OVERRIDE_TYPE_FLUSH_GPU_CACHES_INTEL,
+ VK_PERFORMANCE_OVERRIDE_TYPE_RANGE_SIZE_INTEL = (VK_PERFORMANCE_OVERRIDE_TYPE_FLUSH_GPU_CACHES_INTEL - VK_PERFORMANCE_OVERRIDE_TYPE_NULL_HARDWARE_INTEL + 1),
+ VK_PERFORMANCE_OVERRIDE_TYPE_MAX_ENUM_INTEL = 0x7FFFFFFF
+} VkPerformanceOverrideTypeINTEL;
+
+typedef enum VkPerformanceParameterTypeINTEL {
+ VK_PERFORMANCE_PARAMETER_TYPE_HW_COUNTERS_SUPPORTED_INTEL = 0,
+ VK_PERFORMANCE_PARAMETER_TYPE_STREAM_MARKER_VALID_BITS_INTEL = 1,
+ VK_PERFORMANCE_PARAMETER_TYPE_BEGIN_RANGE_INTEL = VK_PERFORMANCE_PARAMETER_TYPE_HW_COUNTERS_SUPPORTED_INTEL,
+ VK_PERFORMANCE_PARAMETER_TYPE_END_RANGE_INTEL = VK_PERFORMANCE_PARAMETER_TYPE_STREAM_MARKER_VALID_BITS_INTEL,
+ VK_PERFORMANCE_PARAMETER_TYPE_RANGE_SIZE_INTEL = (VK_PERFORMANCE_PARAMETER_TYPE_STREAM_MARKER_VALID_BITS_INTEL - VK_PERFORMANCE_PARAMETER_TYPE_HW_COUNTERS_SUPPORTED_INTEL + 1),
+ VK_PERFORMANCE_PARAMETER_TYPE_MAX_ENUM_INTEL = 0x7FFFFFFF
+} VkPerformanceParameterTypeINTEL;
+
+typedef enum VkPerformanceValueTypeINTEL {
+ VK_PERFORMANCE_VALUE_TYPE_UINT32_INTEL = 0,
+ VK_PERFORMANCE_VALUE_TYPE_UINT64_INTEL = 1,
+ VK_PERFORMANCE_VALUE_TYPE_FLOAT_INTEL = 2,
+ VK_PERFORMANCE_VALUE_TYPE_BOOL_INTEL = 3,
+ VK_PERFORMANCE_VALUE_TYPE_STRING_INTEL = 4,
+ VK_PERFORMANCE_VALUE_TYPE_BEGIN_RANGE_INTEL = VK_PERFORMANCE_VALUE_TYPE_UINT32_INTEL,
+ VK_PERFORMANCE_VALUE_TYPE_END_RANGE_INTEL = VK_PERFORMANCE_VALUE_TYPE_STRING_INTEL,
+ VK_PERFORMANCE_VALUE_TYPE_RANGE_SIZE_INTEL = (VK_PERFORMANCE_VALUE_TYPE_STRING_INTEL - VK_PERFORMANCE_VALUE_TYPE_UINT32_INTEL + 1),
+ VK_PERFORMANCE_VALUE_TYPE_MAX_ENUM_INTEL = 0x7FFFFFFF
+} VkPerformanceValueTypeINTEL;
+typedef union VkPerformanceValueDataINTEL {
+ uint32_t value32;
+ uint64_t value64;
+ float valueFloat;
+ VkBool32 valueBool;
+ const char* valueString;
+} VkPerformanceValueDataINTEL;
+
+typedef struct VkPerformanceValueINTEL {
+ VkPerformanceValueTypeINTEL type;
+ VkPerformanceValueDataINTEL data;
+} VkPerformanceValueINTEL;
+
+typedef struct VkInitializePerformanceApiInfoINTEL {
+ VkStructureType sType;
+ const void* pNext;
+ void* pUserData;
+} VkInitializePerformanceApiInfoINTEL;
+
+typedef struct VkQueryPoolCreateInfoINTEL {
+ VkStructureType sType;
+ const void* pNext;
+ VkQueryPoolSamplingModeINTEL performanceCountersSampling;
+} VkQueryPoolCreateInfoINTEL;
+
+typedef struct VkPerformanceMarkerInfoINTEL {
+ VkStructureType sType;
+ const void* pNext;
+ uint64_t marker;
+} VkPerformanceMarkerInfoINTEL;
+
+typedef struct VkPerformanceStreamMarkerInfoINTEL {
+ VkStructureType sType;
+ const void* pNext;
+ uint32_t marker;
+} VkPerformanceStreamMarkerInfoINTEL;
+
+typedef struct VkPerformanceOverrideInfoINTEL {
+ VkStructureType sType;
+ const void* pNext;
+ VkPerformanceOverrideTypeINTEL type;
+ VkBool32 enable;
+ uint64_t parameter;
+} VkPerformanceOverrideInfoINTEL;
+
+typedef struct VkPerformanceConfigurationAcquireInfoINTEL {
+ VkStructureType sType;
+ const void* pNext;
+ VkPerformanceConfigurationTypeINTEL type;
+} VkPerformanceConfigurationAcquireInfoINTEL;
+
+typedef VkResult (VKAPI_PTR *PFN_vkInitializePerformanceApiINTEL)(VkDevice device, const VkInitializePerformanceApiInfoINTEL* pInitializeInfo);
+typedef void (VKAPI_PTR *PFN_vkUninitializePerformanceApiINTEL)(VkDevice device);
+typedef VkResult (VKAPI_PTR *PFN_vkCmdSetPerformanceMarkerINTEL)(VkCommandBuffer commandBuffer, const VkPerformanceMarkerInfoINTEL* pMarkerInfo);
+typedef VkResult (VKAPI_PTR *PFN_vkCmdSetPerformanceStreamMarkerINTEL)(VkCommandBuffer commandBuffer, const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo);
+typedef VkResult (VKAPI_PTR *PFN_vkCmdSetPerformanceOverrideINTEL)(VkCommandBuffer commandBuffer, const VkPerformanceOverrideInfoINTEL* pOverrideInfo);
+typedef VkResult (VKAPI_PTR *PFN_vkAcquirePerformanceConfigurationINTEL)(VkDevice device, const VkPerformanceConfigurationAcquireInfoINTEL* pAcquireInfo, VkPerformanceConfigurationINTEL* pConfiguration);
+typedef VkResult (VKAPI_PTR *PFN_vkReleasePerformanceConfigurationINTEL)(VkDevice device, VkPerformanceConfigurationINTEL configuration);
+typedef VkResult (VKAPI_PTR *PFN_vkQueueSetPerformanceConfigurationINTEL)(VkQueue queue, VkPerformanceConfigurationINTEL configuration);
+typedef VkResult (VKAPI_PTR *PFN_vkGetPerformanceParameterINTEL)(VkDevice device, VkPerformanceParameterTypeINTEL parameter, VkPerformanceValueINTEL* pValue);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR VkResult VKAPI_CALL vkInitializePerformanceApiINTEL(
+ VkDevice device,
+ const VkInitializePerformanceApiInfoINTEL* pInitializeInfo);
+
+VKAPI_ATTR void VKAPI_CALL vkUninitializePerformanceApiINTEL(
+ VkDevice device);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkCmdSetPerformanceMarkerINTEL(
+ VkCommandBuffer commandBuffer,
+ const VkPerformanceMarkerInfoINTEL* pMarkerInfo);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkCmdSetPerformanceStreamMarkerINTEL(
+ VkCommandBuffer commandBuffer,
+ const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkCmdSetPerformanceOverrideINTEL(
+ VkCommandBuffer commandBuffer,
+ const VkPerformanceOverrideInfoINTEL* pOverrideInfo);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkAcquirePerformanceConfigurationINTEL(
+ VkDevice device,
+ const VkPerformanceConfigurationAcquireInfoINTEL* pAcquireInfo,
+ VkPerformanceConfigurationINTEL* pConfiguration);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkReleasePerformanceConfigurationINTEL(
+ VkDevice device,
+ VkPerformanceConfigurationINTEL configuration);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkQueueSetPerformanceConfigurationINTEL(
+ VkQueue queue,
+ VkPerformanceConfigurationINTEL configuration);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkGetPerformanceParameterINTEL(
+ VkDevice device,
+ VkPerformanceParameterTypeINTEL parameter,
+ VkPerformanceValueINTEL* pValue);
+#endif
+
+
#define VK_EXT_pci_bus_info 1
#define VK_EXT_PCI_BUS_INFO_SPEC_VERSION 2
#define VK_EXT_PCI_BUS_INFO_EXTENSION_NAME "VK_EXT_pci_bus_info"
@@ -9227,11 +10216,7 @@
#define VK_EXT_scalar_block_layout 1
#define VK_EXT_SCALAR_BLOCK_LAYOUT_SPEC_VERSION 1
#define VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME "VK_EXT_scalar_block_layout"
-typedef struct VkPhysicalDeviceScalarBlockLayoutFeaturesEXT {
- VkStructureType sType;
- void* pNext;
- VkBool32 scalarBlockLayout;
-} VkPhysicalDeviceScalarBlockLayoutFeaturesEXT;
+typedef VkPhysicalDeviceScalarBlockLayoutFeatures VkPhysicalDeviceScalarBlockLayoutFeaturesEXT;
@@ -9245,6 +10230,61 @@
#define VK_GOOGLE_DECORATE_STRING_EXTENSION_NAME "VK_GOOGLE_decorate_string"
+#define VK_EXT_subgroup_size_control 1
+#define VK_EXT_SUBGROUP_SIZE_CONTROL_SPEC_VERSION 2
+#define VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME "VK_EXT_subgroup_size_control"
+typedef struct VkPhysicalDeviceSubgroupSizeControlFeaturesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 subgroupSizeControl;
+ VkBool32 computeFullSubgroups;
+} VkPhysicalDeviceSubgroupSizeControlFeaturesEXT;
+
+typedef struct VkPhysicalDeviceSubgroupSizeControlPropertiesEXT {
+ VkStructureType sType;
+ void* pNext;
+ uint32_t minSubgroupSize;
+ uint32_t maxSubgroupSize;
+ uint32_t maxComputeWorkgroupSubgroups;
+ VkShaderStageFlags requiredSubgroupSizeStages;
+} VkPhysicalDeviceSubgroupSizeControlPropertiesEXT;
+
+typedef struct VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT {
+ VkStructureType sType;
+ void* pNext;
+ uint32_t requiredSubgroupSize;
+} VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT;
+
+
+
+#define VK_AMD_shader_core_properties2 1
+#define VK_AMD_SHADER_CORE_PROPERTIES_2_SPEC_VERSION 1
+#define VK_AMD_SHADER_CORE_PROPERTIES_2_EXTENSION_NAME "VK_AMD_shader_core_properties2"
+
+typedef enum VkShaderCorePropertiesFlagBitsAMD {
+ VK_SHADER_CORE_PROPERTIES_FLAG_BITS_MAX_ENUM_AMD = 0x7FFFFFFF
+} VkShaderCorePropertiesFlagBitsAMD;
+typedef VkFlags VkShaderCorePropertiesFlagsAMD;
+typedef struct VkPhysicalDeviceShaderCoreProperties2AMD {
+ VkStructureType sType;
+ void* pNext;
+ VkShaderCorePropertiesFlagsAMD shaderCoreFeatures;
+ uint32_t activeComputeUnitCount;
+} VkPhysicalDeviceShaderCoreProperties2AMD;
+
+
+
+#define VK_AMD_device_coherent_memory 1
+#define VK_AMD_DEVICE_COHERENT_MEMORY_SPEC_VERSION 1
+#define VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME "VK_AMD_device_coherent_memory"
+typedef struct VkPhysicalDeviceCoherentMemoryFeaturesAMD {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 deviceCoherentMemory;
+} VkPhysicalDeviceCoherentMemoryFeaturesAMD;
+
+
+
#define VK_EXT_memory_budget 1
#define VK_EXT_MEMORY_BUDGET_SPEC_VERSION 1
#define VK_EXT_MEMORY_BUDGET_EXTENSION_NAME "VK_EXT_memory_budget"
@@ -9286,7 +10326,6 @@
#define VK_EXT_buffer_device_address 1
-typedef uint64_t VkDeviceAddress;
#define VK_EXT_BUFFER_DEVICE_ADDRESS_SPEC_VERSION 2
#define VK_EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME "VK_EXT_buffer_device_address"
typedef struct VkPhysicalDeviceBufferDeviceAddressFeaturesEXT {
@@ -9299,11 +10338,7 @@
typedef VkPhysicalDeviceBufferDeviceAddressFeaturesEXT VkPhysicalDeviceBufferAddressFeaturesEXT;
-typedef struct VkBufferDeviceAddressInfoEXT {
- VkStructureType sType;
- const void* pNext;
- VkBuffer buffer;
-} VkBufferDeviceAddressInfoEXT;
+typedef VkBufferDeviceAddressInfo VkBufferDeviceAddressInfoEXT;
typedef struct VkBufferDeviceAddressCreateInfoEXT {
VkStructureType sType;
@@ -9311,36 +10346,33 @@
VkDeviceAddress deviceAddress;
} VkBufferDeviceAddressCreateInfoEXT;
-typedef VkDeviceAddress (VKAPI_PTR *PFN_vkGetBufferDeviceAddressEXT)(VkDevice device, const VkBufferDeviceAddressInfoEXT* pInfo);
+typedef VkDeviceAddress (VKAPI_PTR *PFN_vkGetBufferDeviceAddressEXT)(VkDevice device, const VkBufferDeviceAddressInfo* pInfo);
#ifndef VK_NO_PROTOTYPES
VKAPI_ATTR VkDeviceAddress VKAPI_CALL vkGetBufferDeviceAddressEXT(
VkDevice device,
- const VkBufferDeviceAddressInfoEXT* pInfo);
+ const VkBufferDeviceAddressInfo* pInfo);
#endif
#define VK_EXT_separate_stencil_usage 1
#define VK_EXT_SEPARATE_STENCIL_USAGE_SPEC_VERSION 1
#define VK_EXT_SEPARATE_STENCIL_USAGE_EXTENSION_NAME "VK_EXT_separate_stencil_usage"
+typedef VkImageStencilUsageCreateInfo VkImageStencilUsageCreateInfoEXT;
-typedef struct VkImageStencilUsageCreateInfoEXT {
- VkStructureType sType;
- const void* pNext;
- VkImageUsageFlags stencilUsage;
-} VkImageStencilUsageCreateInfoEXT;
#define VK_EXT_validation_features 1
-#define VK_EXT_VALIDATION_FEATURES_SPEC_VERSION 1
+#define VK_EXT_VALIDATION_FEATURES_SPEC_VERSION 2
#define VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME "VK_EXT_validation_features"
typedef enum VkValidationFeatureEnableEXT {
VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT = 0,
VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT = 1,
+ VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT = 2,
VK_VALIDATION_FEATURE_ENABLE_BEGIN_RANGE_EXT = VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT,
- VK_VALIDATION_FEATURE_ENABLE_END_RANGE_EXT = VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT,
- VK_VALIDATION_FEATURE_ENABLE_RANGE_SIZE_EXT = (VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT - VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT + 1),
+ VK_VALIDATION_FEATURE_ENABLE_END_RANGE_EXT = VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT,
+ VK_VALIDATION_FEATURE_ENABLE_RANGE_SIZE_EXT = (VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT - VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT + 1),
VK_VALIDATION_FEATURE_ENABLE_MAX_ENUM_EXT = 0x7FFFFFFF
} VkValidationFeatureEnableEXT;
@@ -9367,6 +10399,7 @@
} VkValidationFeaturesEXT;
+
#define VK_NV_cooperative_matrix 1
#define VK_NV_COOPERATIVE_MATRIX_SPEC_VERSION 1
#define VK_NV_COOPERATIVE_MATRIX_EXTENSION_NAME "VK_NV_cooperative_matrix"
@@ -9492,6 +10525,7 @@
} VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT;
+
#define VK_EXT_ycbcr_image_arrays 1
#define VK_EXT_YCBCR_IMAGE_ARRAYS_SPEC_VERSION 1
#define VK_EXT_YCBCR_IMAGE_ARRAYS_EXTENSION_NAME "VK_EXT_ycbcr_image_arrays"
@@ -9504,7 +10538,7 @@
#define VK_EXT_headless_surface 1
-#define VK_EXT_HEADLESS_SURFACE_SPEC_VERSION 0
+#define VK_EXT_HEADLESS_SURFACE_SPEC_VERSION 1
#define VK_EXT_HEADLESS_SURFACE_EXTENSION_NAME "VK_EXT_headless_surface"
typedef VkFlags VkHeadlessSurfaceCreateFlagsEXT;
typedef struct VkHeadlessSurfaceCreateInfoEXT {
@@ -9524,14 +10558,60 @@
#endif
+#define VK_EXT_line_rasterization 1
+#define VK_EXT_LINE_RASTERIZATION_SPEC_VERSION 1
+#define VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME "VK_EXT_line_rasterization"
+
+typedef enum VkLineRasterizationModeEXT {
+ VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT = 0,
+ VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT = 1,
+ VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT = 2,
+ VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT = 3,
+ VK_LINE_RASTERIZATION_MODE_BEGIN_RANGE_EXT = VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT,
+ VK_LINE_RASTERIZATION_MODE_END_RANGE_EXT = VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT,
+ VK_LINE_RASTERIZATION_MODE_RANGE_SIZE_EXT = (VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT - VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT + 1),
+ VK_LINE_RASTERIZATION_MODE_MAX_ENUM_EXT = 0x7FFFFFFF
+} VkLineRasterizationModeEXT;
+typedef struct VkPhysicalDeviceLineRasterizationFeaturesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 rectangularLines;
+ VkBool32 bresenhamLines;
+ VkBool32 smoothLines;
+ VkBool32 stippledRectangularLines;
+ VkBool32 stippledBresenhamLines;
+ VkBool32 stippledSmoothLines;
+} VkPhysicalDeviceLineRasterizationFeaturesEXT;
+
+typedef struct VkPhysicalDeviceLineRasterizationPropertiesEXT {
+ VkStructureType sType;
+ void* pNext;
+ uint32_t lineSubPixelPrecisionBits;
+} VkPhysicalDeviceLineRasterizationPropertiesEXT;
+
+typedef struct VkPipelineRasterizationLineStateCreateInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ VkLineRasterizationModeEXT lineRasterizationMode;
+ VkBool32 stippledLineEnable;
+ uint32_t lineStippleFactor;
+ uint16_t lineStipplePattern;
+} VkPipelineRasterizationLineStateCreateInfoEXT;
+
+typedef void (VKAPI_PTR *PFN_vkCmdSetLineStippleEXT)(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, uint16_t lineStipplePattern);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR void VKAPI_CALL vkCmdSetLineStippleEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t lineStippleFactor,
+ uint16_t lineStipplePattern);
+#endif
+
+
#define VK_EXT_host_query_reset 1
#define VK_EXT_HOST_QUERY_RESET_SPEC_VERSION 1
#define VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME "VK_EXT_host_query_reset"
-typedef struct VkPhysicalDeviceHostQueryResetFeaturesEXT {
- VkStructureType sType;
- void* pNext;
- VkBool32 hostQueryReset;
-} VkPhysicalDeviceHostQueryResetFeaturesEXT;
+typedef VkPhysicalDeviceHostQueryResetFeatures VkPhysicalDeviceHostQueryResetFeaturesEXT;
typedef void (VKAPI_PTR *PFN_vkResetQueryPoolEXT)(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount);
@@ -9543,6 +10623,7 @@
uint32_t queryCount);
#endif
+
#define VK_EXT_index_type_uint8 1
#define VK_EXT_INDEX_TYPE_UINT8_SPEC_VERSION 1
#define VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME "VK_EXT_index_type_uint8"
@@ -9553,6 +10634,7 @@
} VkPhysicalDeviceIndexTypeUint8FeaturesEXT;
+
#define VK_EXT_shader_demote_to_helper_invocation 1
#define VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_SPEC_VERSION 1
#define VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME "VK_EXT_shader_demote_to_helper_invocation"
@@ -9563,6 +10645,31 @@
} VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT;
+
+#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"
+typedef struct VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 texelBufferAlignment;
+} VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT;
+
+typedef struct VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkDeviceSize storageTexelBufferOffsetAlignmentBytes;
+ VkBool32 storageTexelBufferOffsetSingleTexelAlignment;
+ VkDeviceSize uniformTexelBufferOffsetAlignmentBytes;
+ VkBool32 uniformTexelBufferOffsetSingleTexelAlignment;
+} VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT;
+
+
+
+#define VK_GOOGLE_user_type 1
+#define VK_GOOGLE_USER_TYPE_SPEC_VERSION 1
+#define VK_GOOGLE_USER_TYPE_EXTENSION_NAME "VK_GOOGLE_user_type"
+
#ifdef __cplusplus
}
#endif
diff --git a/external/vulkancts/scripts/src/vulkan_fuchsia.h b/external/vulkancts/scripts/src/vulkan_fuchsia.h
index 4c62a7c..81ebe55 100644
--- a/external/vulkancts/scripts/src/vulkan_fuchsia.h
+++ b/external/vulkancts/scripts/src/vulkan_fuchsia.h
@@ -1,10 +1,6 @@
#ifndef VULKAN_FUCHSIA_H_
#define VULKAN_FUCHSIA_H_ 1
-#ifdef __cplusplus
-extern "C" {
-#endif
-
/*
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
@@ -27,6 +23,11 @@
*/
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
#define VK_FUCHSIA_imagepipe_surface 1
#define VK_FUCHSIA_IMAGEPIPE_SURFACE_SPEC_VERSION 1
diff --git a/external/vulkancts/scripts/src/vulkan_ggp.h b/external/vulkancts/scripts/src/vulkan_ggp.h
index 3d67c4b..fd30613 100644
--- a/external/vulkancts/scripts/src/vulkan_ggp.h
+++ b/external/vulkancts/scripts/src/vulkan_ggp.h
@@ -1,10 +1,6 @@
#ifndef VULKAN_GGP_H_
#define VULKAN_GGP_H_ 1
-#ifdef __cplusplus
-extern "C" {
-#endif
-
/*
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
@@ -27,6 +23,11 @@
*/
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
#define VK_GGP_stream_descriptor_surface 1
#define VK_GGP_STREAM_DESCRIPTOR_SURFACE_SPEC_VERSION 1
diff --git a/external/vulkancts/scripts/src/vulkan_ios.h b/external/vulkancts/scripts/src/vulkan_ios.h
index 1846df5..72ef1a8 100644
--- a/external/vulkancts/scripts/src/vulkan_ios.h
+++ b/external/vulkancts/scripts/src/vulkan_ios.h
@@ -1,10 +1,6 @@
#ifndef VULKAN_IOS_H_
#define VULKAN_IOS_H_ 1
-#ifdef __cplusplus
-extern "C" {
-#endif
-
/*
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
@@ -27,6 +23,11 @@
*/
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
#define VK_MVK_ios_surface 1
#define VK_MVK_IOS_SURFACE_SPEC_VERSION 2
diff --git a/external/vulkancts/scripts/src/vulkan_macos.h b/external/vulkancts/scripts/src/vulkan_macos.h
index dca623b..e6e5dea 100644
--- a/external/vulkancts/scripts/src/vulkan_macos.h
+++ b/external/vulkancts/scripts/src/vulkan_macos.h
@@ -1,10 +1,6 @@
#ifndef VULKAN_MACOS_H_
#define VULKAN_MACOS_H_ 1
-#ifdef __cplusplus
-extern "C" {
-#endif
-
/*
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
@@ -27,6 +23,11 @@
*/
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
#define VK_MVK_macos_surface 1
#define VK_MVK_MACOS_SURFACE_SPEC_VERSION 2
diff --git a/external/vulkancts/scripts/src/vulkan_metal.h b/external/vulkancts/scripts/src/vulkan_metal.h
index 1650523..3dec68c 100644
--- a/external/vulkancts/scripts/src/vulkan_metal.h
+++ b/external/vulkancts/scripts/src/vulkan_metal.h
@@ -1,10 +1,6 @@
#ifndef VULKAN_METAL_H_
#define VULKAN_METAL_H_ 1
-#ifdef __cplusplus
-extern "C" {
-#endif
-
/*
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
@@ -27,6 +23,11 @@
*/
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
#define VK_EXT_metal_surface 1
diff --git a/external/vulkancts/scripts/src/vulkan_vi.h b/external/vulkancts/scripts/src/vulkan_vi.h
index 50aa27d..6fb66f9 100644
--- a/external/vulkancts/scripts/src/vulkan_vi.h
+++ b/external/vulkancts/scripts/src/vulkan_vi.h
@@ -1,10 +1,6 @@
#ifndef VULKAN_VI_H_
#define VULKAN_VI_H_ 1
-#ifdef __cplusplus
-extern "C" {
-#endif
-
/*
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
@@ -27,6 +23,11 @@
*/
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
#define VK_NN_vi_surface 1
#define VK_NN_VI_SURFACE_SPEC_VERSION 1
diff --git a/external/vulkancts/scripts/src/vulkan_wayland.h b/external/vulkancts/scripts/src/vulkan_wayland.h
index 12a5f04..599d05b 100644
--- a/external/vulkancts/scripts/src/vulkan_wayland.h
+++ b/external/vulkancts/scripts/src/vulkan_wayland.h
@@ -1,10 +1,6 @@
#ifndef VULKAN_WAYLAND_H_
#define VULKAN_WAYLAND_H_ 1
-#ifdef __cplusplus
-extern "C" {
-#endif
-
/*
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
@@ -27,6 +23,11 @@
*/
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
#define VK_KHR_wayland_surface 1
#define VK_KHR_WAYLAND_SURFACE_SPEC_VERSION 6
diff --git a/external/vulkancts/scripts/src/vulkan_win32.h b/external/vulkancts/scripts/src/vulkan_win32.h
index a61a7d8..20a1dc0 100644
--- a/external/vulkancts/scripts/src/vulkan_win32.h
+++ b/external/vulkancts/scripts/src/vulkan_win32.h
@@ -1,10 +1,6 @@
#ifndef VULKAN_WIN32_H_
#define VULKAN_WIN32_H_ 1
-#ifdef __cplusplus
-extern "C" {
-#endif
-
/*
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
@@ -27,6 +23,11 @@
*/
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
#define VK_KHR_win32_surface 1
#define VK_KHR_WIN32_SURFACE_SPEC_VERSION 6
@@ -246,7 +247,7 @@
#define VK_NV_win32_keyed_mutex 1
-#define VK_NV_WIN32_KEYED_MUTEX_SPEC_VERSION 1
+#define VK_NV_WIN32_KEYED_MUTEX_SPEC_VERSION 2
#define VK_NV_WIN32_KEYED_MUTEX_EXTENSION_NAME "VK_NV_win32_keyed_mutex"
typedef struct VkWin32KeyedMutexAcquireReleaseInfoNV {
VkStructureType sType;
@@ -263,7 +264,7 @@
#define VK_EXT_full_screen_exclusive 1
-#define VK_EXT_FULL_SCREEN_EXCLUSIVE_SPEC_VERSION 3
+#define VK_EXT_FULL_SCREEN_EXCLUSIVE_SPEC_VERSION 4
#define VK_EXT_FULL_SCREEN_EXCLUSIVE_EXTENSION_NAME "VK_EXT_full_screen_exclusive"
typedef enum VkFullScreenExclusiveEXT {
diff --git a/external/vulkancts/scripts/src/vulkan_xcb.h b/external/vulkancts/scripts/src/vulkan_xcb.h
index 7d6905d..4cc0bc0 100644
--- a/external/vulkancts/scripts/src/vulkan_xcb.h
+++ b/external/vulkancts/scripts/src/vulkan_xcb.h
@@ -1,10 +1,6 @@
#ifndef VULKAN_XCB_H_
#define VULKAN_XCB_H_ 1
-#ifdef __cplusplus
-extern "C" {
-#endif
-
/*
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
@@ -27,6 +23,11 @@
*/
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
#define VK_KHR_xcb_surface 1
#define VK_KHR_XCB_SURFACE_SPEC_VERSION 6
diff --git a/external/vulkancts/scripts/src/vulkan_xlib.h b/external/vulkancts/scripts/src/vulkan_xlib.h
index 7a05d29..ee2b48a 100644
--- a/external/vulkancts/scripts/src/vulkan_xlib.h
+++ b/external/vulkancts/scripts/src/vulkan_xlib.h
@@ -1,10 +1,6 @@
#ifndef VULKAN_XLIB_H_
#define VULKAN_XLIB_H_ 1
-#ifdef __cplusplus
-extern "C" {
-#endif
-
/*
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
@@ -27,6 +23,11 @@
*/
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
#define VK_KHR_xlib_surface 1
#define VK_KHR_XLIB_SURFACE_SPEC_VERSION 6
diff --git a/external/vulkancts/scripts/src/vulkan_xlib_xrandr.h b/external/vulkancts/scripts/src/vulkan_xlib_xrandr.h
index 3a20953..08c4fd7 100644
--- a/external/vulkancts/scripts/src/vulkan_xlib_xrandr.h
+++ b/external/vulkancts/scripts/src/vulkan_xlib_xrandr.h
@@ -1,10 +1,6 @@
#ifndef VULKAN_XLIB_XRANDR_H_
#define VULKAN_XLIB_XRANDR_H_ 1
-#ifdef __cplusplus
-extern "C" {
-#endif
-
/*
** Copyright (c) 2015-2019 The Khronos Group Inc.
**
@@ -27,6 +23,11 @@
*/
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
#define VK_EXT_acquire_xlib_display 1
#define VK_EXT_ACQUIRE_XLIB_DISPLAY_SPEC_VERSION 1
diff --git a/framework/common/tcuCommandLine.cpp b/framework/common/tcuCommandLine.cpp
index 7a8842a..bdb76ff 100644
--- a/framework/common/tcuCommandLine.cpp
+++ b/framework/common/tcuCommandLine.cpp
@@ -38,6 +38,7 @@
#include <sstream>
#include <fstream>
#include <iostream>
+#include <algorithm>
using std::string;
using std::vector;
@@ -95,6 +96,8 @@
DE_DECLARE_COMMAND_LINE_OPT(OptimizeSpirv, bool);
DE_DECLARE_COMMAND_LINE_OPT(ShaderCacheTruncate, bool);
DE_DECLARE_COMMAND_LINE_OPT(RenderDoc, bool);
+DE_DECLARE_COMMAND_LINE_OPT(CaseFraction, std::vector<int>);
+DE_DECLARE_COMMAND_LINE_OPT(CaseFractionMandatoryTests, std::string);
static void parseIntList (const char* src, std::vector<int>* dst)
{
@@ -149,47 +152,49 @@
};
parser
- << Option<CasePath> ("n", "deqp-case", "Test case(s) to run, supports wildcards (e.g. dEQP-GLES2.info.*)")
- << Option<CaseList> (DE_NULL, "deqp-caselist", "Case list to run in trie format (e.g. {dEQP-GLES2{info{version,renderer}}})")
- << Option<CaseListFile> (DE_NULL, "deqp-caselist-file", "Read case list (in trie format) from given file")
- << Option<CaseListResource> (DE_NULL, "deqp-caselist-resource", "Read case list (in trie format) from given file located application's assets")
- << Option<StdinCaseList> (DE_NULL, "deqp-stdin-caselist", "Read case list (in trie format) from stdin")
- << Option<LogFilename> (DE_NULL, "deqp-log-filename", "Write test results to given file", "TestResults.qpa")
- << Option<RunMode> (DE_NULL, "deqp-runmode", "Execute tests, or write list of test cases into a file",
- s_runModes, "execute")
- << Option<ExportFilenamePattern>(DE_NULL, "deqp-caselist-export-file", "Set the target file name pattern for caselist export", "${packageName}-cases.${typeExtension}")
- << Option<WatchDog> (DE_NULL, "deqp-watchdog", "Enable test watchdog", s_enableNames, "disable")
- << Option<CrashHandler> (DE_NULL, "deqp-crashhandler", "Enable crash handling", s_enableNames, "disable")
- << Option<BaseSeed> (DE_NULL, "deqp-base-seed", "Base seed for test cases that use randomization", "0")
- << Option<TestIterationCount> (DE_NULL, "deqp-test-iteration-count", "Iteration count for cases that support variable number of iterations", "0")
- << Option<Visibility> (DE_NULL, "deqp-visibility", "Default test window visibility", s_visibilites, "windowed")
- << Option<SurfaceWidth> (DE_NULL, "deqp-surface-width", "Use given surface width if possible", "-1")
- << Option<SurfaceHeight> (DE_NULL, "deqp-surface-height", "Use given surface height if possible", "-1")
- << Option<SurfaceType> (DE_NULL, "deqp-surface-type", "Use given surface type", s_surfaceTypes, "window")
- << Option<ScreenRotation> (DE_NULL, "deqp-screen-rotation", "Screen rotation for platforms that support it", s_screenRotations, "0")
- << Option<GLContextType> (DE_NULL, "deqp-gl-context-type", "OpenGL context type for platforms that support multiple")
- << Option<GLConfigID> (DE_NULL, "deqp-gl-config-id", "OpenGL (ES) render config ID (EGL config id on EGL platforms)", "-1")
- << Option<GLConfigName> (DE_NULL, "deqp-gl-config-name", "Symbolic OpenGL (ES) render config name")
- << Option<GLContextFlags> (DE_NULL, "deqp-gl-context-flags", "OpenGL context flags (comma-separated, supports debug and robust)")
- << Option<CLPlatformID> (DE_NULL, "deqp-cl-platform-id", "Execute tests on given OpenCL platform (IDs start from 1)", "1")
- << Option<CLDeviceIDs> (DE_NULL, "deqp-cl-device-ids", "Execute tests on given CL devices (comma-separated, IDs start from 1)", parseIntList, "")
- << Option<CLBuildOptions> (DE_NULL, "deqp-cl-build-options", "Extra build options for OpenCL compiler")
- << Option<EGLDisplayType> (DE_NULL, "deqp-egl-display-type", "EGL native display type")
- << Option<EGLWindowType> (DE_NULL, "deqp-egl-window-type", "EGL native window type")
- << Option<EGLPixmapType> (DE_NULL, "deqp-egl-pixmap-type", "EGL native pixmap type")
- << Option<VKDeviceID> (DE_NULL, "deqp-vk-device-id", "Vulkan device ID (IDs start from 1)", "1")
- << Option<VKDeviceGroupID> (DE_NULL, "deqp-vk-device-group-id", "Vulkan device Group ID (IDs start from 1)", "1")
- << Option<LogImages> (DE_NULL, "deqp-log-images", "Enable or disable logging of result images", s_enableNames, "enable")
- << Option<LogShaderSources> (DE_NULL, "deqp-log-shader-sources", "Enable or disable logging of shader sources", s_enableNames, "enable")
- << Option<TestOOM> (DE_NULL, "deqp-test-oom", "Run tests that exhaust memory on purpose", s_enableNames, TEST_OOM_DEFAULT)
- << Option<LogFlush> (DE_NULL, "deqp-log-flush", "Enable or disable log file fflush", s_enableNames, "enable")
- << Option<Validation> (DE_NULL, "deqp-validation", "Enable or disable test case validation", s_enableNames, "disable")
- << Option<Optimization> (DE_NULL, "deqp-optimization-recipe", "Shader optimization recipe (0=disabled, 1=performance, 2=size)", "0")
- << Option<OptimizeSpirv> (DE_NULL, "deqp-optimize-spirv", "Apply optimization to spir-v shaders as well", s_enableNames, "disable")
- << Option<ShaderCache> (DE_NULL, "deqp-shadercache", "Enable or disable shader cache", s_enableNames, "enable")
- << Option<ShaderCacheFilename> (DE_NULL, "deqp-shadercache-filename", "Write shader cache to given file", "shadercache.bin")
- << Option<ShaderCacheTruncate> (DE_NULL, "deqp-shadercache-truncate", "Truncate shader cache before running tests", s_enableNames, "enable")
- << Option<RenderDoc> (DE_NULL, "deqp-renderdoc", "Enable RenderDoc frame markers", s_enableNames, "disable");
+ << Option<CasePath> ("n", "deqp-case", "Test case(s) to run, supports wildcards (e.g. dEQP-GLES2.info.*)")
+ << Option<CaseList> (DE_NULL, "deqp-caselist", "Case list to run in trie format (e.g. {dEQP-GLES2{info{version,renderer}}})")
+ << Option<CaseListFile> (DE_NULL, "deqp-caselist-file", "Read case list (in trie format) from given file")
+ << Option<CaseListResource> (DE_NULL, "deqp-caselist-resource", "Read case list (in trie format) from given file located application's assets")
+ << Option<StdinCaseList> (DE_NULL, "deqp-stdin-caselist", "Read case list (in trie format) from stdin")
+ << Option<LogFilename> (DE_NULL, "deqp-log-filename", "Write test results to given file", "TestResults.qpa")
+ << Option<RunMode> (DE_NULL, "deqp-runmode", "Execute tests, or write list of test cases into a file",
+ s_runModes, "execute")
+ << Option<ExportFilenamePattern> (DE_NULL, "deqp-caselist-export-file", "Set the target file name pattern for caselist export", "${packageName}-cases.${typeExtension}")
+ << Option<WatchDog> (DE_NULL, "deqp-watchdog", "Enable test watchdog", s_enableNames, "disable")
+ << Option<CrashHandler> (DE_NULL, "deqp-crashhandler", "Enable crash handling", s_enableNames, "disable")
+ << Option<BaseSeed> (DE_NULL, "deqp-base-seed", "Base seed for test cases that use randomization", "0")
+ << Option<TestIterationCount> (DE_NULL, "deqp-test-iteration-count", "Iteration count for cases that support variable number of iterations", "0")
+ << Option<Visibility> (DE_NULL, "deqp-visibility", "Default test window visibility", s_visibilites, "windowed")
+ << Option<SurfaceWidth> (DE_NULL, "deqp-surface-width", "Use given surface width if possible", "-1")
+ << Option<SurfaceHeight> (DE_NULL, "deqp-surface-height", "Use given surface height if possible", "-1")
+ << Option<SurfaceType> (DE_NULL, "deqp-surface-type", "Use given surface type", s_surfaceTypes, "window")
+ << Option<ScreenRotation> (DE_NULL, "deqp-screen-rotation", "Screen rotation for platforms that support it", s_screenRotations, "0")
+ << Option<GLContextType> (DE_NULL, "deqp-gl-context-type", "OpenGL context type for platforms that support multiple")
+ << Option<GLConfigID> (DE_NULL, "deqp-gl-config-id", "OpenGL (ES) render config ID (EGL config id on EGL platforms)", "-1")
+ << Option<GLConfigName> (DE_NULL, "deqp-gl-config-name", "Symbolic OpenGL (ES) render config name")
+ << Option<GLContextFlags> (DE_NULL, "deqp-gl-context-flags", "OpenGL context flags (comma-separated, supports debug and robust)")
+ << Option<CLPlatformID> (DE_NULL, "deqp-cl-platform-id", "Execute tests on given OpenCL platform (IDs start from 1)", "1")
+ << Option<CLDeviceIDs> (DE_NULL, "deqp-cl-device-ids", "Execute tests on given CL devices (comma-separated, IDs start from 1)", parseIntList, "")
+ << Option<CLBuildOptions> (DE_NULL, "deqp-cl-build-options", "Extra build options for OpenCL compiler")
+ << Option<EGLDisplayType> (DE_NULL, "deqp-egl-display-type", "EGL native display type")
+ << Option<EGLWindowType> (DE_NULL, "deqp-egl-window-type", "EGL native window type")
+ << Option<EGLPixmapType> (DE_NULL, "deqp-egl-pixmap-type", "EGL native pixmap type")
+ << Option<VKDeviceID> (DE_NULL, "deqp-vk-device-id", "Vulkan device ID (IDs start from 1)", "1")
+ << Option<VKDeviceGroupID> (DE_NULL, "deqp-vk-device-group-id", "Vulkan device Group ID (IDs start from 1)", "1")
+ << Option<LogImages> (DE_NULL, "deqp-log-images", "Enable or disable logging of result images", s_enableNames, "enable")
+ << Option<LogShaderSources> (DE_NULL, "deqp-log-shader-sources", "Enable or disable logging of shader sources", s_enableNames, "enable")
+ << Option<TestOOM> (DE_NULL, "deqp-test-oom", "Run tests that exhaust memory on purpose", s_enableNames, TEST_OOM_DEFAULT)
+ << Option<LogFlush> (DE_NULL, "deqp-log-flush", "Enable or disable log file fflush", s_enableNames, "enable")
+ << Option<Validation> (DE_NULL, "deqp-validation", "Enable or disable test case validation", s_enableNames, "disable")
+ << Option<Optimization> (DE_NULL, "deqp-optimization-recipe", "Shader optimization recipe (0=disabled, 1=performance, 2=size)", "0")
+ << Option<OptimizeSpirv> (DE_NULL, "deqp-optimize-spirv", "Apply optimization to spir-v shaders as well", s_enableNames, "disable")
+ << Option<ShaderCache> (DE_NULL, "deqp-shadercache", "Enable or disable shader cache", s_enableNames, "enable")
+ << Option<ShaderCacheFilename> (DE_NULL, "deqp-shadercache-filename", "Write shader cache to given file", "shadercache.bin")
+ << Option<ShaderCacheTruncate> (DE_NULL, "deqp-shadercache-truncate", "Truncate shader cache before running tests", s_enableNames, "enable")
+ << 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", "");
}
void registerLegacyOptions (de::cmdline::Parser& parser)
@@ -423,7 +428,7 @@
}
}
-static void parseCaseList (CaseTreeNode* root, std::istream& in)
+static void parseCaseList (CaseTreeNode* root, std::istream& in, bool reportDuplicates)
{
// \note Algorithm assumes that cases are sorted by groups, but will
// function fine, albeit more slowly, if that is not the case.
@@ -444,21 +449,23 @@
if (curName.empty())
throw std::invalid_argument("Empty test case name");
- if (nodeStack[stackPos]->hasChild(curName))
+ if (!nodeStack[stackPos]->hasChild(curName))
+ {
+ CaseTreeNode* const newChild = new CaseTreeNode(curName);
+
+ try
+ {
+ nodeStack[stackPos]->addChild(newChild);
+ }
+ catch (...)
+ {
+ delete newChild;
+ throw;
+ }
+ }
+ else if (reportDuplicates)
throw std::invalid_argument("Duplicate test case");
- CaseTreeNode* const newChild = new CaseTreeNode(curName);
-
- try
- {
- nodeStack[stackPos]->addChild(newChild);
- }
- catch (...)
- {
- delete newChild;
- throw;
- }
-
curName.clear();
stackPos = 0;
@@ -525,7 +532,7 @@
if (in.peek() == '{')
parseCaseTrie(root, in);
else
- parseCaseList(root, in);
+ parseCaseList(root, in, true);
{
const int curChr = in.get();
@@ -546,6 +553,7 @@
{
public:
CasePaths (const string& pathList);
+ CasePaths (const vector<string>& pathList);
bool matches (const string& caseName, bool allowPrefix=false) const;
private:
@@ -557,6 +565,11 @@
{
}
+CasePaths::CasePaths(const vector<string>& pathList)
+ : m_casePatterns(pathList)
+{
+}
+
// Match a single path component against a pattern component that may contain *-wildcards.
static bool matchWildcards(string::const_iterator patternStart,
string::const_iterator patternEnd,
@@ -783,32 +796,34 @@
return isOk;
}
-const char* CommandLine::getLogFileName (void) const { return m_cmdLine.getOption<opt::LogFilename>().c_str(); }
-deUint32 CommandLine::getLogFlags (void) const { return m_logFlags; }
-RunMode CommandLine::getRunMode (void) const { return m_cmdLine.getOption<opt::RunMode>(); }
-const char* CommandLine::getCaseListExportFile (void) const { return m_cmdLine.getOption<opt::ExportFilenamePattern>().c_str(); }
-WindowVisibility CommandLine::getVisibility (void) const { return m_cmdLine.getOption<opt::Visibility>(); }
-bool CommandLine::isWatchDogEnabled (void) const { return m_cmdLine.getOption<opt::WatchDog>(); }
-bool CommandLine::isCrashHandlingEnabled (void) const { return m_cmdLine.getOption<opt::CrashHandler>(); }
-int CommandLine::getBaseSeed (void) const { return m_cmdLine.getOption<opt::BaseSeed>(); }
-int CommandLine::getTestIterationCount (void) const { return m_cmdLine.getOption<opt::TestIterationCount>(); }
-int CommandLine::getSurfaceWidth (void) const { return m_cmdLine.getOption<opt::SurfaceWidth>(); }
-int CommandLine::getSurfaceHeight (void) const { return m_cmdLine.getOption<opt::SurfaceHeight>(); }
-SurfaceType CommandLine::getSurfaceType (void) const { return m_cmdLine.getOption<opt::SurfaceType>(); }
-ScreenRotation CommandLine::getScreenRotation (void) const { return m_cmdLine.getOption<opt::ScreenRotation>(); }
-int CommandLine::getGLConfigId (void) const { return m_cmdLine.getOption<opt::GLConfigID>(); }
-int CommandLine::getCLPlatformId (void) const { return m_cmdLine.getOption<opt::CLPlatformID>(); }
-const std::vector<int>& CommandLine::getCLDeviceIds (void) const { return m_cmdLine.getOption<opt::CLDeviceIDs>(); }
-int CommandLine::getVKDeviceId (void) const { return m_cmdLine.getOption<opt::VKDeviceID>(); }
-int CommandLine::getVKDeviceGroupId (void) const { return m_cmdLine.getOption<opt::VKDeviceGroupID>(); }
-bool CommandLine::isValidationEnabled (void) const { return m_cmdLine.getOption<opt::Validation>(); }
-bool CommandLine::isOutOfMemoryTestEnabled (void) const { return m_cmdLine.getOption<opt::TestOOM>(); }
-bool CommandLine::isShadercacheEnabled (void) const { return m_cmdLine.getOption<opt::ShaderCache>(); }
-const char* CommandLine::getShaderCacheFilename (void) const { return m_cmdLine.getOption<opt::ShaderCacheFilename>().c_str(); }
-bool CommandLine::isShaderCacheTruncateEnabled (void) const { return m_cmdLine.getOption<opt::ShaderCacheTruncate>(); }
-int CommandLine::getOptimizationRecipe (void) const { return m_cmdLine.getOption<opt::Optimization>(); }
-bool CommandLine::isSpirvOptimizationEnabled (void) const { return m_cmdLine.getOption<opt::OptimizeSpirv>(); }
-bool CommandLine::isRenderDocEnabled (void) const { return m_cmdLine.getOption<opt::RenderDoc>(); }
+const char* CommandLine::getLogFileName (void) const { return m_cmdLine.getOption<opt::LogFilename>().c_str(); }
+deUint32 CommandLine::getLogFlags (void) const { return m_logFlags; }
+RunMode CommandLine::getRunMode (void) const { return m_cmdLine.getOption<opt::RunMode>(); }
+const char* CommandLine::getCaseListExportFile (void) const { return m_cmdLine.getOption<opt::ExportFilenamePattern>().c_str(); }
+WindowVisibility CommandLine::getVisibility (void) const { return m_cmdLine.getOption<opt::Visibility>(); }
+bool CommandLine::isWatchDogEnabled (void) const { return m_cmdLine.getOption<opt::WatchDog>(); }
+bool CommandLine::isCrashHandlingEnabled (void) const { return m_cmdLine.getOption<opt::CrashHandler>(); }
+int CommandLine::getBaseSeed (void) const { return m_cmdLine.getOption<opt::BaseSeed>(); }
+int CommandLine::getTestIterationCount (void) const { return m_cmdLine.getOption<opt::TestIterationCount>(); }
+int CommandLine::getSurfaceWidth (void) const { return m_cmdLine.getOption<opt::SurfaceWidth>(); }
+int CommandLine::getSurfaceHeight (void) const { return m_cmdLine.getOption<opt::SurfaceHeight>(); }
+SurfaceType CommandLine::getSurfaceType (void) const { return m_cmdLine.getOption<opt::SurfaceType>(); }
+ScreenRotation CommandLine::getScreenRotation (void) const { return m_cmdLine.getOption<opt::ScreenRotation>(); }
+int CommandLine::getGLConfigId (void) const { return m_cmdLine.getOption<opt::GLConfigID>(); }
+int CommandLine::getCLPlatformId (void) const { return m_cmdLine.getOption<opt::CLPlatformID>(); }
+const std::vector<int>& CommandLine::getCLDeviceIds (void) const { return m_cmdLine.getOption<opt::CLDeviceIDs>(); }
+int CommandLine::getVKDeviceId (void) const { return m_cmdLine.getOption<opt::VKDeviceID>(); }
+int CommandLine::getVKDeviceGroupId (void) const { return m_cmdLine.getOption<opt::VKDeviceGroupID>(); }
+bool CommandLine::isValidationEnabled (void) const { return m_cmdLine.getOption<opt::Validation>(); }
+bool CommandLine::isOutOfMemoryTestEnabled (void) const { return m_cmdLine.getOption<opt::TestOOM>(); }
+bool CommandLine::isShadercacheEnabled (void) const { return m_cmdLine.getOption<opt::ShaderCache>(); }
+const char* CommandLine::getShaderCacheFilename (void) const { return m_cmdLine.getOption<opt::ShaderCacheFilename>().c_str(); }
+bool CommandLine::isShaderCacheTruncateEnabled (void) const { return m_cmdLine.getOption<opt::ShaderCacheTruncate>(); }
+int CommandLine::getOptimizationRecipe (void) const { return m_cmdLine.getOption<opt::Optimization>(); }
+bool CommandLine::isSpirvOptimizationEnabled (void) const { return m_cmdLine.getOption<opt::OptimizeSpirv>(); }
+bool CommandLine::isRenderDocEnabled (void) const { return m_cmdLine.getOption<opt::RenderDoc>(); }
+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::getGLContextType (void) const
{
@@ -884,22 +899,37 @@
bool CaseListFilter::checkTestGroupName (const char* groupName) const
{
+ bool result = false;
if (m_casePaths)
- return m_casePaths->matches(groupName, true);
+ result = m_casePaths->matches(groupName, true);
else if (m_caseTree)
- return groupName[0] == 0 || tcu::checkTestGroupName(m_caseTree, groupName);
+ result = ( groupName[0] == 0 || tcu::checkTestGroupName(m_caseTree, groupName) );
else
return true;
+ if (!result && m_caseFractionMandatoryTests.get() != DE_NULL)
+ result = m_caseFractionMandatoryTests->matches(groupName, true);
+ return result;
}
bool CaseListFilter::checkTestCaseName (const char* caseName) const
{
+ bool result = false;
if (m_casePaths)
- return m_casePaths->matches(caseName, false);
+ result = m_casePaths->matches(caseName, false);
else if (m_caseTree)
- return tcu::checkTestCaseName(m_caseTree, caseName);
+ result = tcu::checkTestCaseName(m_caseTree, caseName);
else
return true;
+ if (!result && m_caseFractionMandatoryTests.get() != DE_NULL)
+ result = m_caseFractionMandatoryTests->matches(caseName, false);
+ return result;
+}
+
+bool CaseListFilter::checkCaseFraction (int i, const std::string& testCaseName) const
+{
+ return m_caseFraction.size() != 2 ||
+ ((i % m_caseFraction[1]) == m_caseFraction[0]) ||
+ (m_caseFractionMandatoryTests.get()!=DE_NULL && m_caseFractionMandatoryTests->matches(testCaseName));
}
CaseListFilter::CaseListFilter (void)
@@ -950,6 +980,46 @@
}
else if (cmdLine.hasOption<opt::CasePath>())
m_casePaths = de::MovePtr<const CasePaths>(new CasePaths(cmdLine.getOption<opt::CasePath>()));
+
+ m_caseFraction = cmdLine.getOption<opt::CaseFraction>();
+
+ if (m_caseFraction.size() == 2 &&
+ (m_caseFraction[0] < 0 || m_caseFraction[1] <= 0 || m_caseFraction[0] >= m_caseFraction[1] ))
+ throw Exception("Invalid case fraction. First element must be non-negative and less than second element. Second element must be greater than 0.");
+
+ if (m_caseFraction.size() != 0 && m_caseFraction.size() != 2)
+ throw Exception("Invalid case fraction. Must have two components.");
+
+ if (m_caseFraction.size() == 2)
+ {
+ std::string caseFractionMandatoryTestsFilename = cmdLine.getOption<opt::CaseFractionMandatoryTests>();
+
+ if (!caseFractionMandatoryTestsFilename.empty())
+ {
+ std::ifstream fileStream(caseFractionMandatoryTestsFilename.c_str(), std::ios_base::binary);
+ if (!fileStream.is_open() || !fileStream.good())
+ throw Exception("Failed to open case fraction mandatory test list: '" + caseFractionMandatoryTestsFilename + "'");
+
+ std::vector<std::string> cfPaths;
+ std::string line;
+
+ while (std::getline(fileStream, line))
+ {
+ line.erase(std::remove(std::begin(line), std::end(line), '\r'), std::end(line));
+ cfPaths.push_back(line);
+ }
+ if (!cfPaths.empty())
+ {
+ m_caseFractionMandatoryTests = de::MovePtr<const CasePaths>(new CasePaths(cfPaths));
+ if (m_caseTree != DE_NULL)
+ {
+ fileStream.clear();
+ fileStream.seekg(0, fileStream.beg);
+ parseCaseList(m_caseTree, fileStream, false);
+ }
+ }
+ }
+ }
}
CaseListFilter::~CaseListFilter (void)
diff --git a/framework/common/tcuCommandLine.hpp b/framework/common/tcuCommandLine.hpp
index da9e04d..a7cb3ab 100644
--- a/framework/common/tcuCommandLine.hpp
+++ b/framework/common/tcuCommandLine.hpp
@@ -104,12 +104,17 @@
//! Check if test case is in supplied test case list.
bool checkTestCaseName (const char* caseName) const;
+ //! Check if test group passes the case fraction filter.
+ bool checkCaseFraction (int i, const std::string& testCaseName) const;
+
private:
CaseListFilter (const CaseListFilter&); // not allowed!
CaseListFilter& operator= (const CaseListFilter&); // not allowed!
CaseTreeNode* m_caseTree;
de::MovePtr<const CasePaths> m_casePaths;
+ std::vector<int> m_caseFraction;
+ de::MovePtr<const CasePaths> m_caseFractionMandatoryTests;
};
/*--------------------------------------------------------------------*//*!
@@ -229,6 +234,12 @@
//! Enable RenderDoc frame markers (--deqp-renderdoc)
bool isRenderDocEnabled (void) const;
+ //! Get case list fraction
+ const std::vector<int>& getCaseFraction (void) const;
+
+ //! Get must-list filename
+ const char* getCaseFractionMandatoryTests(void) const;
+
/*--------------------------------------------------------------------*//*!
* \brief Creates case list filter
* \param archive Resources
diff --git a/framework/common/tcuRasterizationVerifier.cpp b/framework/common/tcuRasterizationVerifier.cpp
index d5b84c5..85a80c9 100644
--- a/framework/common/tcuRasterizationVerifier.cpp
+++ b/framework/common/tcuRasterizationVerifier.cpp
@@ -915,9 +915,20 @@
const float halfLineWidth = scene.lineWidth * 0.5f;
TriangleSceneSpec triangleScene;
+ deUint32 stippleCounter = 0;
+ float leftoverPhase = 0.0f;
+
triangleScene.triangles.resize(2 * scene.lines.size());
for (int lineNdx = 0; lineNdx < (int)scene.lines.size(); ++lineNdx)
{
+
+ if (!scene.isStrip)
+ {
+ // reset stipple at the start of each line segment
+ stippleCounter = 0;
+ leftoverPhase = 0;
+ }
+
// Transform to screen space, add pixel offsets, convert back to normalized device space, and test as triangles
tcu::Vec2 lineNormalizedDeviceSpace[2] =
{
@@ -939,28 +950,114 @@
const tcu::Vec2 lineDir = tcu::normalize(lineScreenSpace[1] - lineScreenSpace[0]);
const tcu::Vec2 lineNormalDir = tcu::Vec2(lineDir.y(), -lineDir.x());
- const tcu::Vec2 lineQuadScreenSpace[4] =
+ if (scene.stippleEnable)
{
- lineScreenSpace[0] + lineNormalDir * halfLineWidth,
- lineScreenSpace[0] - lineNormalDir * halfLineWidth,
- lineScreenSpace[1] - lineNormalDir * halfLineWidth,
- lineScreenSpace[1] + lineNormalDir * halfLineWidth,
- };
- const tcu::Vec2 lineQuadNormalizedDeviceSpace[4] =
+ float lineLength = tcu::distance(lineScreenSpace[0], lineScreenSpace[1]);
+ float lineOffset = 0.0f;
+
+ while (lineOffset < lineLength)
+ {
+ float d0 = (float)lineOffset;
+ float d1 = d0 + 1.0f;
+
+ // "leftoverPhase" carries over a fractional stipple phase that was "unused"
+ // by the last line segment in the strip, if it wasn't an integer length.
+ if (leftoverPhase > lineLength)
+ {
+ DE_ASSERT(d0 == 0.0f);
+ d1 = lineLength;
+ leftoverPhase -= lineLength;
+ }
+ else if (leftoverPhase != 0.0f)
+ {
+ DE_ASSERT(d0 == 0.0f);
+ d1 = leftoverPhase;
+ leftoverPhase = 0.0f;
+ }
+ else
+ {
+ if (d0 + 1.0f > lineLength)
+ {
+ d1 = lineLength;
+ leftoverPhase = d0 + 1.0f - lineLength;
+ }
+ else
+ d1 = d0 + 1.0f;
+ }
+
+ // set offset for next iteration
+ lineOffset = d1;
+
+ int stippleBit = (stippleCounter / scene.stippleFactor) % 16;
+ bool stipplePass = (scene.stipplePattern & (1 << stippleBit)) != 0;
+
+ if (leftoverPhase == 0)
+ stippleCounter++;
+
+ if (!stipplePass)
+ continue;
+
+ d0 /= lineLength;
+ d1 /= lineLength;
+
+ tcu::Vec2 l0 = mix(lineScreenSpace[0], lineScreenSpace[1], d0);
+ tcu::Vec2 l1 = mix(lineScreenSpace[0], lineScreenSpace[1], d1);
+
+ const tcu::Vec2 lineQuadScreenSpace[4] =
+ {
+ l0 + lineNormalDir * halfLineWidth,
+ l0 - lineNormalDir * halfLineWidth,
+ l1 - lineNormalDir * halfLineWidth,
+ l1 + lineNormalDir * halfLineWidth,
+ };
+ const tcu::Vec2 lineQuadNormalizedDeviceSpace[4] =
+ {
+ lineQuadScreenSpace[0] / viewportSize * 2.0f - tcu::Vec2(1.0f, 1.0f),
+ lineQuadScreenSpace[1] / viewportSize * 2.0f - tcu::Vec2(1.0f, 1.0f),
+ lineQuadScreenSpace[2] / viewportSize * 2.0f - tcu::Vec2(1.0f, 1.0f),
+ lineQuadScreenSpace[3] / viewportSize * 2.0f - tcu::Vec2(1.0f, 1.0f),
+ };
+
+ TriangleSceneSpec::SceneTriangle tri;
+
+ tri.positions[0] = tcu::Vec4(lineQuadNormalizedDeviceSpace[0].x(), lineQuadNormalizedDeviceSpace[0].y(), 0.0f, 1.0f); tri.sharedEdge[0] = (d0 != 0.0f);
+ tri.positions[1] = tcu::Vec4(lineQuadNormalizedDeviceSpace[1].x(), lineQuadNormalizedDeviceSpace[1].y(), 0.0f, 1.0f); tri.sharedEdge[1] = false;
+ tri.positions[2] = tcu::Vec4(lineQuadNormalizedDeviceSpace[2].x(), lineQuadNormalizedDeviceSpace[2].y(), 0.0f, 1.0f); tri.sharedEdge[2] = true;
+
+ triangleScene.triangles.push_back(tri);
+
+ tri.positions[0] = tcu::Vec4(lineQuadNormalizedDeviceSpace[0].x(), lineQuadNormalizedDeviceSpace[0].y(), 0.0f, 1.0f); tri.sharedEdge[0] = true;
+ tri.positions[1] = tcu::Vec4(lineQuadNormalizedDeviceSpace[2].x(), lineQuadNormalizedDeviceSpace[2].y(), 0.0f, 1.0f); tri.sharedEdge[1] = (d1 != 1.0f);
+ tri.positions[2] = tcu::Vec4(lineQuadNormalizedDeviceSpace[3].x(), lineQuadNormalizedDeviceSpace[3].y(), 0.0f, 1.0f); tri.sharedEdge[2] = false;
+
+ triangleScene.triangles.push_back(tri);
+ }
+ }
+ else
{
- lineQuadScreenSpace[0] / viewportSize * 2.0f - tcu::Vec2(1.0f, 1.0f),
- lineQuadScreenSpace[1] / viewportSize * 2.0f - tcu::Vec2(1.0f, 1.0f),
- lineQuadScreenSpace[2] / viewportSize * 2.0f - tcu::Vec2(1.0f, 1.0f),
- lineQuadScreenSpace[3] / viewportSize * 2.0f - tcu::Vec2(1.0f, 1.0f),
- };
+ const tcu::Vec2 lineQuadScreenSpace[4] =
+ {
+ lineScreenSpace[0] + lineNormalDir * halfLineWidth,
+ lineScreenSpace[0] - lineNormalDir * halfLineWidth,
+ lineScreenSpace[1] - lineNormalDir * halfLineWidth,
+ lineScreenSpace[1] + lineNormalDir * halfLineWidth,
+ };
+ const tcu::Vec2 lineQuadNormalizedDeviceSpace[4] =
+ {
+ lineQuadScreenSpace[0] / viewportSize * 2.0f - tcu::Vec2(1.0f, 1.0f),
+ lineQuadScreenSpace[1] / viewportSize * 2.0f - tcu::Vec2(1.0f, 1.0f),
+ lineQuadScreenSpace[2] / viewportSize * 2.0f - tcu::Vec2(1.0f, 1.0f),
+ lineQuadScreenSpace[3] / viewportSize * 2.0f - tcu::Vec2(1.0f, 1.0f),
+ };
- triangleScene.triangles[lineNdx*2 + 0].positions[0] = tcu::Vec4(lineQuadNormalizedDeviceSpace[0].x(), lineQuadNormalizedDeviceSpace[0].y(), 0.0f, 1.0f); triangleScene.triangles[lineNdx*2 + 0].sharedEdge[0] = false;
- triangleScene.triangles[lineNdx*2 + 0].positions[1] = tcu::Vec4(lineQuadNormalizedDeviceSpace[1].x(), lineQuadNormalizedDeviceSpace[1].y(), 0.0f, 1.0f); triangleScene.triangles[lineNdx*2 + 0].sharedEdge[1] = false;
- triangleScene.triangles[lineNdx*2 + 0].positions[2] = tcu::Vec4(lineQuadNormalizedDeviceSpace[2].x(), lineQuadNormalizedDeviceSpace[2].y(), 0.0f, 1.0f); triangleScene.triangles[lineNdx*2 + 0].sharedEdge[2] = true;
+ triangleScene.triangles[lineNdx*2 + 0].positions[0] = tcu::Vec4(lineQuadNormalizedDeviceSpace[0].x(), lineQuadNormalizedDeviceSpace[0].y(), 0.0f, 1.0f); triangleScene.triangles[lineNdx*2 + 0].sharedEdge[0] = false;
+ triangleScene.triangles[lineNdx*2 + 0].positions[1] = tcu::Vec4(lineQuadNormalizedDeviceSpace[1].x(), lineQuadNormalizedDeviceSpace[1].y(), 0.0f, 1.0f); triangleScene.triangles[lineNdx*2 + 0].sharedEdge[1] = false;
+ triangleScene.triangles[lineNdx*2 + 0].positions[2] = tcu::Vec4(lineQuadNormalizedDeviceSpace[2].x(), lineQuadNormalizedDeviceSpace[2].y(), 0.0f, 1.0f); triangleScene.triangles[lineNdx*2 + 0].sharedEdge[2] = true;
- triangleScene.triangles[lineNdx*2 + 1].positions[0] = tcu::Vec4(lineQuadNormalizedDeviceSpace[0].x(), lineQuadNormalizedDeviceSpace[0].y(), 0.0f, 1.0f); triangleScene.triangles[lineNdx*2 + 1].sharedEdge[0] = true;
- triangleScene.triangles[lineNdx*2 + 1].positions[1] = tcu::Vec4(lineQuadNormalizedDeviceSpace[2].x(), lineQuadNormalizedDeviceSpace[2].y(), 0.0f, 1.0f); triangleScene.triangles[lineNdx*2 + 1].sharedEdge[1] = false;
- triangleScene.triangles[lineNdx*2 + 1].positions[2] = tcu::Vec4(lineQuadNormalizedDeviceSpace[3].x(), lineQuadNormalizedDeviceSpace[3].y(), 0.0f, 1.0f); triangleScene.triangles[lineNdx*2 + 1].sharedEdge[2] = false;
+ triangleScene.triangles[lineNdx*2 + 1].positions[0] = tcu::Vec4(lineQuadNormalizedDeviceSpace[0].x(), lineQuadNormalizedDeviceSpace[0].y(), 0.0f, 1.0f); triangleScene.triangles[lineNdx*2 + 1].sharedEdge[0] = true;
+ triangleScene.triangles[lineNdx*2 + 1].positions[1] = tcu::Vec4(lineQuadNormalizedDeviceSpace[2].x(), lineQuadNormalizedDeviceSpace[2].y(), 0.0f, 1.0f); triangleScene.triangles[lineNdx*2 + 1].sharedEdge[1] = false;
+ triangleScene.triangles[lineNdx*2 + 1].positions[2] = tcu::Vec4(lineQuadNormalizedDeviceSpace[3].x(), lineQuadNormalizedDeviceSpace[3].y(), 0.0f, 1.0f); triangleScene.triangles[lineNdx*2 + 1].sharedEdge[2] = false;
+ }
}
return verifyTriangleGroupRasterization(surface, triangleScene, args, log, VERIFICATIONMODE_STRICT, logStash, vulkanLinesTest);
@@ -1100,7 +1197,6 @@
int referenceFragments = 0;
int resultFragments = 0;
int lineWidth = deFloorFloatToInt32(scene.lineWidth + 0.5f);
- bool imageShown = false;
std::vector<bool> lineIsXMajor (scene.lines.size());
std::vector<tcu::Vec4> screenspaceLines(scene.lines.size());
@@ -1110,9 +1206,9 @@
genScreenSpaceLines(screenspaceLines, scene.lines, tcu::IVec2(surface.getWidth(), surface.getHeight()));
+ rr::SingleSampleLineRasterizer rasterizer(tcu::IVec4(0, 0, surface.getWidth(), surface.getHeight()), args.subpixelBits);
for (int lineNdx = 0; lineNdx < (int)scene.lines.size(); ++lineNdx)
{
- rr::SingleSampleLineRasterizer rasterizer(tcu::IVec4(0, 0, surface.getWidth(), surface.getHeight()), args.subpixelBits);
rasterizer.init(tcu::Vec4(screenspaceLines[lineNdx][0],
screenspaceLines[lineNdx][1],
0.0f,
@@ -1121,7 +1217,12 @@
screenspaceLines[lineNdx][3],
0.0f,
1.0f),
- scene.lineWidth);
+ scene.lineWidth,
+ scene.stippleFactor,
+ scene.stipplePattern);
+
+ if (!scene.isStrip)
+ rasterizer.resetStipple();
// calculate majority of later use
lineIsXMajor[lineNdx] = isPackedSSLineXMajor(screenspaceLines[lineNdx]);
@@ -1209,13 +1310,7 @@
if (missingFragments)
{
- log << tcu::TestLog::Message << "Invalid deviation(s) found." << tcu::TestLog::EndMessage;
- log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
- << tcu::TestLog::Image("Result", "Result", surface)
- << tcu::TestLog::Image("ErrorMask", "ErrorMask", errorMask)
- << tcu::TestLog::EndImageSet;
- imageShown = true;
allOK = false;
}
else
@@ -1256,7 +1351,6 @@
<< tcu::TestLog::EndImageSet;
allOK = false;
- imageShown = true;
}
else
{
@@ -1303,7 +1397,6 @@
{
if (lineID && lineID != nearbyID)
multipleNearbyLines = true;
- lineID = nearbyID;
}
}
@@ -1461,9 +1554,16 @@
//duplicate fragments, nor may any fragments be omitted so as to interrupt
//continuity of the connected segments.
- if (!imageShown)
{
+ tcu::Surface reference(surface.getWidth(), surface.getHeight());
+ tcu::clear(reference.getAccess(), tcu::IVec4(0, 0, 0, 255));
+ for (int y = 0; y < surface.getHeight(); ++y)
+ for (int x = 0; x < surface.getWidth(); ++x)
+ if (referenceLineMap.getAccess().getPixelInt(x, y).x())
+ reference.setPixel(x, y, tcu::RGBA::white());
+ log << tcu::TestLog::Message << "Invalid fragment count in result image." << tcu::TestLog::EndMessage;
log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
+ << tcu::TestLog::Image("Reference", "Reference", reference)
<< tcu::TestLog::Image("Result", "Result", surface)
<< tcu::TestLog::EndImageSet;
}
@@ -1495,7 +1595,8 @@
rasterizer.init(tcu::Vec4(screenSpaceP0.x(), screenSpaceP0.y(), 0.0f, 1.0f),
tcu::Vec4(screenSpaceP1.x(), screenSpaceP1.y(), 0.0f, 1.0f),
- lineWidth);
+ lineWidth,
+ 1, 0xFFFF);
while (numRasterized == MAX_PACKETS)
{
@@ -2282,6 +2383,7 @@
const tcu::RGBA partialPixelColor = tcu::RGBA(255, 255, 0, 255);
const tcu::RGBA primitivePixelColor = tcu::RGBA(30, 30, 30, 255);
const int weakVerificationThreshold = 10;
+ const int weakerVerificationThreshold = 25;
const bool multisampled = (args.numSamples != 0);
const tcu::IVec2 viewportSize = tcu::IVec2(surface.getWidth(), surface.getHeight());
int missingPixels = 0;
@@ -2386,14 +2488,11 @@
case COVERAGE_PARTIAL:
{
bool foundFragment = false;
-
if (vulkanLinesTest == true)
{
- // find nearby fragment
for (int dy = -1; dy < 2 && !foundFragment; ++dy)
for (int dx = -1; dx < 2 && !foundFragment; ++dx)
{
- // check anything in vicinity not marked as no coverage, (also check edge conditions.)
if (x + dx >= 0 && x + dx != surface.getWidth() && y + dy >= 0 && y + dy != surface.getHeight()
&& (CoverageType)coverageMap.getAccess().getPixelUint(x + dx, y + dy).x() != COVERAGE_NONE)
{
@@ -2403,16 +2502,13 @@
}
}
}
-
- // anything goes
+ // anything goes
if (foundFragment == false)
{
- errorMask.setPixel(x, y, partialPixelColor);
-
+ errorMask.setPixel(x, y, partialPixelColor);
if (vulkanLinesTest == true)
++missingPixels;
}
-
}
break;
@@ -2435,7 +2531,9 @@
}
if (((mode == VERIFICATIONMODE_STRICT) && (missingPixels + unexpectedPixels > 0)) ||
- ((mode == VERIFICATIONMODE_WEAK) && (missingPixels + unexpectedPixels > weakVerificationThreshold)))
+ ((mode == VERIFICATIONMODE_WEAK) && (missingPixels + unexpectedPixels > weakVerificationThreshold)) ||
+ ((mode == VERIFICATIONMODE_WEAKER) && (missingPixels + unexpectedPixels > weakerVerificationThreshold)) ||
+ ((mode == VERIFICATIONMODE_SMOOTH) && (missingPixels > weakVerificationThreshold)))
{
result = false;
}
diff --git a/framework/common/tcuRasterizationVerifier.hpp b/framework/common/tcuRasterizationVerifier.hpp
index 8762d34..ffff501 100644
--- a/framework/common/tcuRasterizationVerifier.hpp
+++ b/framework/common/tcuRasterizationVerifier.hpp
@@ -46,6 +46,8 @@
{
VERIFICATIONMODE_STRICT = 0, // !< do not allow even a single bad pixel
VERIFICATIONMODE_WEAK, // !< allow some bad pixels
+ VERIFICATIONMODE_WEAKER, // !< allow more bad pixels
+ VERIFICATIONMODE_SMOOTH, // !< allow no missing pixels
VERIFICATIONMODE_LAST
};
@@ -71,6 +73,13 @@
struct LineSceneSpec
{
+ LineSceneSpec()
+ : isStrip(false)
+ , isSmooth(false)
+ , stippleEnable(false)
+ , verificationMode(VERIFICATIONMODE_STRICT)
+ {}
+
struct SceneLine
{
tcu::Vec4 positions[2];
@@ -79,6 +88,12 @@
std::vector<SceneLine> lines;
float lineWidth;
+ bool isStrip;
+ bool isSmooth;
+ bool stippleEnable;
+ deUint32 stippleFactor;
+ deUint16 stipplePattern;
+ VerificationMode verificationMode;
};
struct PointSceneSpec
diff --git a/framework/common/tcuTestHierarchyIterator.cpp b/framework/common/tcuTestHierarchyIterator.cpp
index 51fdf4e..1fbb662 100644
--- a/framework/common/tcuTestHierarchyIterator.cpp
+++ b/framework/common/tcuTestHierarchyIterator.cpp
@@ -90,6 +90,7 @@
const CaseListFilter& caseListFilter)
: m_inflater (inflater)
, m_caseListFilter (caseListFilter)
+ , m_groupNumber (0)
{
// Init traverse state and "seek" to first reportable node.
NodeIter iter(&rootNode);
@@ -215,6 +216,15 @@
{
// Push child to stack.
TestNode* childNode = iter.children[iter.curChildNdx];
+
+ // Check whether this is a bottom-level group (child is executable)
+ // and whether that group should be filtered out.
+ if ( isTestNodeTypeExecutable(childNode->getNodeType()) )
+ {
+ const std::string testName = m_nodePath + "." + childNode->getName();
+ if(!m_caseListFilter.checkCaseFraction(m_groupNumber, testName))
+ break;
+ }
m_sessionStack.push_back(NodeIter(childNode));
}
else
@@ -240,6 +250,7 @@
default:
DE_ASSERT(false);
}
+ m_groupNumber++;
}
m_sessionStack.pop_back();
diff --git a/framework/common/tcuTestHierarchyIterator.hpp b/framework/common/tcuTestHierarchyIterator.hpp
index b138cba..b24c1a5 100644
--- a/framework/common/tcuTestHierarchyIterator.hpp
+++ b/framework/common/tcuTestHierarchyIterator.hpp
@@ -195,6 +195,9 @@
// Current session state.
std::vector<NodeIter> m_sessionStack;
std::string m_nodePath;
+
+ // Counter that increments by one for each bottom-level test group
+ int m_groupNumber;
};
} // tcu
diff --git a/framework/common/tcuTexture.cpp b/framework/common/tcuTexture.cpp
index f5c85b6..4f2378f 100644
--- a/framework/common/tcuTexture.cpp
+++ b/framework/common/tcuTexture.cpp
@@ -274,7 +274,7 @@
inline float channelToFloat (const deUint8* value, TextureFormat::ChannelType type)
{
// make sure this table is updated if format table is updated
- DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 40);
+ DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 42);
switch (type)
{
@@ -306,7 +306,7 @@
inline int channelToInt (const deUint8* value, TextureFormat::ChannelType type)
{
// make sure this table is updated if format table is updated
- DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 40);
+ DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 42);
switch (type)
{
@@ -338,7 +338,7 @@
void floatToChannel (deUint8* dst, float src, TextureFormat::ChannelType type)
{
// make sure this table is updated if format table is updated
- DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 40);
+ DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 42);
switch (type)
{
@@ -425,7 +425,7 @@
void intToChannel (deUint8* dst, int src, TextureFormat::ChannelType type)
{
// make sure this table is updated if format table is updated
- DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 40);
+ DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 42);
switch (type)
{
@@ -618,12 +618,14 @@
case TextureFormat::SIGNED_INT8:
case TextureFormat::SIGNED_INT16:
case TextureFormat::SIGNED_INT32:
+ case TextureFormat::SIGNED_INT64:
return isColor;
case TextureFormat::UNSIGNED_INT8:
case TextureFormat::UNSIGNED_INT16:
case TextureFormat::UNSIGNED_INT24:
case TextureFormat::UNSIGNED_INT32:
+ case TextureFormat::UNSIGNED_INT64:
return isColor || format.order == TextureFormat::S;
case TextureFormat::HALF_FLOAT:
@@ -643,7 +645,7 @@
return 0u;
}
- DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 40);
+ DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 42);
}
int getNumUsedChannels (TextureFormat::ChannelOrder order)
@@ -683,7 +685,7 @@
int getChannelSize (TextureFormat::ChannelType type)
{
// make sure this table is updated if format table is updated
- DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 40);
+ DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 42);
switch (type)
{
@@ -697,10 +699,12 @@
case TextureFormat::SIGNED_INT8: return 1;
case TextureFormat::SIGNED_INT16: return 2;
case TextureFormat::SIGNED_INT32: return 4;
+ case TextureFormat::SIGNED_INT64: return 8;
case TextureFormat::UNSIGNED_INT8: return 1;
case TextureFormat::UNSIGNED_INT16: return 2;
case TextureFormat::UNSIGNED_INT24: return 3;
case TextureFormat::UNSIGNED_INT32: return 4;
+ case TextureFormat::UNSIGNED_INT64: return 8;
case TextureFormat::HALF_FLOAT: return 2;
case TextureFormat::FLOAT: return 4;
case TextureFormat::FLOAT64: return 8;
@@ -721,7 +725,7 @@
DE_ASSERT(isValid(format));
// make sure this table is updated if format table is updated
- DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 40);
+ DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 42);
switch (type)
{
@@ -3860,10 +3864,12 @@
"SIGNED_INT8",
"SIGNED_INT16",
"SIGNED_INT32",
+ "SIGNED_INT64",
"UNSIGNED_INT8",
"UNSIGNED_INT16",
"UNSIGNED_INT24",
"UNSIGNED_INT32",
+ "UNSIGNED_INT64",
"HALF_FLOAT",
"FLOAT",
"FLOAT64",
diff --git a/framework/common/tcuTexture.hpp b/framework/common/tcuTexture.hpp
index b8d2be0..8baee3e 100644
--- a/framework/common/tcuTexture.hpp
+++ b/framework/common/tcuTexture.hpp
@@ -101,10 +101,12 @@
SIGNED_INT8,
SIGNED_INT16,
SIGNED_INT32,
+ SIGNED_INT64,
UNSIGNED_INT8,
UNSIGNED_INT16,
UNSIGNED_INT24,
UNSIGNED_INT32,
+ UNSIGNED_INT64,
HALF_FLOAT,
FLOAT,
FLOAT64,
diff --git a/framework/common/tcuTextureUtil.cpp b/framework/common/tcuTextureUtil.cpp
index 785ebb4..ec5e6f4 100644
--- a/framework/common/tcuTextureUtil.cpp
+++ b/framework/common/tcuTextureUtil.cpp
@@ -120,7 +120,7 @@
bool isCombinedDepthStencilType (TextureFormat::ChannelType type)
{
// make sure to update this if type table is updated
- DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 40);
+ DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 42);
return type == TextureFormat::UNSIGNED_INT_16_8_8 ||
type == TextureFormat::UNSIGNED_INT_24_8 ||
@@ -162,7 +162,7 @@
TextureChannelClass getTextureChannelClass (TextureFormat::ChannelType channelType)
{
// make sure this table is updated if format table is updated
- DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 40);
+ DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 42);
switch (channelType)
{
@@ -196,10 +196,12 @@
case TextureFormat::SIGNED_INT8: return TEXTURECHANNELCLASS_SIGNED_INTEGER;
case TextureFormat::SIGNED_INT16: return TEXTURECHANNELCLASS_SIGNED_INTEGER;
case TextureFormat::SIGNED_INT32: return TEXTURECHANNELCLASS_SIGNED_INTEGER;
+ case TextureFormat::SIGNED_INT64: return TEXTURECHANNELCLASS_SIGNED_INTEGER;
case TextureFormat::UNSIGNED_INT8: return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
case TextureFormat::UNSIGNED_INT16: return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
case TextureFormat::UNSIGNED_INT24: return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
case TextureFormat::UNSIGNED_INT32: return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
+ case TextureFormat::UNSIGNED_INT64: return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
case TextureFormat::HALF_FLOAT: return TEXTURECHANNELCLASS_FLOATING_POINT;
case TextureFormat::FLOAT: return TEXTURECHANNELCLASS_FLOATING_POINT;
case TextureFormat::FLOAT64: return TEXTURECHANNELCLASS_FLOATING_POINT;
@@ -349,7 +351,7 @@
static Vec2 getFloatChannelValueRange (TextureFormat::ChannelType channelType)
{
// make sure this table is updated if format table is updated
- DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 40);
+ DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 42);
float cMin = 0.0f;
float cMax = 0.0f;
@@ -518,7 +520,7 @@
static IVec4 getChannelBitDepth (TextureFormat::ChannelType channelType)
{
// make sure this table is updated if format table is updated
- DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 40);
+ DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 42);
switch (channelType)
{
@@ -587,7 +589,7 @@
static IVec4 getChannelMantissaBitDepth (TextureFormat::ChannelType channelType)
{
// make sure this table is updated if format table is updated
- DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 40);
+ DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 42);
switch (channelType)
{
@@ -1269,7 +1271,7 @@
static AccessType toSamplerAccess (const AccessType& baseAccess, Sampler::DepthStencilMode mode)
{
// make sure to update this if type table is updated
- DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 40);
+ DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 42);
if (!isCombinedDepthStencilType(baseAccess.getFormat().type))
return baseAccess;
diff --git a/framework/egl/egluStaticES20Library.inl b/framework/egl/egluStaticES20Library.inl
index 1a636e7..edeed0e 100644
--- a/framework/egl/egluStaticES20Library.inl
+++ b/framework/egl/egluStaticES20Library.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
{ "glActiveTexture", (deFunctionPtr)glActiveTexture },
{ "glAttachShader", (deFunctionPtr)glAttachShader },
diff --git a/framework/egl/egluStaticES30Library.inl b/framework/egl/egluStaticES30Library.inl
index a9a3fab..659601c 100644
--- a/framework/egl/egluStaticES30Library.inl
+++ b/framework/egl/egluStaticES30Library.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
{ "glActiveTexture", (deFunctionPtr)glActiveTexture },
{ "glAttachShader", (deFunctionPtr)glAttachShader },
diff --git a/framework/egl/egluStaticES31Library.inl b/framework/egl/egluStaticES31Library.inl
index 532df6d..d69ebd0 100644
--- a/framework/egl/egluStaticES31Library.inl
+++ b/framework/egl/egluStaticES31Library.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
{ "glActiveShaderProgram", (deFunctionPtr)glActiveShaderProgram },
{ "glActiveTexture", (deFunctionPtr)glActiveTexture },
diff --git a/framework/egl/egluStaticES32Library.inl b/framework/egl/egluStaticES32Library.inl
index 74089e6..6b7718b 100644
--- a/framework/egl/egluStaticES32Library.inl
+++ b/framework/egl/egluStaticES32Library.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
{ "glActiveShaderProgram", (deFunctionPtr)glActiveShaderProgram },
{ "glActiveTexture", (deFunctionPtr)glActiveTexture },
diff --git a/framework/opengl/gluCallLogUtil.inl b/framework/opengl/gluCallLogUtil.inl
index 1a03482..6637d2c 100644
--- a/framework/opengl/gluCallLogUtil.inl
+++ b/framework/opengl/gluCallLogUtil.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
int getTextureParamNumArgs (int pname)
diff --git a/framework/opengl/gluCallLogWrapper.inl b/framework/opengl/gluCallLogWrapper.inl
index 3fc581f..aba9796 100644
--- a/framework/opengl/gluCallLogWrapper.inl
+++ b/framework/opengl/gluCallLogWrapper.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
void CallLogWrapper::glActiveShaderProgram (glw::GLuint pipeline, glw::GLuint program)
diff --git a/framework/opengl/gluCallLogWrapperApi.inl b/framework/opengl/gluCallLogWrapperApi.inl
index 7caf5f0..c46f5e3 100644
--- a/framework/opengl/gluCallLogWrapperApi.inl
+++ b/framework/opengl/gluCallLogWrapperApi.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
void glActiveShaderProgram (glw::GLuint pipeline, glw::GLuint program);
void glActiveTexture (glw::GLenum texture);
diff --git a/framework/opengl/gluQueryUtil.inl b/framework/opengl/gluQueryUtil.inl
index c98d4f5..23bfa82 100644
--- a/framework/opengl/gluQueryUtil.inl
+++ b/framework/opengl/gluQueryUtil.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
int getBasicQueryNumArgsOut (int pname)
diff --git a/framework/opengl/gluStrUtil.inl b/framework/opengl/gluStrUtil.inl
index 6d33025..204ba2e 100644
--- a/framework/opengl/gluStrUtil.inl
+++ b/framework/opengl/gluStrUtil.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
const char* getErrorName (int value)
diff --git a/framework/opengl/gluStrUtilPrototypes.inl b/framework/opengl/gluStrUtilPrototypes.inl
index 54ebc59..9d8dedd 100644
--- a/framework/opengl/gluStrUtilPrototypes.inl
+++ b/framework/opengl/gluStrUtilPrototypes.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
const char* getErrorName (int value);
const char* getTypeName (int value);
diff --git a/framework/opengl/wrapper/glwApi.inl b/framework/opengl/wrapper/glwApi.inl
index 4890e22..9dde9ff 100644
--- a/framework/opengl/wrapper/glwApi.inl
+++ b/framework/opengl/wrapper/glwApi.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
#define glActiveShaderProgram glwActiveShaderProgram
#define glActiveTexture glwActiveTexture
diff --git a/framework/opengl/wrapper/glwEnums.inl b/framework/opengl/wrapper/glwEnums.inl
index 66096d2..944fc6e 100644
--- a/framework/opengl/wrapper/glwEnums.inl
+++ b/framework/opengl/wrapper/glwEnums.inl
@@ -1,11 +1,16 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
#define GL_DEPTH_BUFFER_BIT 0x00000100
#define GL_STENCIL_BUFFER_BIT 0x00000400
#define GL_COLOR_BUFFER_BIT 0x00004000
+#define GL_DYNAMIC_STORAGE_BIT 0x0100
+#define GL_CLIENT_STORAGE_BIT 0x0200
+#define GL_SPARSE_STORAGE_BIT_ARB 0x0400
+#define GL_PER_GPU_STORAGE_BIT_NV 0x0800
+#define GL_EXTERNAL_STORAGE_BIT_NVX 0x2000
#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001
#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002
#define GL_CONTEXT_FLAG_DEBUG_BIT_KHR 0x00000002
@@ -22,11 +27,6 @@
#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020
#define GL_MAP_PERSISTENT_BIT 0x0040
#define GL_MAP_COHERENT_BIT 0x0080
-#define GL_DYNAMIC_STORAGE_BIT 0x0100
-#define GL_CLIENT_STORAGE_BIT 0x0200
-#define GL_SPARSE_STORAGE_BIT_ARB 0x0400
-#define GL_PER_GPU_STORAGE_BIT_NV 0x0800
-#define GL_EXTERNAL_STORAGE_BIT_NVX 0x2000
#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001
#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002
#define GL_UNIFORM_BARRIER_BIT 0x00000004
@@ -54,6 +54,15 @@
#define GL_TESS_EVALUATION_SHADER_BIT_EXT 0x00000010
#define GL_COMPUTE_SHADER_BIT 0x00000020
#define GL_ALL_SHADER_BITS 0xFFFFFFFFu
+#define GL_SUBGROUP_FEATURE_BASIC_BIT_KHR 0x00000001
+#define GL_SUBGROUP_FEATURE_VOTE_BIT_KHR 0x00000002
+#define GL_SUBGROUP_FEATURE_ARITHMETIC_BIT_KHR 0x00000004
+#define GL_SUBGROUP_FEATURE_BALLOT_BIT_KHR 0x00000008
+#define GL_SUBGROUP_FEATURE_SHUFFLE_BIT_KHR 0x00000010
+#define GL_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT_KHR 0x00000020
+#define GL_SUBGROUP_FEATURE_CLUSTERED_BIT_KHR 0x00000040
+#define GL_SUBGROUP_FEATURE_QUAD_BIT_KHR 0x00000080
+#define GL_SUBGROUP_FEATURE_PARTITIONED_BIT_NV 0x00000100
#define GL_FALSE 0
#define GL_NO_ERROR 0
#define GL_ZERO 0
@@ -1788,6 +1797,10 @@
#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC
#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12 0x93DD
#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD
+#define GL_SUBGROUP_SIZE_KHR 0x9532
+#define GL_SUBGROUP_SUPPORTED_STAGES_KHR 0x9533
+#define GL_SUBGROUP_SUPPORTED_FEATURES_KHR 0x9534
+#define GL_SUBGROUP_QUAD_ALL_STAGES_KHR 0x9535
#define GL_PER_GPU_STORAGE_NV 0x9548
#define GL_MULTICAST_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9549
#define GL_SHADER_BINARY_FORMAT_SPIR_V 0x9551
diff --git a/framework/opengl/wrapper/glwFunctionTypes.inl b/framework/opengl/wrapper/glwFunctionTypes.inl
index a842a0c..48fd604 100644
--- a/framework/opengl/wrapper/glwFunctionTypes.inl
+++ b/framework/opengl/wrapper/glwFunctionTypes.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
typedef GLW_APICALL void (GLW_APIENTRY* glActiveShaderProgramFunc) (GLuint pipeline, GLuint program);
typedef GLW_APICALL void (GLW_APIENTRY* glActiveTextureFunc) (GLenum texture);
diff --git a/framework/opengl/wrapper/glwFunctions.inl b/framework/opengl/wrapper/glwFunctions.inl
index 38f8e17..2e1ce5f 100644
--- a/framework/opengl/wrapper/glwFunctions.inl
+++ b/framework/opengl/wrapper/glwFunctions.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
glActiveShaderProgramFunc activeShaderProgram;
glActiveTextureFunc activeTexture;
diff --git a/framework/opengl/wrapper/glwImpl.inl b/framework/opengl/wrapper/glwImpl.inl
index 0d66671..f7aa5e0 100644
--- a/framework/opengl/wrapper/glwImpl.inl
+++ b/framework/opengl/wrapper/glwImpl.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
void glwActiveShaderProgram (GLuint pipeline, GLuint program)
diff --git a/framework/opengl/wrapper/glwInitES20.inl b/framework/opengl/wrapper/glwInitES20.inl
index 999ff3c..eeb04a4 100644
--- a/framework/opengl/wrapper/glwInitES20.inl
+++ b/framework/opengl/wrapper/glwInitES20.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
gl->activeTexture = (glActiveTextureFunc) loader->get("glActiveTexture");
gl->attachShader = (glAttachShaderFunc) loader->get("glAttachShader");
diff --git a/framework/opengl/wrapper/glwInitES20Direct.inl b/framework/opengl/wrapper/glwInitES20Direct.inl
index cbfc04a..19565d1 100644
--- a/framework/opengl/wrapper/glwInitES20Direct.inl
+++ b/framework/opengl/wrapper/glwInitES20Direct.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
gl->activeTexture = &glActiveTexture;
gl->attachShader = &glAttachShader;
diff --git a/framework/opengl/wrapper/glwInitES30.inl b/framework/opengl/wrapper/glwInitES30.inl
index 9c2fd19..86ff085 100644
--- a/framework/opengl/wrapper/glwInitES30.inl
+++ b/framework/opengl/wrapper/glwInitES30.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
gl->activeTexture = (glActiveTextureFunc) loader->get("glActiveTexture");
gl->attachShader = (glAttachShaderFunc) loader->get("glAttachShader");
diff --git a/framework/opengl/wrapper/glwInitES30Direct.inl b/framework/opengl/wrapper/glwInitES30Direct.inl
index a8a5bf0..c5402a5 100644
--- a/framework/opengl/wrapper/glwInitES30Direct.inl
+++ b/framework/opengl/wrapper/glwInitES30Direct.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
gl->activeTexture = &glActiveTexture;
gl->attachShader = &glAttachShader;
diff --git a/framework/opengl/wrapper/glwInitES31.inl b/framework/opengl/wrapper/glwInitES31.inl
index c66f753..c7a4d9a 100644
--- a/framework/opengl/wrapper/glwInitES31.inl
+++ b/framework/opengl/wrapper/glwInitES31.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
gl->activeShaderProgram = (glActiveShaderProgramFunc) loader->get("glActiveShaderProgram");
gl->activeTexture = (glActiveTextureFunc) loader->get("glActiveTexture");
diff --git a/framework/opengl/wrapper/glwInitES31Direct.inl b/framework/opengl/wrapper/glwInitES31Direct.inl
index 7e7ebc4..bcfbfa7 100644
--- a/framework/opengl/wrapper/glwInitES31Direct.inl
+++ b/framework/opengl/wrapper/glwInitES31Direct.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
gl->activeShaderProgram = &glActiveShaderProgram;
gl->activeTexture = &glActiveTexture;
diff --git a/framework/opengl/wrapper/glwInitES32.inl b/framework/opengl/wrapper/glwInitES32.inl
index c78b3f2..9273879 100644
--- a/framework/opengl/wrapper/glwInitES32.inl
+++ b/framework/opengl/wrapper/glwInitES32.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
gl->activeShaderProgram = (glActiveShaderProgramFunc) loader->get("glActiveShaderProgram");
gl->activeTexture = (glActiveTextureFunc) loader->get("glActiveTexture");
diff --git a/framework/opengl/wrapper/glwInitES32Direct.inl b/framework/opengl/wrapper/glwInitES32Direct.inl
index aaef0d3..0c6c269 100644
--- a/framework/opengl/wrapper/glwInitES32Direct.inl
+++ b/framework/opengl/wrapper/glwInitES32Direct.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
gl->activeShaderProgram = &glActiveShaderProgram;
gl->activeTexture = &glActiveTexture;
diff --git a/framework/opengl/wrapper/glwInitExtES.inl b/framework/opengl/wrapper/glwInitExtES.inl
index 44a9341..9775c98 100644
--- a/framework/opengl/wrapper/glwInitExtES.inl
+++ b/framework/opengl/wrapper/glwInitExtES.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
if (de::contains(extSet, "GL_KHR_blend_equation_advanced"))
diff --git a/framework/opengl/wrapper/glwInitExtGL.inl b/framework/opengl/wrapper/glwInitExtGL.inl
index 26f25ba..fb6c9c1 100644
--- a/framework/opengl/wrapper/glwInitExtGL.inl
+++ b/framework/opengl/wrapper/glwInitExtGL.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
if (de::contains(extSet, "GL_KHR_blend_equation_advanced"))
diff --git a/framework/opengl/wrapper/glwInitGL30.inl b/framework/opengl/wrapper/glwInitGL30.inl
index 0fbc1a9..09cd500 100644
--- a/framework/opengl/wrapper/glwInitGL30.inl
+++ b/framework/opengl/wrapper/glwInitGL30.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
gl->activeTexture = (glActiveTextureFunc) loader->get("glActiveTexture");
gl->attachShader = (glAttachShaderFunc) loader->get("glAttachShader");
diff --git a/framework/opengl/wrapper/glwInitGL31.inl b/framework/opengl/wrapper/glwInitGL31.inl
index 7b40442..b761a2f 100644
--- a/framework/opengl/wrapper/glwInitGL31.inl
+++ b/framework/opengl/wrapper/glwInitGL31.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
gl->activeTexture = (glActiveTextureFunc) loader->get("glActiveTexture");
gl->attachShader = (glAttachShaderFunc) loader->get("glAttachShader");
diff --git a/framework/opengl/wrapper/glwInitGL32.inl b/framework/opengl/wrapper/glwInitGL32.inl
index 62a7e1d..e4e2d90 100644
--- a/framework/opengl/wrapper/glwInitGL32.inl
+++ b/framework/opengl/wrapper/glwInitGL32.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
gl->activeTexture = (glActiveTextureFunc) loader->get("glActiveTexture");
gl->attachShader = (glAttachShaderFunc) loader->get("glAttachShader");
diff --git a/framework/opengl/wrapper/glwInitGL33.inl b/framework/opengl/wrapper/glwInitGL33.inl
index 1d2a5fc..eb5c029 100644
--- a/framework/opengl/wrapper/glwInitGL33.inl
+++ b/framework/opengl/wrapper/glwInitGL33.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
gl->activeTexture = (glActiveTextureFunc) loader->get("glActiveTexture");
gl->attachShader = (glAttachShaderFunc) loader->get("glAttachShader");
diff --git a/framework/opengl/wrapper/glwInitGL40.inl b/framework/opengl/wrapper/glwInitGL40.inl
index 2abee8d..8724d38 100644
--- a/framework/opengl/wrapper/glwInitGL40.inl
+++ b/framework/opengl/wrapper/glwInitGL40.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
gl->activeTexture = (glActiveTextureFunc) loader->get("glActiveTexture");
gl->attachShader = (glAttachShaderFunc) loader->get("glAttachShader");
diff --git a/framework/opengl/wrapper/glwInitGL41.inl b/framework/opengl/wrapper/glwInitGL41.inl
index 6a9b5bb..66009eb 100644
--- a/framework/opengl/wrapper/glwInitGL41.inl
+++ b/framework/opengl/wrapper/glwInitGL41.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
gl->activeShaderProgram = (glActiveShaderProgramFunc) loader->get("glActiveShaderProgram");
gl->activeTexture = (glActiveTextureFunc) loader->get("glActiveTexture");
diff --git a/framework/opengl/wrapper/glwInitGL42.inl b/framework/opengl/wrapper/glwInitGL42.inl
index d12ed9c..188f69a 100644
--- a/framework/opengl/wrapper/glwInitGL42.inl
+++ b/framework/opengl/wrapper/glwInitGL42.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
gl->activeShaderProgram = (glActiveShaderProgramFunc) loader->get("glActiveShaderProgram");
gl->activeTexture = (glActiveTextureFunc) loader->get("glActiveTexture");
diff --git a/framework/opengl/wrapper/glwInitGL43.inl b/framework/opengl/wrapper/glwInitGL43.inl
index 08af33e..b96d717 100644
--- a/framework/opengl/wrapper/glwInitGL43.inl
+++ b/framework/opengl/wrapper/glwInitGL43.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
gl->activeShaderProgram = (glActiveShaderProgramFunc) loader->get("glActiveShaderProgram");
gl->activeTexture = (glActiveTextureFunc) loader->get("glActiveTexture");
diff --git a/framework/opengl/wrapper/glwInitGL44.inl b/framework/opengl/wrapper/glwInitGL44.inl
index c58f427..2e861bd 100644
--- a/framework/opengl/wrapper/glwInitGL44.inl
+++ b/framework/opengl/wrapper/glwInitGL44.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
gl->activeShaderProgram = (glActiveShaderProgramFunc) loader->get("glActiveShaderProgram");
gl->activeTexture = (glActiveTextureFunc) loader->get("glActiveTexture");
diff --git a/framework/opengl/wrapper/glwInitGL45.inl b/framework/opengl/wrapper/glwInitGL45.inl
index 38d53e8..525c40b 100644
--- a/framework/opengl/wrapper/glwInitGL45.inl
+++ b/framework/opengl/wrapper/glwInitGL45.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
gl->activeShaderProgram = (glActiveShaderProgramFunc) loader->get("glActiveShaderProgram");
gl->activeTexture = (glActiveTextureFunc) loader->get("glActiveTexture");
diff --git a/framework/opengl/wrapper/glwInitGL46.inl b/framework/opengl/wrapper/glwInitGL46.inl
index e7f194c..e9823f4 100644
--- a/framework/opengl/wrapper/glwInitGL46.inl
+++ b/framework/opengl/wrapper/glwInitGL46.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
gl->activeShaderProgram = (glActiveShaderProgramFunc) loader->get("glActiveShaderProgram");
gl->activeTexture = (glActiveTextureFunc) loader->get("glActiveTexture");
diff --git a/framework/opengl/wrapper/glwVersions.inl b/framework/opengl/wrapper/glwVersions.inl
index 0ae8058..f46b1c6 100644
--- a/framework/opengl/wrapper/glwVersions.inl
+++ b/framework/opengl/wrapper/glwVersions.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
#define GL_ES_VERSION_2_0 1
#define GL_ES_VERSION_3_0 1
diff --git a/framework/platform/null/tcuNullRenderContextFuncs.inl b/framework/platform/null/tcuNullRenderContextFuncs.inl
index 1fb4397..9926b80 100644
--- a/framework/platform/null/tcuNullRenderContextFuncs.inl
+++ b/framework/platform/null/tcuNullRenderContextFuncs.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
GLW_APICALL void GLW_APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program)
diff --git a/framework/platform/null/tcuNullRenderContextInitFuncs.inl b/framework/platform/null/tcuNullRenderContextInitFuncs.inl
index 03f99f6..61f6c89 100644
--- a/framework/platform/null/tcuNullRenderContextInitFuncs.inl
+++ b/framework/platform/null/tcuNullRenderContextInitFuncs.inl
@@ -1,7 +1,7 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*
- * Generated from Khronos GL API description (gl.xml) revision b7aee529f02340247e45621e9dbd054817d39c71.
+ * Generated from Khronos GL API description (gl.xml) revision 9d534f9312e56c72df763207e449c6719576fd54.
*/
gl->activeShaderProgram = glActiveShaderProgram;
gl->activeTexture = glActiveTexture;
diff --git a/framework/platform/tcuMain.cpp b/framework/platform/tcuMain.cpp
index 1641a1c..f3e0fb4 100644
--- a/framework/platform/tcuMain.cpp
+++ b/framework/platform/tcuMain.cpp
@@ -27,6 +27,7 @@
#include "tcuApp.hpp"
#include "tcuResource.hpp"
#include "tcuTestLog.hpp"
+#include "tcuTestSessionExecutor.hpp"
#include "deUniquePtr.hpp"
#include <cstdio>
@@ -36,6 +37,8 @@
int main (int argc, char** argv)
{
+ int exitStatus = EXIT_SUCCESS;
+
#if (DE_OS != DE_OS_WIN32)
// Set stdout to line-buffered mode (will be fully buffered by default if stdout is pipe).
setvbuf(stdout, DE_NULL, _IOLBF, 4*1024);
@@ -53,7 +56,15 @@
for (;;)
{
if (!app->iterate())
+ {
+ if (cmdLine.getRunMode() == tcu::RUNMODE_EXECUTE &&
+ (!app->getResult().isComplete || app->getResult().numFailed))
+ {
+ exitStatus = EXIT_FAILURE;
+ }
+
break;
+ }
}
}
catch (const std::exception& e)
@@ -61,5 +72,5 @@
tcu::die("%s", e.what());
}
- return 0;
+ return exitStatus;
}
diff --git a/framework/referencerenderer/rrRasterizer.cpp b/framework/referencerenderer/rrRasterizer.cpp
index 1f51410..a5efabc 100644
--- a/framework/referencerenderer/rrRasterizer.cpp
+++ b/framework/referencerenderer/rrRasterizer.cpp
@@ -860,6 +860,7 @@
, m_subpixelBits (subpixelBits)
, m_curRowFragment (0)
, m_lineWidth (0.0f)
+ , m_stippleCounter (0)
{
}
@@ -867,7 +868,7 @@
{
}
-void SingleSampleLineRasterizer::init (const tcu::Vec4& v0, const tcu::Vec4& v1, float lineWidth)
+void SingleSampleLineRasterizer::init (const tcu::Vec4& v0, const tcu::Vec4& v1, float lineWidth, deUint32 stippleFactor, deUint16 stipplePattern)
{
const bool isXMajor = de::abs((v1 - v0).x()) >= de::abs((v1 - v0).y());
@@ -915,8 +916,17 @@
m_v0 = v0;
m_v1 = v1;
- m_curPos = m_bboxMin;
+ // Choose direction of traversal and whether to start at bbox min or max. Direction matters
+ // for the stipple counter.
+ int xDelta = (m_v1 - m_v0).x() > 0 ? 1 : -1;
+ int yDelta = (m_v1 - m_v0).y() > 0 ? 1 : -1;
+
+ m_curPos.x() = xDelta > 0 ? m_bboxMin.x() : m_bboxMax.x();
+ m_curPos.y() = yDelta > 0 ? m_bboxMin.y() : m_bboxMax.y();
+
m_curRowFragment = 0;
+ m_stippleFactor = stippleFactor;
+ m_stipplePattern = stipplePattern;
}
void SingleSampleLineRasterizer::rasterize (FragmentPacket* const fragmentPackets, float* const depthValues, const int maxFragmentPackets, int& numPacketsRasterized)
@@ -935,8 +945,10 @@
const LineRasterUtil::SubpixelLineSegment line = LineRasterUtil::SubpixelLineSegment(pa, pb);
int packetNdx = 0;
+ int xDelta = (m_v1 - m_v0).x() > 0 ? 1 : -1;
+ int yDelta = (m_v1 - m_v0).y() > 0 ? 1 : -1;
- while (m_curPos.y() <= m_bboxMax.y() && packetNdx < maxFragmentPackets)
+ while (m_curPos.y() <= m_bboxMax.y() && m_curPos.y() >= m_bboxMin.y() && packetNdx < maxFragmentPackets)
{
const tcu::Vector<deInt64,2> diamondPosition = LineRasterUtil::toSubpixelVector(m_curPos, m_subpixelBits) + tcu::Vector<deInt64,2>(halfPixel,halfPixel);
@@ -951,61 +963,69 @@
const int rowFragBegin = de::max(0, minViewportLimit - fragmentLocation);
const int rowFragEnd = de::min(maxViewportLimit - fragmentLocation, lineWidth);
- // Wide lines require multiple fragments.
- for (; rowFragBegin + m_curRowFragment < rowFragEnd; m_curRowFragment++)
+ int stippleBit = (m_stippleCounter / m_stippleFactor) % 16;
+ bool stipplePass = (m_stipplePattern & (1 << stippleBit)) != 0;
+ m_stippleCounter++;
+
+ if (stipplePass)
{
- const int replicationId = rowFragBegin + m_curRowFragment;
- const tcu::IVec2 fragmentPos = m_curPos + minorDirection * replicationId;
-
- // We only rasterize visible area
- DE_ASSERT(LineRasterUtil::inViewport(fragmentPos, m_viewport));
-
- // Compute depth values.
- if (depthValues)
+ // Wide lines require multiple fragments.
+ for (; rowFragBegin + m_curRowFragment < rowFragEnd; m_curRowFragment++)
{
- const float za = m_v0.z();
- const float zb = m_v1.z();
+ const int replicationId = rowFragBegin + m_curRowFragment;
+ const tcu::IVec2 fragmentPos = m_curPos + minorDirection * replicationId;
- depthValues[packetNdx*4+0] = (1 - t) * za + t * zb;
- depthValues[packetNdx*4+1] = 0;
- depthValues[packetNdx*4+2] = 0;
- depthValues[packetNdx*4+3] = 0;
+ // We only rasterize visible area
+ DE_ASSERT(LineRasterUtil::inViewport(fragmentPos, m_viewport));
+
+ // Compute depth values.
+ if (depthValues)
+ {
+ const float za = m_v0.z();
+ const float zb = m_v1.z();
+
+ depthValues[packetNdx*4+0] = (1 - t) * za + t * zb;
+ depthValues[packetNdx*4+1] = 0;
+ depthValues[packetNdx*4+2] = 0;
+ depthValues[packetNdx*4+3] = 0;
+ }
+
+ {
+ // output this fragment
+ // \note In order to make consistent output with multisampled line rasterization, output "barycentric" coordinates
+ FragmentPacket& packet = fragmentPackets[packetNdx];
+
+ const tcu::Vec4 b0 = tcu::Vec4(1 - t);
+ const tcu::Vec4 b1 = tcu::Vec4(t);
+ const tcu::Vec4 ooSum = 1.0f / (b0 + b1);
+
+ packet.position = fragmentPos;
+ packet.coverage = getCoverageBit(1, 0, 0, 0);
+ packet.barycentric[0] = b0 * ooSum;
+ packet.barycentric[1] = b1 * ooSum;
+ packet.barycentric[2] = tcu::Vec4(0.0f);
+
+ packetNdx += 1;
+ }
+
+ if (packetNdx == maxFragmentPackets)
+ {
+ m_curRowFragment++; // don't redraw this fragment again next time
+ m_stippleCounter--; // reuse same stipple counter next time
+ numPacketsRasterized = packetNdx;
+ return;
+ }
}
- {
- // output this fragment
- // \note In order to make consistent output with multisampled line rasterization, output "barycentric" coordinates
- FragmentPacket& packet = fragmentPackets[packetNdx];
-
- const tcu::Vec4 b0 = tcu::Vec4(1 - t);
- const tcu::Vec4 b1 = tcu::Vec4(t);
- const tcu::Vec4 ooSum = 1.0f / (b0 + b1);
-
- packet.position = fragmentPos;
- packet.coverage = getCoverageBit(1, 0, 0, 0);
- packet.barycentric[0] = b0 * ooSum;
- packet.barycentric[1] = b1 * ooSum;
- packet.barycentric[2] = tcu::Vec4(0.0f);
-
- packetNdx += 1;
- }
-
- if (packetNdx == maxFragmentPackets)
- {
- m_curRowFragment++; // don't redraw this fragment again next time
- numPacketsRasterized = packetNdx;
- return;
- }
+ m_curRowFragment = 0;
}
-
- m_curRowFragment = 0;
}
- ++m_curPos.x();
- if (m_curPos.x() > m_bboxMax.x())
+ m_curPos.x() += xDelta;
+ if (m_curPos.x() > m_bboxMax.x() || m_curPos.x() < m_bboxMin.x())
{
- ++m_curPos.y();
- m_curPos.x() = m_bboxMin.x();
+ m_curPos.y() += yDelta;
+ m_curPos.x() = xDelta > 0 ? m_bboxMin.x() : m_bboxMax.x();
}
}
diff --git a/framework/referencerenderer/rrRasterizer.hpp b/framework/referencerenderer/rrRasterizer.hpp
index da8800a..1f8bbb0 100644
--- a/framework/referencerenderer/rrRasterizer.hpp
+++ b/framework/referencerenderer/rrRasterizer.hpp
@@ -181,11 +181,13 @@
SingleSampleLineRasterizer (const tcu::IVec4& viewport, const int subpixelBits);
~SingleSampleLineRasterizer (void);
- void init (const tcu::Vec4& v0, const tcu::Vec4& v1, float lineWidth);
+ void init (const tcu::Vec4& v0, const tcu::Vec4& v1, float lineWidth, deUint32 stippleFactor, deUint16 stipplePattern);
// only available after init()
void rasterize (FragmentPacket* const fragmentPackets, float* const depthValues, const int maxFragmentPackets, int& numPacketsRasterized);
+ void resetStipple () { m_stippleCounter = 0; }
+
private:
SingleSampleLineRasterizer (const SingleSampleLineRasterizer&); // not allowed
SingleSampleLineRasterizer& operator= (const SingleSampleLineRasterizer&); // not allowed
@@ -202,6 +204,9 @@
tcu::IVec2 m_curPos; //!< Current rasterization position.
deInt32 m_curRowFragment; //!< Current rasterization position of one fragment in column of lineWidth fragments
float m_lineWidth;
+ deUint32 m_stippleFactor;
+ deUint16 m_stipplePattern;
+ deUint32 m_stippleCounter;
} DE_WARN_UNUSED_TYPE;
diff --git a/framework/referencerenderer/rrRenderer.cpp b/framework/referencerenderer/rrRenderer.cpp
index 9b72c72..721cadc 100644
--- a/framework/referencerenderer/rrRenderer.cpp
+++ b/framework/referencerenderer/rrRenderer.cpp
@@ -1182,7 +1182,7 @@
if (msaa)
msaaRasterizer.init(line.v0->position, line.v1->position, state.line.lineWidth);
else
- aliasedRasterizer.init(line.v0->position, line.v1->position, state.line.lineWidth);
+ aliasedRasterizer.init(line.v0->position, line.v1->position, state.line.lineWidth, 1, 0xFFFF);
for (;;)
{
diff --git a/modules/egl/teglGetProcAddressTests.inl b/modules/egl/teglGetProcAddressTests.inl
index 38b362f..bd65656 100644
--- a/modules/egl/teglGetProcAddressTests.inl
+++ b/modules/egl/teglGetProcAddressTests.inl
@@ -1048,6 +1048,12 @@
"glStartTilingQCOM",
};
+static const char* s_GL_AMD_framebuffer_multisample_advanced[] =
+{
+ "glNamedRenderbufferStorageMultisampleAdvancedAMD",
+ "glRenderbufferStorageMultisampleAdvancedAMD",
+};
+
static const char* s_GL_AMD_performance_monitor[] =
{
"glBeginPerfMonitorAMD",
@@ -1616,6 +1622,24 @@
"glGetInternalformatSampleivNV",
};
+static const char* s_GL_NV_memory_attachment[] =
+{
+ "glBufferAttachMemoryNV",
+ "glGetMemoryObjectDetachedResourcesuivNV",
+ "glNamedBufferAttachMemoryNV",
+ "glResetMemoryObjectParameterNV",
+ "glTexAttachMemoryNV",
+ "glTextureAttachMemoryNV",
+};
+
+static const char* s_GL_NV_mesh_shader[] =
+{
+ "glDrawMeshTasksNV",
+ "glDrawMeshTasksIndirectNV",
+ "glMultiDrawMeshTasksIndirectNV",
+ "glMultiDrawMeshTasksIndirectCountNV",
+};
+
static const char* s_GL_NV_non_square_matrices[] =
{
"glUniformMatrix2x3fvNV",
@@ -1723,6 +1747,23 @@
"glResolveDepthValuesNV",
};
+static const char* s_GL_NV_scissor_exclusive[] =
+{
+ "glScissorExclusiveArrayvNV",
+ "glScissorExclusiveNV",
+};
+
+static const char* s_GL_NV_shading_rate_image[] =
+{
+ "glBindShadingRateImageNV",
+ "glGetShadingRateImagePaletteNV",
+ "glGetShadingRateSampleLocationivNV",
+ "glShadingRateImageBarrierNV",
+ "glShadingRateImagePaletteNV",
+ "glShadingRateSampleOrderNV",
+ "glShadingRateSampleOrderCustomNV",
+};
+
static const char* s_GL_NV_viewport_array[] =
{
"glDepthRangeArrayfvNV",
@@ -1968,6 +2009,7 @@
{ "GL_QCOM_extended_get", DE_LENGTH_OF_ARRAY(s_GL_QCOM_extended_get), s_GL_QCOM_extended_get },
{ "GL_QCOM_extended_get2", DE_LENGTH_OF_ARRAY(s_GL_QCOM_extended_get2), s_GL_QCOM_extended_get2 },
{ "GL_QCOM_tiled_rendering", DE_LENGTH_OF_ARRAY(s_GL_QCOM_tiled_rendering), s_GL_QCOM_tiled_rendering },
+ { "GL_AMD_framebuffer_multisample_advanced", DE_LENGTH_OF_ARRAY(s_GL_AMD_framebuffer_multisample_advanced), s_GL_AMD_framebuffer_multisample_advanced },
{ "GL_AMD_performance_monitor", DE_LENGTH_OF_ARRAY(s_GL_AMD_performance_monitor), s_GL_AMD_performance_monitor },
{ "GL_ANGLE_framebuffer_blit", DE_LENGTH_OF_ARRAY(s_GL_ANGLE_framebuffer_blit), s_GL_ANGLE_framebuffer_blit },
{ "GL_ANGLE_framebuffer_multisample", DE_LENGTH_OF_ARRAY(s_GL_ANGLE_framebuffer_multisample), s_GL_ANGLE_framebuffer_multisample },
@@ -2038,11 +2080,15 @@
{ "GL_NV_gpu_shader5", DE_LENGTH_OF_ARRAY(s_GL_NV_gpu_shader5), s_GL_NV_gpu_shader5 },
{ "GL_NV_instanced_arrays", DE_LENGTH_OF_ARRAY(s_GL_NV_instanced_arrays), s_GL_NV_instanced_arrays },
{ "GL_NV_internalformat_sample_query", DE_LENGTH_OF_ARRAY(s_GL_NV_internalformat_sample_query), s_GL_NV_internalformat_sample_query },
+ { "GL_NV_memory_attachment", DE_LENGTH_OF_ARRAY(s_GL_NV_memory_attachment), s_GL_NV_memory_attachment },
+ { "GL_NV_mesh_shader", DE_LENGTH_OF_ARRAY(s_GL_NV_mesh_shader), s_GL_NV_mesh_shader },
{ "GL_NV_non_square_matrices", DE_LENGTH_OF_ARRAY(s_GL_NV_non_square_matrices), s_GL_NV_non_square_matrices },
{ "GL_NV_path_rendering", DE_LENGTH_OF_ARRAY(s_GL_NV_path_rendering), s_GL_NV_path_rendering },
{ "GL_NV_polygon_mode", DE_LENGTH_OF_ARRAY(s_GL_NV_polygon_mode), s_GL_NV_polygon_mode },
{ "GL_NV_read_buffer", DE_LENGTH_OF_ARRAY(s_GL_NV_read_buffer), s_GL_NV_read_buffer },
{ "GL_NV_sample_locations", DE_LENGTH_OF_ARRAY(s_GL_NV_sample_locations), s_GL_NV_sample_locations },
+ { "GL_NV_scissor_exclusive", DE_LENGTH_OF_ARRAY(s_GL_NV_scissor_exclusive), s_GL_NV_scissor_exclusive },
+ { "GL_NV_shading_rate_image", DE_LENGTH_OF_ARRAY(s_GL_NV_shading_rate_image), s_GL_NV_shading_rate_image },
{ "GL_NV_viewport_array", DE_LENGTH_OF_ARRAY(s_GL_NV_viewport_array), s_GL_NV_viewport_array },
{ "GL_NV_viewport_swizzle", DE_LENGTH_OF_ARRAY(s_GL_NV_viewport_swizzle), s_GL_NV_viewport_swizzle },
{ "GL_OES_copy_image", DE_LENGTH_OF_ARRAY(s_GL_OES_copy_image), s_GL_OES_copy_image },
diff --git a/modules/gles3/functional/es3fVertexArrayObjectTests.cpp b/modules/gles3/functional/es3fVertexArrayObjectTests.cpp
index ae9183f..82578b1 100644
--- a/modules/gles3/functional/es3fVertexArrayObjectTests.cpp
+++ b/modules/gles3/functional/es3fVertexArrayObjectTests.cpp
@@ -569,6 +569,14 @@
GLU_CHECK_CALL(glClearColor(0.7f, 0.7f, 0.7f, 1.0f));
GLU_CHECK_CALL(glClear(GL_COLOR_BUFFER_BIT));
+ for (int attribNdx = 0; attribNdx < (int)state.attributes.size(); attribNdx++)
+ {
+ if (state.attributes[attribNdx].integer)
+ glVertexAttribI4i(attribNdx, 0, 0, 0, 1);
+ else
+ glVertexAttrib4f(attribNdx, 0.0f, 0.0f, 0.0f, 1.0f);
+ }
+
if (m_spec.useDrawElements)
{
if (state.elementArrayBuffer == 0)
diff --git a/modules/gles31/functional/es31fSeparateShaderTests.cpp b/modules/gles31/functional/es31fSeparateShaderTests.cpp
index 4043fec..dea33ce 100644
--- a/modules/gles31/functional/es31fSeparateShaderTests.cpp
+++ b/modules/gles31/functional/es31fSeparateShaderTests.cpp
@@ -1724,7 +1724,7 @@
enum
{
NUM_INTERPOLATIONS = VARYINGINTERPOLATION_RANDOM, // VARYINGINTERPOLATION_RANDOM is one after last fully specified interpolation
- INTERFACEFLAGS_LAST = BINDING_LAST * NUM_INTERPOLATIONS * NUM_INTERPOLATIONS
+ INTERFACEFLAGS_LAST = static_cast<int>(BINDING_LAST) * static_cast<int>(NUM_INTERPOLATIONS) * static_cast<int>(NUM_INTERPOLATIONS)
};
for (deUint32 flags = 0; flags < INTERFACEFLAGS_LAST; ++flags)
diff --git a/modules/gles31/functional/es31fVertexAttributeBindingTests.cpp b/modules/gles31/functional/es31fVertexAttributeBindingTests.cpp
index e430fd4..7f6e614 100644
--- a/modules/gles31/functional/es31fVertexAttributeBindingTests.cpp
+++ b/modules/gles31/functional/es31fVertexAttributeBindingTests.cpp
@@ -735,12 +735,12 @@
if (m_spec.instanced)
{
// store single basic primitive
- primitiveData[0] = tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f);
- primitiveData[1] = tcu::Vec4(0.0f, 2.0f / GRID_SIZE, 0.0f, 1.0f);
- primitiveData[2] = tcu::Vec4(2.0f / GRID_SIZE, 2.0f / GRID_SIZE, 0.0f, 1.0f);
- primitiveData[3] = tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f);
- primitiveData[4] = tcu::Vec4(2.0f / GRID_SIZE, 2.0f / GRID_SIZE, 0.0f, 1.0f);
- primitiveData[5] = tcu::Vec4(2.0f / GRID_SIZE, 0.0f, 0.0f, 1.0f);
+ primitiveData[0] = tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f);
+ primitiveData[1] = tcu::Vec4(0.0f, 2.0f / float(GRID_SIZE), 0.0f, 1.0f);
+ primitiveData[2] = tcu::Vec4(2.0f / float(GRID_SIZE), 2.0f / float(GRID_SIZE), 0.0f, 1.0f);
+ primitiveData[3] = tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f);
+ primitiveData[4] = tcu::Vec4(2.0f / float(GRID_SIZE), 2.0f / float(GRID_SIZE), 0.0f, 1.0f);
+ primitiveData[5] = tcu::Vec4(2.0f / float(GRID_SIZE), 0.0f, 0.0f, 1.0f);
}
else
{
@@ -1013,12 +1013,12 @@
for (int primNdx = 0; primNdx < numPositionCells; ++primNdx)
{
- positionData[primNdx*6 + 0] = tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f);
- positionData[primNdx*6 + 1] = tcu::Vec4(0.0f, 2.0f / GRID_SIZE, 0.0f, 1.0f);
- positionData[primNdx*6 + 2] = tcu::Vec4(2.0f / GRID_SIZE, 2.0f / GRID_SIZE, 0.0f, 1.0f);
- positionData[primNdx*6 + 3] = tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f);
- positionData[primNdx*6 + 4] = tcu::Vec4(2.0f / GRID_SIZE, 2.0f / GRID_SIZE, 0.0f, 1.0f);
- positionData[primNdx*6 + 5] = tcu::Vec4(2.0f / GRID_SIZE, 0.0f, 0.0f, 1.0f);
+ positionData[primNdx*6 + 0] = tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f);
+ positionData[primNdx*6 + 1] = tcu::Vec4(0.0f, 2.0f / float(GRID_SIZE), 0.0f, 1.0f);
+ positionData[primNdx*6 + 2] = tcu::Vec4(2.0f / float(GRID_SIZE), 2.0f / float(GRID_SIZE), 0.0f, 1.0f);
+ positionData[primNdx*6 + 3] = tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f);
+ positionData[primNdx*6 + 4] = tcu::Vec4(2.0f / float(GRID_SIZE), 2.0f / float(GRID_SIZE), 0.0f, 1.0f);
+ positionData[primNdx*6 + 5] = tcu::Vec4(2.0f / float(GRID_SIZE), 0.0f, 0.0f, 1.0f);
}
// color & offset
diff --git a/modules/internal/ditTextureFormatTests.cpp b/modules/internal/ditTextureFormatTests.cpp
index 7cbc5f8..ae9dabd 100644
--- a/modules/internal/ditTextureFormatTests.cpp
+++ b/modules/internal/ditTextureFormatTests.cpp
@@ -879,6 +879,42 @@
0x0e659f16, 0x6d8499b2, 0xf09486ef, 0x67f99d25,
};
+static const deUint8 s_Int64In[] =
+{
+ 0x90, 0xb0, 0x00, 0x78, 0x01, 0x00, 0x00, 0x00,
+ 0x40, 0x70, 0x38, 0x2a, 0x01, 0x01, 0x00, 0x00,
+ 0x04, 0x0d, 0x67, 0x87, 0x01, 0x01, 0x01, 0x00,
+ 0xfc, 0x37, 0xe6, 0x40, 0x01, 0x01, 0x01, 0x01,
+ 0x09, 0x0e, 0xb6, 0x2f, 0x02, 0x01, 0x01, 0x01,
+ 0x24, 0xde, 0x70, 0x2a, 0x01, 0x02, 0x01, 0x01,
+ 0x16, 0x9f, 0x65, 0x0e, 0x01, 0x01, 0x02, 0x01,
+ 0xef, 0x86, 0x94, 0x72, 0x01, 0x01, 0x01, 0x02,
+ 0xc6, 0x7e, 0x50, 0x2a, 0x01, 0x00, 0x00, 0x00,
+ 0x4d, 0xa9, 0x77, 0x0d, 0x01, 0x01, 0x00, 0x00,
+ 0xf0, 0xb7, 0xde, 0x6b, 0x01, 0x01, 0x01, 0x00,
+ 0xa8, 0x9c, 0xfc, 0x6d, 0x01, 0x01, 0x01, 0x01,
+ 0xf3, 0x19, 0x14, 0x97, 0x02, 0x01, 0x01, 0x01,
+ 0x95, 0x32, 0xab, 0x7a, 0x01, 0x02, 0x01, 0x01,
+ 0x68, 0x84, 0xd9, 0x71, 0x01, 0x01, 0x02, 0x01,
+ 0xf7, 0x73, 0x8f, 0x0a, 0x01, 0x01, 0x01, 0x02,
+};
+
+static const deUint32 s_Int64FloatRef[] =
+{
+ 0x4fbc0058, 0x5380951c, 0x578080c4, 0x5b808081,
+ 0x5b808081, 0x5b808101, 0x5b810081, 0x5c004040,
+ 0x4f95283f, 0x538086bc, 0x578080b6, 0x5b808081,
+ 0x5b808081, 0x5b808101, 0x5b810081, 0x5c004040,
+};
+
+static const deUint32 s_Int64IntRef[] =
+{
+ 0x7800b090, 0x2a387040, 0x87670d04, 0x40e637fc,
+ 0x2fb60e09, 0x2a70de24, 0x0e659f16, 0x729486ef,
+ 0x2a507ec6, 0x0d77a94d, 0x6bdeb7f0, 0x6dfc9ca8,
+ 0x971419f3, 0x7aab3295, 0x71d98468, 0x0a8f73f7,
+};
+
static const deUint8 s_halfFloatIn[] =
{
0x2b, 0x74, 0x6a, 0x5d,
@@ -1159,10 +1195,13 @@
{ s_signedInt8In, DE_LENGTH_OF_ARRAY(s_signedInt8In), s_signedInt8FloatRef, s_signedInt8IntRef, s_signedInt8UintRef },
{ s_signedInt16In, DE_LENGTH_OF_ARRAY(s_signedInt16In), s_signedInt16FloatRef, s_signedInt16IntRef, s_signedInt16UintRef },
{ s_signedInt32In, DE_LENGTH_OF_ARRAY(s_signedInt32In), s_signedInt32FloatRef, s_signedInt32IntRef, s_signedInt32UintRef },
+ { s_Int64In, DE_LENGTH_OF_ARRAY(s_Int64In), s_Int64FloatRef, s_Int64IntRef, s_Int64IntRef },
{ s_unsignedInt8In, DE_LENGTH_OF_ARRAY(s_unsignedInt8In), s_unsignedInt8FloatRef, s_unsignedInt8IntRef, s_unsignedInt8UintRef },
{ s_unsignedInt16In, DE_LENGTH_OF_ARRAY(s_unsignedInt16In), s_unsignedInt16FloatRef, s_unsignedInt16IntRef, s_unsignedInt16UintRef },
{ s_unsignedInt24In, DE_LENGTH_OF_ARRAY(s_unsignedInt24In), s_unsignedInt24FloatRef, s_unsignedInt24IntRef, s_unsignedInt24UintRef },
{ s_unsignedInt32In, DE_LENGTH_OF_ARRAY(s_unsignedInt32In), s_unsignedInt32FloatRef, s_unsignedInt32IntRef, s_unsignedInt32UintRef },
+ { s_Int64In, DE_LENGTH_OF_ARRAY(s_Int64In), s_Int64FloatRef, s_Int64IntRef, s_Int64IntRef },
+
{ s_halfFloatIn, DE_LENGTH_OF_ARRAY(s_halfFloatIn), s_halfFloatFloatRef, s_halfFloatIntRef, s_halfFloatUintRef },
{ s_floatIn, DE_LENGTH_OF_ARRAY(s_floatIn), s_floatFloatRef, s_floatIntRef, s_floatUintRef },
{ s_float64In, DE_LENGTH_OF_ARRAY(s_float64In), s_float64FloatRef, s_float64IntRef, s_float64IntRef },
@@ -1670,6 +1709,10 @@
for (int channelType = 0; channelType < TextureFormat::CHANNELTYPE_LAST; channelType++)
{
+ // \todo [2020-04-08] Missing tests for SIGNED_INT64 and UNSIGNED_INT64
+ if (TextureFormat::SIGNED_INT64 == channelType || channelType == TextureFormat::UNSIGNED_INT64)
+ continue;
+
for (int channelOrder = 0; channelOrder < TextureFormat::CHANNELORDER_LAST; channelOrder++)
{
const TextureFormat format ((TextureFormat::ChannelOrder)channelOrder, (TextureFormat::ChannelType)channelType);
diff --git a/scripts/mustpass.py b/scripts/mustpass.py
index 8fc69c7..3e6a0f9 100644
--- a/scripts/mustpass.py
+++ b/scripts/mustpass.py
@@ -292,9 +292,9 @@
for config in package.configurations:
configElem = ElementTree.SubElement(packageElem, "Configuration",
- name = config.name,
caseListFile = getCaseListFileName(package, config),
- commandLine = getCommandLine(config))
+ commandLine = getCommandLine(config),
+ name = config.name)
return mustpassElem
@@ -313,7 +313,7 @@
# add in metadata option for component name
ElementTree.SubElement(configElement, "option", name="test-suite-tag", value="cts")
- ElementTree.SubElement(configElement, "option", name="config-descriptor:metadata", key="component", value="deqp")
+ ElementTree.SubElement(configElement, "option", key="component", name="config-descriptor:metadata", value="deqp")
for package in mustpass.packages:
for config in package.configurations:
@@ -406,4 +406,4 @@
def parseBuildConfigFromCmdLineArgs ():
args = parseCmdLineArgs()
- return getBuildConfig(args.buildDir, args.targetName, args.buildType)
+ return getBuildConfig(args.buildDir, args.targetName, args.buildType)
\ No newline at end of file
diff --git a/scripts/opengl/src_util.py b/scripts/opengl/src_util.py
index 09d0b23..287f865 100644
--- a/scripts/opengl/src_util.py
+++ b/scripts/opengl/src_util.py
@@ -38,8 +38,8 @@
GL_SOURCE = khr_util.registry_cache.RegistrySource(
"https://raw.githubusercontent.com/KhronosGroup/OpenGL-Registry",
"xml/gl.xml",
- "b7aee529f02340247e45621e9dbd054817d39c71",
- "9a5e5d6b8b45df8d8f95c56f8fc0bc9ab99e675f43a9509aa2b222bcc9ed715a")
+ "9d534f9312e56c72df763207e449c6719576fd54",
+ "245e90331c83c4c743a2b9d0dad51e27a699f2040ebd34dd5338637adf276752")
EXTENSIONS = [
'GL_KHR_texture_compression_astc_ldr',
@@ -50,6 +50,7 @@
'GL_KHR_robustness',
'GL_KHR_no_error',
'GL_KHR_parallel_shader_compile',
+ 'GL_KHR_shader_subgroup',
'GL_EXT_bgra',
'GL_EXT_geometry_point_size',
'GL_EXT_tessellation_shader',
@@ -134,6 +135,7 @@
'GL_NV_deep_texture3D',
'GL_NV_gpu_multicast',
'GL_NV_internalformat_sample_query',
+ 'GL_NV_shader_subgroup_partitioned',
'GL_NVX_cross_process_interop',
'GL_OES_draw_elements_base_vertex',
'GL_OVR_multiview',
diff --git a/scripts/src_util/check_all.py b/scripts/src_util/check_all.py
index dfc6d1a..d2987fe 100644
--- a/scripts/src_util/check_all.py
+++ b/scripts/src_util/check_all.py
@@ -44,7 +44,7 @@
files = getAllProjectFiles()
# filter out original Vulkan header sources
- files = [f for f in files if "vulkancts/scripts/src" not in f]
+ files = [f for f in files if "vulkancts/scripts/src" not in f.replace("\\", "/")]
error = not all([
checkBOMs(files, args.fixBOMs),