Implemented support for DX11 integer and boolean uniforms.
TRAC #22364
Signed-off-by: Shannon Woods
Signed-off-by: Daniel Koch
Author: Nicolas Capens
git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1686 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/renderer/Renderer11.cpp b/src/libGLESv2/renderer/Renderer11.cpp
index 5857c60..5738be1 100644
--- a/src/libGLESv2/renderer/Renderer11.cpp
+++ b/src/libGLESv2/renderer/Renderer11.cpp
@@ -257,7 +257,7 @@
void Renderer11::sync(bool block)
{
// TODO
- UNIMPLEMENTED();
+ // UNIMPLEMENTED();
}
SwapChain *Renderer11::createSwapChain(HWND window, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat)
@@ -893,13 +893,9 @@
result = mDeviceContext->Map(constantBufferPS, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapPS);
ASSERT(SUCCEEDED(result));
- float (*cVS)[4] = (float(*)[4])mapVS.pData;
- float (*cPS)[4] = (float(*)[4])mapPS.pData;
-
for (gl::UniformArray::const_iterator uniform_iterator = uniformArray->begin(); uniform_iterator != uniformArray->end(); uniform_iterator++)
{
const gl::Uniform *uniform = *uniform_iterator;
- GLfloat (*f)[4] = (GLfloat(*)[4])uniform->data;
switch (uniform->type)
{
@@ -913,36 +909,107 @@
case GL_FLOAT_MAT2:
case GL_FLOAT_MAT3:
case GL_FLOAT_MAT4:
- if (uniform->vs.registerCount)
+ if (uniform->vsRegisterIndex >= 0)
{
- for (unsigned int i = 0; i < uniform->vs.registerCount; i++)
+ GLfloat (*c)[4] = (GLfloat(*)[4])mapVS.pData;
+ float (*f)[4] = (float(*)[4])uniform->data;
+
+ for (unsigned int i = 0; i < uniform->registerCount; i++)
{
- cVS[uniform->vs.registerIndex + i][0] = f[i][0];
- cVS[uniform->vs.registerIndex + i][1] = f[i][1];
- cVS[uniform->vs.registerIndex + i][2] = f[i][2];
- cVS[uniform->vs.registerIndex + i][3] = f[i][3];
+ c[uniform->vsRegisterIndex + i][0] = f[i][0];
+ c[uniform->vsRegisterIndex + i][1] = f[i][1];
+ c[uniform->vsRegisterIndex + i][2] = f[i][2];
+ c[uniform->vsRegisterIndex + i][3] = f[i][3];
}
}
- if (uniform->ps.registerCount)
+ if (uniform->psRegisterIndex >= 0)
{
- for (unsigned int i = 0; i < uniform->ps.registerCount; i++)
+ GLfloat (*c)[4] = (GLfloat(*)[4])mapPS.pData;
+ float (*f)[4] = (float(*)[4])uniform->data;
+
+ for (unsigned int i = 0; i < uniform->registerCount; i++)
{
- cPS[uniform->ps.registerIndex + i][0] = f[i][0];
- cPS[uniform->ps.registerIndex + i][1] = f[i][1];
- cPS[uniform->ps.registerIndex + i][2] = f[i][2];
- cPS[uniform->ps.registerIndex + i][3] = f[i][3];
+ c[uniform->psRegisterIndex + i][0] = f[i][0];
+ c[uniform->psRegisterIndex + i][1] = f[i][1];
+ c[uniform->psRegisterIndex + i][2] = f[i][2];
+ c[uniform->psRegisterIndex + i][3] = f[i][3];
+ }
+ }
+ break;
+ case GL_INT:
+ case GL_INT_VEC2:
+ case GL_INT_VEC3:
+ case GL_INT_VEC4:
+ if (uniform->vsRegisterIndex >= 0)
+ {
+ int (*c)[4] = (int(*)[4])mapVS.pData;
+ GLint *x = (GLint*)uniform->data;
+ int count = gl::VariableColumnCount(uniform->type);
+
+ for (unsigned int i = 0; i < uniform->registerCount; i++)
+ {
+ if (count >= 1) c[uniform->vsRegisterIndex + i][0] = x[i * count + 0];
+ if (count >= 2) c[uniform->vsRegisterIndex + i][1] = x[i * count + 1];
+ if (count >= 3) c[uniform->vsRegisterIndex + i][2] = x[i * count + 2];
+ if (count >= 4) c[uniform->vsRegisterIndex + i][3] = x[i * count + 3];
+ }
+ }
+ if (uniform->psRegisterIndex >= 0)
+ {
+ int (*c)[4] = (int(*)[4])mapPS.pData;
+ GLint *x = (GLint*)uniform->data;
+ int count = gl::VariableColumnCount(uniform->type);
+
+ for (unsigned int i = 0; i < uniform->registerCount; i++)
+ {
+ if (count >= 1) c[uniform->psRegisterIndex + i][0] = x[i * count + 0];
+ if (count >= 2) c[uniform->psRegisterIndex + i][1] = x[i * count + 1];
+ if (count >= 3) c[uniform->psRegisterIndex + i][2] = x[i * count + 2];
+ if (count >= 4) c[uniform->psRegisterIndex + i][3] = x[i * count + 3];
+ }
+ }
+ break;
+ case GL_BOOL:
+ case GL_BOOL_VEC2:
+ case GL_BOOL_VEC3:
+ case GL_BOOL_VEC4:
+ if (uniform->vsRegisterIndex >= 0)
+ {
+ int (*c)[4] = (int(*)[4])mapVS.pData;
+ GLboolean *b = (GLboolean*)uniform->data;
+ int count = gl::VariableColumnCount(uniform->type);
+
+ for (unsigned int i = 0; i < uniform->registerCount; i++)
+ {
+ if (count >= 1) c[uniform->vsRegisterIndex + i][0] = b[i * count + 0];
+ if (count >= 2) c[uniform->vsRegisterIndex + i][1] = b[i * count + 1];
+ if (count >= 3) c[uniform->vsRegisterIndex + i][2] = b[i * count + 2];
+ if (count >= 4) c[uniform->vsRegisterIndex + i][3] = b[i * count + 3];
+ }
+ }
+ if (uniform->psRegisterIndex >= 0)
+ {
+ int (*c)[4] = (int(*)[4])mapPS.pData;
+ GLboolean *b = (GLboolean*)uniform->data;
+ int count = gl::VariableColumnCount(uniform->type);
+
+ for (unsigned int i = 0; i < uniform->registerCount; i++)
+ {
+ if (count >= 1) c[uniform->psRegisterIndex + i][0] = b[i * count + 0];
+ if (count >= 2) c[uniform->psRegisterIndex + i][1] = b[i * count + 1];
+ if (count >= 3) c[uniform->psRegisterIndex + i][2] = b[i * count + 2];
+ if (count >= 4) c[uniform->psRegisterIndex + i][3] = b[i * count + 3];
}
}
break;
default:
- UNIMPLEMENTED(); // FIXME
UNREACHABLE();
}
}
// Driver uniforms
- memcpy(cVS, &vertexConstants, sizeof(dx_VertexConstants));
- memcpy(cPS, &pixelConstants, sizeof(dx_PixelConstants));
+ memcpy(mapVS.pData, &vertexConstants, sizeof(dx_VertexConstants));
+ memcpy(mapPS.pData, &pixelConstants, sizeof(dx_PixelConstants));
mDeviceContext->Unmap(constantBufferVS, 0);
mDeviceContext->VSSetConstantBuffers(0, 1, &constantBufferVS);