Merge pull request #1717 from jeffbolznv/getBufferReferenceAlignment
Move getBufferReferenceAlignment to be a method of TType
This commit is contained in:
commit
40c16ec0b3
@ -209,15 +209,6 @@ protected:
|
|||||||
builder.addExtension(ext);
|
builder.addExtension(ext);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int getBufferReferenceAlignment(const glslang::TType &type) const {
|
|
||||||
if (type.getBasicType() == glslang::EbtReference) {
|
|
||||||
return type.getReferentType()->getQualifier().hasBufferReferenceAlign() ?
|
|
||||||
(1u << type.getReferentType()->getQualifier().layoutBufferReferenceAlign) : 16u;
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
glslang::SpvOptions& options;
|
glslang::SpvOptions& options;
|
||||||
spv::Function* shaderEntry;
|
spv::Function* shaderEntry;
|
||||||
spv::Function* currentFunction;
|
spv::Function* currentFunction;
|
||||||
@ -1735,7 +1726,7 @@ bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::T
|
|||||||
}
|
}
|
||||||
|
|
||||||
// normal case for indexing array or structure or block
|
// normal case for indexing array or structure or block
|
||||||
builder.accessChainPush(builder.makeIntConstant(spvIndex), TranslateCoherent(node->getLeft()->getType()), getBufferReferenceAlignment(node->getLeft()->getType()));
|
builder.accessChainPush(builder.makeIntConstant(spvIndex), TranslateCoherent(node->getLeft()->getType()), node->getLeft()->getType().getBufferReferenceAlignment());
|
||||||
|
|
||||||
// Add capabilities here for accessing PointSize and clip/cull distance.
|
// Add capabilities here for accessing PointSize and clip/cull distance.
|
||||||
// We have deferred generation of associated capabilities until now.
|
// We have deferred generation of associated capabilities until now.
|
||||||
@ -1774,7 +1765,7 @@ bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::T
|
|||||||
TranslateCoherent(node->getLeft()->getType()),
|
TranslateCoherent(node->getLeft()->getType()),
|
||||||
glslangIntermediate->getBaseAlignmentScalar(node->getLeft()->getType(), dummySize));
|
glslangIntermediate->getBaseAlignmentScalar(node->getLeft()->getType(), dummySize));
|
||||||
} else
|
} else
|
||||||
builder.accessChainPush(index, TranslateCoherent(node->getLeft()->getType()), getBufferReferenceAlignment(node->getLeft()->getType()));
|
builder.accessChainPush(index, TranslateCoherent(node->getLeft()->getType()), node->getLeft()->getType().getBufferReferenceAlignment());
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
case glslang::EOpVectorSwizzle:
|
case glslang::EOpVectorSwizzle:
|
||||||
@ -2503,7 +2494,7 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
|
|||||||
|
|
||||||
// Point to the first element of the array.
|
// Point to the first element of the array.
|
||||||
builder.accessChainPush(elementId, TranslateCoherent(glslangOperands[arg]->getAsTyped()->getType()),
|
builder.accessChainPush(elementId, TranslateCoherent(glslangOperands[arg]->getAsTyped()->getType()),
|
||||||
getBufferReferenceAlignment(glslangOperands[arg]->getAsTyped()->getType()));
|
glslangOperands[arg]->getAsTyped()->getType().getBufferReferenceAlignment());
|
||||||
|
|
||||||
spv::Builder::AccessChain::CoherentFlags coherentFlags = builder.getAccessChain().coherentFlags;
|
spv::Builder::AccessChain::CoherentFlags coherentFlags = builder.getAccessChain().coherentFlags;
|
||||||
unsigned int alignment = builder.getAccessChain().alignment;
|
unsigned int alignment = builder.getAccessChain().alignment;
|
||||||
@ -3518,7 +3509,7 @@ spv::Id TGlslangToSpvTraverser::accessChainLoad(const glslang::TType& type)
|
|||||||
coherentFlags |= TranslateCoherent(type);
|
coherentFlags |= TranslateCoherent(type);
|
||||||
|
|
||||||
unsigned int alignment = builder.getAccessChain().alignment;
|
unsigned int alignment = builder.getAccessChain().alignment;
|
||||||
alignment |= getBufferReferenceAlignment(type);
|
alignment |= type.getBufferReferenceAlignment();
|
||||||
|
|
||||||
spv::Id loadedId = builder.accessChainLoad(TranslatePrecisionDecoration(type),
|
spv::Id loadedId = builder.accessChainLoad(TranslatePrecisionDecoration(type),
|
||||||
TranslateNonUniformDecoration(type.getQualifier()),
|
TranslateNonUniformDecoration(type.getQualifier()),
|
||||||
@ -3585,7 +3576,7 @@ void TGlslangToSpvTraverser::accessChainStore(const glslang::TType& type, spv::I
|
|||||||
coherentFlags |= TranslateCoherent(type);
|
coherentFlags |= TranslateCoherent(type);
|
||||||
|
|
||||||
unsigned int alignment = builder.getAccessChain().alignment;
|
unsigned int alignment = builder.getAccessChain().alignment;
|
||||||
alignment |= getBufferReferenceAlignment(type);
|
alignment |= type.getBufferReferenceAlignment();
|
||||||
|
|
||||||
builder.accessChainStore(rvalue,
|
builder.accessChainStore(rvalue,
|
||||||
spv::MemoryAccessMask(TranslateMemoryAccess(coherentFlags) & ~spv::MemoryAccessMakePointerVisibleKHRMask),
|
spv::MemoryAccessMask(TranslateMemoryAccess(coherentFlags) & ~spv::MemoryAccessMakePointerVisibleKHRMask),
|
||||||
@ -3635,7 +3626,7 @@ void TGlslangToSpvTraverser::multiTypeStore(const glslang::TType& type, spv::Id
|
|||||||
// set up the target storage
|
// set up the target storage
|
||||||
builder.clearAccessChain();
|
builder.clearAccessChain();
|
||||||
builder.setAccessChainLValue(lValue);
|
builder.setAccessChainLValue(lValue);
|
||||||
builder.accessChainPush(builder.makeIntConstant(index), TranslateCoherent(type), getBufferReferenceAlignment(type));
|
builder.accessChainPush(builder.makeIntConstant(index), TranslateCoherent(type), type.getBufferReferenceAlignment());
|
||||||
|
|
||||||
// store the member
|
// store the member
|
||||||
multiTypeStore(glslangElementType, elementRValue);
|
multiTypeStore(glslangElementType, elementRValue);
|
||||||
@ -3655,7 +3646,7 @@ void TGlslangToSpvTraverser::multiTypeStore(const glslang::TType& type, spv::Id
|
|||||||
// set up the target storage
|
// set up the target storage
|
||||||
builder.clearAccessChain();
|
builder.clearAccessChain();
|
||||||
builder.setAccessChainLValue(lValue);
|
builder.setAccessChainLValue(lValue);
|
||||||
builder.accessChainPush(builder.makeIntConstant(m), TranslateCoherent(type), getBufferReferenceAlignment(type));
|
builder.accessChainPush(builder.makeIntConstant(m), TranslateCoherent(type), type.getBufferReferenceAlignment());
|
||||||
|
|
||||||
// store the member
|
// store the member
|
||||||
multiTypeStore(glslangMemberType, memberRValue);
|
multiTypeStore(glslangMemberType, memberRValue);
|
||||||
|
@ -2188,6 +2188,16 @@ public:
|
|||||||
return ! operator==(right);
|
return ! operator==(right);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int getBufferReferenceAlignment() const
|
||||||
|
{
|
||||||
|
if (getBasicType() == glslang::EbtReference) {
|
||||||
|
return getReferentType()->getQualifier().hasBufferReferenceAlign() ?
|
||||||
|
(1u << getReferentType()->getQualifier().layoutBufferReferenceAlign) : 16u;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Require consumer to pick between deep copy and shallow copy.
|
// Require consumer to pick between deep copy and shallow copy.
|
||||||
TType(const TType& type);
|
TType(const TType& type);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user