Commit 6246dc8f by Jamie Madill

Track dirty D3D shaders instead of program serial.

With dynamic shaders, we can have multiple vertex shaders in one program binary. Hence the binary serial by itself isn't enough to determine when we need to apply new shaders to D3D. Change-Id: I5a8b8616d353b506790ffc809e2d459bfc2b831d Reviewed-on: https://chromium-review.googlesource.com/184370Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarNicolas Capens <nicolascapens@chromium.org> Commit-Queue: Nicolas Capens <nicolascapens@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 648c9683
...@@ -91,7 +91,9 @@ Renderer11::Renderer11(egl::Display *display, HDC hDc) : Renderer(display), mDc( ...@@ -91,7 +91,9 @@ Renderer11::Renderer11(egl::Display *display, HDC hDc) : Renderer(display), mDc(
mBGRATextureSupport = false; mBGRATextureSupport = false;
mIsGeometryShaderActive = false; mAppliedVertexShader = NULL;
mAppliedGeometryShader = NULL;
mAppliedPixelShader = NULL;
} }
Renderer11::~Renderer11() Renderer11::~Renderer11()
...@@ -1403,45 +1405,46 @@ void Renderer11::drawTriangleFan(GLsizei count, GLenum type, const GLvoid *indic ...@@ -1403,45 +1405,46 @@ void Renderer11::drawTriangleFan(GLsizei count, GLenum type, const GLvoid *indic
void Renderer11::applyShaders(gl::ProgramBinary *programBinary) void Renderer11::applyShaders(gl::ProgramBinary *programBinary)
{ {
unsigned int programBinarySerial = programBinary->getSerial(); ShaderExecutable *vertexExe = programBinary->getVertexExecutable();
const bool updateProgramState = (programBinarySerial != mAppliedProgramBinarySerial); ShaderExecutable *pixelExe = programBinary->getPixelExecutable();
ShaderExecutable *geometryExe = programBinary->getGeometryExecutable();
if (updateProgramState) ID3D11VertexShader *vertexShader = (vertexExe ? ShaderExecutable11::makeShaderExecutable11(vertexExe)->getVertexShader() : NULL);
{ ID3D11PixelShader *pixelShader = (pixelExe ? ShaderExecutable11::makeShaderExecutable11(pixelExe)->getPixelShader() : NULL);
ShaderExecutable *vertexExe = programBinary->getVertexExecutable(); ID3D11GeometryShader *geometryShader = (geometryExe ? ShaderExecutable11::makeShaderExecutable11(geometryExe)->getGeometryShader() : NULL);
ShaderExecutable *pixelExe = programBinary->getPixelExecutable();
ID3D11VertexShader *vertexShader = NULL; // Skip GS if we aren't drawing points
if (vertexExe) vertexShader = ShaderExecutable11::makeShaderExecutable11(vertexExe)->getVertexShader(); if (!mCurRasterState.pointDrawMode)
{
geometryShader = NULL;
}
ID3D11PixelShader *pixelShader = NULL; bool dirtyUniforms = false;
if (pixelExe) pixelShader = ShaderExecutable11::makeShaderExecutable11(pixelExe)->getPixelShader();
mDeviceContext->PSSetShader(pixelShader, NULL, 0); if (vertexShader != mAppliedVertexShader)
{
mDeviceContext->VSSetShader(vertexShader, NULL, 0); mDeviceContext->VSSetShader(vertexShader, NULL, 0);
mAppliedVertexShader = vertexShader;
programBinary->dirtyAllUniforms(); dirtyUniforms = true;
mAppliedProgramBinarySerial = programBinarySerial;
} }
// Only use the geometry shader currently for point sprite drawing if (geometryShader != mAppliedGeometryShader)
const bool usesGeometryShader = (programBinary->usesGeometryShader() && mCurRasterState.pointDrawMode); {
mDeviceContext->GSSetShader(geometryShader, NULL, 0);
mAppliedGeometryShader = geometryShader;
dirtyUniforms = true;
}
if (updateProgramState || usesGeometryShader != mIsGeometryShaderActive) if (pixelShader != mAppliedPixelShader)
{ {
if (usesGeometryShader) mDeviceContext->PSSetShader(pixelShader, NULL, 0);
{ mAppliedPixelShader = pixelShader;
ShaderExecutable *geometryExe = programBinary->getGeometryExecutable(); dirtyUniforms = true;
ID3D11GeometryShader *geometryShader = ShaderExecutable11::makeShaderExecutable11(geometryExe)->getGeometryShader(); }
mDeviceContext->GSSetShader(geometryShader, NULL, 0);
}
else
{
mDeviceContext->GSSetShader(NULL, NULL, 0);
}
mIsGeometryShaderActive = usesGeometryShader; if (dirtyUniforms)
{
programBinary->dirtyAllUniforms();
} }
} }
...@@ -1633,7 +1636,9 @@ void Renderer11::markAllStateDirty() ...@@ -1633,7 +1636,9 @@ void Renderer11::markAllStateDirty()
mAppliedStorageIBSerial = 0; mAppliedStorageIBSerial = 0;
mAppliedIBOffset = 0; mAppliedIBOffset = 0;
mAppliedProgramBinarySerial = 0; mAppliedVertexShader = NULL;
mAppliedGeometryShader = NULL;
mAppliedPixelShader = NULL;
memset(&mAppliedVertexConstants, 0, sizeof(dx_VertexConstants)); memset(&mAppliedVertexConstants, 0, sizeof(dx_VertexConstants));
memset(&mAppliedPixelConstants, 0, sizeof(dx_PixelConstants)); memset(&mAppliedPixelConstants, 0, sizeof(dx_PixelConstants));
......
...@@ -341,8 +341,9 @@ class Renderer11 : public Renderer ...@@ -341,8 +341,9 @@ class Renderer11 : public Renderer
unsigned int mAppliedStorageIBSerial; unsigned int mAppliedStorageIBSerial;
unsigned int mAppliedIBOffset; unsigned int mAppliedIBOffset;
unsigned int mAppliedProgramBinarySerial; ID3D11VertexShader *mAppliedVertexShader;
bool mIsGeometryShaderActive; ID3D11GeometryShader *mAppliedGeometryShader;
ID3D11PixelShader *mAppliedPixelShader;
dx_VertexConstants mVertexConstants; dx_VertexConstants mVertexConstants;
dx_VertexConstants mAppliedVertexConstants; dx_VertexConstants mAppliedVertexConstants;
......
...@@ -127,6 +127,9 @@ Renderer9::Renderer9(egl::Display *display, HDC hDc, bool softwareDevice) : Rend ...@@ -127,6 +127,9 @@ Renderer9::Renderer9(egl::Display *display, HDC hDc, bool softwareDevice) : Rend
mNullColorbufferCache[i].height = 0; mNullColorbufferCache[i].height = 0;
mNullColorbufferCache[i].buffer = NULL; mNullColorbufferCache[i].buffer = NULL;
} }
mAppliedVertexShader = NULL;
mAppliedPixelShader = NULL;
} }
Renderer9::~Renderer9() Renderer9::~Renderer9()
...@@ -1719,24 +1722,31 @@ void Renderer9::drawIndexedPoints(GLsizei count, GLenum type, const GLvoid *indi ...@@ -1719,24 +1722,31 @@ void Renderer9::drawIndexedPoints(GLsizei count, GLenum type, const GLvoid *indi
void Renderer9::applyShaders(gl::ProgramBinary *programBinary) void Renderer9::applyShaders(gl::ProgramBinary *programBinary)
{ {
unsigned int programBinarySerial = programBinary->getSerial(); ShaderExecutable *vertexExe = programBinary->getVertexExecutable();
if (programBinarySerial != mAppliedProgramBinarySerial) ShaderExecutable *pixelExe = programBinary->getPixelExecutable();
{
ShaderExecutable *vertexExe = programBinary->getVertexExecutable();
ShaderExecutable *pixelExe = programBinary->getPixelExecutable();
IDirect3DVertexShader9 *vertexShader = NULL; IDirect3DVertexShader9 *vertexShader = (vertexExe ? ShaderExecutable9::makeShaderExecutable9(vertexExe)->getVertexShader() : NULL);
if (vertexExe) vertexShader = ShaderExecutable9::makeShaderExecutable9(vertexExe)->getVertexShader(); IDirect3DPixelShader9 *pixelShader = (pixelExe ? ShaderExecutable9::makeShaderExecutable9(pixelExe)->getPixelShader() : NULL);
IDirect3DPixelShader9 *pixelShader = NULL; bool dirtyUniforms = false;
if (pixelExe) pixelShader = ShaderExecutable9::makeShaderExecutable9(pixelExe)->getPixelShader();
mDevice->SetPixelShader(pixelShader); if (vertexShader != mAppliedVertexShader)
{
mDevice->SetVertexShader(vertexShader); mDevice->SetVertexShader(vertexShader);
programBinary->dirtyAllUniforms(); mAppliedVertexShader = vertexShader;
mDxUniformsDirty = true; dirtyUniforms = true;
}
mAppliedProgramBinarySerial = programBinarySerial; if (pixelShader != mAppliedPixelShader)
{
mDevice->SetPixelShader(pixelShader);
mAppliedPixelShader = pixelShader;
dirtyUniforms = true;
}
if (dirtyUniforms)
{
programBinary->dirtyAllUniforms();
} }
} }
...@@ -2068,7 +2078,8 @@ void Renderer9::markAllStateDirty() ...@@ -2068,7 +2078,8 @@ void Renderer9::markAllStateDirty()
} }
mAppliedIBSerial = 0; mAppliedIBSerial = 0;
mAppliedProgramBinarySerial = 0; mAppliedVertexShader = NULL;
mAppliedPixelShader = NULL;
mDxUniformsDirty = true; mDxUniformsDirty = true;
mVertexDeclarationCache.markStateDirty(); mVertexDeclarationCache.markStateDirty();
......
...@@ -372,7 +372,8 @@ class Renderer9 : public Renderer ...@@ -372,7 +372,8 @@ class Renderer9 : public Renderer
unsigned int mCurPixelTextureSerials[gl::MAX_TEXTURE_IMAGE_UNITS]; unsigned int mCurPixelTextureSerials[gl::MAX_TEXTURE_IMAGE_UNITS];
unsigned int mAppliedIBSerial; unsigned int mAppliedIBSerial;
unsigned int mAppliedProgramBinarySerial; IDirect3DVertexShader9 *mAppliedVertexShader;
IDirect3DPixelShader9 *mAppliedPixelShader;
rx::dx_VertexConstants mVertexConstants; rx::dx_VertexConstants mVertexConstants;
rx::dx_PixelConstants mPixelConstants; rx::dx_PixelConstants mPixelConstants;
......
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