Store DX11 driver uniforms in a separate constant buffer.
TRAC #22327
Signed-off-by: Daniel Koch
Signed-off-by: Geoff Lang
Author: Nicolas Capens
git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1764 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/renderer/Renderer11.cpp b/src/libGLESv2/renderer/Renderer11.cpp
index c43ce6e..0c3aa37 100644
--- a/src/libGLESv2/renderer/Renderer11.cpp
+++ b/src/libGLESv2/renderer/Renderer11.cpp
@@ -1058,28 +1058,36 @@
void Renderer11::applyUniforms(const gl::UniformArray *uniformArray)
{
- 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;
+ D3D11_BUFFER_DESC constantBufferDescriptionVS0 = {0};
+ constantBufferDescriptionVS0.ByteWidth = D3D10_REQ_CONSTANT_BUFFER_ELEMENT_COUNT * sizeof(float[4]);
+ constantBufferDescriptionVS0.Usage = D3D11_USAGE_DYNAMIC;
+ constantBufferDescriptionVS0.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
+ constantBufferDescriptionVS0.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
+ constantBufferDescriptionVS0.MiscFlags = 0;
+ constantBufferDescriptionVS0.StructureByteStride = 0;
- ID3D11Buffer *constantBufferVS = NULL;
- HRESULT result = mDevice->CreateBuffer(&constantBufferDescription, NULL, &constantBufferVS);
+ ID3D11Buffer *constantBufferVS0 = NULL;
+ HRESULT result = mDevice->CreateBuffer(&constantBufferDescriptionVS0, NULL, &constantBufferVS0);
ASSERT(SUCCEEDED(result));
- ID3D11Buffer *constantBufferPS = NULL;
- result = mDevice->CreateBuffer(&constantBufferDescription, NULL, &constantBufferPS);
+ D3D11_BUFFER_DESC constantBufferDescriptionPS0 = {0};
+ constantBufferDescriptionPS0.ByteWidth = D3D10_REQ_CONSTANT_BUFFER_ELEMENT_COUNT * sizeof(float[4]);
+ constantBufferDescriptionPS0.Usage = D3D11_USAGE_DYNAMIC;
+ constantBufferDescriptionPS0.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
+ constantBufferDescriptionPS0.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
+ constantBufferDescriptionPS0.MiscFlags = 0;
+ constantBufferDescriptionPS0.StructureByteStride = 0;
+
+ ID3D11Buffer *constantBufferPS0 = NULL;
+ result = mDevice->CreateBuffer(&constantBufferDescriptionPS0, NULL, &constantBufferPS0);
ASSERT(SUCCEEDED(result));
- D3D11_MAPPED_SUBRESOURCE mapVS = {0};
- result = mDeviceContext->Map(constantBufferVS, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapVS);
+ D3D11_MAPPED_SUBRESOURCE mapVS0 = {0};
+ result = mDeviceContext->Map(constantBufferVS0, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapVS0);
ASSERT(SUCCEEDED(result));
- D3D11_MAPPED_SUBRESOURCE mapPS = {0};
- result = mDeviceContext->Map(constantBufferPS, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapPS);
+ D3D11_MAPPED_SUBRESOURCE mapPS0 = {0};
+ result = mDeviceContext->Map(constantBufferPS0, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapPS0);
ASSERT(SUCCEEDED(result));
for (gl::UniformArray::const_iterator uniform_iterator = uniformArray->begin(); uniform_iterator != uniformArray->end(); uniform_iterator++)
@@ -1100,7 +1108,7 @@
case GL_FLOAT_MAT4:
if (uniform->vsRegisterIndex >= 0)
{
- GLfloat (*c)[4] = (GLfloat(*)[4])mapVS.pData;
+ GLfloat (*c)[4] = (GLfloat(*)[4])mapVS0.pData;
float (*f)[4] = (float(*)[4])uniform->data;
for (unsigned int i = 0; i < uniform->registerCount; i++)
@@ -1113,7 +1121,7 @@
}
if (uniform->psRegisterIndex >= 0)
{
- GLfloat (*c)[4] = (GLfloat(*)[4])mapPS.pData;
+ GLfloat (*c)[4] = (GLfloat(*)[4])mapPS0.pData;
float (*f)[4] = (float(*)[4])uniform->data;
for (unsigned int i = 0; i < uniform->registerCount; i++)
@@ -1131,7 +1139,7 @@
case GL_INT_VEC4:
if (uniform->vsRegisterIndex >= 0)
{
- int (*c)[4] = (int(*)[4])mapVS.pData;
+ int (*c)[4] = (int(*)[4])mapVS0.pData;
GLint *x = (GLint*)uniform->data;
int count = gl::VariableColumnCount(uniform->type);
@@ -1145,7 +1153,7 @@
}
if (uniform->psRegisterIndex >= 0)
{
- int (*c)[4] = (int(*)[4])mapPS.pData;
+ int (*c)[4] = (int(*)[4])mapPS0.pData;
GLint *x = (GLint*)uniform->data;
int count = gl::VariableColumnCount(uniform->type);
@@ -1164,7 +1172,7 @@
case GL_BOOL_VEC4:
if (uniform->vsRegisterIndex >= 0)
{
- int (*c)[4] = (int(*)[4])mapVS.pData;
+ int (*c)[4] = (int(*)[4])mapVS0.pData;
GLboolean *b = (GLboolean*)uniform->data;
int count = gl::VariableColumnCount(uniform->type);
@@ -1178,7 +1186,7 @@
}
if (uniform->psRegisterIndex >= 0)
{
- int (*c)[4] = (int(*)[4])mapPS.pData;
+ int (*c)[4] = (int(*)[4])mapPS0.pData;
GLboolean *b = (GLboolean*)uniform->data;
int count = gl::VariableColumnCount(uniform->type);
@@ -1196,17 +1204,57 @@
}
}
+ mDeviceContext->Unmap(constantBufferVS0, 0);
+ mDeviceContext->Unmap(constantBufferPS0, 0);
+
// Driver uniforms
- memcpy(mapVS.pData, &mVertexConstants, sizeof(dx_VertexConstants));
- memcpy(mapPS.pData, &mPixelConstants, sizeof(dx_PixelConstants));
+ D3D11_BUFFER_DESC constantBufferDescriptionVS1 = {0};
+ constantBufferDescriptionVS1.ByteWidth = sizeof(dx_VertexConstants);
+ constantBufferDescriptionVS1.Usage = D3D11_USAGE_DYNAMIC;
+ constantBufferDescriptionVS1.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
+ constantBufferDescriptionVS1.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
+ constantBufferDescriptionVS1.MiscFlags = 0;
+ constantBufferDescriptionVS1.StructureByteStride = 0;
- mDeviceContext->Unmap(constantBufferVS, 0);
- mDeviceContext->VSSetConstantBuffers(0, 1, &constantBufferVS);
- constantBufferVS->Release();
+ ID3D11Buffer *constantBufferVS1 = NULL;
+ result = mDevice->CreateBuffer(&constantBufferDescriptionVS1, NULL, &constantBufferVS1);
+ ASSERT(SUCCEEDED(result));
- mDeviceContext->Unmap(constantBufferPS, 0);
- mDeviceContext->PSSetConstantBuffers(0, 1, &constantBufferPS);
- constantBufferPS->Release();
+ D3D11_BUFFER_DESC constantBufferDescriptionPS1 = {0};
+ constantBufferDescriptionPS1.ByteWidth = sizeof(dx_PixelConstants);
+ constantBufferDescriptionPS1.Usage = D3D11_USAGE_DYNAMIC;
+ constantBufferDescriptionPS1.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
+ constantBufferDescriptionPS1.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
+ constantBufferDescriptionPS1.MiscFlags = 0;
+ constantBufferDescriptionPS1.StructureByteStride = 0;
+
+ ID3D11Buffer *constantBufferPS1 = NULL;
+ result = mDevice->CreateBuffer(&constantBufferDescriptionPS1, NULL, &constantBufferPS1);
+ ASSERT(SUCCEEDED(result));
+
+ D3D11_MAPPED_SUBRESOURCE mapVS1 = {0};
+ result = mDeviceContext->Map(constantBufferVS1, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapVS1);
+ ASSERT(SUCCEEDED(result));
+
+ D3D11_MAPPED_SUBRESOURCE mapPS1 = {0};
+ result = mDeviceContext->Map(constantBufferPS1, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapPS1);
+ ASSERT(SUCCEEDED(result));
+
+ memcpy(mapVS1.pData, &mVertexConstants, sizeof(dx_VertexConstants));
+ memcpy(mapPS1.pData, &mPixelConstants, sizeof(dx_PixelConstants));
+
+ mDeviceContext->Unmap(constantBufferVS1, 0);
+ mDeviceContext->Unmap(constantBufferPS1, 0);
+
+ ID3D11Buffer *buffersVS[2] = {constantBufferVS0, constantBufferVS1};
+ mDeviceContext->VSSetConstantBuffers(0, 2, buffersVS);
+ constantBufferVS0->Release();
+ constantBufferVS1->Release();
+
+ ID3D11Buffer *buffersPS[2] = {constantBufferPS0, constantBufferPS1};
+ mDeviceContext->PSSetConstantBuffers(0, 2, buffersPS);
+ constantBufferPS0->Release();
+ constantBufferPS1->Release();
}
void Renderer11::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer)