New tests for pointers as function parameters
authorAri Suonpaa <ari.suonpaa@siru.fi>
Mon, 4 Jun 2018 06:49:05 +0000 (09:49 +0300)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Fri, 27 Jul 2018 12:51:55 +0000 (08:51 -0400)
These new tests fill a coverage hole for passing multiple pointers
to functions and using these pointers to modify data. Alias decoration
is used where needed.

New tests:

dEQP-VK.spirv_assembly.instruction.*.pointer_parameter.*

Components: Vulkan

VK-GL-CTS issue: 1174

Change-Id: I5fc6b0f1b1b5a706acd671b9ecc4e928f988d6c3

AndroidGen.mk
android/cts/master/vk-master.txt
external/vulkancts/modules/vulkan/spirv_assembly/CMakeLists.txt
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmPointerParameterTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmPointerParameterTests.hpp [new file with mode: 0644]
external/vulkancts/mustpass/1.1.2/vk-default-no-waivers.txt
external/vulkancts/mustpass/1.1.2/vk-default.txt

index d44e7df..424c9fd 100644 (file)
@@ -266,6 +266,7 @@ LOCAL_SRC_FILES := \
        external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp \
        external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmLoopDepInfTests.cpp \
        external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmLoopDepLenTests.cpp \
+       external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmPointerParameterTests.cpp \
        external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmSpirvVersionTests.cpp \
        external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmTests.cpp \
        external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmTypeTests.cpp \
index df6c2ad..72ef375 100755 (executable)
@@ -211439,6 +211439,11 @@ dEQP-VK.spirv_assembly.instruction.compute.opname.entry_rdc.main_is_entry
 dEQP-VK.spirv_assembly.instruction.compute.opname.entry_rdc.func_is_main
 dEQP-VK.spirv_assembly.instruction.compute.opname.entry_rdc.func_is_not_main
 dEQP-VK.spirv_assembly.instruction.compute.opname.entry_rdc.func_is_entry
+dEQP-VK.spirv_assembly.instruction.compute.pointer_parameter.param_to_param
+dEQP-VK.spirv_assembly.instruction.compute.pointer_parameter.param_to_global
+dEQP-VK.spirv_assembly.instruction.compute.pointer_parameter.buffer_memory
+dEQP-VK.spirv_assembly.instruction.compute.pointer_parameter.buffer_memory_variable_pointers
+dEQP-VK.spirv_assembly.instruction.compute.pointer_parameter.workgroup_memory_variable_pointers
 dEQP-VK.spirv_assembly.instruction.graphics.cross_stage.basic_type.flat
 dEQP-VK.spirv_assembly.instruction.graphics.cross_stage.basic_type.no_perspective
 dEQP-VK.spirv_assembly.instruction.graphics.cross_stage.basic_type.relaxedprecision
@@ -215641,6 +215646,26 @@ dEQP-VK.spirv_assembly.instruction.graphics.fconvert.float64_to_float32_tessc
 dEQP-VK.spirv_assembly.instruction.graphics.fconvert.float64_to_float32_tesse
 dEQP-VK.spirv_assembly.instruction.graphics.fconvert.float64_to_float32_geom
 dEQP-VK.spirv_assembly.instruction.graphics.fconvert.float64_to_float32_frag
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.global_to_param_vert
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.global_to_param_tessc
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.global_to_param_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.global_to_param_geom
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.global_to_param_frag
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.param_to_global_vert
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.param_to_global_tessc
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.param_to_global_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.param_to_global_geom
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.param_to_global_frag
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_vert
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_tessc
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_geom
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_frag
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_variable_pointers_vert
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_variable_pointers_tessc
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_variable_pointers_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_variable_pointers_geom
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_variable_pointers_frag
 dEQP-VK.spirv_assembly.type.scalar.i16.negate_vert
 dEQP-VK.spirv_assembly.type.scalar.i16.negate_tessc
 dEQP-VK.spirv_assembly.type.scalar.i16.negate_tesse
