WIP: HLSL: Fix ordering defect if global SB decl after fn param
This change propagates the storage qualifier from the buffer object to its contained array type so that isStructBufferType() realizes it is one. That propagation was happening before only for global variable declarations, so compilation defects would result if the use of a function parameter happened before a global declaration. This fixes that case, whether or not there ever is a global declaration, and regardless of the relative order. This changes the hlsl.structbuffer.fn.frag test to exercise the alternate order. There are no differences to generated SPIR-V for the cases which successfully compiled before.
This commit is contained in:
@@ -1874,6 +1874,7 @@ bool HlslGrammar::acceptStructBufferType(TType& type)
|
||||
TArraySizes unsizedArray;
|
||||
unsizedArray.addInnerSize(UnsizedArraySize);
|
||||
templateType->newArraySizes(unsizedArray);
|
||||
templateType->getQualifier().storage = storage;
|
||||
|
||||
// field name is canonical for all structbuffers
|
||||
templateType->setFieldName("@data");
|
||||
|
||||
@@ -5223,10 +5223,6 @@ void HlslParseContext::shareStructBufferType(TType& type)
|
||||
return compareQualifiers(lhs, rhs) && lhs == rhs;
|
||||
};
|
||||
|
||||
// TString typeName;
|
||||
// type.appendMangledName(typeName);
|
||||
// type.setTypeName(typeName);
|
||||
|
||||
// This is an exhaustive O(N) search, but real world shaders have
|
||||
// only a small number of these.
|
||||
for (int idx = 0; idx < int(structBufferTypes.size()); ++idx) {
|
||||
@@ -5241,8 +5237,6 @@ void HlslParseContext::shareStructBufferType(TType& type)
|
||||
TType* typeCopy = new TType;
|
||||
typeCopy->shallowCopy(type);
|
||||
structBufferTypes.push_back(typeCopy);
|
||||
|
||||
// structBuffTypes.push_back(type.getWritableStruct());
|
||||
}
|
||||
|
||||
void HlslParseContext::paramFix(TType& type)
|
||||
|
||||
Reference in New Issue
Block a user