Store multiple register indices per uniform.
TRAC #20948
Issue=337
Signed-off-by: Daniel Koch
Author: Nicolas Capens
git-svn-id: https://angleproject.googlecode.com/svn/trunk@1136 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Program.cpp b/src/libGLESv2/Program.cpp
index 0e48a9f..058bc6a 100644
--- a/src/libGLESv2/Program.cpp
+++ b/src/libGLESv2/Program.cpp
@@ -2060,8 +2060,8 @@
float vector[D3D9_MAX_FLOAT_CONSTANTS * 4];
BOOL boolVector[D3D9_MAX_BOOL_CONSTANTS];
- if (targetUniform->ps.registerCount && targetUniform->ps.registerSet == D3DXRS_FLOAT4 ||
- targetUniform->vs.registerCount && targetUniform->vs.registerSet == D3DXRS_FLOAT4)
+ if (targetUniform->ps.registerCount && targetUniform->ps.float4Index >= 0 ||
+ targetUniform->vs.registerCount && targetUniform->vs.float4Index >= 0)
{
ASSERT(count <= D3D9_MAX_FLOAT_CONSTANTS);
for (int i = 0; i < count; i++)
@@ -2080,11 +2080,11 @@
}
}
- if (targetUniform->ps.registerCount && targetUniform->ps.registerSet == D3DXRS_BOOL ||
- targetUniform->vs.registerCount && targetUniform->vs.registerSet == D3DXRS_BOOL)
+ if (targetUniform->ps.registerCount && targetUniform->ps.boolIndex >= 0 ||
+ targetUniform->vs.registerCount && targetUniform->vs.boolIndex >= 0)
{
- int psCount = targetUniform->ps.registerSet == D3DXRS_BOOL ? targetUniform->ps.registerCount : 0;
- int vsCount = targetUniform->vs.registerSet == D3DXRS_BOOL ? targetUniform->vs.registerCount : 0;
+ int psCount = targetUniform->ps.boolIndex >= 0 ? targetUniform->ps.registerCount : 0;
+ int vsCount = targetUniform->vs.boolIndex >= 0 ? targetUniform->vs.registerCount : 0;
int copyCount = std::min(count * width, std::max(psCount, vsCount));
ASSERT(copyCount <= D3D9_MAX_BOOL_CONSTANTS);
for (int i = 0; i < copyCount; i++)
@@ -2095,28 +2095,28 @@
if (targetUniform->ps.registerCount)
{
- if (targetUniform->ps.registerSet == D3DXRS_FLOAT4)
+ if (targetUniform->ps.float4Index >= 0)
{
- mDevice->SetPixelShaderConstantF(targetUniform->ps.registerIndex, vector, targetUniform->ps.registerCount);
+ mDevice->SetPixelShaderConstantF(targetUniform->ps.float4Index, vector, targetUniform->ps.registerCount);
}
- else if (targetUniform->ps.registerSet == D3DXRS_BOOL)
+
+ if (targetUniform->ps.boolIndex >= 0)
{
- mDevice->SetPixelShaderConstantB(targetUniform->ps.registerIndex, boolVector, targetUniform->ps.registerCount);
+ mDevice->SetPixelShaderConstantB(targetUniform->ps.boolIndex, boolVector, targetUniform->ps.registerCount);
}
- else UNREACHABLE();
}
if (targetUniform->vs.registerCount)
{
- if (targetUniform->vs.registerSet == D3DXRS_FLOAT4)
+ if (targetUniform->vs.float4Index >= 0)
{
- mDevice->SetVertexShaderConstantF(targetUniform->vs.registerIndex, vector, targetUniform->vs.registerCount);
+ mDevice->SetVertexShaderConstantF(targetUniform->vs.float4Index, vector, targetUniform->vs.registerCount);
}
- else if (targetUniform->vs.registerSet == D3DXRS_BOOL)
+
+ if (targetUniform->vs.boolIndex >= 0)
{
- mDevice->SetVertexShaderConstantB(targetUniform->vs.registerIndex, boolVector, targetUniform->vs.registerCount);
+ mDevice->SetVertexShaderConstantB(targetUniform->vs.boolIndex, boolVector, targetUniform->vs.registerCount);
}
- else UNREACHABLE();
}
}
@@ -2124,12 +2124,12 @@
{
if (targetUniform->ps.registerCount)
{
- mDevice->SetPixelShaderConstantF(targetUniform->ps.registerIndex, v, targetUniform->ps.registerCount);
+ mDevice->SetPixelShaderConstantF(targetUniform->ps.float4Index, v, targetUniform->ps.registerCount);
}
if (targetUniform->vs.registerCount)
{
- mDevice->SetVertexShaderConstantF(targetUniform->vs.registerIndex, v, targetUniform->vs.registerCount);
+ mDevice->SetVertexShaderConstantF(targetUniform->vs.float4Index, v, targetUniform->vs.registerCount);
}
return true;
@@ -2147,9 +2147,9 @@
if (targetUniform->ps.registerCount)
{
- if (targetUniform->ps.registerSet == D3DXRS_SAMPLER)
+ if (targetUniform->ps.samplerIndex >= 0)
{
- unsigned int firstIndex = targetUniform->ps.registerIndex;
+ unsigned int firstIndex = targetUniform->ps.samplerIndex;
for (int i = 0; i < count; i++)
{
@@ -2164,16 +2164,16 @@
}
else
{
- ASSERT(targetUniform->ps.registerSet == D3DXRS_FLOAT4);
- mDevice->SetPixelShaderConstantF(targetUniform->ps.registerIndex, (const float*)vector, targetUniform->ps.registerCount);
+ ASSERT(targetUniform->ps.float4Index >= 0);
+ mDevice->SetPixelShaderConstantF(targetUniform->ps.float4Index, (const float*)vector, targetUniform->ps.registerCount);
}
}
if (targetUniform->vs.registerCount)
{
- if (targetUniform->vs.registerSet == D3DXRS_SAMPLER)
+ if (targetUniform->vs.samplerIndex >= 0)
{
- unsigned int firstIndex = targetUniform->vs.registerIndex;
+ unsigned int firstIndex = targetUniform->vs.samplerIndex;
for (int i = 0; i < count; i++)
{
@@ -2188,8 +2188,8 @@
}
else
{
- ASSERT(targetUniform->vs.registerSet == D3DXRS_FLOAT4);
- mDevice->SetVertexShaderConstantF(targetUniform->vs.registerIndex, (const float *)vector, targetUniform->vs.registerCount);
+ ASSERT(targetUniform->vs.float4Index >= 0);
+ mDevice->SetVertexShaderConstantF(targetUniform->vs.float4Index, (const float *)vector, targetUniform->vs.registerCount);
}
}
@@ -2251,14 +2251,14 @@
{
if (targetUniform->ps.registerCount)
{
- ASSERT(targetUniform->ps.registerSet == D3DXRS_FLOAT4);
- mDevice->SetPixelShaderConstantF(targetUniform->ps.registerIndex, (const float *)vector, targetUniform->ps.registerCount);
+ ASSERT(targetUniform->ps.float4Index >= 0);
+ mDevice->SetPixelShaderConstantF(targetUniform->ps.float4Index, (const float *)vector, targetUniform->ps.registerCount);
}
if (targetUniform->vs.registerCount)
{
- ASSERT(targetUniform->vs.registerSet == D3DXRS_FLOAT4);
- mDevice->SetVertexShaderConstantF(targetUniform->vs.registerIndex, (const float *)vector, targetUniform->vs.registerCount);
+ ASSERT(targetUniform->vs.float4Index >= 0);
+ mDevice->SetVertexShaderConstantF(targetUniform->vs.float4Index, (const float *)vector, targetUniform->vs.registerCount);
}
}
@@ -2792,9 +2792,17 @@
D3DXCONSTANT_DESC constantDescription;
HRESULT result = constantTable->GetConstantDesc(handle, &constantDescription, &descriptionCount);
ASSERT(SUCCEEDED(result));
- ri->registerIndex = constantDescription.RegisterIndex;
+
+ switch(constantDescription.RegisterSet)
+ {
+ case D3DXRS_BOOL: ri->boolIndex = constantDescription.RegisterIndex; break;
+ case D3DXRS_FLOAT4: ri->float4Index = constantDescription.RegisterIndex; break;
+ case D3DXRS_SAMPLER: ri->samplerIndex = constantDescription.RegisterIndex; break;
+ default: UNREACHABLE();
+ }
+
+ ASSERT(ri->registerCount == 0 || ri->registerCount == (int)constantDescription.RegisterCount);
ri->registerCount = constantDescription.RegisterCount;
- ri->registerSet = constantDescription.RegisterSet;
}
else
{