index 5ac8d86..f5680a6 100644 (file)
@@ -25,6 +25,8 @@ set(DEQP_VK_SPIRV_ASSEMBLY_SRCS
        vktSpvAsmGraphicsShaderTestUtil.hpp
        vktSpvAsmInstructionTests.cpp
        vktSpvAsmInstructionTests.hpp
+       vktSpvAsmPointerParameterTests.cpp
+       vktSpvAsmPointerParameterTests.hpp
        vktSpvAsmTypeTests.cpp
        vktSpvAsmTypeTests.hpp
        vktSpvAsmTests.cpp
index 1b8e1cf..0529270 100644 (file)
@@ -61,6 +61,7 @@
 #include "vktSpvAsmGraphicsShaderTestUtil.hpp"
 #include "vktSpvAsmVariablePointersTests.hpp"
 #include "vktSpvAsmVariableInitTests.hpp"
+#include "vktSpvAsmPointerParameterTests.hpp"
 #include "vktSpvAsmSpirvVersionTests.hpp"
 #include "vktTestCaseUtil.hpp"
 #include "vktSpvAsmLoopDepLenTests.hpp"
@@ -9452,6 +9453,7 @@ tcu::TestCaseGroup* createInstructionTests (tcu::TestContext& testCtx)
        computeTests->addChild(createVariablePointersComputeGroup(testCtx));
        computeTests->addChild(createImageSamplerComputeGroup(testCtx));
        computeTests->addChild(createOpNameGroup(testCtx));
+       computeTests->addChild(createPointerParameterComputeGroup(testCtx));
        graphicsTests->addChild(createCrossStageInterfaceTests(testCtx));
        graphicsTests->addChild(createSpivVersionCheckTests(testCtx, !testComputePipeline));
        graphicsTests->addChild(createOpNopTests(testCtx));
@@ -9500,6 +9502,7 @@ tcu::TestCaseGroup* createInstructionTests (tcu::TestContext& testCtx)
        graphicsTests->addChild(createConvertGraphicsTests(testCtx, "OpSConvert", "sconvert"));
        graphicsTests->addChild(createConvertGraphicsTests(testCtx, "OpUConvert", "uconvert"));
        graphicsTests->addChild(createConvertGraphicsTests(testCtx, "OpFConvert", "fconvert"));
+       graphicsTests->addChild(createPointerParameterGraphicsGroup(testCtx));
 
        instructionTests->addChild(computeTests.release());
        instructionTests->addChild(graphicsTests.release());
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmPointerParameterTests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmPointerParameterTests.cpp
new file mode 100644 (file)
index 0000000..25218ee
--- /dev/null
@@ -0,0 +1,1100 @@
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2018 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief SPIR-V Assembly Tests for pointers as function parameters.
+ *//*--------------------------------------------------------------------*/
+
+#include "vktSpvAsmPointerParameterTests.hpp"
+#include "vktSpvAsmComputeShaderCase.hpp"
+#include "vktSpvAsmComputeShaderTestUtil.hpp"
+#include "vktSpvAsmGraphicsShaderTestUtil.hpp"
+
+namespace vkt
+{
+namespace SpirVAssembly
+{
+
+using namespace vk;
+using std::map;
+using std::string;
+using std::vector;
+using tcu::IVec3;
+using tcu::Vec4;
+using tcu::RGBA;
+
+namespace
+{
+
+void addComputePointerParamToParamTest (tcu::TestCaseGroup* group)
+{
+       tcu::TestContext&       testCtx                         = group->getTestContext();
+       const int                       numFloats                       = 128;
+       ComputeShaderSpec       spec;
+       vector<float>           expectedOutput;
+
+       // Implements the following pseudo GLSL shader:
+       //
+       //      float func(alias float* f, alias float* g)
+       //      {
+       //              *g = 5.0;
+       //              *f = 2.0;
+       //              return *g;
+       //      }
+       //
+       //      void main()
+       //      {
+       //              float a = 0.0;
+       //              o = func(&a, &a);  // should return 2.0
+       //              float b = 0.0;
+       //              o += func(&a, &b); // should return 5.0
+       //      }
+       const string            shaderSource            =
+                       "                          OpCapability Shader\n"
+                       "                     %1 = OpExtInstImport \"GLSL.std.450\"\n"
+                       "                          OpMemoryModel Logical GLSL450\n"
+                       "                          OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n"
+                       "                          OpExecutionMode %main LocalSize 1 1 1\n"
+                       "                          OpSource GLSL 430\n"
+                       "                          OpDecorate %_arr_float_uint_128 ArrayStride 4\n"
+                       "                          OpMemberDecorate %Output 0 Offset 0\n"
+                       "                          OpDecorate %Output BufferBlock\n"
+                       "                          OpDecorate %dataOutput DescriptorSet 0\n"
+                       "                          OpDecorate %dataOutput Binding 0\n"
+                       "                          OpDecorate %f Aliased\n"
+                       "                          OpDecorate %g Aliased\n"
+                       "                          OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n"
+                       "                  %void = OpTypeVoid\n"
+                       "             %void_func = OpTypeFunction %void\n"
+                       "                 %float = OpTypeFloat 32\n"
+                       "   %_ptr_Function_float = OpTypePointer Function %float\n"
+                       "            %func0_decl = OpTypeFunction %float %_ptr_Function_float %_ptr_Function_float\n"
+                       "               %float_0 = OpConstant %float 0\n"
+                       "               %float_5 = OpConstant %float 5\n"
+                       "               %float_2 = OpConstant %float 2\n"
+                       "                  %uint = OpTypeInt 32 0\n"
+                       "              %uint_128 = OpConstant %uint 128\n"
+                       "   %_arr_float_uint_128 = OpTypeArray %float %uint_128\n"
+                       "                %Output = OpTypeStruct %_arr_float_uint_128\n"
+                       "   %_ptr_Uniform_Output = OpTypePointer Uniform %Output\n"
+                       "            %dataOutput = OpVariable %_ptr_Uniform_Output Uniform\n"
+                       "                   %int = OpTypeInt 32 1\n"
+                       "                 %int_0 = OpConstant %int 0\n"
+                       "                %v3uint = OpTypeVector %uint 3\n"
+                       "     %_ptr_Input_v3uint = OpTypePointer Input %v3uint\n"
+                       " %gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n"
+                       "                %uint_0 = OpConstant %uint 0\n"
+                       "       %_ptr_Input_uint = OpTypePointer Input %uint\n"
+                       "    %_ptr_Uniform_float = OpTypePointer Uniform %float\n"
+                       "                  %main = OpFunction %void None %void_func\n"
+                       "                 %entry = OpLabel\n"
+                       "                     %a = OpVariable %_ptr_Function_float Function %float_0\n"
+                       "                     %b = OpVariable %_ptr_Function_float Function %float_0\n"
+                       "                     %o = OpVariable %_ptr_Function_float Function %float_0\n"
+                       "                  %ret0 = OpFunctionCall %float %func %a %a\n"
+                       "                          OpStore %o %ret0\n"
+                       "                  %ret1 = OpFunctionCall %float %func %a %b\n"
+                       "                 %o_val = OpLoad %float %o\n"
+                       "                   %sum = OpFAdd %float %o_val %ret1\n"
+                       "            %inv_id_ptr = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0\n"
+                       "                %inv_id = OpLoad %uint %inv_id_ptr\n"
+                       "               %out_ptr = OpAccessChain %_ptr_Uniform_float %dataOutput %int_0 %inv_id\n"
+                       "                          OpStore %out_ptr %sum\n"
+                       "                          OpReturn\n"
+                       "                          OpFunctionEnd\n"
+                       "                  %func = OpFunction %float None %func0_decl\n"
+                       "                     %f = OpFunctionParameter %_ptr_Function_float\n"
+                       "                     %g = OpFunctionParameter %_ptr_Function_float\n"
+                       "            %func_entry = OpLabel\n"
+                       "                          OpStore %g %float_5\n"
+                       "                          OpStore %f %float_2\n"
+                       "                   %ret = OpLoad %float %g\n"
+                       "                          OpReturnValue %ret\n"
+                       "                          OpFunctionEnd\n";
+
+       expectedOutput.reserve(numFloats);
+       for (deUint32 numIdx = 0; numIdx < numFloats; ++numIdx)
+               expectedOutput.push_back(7.0f);
+
+       spec.outputs.push_back(BufferSp(new Float32Buffer(expectedOutput)));
+
+       spec.assembly                           = shaderSource;
+       spec.numWorkGroups                      = IVec3(numFloats, 1, 1);
+
+       group->addChild(new SpvAsmComputeShaderCase(testCtx, "param_to_param", "", spec));
+}
+
+void addComputePointerParamToGlobalTest (tcu::TestCaseGroup* group)
+{
+       tcu::TestContext&       testCtx                         = group->getTestContext();
+       const int                       numFloats                       = 128;
+       ComputeShaderSpec       spec;
+       vector<float>           expectedOutput;
+
+       // Implements the following pseudo GLSL shader:
+       //
+       //      alias float a = 0.0;
+       //
+       //      float func0(alias float* f0) // f in Private storage class
+       //      {
+       //              *a = 5.0;
+       //              *f0 = 2.0;
+       //              return *a;
+       //      }
+       //
+       //      float func1(alias float* f1) // f in Function storage class
+       //      {
+       //              *a = 5.0;
+       //              *f1 = 2.0;
+       //              return *a;
+       //      }
+       //
+       //      void main()
+       //      {
+       //              o = func0(&a);  // should return 2.0
+       //              float b = 0.0;
+       //              o += func1(&b); // should return 5.0
+       //      }
+       const string            shaderSource            =
+                       "                          OpCapability Shader\n"
+                       "                     %1 = OpExtInstImport \"GLSL.std.450\"\n"
+                       "                          OpMemoryModel Logical GLSL450\n"
+                       "                          OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n"
+                       "                          OpExecutionMode %main LocalSize 1 1 1\n"
+                       "                          OpSource GLSL 430\n"
+                       "                          OpDecorate %_arr_float_uint_128 ArrayStride 4\n"
+                       "                          OpMemberDecorate %Output 0 Offset 0\n"
+                       "                          OpDecorate %Output BufferBlock\n"
+                       "                          OpDecorate %dataOutput DescriptorSet 0\n"
+                       "                          OpDecorate %dataOutput Binding 0\n"
+                       "                          OpDecorate %f0 Aliased\n"
+                       "                          OpDecorate %f1 Aliased\n"
+                       "                          OpDecorate %a Aliased\n"
+                       "                          OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n"
+                       "                  %void = OpTypeVoid\n"
+                       "             %void_func = OpTypeFunction %void\n"
+                       "                 %float = OpTypeFloat 32\n"
+                       "   %_ptr_Function_float = OpTypePointer Function %float\n"
+                       "    %_ptr_Private_float = OpTypePointer Private %float\n"
+                       "            %func0_decl = OpTypeFunction %float %_ptr_Private_float\n"
+                       "            %func1_decl = OpTypeFunction %float %_ptr_Function_float\n"
+                       "               %float_0 = OpConstant %float 0\n"
+                       "               %float_5 = OpConstant %float 5\n"
+                       "               %float_2 = OpConstant %float 2\n"
+                       "                  %uint = OpTypeInt 32 0\n"
+                       "              %uint_128 = OpConstant %uint 128\n"
+                       "   %_arr_float_uint_128 = OpTypeArray %float %uint_128\n"
+                       "                %Output = OpTypeStruct %_arr_float_uint_128\n"
+                       "   %_ptr_Uniform_Output = OpTypePointer Uniform %Output\n"
+                       "            %dataOutput = OpVariable %_ptr_Uniform_Output Uniform\n"
+                       "                   %int = OpTypeInt 32 1\n"
+                       "                 %int_0 = OpConstant %int 0\n"
+                       "                %v3uint = OpTypeVector %uint 3\n"
+                       "     %_ptr_Input_v3uint = OpTypePointer Input %v3uint\n"
+                       " %gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n"
+                       "                %uint_0 = OpConstant %uint 0\n"
+                       "       %_ptr_Input_uint = OpTypePointer Input %uint\n"
+                       "    %_ptr_Uniform_float = OpTypePointer Uniform %float\n"
+                       "                     %a = OpVariable %_ptr_Private_float Private %float_0\n"
+                       "                  %main = OpFunction %void None %void_func\n"
+                       "                 %entry = OpLabel\n"
+                       "                     %b = OpVariable %_ptr_Function_float Function %float_0\n"
+                       "                     %o = OpVariable %_ptr_Function_float Function %float_0\n"
+                       "                  %ret0 = OpFunctionCall %float %func0 %a\n"
+                       "                          OpStore %o %ret0\n"
+                       "                  %ret1 = OpFunctionCall %float %func1 %b\n"
+                       "                 %o_val = OpLoad %float %o\n"
+                       "                   %sum = OpFAdd %float %o_val %ret1\n"
+                       "            %inv_id_ptr = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0\n"
+                       "                %inv_id = OpLoad %uint %inv_id_ptr\n"
+                       "               %out_ptr = OpAccessChain %_ptr_Uniform_float %dataOutput %int_0 %inv_id\n"
+                       "                          OpStore %out_ptr %sum\n"
+                       "                          OpReturn\n"
+                       "                          OpFunctionEnd\n"
+                       "                 %func0 = OpFunction %float None %func0_decl\n"
+                       "                    %f0 = OpFunctionParameter %_ptr_Private_float\n"
+                       "           %func0_entry = OpLabel\n"
+                       "                          OpStore %a %float_5\n"
+                       "                          OpStore %f0 %float_2\n"
+                       "             %func0_ret = OpLoad %float %a\n"
+                       "                          OpReturnValue %func0_ret\n"
+                       "                          OpFunctionEnd\n"
+                       "                 %func1 = OpFunction %float None %func1_decl\n"
+                       "                    %f1 = OpFunctionParameter %_ptr_Function_float\n"
+                       "           %func1_entry = OpLabel\n"
+                       "                          OpStore %a %float_5\n"
+                       "                          OpStore %f1 %float_2\n"
+                       "             %func1_ret = OpLoad %float %a\n"
+                       "                          OpReturnValue %func1_ret\n"
+                       "                          OpFunctionEnd\n";
+
+       expectedOutput.reserve(numFloats);
+       for (deUint32 numIdx = 0; numIdx < numFloats; ++numIdx)
+               expectedOutput.push_back(7.0f);
+
+       spec.outputs.push_back(BufferSp(new Float32Buffer(expectedOutput)));
+
+       spec.assembly                           = shaderSource;
+       spec.numWorkGroups                      = IVec3(numFloats, 1, 1);
+
+       group->addChild(new SpvAsmComputeShaderCase(testCtx, "param_to_global", "", spec));
+}
+
+void addComputePointerBufferMemoryTest (tcu::TestCaseGroup* group)
+{
+       tcu::TestContext&       testCtx                         = group->getTestContext();
+       const int                       numFloats                       = 128;
+       ComputeShaderSpec       spec;
+       vector<float>           expectedOutput;
+
+       // Implements the following pseudo GLSL shader:
+       //
+       //      layout (binding = 0) buffer Output
+       //      {
+       //              vec4 arr0[16];
+       //              vec4 arr1[];
+       //      } dataOutput;
+       //
+       //      void func0(vec4* f0[16], uint i)
+       //      {
+       //              f0[i] = vec4(5.0);
+       //      }
+       //
+       //      void func1(vec4* f1[], uint i)
+       //      {
+       //              f1[i] = vec4(2.0);
+       //      }
+       //
+       //      void main()
+       //      {
+       //              uint idx = gl_GlobalInvocationID.x;
+       //              func0(dataOutput.arr0, idx);
+       //              func1(dataOutput.arr1, idx);
+       //      }
+       const string            shaderSource            =
+                       "                          OpCapability Shader\n"
+                       "                          OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n"
+                       "                     %1 = OpExtInstImport \"GLSL.std.450\"\n"
+                       "                          OpMemoryModel Logical GLSL450\n"
+                       "                          OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n"
+                       "                          OpExecutionMode %main LocalSize 1 1 1\n"
+                       "                          OpSource GLSL 430\n"
+                       "                          OpMemberDecorate %Output 0 Offset 0\n"
+                       "                          OpMemberDecorate %Output 1 Offset 256\n"
+                       "                          OpDecorate %arr_vec4_16 ArrayStride 16\n"
+                       "                          OpDecorate %arr_vec4_rt ArrayStride 16\n"
+                       "                          OpDecorate %Output Block\n"
+                       "                          OpDecorate %dataOutput DescriptorSet 0\n"
+                       "                          OpDecorate %dataOutput Binding 0\n"
+                       "                          OpDecorate %f0 DescriptorSet 0\n"
+                       "                          OpDecorate %f0 Binding 0\n"
+                       "                          OpDecorate %f1 DescriptorSet 0\n"
+                       "                          OpDecorate %f1 Binding 0\n"
+                       "                          OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n"
+                       "                  %void = OpTypeVoid\n"
+                       "             %void_func = OpTypeFunction %void\n"
+                       "                 %float = OpTypeFloat 32\n"
+                       "   %_ptr_Function_float = OpTypePointer Function %float\n"
+                       "               %float_5 = OpConstant %float 5\n"
+                       "               %float_2 = OpConstant %float 2\n"
+                       "                  %uint = OpTypeInt 32 0\n"
+                       "    %_ptr_Function_uint = OpTypePointer Function %uint\n"
+                       "               %uint_16 = OpConstant %uint 16\n"
+                       "                  %vec4 = OpTypeVector %float 4\n"
+                       "                %vec4_5 = OpConstantComposite %vec4 %float_5 %float_5 %float_5 %float_5\n"
+                       "                %vec4_2 = OpConstantComposite %vec4 %float_2 %float_2 %float_2 %float_2\n"
+                       "           %arr_vec4_16 = OpTypeArray %vec4 %uint_16\n"
+                       "           %arr_vec4_rt = OpTypeRuntimeArray %vec4\n"
+                       "       %arr_vec4_16_ptr = OpTypePointer StorageBuffer %arr_vec4_16\n"
+                       "       %arr_vec4_rt_ptr = OpTypePointer StorageBuffer %arr_vec4_rt\n"
+                       "            %func0_decl = OpTypeFunction %void %arr_vec4_16_ptr %_ptr_Function_uint\n"
+                       "            %func1_decl = OpTypeFunction %void %arr_vec4_rt_ptr %_ptr_Function_uint\n"
+                       "                %Output = OpTypeStruct %arr_vec4_16 %arr_vec4_rt\n"
+                       "        %_ptr_sb_Output = OpTypePointer StorageBuffer %Output\n"
+                       "            %dataOutput = OpVariable %_ptr_sb_Output StorageBuffer\n"
+                       "                   %int = OpTypeInt 32 1\n"
+                       "                 %int_0 = OpConstant %int 0\n"
+                       "                 %int_1 = OpConstant %int 1\n"
+                       "                %v3uint = OpTypeVector %uint 3\n"
+                       "     %_ptr_Input_v3uint = OpTypePointer Input %v3uint\n"
+                       " %gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n"
+                       "                %uint_0 = OpConstant %uint 0\n"
+                       "       %_ptr_Input_uint = OpTypePointer Input %uint\n"
+                       "          %_ptr_sb_vec4 = OpTypePointer StorageBuffer %vec4\n"
+                       "                  %main = OpFunction %void None %void_func\n"
+                       "                 %entry = OpLabel\n"
+                       "            %inv_id_ptr = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0\n"
+                       "                %inv_id = OpLoad %uint %inv_id_ptr\n"
+                       "                   %idx = OpVariable %_ptr_Function_uint Function\n"
+                       "                          OpStore %idx %inv_id\n"
+                       "                  %ptr0 = OpAccessChain %arr_vec4_16_ptr %dataOutput %int_0\n"
+                       "                  %ptr1 = OpAccessChain %arr_vec4_rt_ptr %dataOutput %int_1\n"
+                       "                  %ret0 = OpFunctionCall %void %func0 %ptr0 %idx\n"
+                       "                  %ret1 = OpFunctionCall %void %func1 %ptr1 %idx\n"
+                       "                          OpReturn\n"
+                       "                          OpFunctionEnd\n"
+                       "                 %func0 = OpFunction %void None %func0_decl\n"
+                       "                    %f0 = OpFunctionParameter %arr_vec4_16_ptr\n"
+                       "                    %i0 = OpFunctionParameter %_ptr_Function_uint\n"
+                       "           %func0_entry = OpLabel\n"
+                       "                  %idx0 = OpLoad %uint %i0\n"
+                       "              %out_ptr0 = OpAccessChain %_ptr_sb_vec4 %f0 %idx0\n"
+                       "                          OpStore %out_ptr0 %vec4_5\n"
+                       "                          OpReturn\n"
+                       "                          OpFunctionEnd\n"
+                       "                 %func1 = OpFunction %void None %func1_decl\n"
+                       "                    %f1 = OpFunctionParameter %arr_vec4_rt_ptr\n"
+                       "                    %i1 = OpFunctionParameter %_ptr_Function_uint\n"
+                       "           %func1_entry = OpLabel\n"
+                       "                  %idx1 = OpLoad %uint %i1\n"
+                       "              %out_ptr1 = OpAccessChain %_ptr_sb_vec4 %f1 %idx1\n"
+                       "                          OpStore %out_ptr1 %vec4_2\n"
+                       "                          OpReturn\n"
+                       "                          OpFunctionEnd\n";
+
+       expectedOutput.reserve(numFloats);
+       for (deUint32 numIdx = 0; numIdx < numFloats / 2; ++numIdx)
+               expectedOutput.push_back(5.0f);
+       for (deUint32 numIdx = 0; numIdx < numFloats / 2; ++numIdx)
+               expectedOutput.push_back(2.0f);
+
+       spec.outputs.push_back(BufferSp(new Float32Buffer(expectedOutput)));
+
+       spec.assembly                                   = shaderSource;
+       spec.numWorkGroups                              = IVec3(16, 1, 1);
+
+       group->addChild(new SpvAsmComputeShaderCase(testCtx, "buffer_memory", "", spec));
+}
+
+void addComputePointerBufferMemoryVariablePointersTest (tcu::TestCaseGroup* group)
+{
+       tcu::TestContext&       testCtx                         = group->getTestContext();
+       const int                       numFloats                       = 128;
+       ComputeShaderSpec       spec;
+       VulkanFeatures          requiredFeatures;
+       vector<float>           expectedOutput;
+
+       // Implements the following pseudo GLSL shader:
+       //
+       //      layout (binding = 0) buffer Output
+       //      {
+       //              vec4 arr0[16];
+       //              vec4 arr1[];
+       //      } dataOutput;
+       //
+       //      void func0(vec4* f0[16], uint i)
+       //      {
+       //              f0[i] = vec4(5.0);
+       //      }
+       //
+       //      void func1(vec4* f1[], uint i)
+       //      {
+       //              f1[i] = vec4(2.0);
+       //      }
+       //
+       //      void main()
+       //      {
+       //              uint idx = gl_GlobalInvocationID.x;
+       //              func0(dataOutput.arr0, idx);
+       //              func1(dataOutput.arr1, idx);
+       //      }
+       const string            shaderSource            =
+                       "                          OpCapability Shader\n"
+                       "                          OpCapability VariablePointersStorageBuffer\n"
+                       "                          OpExtension \"SPV_KHR_variable_pointers\"\n"
+                       "                          OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n"
+                       "                     %1 = OpExtInstImport \"GLSL.std.450\"\n"
+                       "                          OpMemoryModel Logical GLSL450\n"
+                       "                          OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n"
+                       "                          OpExecutionMode %main LocalSize 1 1 1\n"
+                       "                          OpSource GLSL 430\n"
+                       "                          OpMemberDecorate %Output 0 Offset 0\n"
+                       "                          OpMemberDecorate %Output 1 Offset 256\n"
+                       "                          OpDecorate %arr_vec4_16 ArrayStride 16\n"
+                       "                          OpDecorate %arr_vec4_rt ArrayStride 16\n"
+                       "                          OpDecorate %Output Block\n"
+                       "                          OpDecorate %dataOutput DescriptorSet 0\n"
+                       "                          OpDecorate %dataOutput Binding 0\n"
+                       "                          OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n"
+                       "                  %void = OpTypeVoid\n"
+                       "             %void_func = OpTypeFunction %void\n"
+                       "                 %float = OpTypeFloat 32\n"
+                       "   %_ptr_Function_float = OpTypePointer Function %float\n"
+                       "               %float_5 = OpConstant %float 5\n"
+                       "               %float_2 = OpConstant %float 2\n"
+                       "                  %uint = OpTypeInt 32 0\n"
+                       "    %_ptr_Function_uint = OpTypePointer Function %uint\n"
+                       "               %uint_16 = OpConstant %uint 16\n"
+                       "                  %vec4 = OpTypeVector %float 4\n"
+                       "                %vec4_5 = OpConstantComposite %vec4 %float_5 %float_5 %float_5 %float_5\n"
+                       "                %vec4_2 = OpConstantComposite %vec4 %float_2 %float_2 %float_2 %float_2\n"
+                       "           %arr_vec4_16 = OpTypeArray %vec4 %uint_16\n"
+                       "           %arr_vec4_rt = OpTypeRuntimeArray %vec4\n"
+                       "       %arr_vec4_16_ptr = OpTypePointer StorageBuffer %arr_vec4_16\n"
+                       "       %arr_vec4_rt_ptr = OpTypePointer StorageBuffer %arr_vec4_rt\n"
+                       "            %func0_decl = OpTypeFunction %void %arr_vec4_16_ptr %_ptr_Function_uint\n"
+                       "            %func1_decl = OpTypeFunction %void %arr_vec4_rt_ptr %_ptr_Function_uint\n"
+                       "                %Output = OpTypeStruct %arr_vec4_16 %arr_vec4_rt\n"
+                       "        %_ptr_sb_Output = OpTypePointer StorageBuffer %Output\n"
+                       "            %dataOutput = OpVariable %_ptr_sb_Output StorageBuffer\n"
+                       "                   %int = OpTypeInt 32 1\n"
+                       "                 %int_0 = OpConstant %int 0\n"
+                       "                 %int_1 = OpConstant %int 1\n"
+                       "                %v3uint = OpTypeVector %uint 3\n"
+                       "     %_ptr_Input_v3uint = OpTypePointer Input %v3uint\n"
+                       " %gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n"
+                       "                %uint_0 = OpConstant %uint 0\n"
+                       "       %_ptr_Input_uint = OpTypePointer Input %uint\n"
+                       "          %_ptr_sb_vec4 = OpTypePointer StorageBuffer %vec4\n"
+                       "                  %main = OpFunction %void None %void_func\n"
+                       "                 %entry = OpLabel\n"
+                       "            %inv_id_ptr = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0\n"
+                       "                %inv_id = OpLoad %uint %inv_id_ptr\n"
+                       "                   %idx = OpVariable %_ptr_Function_uint Function\n"
+                       "                          OpStore %idx %inv_id\n"
+                       "                  %ptr0 = OpAccessChain %arr_vec4_16_ptr %dataOutput %int_0\n"
+                       "                  %ptr1 = OpAccessChain %arr_vec4_rt_ptr %dataOutput %int_1\n"
+                       "                  %ret0 = OpFunctionCall %void %func0 %ptr0 %idx\n"
+                       "                  %ret1 = OpFunctionCall %void %func1 %ptr1 %idx\n"
+                       "                          OpReturn\n"
+                       "                          OpFunctionEnd\n"
+                       "                 %func0 = OpFunction %void None %func0_decl\n"
+                       "                    %f0 = OpFunctionParameter %arr_vec4_16_ptr\n"
+                       "                    %i0 = OpFunctionParameter %_ptr_Function_uint\n"
+                       "           %func0_entry = OpLabel\n"
+                       "                  %idx0 = OpLoad %uint %i0\n"
+                       "              %out_ptr0 = OpAccessChain %_ptr_sb_vec4 %f0 %idx0\n"
+                       "                          OpStore %out_ptr0 %vec4_5\n"
+                       "                          OpReturn\n"
+                       "                          OpFunctionEnd\n"
+                       "                 %func1 = OpFunction %void None %func1_decl\n"
+                       "                    %f1 = OpFunctionParameter %arr_vec4_rt_ptr\n"
+                       "                    %i1 = OpFunctionParameter %_ptr_Function_uint\n"
+                       "           %func1_entry = OpLabel\n"
+                       "                  %idx1 = OpLoad %uint %i1\n"
+                       "              %out_ptr1 = OpAccessChain %_ptr_sb_vec4 %f1 %idx1\n"
+                       "                          OpStore %out_ptr1 %vec4_2\n"
+                       "                          OpReturn\n"
+                       "                          OpFunctionEnd\n";
+
+       expectedOutput.reserve(numFloats);
+       for (deUint32 numIdx = 0; numIdx < numFloats / 2; ++numIdx)
+               expectedOutput.push_back(5.0f);
+       for (deUint32 numIdx = 0; numIdx < numFloats / 2; ++numIdx)
+               expectedOutput.push_back(2.0f);
+
+       requiredFeatures.extVariablePointers = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS_STORAGEBUFFER;
+       spec.outputs.push_back(BufferSp(new Float32Buffer(expectedOutput)));
+       spec.extensions.push_back("VK_KHR_variable_pointers");
+
+       spec.assembly                                   = shaderSource;
+       spec.numWorkGroups                              = IVec3(16, 1, 1);
+       spec.requestedVulkanFeatures    = requiredFeatures;
+
+       group->addChild(new SpvAsmComputeShaderCase(testCtx, "buffer_memory_variable_pointers", "", spec));
+}
+
+void addComputePointerWorkgroupMemoryVariablePointersTest (tcu::TestCaseGroup* group)
+{
+       tcu::TestContext&       testCtx                         = group->getTestContext();
+       const int                       numFloats                       = 128;
+       ComputeShaderSpec       spec;
+       VulkanFeatures          requiredFeatures;
+       vector<float>           expectedOutput;
+
+       // Implements the following pseudo GLSL shader:
+       //
+       //      layout (local_size_x = 16, local_size_y = 1, local_size_z = 1) in;
+       //
+       //      layout (binding = 0) buffer Output
+       //      {
+       //              vec4 arr0[16];
+       //              vec4 arr1[];
+       //      } dataOutput;
+       //
+       //      shared struct
+       //      {
+       //              vec4 arr0[16];
+       //              vec4 arr1[];
+       //      } sharedData;
+       //
+       //      void func0(vec4* f0[16], uint i)
+       //      {
+       //              f0[i] = vec4(i);
+       //      }
+       //
+       //      void func1(vec4* f1[], uint i)
+       //      {
+       //              f1[i] = vec4(i+5);
+       //      }
+       //
+       //      void main()
+       //      {
+       //              uint idx = gl_LocalInvocationID.x;
+       //              func0(sharedData.arr0, idx);
+       //              func1(sharedData.arr1, idx);
+       //              barier();
+       //              dataOutput.arr0[idx] = sharedData.arr1[(idx+1) % 16];
+       //              dataOutput.arr1[idx] = sharedData.arr0[(idx+1) % 16];
+       //      }
+       const string            shaderSource            =
+                       "                          OpCapability Shader\n"
+                       "                          OpCapability VariablePointers\n"
+                       "                          OpExtension \"SPV_KHR_variable_pointers\"\n"
+                       "                          OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n"
+                       "                     %1 = OpExtInstImport \"GLSL.std.450\"\n"
+                       "                          OpMemoryModel Logical GLSL450\n"
+                       "                          OpEntryPoint GLCompute %main \"main\" %gl_LocalInvocationID\n"
+                       "                          OpExecutionMode %main LocalSize 16 1 1\n"
+                       "                          OpSource GLSL 430\n"
+                       "                          OpMemberDecorate %Output 0 Offset 0\n"
+                       "                          OpMemberDecorate %Output 1 Offset 256\n"
+                       "                          OpMemberDecorate %struct 0 Offset 0\n"
+                       "                          OpMemberDecorate %struct 1 Offset 256\n"
+                       "                          OpDecorate %arr_vec4_16 ArrayStride 16\n"
+                       "                          OpDecorate %arr_vec4_rt ArrayStride 16\n"
+                       "                          OpDecorate %Output Block\n"
+                       "                          OpDecorate %dataOutput DescriptorSet 0\n"
+                       "                          OpDecorate %dataOutput Binding 0\n"
+                       "                          OpDecorate %gl_LocalInvocationID BuiltIn LocalInvocationId\n"
+                       "                  %void = OpTypeVoid\n"
+                       "             %void_func = OpTypeFunction %void\n"
+                       "                 %float = OpTypeFloat 32\n"
+                       "   %_ptr_Function_float = OpTypePointer Function %float\n"
+                       "                  %uint = OpTypeInt 32 0\n"
+                       "    %_ptr_Function_uint = OpTypePointer Function %uint\n"
+                       "                %uint_1 = OpConstant %uint 1\n"
+                       "                %uint_2 = OpConstant %uint 2\n"
+                       "                %uint_5 = OpConstant %uint 5\n"
+                       "               %uint_16 = OpConstant %uint 16\n"
+                       "              %uint_264 = OpConstant %uint 264\n"
+                       "                  %vec4 = OpTypeVector %float 4\n"
+                       "           %arr_vec4_16 = OpTypeArray %vec4 %uint_16\n"
+                       "           %arr_vec4_rt = OpTypeRuntimeArray %vec4\n"
+                       "    %arr_vec4_16_sb_ptr = OpTypePointer StorageBuffer %arr_vec4_16\n"
+                       "    %arr_vec4_rt_sb_ptr = OpTypePointer StorageBuffer %arr_vec4_rt\n"
+                       "    %arr_vec4_16_wg_ptr = OpTypePointer Workgroup %arr_vec4_16\n"
+                       "    %arr_vec4_rt_wg_ptr = OpTypePointer Workgroup %arr_vec4_rt\n"
+                       "            %func0_decl = OpTypeFunction %void %arr_vec4_16_wg_ptr %_ptr_Function_uint\n"
+                       "            %func1_decl = OpTypeFunction %void %arr_vec4_rt_wg_ptr %_ptr_Function_uint\n"
+                       "                %Output = OpTypeStruct %arr_vec4_16 %arr_vec4_rt\n"
+                       "                %struct = OpTypeStruct %arr_vec4_16 %arr_vec4_rt\n"
+                       "        %_ptr_sb_struct = OpTypePointer StorageBuffer %Output\n"
+                       "        %_ptr_wg_struct = OpTypePointer Workgroup %struct\n"
+                       "            %dataOutput = OpVariable %_ptr_sb_struct StorageBuffer\n"
+                       "            %sharedData = OpVariable %_ptr_wg_struct Workgroup\n"
+                       "                   %int = OpTypeInt 32 1\n"
+                       "                 %int_0 = OpConstant %int 0\n"
+                       "                 %int_1 = OpConstant %int 1\n"
+                       "                %v3uint = OpTypeVector %uint 3\n"
+                       "     %_ptr_Input_v3uint = OpTypePointer Input %v3uint\n"
+                       "  %gl_LocalInvocationID = OpVariable %_ptr_Input_v3uint Input\n"
+                       "                %uint_0 = OpConstant %uint 0\n"
+                       "       %_ptr_Input_uint = OpTypePointer Input %uint\n"
+                       "          %_ptr_sb_vec4 = OpTypePointer StorageBuffer %vec4\n"
+                       "          %_ptr_wg_vec4 = OpTypePointer Workgroup %vec4\n"
+                       "                  %main = OpFunction %void None %void_func\n"
+                       "                 %entry = OpLabel\n"
+                       "            %inv_id_ptr = OpAccessChain %_ptr_Input_uint %gl_LocalInvocationID %uint_0\n"
+                       "                %inv_id = OpLoad %uint %inv_id_ptr\n"
+                       "                   %idx = OpVariable %_ptr_Function_uint Function\n"
+                       "                          OpStore %idx %inv_id\n"
+                       "                  %ptr0 = OpAccessChain %arr_vec4_16_wg_ptr %sharedData %int_0\n"
+                       "                  %ptr1 = OpAccessChain %arr_vec4_rt_wg_ptr %sharedData %int_1\n"
+                       "                  %ret0 = OpFunctionCall %void %func0 %ptr0 %idx\n"
+                       "                  %ret1 = OpFunctionCall %void %func1 %ptr1 %idx\n"
+                       "                          OpControlBarrier %uint_2 %uint_2 %uint_264\n"
+                       "          %inv_id_plus1 = OpIAdd %uint %inv_id %uint_1\n"
+                       "            %inv_id_mod = OpUMod %uint %inv_id_plus1 %uint_16\n"
+                       "       %shared_arr1_ptr = OpAccessChain %_ptr_wg_vec4 %sharedData %int_1 %inv_id_mod\n"
+                       "      %shared_arr1_data = OpLoad %vec4 %shared_arr1_ptr\n"
+                       "               %outPtr0 = OpAccessChain %_ptr_sb_vec4 %dataOutput %int_0 %inv_id\n"
+                       "                          OpStore %outPtr0 %shared_arr1_data\n"
+                       "       %shared_arr0_ptr = OpAccessChain %_ptr_wg_vec4 %sharedData %int_0 %inv_id_mod\n"
+                       "      %shared_arr0_data = OpLoad %vec4 %shared_arr0_ptr\n"
+                       "               %outPtr1 = OpAccessChain %_ptr_sb_vec4 %dataOutput %int_1 %inv_id\n"
+                       "                          OpStore %outPtr1 %shared_arr0_data\n"
+                       "                          OpReturn\n"
+                       "                          OpFunctionEnd\n"
+                       "                 %func0 = OpFunction %void None %func0_decl\n"
+                       "                    %f0 = OpFunctionParameter %arr_vec4_16_wg_ptr\n"
+                       "                    %i0 = OpFunctionParameter %_ptr_Function_uint\n"
+                       "           %func0_entry = OpLabel\n"
+                       "                  %idx0 = OpLoad %uint %i0\n"
+                       "              %out_ptr0 = OpAccessChain %_ptr_wg_vec4 %f0 %idx0\n"
+                       "             %idxFloat0 = OpConvertUToF %float %idx0\n"
+                       "              %outData0 = OpCompositeConstruct %vec4 %idxFloat0 %idxFloat0 %idxFloat0 %idxFloat0\n"
+                       "                          OpStore %out_ptr0 %outData0\n"
+                       "                          OpReturn\n"
+                       "                          OpFunctionEnd\n"
+                       "                 %func1 = OpFunction %void None %func1_decl\n"
+                       "                    %f1 = OpFunctionParameter %arr_vec4_rt_wg_ptr\n"
+                       "                    %i1 = OpFunctionParameter %_ptr_Function_uint\n"
+                       "           %func1_entry = OpLabel\n"
+                       "                  %idx1 = OpLoad %uint %i1\n"
+                       "              %out_ptr1 = OpAccessChain %_ptr_wg_vec4 %f1 %idx1\n"
+                       "              %idxPlus5 = OpIAdd %uint %idx1 %uint_5\n"
+                       "             %idxFloat1 = OpConvertUToF %float %idxPlus5\n"
+                       "              %outData1 = OpCompositeConstruct %vec4 %idxFloat1 %idxFloat1 %idxFloat1 %idxFloat1\n"
+                       "                          OpStore %out_ptr1 %outData1\n"
+                       "                          OpReturn\n"
+                       "                          OpFunctionEnd\n";
+
+       expectedOutput.reserve(numFloats);
+       for (deUint32 vecIdx = 0; vecIdx < numFloats / 8; ++vecIdx)
+       {
+               const deUint32  shuffleIdx      = (vecIdx + 1) % 16;
+               const float             val                     = (float)(shuffleIdx + 5);
+               for (deUint32 i = 0; i < 4; ++i)
+                       expectedOutput.push_back(val);
+       }
+       for (deUint32 vecIdx = 0; vecIdx < numFloats / 8; ++vecIdx)
+       {
+               const deUint32  shuffleIdx      = (vecIdx + 1) % 16;
+               const float             val                     = (float)shuffleIdx;
+               for (deUint32 i = 0; i < 4; ++i)
+                       expectedOutput.push_back(val);
+       }
+
+       spec.outputs.push_back(BufferSp(new Float32Buffer(expectedOutput)));
+       requiredFeatures.extVariablePointers = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS;
+       spec.extensions.push_back("VK_KHR_variable_pointers");
+
+       spec.assembly                                   = shaderSource;
+       spec.numWorkGroups                              = IVec3(1, 1, 1);
+
+       group->addChild(new SpvAsmComputeShaderCase(testCtx, "workgroup_memory_variable_pointers", "", spec));
+}
+
+void addGraphicsPointerParamToParamTest (tcu::TestCaseGroup* group)
+{
+       map<string, string>     fragments;
+       RGBA                            defaultColors[4];
+       GraphicsResources       resources;
+       vector<string>          extensions;
+       vector<float>           expectedOutput;
+       VulkanFeatures          requiredFeatures;
+
+       // Implements the following pseudo GLSL shader:
+       //
+       //      float func(alias float* f, alias float* g)
+       //      {
+       //              *g = 5.0;
+       //              *f = 2.0;
+       //              return *g;
+       //      }
+       //
+       //      vec4 test_code(vec4 param)
+       //      {
+       //              float a = 0.0;
+       //              o = func(&a, &a);  // should return 2.0
+       //              float b = 0.0;
+       //              o += func(&a, &b); // should return 5.0
+       //              return param;
+       //      }
+       fragments["pre_main"]   =
+               "            %func0_decl = OpTypeFunction %f32 %fp_f32 %fp_f32\n"
+               "               %c_f32_5 = OpConstant %f32 5\n"
+               "               %c_f32_2 = OpConstant %f32 2\n"
+               "                %Output = OpTypeStruct %f32\n"
+               "   %_ptr_Uniform_Output = OpTypePointer Uniform %Output\n"
+               "            %dataOutput = OpVariable %_ptr_Uniform_Output Uniform\n"
+               "      %_ptr_Uniform_f32 = OpTypePointer Uniform %f32\n"
+               "                  %func = OpFunction %f32 None %func0_decl\n"
+               "                     %f = OpFunctionParameter %fp_f32\n"
+               "                     %g = OpFunctionParameter %fp_f32\n"
+               "            %func_entry = OpLabel\n"
+               "                          OpStore %g %c_f32_5\n"
+               "                          OpStore %f %c_f32_2\n"
+               "                   %ret = OpLoad %f32 %g\n"
+               "                          OpReturnValue %ret\n"
+               "                          OpFunctionEnd\n";
+
+       fragments["decoration"] =
+               "                          OpMemberDecorate %Output 0 Offset 0\n"
+               "                          OpDecorate %Output BufferBlock\n"
+               "                          OpDecorate %dataOutput DescriptorSet 0\n"
+               "                          OpDecorate %dataOutput Binding 0\n"
+               "                          OpDecorate %f Aliased\n"
+               "                          OpDecorate %g Aliased\n";
+
+       fragments["testfun"]    =
+               "             %test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
+               "                 %param = OpFunctionParameter %v4f32\n"
+               "                 %entry = OpLabel\n"
+               "                     %a = OpVariable %fp_f32 Function %c_f32_0\n"
+               "                     %b = OpVariable %fp_f32 Function %c_f32_0\n"
+               "                     %o = OpVariable %fp_f32 Function %c_f32_0\n"
+               "                  %ret0 = OpFunctionCall %f32 %func %a %a\n"
+               "                          OpStore %o %ret0\n"
+               "                  %ret1 = OpFunctionCall %f32 %func %a %b\n"
+               "                 %o_val = OpLoad %f32 %o\n"
+               "                   %sum = OpFAdd %f32 %o_val %ret1\n"
+               "               %out_ptr = OpAccessChain %_ptr_Uniform_f32 %dataOutput %c_i32_0\n"
+               "                          OpStore %out_ptr %sum\n"
+               "                          OpReturnValue %param\n"
+               "                          OpFunctionEnd\n";
+
+       getDefaultColors(defaultColors);
+       expectedOutput.push_back(7.0f);
+       requiredFeatures.coreFeatures.vertexPipelineStoresAndAtomics = DE_TRUE;
+       resources.outputs.push_back(std::make_pair(vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, BufferSp(new Float32Buffer(expectedOutput))));
+
+       createTestsForAllStages("global_to_param", defaultColors, defaultColors, fragments, resources, extensions, group, requiredFeatures);
+}
+
+void addGraphicsPointerParamToGlobalTest (tcu::TestCaseGroup* group)
+{
+       map<string, string>     fragments;
+       RGBA                            defaultColors[4];
+       GraphicsResources       resources;
+       vector<string>          extensions;
+       vector<float>           expectedOutput;
+       VulkanFeatures          requiredFeatures;
+
+       // Implements the following pseudo GLSL shader:
+       //
+       //      alias float a = 0.0;
+       //
+       //      float func0(alias float* f0) // f in Private storage class
+       //      {
+       //              *a = 5.0;
+       //              *f0 = 2.0;
+       //              return *a;
+       //      }
+       //
+       //      float func1(alias float* f1) // f in Function storage class
+       //      {
+       //              *a = 5.0;
+       //              *f1 = 2.0;
+       //              return *a;
+       //      }
+       //
+       //      vec4 test_code(vec4 param)
+       //      {
+       //              o = func0(&a);  // should return 2.0
+       //              float b = 0.0;
+       //              o += func1(&b); // should return 5.0
+       //              return param;
+       //      }
+       fragments["pre_main"] =
+               "                %pp_f32 = OpTypePointer Private %f32\n"
+               "            %func0_decl = OpTypeFunction %f32 %pp_f32\n"
+               "            %func1_decl = OpTypeFunction %f32 %fp_f32\n"
+               "               %c_f32_5 = OpConstant %f32 5\n"
+               "               %c_f32_2 = OpConstant %f32 2\n"
+               "                %Output = OpTypeStruct %f32\n"
+               "   %_ptr_Uniform_Output = OpTypePointer Uniform %Output\n"
+               "            %dataOutput = OpVariable %_ptr_Uniform_Output Uniform\n"
+               "      %_ptr_Uniform_f32 = OpTypePointer Uniform %f32\n"
+               "                     %a = OpVariable %pp_f32 Private %c_f32_0\n"
+               "                 %func0 = OpFunction %f32 None %func0_decl\n"
+               "                    %f0 = OpFunctionParameter %pp_f32\n"
+               "           %func0_entry = OpLabel\n"
+               "                          OpStore %a %c_f32_5\n"
+               "                          OpStore %f0 %c_f32_2\n"
+               "             %func0_ret = OpLoad %f32 %a\n"
+               "                          OpReturnValue %func0_ret\n"
+               "                          OpFunctionEnd\n"
+               "                 %func1 = OpFunction %f32 None %func1_decl\n"
+               "                    %f1 = OpFunctionParameter %fp_f32\n"
+               "           %func1_entry = OpLabel\n"
+               "                          OpStore %a %c_f32_5\n"
+               "                          OpStore %f1 %c_f32_2\n"
+               "             %func1_ret = OpLoad %f32 %a\n"
+               "                          OpReturnValue %func1_ret\n"
+               "                          OpFunctionEnd\n";
+
+       fragments["decoration"] =
+               "                          OpMemberDecorate %Output 0 Offset 0\n"
+               "                          OpDecorate %Output BufferBlock\n"
+               "                          OpDecorate %dataOutput DescriptorSet 0\n"
+               "                          OpDecorate %dataOutput Binding 0\n"
+               "                          OpDecorate %f0 Aliased\n"
+               "                          OpDecorate %f1 Aliased\n"
+               "                          OpDecorate %a Aliased\n";
+
+       fragments["testfun"] =
+               "             %test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
+               "                 %param = OpFunctionParameter %v4f32\n"
+               "                 %entry = OpLabel\n"
+               "                     %b = OpVariable %fp_f32 Function %c_f32_0\n"
+               "                     %o = OpVariable %fp_f32 Function %c_f32_0\n"
+               "                  %ret0 = OpFunctionCall %f32 %func0 %a\n"
+               "                          OpStore %o %ret0\n"
+               "                  %ret1 = OpFunctionCall %f32 %func1 %b\n"
+               "                 %o_val = OpLoad %f32 %o\n"
+               "                   %sum = OpFAdd %f32 %o_val %ret1\n"
+               "               %out_ptr = OpAccessChain %_ptr_Uniform_f32 %dataOutput %c_i32_0\n"
+               "                          OpStore %out_ptr %sum\n"
+               "                          OpReturnValue %param\n"
+               "                          OpFunctionEnd\n";
+
+       getDefaultColors(defaultColors);
+       expectedOutput.push_back(7.0f);
+       requiredFeatures.coreFeatures.vertexPipelineStoresAndAtomics = DE_TRUE;
+       resources.outputs.push_back(std::make_pair(vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, BufferSp(new Float32Buffer(expectedOutput))));
+
+       createTestsForAllStages("param_to_global", defaultColors, defaultColors, fragments, resources, extensions, group, requiredFeatures);
+}
+
+void addGraphicsPointerBufferMemoryTest (tcu::TestCaseGroup* group)
+{
+       const int                       numFloats                       = 16;
+       map<string, string>     fragments;
+       RGBA                            defaultColors[4];
+       GraphicsResources       resources;
+       vector<string>          extensions;
+       vector<float>           expectedOutput;
+       VulkanFeatures          requiredFeatures;
+
+       // Implements the following pseudo GLSL shader:
+       //
+       //      layout (binding = 0) buffer Output
+       //      {
+       //              vec4 arr0[2];
+       //              vec4 arr1[];
+       //      } dataOutput;
+       //
+       //      void func0(vec4* f0[2], uint i)
+       //      {
+       //              f0[i] = vec4(5.0);
+       //      }
+       //
+       //      void func1(vec4* f1[], uint i)
+       //      {
+       //              f1[i] = vec4(2.0);
+       //      }
+       //
+       //      vec4 test_code(vec4 param)
+       //      {
+       //              func0(dataOutput.arr0, idx);
+       //              func1(dataOutput.arr1, idx);
+       //              return param;
+       //      }
+       fragments["pre_main"]   =
+               "           %arr_v4f32_2 = OpTypeArray %v4f32 %c_u32_2\n"
+               "          %arr_v4f32_rt = OpTypeRuntimeArray %v4f32\n"
+               "       %arr_v4f32_2_ptr = OpTypePointer StorageBuffer %arr_v4f32_2\n"
+               "      %arr_v4f32_rt_ptr = OpTypePointer StorageBuffer %arr_v4f32_rt\n"
+               "            %func0_decl = OpTypeFunction %void %arr_v4f32_2_ptr\n"
+               "            %func1_decl = OpTypeFunction %void %arr_v4f32_rt_ptr\n"
+               "               %c_f32_5 = OpConstant %f32 5\n"
+               "               %c_f32_2 = OpConstant %f32 2\n"
+               "             %c_v4f32_5 = OpConstantComposite %v4f32 %c_f32_5 %c_f32_5 %c_f32_5 %c_f32_5\n"
+               "             %c_v4f32_2 = OpConstantComposite %v4f32 %c_f32_2 %c_f32_2 %c_f32_2 %c_f32_2\n"
+               "                %Output = OpTypeStruct %arr_v4f32_2 %arr_v4f32_rt\n"
+               "        %_ptr_sb_Output = OpTypePointer StorageBuffer %Output\n"
+               "            %dataOutput = OpVariable %_ptr_sb_Output StorageBuffer\n"
+               "         %_ptr_sb_v4f32 = OpTypePointer StorageBuffer %v4f32\n"
+               "                 %func0 = OpFunction %void None %func0_decl\n"
+               "                    %f0 = OpFunctionParameter %arr_v4f32_2_ptr\n"
+               "            %func0Entry = OpLabel\n"
+               "              %out_ptr0 = OpAccessChain %_ptr_sb_v4f32 %f0 %c_i32_0\n"
+               "                          OpStore %out_ptr0 %c_v4f32_5\n"
+               "              %out_ptr1 = OpAccessChain %_ptr_sb_v4f32 %f0 %c_i32_1\n"
+               "                          OpStore %out_ptr1 %c_v4f32_5\n"
+               "                          OpReturn\n"
+               "                          OpFunctionEnd\n"
+               "                 %func1 = OpFunction %void None %func1_decl\n"
+               "                    %f1 = OpFunctionParameter %arr_v4f32_rt_ptr\n"
+               "            %func1Entry = OpLabel\n"
+               "              %out_ptr2 = OpAccessChain %_ptr_sb_v4f32 %f1 %c_i32_0\n"
+               "                          OpStore %out_ptr2 %c_v4f32_2\n"
+               "              %out_ptr3 = OpAccessChain %_ptr_sb_v4f32 %f1 %c_i32_1\n"
+               "                          OpStore %out_ptr3 %c_v4f32_2\n"
+               "                          OpReturn\n"
+               "                          OpFunctionEnd\n";
+
+       fragments["decoration"] =
+               "                          OpMemberDecorate %Output 0 Offset 0\n"
+               "                          OpMemberDecorate %Output 1 Offset 32\n"
+               "                          OpDecorate %Output Block\n"
+               "                          OpDecorate %dataOutput DescriptorSet 0\n"
+               "                          OpDecorate %dataOutput Binding 0\n"
+               "                          OpDecorate %f0 DescriptorSet 0\n"
+               "                          OpDecorate %f0 Binding 0\n"
+               "                          OpDecorate %f1 DescriptorSet 0\n"
+               "                          OpDecorate %f1 Binding 0\n"
+               "                          OpDecorate %arr_v4f32_2 ArrayStride 16\n"
+               "                          OpDecorate %arr_v4f32_rt ArrayStride 16\n";
+
+       fragments["testfun"]    =
+               "             %test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
+               "                 %param = OpFunctionParameter %v4f32\n"
+               "                 %entry = OpLabel\n"
+               "                  %ptr0 = OpAccessChain %arr_v4f32_2_ptr %dataOutput %c_i32_0\n"
+               "                  %ptr1 = OpAccessChain %arr_v4f32_rt_ptr %dataOutput %c_i32_1\n"
+               "                  %ret0 = OpFunctionCall %void %func0 %ptr0\n"
+               "                  %ret1 = OpFunctionCall %void %func1 %ptr1\n"
+               "                          OpReturnValue %param\n"
+               "                          OpFunctionEnd\n";
+
+       fragments["extension"]  =
+               "OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n";
+
+       getDefaultColors(defaultColors);
+
+       for (deUint32 numIdx = 0; numIdx < numFloats / 2; ++numIdx)
+               expectedOutput.push_back(5.0f);
+       for (deUint32 numIdx = 0; numIdx < numFloats / 2; ++numIdx)
+               expectedOutput.push_back(2.0f);
+
+       requiredFeatures.coreFeatures.vertexPipelineStoresAndAtomics = DE_TRUE;
+       resources.outputs.push_back(std::make_pair(vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, BufferSp(new Float32Buffer(expectedOutput))));
+
+       createTestsForAllStages("buffer_memory", defaultColors, defaultColors, fragments, resources, extensions, group, requiredFeatures);
+}
+
+void addGraphicsPointerBufferMemoryVariablePointersTest (tcu::TestCaseGroup* group)
+{
+       const int                       numFloats                       = 16;
+       map<string, string>     fragments;
+       RGBA                            defaultColors[4];
+       GraphicsResources       resources;
+       vector<string>          extensions;
+       vector<float>           expectedOutput;
+       VulkanFeatures          requiredFeatures;
+
+       // Implements the following pseudo GLSL shader:
+       //
+       //      layout (binding = 0) buffer Output
+       //      {
+       //              vec4 arr0[2];
+       //              vec4 arr1[];
+       //      } dataOutput;
+       //
+       //      void func0(vec4* f0[2], uint i)
+       //      {
+       //              f0[i] = vec4(5.0);
+       //      }
+       //
+       //      void func1(vec4* f1[], uint i)
+       //      {
+       //              f1[i] = vec4(2.0);
+       //      }
+       //
+       //      vec4 test_code(vec4 param)
+       //      {
+       //              func0(dataOutput.arr0, idx);
+       //              func1(dataOutput.arr1, idx);
+       //              return param;
+       //      }
+       fragments["pre_main"]   =
+               "           %arr_v4f32_2 = OpTypeArray %v4f32 %c_u32_2\n"
+               "          %arr_v4f32_rt = OpTypeRuntimeArray %v4f32\n"
+               "       %arr_v4f32_2_ptr = OpTypePointer StorageBuffer %arr_v4f32_2\n"
+               "      %arr_v4f32_rt_ptr = OpTypePointer StorageBuffer %arr_v4f32_rt\n"
+               "            %func0_decl = OpTypeFunction %void %arr_v4f32_2_ptr\n"
+               "            %func1_decl = OpTypeFunction %void %arr_v4f32_rt_ptr\n"
+               "               %c_f32_5 = OpConstant %f32 5\n"
+               "               %c_f32_2 = OpConstant %f32 2\n"
+               "             %c_v4f32_5 = OpConstantComposite %v4f32 %c_f32_5 %c_f32_5 %c_f32_5 %c_f32_5\n"
+               "             %c_v4f32_2 = OpConstantComposite %v4f32 %c_f32_2 %c_f32_2 %c_f32_2 %c_f32_2\n"
+               "                %Output = OpTypeStruct %arr_v4f32_2 %arr_v4f32_rt\n"
+               "        %_ptr_sb_Output = OpTypePointer StorageBuffer %Output\n"
+               "            %dataOutput = OpVariable %_ptr_sb_Output StorageBuffer\n"
+               "         %_ptr_sb_v4f32 = OpTypePointer StorageBuffer %v4f32\n"
+               "                 %func0 = OpFunction %void None %func0_decl\n"
+               "                    %f0 = OpFunctionParameter %arr_v4f32_2_ptr\n"
+               "            %func0Entry = OpLabel\n"
+               "              %out_ptr0 = OpAccessChain %_ptr_sb_v4f32 %f0 %c_i32_0\n"
+               "                          OpStore %out_ptr0 %c_v4f32_5\n"
+               "              %out_ptr1 = OpAccessChain %_ptr_sb_v4f32 %f0 %c_i32_1\n"
+               "                          OpStore %out_ptr1 %c_v4f32_5\n"
+               "                          OpReturn\n"
+               "                          OpFunctionEnd\n"
+               "                 %func1 = OpFunction %void None %func1_decl\n"
+               "                    %f1 = OpFunctionParameter %arr_v4f32_rt_ptr\n"
+               "            %func1Entry = OpLabel\n"
+               "              %out_ptr2 = OpAccessChain %_ptr_sb_v4f32 %f1 %c_i32_0\n"
+               "                          OpStore %out_ptr2 %c_v4f32_2\n"
+               "              %out_ptr3 = OpAccessChain %_ptr_sb_v4f32 %f1 %c_i32_1\n"
+               "                          OpStore %out_ptr3 %c_v4f32_2\n"
+               "                          OpReturn\n"
+               "                          OpFunctionEnd\n";
+
+       fragments["decoration"] =
+               "                          OpMemberDecorate %Output 0 Offset 0\n"
+               "                          OpMemberDecorate %Output 1 Offset 32\n"
+               "                          OpDecorate %Output Block\n"
+               "                          OpDecorate %dataOutput DescriptorSet 0\n"
+               "                          OpDecorate %dataOutput Binding 0\n"
+               "                          OpDecorate %arr_v4f32_2 ArrayStride 16\n"
+               "                          OpDecorate %arr_v4f32_rt ArrayStride 16\n";
+
+       fragments["testfun"]    =
+               "             %test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
+               "                 %param = OpFunctionParameter %v4f32\n"
+               "                 %entry = OpLabel\n"
+               "                  %ptr0 = OpAccessChain %arr_v4f32_2_ptr %dataOutput %c_i32_0\n"
+               "                  %ptr1 = OpAccessChain %arr_v4f32_rt_ptr %dataOutput %c_i32_1\n"
+               "                  %ret0 = OpFunctionCall %void %func0 %ptr0\n"
+               "                  %ret1 = OpFunctionCall %void %func1 %ptr1\n"
+               "                          OpReturnValue %param\n"
+               "                          OpFunctionEnd\n";
+
+       fragments["extension"]  =
+               "OpExtension \"SPV_KHR_variable_pointers\"\n"
+               "OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n";
+
+       fragments["capability"] =
+               "OpCapability VariablePointersStorageBuffer\n";
+
+       getDefaultColors(defaultColors);
+
+       for (deUint32 numIdx = 0; numIdx < numFloats / 2; ++numIdx)
+               expectedOutput.push_back(5.0f);
+       for (deUint32 numIdx = 0; numIdx < numFloats / 2; ++numIdx)
+               expectedOutput.push_back(2.0f);
+
+       extensions.push_back("VK_KHR_variable_pointers");
+       requiredFeatures.coreFeatures.vertexPipelineStoresAndAtomics = DE_TRUE;
+       resources.outputs.push_back(std::make_pair(vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, BufferSp(new Float32Buffer(expectedOutput))));
+
+       createTestsForAllStages("buffer_memory_variable_pointers", defaultColors, defaultColors, fragments, resources, extensions, group, requiredFeatures);
+}
+
+} // anonymous
+
+tcu::TestCaseGroup* createPointerParameterComputeGroup (tcu::TestContext& testCtx)
+{
+       de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(testCtx, "pointer_parameter", "Compute tests for pointer as function parameter."));
+       addComputePointerParamToParamTest(group.get());
+       addComputePointerParamToGlobalTest(group.get());
+       addComputePointerBufferMemoryTest(group.get());
+       addComputePointerBufferMemoryVariablePointersTest(group.get());
+       addComputePointerWorkgroupMemoryVariablePointersTest(group.get());
+
+       return group.release();
+}
+
+tcu::TestCaseGroup* createPointerParameterGraphicsGroup (tcu::TestContext& testCtx)
+{
+       de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(testCtx, "pointer_parameter", "Graphics tests for pointer as function parameter."));
+       addGraphicsPointerParamToParamTest(group.get());
+       addGraphicsPointerParamToGlobalTest(group.get());
+       addGraphicsPointerBufferMemoryTest(group.get());
+       addGraphicsPointerBufferMemoryVariablePointersTest(group.get());
+
+       return group.release();
+}
+
+} // SpirVAssembly
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmPointerParameterTests.hpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmPointerParameterTests.hpp
new file mode 100644 (file)
index 0000000..0579fd1
--- /dev/null
@@ -0,0 +1,40 @@
+#ifndef _VKTSPVASMPOINTERPARAMETERTESTS_HPP
+#define _VKTSPVASMPOINTERPARAMETERTESTS_HPP
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2018 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief SPIR-V Assembly Tests for pointers as function parameters.
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "tcuTestCase.hpp"
+
+namespace vkt
+{
+namespace SpirVAssembly
+{
+
+tcu::TestCaseGroup*    createPointerParameterComputeGroup      (tcu::TestContext& testCtx);
+tcu::TestCaseGroup*    createPointerParameterGraphicsGroup     (tcu::TestContext& testCtx);
+
+} // SpirVAssembly
+} // vkt
+
+#endif // _VKTSPVASMPOINTERPARAMETERTESTS_HPP
index 04b11ff..e7a9008 100644 (file)
@@ -211440,6 +211440,11 @@ dEQP-VK.spirv_assembly.instruction.compute.opname.entry_rdc.main_is_entry
 dEQP-VK.spirv_assembly.instruction.compute.opname.entry_rdc.func_is_main
 dEQP-VK.spirv_assembly.instruction.compute.opname.entry_rdc.func_is_not_main
 dEQP-VK.spirv_assembly.instruction.compute.opname.entry_rdc.func_is_entry
+dEQP-VK.spirv_assembly.instruction.compute.pointer_parameter.param_to_param
+dEQP-VK.spirv_assembly.instruction.compute.pointer_parameter.param_to_global
+dEQP-VK.spirv_assembly.instruction.compute.pointer_parameter.buffer_memory
+dEQP-VK.spirv_assembly.instruction.compute.pointer_parameter.buffer_memory_variable_pointers
+dEQP-VK.spirv_assembly.instruction.compute.pointer_parameter.workgroup_memory_variable_pointers
 dEQP-VK.spirv_assembly.instruction.graphics.cross_stage.basic_type.flat
 dEQP-VK.spirv_assembly.instruction.graphics.cross_stage.basic_type.no_perspective
 dEQP-VK.spirv_assembly.instruction.graphics.cross_stage.basic_type.relaxedprecision
@@ -215622,6 +215627,26 @@ dEQP-VK.spirv_assembly.instruction.graphics.fconvert.float64_to_float32_tessc
 dEQP-VK.spirv_assembly.instruction.graphics.fconvert.float64_to_float32_tesse
 dEQP-VK.spirv_assembly.instruction.graphics.fconvert.float64_to_float32_geom
 dEQP-VK.spirv_assembly.instruction.graphics.fconvert.float64_to_float32_frag
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.global_to_param_vert
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.global_to_param_tessc
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.global_to_param_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.global_to_param_geom
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.global_to_param_frag
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.param_to_global_vert
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.param_to_global_tessc
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.param_to_global_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.param_to_global_geom
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.param_to_global_frag
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_vert
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_tessc
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_geom
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_frag
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_variable_pointers_vert
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_variable_pointers_tessc
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_variable_pointers_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_variable_pointers_geom
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_variable_pointers_frag
 dEQP-VK.spirv_assembly.type.scalar.i16.negate_vert
 dEQP-VK.spirv_assembly.type.scalar.i16.negate_tessc
 dEQP-VK.spirv_assembly.type.scalar.i16.negate_tesse
