Use Map/Unmap instead of UpdateSubResource for uniforms.

TRAC #22480 Signed-off-by: Geoff Lang Signed-off-by: Jamie Madill Author: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1910 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 315b6403
...@@ -1254,8 +1254,24 @@ void Renderer11::applyUniforms(gl::ProgramBinary *programBinary, gl::UniformArra ...@@ -1254,8 +1254,24 @@ void Renderer11::applyUniforms(gl::ProgramBinary *programBinary, gl::UniformArra
ID3D11Buffer *vertexConstantBuffer = vertexExecutable->getConstantBuffer(mDevice, totalRegisterCountVS); ID3D11Buffer *vertexConstantBuffer = vertexExecutable->getConstantBuffer(mDevice, totalRegisterCountVS);
ID3D11Buffer *pixelConstantBuffer = pixelExecutable->getConstantBuffer(mDevice, totalRegisterCountPS); ID3D11Buffer *pixelConstantBuffer = pixelExecutable->getConstantBuffer(mDevice, totalRegisterCountPS);
float (*mapVS)[4] = (totalRegisterCountVS > 0 && vertexUniformsDirty) ? new float[totalRegisterCountVS][4] : NULL; float (*mapVS)[4] = NULL;
float (*mapPS)[4] = (totalRegisterCountPS > 0 && pixelUniformsDirty) ? new float[totalRegisterCountPS][4] : NULL; float (*mapPS)[4] = NULL;
if (totalRegisterCountVS > 0 && vertexUniformsDirty)
{
D3D11_MAPPED_SUBRESOURCE map = {0};
HRESULT result = mDeviceContext->Map(vertexConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &map);
ASSERT(SUCCEEDED(result));
mapVS = (float(*)[4])map.pData;
}
if (totalRegisterCountPS > 0 && pixelUniformsDirty)
{
D3D11_MAPPED_SUBRESOURCE map = {0};
HRESULT result = mDeviceContext->Map(pixelConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &map);
ASSERT(SUCCEEDED(result));
mapPS = (float(*)[4])map.pData;
}
for (gl::UniformArray::iterator uniform_iterator = uniformArray->begin(); uniform_iterator != uniformArray->end(); uniform_iterator++) for (gl::UniformArray::iterator uniform_iterator = uniformArray->begin(); uniform_iterator != uniformArray->end(); uniform_iterator++)
{ {
...@@ -1277,22 +1293,19 @@ void Renderer11::applyUniforms(gl::ProgramBinary *programBinary, gl::UniformArra ...@@ -1277,22 +1293,19 @@ void Renderer11::applyUniforms(gl::ProgramBinary *programBinary, gl::UniformArra
uniform->dirty = false; uniform->dirty = false;
} }
if (vertexConstantBuffer && mapVS) if (mapVS)
{ {
mDeviceContext->UpdateSubresource(vertexConstantBuffer, 0, NULL, mapVS, 0, 0); mDeviceContext->Unmap(vertexConstantBuffer, 0);
} }
if (pixelConstantBuffer && mapPS) if (mapPS)
{ {
mDeviceContext->UpdateSubresource(pixelConstantBuffer, 0, NULL, mapPS, 0, 0); mDeviceContext->Unmap(pixelConstantBuffer, 0);
} }
mDeviceContext->VSSetConstantBuffers(0, 1, &vertexConstantBuffer); mDeviceContext->VSSetConstantBuffers(0, 1, &vertexConstantBuffer);
mDeviceContext->PSSetConstantBuffers(0, 1, &pixelConstantBuffer); mDeviceContext->PSSetConstantBuffers(0, 1, &pixelConstantBuffer);
delete[] mapVS;
delete[] mapPS;
// Driver uniforms // Driver uniforms
if (!mDriverConstantBufferVS) if (!mDriverConstantBufferVS)
{ {
...@@ -2688,7 +2701,7 @@ ShaderExecutable *Renderer11::compileToExecutable(gl::InfoLog &infoLog, const ch ...@@ -2688,7 +2701,7 @@ ShaderExecutable *Renderer11::compileToExecutable(gl::InfoLog &infoLog, const ch
return NULL; return NULL;
} }
ID3DBlob *binary = (ID3DBlob*) compileToBinary(infoLog, shaderHLSL, profile, false); ID3DBlob *binary = (ID3DBlob*)compileToBinary(infoLog, shaderHLSL, profile, false);
if (!binary) if (!binary)
return NULL; return NULL;
......
...@@ -92,9 +92,9 @@ ID3D11Buffer *ShaderExecutable11::getConstantBuffer(ID3D11Device *device, unsign ...@@ -92,9 +92,9 @@ ID3D11Buffer *ShaderExecutable11::getConstantBuffer(ID3D11Device *device, unsign
{ {
D3D11_BUFFER_DESC constantBufferDescription = {0}; D3D11_BUFFER_DESC constantBufferDescription = {0};
constantBufferDescription.ByteWidth = registerCount * sizeof(float[4]); constantBufferDescription.ByteWidth = registerCount * sizeof(float[4]);
constantBufferDescription.Usage = D3D11_USAGE_DEFAULT; constantBufferDescription.Usage = D3D11_USAGE_DYNAMIC;
constantBufferDescription.BindFlags = D3D11_BIND_CONSTANT_BUFFER; constantBufferDescription.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
constantBufferDescription.CPUAccessFlags = 0; constantBufferDescription.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
constantBufferDescription.MiscFlags = 0; constantBufferDescription.MiscFlags = 0;
constantBufferDescription.StructureByteStride = 0; constantBufferDescription.StructureByteStride = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment