diff --git a/Test/baseResults/spv.noBuiltInLoc.vert.out b/Test/baseResults/spv.noBuiltInLoc.vert.out new file mode 100644 index 00000000..3d980bf0 --- /dev/null +++ b/Test/baseResults/spv.noBuiltInLoc.vert.out @@ -0,0 +1,51 @@ +spv.noBuiltInLoc.vert +// Module Version 10000 +// Generated by (magic number): 80001 +// Id's are bound by 23 + + Capability Shader + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Vertex 4 "main" 9 11 18 + Source GLSL 450 + Name 4 "main" + Name 9 "bar" + Name 11 "foo" + Name 16 "gl_PerVertex" + MemberName 16(gl_PerVertex) 0 "gl_Position" + MemberName 16(gl_PerVertex) 1 "gl_PointSize" + MemberName 16(gl_PerVertex) 2 "gl_ClipDistance" + MemberName 16(gl_PerVertex) 3 "gl_CullDistance" + Name 18 "" + Decorate 9(bar) Location 0 + Decorate 11(foo) Location 0 + MemberDecorate 16(gl_PerVertex) 0 BuiltIn Position + MemberDecorate 16(gl_PerVertex) 1 BuiltIn PointSize + MemberDecorate 16(gl_PerVertex) 2 BuiltIn ClipDistance + MemberDecorate 16(gl_PerVertex) 3 BuiltIn CullDistance + Decorate 16(gl_PerVertex) Block + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeFloat 32 + 7: TypeVector 6(float) 4 + 8: TypePointer Output 7(fvec4) + 9(bar): 8(ptr) Variable Output + 10: TypePointer Input 7(fvec4) + 11(foo): 10(ptr) Variable Input + 13: TypeInt 32 0 + 14: 13(int) Constant 1 + 15: TypeArray 6(float) 14 +16(gl_PerVertex): TypeStruct 7(fvec4) 6(float) 15 15 + 17: TypePointer Output 16(gl_PerVertex) + 18: 17(ptr) Variable Output + 19: TypeInt 32 1 + 20: 19(int) Constant 0 + 4(main): 2 Function None 3 + 5: Label + 12: 7(fvec4) Load 11(foo) + Store 9(bar) 12 + 21: 7(fvec4) Load 11(foo) + 22: 8(ptr) AccessChain 18 20 + Store 22 21 + Return + FunctionEnd diff --git a/Test/runtests b/Test/runtests index 29a20833..2a8542f4 100755 --- a/Test/runtests +++ b/Test/runtests @@ -103,6 +103,8 @@ diff -b $BASEDIR/hlsl.multiDescriptorSet.frag.out $TARGETDIR/hlsl.multiDescripto echo Testing SPV no location $EXE -V -C spv.noLocation.vert > $TARGETDIR/spv.noLocation.vert.out diff -b $BASEDIR/spv.noLocation.vert.out $TARGETDIR/spv.noLocation.vert.out || HASERROR=1 +$EXE -H --aml spv.noBuiltInLoc.vert > $TARGETDIR/spv.noBuiltInLoc.vert.out +diff -b $BASEDIR/spv.noBuiltInLoc.vert.out $TARGETDIR/spv.noBuiltInLoc.vert.out || HASERROR=1 # # Testing debug information diff --git a/Test/spv.noBuiltInLoc.vert b/Test/spv.noBuiltInLoc.vert new file mode 100644 index 00000000..e7548927 --- /dev/null +++ b/Test/spv.noBuiltInLoc.vert @@ -0,0 +1,13 @@ +#version 450 core + +layout(location = 0) +in vec4 foo; + +layout(location = 0) +out vec4 bar; + +void main() +{ + bar = foo; + gl_Position = foo; +} \ No newline at end of file diff --git a/glslang/MachineIndependent/iomapper.cpp b/glslang/MachineIndependent/iomapper.cpp index 88c9bd60..ea5f1611 100644 --- a/glslang/MachineIndependent/iomapper.cpp +++ b/glslang/MachineIndependent/iomapper.cpp @@ -413,9 +413,22 @@ struct TDefaultIoResolverBase : public glslang::TIoMapResolver } int resolveInOutLocation(EShLanguage /*stage*/, const char* /*name*/, const TType& type, bool /*is_live*/) override { - if (!doAutoLocationMapping || type.getQualifier().hasLocation()) + // kick out of not doing this + if (!doAutoLocationMapping) return -1; + // no locations added if already present, or a built-in variable + if (type.getQualifier().hasLocation() || type.getQualifier().builtIn != EbvNone) + return -1; + + // no locations on blocks of built-in variables + if (type.isStruct()) { + if (type.getStruct()->size() < 1) + return -1; + if ((*type.getStruct())[0].type->getQualifier().builtIn != EbvNone) + return -1; + } + // Placeholder. // TODO: It would be nice to flesh this out using // intermediate->computeTypeLocationSize(type), or functions that call it like