index 76b59bd..d3b1a4d 100644 (file)
@@ -211440,6 +211440,11 @@ dEQP-VK.spirv_assembly.instruction.compute.opname.entry_rdc.main_is_entry
 dEQP-VK.spirv_assembly.instruction.compute.opname.entry_rdc.func_is_main
 dEQP-VK.spirv_assembly.instruction.compute.opname.entry_rdc.func_is_not_main
 dEQP-VK.spirv_assembly.instruction.compute.opname.entry_rdc.func_is_entry
+dEQP-VK.spirv_assembly.instruction.compute.pointer_parameter.param_to_param
+dEQP-VK.spirv_assembly.instruction.compute.pointer_parameter.param_to_global
+dEQP-VK.spirv_assembly.instruction.compute.pointer_parameter.buffer_memory
+dEQP-VK.spirv_assembly.instruction.compute.pointer_parameter.buffer_memory_variable_pointers
+dEQP-VK.spirv_assembly.instruction.compute.pointer_parameter.workgroup_memory_variable_pointers
 dEQP-VK.spirv_assembly.instruction.graphics.cross_stage.basic_type.flat
 dEQP-VK.spirv_assembly.instruction.graphics.cross_stage.basic_type.no_perspective
 dEQP-VK.spirv_assembly.instruction.graphics.cross_stage.basic_type.relaxedprecision
@@ -215622,6 +215627,26 @@ dEQP-VK.spirv_assembly.instruction.graphics.fconvert.float64_to_float32_tessc
 dEQP-VK.spirv_assembly.instruction.graphics.fconvert.float64_to_float32_tesse
 dEQP-VK.spirv_assembly.instruction.graphics.fconvert.float64_to_float32_geom
 dEQP-VK.spirv_assembly.instruction.graphics.fconvert.float64_to_float32_frag
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.global_to_param_vert
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.global_to_param_tessc
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.global_to_param_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.global_to_param_geom
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.global_to_param_frag
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.param_to_global_vert
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.param_to_global_tessc
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.param_to_global_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.param_to_global_geom
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.param_to_global_frag
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_vert
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_tessc
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_geom
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_frag
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_variable_pointers_vert
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_variable_pointers_tessc
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_variable_pointers_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_variable_pointers_geom
+dEQP-VK.spirv_assembly.instruction.graphics.pointer_parameter.buffer_memory_variable_pointers_frag
 dEQP-VK.spirv_assembly.type.scalar.i16.negate_vert
 dEQP-VK.spirv_assembly.type.scalar.i16.negate_tessc
 dEQP-VK.spirv_assembly.type.scalar.i16.negate_tesse