Implemented basic applying of uniform values for DX11.

TRAC #22239
Signed-off-by: Daniel Koch
Signed-off-by: Shannon Woods
Author: Nicolas Capens

git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1628 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/renderer/Renderer11.cpp b/src/libGLESv2/renderer/Renderer11.cpp
index fa40261..d3c5b17 100644
--- a/src/libGLESv2/renderer/Renderer11.cpp
+++ b/src/libGLESv2/renderer/Renderer11.cpp
@@ -794,11 +794,81 @@
 
 void Renderer11::applyUniforms(const gl::UniformArray *uniformArray)
 {
-    // TODO
-    if (uniformArray->size() != 0)
+    D3D11_BUFFER_DESC constantBufferDescription = {0};
+    constantBufferDescription.ByteWidth = D3D10_REQ_CONSTANT_BUFFER_ELEMENT_COUNT * sizeof(float[4]);
+    constantBufferDescription.Usage = D3D11_USAGE_DYNAMIC;
+    constantBufferDescription.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
+    constantBufferDescription.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
+    constantBufferDescription.MiscFlags = 0;
+    constantBufferDescription.StructureByteStride = 0;
+
+    ID3D11Buffer *constantBufferVS = NULL;
+    HRESULT result = mDevice->CreateBuffer(&constantBufferDescription, NULL, &constantBufferVS);
+    ASSERT(SUCCEEDED(result));
+
+    ID3D11Buffer *constantBufferPS = NULL;
+    result = mDevice->CreateBuffer(&constantBufferDescription, NULL, &constantBufferPS);
+    ASSERT(SUCCEEDED(result));
+
+    D3D11_MAPPED_SUBRESOURCE mapVS = {0};
+    result = mDeviceContext->Map(constantBufferVS, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapVS);
+    ASSERT(SUCCEEDED(result));
+
+    D3D11_MAPPED_SUBRESOURCE mapPS = {0};
+    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++)
     {
-        UNIMPLEMENTED();
+        const gl::Uniform *uniform = *uniform_iterator;
+        GLfloat (*f)[4] = (GLfloat(*)[4])uniform->data;
+
+        switch (uniform->type)
+        {
+          case GL_FLOAT:
+          case GL_FLOAT_VEC2:
+          case GL_FLOAT_VEC3:
+          case GL_FLOAT_VEC4:
+          case GL_FLOAT_MAT2:
+          case GL_FLOAT_MAT3:
+          case GL_FLOAT_MAT4:
+            if (uniform->vs.registerCount)
+            {
+                for (int i = 0; i < uniform->vs.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];
+                }
+            }
+            if (uniform->ps.registerCount)
+            {
+                for (int i = 0; i < uniform->ps.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];
+                }
+            }
+            break;
+          default:
+            UNIMPLEMENTED();   // FIXME
+            UNREACHABLE();
+        }
     }
+
+    mDeviceContext->Unmap(constantBufferVS, 0);
+    mDeviceContext->VSSetConstantBuffers(0, 1, &constantBufferVS);
+    constantBufferVS->Release();
+
+    mDeviceContext->Unmap(constantBufferPS, 0);
+    mDeviceContext->PSSetConstantBuffers(0, 1, &constantBufferPS);
+    constantBufferPS->Release();
 }
 
 void Renderer11::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer)