From 81763b3af9243b02df18f2a0d91706e6ad030a31 Mon Sep 17 00:00:00 2001 From: Ehsan Nasiri Date: Fri, 26 May 2017 15:06:15 -0400 Subject: [PATCH] Add new VK_KHR_variable_pointers extension tests These tests do not write to SSBOs, and therefore do not require the vertexPipelineStoresAndAtomics and fragmentStoresAndAtomics device features. VK-GL-CTS issue: 123 Components: Vulkan Affects: dEQP-VK.spirv_assembly.instruction.*.variable_pointers.* Change-Id: I9a5f524a3a7ae7f0ddb295d983ba39bb0b4bcfa9 --- android/cts/master/vk-master.txt | 852 ++++++++++ .../vktSpvAsmVariablePointersTests.cpp | 1704 +++++++++++++++++++- external/vulkancts/mustpass/1.0.2/vk-default.txt | 852 ++++++++++ 3 files changed, 3399 insertions(+), 9 deletions(-) diff --git a/android/cts/master/vk-master.txt b/android/cts/master/vk-master.txt index 0791adf..e8634ea 100644 --- a/android/cts/master/vk-master.txt +++ b/android/cts/master/vk-master.txt @@ -138738,6 +138738,148 @@ dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.compute.stores_func dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.compute.reads_opptraccesschain_two_buffers dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.compute.writes_two_buffers dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.compute.workgroup_two_buffers +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_outer_struct_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_outer_struct_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_outer_struct_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_outer_struct_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_outer_struct_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_matrices_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_matrices_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_matrices_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_matrices_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_matrices_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_arrays_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_arrays_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_arrays_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_arrays_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_arrays_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_inner_structs_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_inner_structs_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_inner_structs_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_inner_structs_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_inner_structs_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_vec4arr_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_vec4arr_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_vec4arr_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_vec4arr_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_vec4arr_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_vec4_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_vec4_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_vec4_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_vec4_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_vec4_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_float_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_float_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_float_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_float_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_float_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_outer_struct_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_outer_struct_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_outer_struct_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_outer_struct_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_outer_struct_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_matrices_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_matrices_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_matrices_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_matrices_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_matrices_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_arrays_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_arrays_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_arrays_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_arrays_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_arrays_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_inner_structs_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_inner_structs_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_inner_structs_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_inner_structs_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_inner_structs_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_vec4arr_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_vec4arr_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_vec4arr_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_vec4arr_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_vec4arr_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_vec4_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_vec4_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_vec4_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_vec4_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_vec4_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_float_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_float_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_float_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_float_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_float_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_outer_struct_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_outer_struct_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_outer_struct_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_outer_struct_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_outer_struct_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_matrices_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_matrices_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_matrices_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_matrices_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_matrices_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_arrays_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_arrays_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_arrays_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_arrays_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_arrays_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_inner_structs_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_inner_structs_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_inner_structs_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_inner_structs_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_inner_structs_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_vec4arr_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_vec4arr_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_vec4arr_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_vec4arr_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_vec4arr_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_vec4_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_vec4_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_vec4_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_vec4_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_vec4_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_float_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_float_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_float_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_float_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_float_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_outer_struct_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_outer_struct_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_outer_struct_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_outer_struct_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_outer_struct_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_matrices_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_matrices_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_matrices_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_matrices_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_matrices_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_arrays_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_arrays_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_arrays_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_arrays_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_arrays_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_inner_structs_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_inner_structs_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_inner_structs_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_inner_structs_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_inner_structs_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_vec4arr_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_vec4arr_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_vec4arr_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_vec4arr_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_vec4arr_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_vec4_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_vec4_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_vec4_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_vec4_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_vec4_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_float_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_float_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_float_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_float_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_float_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.nullptr_compute.opvariable_initialized_null +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.nullptr_compute.opselect_null_or_valid_ptr dEQP-VK.spirv_assembly.instruction.graphics.opnop.opnop_vert dEQP-VK.spirv_assembly.instruction.graphics.opnop.opnop_tessc dEQP-VK.spirv_assembly.instruction.graphics.opnop.opnop_tesse @@ -140656,6 +140798,716 @@ dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.graphics.writes_tw dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.graphics.writes_two_buffers_tesse dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.graphics.writes_two_buffers_geom dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.graphics.writes_two_buffers_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_outer_struct_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_outer_struct_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_outer_struct_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_outer_struct_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_outer_struct_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_outer_struct_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_outer_struct_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_outer_struct_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_outer_struct_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_outer_struct_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_outer_struct_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_outer_struct_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_outer_struct_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_outer_struct_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_outer_struct_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_outer_struct_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_outer_struct_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_outer_struct_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_outer_struct_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_outer_struct_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_outer_struct_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_outer_struct_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_outer_struct_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_outer_struct_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_outer_struct_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_matrices_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_matrices_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_matrices_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_matrices_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_matrices_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_matrices_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_matrices_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_matrices_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_matrices_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_matrices_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_matrices_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_matrices_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_matrices_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_matrices_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_matrices_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_matrices_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_matrices_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_matrices_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_matrices_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_matrices_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_matrices_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_matrices_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_matrices_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_matrices_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_matrices_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_arrays_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_arrays_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_arrays_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_arrays_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_arrays_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_arrays_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_arrays_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_arrays_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_arrays_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_arrays_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_arrays_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_arrays_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_arrays_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_arrays_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_arrays_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_arrays_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_arrays_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_arrays_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_arrays_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_arrays_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_arrays_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_arrays_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_arrays_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_arrays_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_arrays_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_inner_structs_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_inner_structs_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_inner_structs_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_inner_structs_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_inner_structs_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_inner_structs_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_inner_structs_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_inner_structs_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_inner_structs_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_inner_structs_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_inner_structs_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_inner_structs_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_inner_structs_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_inner_structs_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_inner_structs_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_inner_structs_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_inner_structs_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_inner_structs_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_inner_structs_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_inner_structs_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_inner_structs_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_inner_structs_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_inner_structs_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_inner_structs_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_inner_structs_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4arr_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4arr_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4arr_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4arr_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4arr_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4arr_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4arr_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4arr_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4arr_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4arr_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4arr_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4arr_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4arr_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4arr_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4arr_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4arr_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4arr_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4arr_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4arr_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4arr_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4arr_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4arr_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4arr_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4arr_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4arr_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_float_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_float_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_float_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_float_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_float_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_float_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_float_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_float_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_float_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_float_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_float_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_float_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_float_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_float_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_float_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_float_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_float_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_float_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_float_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_float_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_float_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_float_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_float_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_float_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_float_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_outer_struct_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_outer_struct_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_outer_struct_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_outer_struct_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_outer_struct_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_outer_struct_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_outer_struct_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_outer_struct_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_outer_struct_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_outer_struct_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_outer_struct_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_outer_struct_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_outer_struct_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_outer_struct_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_outer_struct_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_outer_struct_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_outer_struct_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_outer_struct_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_outer_struct_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_outer_struct_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_outer_struct_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_outer_struct_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_outer_struct_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_outer_struct_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_outer_struct_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_matrices_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_matrices_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_matrices_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_matrices_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_matrices_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_matrices_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_matrices_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_matrices_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_matrices_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_matrices_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_matrices_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_matrices_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_matrices_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_matrices_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_matrices_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_matrices_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_matrices_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_matrices_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_matrices_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_matrices_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_matrices_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_matrices_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_matrices_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_matrices_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_matrices_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_arrays_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_arrays_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_arrays_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_arrays_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_arrays_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_arrays_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_arrays_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_arrays_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_arrays_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_arrays_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_arrays_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_arrays_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_arrays_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_arrays_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_arrays_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_arrays_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_arrays_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_arrays_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_arrays_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_arrays_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_arrays_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_arrays_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_arrays_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_arrays_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_arrays_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_inner_structs_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_inner_structs_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_inner_structs_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_inner_structs_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_inner_structs_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_inner_structs_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_inner_structs_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_inner_structs_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_inner_structs_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_inner_structs_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_inner_structs_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_inner_structs_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_inner_structs_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_inner_structs_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_inner_structs_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_inner_structs_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_inner_structs_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_inner_structs_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_inner_structs_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_inner_structs_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_inner_structs_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_inner_structs_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_inner_structs_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_inner_structs_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_inner_structs_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4arr_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4arr_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4arr_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4arr_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4arr_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4arr_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4arr_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4arr_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4arr_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4arr_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4arr_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4arr_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4arr_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4arr_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4arr_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4arr_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4arr_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4arr_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4arr_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4arr_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4arr_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4arr_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4arr_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4arr_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4arr_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_float_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_float_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_float_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_float_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_float_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_float_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_float_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_float_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_float_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_float_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_float_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_float_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_float_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_float_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_float_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_float_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_float_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_float_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_float_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_float_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_float_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_float_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_float_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_float_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_float_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_outer_struct_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_outer_struct_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_outer_struct_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_outer_struct_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_outer_struct_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_outer_struct_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_outer_struct_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_outer_struct_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_outer_struct_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_outer_struct_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_outer_struct_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_outer_struct_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_outer_struct_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_outer_struct_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_outer_struct_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_outer_struct_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_outer_struct_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_outer_struct_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_outer_struct_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_outer_struct_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_outer_struct_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_outer_struct_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_outer_struct_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_outer_struct_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_outer_struct_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_matrices_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_matrices_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_matrices_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_matrices_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_matrices_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_matrices_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_matrices_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_matrices_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_matrices_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_matrices_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_matrices_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_matrices_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_matrices_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_matrices_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_matrices_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_matrices_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_matrices_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_matrices_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_matrices_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_matrices_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_matrices_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_matrices_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_matrices_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_matrices_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_matrices_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_arrays_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_arrays_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_arrays_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_arrays_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_arrays_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_arrays_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_arrays_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_arrays_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_arrays_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_arrays_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_arrays_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_arrays_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_arrays_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_arrays_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_arrays_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_arrays_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_arrays_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_arrays_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_arrays_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_arrays_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_arrays_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_arrays_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_arrays_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_arrays_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_arrays_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_inner_structs_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_inner_structs_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_inner_structs_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_inner_structs_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_inner_structs_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_inner_structs_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_inner_structs_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_inner_structs_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_inner_structs_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_inner_structs_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_inner_structs_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_inner_structs_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_inner_structs_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_inner_structs_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_inner_structs_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_inner_structs_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_inner_structs_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_inner_structs_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_inner_structs_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_inner_structs_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_inner_structs_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_inner_structs_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_inner_structs_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_inner_structs_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_inner_structs_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4arr_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4arr_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4arr_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4arr_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4arr_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4arr_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4arr_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4arr_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4arr_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4arr_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4arr_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4arr_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4arr_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4arr_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4arr_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4arr_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4arr_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4arr_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4arr_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4arr_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4arr_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4arr_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4arr_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4arr_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4arr_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_float_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_float_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_float_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_float_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_float_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_float_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_float_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_float_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_float_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_float_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_float_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_float_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_float_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_float_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_float_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_float_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_float_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_float_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_float_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_float_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_float_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_float_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_float_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_float_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_float_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_outer_struct_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_outer_struct_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_outer_struct_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_outer_struct_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_outer_struct_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_outer_struct_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_outer_struct_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_outer_struct_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_outer_struct_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_outer_struct_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_outer_struct_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_outer_struct_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_outer_struct_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_outer_struct_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_outer_struct_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_outer_struct_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_outer_struct_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_outer_struct_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_outer_struct_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_outer_struct_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_outer_struct_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_outer_struct_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_outer_struct_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_outer_struct_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_outer_struct_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_matrices_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_matrices_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_matrices_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_matrices_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_matrices_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_matrices_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_matrices_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_matrices_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_matrices_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_matrices_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_matrices_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_matrices_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_matrices_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_matrices_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_matrices_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_matrices_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_matrices_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_matrices_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_matrices_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_matrices_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_matrices_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_matrices_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_matrices_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_matrices_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_matrices_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_arrays_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_arrays_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_arrays_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_arrays_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_arrays_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_arrays_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_arrays_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_arrays_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_arrays_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_arrays_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_arrays_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_arrays_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_arrays_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_arrays_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_arrays_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_arrays_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_arrays_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_arrays_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_arrays_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_arrays_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_arrays_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_arrays_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_arrays_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_arrays_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_arrays_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_inner_structs_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_inner_structs_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_inner_structs_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_inner_structs_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_inner_structs_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_inner_structs_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_inner_structs_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_inner_structs_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_inner_structs_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_inner_structs_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_inner_structs_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_inner_structs_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_inner_structs_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_inner_structs_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_inner_structs_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_inner_structs_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_inner_structs_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_inner_structs_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_inner_structs_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_inner_structs_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_inner_structs_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_inner_structs_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_inner_structs_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_inner_structs_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_inner_structs_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4arr_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4arr_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4arr_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4arr_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4arr_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4arr_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4arr_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4arr_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4arr_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4arr_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4arr_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4arr_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4arr_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4arr_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4arr_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4arr_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4arr_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4arr_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4arr_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4arr_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4arr_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4arr_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4arr_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4arr_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4arr_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_float_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_float_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_float_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_float_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_float_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_float_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_float_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_float_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_float_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_float_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_float_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_float_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_float_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_float_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_float_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_float_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_float_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_float_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_float_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_float_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_float_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_float_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_float_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_float_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_float_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.nullptr_graphics.opvariable_initialized_null_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.nullptr_graphics.opvariable_initialized_null_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.nullptr_graphics.opvariable_initialized_null_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.nullptr_graphics.opvariable_initialized_null_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.nullptr_graphics.opvariable_initialized_null_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.nullptr_graphics.opselect_null_or_valid_ptr_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.nullptr_graphics.opselect_null_or_valid_ptr_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.nullptr_graphics.opselect_null_or_valid_ptr_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.nullptr_graphics.opselect_null_or_valid_ptr_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.nullptr_graphics.opselect_null_or_valid_ptr_frag dEQP-VK.glsl.arrays.constructor.float3_vertex dEQP-VK.glsl.arrays.constructor.float3_fragment dEQP-VK.glsl.arrays.constructor.float4_vertex diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmVariablePointersTests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmVariablePointersTests.cpp index cc6bf0b..4a430fc 100644 --- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmVariablePointersTests.cpp +++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmVariablePointersTests.cpp @@ -86,7 +86,100 @@ void fillRandomScalars (de::Random& rnd, T minValue, T maxValue, void* dst, int typedPtr[offset + ndx] = randomScalar(rnd, minValue, maxValue); } -void addComputeVariablePointersGroup (tcu::TestCaseGroup* group) +// The following structure (outer_struct) is passed as a vector of 64 32-bit floats into some shaders. +// +// struct struct inner_struct { +// vec4 x[2]; +// vec4 y[2]; +// }; +// +// struct outer_struct { +// inner_struct r[2][2]; +// }; +// +// This method finds the correct offset from the base of a vector given the indexes into the structure. +// Returns the index in the inclusive range of 0 and 63. Each unit of the offset represents offset by the size of a 32-bit float. +deUint32 getBaseOffset( deUint32 indexOuterStruct, + deUint32 indexMatrixRow, + deUint32 indexMatrixCol, + deUint32 indexInnerStruct, + deUint32 indexVec4Array, + deUint32 indexVec4) +{ + // index into the outer structure must be zero since the outer structure has only 1 member. + if(indexOuterStruct != 0) + DE_ASSERT(indexOuterStruct == 0); + + DE_ASSERT(indexMatrixRow < 2); + DE_ASSERT(indexMatrixCol < 2); + DE_ASSERT(indexInnerStruct < 2); + DE_ASSERT(indexVec4Array < 2); + DE_ASSERT(indexVec4 < 4); + + deUint32 offset = 0; + + // We have a matrix of 2 rows and 2 columns (total of 4 inner_structs). Each inner_struct contains 16 floats. + // So, offset by 1 row means offset by 32 floats, and offset by 1 column means offset by 16 floats. + offset += indexMatrixRow * 32; + offset += indexMatrixCol * 16; + + // The inner structure contains 2 members, each having 8 floats. + // So offset by 1 in the inner struct means offset by 8 floats. + offset += indexInnerStruct * 8; + + // Each member (x|y) have 2 vectors of 4 floats. So, offset by 1 int the vec4 array means an offset by 4 floats. + offset += indexVec4Array * 4; + + // Each vec4 contains 4 floats, so each offset in the vec4 means offset by 1 float. + offset += indexVec4; + + return offset; +} + +// The following structure (input_buffer) is passed as a vector of 128 32-bit floats into some shaders. +// +// struct struct inner_struct { +// vec4 x[2]; +// vec4 y[2]; +// }; +// +// struct outer_struct { +// inner_struct r[2][2]; +// }; +// +// struct input_buffer { +// outer_struct a; +// outer_struct b; +// } +// +// This method finds the correct offset from the base of a vector given the indexes into the structure. +// Returns the index in the inclusive range of 0 and 127. +deUint32 getBaseOffsetForSingleInputBuffer( deUint32 indexOuterStruct, + deUint32 indexMatrixRow, + deUint32 indexMatrixCol, + deUint32 indexInnerStruct, + deUint32 indexVec4Array, + deUint32 indexVec4) +{ + DE_ASSERT(indexOuterStruct < 2); + DE_ASSERT(indexMatrixRow < 2); + DE_ASSERT(indexMatrixCol < 2); + DE_ASSERT(indexInnerStruct < 2); + DE_ASSERT(indexVec4Array < 2); + DE_ASSERT(indexVec4 < 4); + + // Get the offset assuming you have only one outer_struct. (use index 0 for outer_struct) + deUint32 offset = getBaseOffset(0, indexMatrixRow, indexMatrixCol, indexInnerStruct, indexVec4Array, indexVec4); + + // If the second outer structure (b) is chosen in the input_buffer, we need to add an offset of 64 since + // each outer_struct contains 64 floats. + if (indexOuterStruct == 1) + offset += 64; + + return offset; +} + +void addVariablePointersComputeGroup (tcu::TestCaseGroup* group) { tcu::TestContext& testCtx = group->getTestContext(); de::Random rnd (deStringHash(group->getName())); @@ -119,7 +212,7 @@ void addComputeVariablePointersGroup (tcu::TestCaseGroup* group) { AmuxAOutputFloats[i] = (inputSFloats[i] < 0) ? inputAFloats[2*i] : inputAFloats[2*i+1]; AmuxBOutputFloats[i] = (inputSFloats[i] < 0) ? inputAFloats[i] : inputBFloats[i]; - incrAmuxAOutputFloats[i] = (inputSFloats[i] < 0) ? 1 + inputAFloats[2*i] : 1+ inputAFloats[2*i+1]; + incrAmuxAOutputFloats[i] = (inputSFloats[i] < 0) ? 1 + inputAFloats[2*i] : 1 + inputAFloats[2*i+1]; incrAmuxBOutputFloats[i] = (inputSFloats[i] < 0) ? 1 + inputAFloats[i] : 1 + inputBFloats[i]; } @@ -479,7 +572,647 @@ void addComputeVariablePointersGroup (tcu::TestCaseGroup* group) } } -void addGraphicsVariablePointersGroup (tcu::TestCaseGroup* testGroup) +void addComplexTypesVariablePointersComputeGroup (tcu::TestCaseGroup* group) +{ + tcu::TestContext& testCtx = group->getTestContext(); + const int numFloats = 64; + vector inputA (numFloats, 0); + vector inputB (numFloats, 0); + vector inputC (2*numFloats, 0); + vector expectedOutput (1, 0); + VulkanFeatures requiredFeatures; + + // These tests exercise variable pointers into various levels of the following data-structures. + // + // struct struct inner_struct { + // vec4 x[2]; // array of 2 vectors. Each vector is 4 floats. + // vec4 y[2]; // array of 2 vectors. Each vector is 4 floats. + // }; + // + // struct outer_struct { + // inner_struct r[2][2]; + // }; + // + // struct input_buffer { + // outer_struct a; + // outer_struct b; + // } + // + // inputA is of type outer_struct. + // inputB is of type outer_struct. + // inputC is of type input_buffer. + // + // inputA and inputB are of the same size. When testing variable pointers pointing to + // two different input buffers, we use inputA and inputB. + // + // inputC is twice the size of inputA. When testing the VariablePointersStorageBuffer capability, + // the variable pointer must be confined to a single buffer. These tests will use inputC. + // + // The inner_struct contains 16 floats. + // The outer_struct contains 64 floats. + // The input_buffer contains 128 floats. + // Populate the first input (inputA) to contain: {0, 4, ... , 252} + // Populate the second input (inputB) to contain: {3, 7, ... , 255} + // Populate the third input (inputC) to contain: {0, 4, ... , 252, 3, 7, ... , 255} + // Note that the first half of inputC is the same as inputA and the second half is the same as inputB. + for (size_t i = 0; i < numFloats; ++i) + { + inputA[i] = 4*float(i) / 255; + inputB[i] = ((4*float(i)) + 3) / 255; + inputC[i] = inputA[i]; + inputC[i + numFloats] = inputB[i]; + } + + // In the following tests we use variable pointers to point to different types: + // nested structures, matrices of structures, arrays of structures, arrays of vectors, vectors of scalars, and scalars. + // outer_structure.inner_structure[?][?].x[?][?]; + // ^ ^ ^ ^ ^ ^ ^ + // + // For tests with 2 input buffers: + // 1. inputA or inputB = nested structure + // 2. inputA.r or inputB.r = matrices of structures + // 3. inputA.r[?] or inputB.r[?] = arrays of structures + // 4. inputA.r[?][?] or inputB.r[?][?] = structures + // 5. inputA.r[?][?].(x|y) or inputB.r[?][?].(x|y) = arrays of vectors + // 6. inputA.r[?][?].(x|y)[?] or inputB.r[?][?].(x|y)[?] = vectors of scalars + // 7. inputA.r[?][?].(x|y)[?][?] or inputB.r[?][?].(x|y)[?][?] = scalars + // For tests with 1 input buffer: + // 1. inputC.a or inputC.b = nested structure + // 2. inputC.a.r or inputC.b.r = matrices of structures + // 3. inputC.a.r[?] or inputC.b.r[?] = arrays of structures + // 4. inputC.a.r[?][?] or inputC.b.r[?][?] = structures + // 5. inputC.a.r[?][?].(x|y) or inputC.b.r[?][?].(x|y) = arrays of vectors + // 6. inputC.a.r[?][?].(x|y)[?] or inputC.b.r[?][?].(x|y)[?] = vectors of scalars + // 7. inputC.a.r[?][?].(x|y)[?][?] or inputC.b.r[?][?].(x|y)[?][?] = scalars + const int numLevels = 7; + + const string decorations ( + // Decorations + "OpDecorate %id BuiltIn GlobalInvocationId \n" + "OpDecorate %inputA DescriptorSet 0 \n" + "OpDecorate %inputB DescriptorSet 0 \n" + "OpDecorate %inputC DescriptorSet 0 \n" + "OpDecorate %outdata DescriptorSet 0 \n" + "OpDecorate %inputA Binding 0 \n" + "OpDecorate %inputB Binding 1 \n" + "OpDecorate %inputC Binding 2 \n" + "OpDecorate %outdata Binding 3 \n" + + // Set the Block decoration + "OpDecorate %outer_struct Block \n" + "OpDecorate %input_buffer Block \n" + "OpDecorate %output_buffer Block \n" + + // Set the Offsets + "OpMemberDecorate %output_buffer 0 Offset 0 \n" + "OpMemberDecorate %input_buffer 0 Offset 0 \n" + "OpMemberDecorate %input_buffer 1 Offset 256 \n" + "OpMemberDecorate %outer_struct 0 Offset 0 \n" + "OpMemberDecorate %inner_struct 0 Offset 0 \n" + "OpMemberDecorate %inner_struct 1 Offset 32 \n" + + // Set the ArrayStrides + "OpDecorate %arr2_v4float ArrayStride 16 \n" + "OpDecorate %arr2_inner_struct ArrayStride 64 \n" + "OpDecorate %mat2x2_inner_struct ArrayStride 128 \n" + ); + + const string types ( + /////////////// + // CONSTANTS // + /////////////// + "%c_bool_true = OpConstantTrue %bool \n" + "%c_bool_false = OpConstantFalse %bool \n" + "%c_i32_0 = OpConstant %i32 0 \n" + "%c_i32_1 = OpConstant %i32 1 \n" + "%c_i32_2 = OpConstant %i32 2 \n" + "%c_i32_3 = OpConstant %i32 3 \n" + "%c_u32_2 = OpConstant %u32 2 \n" + + /////////// + // TYPES // + /////////// + "%v4f32 = OpTypeVector %f32 4 \n" + + // struct struct inner_struct { + // vec4 x[2]; // array of 2 vectors + // vec4 y[2]; // array of 2 vectors + // }; + "%arr2_v4float = OpTypeArray %v4f32 %c_u32_2 \n" + "%inner_struct = OpTypeStruct %arr2_v4float %arr2_v4float \n" + + // struct outer_struct { + // inner_struct r[2][2]; + // }; + "%arr2_inner_struct = OpTypeArray %inner_struct %c_u32_2 \n" + "%mat2x2_inner_struct = OpTypeArray %arr2_inner_struct %c_u32_2 \n" + "%outer_struct = OpTypeStruct %mat2x2_inner_struct \n" + + // struct input_buffer { + // outer_struct a; + // outer_struct b; + // } + "%input_buffer = OpTypeStruct %outer_struct %outer_struct \n" + + // struct output_struct { + // float out; + // } + "%output_buffer = OpTypeStruct %f32 \n" + + /////////////////// + // POINTER TYPES // + /////////////////// + "%output_buffer_ptr = OpTypePointer StorageBuffer %output_buffer \n" + "%input_buffer_ptr = OpTypePointer StorageBuffer %input_buffer \n" + "%outer_struct_ptr = OpTypePointer StorageBuffer %outer_struct \n" + "%mat2x2_ptr = OpTypePointer StorageBuffer %mat2x2_inner_struct \n" + "%arr2_ptr = OpTypePointer StorageBuffer %arr2_inner_struct \n" + "%inner_struct_ptr = OpTypePointer StorageBuffer %inner_struct \n" + "%arr_v4f32_ptr = OpTypePointer StorageBuffer %arr2_v4float \n" + "%v4f32_ptr = OpTypePointer StorageBuffer %v4f32 \n" + "%sb_f32ptr = OpTypePointer StorageBuffer %f32 \n" + + /////////////// + // VARIABLES // + /////////////// + "%id = OpVariable %uvec3ptr Input \n" + "%inputA = OpVariable %outer_struct_ptr StorageBuffer \n" + "%inputB = OpVariable %outer_struct_ptr StorageBuffer \n" + "%inputC = OpVariable %input_buffer_ptr StorageBuffer \n" + "%outdata = OpVariable %output_buffer_ptr StorageBuffer \n" + ); + + const StringTemplate shaderTemplate ( + "OpCapability Shader\n" + + "${extra_capability}\n" + + "OpExtension \"SPV_KHR_variable_pointers\"\n" + "OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n" + "OpMemoryModel Logical GLSL450\n" + "OpEntryPoint GLCompute %main \"main\" %id\n" + "OpExecutionMode %main LocalSize 1 1 1\n" + + "OpSource GLSL 430\n" + "OpName %main \"main\"\n" + "OpName %id \"gl_GlobalInvocationID\"\n" + + + decorations + + + string(getComputeAsmCommonTypes()) + + + types + + + // These selector functions return variable pointers. + // These functions are used by tests that use OpFunctionCall to obtain the variable pointer + "%selector_func_type = OpTypeFunction ${selected_type} %bool ${selected_type} ${selected_type}\n" + "%choose_input_func = OpFunction ${selected_type} None %selector_func_type\n" + "%choose_first_param = OpFunctionParameter %bool\n" + "%first_param = OpFunctionParameter ${selected_type}\n" + "%second_param = OpFunctionParameter ${selected_type}\n" + "%selector_func_begin = OpLabel\n" + "%result_ptr = OpSelect ${selected_type} %choose_first_param %first_param %second_param\n" + "OpReturnValue %result_ptr\n" + "OpFunctionEnd\n" + + // main function is the entry_point + "%main = OpFunction %void None %voidf\n" + "%label = OpLabel\n" + + // Here are the 2 nested structures within InputC. + "%inputC_a = OpAccessChain %outer_struct_ptr %inputC %c_i32_0\n" + "%inputC_b = OpAccessChain %outer_struct_ptr %inputC %c_i32_1\n" + + // Define the 2 pointers from which we're going to choose one. + "${a_loc} \n" + "${b_loc} \n" + + // Choose between the 2 pointers / variable pointers. + "${selection_strategy} \n" + + // OpAccessChain into the variable pointer until you get to the float. + "%result_loc = OpAccessChain %sb_f32ptr %var_ptr ${remaining_indexes} \n" + + // Now load from the result_loc + "%result_val = OpLoad %f32 %result_loc \n" + + // Store the chosen value to the output buffer. + "%outdata_loc = OpAccessChain %sb_f32ptr %outdata %c_i32_0\n" + " OpStore %outdata_loc %result_val\n" + " OpReturn\n" + " OpFunctionEnd\n"); + + for (int isSingleInputBuffer = 0 ; isSingleInputBuffer < 2; ++isSingleInputBuffer) + { + // Set the proper extension features required for the test + if (isSingleInputBuffer) + requiredFeatures.extVariablePointers = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS_STORAGEBUFFER; + else + requiredFeatures.extVariablePointers = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS; + + for (int selectInputA = 0; selectInputA < 2; ++selectInputA) + { + const string extraCap = isSingleInputBuffer ? "OpCapability VariablePointersStorageBuffer\n" : "OpCapability VariablePointers\n"; + const vector& selectedInput = isSingleInputBuffer ? inputC : (selectInputA ? inputA : inputB); + const string bufferType = isSingleInputBuffer ? "single_buffer_" : "two_buffers_"; + const string baseA = isSingleInputBuffer ? "%inputC_a" : "%inputA"; + const string baseB = isSingleInputBuffer ? "%inputC_b" : "%inputB"; + const string selectedInputStr = selectInputA ? "first_input" : "second_input"; + const string spirvSelectInputA = selectInputA ? "%c_bool_true" : "%c_bool_false"; + const int outerStructIndex = isSingleInputBuffer ? (selectInputA ? 0 : 1) : 0; + + // The indexes chosen at each level. At any level, any given offset is exercised. + // outerStructIndex is 0 for inputA and inputB (because outer_struct has only 1 member). + // outerStructIndex is 0 for member of inputC and 1 for member . + const int indexesForLevel[numLevels][6]= {{outerStructIndex, 0, 0, 0, 0, 1}, + {outerStructIndex, 1, 0, 1, 0, 2}, + {outerStructIndex, 0, 1, 0, 1, 3}, + {outerStructIndex, 1, 1, 1, 0, 0}, + {outerStructIndex, 0, 0, 1, 1, 1}, + {outerStructIndex, 1, 0, 0, 0, 2}, + {outerStructIndex, 1, 1, 1, 1, 3}}; + + const string indexLevelNames[] = {"_outer_struct_", "_matrices_", "_arrays_", "_inner_structs_", "_vec4arr_", "_vec4_", "_float_"}; + const string inputALocations[] = { "", + "%a_loc = OpAccessChain %mat2x2_ptr " + baseA + " %c_i32_0", + "%a_loc = OpAccessChain %arr2_ptr " + baseA + " %c_i32_0 %c_i32_0", + "%a_loc = OpAccessChain %inner_struct_ptr " + baseA + " %c_i32_0 %c_i32_1 %c_i32_1", + "%a_loc = OpAccessChain %arr_v4f32_ptr " + baseA + " %c_i32_0 %c_i32_0 %c_i32_0 %c_i32_1", + "%a_loc = OpAccessChain %v4f32_ptr " + baseA + " %c_i32_0 %c_i32_1 %c_i32_0 %c_i32_0 %c_i32_0", + "%a_loc = OpAccessChain %sb_f32ptr " + baseA + " %c_i32_0 %c_i32_1 %c_i32_1 %c_i32_1 %c_i32_1 %c_i32_3"}; + + const string inputBLocations[] = { "", + "%b_loc = OpAccessChain %mat2x2_ptr " + baseB + " %c_i32_0", + "%b_loc = OpAccessChain %arr2_ptr " + baseB + " %c_i32_0 %c_i32_0", + "%b_loc = OpAccessChain %inner_struct_ptr " + baseB + " %c_i32_0 %c_i32_1 %c_i32_1", + "%b_loc = OpAccessChain %arr_v4f32_ptr " + baseB + " %c_i32_0 %c_i32_0 %c_i32_0 %c_i32_1", + "%b_loc = OpAccessChain %v4f32_ptr " + baseB + " %c_i32_0 %c_i32_1 %c_i32_0 %c_i32_0 %c_i32_0", + "%b_loc = OpAccessChain %sb_f32ptr " + baseB + " %c_i32_0 %c_i32_1 %c_i32_1 %c_i32_1 %c_i32_1 %c_i32_3"}; + + const string inputAPtrAccessChain[] = { "", + "%a_loc = OpPtrAccessChain %mat2x2_ptr " + baseA + " %c_i32_0 %c_i32_0", + "%a_loc = OpPtrAccessChain %arr2_ptr " + baseA + " %c_i32_0 %c_i32_0 %c_i32_0", + "%a_loc = OpPtrAccessChain %inner_struct_ptr " + baseA + " %c_i32_0 %c_i32_0 %c_i32_1 %c_i32_1", + "%a_loc = OpPtrAccessChain %arr_v4f32_ptr " + baseA + " %c_i32_0 %c_i32_0 %c_i32_0 %c_i32_0 %c_i32_1", + "%a_loc = OpPtrAccessChain %v4f32_ptr " + baseA + " %c_i32_0 %c_i32_0 %c_i32_1 %c_i32_0 %c_i32_0 %c_i32_0", + // Next case emulates: + // %a_loc = OpPtrAccessChain %sb_f32ptr baseA %c_i32_0 %c_i32_0 %c_i32_1 %c_i32_1 %c_i32_1 %c_i32_1 %c_i32_3 + // But rewrite it to exercise OpPtrAccessChain with a non-zero first index: + // %a_loc_arr is a pointer to an array that we want to index with 1. + // But instead of just using OpAccessChain with first index 1, use OpAccessChain with index 0 to + // get a pointer to the first element, then send that into OpPtrAccessChain with index 1. + "%a_loc_arr = OpPtrAccessChain %arr_v4f32_ptr " + baseA + " %c_i32_0 %c_i32_0 %c_i32_1 %c_i32_1 %c_i32_1 " + "%a_loc_first_elem = OpAccessChain %v4f32_ptr %a_loc_arr %c_i32_0 " + "%a_loc = OpPtrAccessChain %sb_f32ptr %a_loc_first_elem %c_i32_1 %c_i32_3"}; + + const string inputBPtrAccessChain[] = { "", + "%b_loc = OpPtrAccessChain %mat2x2_ptr " + baseB + " %c_i32_0 %c_i32_0", + "%b_loc = OpPtrAccessChain %arr2_ptr " + baseB + " %c_i32_0 %c_i32_0 %c_i32_0", + "%b_loc = OpPtrAccessChain %inner_struct_ptr " + baseB + " %c_i32_0 %c_i32_0 %c_i32_1 %c_i32_1", + "%b_loc = OpPtrAccessChain %arr_v4f32_ptr " + baseB + " %c_i32_0 %c_i32_0 %c_i32_0 %c_i32_0 %c_i32_1", + "%b_loc = OpPtrAccessChain %v4f32_ptr " + baseB + " %c_i32_0 %c_i32_0 %c_i32_1 %c_i32_0 %c_i32_0 %c_i32_0", + // Next case emulates: + // %b_loc = OpPtrAccessChain %sb_f32ptr basseB %c_i32_0 %c_i32_0 %c_i32_1 %c_i32_1 %c_i32_1 %c_i32_1 %c_i32_3 + // But rewrite it to exercise OpPtrAccessChain with a non-zero first index: + // %b_loc_arr is a pointer to an array that we want to index with 1. + // But instead of just using OpAccessChain with first index 1, use OpAccessChain with index 0 to + // get a pointer to the first element, then send that into OpPtrAccessChain with index 1. + "%b_loc_arr = OpPtrAccessChain %arr_v4f32_ptr " + baseB + " %c_i32_0 %c_i32_0 %c_i32_1 %c_i32_1 %c_i32_1 " + "%b_loc_first_elem = OpAccessChain %v4f32_ptr %b_loc_arr %c_i32_0 " + "%b_loc = OpPtrAccessChain %sb_f32ptr %b_loc_first_elem %c_i32_1 %c_i32_3"}; + + + const string remainingIndexesAtLevel[]= {"%c_i32_0 %c_i32_0 %c_i32_0 %c_i32_0 %c_i32_0 %c_i32_1", + "%c_i32_1 %c_i32_0 %c_i32_1 %c_i32_0 %c_i32_2", + "%c_i32_1 %c_i32_0 %c_i32_1 %c_i32_3", + "%c_i32_1 %c_i32_0 %c_i32_0", + "%c_i32_1 %c_i32_1", + "%c_i32_2", + ""}; + + const string pointerTypeAtLevel[] = {"%outer_struct_ptr", "%mat2x2_ptr", "%arr2_ptr", "%inner_struct_ptr", "%arr_v4f32_ptr", "%v4f32_ptr", "%sb_f32ptr"}; + const string baseANameAtLevel[] = {baseA, "%a_loc", "%a_loc", "%a_loc", "%a_loc", "%a_loc", "%a_loc"}; + const string baseBNameAtLevel[] = {baseB, "%b_loc", "%b_loc", "%b_loc", "%b_loc", "%b_loc", "%b_loc"}; + + for (int indexLevel = 0; indexLevel < numLevels; ++indexLevel) + { + const int baseOffset = getBaseOffsetForSingleInputBuffer(indexesForLevel[indexLevel][0], + indexesForLevel[indexLevel][1], + indexesForLevel[indexLevel][2], + indexesForLevel[indexLevel][3], + indexesForLevel[indexLevel][4], + indexesForLevel[indexLevel][5]); + // Use OpSelect to choose between 2 pointers + { + ComputeShaderSpec spec; + map specs; + string opCodeForTests = "opselect"; + string name = opCodeForTests + indexLevelNames[indexLevel] + bufferType + selectedInputStr; + specs["extra_capability"] = extraCap; + 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"] = "%var_ptr = OpSelect " + + pointerTypeAtLevel[indexLevel] + " " + + spirvSelectInputA + " " + + baseANameAtLevel[indexLevel] + " " + + baseBNameAtLevel[indexLevel] + "\n"; + expectedOutput[0] = selectedInput[baseOffset]; + spec.inputTypes[0] = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + spec.inputTypes[1] = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + spec.inputTypes[2] = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + spec.assembly = shaderTemplate.specialize(specs); + spec.numWorkGroups = IVec3(1, 1, 1); + spec.requestedVulkanFeatures = requiredFeatures; + spec.inputs.push_back(BufferSp(new Float32Buffer(inputA))); + spec.inputs.push_back(BufferSp(new Float32Buffer(inputB))); + spec.inputs.push_back(BufferSp(new Float32Buffer(inputC))); + spec.outputs.push_back(BufferSp(new Float32Buffer(expectedOutput))); + spec.extensions.push_back("VK_KHR_variable_pointers"); + group->addChild(new SpvAsmComputeShaderCase(testCtx, name.c_str(), name.c_str(), spec)); + } + + // Use OpFunctionCall to choose between 2 pointers + { + ComputeShaderSpec spec; + map specs; + string opCodeForTests = "opfunctioncall"; + string name = opCodeForTests + indexLevelNames[indexLevel] + bufferType + selectedInputStr; + specs["extra_capability"] = extraCap; + 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"] = "%var_ptr = OpFunctionCall " + + pointerTypeAtLevel[indexLevel] + + " %choose_input_func " + + spirvSelectInputA + " " + + baseANameAtLevel[indexLevel] + " " + + baseBNameAtLevel[indexLevel] + "\n"; + expectedOutput[0] = selectedInput[baseOffset]; + spec.inputTypes[0] = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + spec.inputTypes[1] = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + spec.inputTypes[2] = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + spec.assembly = shaderTemplate.specialize(specs); + spec.numWorkGroups = IVec3(1, 1, 1); + spec.requestedVulkanFeatures = requiredFeatures; + spec.inputs.push_back(BufferSp(new Float32Buffer(inputA))); + spec.inputs.push_back(BufferSp(new Float32Buffer(inputB))); + spec.inputs.push_back(BufferSp(new Float32Buffer(inputC))); + spec.outputs.push_back(BufferSp(new Float32Buffer(expectedOutput))); + spec.extensions.push_back("VK_KHR_variable_pointers"); + group->addChild(new SpvAsmComputeShaderCase(testCtx, name.c_str(), name.c_str(), spec)); + } + + // Use OpPhi to choose between 2 pointers + { + + ComputeShaderSpec spec; + map specs; + string opCodeForTests = "opphi"; + string name = opCodeForTests + indexLevelNames[indexLevel] + bufferType + selectedInputStr; + specs["extra_capability"] = extraCap; + 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"] = + " OpSelectionMerge %end_label None\n" + " OpBranchConditional " + spirvSelectInputA + " %take_input_a %take_input_b\n" + "%take_input_a = OpLabel\n" + " OpBranch %end_label\n" + "%take_input_b = OpLabel\n" + " OpBranch %end_label\n" + "%end_label = OpLabel\n" + "%var_ptr = OpPhi " + + pointerTypeAtLevel[indexLevel] + " " + + baseANameAtLevel[indexLevel] + + " %take_input_a " + + baseBNameAtLevel[indexLevel] + + " %take_input_b\n"; + expectedOutput[0] = selectedInput[baseOffset]; + spec.inputTypes[0] = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + spec.inputTypes[1] = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + spec.inputTypes[2] = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + spec.assembly = shaderTemplate.specialize(specs); + spec.numWorkGroups = IVec3(1, 1, 1); + spec.requestedVulkanFeatures = requiredFeatures; + spec.inputs.push_back(BufferSp(new Float32Buffer(inputA))); + spec.inputs.push_back(BufferSp(new Float32Buffer(inputB))); + spec.inputs.push_back(BufferSp(new Float32Buffer(inputC))); + spec.outputs.push_back(BufferSp(new Float32Buffer(expectedOutput))); + spec.extensions.push_back("VK_KHR_variable_pointers"); + group->addChild(new SpvAsmComputeShaderCase(testCtx, name.c_str(), name.c_str(), spec)); + } + + // Use OpCopyObject to get variable pointers + { + ComputeShaderSpec spec; + map specs; + string opCodeForTests = "opcopyobject"; + string name = opCodeForTests + indexLevelNames[indexLevel] + bufferType + selectedInputStr; + specs["extra_capability"] = extraCap; + 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"] = + "%in_a_copy = OpCopyObject " + pointerTypeAtLevel[indexLevel] + " " + baseANameAtLevel[indexLevel] + "\n" + "%in_b_copy = OpCopyObject " + pointerTypeAtLevel[indexLevel] + " " + baseBNameAtLevel[indexLevel] + "\n" + "%var_ptr = OpSelect " + pointerTypeAtLevel[indexLevel] + " " + spirvSelectInputA + " %in_a_copy %in_b_copy\n"; + expectedOutput[0] = selectedInput[baseOffset]; + spec.inputTypes[0] = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + spec.inputTypes[1] = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + spec.inputTypes[2] = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + spec.assembly = shaderTemplate.specialize(specs); + spec.numWorkGroups = IVec3(1, 1, 1); + spec.requestedVulkanFeatures = requiredFeatures; + spec.inputs.push_back(BufferSp(new Float32Buffer(inputA))); + spec.inputs.push_back(BufferSp(new Float32Buffer(inputB))); + spec.inputs.push_back(BufferSp(new Float32Buffer(inputC))); + spec.outputs.push_back(BufferSp(new Float32Buffer(expectedOutput))); + spec.extensions.push_back("VK_KHR_variable_pointers"); + group->addChild(new SpvAsmComputeShaderCase(testCtx, name.c_str(), name.c_str(), spec)); + } + + // Use OpPtrAccessChain to get variable pointers + { + ComputeShaderSpec spec; + map specs; + string opCodeForTests = "opptraccesschain"; + string name = opCodeForTests + indexLevelNames[indexLevel] + bufferType + selectedInputStr; + specs["extra_capability"] = extraCap; + specs["selected_type"] = pointerTypeAtLevel[indexLevel]; + specs["select_inputA"] = spirvSelectInputA; + specs["a_loc"] = inputAPtrAccessChain[indexLevel]; + specs["b_loc"] = inputBPtrAccessChain[indexLevel]; + specs["remaining_indexes"] = remainingIndexesAtLevel[indexLevel]; + specs["selection_strategy"] = "%var_ptr = OpSelect " + + pointerTypeAtLevel[indexLevel] + " " + + spirvSelectInputA + " " + + baseANameAtLevel[indexLevel] + " " + + baseBNameAtLevel[indexLevel] + "\n"; + expectedOutput[0] = selectedInput[baseOffset]; + spec.inputTypes[0] = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + spec.inputTypes[1] = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + spec.inputTypes[2] = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + spec.assembly = shaderTemplate.specialize(specs); + spec.numWorkGroups = IVec3(1, 1, 1); + spec.requestedVulkanFeatures = requiredFeatures; + spec.inputs.push_back(BufferSp(new Float32Buffer(inputA))); + spec.inputs.push_back(BufferSp(new Float32Buffer(inputB))); + spec.inputs.push_back(BufferSp(new Float32Buffer(inputC))); + spec.outputs.push_back(BufferSp(new Float32Buffer(expectedOutput))); + spec.extensions.push_back("VK_KHR_variable_pointers"); + group->addChild(new SpvAsmComputeShaderCase(testCtx, name.c_str(), name.c_str(), spec)); + } + } + } + } +} + +void addNullptrVariablePointersComputeGroup (tcu::TestCaseGroup* group) +{ + tcu::TestContext& testCtx = group->getTestContext(); + float someFloat = 78; + vector input (1, someFloat); + vector expectedOutput (1, someFloat); + VulkanFeatures requiredFeatures; + + // Requires the variable pointers feature. + requiredFeatures.extVariablePointers = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS; + + const string decorations ( + // Decorations + "OpDecorate %id BuiltIn GlobalInvocationId \n" + "OpDecorate %input DescriptorSet 0 \n" + "OpDecorate %outdata DescriptorSet 0 \n" + "OpDecorate %input Binding 0 \n" + "OpDecorate %outdata Binding 1 \n" + + // Set the Block decoration + "OpDecorate %float_struct Block \n" + + // Set the Offsets + "OpMemberDecorate %float_struct 0 Offset 0 \n" + ); + + const string types ( + /////////// + // TYPES // + /////////// + // struct float_struct { + // float x; + // }; + "%float_struct = OpTypeStruct %f32 \n" + + /////////////////// + // POINTER TYPES // + /////////////////// + "%float_struct_ptr = OpTypePointer StorageBuffer %float_struct \n" + "%sb_f32ptr = OpTypePointer StorageBuffer %f32 \n" + "%func_f32ptrptr = OpTypePointer Function %sb_f32ptr \n" + + /////////////// + // CONSTANTS // + /////////////// + "%c_bool_true = OpConstantTrue %bool \n" + "%c_i32_0 = OpConstant %i32 0 \n" + "%c_null_ptr = OpConstantNull %sb_f32ptr \n" + + /////////////// + // VARIABLES // + /////////////// + "%id = OpVariable %uvec3ptr Input \n" + "%input = OpVariable %float_struct_ptr StorageBuffer \n" + "%outdata = OpVariable %float_struct_ptr StorageBuffer \n" + ); + + const StringTemplate shaderTemplate ( + "OpCapability Shader\n" + "OpCapability VariablePointers\n" + + "OpExtension \"SPV_KHR_variable_pointers\"\n" + "OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n" + "OpMemoryModel Logical GLSL450\n" + "OpEntryPoint GLCompute %main \"main\" %id\n" + "OpExecutionMode %main LocalSize 1 1 1\n" + + "OpSource GLSL 430\n" + "OpName %main \"main\"\n" + "OpName %id \"gl_GlobalInvocationID\"\n" + + + decorations + + + string(getComputeAsmCommonTypes()) + + + types + + + // main function is the entry_point + "%main = OpFunction %void None %voidf\n" + "%label = OpLabel\n" + + // Note that the Variable Pointers extension allows creation + // of a pointer variable with storage class of Private or Function. + "%f32_ptr_var = OpVariable %func_f32ptrptr Function %c_null_ptr\n" + + "%input_loc = OpAccessChain %sb_f32ptr %input %c_i32_0\n" + "%output_loc = OpAccessChain %sb_f32ptr %outdata %c_i32_0\n" + + "${NullptrTestingStrategy}\n" + + " OpReturn\n" + " OpFunctionEnd\n"); + + // f32_ptr_var has been inintialized to NULL. + // Now set it to point to the float variable that holds the input value + { + ComputeShaderSpec spec; + map specs; + string name = "opvariable_initialized_null"; + specs["NullptrTestingStrategy"] = + " OpStore %f32_ptr_var %input_loc \n" + "%loaded_f32_ptr = OpLoad %sb_f32ptr %f32_ptr_var \n" + "%loaded_f32 = OpLoad %f32 %loaded_f32_ptr \n" + " OpStore %output_loc %loaded_f32 \n"; + + spec.inputTypes[0] = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + spec.assembly = shaderTemplate.specialize(specs); + spec.numWorkGroups = IVec3(1, 1, 1); + spec.requestedVulkanFeatures = requiredFeatures; + spec.inputs.push_back(BufferSp(new Float32Buffer(input))); + spec.outputs.push_back(BufferSp(new Float32Buffer(expectedOutput))); + spec.extensions.push_back("VK_KHR_variable_pointers"); + group->addChild(new SpvAsmComputeShaderCase(testCtx, name.c_str(), name.c_str(), spec)); + } + // Use OpSelect to choose between nullptr and valid pointer. Since we can't dereference nullptr, + // it is forced to always choose the valid pointer. + { + ComputeShaderSpec spec; + map specs; + string name = "opselect_null_or_valid_ptr"; + specs["NullptrTestingStrategy"] = + "%selected_ptr = OpSelect %sb_f32ptr %c_bool_true %input_loc %c_null_ptr\n" + "%loaded_var = OpLoad %f32 %selected_ptr\n" + "OpStore %output_loc %loaded_var\n"; + + spec.inputTypes[0] = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + spec.assembly = shaderTemplate.specialize(specs); + spec.numWorkGroups = IVec3(1, 1, 1); + spec.requestedVulkanFeatures = requiredFeatures; + spec.inputs.push_back(BufferSp(new Float32Buffer(input))); + spec.outputs.push_back(BufferSp(new Float32Buffer(expectedOutput))); + spec.extensions.push_back("VK_KHR_variable_pointers"); + group->addChild(new SpvAsmComputeShaderCase(testCtx, name.c_str(), name.c_str(), spec)); + } +} + +void addVariablePointersGraphicsGroup (tcu::TestCaseGroup* testGroup) { tcu::TestContext& testCtx = testGroup->getTestContext(); de::Random rnd (deStringHash(testGroup->getName())); @@ -841,25 +1574,978 @@ void addGraphicsVariablePointersGroup (tcu::TestCaseGroup* testGroup) } } +// Modifies the 'red channel' of the input color to the given float value. +// Returns the modified color. +void getExpectedOutputColor(RGBA (&inputColors)[4], RGBA (&expectedOutputColors)[4], float val) +{ + Vec4 inColor0 = inputColors[0].toVec(); + Vec4 inColor1 = inputColors[1].toVec(); + Vec4 inColor2 = inputColors[2].toVec(); + Vec4 inColor3 = inputColors[3].toVec(); + inColor0[0] = val; + inColor1[0] = val; + inColor2[0] = val; + inColor3[0] = val; + expectedOutputColors[0] = RGBA(inColor0); + expectedOutputColors[1] = RGBA(inColor1); + expectedOutputColors[2] = RGBA(inColor2); + expectedOutputColors[3] = RGBA(inColor3); +} + +void addTwoInputBufferReadOnlyVariablePointersGraphicsGroup (tcu::TestCaseGroup* testGroup) +{ + const int numFloatsPerInput = 64; + vector inputA (numFloatsPerInput, 0); + vector inputB (numFloatsPerInput, 0); + deUint32 baseOffset = -1; + VulkanFeatures requiredFeatures; + map fragments; + RGBA defaultColors[4]; + RGBA expectedColors[4]; + vector extensions; + + getDefaultColors(defaultColors); + + // Set the proper extension features required for the tests. + requiredFeatures.extVariablePointers = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS; + + // Set the required extension. + extensions.push_back("VK_KHR_variable_pointers"); + + // These tests exercise variable pointers into various levels of the following data-structure: + // struct struct inner_struct { + // vec4 x[2]; // array of 2 vectors. Each vector is 4 floats. + // vec4 y[2]; // array of 2 vectors. Each vector is 4 floats. + // }; + // + // struct outer_struct { + // inner_struct r[2][2]; + // }; + // + // The inner_struct contains 16 floats, and the outer_struct contains 64 floats. + // Therefore the input can be an array of 64 floats. + + // Populate the first input (inputA) to contain: {0, 4, ... , 252} / 255.f + // Populate the second input (inputB) to contain: {3, 7, ... , 255} / 255.f + for (size_t i = 0; i < numFloatsPerInput; ++i) + { + inputA[i] = 4*float(i) / 255; + inputB[i] = ((4*float(i)) + 3) / 255; + } + + // In the following tests we use variable pointers to point to different types: + // nested structures, matrices of structures, arrays of structures, arrays of vectors, vectors of scalars, and scalars. + // outer_structure.inner_structure[?][?].x[?][?]; + // ^ ^ ^ ^ ^ ^ ^ + // + // 1. inputA or inputB = nested structure + // 2. inputA.r or inputB.r = matrices of structures + // 3. inputA.r[?] or inputB.r[?] = arrays of structures + // 4. inputA.r[?][?] or inputB.r[?][?] = structures + // 5. inputA.r[?][?].(x|y) or inputB.r[?][?].(x|y) = arrays of vectors + // 6. inputA.r[?][?].(x|y)[?] or inputB.r[?][?].(x|y)[?] = vectors of scalars + // 7. inputA.r[?][?].(x|y)[?][?] or inputB.r[?][?].(x|y)[?][?] = scalars + const int numLevels = 7; + + fragments["capability"] = "OpCapability VariablePointers \n"; + fragments["extension"] = "OpExtension \"SPV_KHR_variable_pointers\" \n" + "OpExtension \"SPV_KHR_storage_buffer_storage_class\" \n"; + + const StringTemplate decoration ( + // Set the Offsets + "OpMemberDecorate %outer_struct 0 Offset 0 \n" + "OpMemberDecorate %inner_struct 0 Offset 0 \n" + "OpMemberDecorate %inner_struct 1 Offset 32 \n" + + // Set the ArrayStrides + "OpDecorate %arr2_v4float ArrayStride 16 \n" + "OpDecorate %arr2_inner_struct ArrayStride 64 \n" + "OpDecorate %mat2x2_inner_struct ArrayStride 128 \n" + + "OpDecorate %outer_struct Block \n" + + "OpDecorate %in_a DescriptorSet 0 \n" + "OpDecorate %in_b DescriptorSet 0 \n" + "OpDecorate %in_a Binding 0 \n" + "OpDecorate %in_b Binding 1 \n" + ); + + const StringTemplate preMain ( + /////////// + // TYPES // + /////////// + + // struct struct inner_struct { + // vec4 x[2]; // array of 2 vectors + // vec4 y[2]; // array of 2 vectors + // }; + "%arr2_v4float = OpTypeArray %v4f32 %c_u32_2 \n" + "%inner_struct = OpTypeStruct %arr2_v4float %arr2_v4float \n" + + // struct outer_struct { + // inner_struct r[2][2]; + // }; + "%arr2_inner_struct = OpTypeArray %inner_struct %c_u32_2 \n" + "%mat2x2_inner_struct = OpTypeArray %arr2_inner_struct %c_u32_2 \n" + "%outer_struct = OpTypeStruct %mat2x2_inner_struct \n" + + /////////////////// + // POINTER TYPES // + /////////////////// + "%sb_buf = OpTypePointer StorageBuffer %outer_struct \n" + "%mat2x2_ptr = OpTypePointer StorageBuffer %mat2x2_inner_struct \n" + "%arr2_ptr = OpTypePointer StorageBuffer %arr2_inner_struct \n" + "%inner_struct_ptr = OpTypePointer StorageBuffer %inner_struct \n" + "%arr_v4f32_ptr = OpTypePointer StorageBuffer %arr2_v4float \n" + "%v4f32_ptr = OpTypePointer StorageBuffer %v4f32 \n" + "%sb_f32ptr = OpTypePointer StorageBuffer %f32 \n" + + /////////////// + // VARIABLES // + /////////////// + "%in_a = OpVariable %sb_buf StorageBuffer \n" + "%in_b = OpVariable %sb_buf StorageBuffer \n" + + /////////////// + // CONSTANTS // + /////////////// + "%c_bool_true = OpConstantTrue %bool \n" + "%c_bool_false = OpConstantFalse %bool \n" + + ////////////////////// + // HELPER FUNCTIONS // + ////////////////////// + "${helper_functions} \n" + ); + + const StringTemplate selectorFunctions ( + // This selector function returns a variable pointer. + // These functions are used by tests that use OpFunctionCall to obtain the variable pointer. + "%selector_func_type = OpTypeFunction ${selected_type} %bool ${selected_type} ${selected_type}\n" + "%choose_input_func = OpFunction ${selected_type} None %selector_func_type\n" + "%choose_first_param = OpFunctionParameter %bool\n" + "%first_param = OpFunctionParameter ${selected_type}\n" + "%second_param = OpFunctionParameter ${selected_type}\n" + "%selector_func_begin = OpLabel\n" + "%result_ptr = OpSelect ${selected_type} %choose_first_param %first_param %second_param\n" + " OpReturnValue %result_ptr\n" + " OpFunctionEnd\n" + ); + + const StringTemplate testFunction ( + "%test_code = OpFunction %v4f32 None %v4f32_function\n" + "%param = OpFunctionParameter %v4f32\n" + "%entry = OpLabel\n" + + // Define the 2 pointers from which we're going to choose one. + "${a_loc} \n" + "${b_loc} \n" + + // Choose between the 2 pointers / variable pointers + "${selection_strategy} \n" + + // OpAccessChain into the variable pointer until you get to the float. + "%result_loc = OpAccessChain %sb_f32ptr %var_ptr ${remaining_indexes} \n" + + // Now load from the result_loc + "%result_val = OpLoad %f32 %result_loc\n" + + // Modify the 'RED channel' of the output color to the chosen value + "%output_color = OpCompositeInsert %v4f32 %result_val %param 0 \n" + + // Return and FunctionEnd + "OpReturnValue %output_color\n" + "OpFunctionEnd\n"); + + // When select is 0, the variable pointer should point to a value in the first input (inputA). + // When select is 1, the variable pointer should point to a value in the second input (inputB). + for (int selectInputA = 0; selectInputA < 2; ++selectInputA) + { + const string selectedInputStr = selectInputA ? "first_input" : "second_input"; + const string spirvSelectInputA = selectInputA ? "%c_bool_true" : "%c_bool_false"; + vector& selectedInput = selectInputA ? inputA : inputB; + + // The indexes chosen at each level. At any level, any given offset is exercised. + // The first index is always zero as the outer structure has only 1 member. + const int indexesForLevel[numLevels][6]= {{0, 0, 0, 0, 0, 1}, + {0, 1, 0, 1, 0, 2}, + {0, 0, 1, 0, 1, 3}, + {0, 1, 1, 1, 0, 0}, + {0, 0, 0, 1, 1, 1}, + {0, 1, 0, 0, 0, 2}, + {0, 1, 1, 1, 1, 3}}; + + const string indexLevelNames[] = {"_outer_struct_", "_matrices_", "_arrays_", "_inner_structs_", "_vec4arr_", "_vec4_", "_float_"}; + const string inputALocations[] = { "", + "%a_loc = OpAccessChain %mat2x2_ptr %in_a %c_i32_0", + "%a_loc = OpAccessChain %arr2_ptr %in_a %c_i32_0 %c_i32_0", + "%a_loc = OpAccessChain %inner_struct_ptr %in_a %c_i32_0 %c_i32_1 %c_i32_1", + "%a_loc = OpAccessChain %arr_v4f32_ptr %in_a %c_i32_0 %c_i32_0 %c_i32_0 %c_i32_1", + "%a_loc = OpAccessChain %v4f32_ptr %in_a %c_i32_0 %c_i32_1 %c_i32_0 %c_i32_0 %c_i32_0", + "%a_loc = OpAccessChain %sb_f32ptr %in_a %c_i32_0 %c_i32_1 %c_i32_1 %c_i32_1 %c_i32_1 %c_i32_3"}; + + const string inputBLocations[] = { "", + "%b_loc = OpAccessChain %mat2x2_ptr %in_b %c_i32_0", + "%b_loc = OpAccessChain %arr2_ptr %in_b %c_i32_0 %c_i32_0", + "%b_loc = OpAccessChain %inner_struct_ptr %in_b %c_i32_0 %c_i32_1 %c_i32_1", + "%b_loc = OpAccessChain %arr_v4f32_ptr %in_b %c_i32_0 %c_i32_0 %c_i32_0 %c_i32_1", + "%b_loc = OpAccessChain %v4f32_ptr %in_b %c_i32_0 %c_i32_1 %c_i32_0 %c_i32_0 %c_i32_0", + "%b_loc = OpAccessChain %sb_f32ptr %in_b %c_i32_0 %c_i32_1 %c_i32_1 %c_i32_1 %c_i32_1 %c_i32_3"}; + + const string inputAPtrAccessChain[] = { "", + "%a_loc = OpPtrAccessChain %mat2x2_ptr %in_a %c_i32_0 %c_i32_0", + "%a_loc = OpPtrAccessChain %arr2_ptr %in_a %c_i32_0 %c_i32_0 %c_i32_0", + "%a_loc = OpPtrAccessChain %inner_struct_ptr %in_a %c_i32_0 %c_i32_0 %c_i32_1 %c_i32_1", + "%a_loc = OpPtrAccessChain %arr_v4f32_ptr %in_a %c_i32_0 %c_i32_0 %c_i32_0 %c_i32_0 %c_i32_1", + "%a_loc = OpPtrAccessChain %v4f32_ptr %in_a %c_i32_0 %c_i32_0 %c_i32_1 %c_i32_0 %c_i32_0 %c_i32_0", + // Next case emulates: + // %a_loc = OpPtrAccessChain %sb_f32ptr %in_a %c_i32_0 %c_i32_0 %c_i32_1 %c_i32_1 %c_i32_1 %c_i32_1 %c_i32_3 + // But rewrite it to exercise OpPtrAccessChain with a non-zero first index: + // %a_loc_arr is a pointer to an array that we want to index with 1. + // But instead of just using OpAccessChain with first index 1, use OpAccessChain with index 0 to + // get a pointer to the first element, then send that into OpPtrAccessChain with index 1. + "%a_loc_arr = OpPtrAccessChain %arr_v4f32_ptr %in_a %c_i32_0 %c_i32_0 %c_i32_1 %c_i32_1 %c_i32_1 " + "%a_loc_first_elem = OpAccessChain %v4f32_ptr %a_loc_arr %c_i32_0 " + "%a_loc = OpPtrAccessChain %sb_f32ptr %a_loc_first_elem %c_i32_1 %c_i32_3"}; + + const string inputBPtrAccessChain[] = { "", + "%b_loc = OpPtrAccessChain %mat2x2_ptr %in_b %c_i32_0 %c_i32_0", + "%b_loc = OpPtrAccessChain %arr2_ptr %in_b %c_i32_0 %c_i32_0 %c_i32_0", + "%b_loc = OpPtrAccessChain %inner_struct_ptr %in_b %c_i32_0 %c_i32_0 %c_i32_1 %c_i32_1", + "%b_loc = OpPtrAccessChain %arr_v4f32_ptr %in_b %c_i32_0 %c_i32_0 %c_i32_0 %c_i32_0 %c_i32_1", + "%b_loc = OpPtrAccessChain %v4f32_ptr %in_b %c_i32_0 %c_i32_0 %c_i32_1 %c_i32_0 %c_i32_0 %c_i32_0", + // Next case emulates: + // %b_loc = OpPtrAccessChain %sb_f32ptr %in_b %c_i32_0 %c_i32_0 %c_i32_1 %c_i32_1 %c_i32_1 %c_i32_1 %c_i32_3 + // But rewrite it to exercise OpPtrAccessChain with a non-zero first index: + // %b_loc_arr is a pointer to an array that we want to index with 1. + // But instead of just using OpAccessChain with first index 1, use OpAccessChain with index 0 to + // get a pointer to the first element, then send that into OpPtrAccessChain with index 1. + "%b_loc_arr = OpPtrAccessChain %arr_v4f32_ptr %in_b %c_i32_0 %c_i32_0 %c_i32_1 %c_i32_1 %c_i32_1 " + "%b_loc_first_elem = OpAccessChain %v4f32_ptr %b_loc_arr %c_i32_0 " + "%b_loc = OpPtrAccessChain %sb_f32ptr %b_loc_first_elem %c_i32_1 %c_i32_3"}; + + + const string remainingIndexesAtLevel[]= {"%c_i32_0 %c_i32_0 %c_i32_0 %c_i32_0 %c_i32_0 %c_i32_1", + "%c_i32_1 %c_i32_0 %c_i32_1 %c_i32_0 %c_i32_2", + "%c_i32_1 %c_i32_0 %c_i32_1 %c_i32_3", + "%c_i32_1 %c_i32_0 %c_i32_0", + "%c_i32_1 %c_i32_1", + "%c_i32_2", + ""}; + + const string pointerTypeAtLevel[] = {"%sb_buf", "%mat2x2_ptr", "%arr2_ptr", "%inner_struct_ptr", "%arr_v4f32_ptr", "%v4f32_ptr", "%sb_f32ptr"}; + const string baseANameAtLevel[] = {"%in_a", "%a_loc", "%a_loc", "%a_loc", "%a_loc", "%a_loc", "%a_loc"}; + const string baseBNameAtLevel[] = {"%in_b", "%b_loc", "%b_loc", "%b_loc", "%b_loc", "%b_loc", "%b_loc"}; + + for (int indexLevel = 0; indexLevel < numLevels; ++indexLevel) + { + baseOffset = getBaseOffset(indexesForLevel[indexLevel][0], + indexesForLevel[indexLevel][1], + indexesForLevel[indexLevel][2], + indexesForLevel[indexLevel][3], + indexesForLevel[indexLevel][4], + indexesForLevel[indexLevel][5]); + + // Use OpSelect to choose between 2 pointers + { + GraphicsResources resources; + map specs; + string opCodeForTests = "opselect"; + string name = opCodeForTests + indexLevelNames[indexLevel] + selectedInputStr; + specs["select_inputA"] = spirvSelectInputA; + specs["helper_functions"] = ""; + specs["a_loc"] = inputALocations[indexLevel]; + specs["b_loc"] = inputBLocations[indexLevel]; + specs["remaining_indexes"] = remainingIndexesAtLevel[indexLevel]; + specs["selection_strategy"] = "%var_ptr = OpSelect " + + pointerTypeAtLevel[indexLevel] + " " + + spirvSelectInputA + " " + + baseANameAtLevel[indexLevel] + " " + + baseBNameAtLevel[indexLevel] + "\n"; + fragments["decoration"] = decoration.specialize(specs); + fragments["pre_main"] = preMain.specialize(specs); + fragments["testfun"] = testFunction.specialize(specs); + resources.inputs.push_back(std::make_pair(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, BufferSp(new Float32Buffer(inputA)))); + resources.inputs.push_back(std::make_pair(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, BufferSp(new Float32Buffer(inputB)))); + getExpectedOutputColor(defaultColors, expectedColors, selectedInput[baseOffset]); + createTestsForAllStages(name.c_str(), defaultColors, expectedColors, fragments, resources, extensions, testGroup, requiredFeatures); + } + // Use OpCopyObject to get variable pointers + { + GraphicsResources resources; + map specs; + string opCodeForTests = "opcopyobject"; + string name = opCodeForTests + indexLevelNames[indexLevel] + selectedInputStr; + specs["select_inputA"] = spirvSelectInputA; + specs["helper_functions"] = ""; + specs["a_loc"] = inputALocations[indexLevel]; + specs["b_loc"] = inputBLocations[indexLevel]; + specs["remaining_indexes"] = remainingIndexesAtLevel[indexLevel]; + specs["selection_strategy"] = + "%in_a_copy = OpCopyObject " + pointerTypeAtLevel[indexLevel] + " " + baseANameAtLevel[indexLevel] + "\n" + "%in_b_copy = OpCopyObject " + pointerTypeAtLevel[indexLevel] + " " + baseBNameAtLevel[indexLevel] + "\n" + "%var_ptr = OpSelect " + pointerTypeAtLevel[indexLevel] + " " + spirvSelectInputA + " %in_a_copy %in_b_copy\n"; + fragments["decoration"] = decoration.specialize(specs); + fragments["pre_main"] = preMain.specialize(specs); + fragments["testfun"] = testFunction.specialize(specs); + resources.inputs.push_back(std::make_pair(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, BufferSp(new Float32Buffer(inputA)))); + resources.inputs.push_back(std::make_pair(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, BufferSp(new Float32Buffer(inputB)))); + getExpectedOutputColor(defaultColors, expectedColors, selectedInput[baseOffset]); + createTestsForAllStages(name.c_str(), defaultColors, expectedColors, fragments, resources, extensions, testGroup, requiredFeatures); + } + // Use OpPhi to choose between 2 pointers + { + GraphicsResources resources; + map specs; + string opCodeForTests = "opphi"; + string name = opCodeForTests + indexLevelNames[indexLevel] + selectedInputStr; + specs["select_inputA"] = spirvSelectInputA; + specs["helper_functions"] = ""; + specs["a_loc"] = inputALocations[indexLevel]; + specs["b_loc"] = inputBLocations[indexLevel]; + specs["remaining_indexes"] = remainingIndexesAtLevel[indexLevel]; + specs["selection_strategy"] = + " OpSelectionMerge %end_label None\n" + " OpBranchConditional " + spirvSelectInputA + " %take_input_a %take_input_b\n" + "%take_input_a = OpLabel\n" + " OpBranch %end_label\n" + "%take_input_b = OpLabel\n" + " OpBranch %end_label\n" + "%end_label = OpLabel\n" + "%var_ptr = OpPhi " + + pointerTypeAtLevel[indexLevel] + " " + + baseANameAtLevel[indexLevel] + + " %take_input_a " + + baseBNameAtLevel[indexLevel] + + " %take_input_b\n"; + fragments["decoration"] = decoration.specialize(specs); + fragments["pre_main"] = preMain.specialize(specs); + fragments["testfun"] = testFunction.specialize(specs); + resources.inputs.push_back(std::make_pair(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, BufferSp(new Float32Buffer(inputA)))); + resources.inputs.push_back(std::make_pair(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, BufferSp(new Float32Buffer(inputB)))); + getExpectedOutputColor(defaultColors, expectedColors, selectedInput[baseOffset]); + createTestsForAllStages(name.c_str(), defaultColors, expectedColors, fragments, resources, extensions, testGroup, requiredFeatures); + } + // Use OpFunctionCall to choose between 2 pointers + { + GraphicsResources resources; + map functionSpecs; + map specs; + string opCodeForTests = "opfunctioncall"; + string name = opCodeForTests + indexLevelNames[indexLevel] + selectedInputStr; + functionSpecs["selected_type"] = pointerTypeAtLevel[indexLevel]; + specs["helper_functions"] = selectorFunctions.specialize(functionSpecs); + specs["select_inputA"] = spirvSelectInputA; + specs["a_loc"] = inputALocations[indexLevel]; + specs["b_loc"] = inputBLocations[indexLevel]; + specs["remaining_indexes"] = remainingIndexesAtLevel[indexLevel]; + specs["selection_strategy"] = "%var_ptr = OpFunctionCall " + + pointerTypeAtLevel[indexLevel] + + " %choose_input_func " + + spirvSelectInputA + " " + + baseANameAtLevel[indexLevel] + " " + + baseBNameAtLevel[indexLevel] + "\n"; + fragments["decoration"] = decoration.specialize(specs); + fragments["pre_main"] = preMain.specialize(specs); + fragments["testfun"] = testFunction.specialize(specs); + resources.inputs.push_back(std::make_pair(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, BufferSp(new Float32Buffer(inputA)))); + resources.inputs.push_back(std::make_pair(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, BufferSp(new Float32Buffer(inputB)))); + getExpectedOutputColor(defaultColors, expectedColors, selectedInput[baseOffset]); + createTestsForAllStages(name.c_str(), defaultColors, expectedColors, fragments, resources, extensions, testGroup, requiredFeatures); + } + // Use OpPtrAccessChain to get variable pointers + { + GraphicsResources resources; + map specs; + string opCodeForTests = "opptraccesschain"; + string name = opCodeForTests + indexLevelNames[indexLevel] + selectedInputStr; + specs["select_inputA"] = spirvSelectInputA; + specs["helper_functions"] = ""; + specs["a_loc"] = inputAPtrAccessChain[indexLevel]; + specs["b_loc"] = inputBPtrAccessChain[indexLevel]; + specs["remaining_indexes"] = remainingIndexesAtLevel[indexLevel]; + specs["selection_strategy"] = "%var_ptr = OpSelect " + + pointerTypeAtLevel[indexLevel] + " " + + spirvSelectInputA + " " + + baseANameAtLevel[indexLevel] + " " + + baseBNameAtLevel[indexLevel] + "\n"; + fragments["decoration"] = decoration.specialize(specs); + fragments["pre_main"] = preMain.specialize(specs); + fragments["testfun"] = testFunction.specialize(specs); + resources.inputs.push_back(std::make_pair(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, BufferSp(new Float32Buffer(inputA)))); + resources.inputs.push_back(std::make_pair(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, BufferSp(new Float32Buffer(inputB)))); + getExpectedOutputColor(defaultColors, expectedColors, selectedInput[baseOffset]); + createTestsForAllStages(name.c_str(), defaultColors, expectedColors, fragments, resources, extensions, testGroup, requiredFeatures); + } + } + } +} + +void addSingleInputBufferReadOnlyVariablePointersGraphicsGroup (tcu::TestCaseGroup* testGroup) +{ + const int numFloatsPerInnerStruct = 64; + vector inputBuffer (2 * numFloatsPerInnerStruct, 0); + deUint32 baseOffset = -1; + VulkanFeatures requiredFeatures; + map fragments; + RGBA defaultColors[4]; + RGBA expectedColors[4]; + vector extensions; + + // Set the proper extension features required for the tests. + // The following tests use variable pointers confined withing a single buffer. + requiredFeatures.extVariablePointers = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS_STORAGEBUFFER; + + // Set the required extension. + extensions.push_back("VK_KHR_variable_pointers"); + + getDefaultColors(defaultColors); + + // These tests exercise variable pointers into various levels of the following data-structure: + // struct struct inner_struct { + // vec4 x[2]; // array of 2 vectors. Each vector is 4 floats. + // vec4 y[2]; // array of 2 vectors. Each vector is 4 floats. + // }; + // + // struct outer_struct { + // inner_struct r[2][2]; + // }; + // + // struct input_buffer { + // outer_struct a; + // outer_struct b; + // } + // + // The inner_struct contains 16 floats, and the outer_struct contains 64 floats. + // Therefore the input_buffer can be an array of 128 floats. + + // Populate input_buffer's first member (a) to contain: {0, 4, ... , 252} / 255.f + // Populate input_buffer's second member (b) to contain: {3, 7, ... , 255} / 255.f + for (size_t i = 0; i < numFloatsPerInnerStruct; ++i) + { + inputBuffer[i] = 4*float(i) / 255; + inputBuffer[i + numFloatsPerInnerStruct] = ((4*float(i)) + 3) / 255; + } + + // In the following tests we use variable pointers to point to different types: + // nested structures, matrices of structures, arrays of structures, arrays of vectors, vectors of scalars, and scalars. + // outer_struct.inner_struct[?][?].x[?][?]; + // ^ ^ ^ ^ ^ ^ ^ + // + // 1. inputBuffer.a or inputBuffer.b = nested structure + // 2. inputBuffer.a.r or inputBuffer.b.r = matrices of structures + // 3. inputBuffer.a.r[?] or inputBuffer.b.r[?] = arrays of structures + // 4. inputBuffer.a.r[?][?] or inputBuffer.b.r[?][?] = structures + // 5. inputBuffer.a.r[?][?].(x|y) or inputBuffer.b.r[?][?].(x|y) = arrays of vectors + // 6. inputBuffer.a.r[?][?].(x|y)[?] or inputBuffer.b.r[?][?].(x|y)[?] = vectors of scalars + // 7. inputBuffer.a.r[?][?].(x|y)[?][?] or inputBuffer.b.r[?][?].(x|y)[?][?] = scalars + const int numLevels = 7; + + fragments["capability"] = "OpCapability VariablePointersStorageBuffer \n"; + fragments["extension"] = "OpExtension \"SPV_KHR_variable_pointers\" \n" + "OpExtension \"SPV_KHR_storage_buffer_storage_class\" \n"; + const StringTemplate decoration ( + // Set the ArrayStrides + "OpDecorate %arr2_v4float ArrayStride 16 \n" + "OpDecorate %arr2_inner_struct ArrayStride 64 \n" + "OpDecorate %mat2x2_inner_struct ArrayStride 128 \n" + + // Set the Offsets + "OpMemberDecorate %input_buffer 0 Offset 0 \n" + "OpMemberDecorate %input_buffer 1 Offset 256 \n" + "OpMemberDecorate %outer_struct 0 Offset 0 \n" + "OpMemberDecorate %inner_struct 0 Offset 0 \n" + "OpMemberDecorate %inner_struct 1 Offset 32 \n" + + "OpDecorate %input_buffer Block \n" + + "OpDecorate %input DescriptorSet 0 \n" + "OpDecorate %input Binding 0 \n" + ); + + const StringTemplate preMain ( + /////////// + // TYPES // + /////////// + + // struct struct inner_struct { + // vec4 x[2]; // array of 2 vectors + // vec4 y[2]; // array of 2 vectors + // }; + "%arr2_v4float = OpTypeArray %v4f32 %c_u32_2 \n" + "%inner_struct = OpTypeStruct %arr2_v4float %arr2_v4float \n" + + // struct outer_struct { + // inner_struct r[2][2]; + // }; + "%arr2_inner_struct = OpTypeArray %inner_struct %c_u32_2 \n" + "%mat2x2_inner_struct = OpTypeArray %arr2_inner_struct %c_u32_2 \n" + "%outer_struct = OpTypeStruct %mat2x2_inner_struct \n" + + // struct input_buffer { + // outer_struct a; + // outer_struct b; + // } + "%input_buffer = OpTypeStruct %outer_struct %outer_struct \n" + + /////////////////// + // POINTER TYPES // + /////////////////// + "%input_buffer_ptr = OpTypePointer StorageBuffer %input_buffer \n" + "%outer_struct_ptr = OpTypePointer StorageBuffer %outer_struct \n" + "%mat2x2_ptr = OpTypePointer StorageBuffer %mat2x2_inner_struct \n" + "%arr2_ptr = OpTypePointer StorageBuffer %arr2_inner_struct \n" + "%inner_struct_ptr = OpTypePointer StorageBuffer %inner_struct \n" + "%arr_v4f32_ptr = OpTypePointer StorageBuffer %arr2_v4float \n" + "%v4f32_ptr = OpTypePointer StorageBuffer %v4f32 \n" + "%sb_f32ptr = OpTypePointer StorageBuffer %f32 \n" + + /////////////// + // VARIABLES // + /////////////// + "%input = OpVariable %input_buffer_ptr StorageBuffer \n" + + /////////////// + // CONSTANTS // + /////////////// + "%c_bool_true = OpConstantTrue %bool \n" + "%c_bool_false = OpConstantFalse %bool \n" + + ////////////////////// + // HELPER FUNCTIONS // + ////////////////////// + "${helper_functions} \n" + ); + + const StringTemplate selectorFunctions ( + // These selector functions return variable pointers. + // These functions are used by tests that use OpFunctionCall to obtain the variable pointer + "%selector_func_type = OpTypeFunction ${selected_type} %bool ${selected_type} ${selected_type}\n" + "%choose_input_func = OpFunction ${selected_type} None %selector_func_type\n" + "%choose_first_param = OpFunctionParameter %bool\n" + "%first_param = OpFunctionParameter ${selected_type}\n" + "%second_param = OpFunctionParameter ${selected_type}\n" + "%selector_func_begin = OpLabel\n" + "%result_ptr = OpSelect ${selected_type} %choose_first_param %first_param %second_param\n" + "OpReturnValue %result_ptr\n" + "OpFunctionEnd\n" + ); + + const StringTemplate testFunction ( + "%test_code = OpFunction %v4f32 None %v4f32_function\n" + "%param = OpFunctionParameter %v4f32\n" + "%entry = OpLabel\n" + + // Here are the 2 nested structures: + "%in_a = OpAccessChain %outer_struct_ptr %input %c_i32_0\n" + "%in_b = OpAccessChain %outer_struct_ptr %input %c_i32_1\n" + + // Define the 2 pointers from which we're going to choose one. + "${a_loc} \n" + "${b_loc} \n" + + // Choose between the 2 pointers / variable pointers + "${selection_strategy} \n" + + // OpAccessChain into the variable pointer until you get to the float. + "%result_loc = OpAccessChain %sb_f32ptr %var_ptr ${remaining_indexes} \n" + + + // Now load from the result_loc + "%result_val = OpLoad %f32 %result_loc\n" + + // Modify the 'RED channel' of the output color to the chosen value + "%output_color = OpCompositeInsert %v4f32 %result_val %param 0 \n" + + // Return and FunctionEnd + "OpReturnValue %output_color\n" + "OpFunctionEnd\n"); + + // When select is 0, the variable pointer should point to a value in the first input_buffer member (a). + // When select is 1, the variable pointer should point to a value in the second input_buffer member (b). + // Since the 2 members of the input_buffer (a and b) are of type outer_struct, we can conveniently use + // the same indexing scheme that we used for the 2-input-buffer tests. + for (int selectInputA = 0; selectInputA < 2; ++selectInputA) + { + const string selectedInputStr = selectInputA ? "first_input" : "second_input"; + const string spirvSelectInputA = selectInputA ? "%c_bool_true" : "%c_bool_false"; + const int outerStructIndex = selectInputA ? 0 : 1; + + // The indexes chosen at each level. At any level, any given offset is exercised. + // outerStructIndex is 0 for member (a) and 1 for member (b). + const int indexesForLevel[numLevels][6]= {{outerStructIndex, 0, 0, 0, 0, 1}, + {outerStructIndex, 1, 0, 1, 0, 2}, + {outerStructIndex, 0, 1, 0, 1, 3}, + {outerStructIndex, 1, 1, 1, 0, 0}, + {outerStructIndex, 0, 0, 1, 1, 1}, + {outerStructIndex, 1, 0, 0, 0, 2}, + {outerStructIndex, 1, 1, 1, 1, 3}}; + + const string indexLevelNames[] = {"_outer_struct_", "_matrices_", "_arrays_", "_inner_structs_", "_vec4arr_", "_vec4_", "_float_"}; + const string inputALocations[] = { "", + "%a_loc = OpAccessChain %mat2x2_ptr %in_a %c_i32_0", + "%a_loc = OpAccessChain %arr2_ptr %in_a %c_i32_0 %c_i32_0", + "%a_loc = OpAccessChain %inner_struct_ptr %in_a %c_i32_0 %c_i32_1 %c_i32_1", + "%a_loc = OpAccessChain %arr_v4f32_ptr %in_a %c_i32_0 %c_i32_0 %c_i32_0 %c_i32_1", + "%a_loc = OpAccessChain %v4f32_ptr %in_a %c_i32_0 %c_i32_1 %c_i32_0 %c_i32_0 %c_i32_0", + "%a_loc = OpAccessChain %sb_f32ptr %in_a %c_i32_0 %c_i32_1 %c_i32_1 %c_i32_1 %c_i32_1 %c_i32_3"}; + + const string inputBLocations[] = { "", + "%b_loc = OpAccessChain %mat2x2_ptr %in_b %c_i32_0", + "%b_loc = OpAccessChain %arr2_ptr %in_b %c_i32_0 %c_i32_0", + "%b_loc = OpAccessChain %inner_struct_ptr %in_b %c_i32_0 %c_i32_1 %c_i32_1", + "%b_loc = OpAccessChain %arr_v4f32_ptr %in_b %c_i32_0 %c_i32_0 %c_i32_0 %c_i32_1", + "%b_loc = OpAccessChain %v4f32_ptr %in_b %c_i32_0 %c_i32_1 %c_i32_0 %c_i32_0 %c_i32_0", + "%b_loc = OpAccessChain %sb_f32ptr %in_b %c_i32_0 %c_i32_1 %c_i32_1 %c_i32_1 %c_i32_1 %c_i32_3"}; + + const string inputAPtrAccessChain[] = { "", + "%a_loc = OpPtrAccessChain %mat2x2_ptr %in_a %c_i32_0 %c_i32_0", + "%a_loc = OpPtrAccessChain %arr2_ptr %in_a %c_i32_0 %c_i32_0 %c_i32_0", + "%a_loc = OpPtrAccessChain %inner_struct_ptr %in_a %c_i32_0 %c_i32_0 %c_i32_1 %c_i32_1", + "%a_loc = OpPtrAccessChain %arr_v4f32_ptr %in_a %c_i32_0 %c_i32_0 %c_i32_0 %c_i32_0 %c_i32_1", + "%a_loc = OpPtrAccessChain %v4f32_ptr %in_a %c_i32_0 %c_i32_0 %c_i32_1 %c_i32_0 %c_i32_0 %c_i32_0", + // Next case emulates: + // %a_loc = OpPtrAccessChain %sb_f32ptr %in_a %c_i32_0 %c_i32_0 %c_i32_1 %c_i32_1 %c_i32_1 %c_i32_1 %c_i32_3 + // But rewrite it to exercise OpPtrAccessChain with a non-zero first index: + // %a_loc_arr is a pointer to an array that we want to index with 1. + // But instead of just using OpAccessChain with first index 1, use OpAccessChain with index 0 to + // get a pointer to the first element, then send that into OpPtrAccessChain with index 1. + "%a_loc_arr = OpPtrAccessChain %arr_v4f32_ptr %in_a %c_i32_0 %c_i32_0 %c_i32_1 %c_i32_1 %c_i32_1 " + "%a_loc_first_elem = OpAccessChain %v4f32_ptr %a_loc_arr %c_i32_0 " + "%a_loc = OpPtrAccessChain %sb_f32ptr %a_loc_first_elem %c_i32_1 %c_i32_3"}; + + const string inputBPtrAccessChain[] = { "", + "%b_loc = OpPtrAccessChain %mat2x2_ptr %in_b %c_i32_0 %c_i32_0", + "%b_loc = OpPtrAccessChain %arr2_ptr %in_b %c_i32_0 %c_i32_0 %c_i32_0", + "%b_loc = OpPtrAccessChain %inner_struct_ptr %in_b %c_i32_0 %c_i32_0 %c_i32_1 %c_i32_1", + "%b_loc = OpPtrAccessChain %arr_v4f32_ptr %in_b %c_i32_0 %c_i32_0 %c_i32_0 %c_i32_0 %c_i32_1", + "%b_loc = OpPtrAccessChain %v4f32_ptr %in_b %c_i32_0 %c_i32_0 %c_i32_1 %c_i32_0 %c_i32_0 %c_i32_0", + // Next case emulates: + // %b_loc = OpPtrAccessChain %sb_f32ptr %in_b %c_i32_0 %c_i32_0 %c_i32_1 %c_i32_1 %c_i32_1 %c_i32_1 %c_i32_3 + // But rewrite it to exercise OpPtrAccessChain with a non-zero first index: + // %b_loc_arr is a pointer to an array that we want to index with 1. + // But instead of just using OpAccessChain with first index 1, use OpAccessChain with index 0 to + // get a pointer to the first element, then send that into OpPtrAccessChain with index 1. + "%b_loc_arr = OpPtrAccessChain %arr_v4f32_ptr %in_b %c_i32_0 %c_i32_0 %c_i32_1 %c_i32_1 %c_i32_1 " + "%b_loc_first_elem = OpAccessChain %v4f32_ptr %b_loc_arr %c_i32_0 " + "%b_loc = OpPtrAccessChain %sb_f32ptr %b_loc_first_elem %c_i32_1 %c_i32_3"}; + + + const string remainingIndexesAtLevel[]= {"%c_i32_0 %c_i32_0 %c_i32_0 %c_i32_0 %c_i32_0 %c_i32_1", + "%c_i32_1 %c_i32_0 %c_i32_1 %c_i32_0 %c_i32_2", + "%c_i32_1 %c_i32_0 %c_i32_1 %c_i32_3", + "%c_i32_1 %c_i32_0 %c_i32_0", + "%c_i32_1 %c_i32_1", + "%c_i32_2", + ""}; + + const string pointerTypeAtLevel[] = {"%outer_struct_ptr", "%mat2x2_ptr", "%arr2_ptr", "%inner_struct_ptr", "%arr_v4f32_ptr", "%v4f32_ptr", "%sb_f32ptr"}; + const string baseANameAtLevel[] = {"%in_a", "%a_loc", "%a_loc", "%a_loc", "%a_loc", "%a_loc", "%a_loc"}; + const string baseBNameAtLevel[] = {"%in_b", "%b_loc", "%b_loc", "%b_loc", "%b_loc", "%b_loc", "%b_loc"}; + + for (int indexLevel = 0; indexLevel < numLevels; ++indexLevel) + { + // Use OpSelect to choose between 2 pointers + { + GraphicsResources resources; + map specs; + string opCodeForTests = "opselect"; + string name = opCodeForTests + indexLevelNames[indexLevel] + selectedInputStr; + specs["select_inputA"] = spirvSelectInputA; + specs["helper_functions"] = ""; + specs["a_loc"] = inputALocations[indexLevel]; + specs["b_loc"] = inputBLocations[indexLevel]; + specs["remaining_indexes"] = remainingIndexesAtLevel[indexLevel]; + specs["selection_strategy"] = "%var_ptr = OpSelect " + + pointerTypeAtLevel[indexLevel] + " " + + spirvSelectInputA + " " + + baseANameAtLevel[indexLevel] + " " + + baseBNameAtLevel[indexLevel] + "\n"; + baseOffset = getBaseOffsetForSingleInputBuffer(indexesForLevel[indexLevel][0], + indexesForLevel[indexLevel][1], + indexesForLevel[indexLevel][2], + indexesForLevel[indexLevel][3], + indexesForLevel[indexLevel][4], + indexesForLevel[indexLevel][5]); + fragments["decoration"] = decoration.specialize(specs); + fragments["pre_main"] = preMain.specialize(specs); + fragments["testfun"] = testFunction.specialize(specs); + resources.inputs.push_back(std::make_pair(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, BufferSp(new Float32Buffer(inputBuffer)))); + getExpectedOutputColor(defaultColors, expectedColors, inputBuffer[baseOffset]); + createTestsForAllStages(name.c_str(), defaultColors, expectedColors, fragments, resources, extensions, testGroup, requiredFeatures); + } + // Use OpCopyObject to get variable pointers + { + GraphicsResources resources; + map specs; + string opCodeForTests = "opcopyobject"; + string name = opCodeForTests + indexLevelNames[indexLevel] + selectedInputStr; + specs["select_inputA"] = spirvSelectInputA; + specs["helper_functions"] = ""; + specs["a_loc"] = inputALocations[indexLevel]; + specs["b_loc"] = inputBLocations[indexLevel]; + specs["remaining_indexes"] = remainingIndexesAtLevel[indexLevel]; + specs["selection_strategy"] = + "%in_a_copy = OpCopyObject " + pointerTypeAtLevel[indexLevel] + " " + baseANameAtLevel[indexLevel] + "\n" + "%in_b_copy = OpCopyObject " + pointerTypeAtLevel[indexLevel] + " " + baseBNameAtLevel[indexLevel] + "\n" + "%var_ptr = OpSelect " + pointerTypeAtLevel[indexLevel] + " " + spirvSelectInputA + " %in_a_copy %in_b_copy\n"; + baseOffset = getBaseOffsetForSingleInputBuffer(indexesForLevel[indexLevel][0], + indexesForLevel[indexLevel][1], + indexesForLevel[indexLevel][2], + indexesForLevel[indexLevel][3], + indexesForLevel[indexLevel][4], + indexesForLevel[indexLevel][5]); + fragments["decoration"] = decoration.specialize(specs); + fragments["pre_main"] = preMain.specialize(specs); + fragments["testfun"] = testFunction.specialize(specs); + resources.inputs.push_back(std::make_pair(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, BufferSp(new Float32Buffer(inputBuffer)))); + getExpectedOutputColor(defaultColors, expectedColors, inputBuffer[baseOffset]); + createTestsForAllStages(name.c_str(), defaultColors, expectedColors, fragments, resources, extensions, testGroup, requiredFeatures); + } + // Use OpPhi to choose between 2 pointers + { + GraphicsResources resources; + map specs; + string opCodeForTests = "opphi"; + string name = opCodeForTests + indexLevelNames[indexLevel] + selectedInputStr; + specs["select_inputA"] = spirvSelectInputA; + specs["helper_functions"] = ""; + specs["a_loc"] = inputALocations[indexLevel]; + specs["b_loc"] = inputBLocations[indexLevel]; + specs["remaining_indexes"] = remainingIndexesAtLevel[indexLevel]; + specs["selection_strategy"] = + " OpSelectionMerge %end_label None\n" + " OpBranchConditional " + spirvSelectInputA + " %take_input_a %take_input_b\n" + "%take_input_a = OpLabel\n" + " OpBranch %end_label\n" + "%take_input_b = OpLabel\n" + " OpBranch %end_label\n" + "%end_label = OpLabel\n" + "%var_ptr = OpPhi " + + pointerTypeAtLevel[indexLevel] + " " + + baseANameAtLevel[indexLevel] + + " %take_input_a " + + baseBNameAtLevel[indexLevel] + + " %take_input_b\n"; + baseOffset = getBaseOffsetForSingleInputBuffer(indexesForLevel[indexLevel][0], + indexesForLevel[indexLevel][1], + indexesForLevel[indexLevel][2], + indexesForLevel[indexLevel][3], + indexesForLevel[indexLevel][4], + indexesForLevel[indexLevel][5]); + fragments["decoration"] = decoration.specialize(specs); + fragments["pre_main"] = preMain.specialize(specs); + fragments["testfun"] = testFunction.specialize(specs); + resources.inputs.push_back(std::make_pair(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, BufferSp(new Float32Buffer(inputBuffer)))); + getExpectedOutputColor(defaultColors, expectedColors, inputBuffer[baseOffset]); + createTestsForAllStages(name.c_str(), defaultColors, expectedColors, fragments, resources, extensions, testGroup, requiredFeatures); + } + // Use OpFunctionCall to choose between 2 pointers + { + GraphicsResources resources; + map functionSpecs; + map specs; + string opCodeForTests = "opfunctioncall"; + string name = opCodeForTests + indexLevelNames[indexLevel] + selectedInputStr; + //string selectedType = "%mat2x2_ptr"; + functionSpecs["selected_type"] = pointerTypeAtLevel[indexLevel]; + specs["helper_functions"] = selectorFunctions.specialize(functionSpecs); + specs["select_inputA"] = spirvSelectInputA; + specs["a_loc"] = inputALocations[indexLevel]; + specs["b_loc"] = inputBLocations[indexLevel]; + specs["remaining_indexes"] = remainingIndexesAtLevel[indexLevel]; + specs["selection_strategy"] = "%var_ptr = OpFunctionCall " + + pointerTypeAtLevel[indexLevel] + + " %choose_input_func " + + spirvSelectInputA + " " + + baseANameAtLevel[indexLevel] + " " + + baseBNameAtLevel[indexLevel] + "\n"; + baseOffset = getBaseOffsetForSingleInputBuffer(indexesForLevel[indexLevel][0], + indexesForLevel[indexLevel][1], + indexesForLevel[indexLevel][2], + indexesForLevel[indexLevel][3], + indexesForLevel[indexLevel][4], + indexesForLevel[indexLevel][5]); + fragments["decoration"] = decoration.specialize(specs); + fragments["pre_main"] = preMain.specialize(specs); + fragments["testfun"] = testFunction.specialize(specs); + resources.inputs.push_back(std::make_pair(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, BufferSp(new Float32Buffer(inputBuffer)))); + getExpectedOutputColor(defaultColors, expectedColors, inputBuffer[baseOffset]); + createTestsForAllStages(name.c_str(), defaultColors, expectedColors, fragments, resources, extensions, testGroup, requiredFeatures); + } + // Use OpPtrAccessChain to get variable pointers + { + GraphicsResources resources; + map specs; + string opCodeForTests = "opptraccesschain"; + string name = opCodeForTests + indexLevelNames[indexLevel] + selectedInputStr; + specs["select_inputA"] = spirvSelectInputA; + specs["helper_functions"] = ""; + specs["a_loc"] = inputAPtrAccessChain[indexLevel]; + specs["b_loc"] = inputBPtrAccessChain[indexLevel]; + specs["remaining_indexes"] = remainingIndexesAtLevel[indexLevel]; + specs["selection_strategy"] = "%var_ptr = OpSelect " + + pointerTypeAtLevel[indexLevel] + " " + + spirvSelectInputA + " " + + baseANameAtLevel[indexLevel] + " " + + baseBNameAtLevel[indexLevel] + "\n"; + baseOffset = getBaseOffsetForSingleInputBuffer(indexesForLevel[indexLevel][0], + indexesForLevel[indexLevel][1], + indexesForLevel[indexLevel][2], + indexesForLevel[indexLevel][3], + indexesForLevel[indexLevel][4], + indexesForLevel[indexLevel][5]); + fragments["decoration"] = decoration.specialize(specs); + fragments["pre_main"] = preMain.specialize(specs); + fragments["testfun"] = testFunction.specialize(specs); + resources.inputs.push_back(std::make_pair(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, BufferSp(new Float32Buffer(inputBuffer)))); + getExpectedOutputColor(defaultColors, expectedColors, inputBuffer[baseOffset]); + createTestsForAllStages(name.c_str(), defaultColors, expectedColors, fragments, resources, extensions, testGroup, requiredFeatures); + } + } + } +} + +void addNullptrVariablePointersGraphicsGroup (tcu::TestCaseGroup* testGroup) +{ + float someFloat = 78 / 255.f; + vector input (1, someFloat); + vector expectedOutput (1, someFloat); + VulkanFeatures requiredFeatures; + map fragments; + RGBA defaultColors[4]; + RGBA expectedColors[4]; + vector extensions; + + getDefaultColors(defaultColors); + getExpectedOutputColor(defaultColors, expectedColors, someFloat); + + // Set the required extension. + extensions.push_back("VK_KHR_variable_pointers"); + + // Requires the variable pointers feature. + requiredFeatures.extVariablePointers = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS; + + fragments["capability"] = "OpCapability VariablePointers \n"; + fragments["extension"] = "OpExtension \"SPV_KHR_variable_pointers\" \n" + "OpExtension \"SPV_KHR_storage_buffer_storage_class\" \n"; + const StringTemplate decoration ( + // Decorations + "OpDecorate %input DescriptorSet 0 \n" + "OpDecorate %input Binding 0 \n" + + // Set the Block decoration + "OpDecorate %float_struct Block \n" + + // Set the Offsets + "OpMemberDecorate %float_struct 0 Offset 0 \n" + ); + + const StringTemplate preMain ( + // struct float_struct { + // float x; + // }; + "%float_struct = OpTypeStruct %f32 \n" + + // POINTER TYPES + "%float_struct_ptr = OpTypePointer StorageBuffer %float_struct \n" + "%sb_f32ptr = OpTypePointer StorageBuffer %f32 \n" + "%func_f32ptrptr = OpTypePointer Function %sb_f32ptr \n" + + // CONSTANTS + "%c_bool_true = OpConstantTrue %bool \n" + "%c_null_ptr = OpConstantNull %sb_f32ptr \n" + + // VARIABLES + "%input = OpVariable %float_struct_ptr StorageBuffer \n" + "%float_var = OpVariable %sb_f32ptr StorageBuffer %c_null_ptr \n" + ); + + const StringTemplate testFunction ( + "%test_code = OpFunction %v4f32 None %v4f32_function\n" + "%param = OpFunctionParameter %v4f32\n" + "%entry = OpLabel\n" + + // Note that the Variable Pointers extension allows creation + // of a pointer variable with storage class of Private or Function. + "%f32_ptr_var = OpVariable %func_f32ptrptr Function %c_null_ptr\n" + + "%input_loc = OpAccessChain %sb_f32ptr %input %c_i32_0\n" + + // Null testing strategy + "${NullptrTestingStrategy}\n" + // Modify the 'RED channel' of the output color to the chosen value + "%output_color = OpCompositeInsert %v4f32 %result_val %param 0 \n" + // Return and FunctionEnd + "OpReturnValue %output_color\n" + "OpFunctionEnd\n"); + + // float_var has been inintialized to NULL. + // Now set it to the input variable and return it as output + { + GraphicsResources resources; + map specs; + specs["NullptrTestingStrategy"] = + " OpStore %f32_ptr_var %input_loc \n" + "%loaded_f32_ptr = OpLoad %sb_f32ptr %f32_ptr_var \n" + "%result_val = OpLoad %f32 %loaded_f32_ptr \n"; + fragments["decoration"] = decoration.specialize(specs); + fragments["pre_main"] = preMain.specialize(specs); + fragments["testfun"] = testFunction.specialize(specs); + resources.inputs.push_back(std::make_pair(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, BufferSp(new Float32Buffer(input)))); + createTestsForAllStages("opvariable_initialized_null", defaultColors, expectedColors, fragments, resources, extensions, testGroup, requiredFeatures); + } + // Use OpSelect to choose between nullptr and a valid pointer. Since we can't dereference nullptr, + // it is forced to always choose the valid pointer. + { + GraphicsResources resources; + map specs; + specs["NullptrTestingStrategy"] = "%selected_ptr = OpSelect %sb_f32ptr %c_bool_true %input_loc %c_null_ptr\n" + "%result_val = OpLoad %f32 %selected_ptr\n"; + fragments["decoration"] = decoration.specialize(specs); + fragments["pre_main"] = preMain.specialize(specs); + fragments["testfun"] = testFunction.specialize(specs); + resources.inputs.push_back(std::make_pair(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, BufferSp(new Float32Buffer(input)))); + createTestsForAllStages("opselect_null_or_valid_ptr", defaultColors, expectedColors, fragments, resources, extensions, testGroup, requiredFeatures); + } +} + } // anonymous tcu::TestCaseGroup* createVariablePointersComputeGroup (tcu::TestContext& testCtx) { de::MovePtr group (new tcu::TestCaseGroup(testCtx, "variable_pointers", "Compute tests for SPV_KHR_variable_pointers extension")); - addTestGroup(group.get(), "compute", "Test the variable pointer extension using a compute shader", addComputeVariablePointersGroup); + addTestGroup(group.get(), "compute", "Test the variable pointer extension using a compute shader", addVariablePointersComputeGroup); + addTestGroup(group.get(), + "complex_types_compute", + "Testing Variable Pointers pointing to various types in different input buffers", + addComplexTypesVariablePointersComputeGroup); + addTestGroup(group.get(), + "nullptr_compute", + "Test the usage of nullptr using the variable pointers extension in a compute shader", + addNullptrVariablePointersComputeGroup); - // \todo [2017-03-17 ehsann] A couple of things to do: - // * Add more tests (similar to existing ones) using data types other than Float. return group.release(); } tcu::TestCaseGroup* createVariablePointersGraphicsGroup (tcu::TestContext& testCtx) { de::MovePtr group (new tcu::TestCaseGroup(testCtx, "variable_pointers", "Graphics tests for SPV_KHR_variable_pointers extension")); - addTestGroup(group.get(), "graphics", "Testing Variable Pointers in graphics pipeline", addGraphicsVariablePointersGroup); - // \todo [2017-03-17 ehsann] A couple of things to do: - // * Add more tests (similar to existing ones) using data types other than Float. + addTestGroup(group.get(), "graphics", "Testing Variable Pointers in graphics pipeline", addVariablePointersGraphicsGroup); + addTestGroup(group.get(), + "multi_buffer_read_only_graphics", + "Testing Variable Pointers pointing to different input buffers in graphics pipeline (no SSBO writes)", + addTwoInputBufferReadOnlyVariablePointersGraphicsGroup); + addTestGroup(group.get(), + "single_buffer_read_only_graphics", + "Testing Variable Pointers confined to a single input buffer in graphics pipeline (no SSBO writes)", + addSingleInputBufferReadOnlyVariablePointersGraphicsGroup); + addTestGroup(group.get(), + "nullptr_graphics", + "Test the usage of nullptr using the variable pointers extension in graphics pipeline", + addNullptrVariablePointersGraphicsGroup); + return group.release(); } diff --git a/external/vulkancts/mustpass/1.0.2/vk-default.txt b/external/vulkancts/mustpass/1.0.2/vk-default.txt index 24feea5..2f6af16 100644 --- a/external/vulkancts/mustpass/1.0.2/vk-default.txt +++ b/external/vulkancts/mustpass/1.0.2/vk-default.txt @@ -159570,6 +159570,148 @@ dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.compute.stores_func dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.compute.reads_opptraccesschain_two_buffers dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.compute.writes_two_buffers dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.compute.workgroup_two_buffers +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_outer_struct_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_outer_struct_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_outer_struct_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_outer_struct_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_outer_struct_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_matrices_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_matrices_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_matrices_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_matrices_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_matrices_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_arrays_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_arrays_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_arrays_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_arrays_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_arrays_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_inner_structs_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_inner_structs_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_inner_structs_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_inner_structs_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_inner_structs_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_vec4arr_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_vec4arr_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_vec4arr_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_vec4arr_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_vec4arr_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_vec4_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_vec4_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_vec4_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_vec4_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_vec4_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_float_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_float_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_float_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_float_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_float_two_buffers_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_outer_struct_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_outer_struct_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_outer_struct_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_outer_struct_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_outer_struct_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_matrices_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_matrices_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_matrices_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_matrices_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_matrices_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_arrays_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_arrays_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_arrays_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_arrays_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_arrays_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_inner_structs_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_inner_structs_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_inner_structs_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_inner_structs_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_inner_structs_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_vec4arr_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_vec4arr_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_vec4arr_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_vec4arr_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_vec4arr_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_vec4_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_vec4_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_vec4_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_vec4_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_vec4_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_float_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_float_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_float_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_float_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_float_two_buffers_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_outer_struct_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_outer_struct_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_outer_struct_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_outer_struct_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_outer_struct_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_matrices_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_matrices_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_matrices_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_matrices_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_matrices_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_arrays_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_arrays_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_arrays_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_arrays_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_arrays_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_inner_structs_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_inner_structs_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_inner_structs_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_inner_structs_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_inner_structs_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_vec4arr_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_vec4arr_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_vec4arr_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_vec4arr_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_vec4arr_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_vec4_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_vec4_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_vec4_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_vec4_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_vec4_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_float_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_float_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_float_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_float_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_float_single_buffer_second_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_outer_struct_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_outer_struct_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_outer_struct_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_outer_struct_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_outer_struct_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_matrices_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_matrices_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_matrices_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_matrices_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_matrices_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_arrays_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_arrays_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_arrays_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_arrays_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_arrays_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_inner_structs_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_inner_structs_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_inner_structs_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_inner_structs_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_inner_structs_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_vec4arr_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_vec4arr_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_vec4arr_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_vec4arr_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_vec4arr_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_vec4_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_vec4_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_vec4_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_vec4_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_vec4_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opselect_float_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opfunctioncall_float_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opphi_float_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opcopyobject_float_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.complex_types_compute.opptraccesschain_float_single_buffer_first_input +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.nullptr_compute.opvariable_initialized_null +dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.nullptr_compute.opselect_null_or_valid_ptr dEQP-VK.spirv_assembly.instruction.graphics.opnop.opnop_vert dEQP-VK.spirv_assembly.instruction.graphics.opnop.opnop_tessc dEQP-VK.spirv_assembly.instruction.graphics.opnop.opnop_tesse @@ -161488,6 +161630,716 @@ dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.graphics.writes_tw dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.graphics.writes_two_buffers_tesse dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.graphics.writes_two_buffers_geom dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.graphics.writes_two_buffers_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_outer_struct_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_outer_struct_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_outer_struct_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_outer_struct_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_outer_struct_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_outer_struct_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_outer_struct_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_outer_struct_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_outer_struct_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_outer_struct_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_outer_struct_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_outer_struct_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_outer_struct_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_outer_struct_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_outer_struct_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_outer_struct_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_outer_struct_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_outer_struct_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_outer_struct_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_outer_struct_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_outer_struct_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_outer_struct_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_outer_struct_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_outer_struct_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_outer_struct_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_matrices_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_matrices_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_matrices_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_matrices_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_matrices_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_matrices_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_matrices_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_matrices_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_matrices_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_matrices_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_matrices_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_matrices_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_matrices_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_matrices_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_matrices_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_matrices_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_matrices_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_matrices_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_matrices_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_matrices_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_matrices_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_matrices_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_matrices_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_matrices_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_matrices_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_arrays_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_arrays_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_arrays_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_arrays_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_arrays_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_arrays_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_arrays_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_arrays_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_arrays_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_arrays_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_arrays_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_arrays_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_arrays_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_arrays_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_arrays_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_arrays_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_arrays_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_arrays_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_arrays_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_arrays_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_arrays_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_arrays_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_arrays_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_arrays_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_arrays_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_inner_structs_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_inner_structs_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_inner_structs_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_inner_structs_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_inner_structs_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_inner_structs_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_inner_structs_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_inner_structs_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_inner_structs_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_inner_structs_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_inner_structs_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_inner_structs_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_inner_structs_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_inner_structs_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_inner_structs_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_inner_structs_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_inner_structs_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_inner_structs_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_inner_structs_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_inner_structs_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_inner_structs_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_inner_structs_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_inner_structs_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_inner_structs_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_inner_structs_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4arr_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4arr_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4arr_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4arr_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4arr_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4arr_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4arr_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4arr_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4arr_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4arr_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4arr_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4arr_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4arr_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4arr_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4arr_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4arr_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4arr_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4arr_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4arr_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4arr_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4arr_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4arr_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4arr_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4arr_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4arr_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_float_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_float_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_float_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_float_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_float_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_float_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_float_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_float_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_float_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_float_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_float_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_float_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_float_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_float_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_float_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_float_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_float_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_float_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_float_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_float_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_float_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_float_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_float_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_float_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_float_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_outer_struct_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_outer_struct_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_outer_struct_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_outer_struct_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_outer_struct_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_outer_struct_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_outer_struct_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_outer_struct_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_outer_struct_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_outer_struct_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_outer_struct_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_outer_struct_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_outer_struct_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_outer_struct_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_outer_struct_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_outer_struct_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_outer_struct_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_outer_struct_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_outer_struct_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_outer_struct_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_outer_struct_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_outer_struct_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_outer_struct_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_outer_struct_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_outer_struct_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_matrices_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_matrices_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_matrices_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_matrices_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_matrices_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_matrices_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_matrices_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_matrices_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_matrices_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_matrices_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_matrices_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_matrices_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_matrices_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_matrices_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_matrices_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_matrices_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_matrices_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_matrices_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_matrices_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_matrices_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_matrices_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_matrices_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_matrices_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_matrices_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_matrices_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_arrays_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_arrays_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_arrays_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_arrays_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_arrays_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_arrays_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_arrays_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_arrays_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_arrays_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_arrays_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_arrays_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_arrays_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_arrays_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_arrays_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_arrays_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_arrays_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_arrays_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_arrays_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_arrays_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_arrays_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_arrays_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_arrays_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_arrays_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_arrays_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_arrays_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_inner_structs_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_inner_structs_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_inner_structs_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_inner_structs_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_inner_structs_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_inner_structs_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_inner_structs_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_inner_structs_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_inner_structs_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_inner_structs_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_inner_structs_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_inner_structs_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_inner_structs_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_inner_structs_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_inner_structs_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_inner_structs_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_inner_structs_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_inner_structs_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_inner_structs_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_inner_structs_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_inner_structs_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_inner_structs_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_inner_structs_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_inner_structs_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_inner_structs_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4arr_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4arr_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4arr_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4arr_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4arr_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4arr_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4arr_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4arr_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4arr_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4arr_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4arr_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4arr_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4arr_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4arr_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4arr_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4arr_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4arr_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4arr_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4arr_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4arr_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4arr_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4arr_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4arr_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4arr_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4arr_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_vec4_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_vec4_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_vec4_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_vec4_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_vec4_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_float_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_float_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_float_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_float_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opselect_float_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_float_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_float_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_float_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_float_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opcopyobject_float_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_float_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_float_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_float_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_float_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opphi_float_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_float_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_float_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_float_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_float_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opfunctioncall_float_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_float_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_float_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_float_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_float_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.multi_buffer_read_only_graphics.opptraccesschain_float_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_outer_struct_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_outer_struct_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_outer_struct_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_outer_struct_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_outer_struct_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_outer_struct_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_outer_struct_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_outer_struct_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_outer_struct_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_outer_struct_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_outer_struct_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_outer_struct_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_outer_struct_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_outer_struct_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_outer_struct_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_outer_struct_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_outer_struct_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_outer_struct_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_outer_struct_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_outer_struct_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_outer_struct_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_outer_struct_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_outer_struct_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_outer_struct_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_outer_struct_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_matrices_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_matrices_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_matrices_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_matrices_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_matrices_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_matrices_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_matrices_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_matrices_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_matrices_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_matrices_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_matrices_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_matrices_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_matrices_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_matrices_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_matrices_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_matrices_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_matrices_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_matrices_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_matrices_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_matrices_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_matrices_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_matrices_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_matrices_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_matrices_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_matrices_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_arrays_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_arrays_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_arrays_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_arrays_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_arrays_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_arrays_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_arrays_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_arrays_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_arrays_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_arrays_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_arrays_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_arrays_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_arrays_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_arrays_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_arrays_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_arrays_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_arrays_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_arrays_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_arrays_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_arrays_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_arrays_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_arrays_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_arrays_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_arrays_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_arrays_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_inner_structs_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_inner_structs_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_inner_structs_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_inner_structs_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_inner_structs_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_inner_structs_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_inner_structs_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_inner_structs_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_inner_structs_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_inner_structs_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_inner_structs_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_inner_structs_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_inner_structs_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_inner_structs_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_inner_structs_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_inner_structs_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_inner_structs_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_inner_structs_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_inner_structs_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_inner_structs_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_inner_structs_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_inner_structs_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_inner_structs_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_inner_structs_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_inner_structs_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4arr_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4arr_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4arr_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4arr_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4arr_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4arr_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4arr_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4arr_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4arr_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4arr_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4arr_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4arr_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4arr_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4arr_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4arr_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4arr_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4arr_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4arr_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4arr_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4arr_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4arr_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4arr_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4arr_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4arr_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4arr_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_float_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_float_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_float_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_float_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_float_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_float_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_float_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_float_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_float_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_float_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_float_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_float_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_float_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_float_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_float_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_float_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_float_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_float_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_float_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_float_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_float_second_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_float_second_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_float_second_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_float_second_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_float_second_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_outer_struct_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_outer_struct_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_outer_struct_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_outer_struct_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_outer_struct_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_outer_struct_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_outer_struct_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_outer_struct_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_outer_struct_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_outer_struct_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_outer_struct_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_outer_struct_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_outer_struct_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_outer_struct_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_outer_struct_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_outer_struct_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_outer_struct_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_outer_struct_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_outer_struct_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_outer_struct_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_outer_struct_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_outer_struct_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_outer_struct_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_outer_struct_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_outer_struct_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_matrices_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_matrices_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_matrices_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_matrices_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_matrices_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_matrices_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_matrices_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_matrices_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_matrices_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_matrices_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_matrices_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_matrices_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_matrices_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_matrices_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_matrices_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_matrices_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_matrices_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_matrices_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_matrices_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_matrices_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_matrices_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_matrices_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_matrices_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_matrices_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_matrices_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_arrays_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_arrays_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_arrays_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_arrays_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_arrays_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_arrays_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_arrays_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_arrays_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_arrays_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_arrays_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_arrays_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_arrays_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_arrays_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_arrays_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_arrays_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_arrays_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_arrays_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_arrays_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_arrays_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_arrays_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_arrays_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_arrays_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_arrays_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_arrays_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_arrays_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_inner_structs_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_inner_structs_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_inner_structs_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_inner_structs_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_inner_structs_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_inner_structs_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_inner_structs_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_inner_structs_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_inner_structs_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_inner_structs_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_inner_structs_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_inner_structs_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_inner_structs_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_inner_structs_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_inner_structs_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_inner_structs_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_inner_structs_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_inner_structs_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_inner_structs_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_inner_structs_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_inner_structs_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_inner_structs_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_inner_structs_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_inner_structs_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_inner_structs_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4arr_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4arr_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4arr_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4arr_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4arr_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4arr_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4arr_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4arr_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4arr_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4arr_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4arr_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4arr_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4arr_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4arr_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4arr_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4arr_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4arr_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4arr_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4arr_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4arr_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4arr_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4arr_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4arr_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4arr_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4arr_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_vec4_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_vec4_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_vec4_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_vec4_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_vec4_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_float_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_float_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_float_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_float_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opselect_float_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_float_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_float_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_float_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_float_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opcopyobject_float_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_float_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_float_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_float_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_float_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opphi_float_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_float_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_float_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_float_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_float_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opfunctioncall_float_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_float_first_input_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_float_first_input_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_float_first_input_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_float_first_input_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.single_buffer_read_only_graphics.opptraccesschain_float_first_input_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.nullptr_graphics.opvariable_initialized_null_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.nullptr_graphics.opvariable_initialized_null_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.nullptr_graphics.opvariable_initialized_null_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.nullptr_graphics.opvariable_initialized_null_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.nullptr_graphics.opvariable_initialized_null_frag +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.nullptr_graphics.opselect_null_or_valid_ptr_vert +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.nullptr_graphics.opselect_null_or_valid_ptr_tessc +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.nullptr_graphics.opselect_null_or_valid_ptr_tesse +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.nullptr_graphics.opselect_null_or_valid_ptr_geom +dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.nullptr_graphics.opselect_null_or_valid_ptr_frag dEQP-VK.glsl.arrays.constructor.float3_vertex dEQP-VK.glsl.arrays.constructor.float3_fragment dEQP-VK.glsl.arrays.constructor.float4_vertex -- 2.7.4