Allow redeclaration of builtin interface blocks in mesh shader
Apart from allowing redeclaration of gl_MeshPerVertexNV and gl_MeshPerPrimitiveNV blocks, this change also - - Resize clip/cull perview distances based on static index use - Error out use of both single-view and per-view builtins - Add new gtests with redeclared blocks and edit existing test output - Fix couple of typos
This commit is contained in:
parent
ca042a0ffb
commit
035cbbe3d0
13 changed files with 875 additions and 305 deletions
|
|
@ -400,9 +400,21 @@ TIntermTyped* TParseContext::handleBracketDereference(const TSourceLoc& loc, TIn
|
|||
handleIoResizeArrayAccess(loc, base);
|
||||
|
||||
if (index->getQualifier().isFrontEndConstant()) {
|
||||
if (base->getType().isUnsizedArray())
|
||||
if (base->getType().isUnsizedArray()) {
|
||||
base->getWritableType().updateImplicitArraySize(indexValue + 1);
|
||||
else
|
||||
#ifdef NV_EXTENSIONS
|
||||
// For 2D per-view builtin arrays, update the inner dimension size in parent type
|
||||
if (base->getQualifier().isPerView() && base->getQualifier().builtIn != EbvNone) {
|
||||
TIntermBinary* binaryNode = base->getAsBinaryNode();
|
||||
if (binaryNode) {
|
||||
TType& leftType = binaryNode->getLeft()->getWritableType();
|
||||
TArraySizes& arraySizes = *leftType.getArraySizes();
|
||||
assert(arraySizes.getNumDims() == 2);
|
||||
arraySizes.setDimSize(1, std::max(arraySizes.getDimSize(1), indexValue + 1));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
} else
|
||||
checkIndex(loc, base->getType(), indexValue);
|
||||
result = intermediate.addIndex(EOpIndexDirect, base, index, loc);
|
||||
} else {
|
||||
|
|
@ -813,6 +825,8 @@ TIntermTyped* TParseContext::handleDotDereference(const TSourceLoc& loc, TInterm
|
|||
TIntermTyped* index = intermediate.addConstantUnion(member, loc);
|
||||
result = intermediate.addIndex(EOpIndexDirectStruct, base, index, loc);
|
||||
result->setType(*(*fields)[member].type);
|
||||
if ((*fields)[member].type->getQualifier().isIo())
|
||||
intermediate.addIoAccessed(field);
|
||||
}
|
||||
} else
|
||||
error(loc, "no such field in structure", field.c_str(), "");
|
||||
|
|
@ -4059,10 +4073,31 @@ void TParseContext::redeclareBuiltinBlock(const TSourceLoc& loc, TTypeList& newT
|
|||
error(memberLoc, "cannot redeclare block member with a different type", member->type->getFieldName().c_str(), "");
|
||||
if (oldType.isArray() != newType.isArray())
|
||||
error(memberLoc, "cannot change arrayness of redeclared block member", member->type->getFieldName().c_str(), "");
|
||||
else if (! oldType.sameArrayness(newType) && oldType.isSizedArray())
|
||||
else if (! oldType.getQualifier().isPerView() && ! oldType.sameArrayness(newType) && oldType.isSizedArray())
|
||||
error(memberLoc, "cannot change array size of redeclared block member", member->type->getFieldName().c_str(), "");
|
||||
else if (newType.isArray())
|
||||
else if (! oldType.getQualifier().isPerView() && newType.isArray())
|
||||
arrayLimitCheck(loc, member->type->getFieldName(), newType.getOuterArraySize());
|
||||
#ifdef NV_EXTENSIONS
|
||||
if (oldType.getQualifier().isPerView() && ! newType.getQualifier().isPerView())
|
||||
error(memberLoc, "missing perviewNV qualifier to redeclared block member", member->type->getFieldName().c_str(), "");
|
||||
else if (! oldType.getQualifier().isPerView() && newType.getQualifier().isPerView())
|
||||
error(memberLoc, "cannot add perviewNV qualifier to redeclared block member", member->type->getFieldName().c_str(), "");
|
||||
else if (newType.getQualifier().isPerView()) {
|
||||
if (oldType.getArraySizes()->getNumDims() != newType.getArraySizes()->getNumDims())
|
||||
error(memberLoc, "cannot change arrayness of redeclared block member", member->type->getFieldName().c_str(), "");
|
||||
else if (! newType.isUnsizedArray() && newType.getOuterArraySize() != resources.maxMeshViewCountNV)
|
||||
error(loc, "mesh view output array size must be gl_MaxMeshViewCountNV or implicitly sized", "[]", "");
|
||||
else if (newType.getArraySizes()->getNumDims() == 2) {
|
||||
int innerDimSize = newType.getArraySizes()->getDimSize(1);
|
||||
arrayLimitCheck(memberLoc, member->type->getFieldName(), innerDimSize);
|
||||
oldType.getArraySizes()->setDimSize(1, innerDimSize);
|
||||
}
|
||||
}
|
||||
if (oldType.getQualifier().isPerPrimitive() && ! newType.getQualifier().isPerPrimitive())
|
||||
error(memberLoc, "missing perprimitiveNV qualifier to redeclared block member", member->type->getFieldName().c_str(), "");
|
||||
else if (! oldType.getQualifier().isPerPrimitive() && newType.getQualifier().isPerPrimitive())
|
||||
error(memberLoc, "cannot add perprimitiveNV qualifier to redeclared block member", member->type->getFieldName().c_str(), "");
|
||||
#endif
|
||||
if (newType.getQualifier().isMemory())
|
||||
error(memberLoc, "cannot add memory qualifier to redeclared block member", member->type->getFieldName().c_str(), "");
|
||||
if (newType.getQualifier().hasNonXfbLayout())
|
||||
|
|
@ -4421,6 +4456,12 @@ void TParseContext::arrayLimitCheck(const TSourceLoc& loc, const TString& identi
|
|||
limitCheck(loc, size, "gl_MaxClipDistances", "gl_ClipDistance array size");
|
||||
else if (identifier.compare("gl_CullDistance") == 0)
|
||||
limitCheck(loc, size, "gl_MaxCullDistances", "gl_CullDistance array size");
|
||||
#ifdef NV_EXTENSIONS
|
||||
else if (identifier.compare("gl_ClipDistancePerViewNV") == 0)
|
||||
limitCheck(loc, size, "gl_MaxClipDistances", "gl_ClipDistancePerViewNV array size");
|
||||
else if (identifier.compare("gl_CullDistancePerViewNV") == 0)
|
||||
limitCheck(loc, size, "gl_MaxCullDistances", "gl_CullDistancePerViewNV array size");
|
||||
#endif
|
||||
}
|
||||
|
||||
// See if the provided value is less than or equal to the symbol indicated by limit,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue