Use the block encoder class to store uniform offsets.
This will allow us to use the same code path for assigning register
information in all places. Because of this it fixes some long-broken
dEQP struct uniform tests.
BUG=angle:466
BUG=angle:505
Change-Id: I4161a388503aa09bbe2d21ff47bfb3352ec93881
Reviewed-on: https://chromium-review.googlesource.com/207255
Reviewed-by: Zhenyao Mo <zmo@chromium.org>
Tested-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Nicolas Capens <capn@chromium.org>
diff --git a/src/common/blocklayout.cpp b/src/common/blocklayout.cpp
index 9bf14cb..0bdfa1e 100644
--- a/src/common/blocklayout.cpp
+++ b/src/common/blocklayout.cpp
@@ -161,6 +161,12 @@
{
}
+HLSLBlockEncoder::HLSLBlockEncoder(ShShaderOutput outputType)
+ : BlockLayoutEncoder(NULL),
+ mEncoderStrategy(GetStrategyFor(outputType))
+{
+}
+
void HLSLBlockEncoder::enterAggregateType()
{
nextRegister();
@@ -245,6 +251,16 @@
mCurrentOffset += (numRegisters * ComponentsPerRegister);
}
+HLSLBlockEncoder::HLSLBlockEncoderStrategy HLSLBlockEncoder::GetStrategyFor(ShShaderOutput outputType)
+{
+ switch (outputType)
+ {
+ case SH_HLSL9_OUTPUT: return ENCODE_LOOSE;
+ case SH_HLSL11_OUTPUT: return ENCODE_PACKED;
+ default: UNREACHABLE(); return ENCODE_PACKED;
+ }
+}
+
size_t HLSLInterfaceBlockDataSize(const sh::InterfaceBlock &interfaceBlock)
{
switch (interfaceBlock.layout)
@@ -353,10 +369,7 @@
unsigned int HLSLVariableRegisterCount(const Uniform &variable, ShShaderOutput outputType)
{
- HLSLBlockEncoder encoder(NULL,
- outputType == SH_HLSL9_OUTPUT ? HLSLBlockEncoder::ENCODE_LOOSE
- : HLSLBlockEncoder::ENCODE_PACKED);
-
+ HLSLBlockEncoder encoder(outputType);
HLSLVariableRegisterCount(variable, &encoder);
const size_t registerBytes = (encoder.BytesPerComponent * encoder.ComponentsPerRegister);