GLSL: Implement XFB for redeclared built-in blocks.
This commit is contained in:
parent
04f4566f28
commit
be3842f6ae
8 changed files with 133 additions and 47 deletions
|
|
@ -3478,17 +3478,24 @@ void TParseContext::redeclareBuiltinBlock(const TSourceLoc& loc, TTypeList& newT
|
|||
return;
|
||||
}
|
||||
|
||||
// Fix XFB stuff up, it applies to the order of the redeclaration, not
|
||||
// the order of the original members.
|
||||
if (currentBlockQualifier.storage == EvqVaryingOut && globalOutputDefaults.hasXfbBuffer()) {
|
||||
currentBlockQualifier.layoutXfbBuffer = globalOutputDefaults.layoutXfbBuffer;
|
||||
fixBlockXfbOffsets(currentBlockQualifier, newTypeList);
|
||||
}
|
||||
|
||||
// Edit and error check the container against the redeclaration
|
||||
// - remove unused members
|
||||
// - ensure remaining qualifiers/types match
|
||||
|
||||
TType& type = block->getWritableType();
|
||||
|
||||
#ifdef NV_EXTENSIONS
|
||||
// if gl_PerVertex is redeclared for the purpose of passing through "gl_Position"
|
||||
// for passthrough purpose, the redclared block should have the same qualifers as
|
||||
// for passthrough purpose, the redeclared block should have the same qualifers as
|
||||
// the current one
|
||||
if (currentBlockQualifier.layoutPassthrough)
|
||||
{
|
||||
if (currentBlockQualifier.layoutPassthrough) {
|
||||
type.getQualifier().layoutPassthrough = currentBlockQualifier.layoutPassthrough;
|
||||
type.getQualifier().storage = currentBlockQualifier.storage;
|
||||
type.getQualifier().layoutStream = currentBlockQualifier.layoutStream;
|
||||
|
|
@ -3529,10 +3536,12 @@ void TParseContext::redeclareBuiltinBlock(const TSourceLoc& loc, TTypeList& newT
|
|||
arrayLimitCheck(loc, member->type->getFieldName(), newType.getOuterArraySize());
|
||||
if (newType.getQualifier().isMemory())
|
||||
error(memberLoc, "cannot add memory qualifier to redeclared block member", member->type->getFieldName().c_str(), "");
|
||||
if (newType.getQualifier().hasLayout())
|
||||
error(memberLoc, "cannot add layout to redeclared block member", member->type->getFieldName().c_str(), "");
|
||||
if (newType.getQualifier().hasNonXfbLayout())
|
||||
error(memberLoc, "cannot add non-XFB layout to redeclared block member", member->type->getFieldName().c_str(), "");
|
||||
if (newType.getQualifier().patch)
|
||||
error(memberLoc, "cannot add patch to redeclared block member", member->type->getFieldName().c_str(), "");
|
||||
if (newType.getQualifier().hasXfbBuffer() && newType.getQualifier().layoutXfbBuffer != currentBlockQualifier.layoutXfbBuffer)
|
||||
error(memberLoc, "member cannot contradict block (or what block inherited from global)", "xfb_buffer", "");
|
||||
oldType.getQualifier().centroid = newType.getQualifier().centroid;
|
||||
oldType.getQualifier().sample = newType.getQualifier().sample;
|
||||
oldType.getQualifier().invariant = newType.getQualifier().invariant;
|
||||
|
|
@ -3540,6 +3549,7 @@ void TParseContext::redeclareBuiltinBlock(const TSourceLoc& loc, TTypeList& newT
|
|||
oldType.getQualifier().smooth = newType.getQualifier().smooth;
|
||||
oldType.getQualifier().flat = newType.getQualifier().flat;
|
||||
oldType.getQualifier().nopersp = newType.getQualifier().nopersp;
|
||||
oldType.getQualifier().layoutXfbOffset = newType.getQualifier().layoutXfbOffset;
|
||||
|
||||
if (oldType.isImplicitlySizedArray() && newType.isExplicitlySizedArray())
|
||||
oldType.changeOuterArraySize(newType.getOuterArraySize());
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue