Add UAV (image) binding offset and HLSL register support
This PR adds: 1. The "u" register class for RW* objects. 2. --shift-image-bindings (== --sib), analogous to --shift-texture-bindings etc. 3. Case insensitive reg classes. 4. Tests for above.
This commit is contained in:
parent
e5e58cfee3
commit
9088be4c07
13 changed files with 309 additions and 10 deletions
|
|
@ -1494,6 +1494,7 @@ void TShader::setEntryPoint(const char* entryPoint)
|
|||
|
||||
void TShader::setShiftSamplerBinding(unsigned int base) { intermediate->setShiftSamplerBinding(base); }
|
||||
void TShader::setShiftTextureBinding(unsigned int base) { intermediate->setShiftTextureBinding(base); }
|
||||
void TShader::setShiftImageBinding(unsigned int base) { intermediate->setShiftImageBinding(base); }
|
||||
void TShader::setShiftUboBinding(unsigned int base) { intermediate->setShiftUboBinding(base); }
|
||||
void TShader::setAutoMapBindings(bool map) { intermediate->setAutoMapBindings(map); }
|
||||
void TShader::setFlattenUniformArrays(bool flatten) { intermediate->setFlattenUniformArrays(flatten); }
|
||||
|
|
|
|||
|
|
@ -222,6 +222,7 @@ struct TDefaultIoResolver : public glslang::TIoMapResolver
|
|||
{
|
||||
int baseSamplerBinding;
|
||||
int baseTextureBinding;
|
||||
int baseImageBinding;
|
||||
int baseUboBinding;
|
||||
bool doAutoMapping;
|
||||
typedef std::vector<int> TSlotSet;
|
||||
|
|
@ -294,6 +295,9 @@ struct TDefaultIoResolver : public glslang::TIoMapResolver
|
|||
if (type.getQualifier().hasBinding()) {
|
||||
if (type.getBasicType() == glslang::EbtSampler) {
|
||||
const glslang::TSampler& sampler = type.getSampler();
|
||||
if (sampler.isImage())
|
||||
return reserveSlot(set, baseImageBinding + type.getQualifier().layoutBinding);
|
||||
|
||||
if (sampler.isPureSampler())
|
||||
return reserveSlot(set, baseSamplerBinding + type.getQualifier().layoutBinding);
|
||||
|
||||
|
|
@ -308,6 +312,9 @@ struct TDefaultIoResolver : public glslang::TIoMapResolver
|
|||
// first and now all are passed that do not have a binding and needs one
|
||||
if (type.getBasicType() == glslang::EbtSampler) {
|
||||
const glslang::TSampler& sampler = type.getSampler();
|
||||
if (sampler.isImage())
|
||||
return getFreeSlot(set, baseImageBinding);
|
||||
|
||||
if (sampler.isPureSampler())
|
||||
return getFreeSlot(set, baseSamplerBinding);
|
||||
|
||||
|
|
@ -339,9 +346,10 @@ bool TIoMapper::addStage(EShLanguage stage, TIntermediate &intermediate, TInfoSi
|
|||
// Trivial return if there is nothing to do.
|
||||
if (intermediate.getShiftSamplerBinding() == 0 &&
|
||||
intermediate.getShiftTextureBinding() == 0 &&
|
||||
intermediate.getShiftImageBinding() == 0 &&
|
||||
intermediate.getShiftUboBinding() == 0 &&
|
||||
intermediate.getAutoMapBindings() == false &&
|
||||
resolver == NULL)
|
||||
resolver == nullptr)
|
||||
return true;
|
||||
|
||||
if (intermediate.getNumEntryPoints() != 1 || intermediate.isRecursive())
|
||||
|
|
@ -353,9 +361,10 @@ bool TIoMapper::addStage(EShLanguage stage, TIntermediate &intermediate, TInfoSi
|
|||
|
||||
// if no resolver is provided, use the default resolver with the given shifts and auto map settings
|
||||
TDefaultIoResolver defaultResolver;
|
||||
if (resolver == NULL) {
|
||||
if (resolver == nullptr) {
|
||||
defaultResolver.baseSamplerBinding = intermediate.getShiftSamplerBinding();
|
||||
defaultResolver.baseTextureBinding = intermediate.getShiftTextureBinding();
|
||||
defaultResolver.baseImageBinding = intermediate.getShiftImageBinding();
|
||||
defaultResolver.baseUboBinding = intermediate.getShiftUboBinding();
|
||||
defaultResolver.doAutoMapping = intermediate.getAutoMapBindings();
|
||||
|
||||
|
|
|
|||
|
|
@ -144,6 +144,7 @@ public:
|
|||
multiStream(false), xfbMode(false),
|
||||
shiftSamplerBinding(0),
|
||||
shiftTextureBinding(0),
|
||||
shiftImageBinding(0),
|
||||
shiftUboBinding(0),
|
||||
autoMapBindings(false),
|
||||
flattenUniformArrays(false),
|
||||
|
|
@ -174,6 +175,8 @@ public:
|
|||
unsigned int getShiftSamplerBinding() const { return shiftSamplerBinding; }
|
||||
void setShiftTextureBinding(unsigned int shift) { shiftTextureBinding = shift; }
|
||||
unsigned int getShiftTextureBinding() const { return shiftTextureBinding; }
|
||||
void setShiftImageBinding(unsigned int shift) { shiftImageBinding = shift; }
|
||||
unsigned int getShiftImageBinding() const { return shiftImageBinding; }
|
||||
void setShiftUboBinding(unsigned int shift) { shiftUboBinding = shift; }
|
||||
unsigned int getShiftUboBinding() const { return shiftUboBinding; }
|
||||
void setAutoMapBindings(bool map) { autoMapBindings = map; }
|
||||
|
|
@ -403,6 +406,7 @@ protected:
|
|||
std::string entryPointMangledName;
|
||||
unsigned int shiftSamplerBinding;
|
||||
unsigned int shiftTextureBinding;
|
||||
unsigned int shiftImageBinding;
|
||||
unsigned int shiftUboBinding;
|
||||
bool autoMapBindings;
|
||||
bool flattenUniformArrays;
|
||||
|
|
|
|||
|
|
@ -306,6 +306,7 @@ public:
|
|||
void setEntryPoint(const char* entryPoint);
|
||||
void setShiftSamplerBinding(unsigned int base);
|
||||
void setShiftTextureBinding(unsigned int base);
|
||||
void setShiftImageBinding(unsigned int base);
|
||||
void setShiftUboBinding(unsigned int base);
|
||||
void setAutoMapBindings(bool map);
|
||||
void setFlattenUniformArrays(bool flatten);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue