From 559a5f1d82039c4adcc6ac8089255ed3ed1e14ad Mon Sep 17 00:00:00 2001 From: Pankaj Mistry Date: Mon, 26 Sep 2022 12:45:39 -0700 Subject: [PATCH] Fix for bug #3019 : That incorrectly removed perVertexEXT qualifier as arrayed IO This bug got introduced as part of EXT_mesh_shader changes 228c672 Also updated barycentric test cases to add coverage for multiple pervertexEXT array inputs --- .../spv.fragmentShaderBarycentric2.frag.out | 28 +++++++++++++++++-- .../spv.fragmentShaderBarycentric4.frag.out | 28 +++++++++++++++++-- Test/spv.fragmentShaderBarycentric2.frag | 6 ++++ Test/spv.fragmentShaderBarycentric4.frag | 5 ++++ glslang/Include/Types.h | 2 +- 5 files changed, 64 insertions(+), 5 deletions(-) diff --git a/Test/baseResults/spv.fragmentShaderBarycentric2.frag.out b/Test/baseResults/spv.fragmentShaderBarycentric2.frag.out index c0976763..23926cd7 100644 --- a/Test/baseResults/spv.fragmentShaderBarycentric2.frag.out +++ b/Test/baseResults/spv.fragmentShaderBarycentric2.frag.out @@ -1,14 +1,14 @@ spv.fragmentShaderBarycentric2.frag // Module Version 10000 // Generated by (magic number): 8000a -// Id's are bound by 42 +// Id's are bound by 62 Capability Shader Capability FragmentBarycentricKHR Extension "SPV_NV_fragment_shader_barycentric" 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "main" 8 11 20 + EntryPoint Fragment 4 "main" 8 11 20 44 ExecutionMode 4 OriginUpperLeft Source ESSL 320 SourceExtension "GL_NV_fragment_shader_barycentric" @@ -16,10 +16,13 @@ spv.fragmentShaderBarycentric2.frag Name 8 "value" Name 11 "gl_BaryCoordNoPerspNV" Name 20 "vertexIDs" + Name 44 "vertexIDs2" Decorate 8(value) Location 1 Decorate 11(gl_BaryCoordNoPerspNV) BuiltIn BaryCoordNoPerspKHR Decorate 20(vertexIDs) Location 0 Decorate 20(vertexIDs) PerVertexKHR + Decorate 44(vertexIDs2) Location 1 + Decorate 44(vertexIDs2) PerVertexKHR 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 @@ -41,6 +44,7 @@ spv.fragmentShaderBarycentric2.frag 29: 21(int) Constant 1 34: 12(int) Constant 2 37: 21(int) Constant 2 + 44(vertexIDs2): 19(ptr) Variable Input 4(main): 2 Function None 3 5: Label 15: 14(ptr) AccessChain 11(gl_BaryCoordNoPerspNV) 13 @@ -61,5 +65,25 @@ spv.fragmentShaderBarycentric2.frag 40: 6(float) FMul 36 39 41: 6(float) FAdd 33 40 Store 8(value) 41 + 42: 14(ptr) AccessChain 11(gl_BaryCoordNoPerspNV) 13 + 43: 6(float) Load 42 + 45: 14(ptr) AccessChain 44(vertexIDs2) 22 + 46: 6(float) Load 45 + 47: 6(float) FMul 43 46 + 48: 14(ptr) AccessChain 11(gl_BaryCoordNoPerspNV) 26 + 49: 6(float) Load 48 + 50: 14(ptr) AccessChain 44(vertexIDs2) 29 + 51: 6(float) Load 50 + 52: 6(float) FMul 49 51 + 53: 6(float) FAdd 47 52 + 54: 14(ptr) AccessChain 11(gl_BaryCoordNoPerspNV) 34 + 55: 6(float) Load 54 + 56: 14(ptr) AccessChain 44(vertexIDs2) 37 + 57: 6(float) Load 56 + 58: 6(float) FMul 55 57 + 59: 6(float) FAdd 53 58 + 60: 6(float) Load 8(value) + 61: 6(float) FAdd 60 59 + Store 8(value) 61 Return FunctionEnd diff --git a/Test/baseResults/spv.fragmentShaderBarycentric4.frag.out b/Test/baseResults/spv.fragmentShaderBarycentric4.frag.out index aaac6a44..9218646d 100644 --- a/Test/baseResults/spv.fragmentShaderBarycentric4.frag.out +++ b/Test/baseResults/spv.fragmentShaderBarycentric4.frag.out @@ -1,14 +1,14 @@ spv.fragmentShaderBarycentric4.frag // Module Version 10000 // Generated by (magic number): 8000a -// Id's are bound by 42 +// Id's are bound by 62 Capability Shader Capability FragmentBarycentricKHR Extension "SPV_KHR_fragment_shader_barycentric" 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "main" 8 11 20 + EntryPoint Fragment 4 "main" 8 11 20 44 ExecutionMode 4 OriginUpperLeft Source ESSL 320 SourceExtension "GL_EXT_fragment_shader_barycentric" @@ -16,10 +16,13 @@ spv.fragmentShaderBarycentric4.frag Name 8 "value" Name 11 "gl_BaryCoordNoPerspEXT" Name 20 "vertexIDs" + Name 44 "vertexIDs2" Decorate 8(value) Location 1 Decorate 11(gl_BaryCoordNoPerspEXT) BuiltIn BaryCoordNoPerspKHR Decorate 20(vertexIDs) Location 0 Decorate 20(vertexIDs) PerVertexKHR + Decorate 44(vertexIDs2) Location 1 + Decorate 44(vertexIDs2) PerVertexKHR 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 @@ -41,6 +44,7 @@ spv.fragmentShaderBarycentric4.frag 29: 21(int) Constant 1 34: 12(int) Constant 2 37: 21(int) Constant 2 + 44(vertexIDs2): 19(ptr) Variable Input 4(main): 2 Function None 3 5: Label 15: 14(ptr) AccessChain 11(gl_BaryCoordNoPerspEXT) 13 @@ -61,5 +65,25 @@ spv.fragmentShaderBarycentric4.frag 40: 6(float) FMul 36 39 41: 6(float) FAdd 33 40 Store 8(value) 41 + 42: 14(ptr) AccessChain 11(gl_BaryCoordNoPerspEXT) 13 + 43: 6(float) Load 42 + 45: 14(ptr) AccessChain 44(vertexIDs2) 22 + 46: 6(float) Load 45 + 47: 6(float) FMul 43 46 + 48: 14(ptr) AccessChain 11(gl_BaryCoordNoPerspEXT) 26 + 49: 6(float) Load 48 + 50: 14(ptr) AccessChain 44(vertexIDs2) 29 + 51: 6(float) Load 50 + 52: 6(float) FMul 49 51 + 53: 6(float) FAdd 47 52 + 54: 14(ptr) AccessChain 11(gl_BaryCoordNoPerspEXT) 34 + 55: 6(float) Load 54 + 56: 14(ptr) AccessChain 44(vertexIDs2) 37 + 57: 6(float) Load 56 + 58: 6(float) FMul 55 57 + 59: 6(float) FAdd 53 58 + 60: 6(float) Load 8(value) + 61: 6(float) FAdd 60 59 + Store 8(value) 61 Return FunctionEnd diff --git a/Test/spv.fragmentShaderBarycentric2.frag b/Test/spv.fragmentShaderBarycentric2.frag index 4682e4ef..2db44af3 100644 --- a/Test/spv.fragmentShaderBarycentric2.frag +++ b/Test/spv.fragmentShaderBarycentric2.frag @@ -4,6 +4,8 @@ precision highp float; layout(location = 0) pervertexNV in float vertexIDs[3]; +layout(location = 1) pervertexNV in float vertexIDs2[3]; + layout(location = 1) out float value; @@ -12,4 +14,8 @@ void main () { gl_BaryCoordNoPerspNV.y * vertexIDs[1] + gl_BaryCoordNoPerspNV.z * vertexIDs[2]); + value += (gl_BaryCoordNoPerspNV.x * vertexIDs2[0] + + gl_BaryCoordNoPerspNV.y * vertexIDs2[1] + + gl_BaryCoordNoPerspNV.z * vertexIDs2[2]); + } diff --git a/Test/spv.fragmentShaderBarycentric4.frag b/Test/spv.fragmentShaderBarycentric4.frag index 5b4510ec..fd4902f8 100644 --- a/Test/spv.fragmentShaderBarycentric4.frag +++ b/Test/spv.fragmentShaderBarycentric4.frag @@ -4,6 +4,7 @@ precision highp float; layout(location = 0) pervertexEXT in float vertexIDs[3]; +layout(location = 1) pervertexEXT in float vertexIDs2[3]; layout(location = 1) out float value; @@ -12,4 +13,8 @@ void main () { gl_BaryCoordNoPerspEXT.y * vertexIDs[1] + gl_BaryCoordNoPerspEXT.z * vertexIDs[2]); + value += (gl_BaryCoordNoPerspEXT.x * vertexIDs2[0] + + gl_BaryCoordNoPerspEXT.y * vertexIDs2[1] + + gl_BaryCoordNoPerspEXT.z * vertexIDs2[2]); + } diff --git a/glslang/Include/Types.h b/glslang/Include/Types.h index 05f90ac2..a6f47e84 100644 --- a/glslang/Include/Types.h +++ b/glslang/Include/Types.h @@ -875,7 +875,7 @@ public: case EShLangTessEvaluation: return ! patch && isPipeInput(); case EShLangFragment: - return pervertexNV && isPipeInput(); + return (pervertexNV || pervertexEXT) && isPipeInput(); case EShLangMesh: return ! perTaskNV && isPipeOutput();