SPV: Address #989: Don't add Location to built-ins when automapping.

This commit is contained in:
John Kessenich 2017-07-14 05:52:31 -06:00
Родитель 56d2b9904e
Коммит 91e69c03bd
4 изменённых файлов: 80 добавлений и 1 удалений

Просмотреть файл

@ -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

Просмотреть файл

@ -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

Просмотреть файл

@ -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;
}

Просмотреть файл

@ -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