Take into account the number of locations taken up by a uniform
When assigning uniform locations it now takes into account the number of locations occupied by the type. For uniforms, all types except arrays and structs take up one location. For arrays the base location count is multiplied by the array dimensions and for structs it is the sum of the locations of each member.
This commit is contained in:
parent
1fe4a44759
commit
2d53904999
@ -443,7 +443,11 @@ struct TDefaultIoResolverBase : public glslang::TIoMapResolver
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return nextUniformLocation++;
|
int location = nextUniformLocation;
|
||||||
|
|
||||||
|
nextUniformLocation += TIntermediate::computeTypeUniformLocationSize(type);
|
||||||
|
|
||||||
|
return location;
|
||||||
}
|
}
|
||||||
bool validateInOut(EShLanguage /*stage*/, const char* /*name*/, const TType& /*type*/, bool /*is_live*/) override
|
bool validateInOut(EShLanguage /*stage*/, const char* /*name*/, const TType& /*type*/, bool /*is_live*/) override
|
||||||
{
|
{
|
||||||
|
|||||||
@ -962,6 +962,36 @@ int TIntermediate::computeTypeLocationSize(const TType& type, EShLanguage stage)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Same as computeTypeLocationSize but for uniforms
|
||||||
|
int TIntermediate::computeTypeUniformLocationSize(const TType& type)
|
||||||
|
{
|
||||||
|
// "Individual elements of a uniform array are assigned
|
||||||
|
// consecutive locations with the first element taking location
|
||||||
|
// location."
|
||||||
|
if (type.isArray()) {
|
||||||
|
// TODO: perf: this can be flattened by using getCumulativeArraySize(), and a deref that discards all arrayness
|
||||||
|
TType elementType(type, 0);
|
||||||
|
if (type.isImplicitlySizedArray()) {
|
||||||
|
// TODO: are there valid cases of having an implicitly-sized array with a location? If so, running this code too early.
|
||||||
|
return computeTypeUniformLocationSize(elementType);
|
||||||
|
} else
|
||||||
|
return type.getOuterArraySize() * computeTypeUniformLocationSize(elementType);
|
||||||
|
}
|
||||||
|
|
||||||
|
// "Each subsequent inner-most member or element gets incremental
|
||||||
|
// locations for the entire structure or array."
|
||||||
|
if (type.isStruct()) {
|
||||||
|
int size = 0;
|
||||||
|
for (int member = 0; member < (int)type.getStruct()->size(); ++member) {
|
||||||
|
TType memberType(type, member);
|
||||||
|
size += computeTypeUniformLocationSize(memberType);
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
// Accumulate xfb buffer ranges and check for collisions as the accumulation is done.
|
// Accumulate xfb buffer ranges and check for collisions as the accumulation is done.
|
||||||
//
|
//
|
||||||
// Returns < 0 if no collision, >= 0 if collision and the value returned is a colliding value.
|
// Returns < 0 if no collision, >= 0 if collision and the value returned is a colliding value.
|
||||||
|
|||||||
@ -590,6 +590,7 @@ public:
|
|||||||
int addUsedOffsets(int binding, int offset, int numOffsets);
|
int addUsedOffsets(int binding, int offset, int numOffsets);
|
||||||
bool addUsedConstantId(int id);
|
bool addUsedConstantId(int id);
|
||||||
static int computeTypeLocationSize(const TType&, EShLanguage);
|
static int computeTypeLocationSize(const TType&, EShLanguage);
|
||||||
|
static int computeTypeUniformLocationSize(const TType&);
|
||||||
|
|
||||||
bool setXfbBufferStride(int buffer, unsigned stride)
|
bool setXfbBufferStride(int buffer, unsigned stride)
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user