HLSL: strip off array dimension when assign locations of arrayed IO.
This commit is contained in:
parent
194f0f39ec
commit
7afe1344ca
@ -60,14 +60,14 @@ output primitive = line_strip
|
|||||||
0:? 'VertexID' (layout( location=0) in 3-element array of uint)
|
0:? 'VertexID' (layout( location=0) in 3-element array of uint)
|
||||||
0:16 move second child to first child ( temp 3-element array of uint)
|
0:16 move second child to first child ( temp 3-element array of uint)
|
||||||
0:? 'test' ( temp 3-element array of uint)
|
0:? 'test' ( temp 3-element array of uint)
|
||||||
0:? 'test' (layout( location=3) in 3-element array of uint)
|
0:? 'test' (layout( location=1) in 3-element array of uint)
|
||||||
0:16 Function Call: @main(u1[3];u1[3];struct-PSInput-f1-i11; ( temp void)
|
0:16 Function Call: @main(u1[3];u1[3];struct-PSInput-f1-i11; ( temp void)
|
||||||
0:? 'VertexID' ( temp 3-element array of uint)
|
0:? 'VertexID' ( temp 3-element array of uint)
|
||||||
0:? 'test' ( temp 3-element array of uint)
|
0:? 'test' ( temp 3-element array of uint)
|
||||||
0:? 'OutputStream' ( temp structure{ temp float myfloat, temp int something})
|
0:? 'OutputStream' ( temp structure{ temp float myfloat, temp int something})
|
||||||
0:? Linker Objects
|
0:? Linker Objects
|
||||||
0:? 'VertexID' (layout( location=0) in 3-element array of uint)
|
0:? 'VertexID' (layout( location=0) in 3-element array of uint)
|
||||||
0:? 'test' (layout( location=3) in 3-element array of uint)
|
0:? 'test' (layout( location=1) in 3-element array of uint)
|
||||||
|
|
||||||
|
|
||||||
Linked geometry stage:
|
Linked geometry stage:
|
||||||
@ -134,14 +134,14 @@ output primitive = line_strip
|
|||||||
0:? 'VertexID' (layout( location=0) in 3-element array of uint)
|
0:? 'VertexID' (layout( location=0) in 3-element array of uint)
|
||||||
0:16 move second child to first child ( temp 3-element array of uint)
|
0:16 move second child to first child ( temp 3-element array of uint)
|
||||||
0:? 'test' ( temp 3-element array of uint)
|
0:? 'test' ( temp 3-element array of uint)
|
||||||
0:? 'test' (layout( location=3) in 3-element array of uint)
|
0:? 'test' (layout( location=1) in 3-element array of uint)
|
||||||
0:16 Function Call: @main(u1[3];u1[3];struct-PSInput-f1-i11; ( temp void)
|
0:16 Function Call: @main(u1[3];u1[3];struct-PSInput-f1-i11; ( temp void)
|
||||||
0:? 'VertexID' ( temp 3-element array of uint)
|
0:? 'VertexID' ( temp 3-element array of uint)
|
||||||
0:? 'test' ( temp 3-element array of uint)
|
0:? 'test' ( temp 3-element array of uint)
|
||||||
0:? 'OutputStream' ( temp structure{ temp float myfloat, temp int something})
|
0:? 'OutputStream' ( temp structure{ temp float myfloat, temp int something})
|
||||||
0:? Linker Objects
|
0:? Linker Objects
|
||||||
0:? 'VertexID' (layout( location=0) in 3-element array of uint)
|
0:? 'VertexID' (layout( location=0) in 3-element array of uint)
|
||||||
0:? 'test' (layout( location=3) in 3-element array of uint)
|
0:? 'test' (layout( location=1) in 3-element array of uint)
|
||||||
|
|
||||||
// Module Version 10000
|
// Module Version 10000
|
||||||
// Generated by (magic number): 80001
|
// Generated by (magic number): 80001
|
||||||
@ -173,7 +173,7 @@ output primitive = line_strip
|
|||||||
Name 53 "param"
|
Name 53 "param"
|
||||||
Name 55 "param"
|
Name 55 "param"
|
||||||
Decorate 45(VertexID) Location 0
|
Decorate 45(VertexID) Location 0
|
||||||
Decorate 48(test) Location 3
|
Decorate 48(test) Location 1
|
||||||
2: TypeVoid
|
2: TypeVoid
|
||||||
3: TypeFunction 2
|
3: TypeFunction 2
|
||||||
6: TypeInt 32 0
|
6: TypeInt 32 0
|
||||||
|
@ -1419,15 +1419,24 @@ void HlslParseContext::fixBuiltInArrayType(TType& type)
|
|||||||
void HlslParseContext::assignLocations(TVariable& variable)
|
void HlslParseContext::assignLocations(TVariable& variable)
|
||||||
{
|
{
|
||||||
const auto assignLocation = [&](TVariable& variable) {
|
const auto assignLocation = [&](TVariable& variable) {
|
||||||
const TQualifier& qualifier = variable.getType().getQualifier();
|
const TType& type = variable.getType();
|
||||||
|
const TQualifier& qualifier = type.getQualifier();
|
||||||
if (qualifier.storage == EvqVaryingIn || qualifier.storage == EvqVaryingOut) {
|
if (qualifier.storage == EvqVaryingIn || qualifier.storage == EvqVaryingOut) {
|
||||||
if (qualifier.builtIn == EbvNone) {
|
if (qualifier.builtIn == EbvNone) {
|
||||||
|
// Strip off the outer array dimension for those having an extra one.
|
||||||
|
int size;
|
||||||
|
if (type.isArray() && qualifier.isArrayedIo(language)) {
|
||||||
|
TType elementType(type, 0);
|
||||||
|
size = intermediate.computeTypeLocationSize(elementType);
|
||||||
|
} else
|
||||||
|
size = intermediate.computeTypeLocationSize(type);
|
||||||
|
|
||||||
if (qualifier.storage == EvqVaryingIn) {
|
if (qualifier.storage == EvqVaryingIn) {
|
||||||
variable.getWritableType().getQualifier().layoutLocation = nextInLocation;
|
variable.getWritableType().getQualifier().layoutLocation = nextInLocation;
|
||||||
nextInLocation += intermediate.computeTypeLocationSize(variable.getType());
|
nextInLocation += size;
|
||||||
} else {
|
} else {
|
||||||
variable.getWritableType().getQualifier().layoutLocation = nextOutLocation;
|
variable.getWritableType().getQualifier().layoutLocation = nextOutLocation;
|
||||||
nextOutLocation += intermediate.computeTypeLocationSize(variable.getType());
|
nextOutLocation += size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1892,10 +1901,14 @@ void HlslParseContext::remapEntryPointIO(TFunction& function, TVariable*& return
|
|||||||
ioVariable->getWritableType().setStruct(newLists->second.output);
|
ioVariable->getWritableType().setStruct(newLists->second.output);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (storage == EvqVaryingIn)
|
if (storage == EvqVaryingIn) {
|
||||||
correctInput(ioVariable->getWritableType().getQualifier());
|
correctInput(ioVariable->getWritableType().getQualifier());
|
||||||
else
|
if (language == EShLangTessEvaluation)
|
||||||
|
if (!ioVariable->getType().isArray())
|
||||||
|
ioVariable->getWritableType().getQualifier().patch = true;
|
||||||
|
} else {
|
||||||
correctOutput(ioVariable->getWritableType().getQualifier());
|
correctOutput(ioVariable->getWritableType().getQualifier());
|
||||||
|
}
|
||||||
ioVariable->getWritableType().getQualifier().storage = storage;
|
ioVariable->getWritableType().getQualifier().storage = storage;
|
||||||
return ioVariable;
|
return ioVariable;
|
||||||
};
|
};
|
||||||
@ -4212,6 +4225,10 @@ void HlslParseContext::handleSemantic(TSourceLoc loc, TQualifier& qualifier, TBu
|
|||||||
case EbvStencilRef:
|
case EbvStencilRef:
|
||||||
error(loc, "unimplemented; need ARB_shader_stencil_export", "SV_STENCILREF", "");
|
error(loc, "unimplemented; need ARB_shader_stencil_export", "SV_STENCILREF", "");
|
||||||
break;
|
break;
|
||||||
|
case EbvTessLevelInner:
|
||||||
|
case EbvTessLevelOuter:
|
||||||
|
qualifier.patch = true;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -7254,6 +7271,8 @@ bool HlslParseContext::isInputBuiltIn(const TQualifier& qualifier) const
|
|||||||
case EbvTessLevelInner:
|
case EbvTessLevelInner:
|
||||||
case EbvTessLevelOuter:
|
case EbvTessLevelOuter:
|
||||||
return language == EShLangTessEvaluation;
|
return language == EShLangTessEvaluation;
|
||||||
|
case EbvTessCoord:
|
||||||
|
return language == EShLangTessEvaluation;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user