From: Alexander Galazin Date: Thu, 27 Sep 2018 10:12:45 +0000 (+0200) Subject: Merge vk-gl-cts/master into vk-gl-cts/vulkan-cts-next-dev X-Git-Tag: upstream/1.3.5~1527^2~237 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=aee5d04bfb9e0cc0b4259371f5572c5bf233f82a;p=platform%2Fupstream%2FVK-GL-CTS.git Merge vk-gl-cts/master into vk-gl-cts/vulkan-cts-next-dev Change-Id: I42b6f770dedfa3eb77227e796d3fbbed365637bd --- aee5d04bfb9e0cc0b4259371f5572c5bf233f82a diff --cc external/fetch_sources.py index f967e95,4ccbaf8..5fee466 --- a/external/fetch_sources.py +++ b/external/fetch_sources.py @@@ -250,9 -250,9 +250,9 @@@ PACKAGES = "libpng", postExtract = postExtractLibpng), GitRepo( - "https://github.com/KhronosGroup/SPIRV-Tools.git", - None, - "1225324ae2450623e62621b91b380644f84c16d1", + "https://gitlab.khronos.org/spirv/spirv-tools.git", + "git@gitlab.khronos.org:spirv/spirv-tools.git", - "d48d559aec2195c9381c01f9b50a49977687dea4", ++ "c120a6d06f5aa93c8527862c903d2b9605ef0190", "spirv-tools"), GitRepo( "https://github.com/KhronosGroup/glslang.git", diff --cc external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmIndexingTests.cpp index e830a11,08a8d5e..2523a08 --- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmIndexingTests.cpp +++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmIndexingTests.cpp @@@ -563,6 -559,168 +563,167 @@@ void addGraphicsOutputComponentIndexing createTestsForAllStages("component", defaultColors, defaultColors, fragments, interfaces, noExtensions, testGroup); } + void addComputeIndexingNon16BaseAlignmentTests (tcu::TestCaseGroup* group) + { + tcu::TestContext& testCtx = group->getTestContext(); + de::MovePtr non16BaseAlignmentGroup (new tcu::TestCaseGroup(testCtx, "non16basealignment", "Tests for indexing array with base alignment less than 16.")); + de::Random rnd (deStringHash(group->getName())); + const int floatArraySize = 18; + const int numFloatArrays = 32; + + const int numInputFloats = floatArraySize * numFloatArrays; + const int numOutputFloats = numFloatArrays; + vector inputData; + VulkanFeatures vulkanFeatures; + vector outputData; + ComputeShaderSpec spec; - const ComputeTestFeatures features = COMPUTE_TEST_USES_NONE; + const ChainOp chainOps[] = { CHAIN_OP_ACCESS_CHAIN, CHAIN_OP_PTR_ACCESS_CHAIN }; + + // Input is the following structure: + // + // struct + // { + // struct + // { + // float f[18]; + // } struct1[]; + // } struct 0; + // + // Each instance calculates a sum of f[0]..f[17] and outputs the result into float array. + string shaderStr = + " OpCapability Shader\n" + " ${variablepointercaps:opt}\n" + " ${extensions:opt}\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 %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n" + " OpDecorate %input_array ArrayStride 4\n" + " OpDecorate %output_array ArrayStride 4\n"; + shaderStr += + " OpDecorate %runtimearr_struct1 ArrayStride " + de::toString(floatArraySize * 4) + "\n"; + shaderStr += + " OpDecorate %_ptr_struct1_sb ArrayStride " + de::toString(floatArraySize * 4) + "\n"; + shaderStr += + " OpMemberDecorate %Output 0 Offset 0\n" + " OpDecorate %Output Block\n" + " OpDecorate %dataOutput DescriptorSet 0\n" + " OpDecorate %dataOutput Binding 1\n" + " OpMemberDecorate %struct0 0 Offset 0\n" + " OpMemberDecorate %struct1 0 Offset 0\n" + " OpDecorate %struct0 Block\n" + " OpDecorate %dataInput DescriptorSet 0\n" + " OpDecorate %dataInput Binding 0\n" + " %void = OpTypeVoid\n" + " %3 = OpTypeFunction %void\n" + " %u32 = OpTypeInt 32 0\n" + " %i32 = OpTypeInt 32 1\n" + " %_ptr_Function_uint32 = OpTypePointer Function %u32\n" + " %v3uint32 = OpTypeVector %u32 3\n" + " %_ptr_Input_v3uint32 = OpTypePointer Input %v3uint32\n" + " %gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint32 Input\n" + " %_ptr_Input_uint32 = OpTypePointer Input %u32\n" + " %float = OpTypeFloat 32\n"; + for (deUint32 floatIdx = 0; floatIdx < floatArraySize + 1; ++floatIdx) + shaderStr += string("%uint_") + de::toString(floatIdx) + " = OpConstant %u32 " + de::toString(floatIdx) + "\n"; + shaderStr += + " %uint_" + de::toString(numFloatArrays) + " = OpConstant %u32 " + de::toString(numFloatArrays) + "\n"; + shaderStr += + " %input_array = OpTypeArray %float %uint_" + de::toString(floatArraySize) + "\n"; + shaderStr += + " %output_array = OpTypeArray %float %uint_" + de::toString(numFloatArrays) + "\n"; + shaderStr += + " %Output = OpTypeStruct %output_array\n" + " %_ptr_sb_Output = OpTypePointer StorageBuffer %Output\n" + " %dataOutput = OpVariable %_ptr_sb_Output StorageBuffer\n" + " %struct1 = OpTypeStruct %input_array\n" + " %runtimearr_struct1 = OpTypeRuntimeArray %struct1\n" + " %struct0 = OpTypeStruct %runtimearr_struct1\n" + " %_ptr_struct0_sb = OpTypePointer StorageBuffer %struct0\n" + " %_ptr_struct1_sb = OpTypePointer StorageBuffer %struct1\n" + " %_ptr_float_sb = OpTypePointer StorageBuffer %float\n" + " %dataInput = OpVariable %_ptr_struct0_sb StorageBuffer\n" + " %main = OpFunction %void None %3\n" + " %entry = OpLabel\n" + " %base = OpAccessChain %_ptr_struct1_sb %dataInput %uint_0 %uint_0\n" + " %invid_ptr = OpAccessChain %_ptr_Input_uint32 %gl_GlobalInvocationID %uint_0\n" + " %invid = OpLoad %u32 %invid_ptr\n"; + for (deUint32 floatIdx = 0; floatIdx < floatArraySize; ++floatIdx) + { + shaderStr += string("%dataPtr") + de::toString(floatIdx) + " = ${chainop} %invid %uint_0 %uint_" + de::toString(floatIdx) + "\n"; + if (floatIdx == 0) + { + shaderStr += "%acc0 = OpLoad %float %dataPtr0\n"; + } + else + { + shaderStr += string("%tmp") + de::toString(floatIdx) + " = OpLoad %float %dataPtr" + de::toString(floatIdx) + "\n"; + shaderStr += string("%acc") + de::toString(floatIdx) + " = OpFAdd %float %tmp" + de::toString(floatIdx) + " %acc" + de::toString(floatIdx - 1) + "\n"; + } + } + shaderStr += + " %outPtr = OpAccessChain %_ptr_float_sb %dataOutput %uint_0 %invid\n"; + shaderStr += + " OpStore %outPtr %acc" + de::toString(floatArraySize - 1) + "\n"; + shaderStr += + " OpReturn\n" + " OpFunctionEnd\n"; + + vulkanFeatures.extVariablePointers = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS_STORAGEBUFFER; + spec.extensions.push_back("VK_KHR_variable_pointers"); + + inputData.reserve(numInputFloats); + for (deUint32 numIdx = 0; numIdx < numInputFloats; ++numIdx) + inputData.push_back(rnd.getFloat()); + + spec.inputs.push_back(Resource(BufferSp(new Float32Buffer(inputData)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)); + + outputData.reserve(numOutputFloats); + for (deUint32 outputIdx = 0; outputIdx < numOutputFloats; ++outputIdx) + { + float f = 0.0f; + for (deUint32 arrIdx = 0; arrIdx < floatArraySize; ++arrIdx) + f += inputData[outputIdx * floatArraySize + arrIdx]; + outputData.push_back(f); + } + + spec.numWorkGroups = IVec3(numFloatArrays, 1, 1); + spec.requestedVulkanFeatures = vulkanFeatures; + spec.outputs.push_back(Resource(BufferSp(new Float32Buffer(outputData)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)); + + for (int chainOpIdx = 0; chainOpIdx < DE_LENGTH_OF_ARRAY(chainOps); ++chainOpIdx) + { + const ChainOp chainOp = chainOps[chainOpIdx]; + const string testName = chainOpTestNames[chainOp]; + map specs; + + specs["variablepointercaps"] = "OpCapability VariablePointersStorageBuffer"; + specs["extensions"] = "OpExtension \"SPV_KHR_variable_pointers\"\n " + "OpExtension \"SPV_KHR_storage_buffer_storage_class\""; + switch(chainOp) + { + case CHAIN_OP_ACCESS_CHAIN: + specs["chainop"] = "OpAccessChain %_ptr_float_sb %dataInput %uint_0 %uint_0"; + specs["chainop"] = "OpAccessChain %_ptr_float_sb %dataInput %uint_0"; + break; + case CHAIN_OP_PTR_ACCESS_CHAIN: + specs["chainop"] = "OpPtrAccessChain %_ptr_float_sb %base"; + break; + default: + DE_FATAL("Unexpected chain op"); + break; + } + + spec.assembly = StringTemplate(shaderStr).specialize(specs); + - non16BaseAlignmentGroup->addChild(new SpvAsmComputeShaderCase(testCtx, testName.c_str(), testName.c_str(), spec, features)); ++ non16BaseAlignmentGroup->addChild(new SpvAsmComputeShaderCase(testCtx, testName.c_str(), testName.c_str(), spec)); + } + + group->addChild(non16BaseAlignmentGroup.release()); + } + } // anonymous tcu::TestCaseGroup* createIndexingComputeGroup (tcu::TestContext& testCtx)