Move program binary serial caching to renderer

Trac #22249
Signed-off-by: Geoff Lang
Signed-off-by: Shannon Woods

git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1576 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/renderer/Renderer11.cpp b/src/libGLESv2/renderer/Renderer11.cpp
index 33560c6..8c3cae6 100644
--- a/src/libGLESv2/renderer/Renderer11.cpp
+++ b/src/libGLESv2/renderer/Renderer11.cpp
@@ -696,18 +696,24 @@
 
 void Renderer11::applyShaders(gl::ProgramBinary *programBinary)
 {
-    ShaderExecutable *vertexExe = programBinary->getVertexExecutable();
-    ShaderExecutable *pixelExe = programBinary->getPixelExecutable();
+    unsigned int programBinarySerial = programBinary->getSerial();
+    if (programBinarySerial != mAppliedProgramBinarySerial)
+    {
+        ShaderExecutable *vertexExe = programBinary->getVertexExecutable();
+        ShaderExecutable *pixelExe = programBinary->getPixelExecutable();
 
-    ID3D11VertexShader *vertexShader = NULL;
-    if (vertexExe) vertexShader = ShaderExecutable11::makeShaderExecutable11(vertexExe)->getVertexShader();
+        ID3D11VertexShader *vertexShader = NULL;
+        if (vertexExe) vertexShader = ShaderExecutable11::makeShaderExecutable11(vertexExe)->getVertexShader();
 
-    ID3D11PixelShader *pixelShader = NULL;
-    if (pixelExe) pixelShader = ShaderExecutable11::makeShaderExecutable11(pixelExe)->getPixelShader();
+        ID3D11PixelShader *pixelShader = NULL;
+        if (pixelExe) pixelShader = ShaderExecutable11::makeShaderExecutable11(pixelExe)->getPixelShader();
 
-    mDeviceContext->PSSetShader(pixelShader, NULL, 0);
-    mDeviceContext->VSSetShader(vertexShader, NULL, 0);
-    programBinary->dirtyAllUniforms();
+        mDeviceContext->PSSetShader(pixelShader, NULL, 0);
+        mDeviceContext->VSSetShader(vertexShader, NULL, 0);
+        programBinary->dirtyAllUniforms();
+
+        mAppliedProgramBinarySerial = programBinarySerial;
+    }
 }
 
 void Renderer11::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer)
@@ -839,6 +845,8 @@
     mForceSetDepthStencilState = true;
     mForceSetScissor = true;
     mForceSetViewport = true;
+
+    mAppliedProgramBinarySerial = 0;
 }
 
 void Renderer11::releaseDeviceResources()
diff --git a/src/libGLESv2/renderer/Renderer11.h b/src/libGLESv2/renderer/Renderer11.h
index 8c636c6..4d082cc 100644
--- a/src/libGLESv2/renderer/Renderer11.h
+++ b/src/libGLESv2/renderer/Renderer11.h
@@ -192,6 +192,8 @@
     float mCurNear;
     float mCurFar;
 
+    unsigned int mAppliedProgramBinarySerial;
+
     ID3D11Device *mDevice;
     D3D_FEATURE_LEVEL mFeatureLevel;
     ID3D11DeviceContext *mDeviceContext;
diff --git a/src/libGLESv2/renderer/Renderer9.cpp b/src/libGLESv2/renderer/Renderer9.cpp
index c8a8c0d..b2e2b70 100644
--- a/src/libGLESv2/renderer/Renderer9.cpp
+++ b/src/libGLESv2/renderer/Renderer9.cpp
@@ -1412,18 +1412,24 @@
 
 void Renderer9::applyShaders(gl::ProgramBinary *programBinary)
 {
-    ShaderExecutable *vertexExe = programBinary->getVertexExecutable();
-    ShaderExecutable *pixelExe = programBinary->getPixelExecutable();
+    unsigned int programBinarySerial = programBinary->getSerial();
+    if (programBinarySerial != mAppliedProgramBinarySerial)
+    {
+        ShaderExecutable *vertexExe = programBinary->getVertexExecutable();
+        ShaderExecutable *pixelExe = programBinary->getPixelExecutable();
 
-    IDirect3DVertexShader9 *vertexShader = NULL;
-    if (vertexExe) vertexShader = ShaderExecutable9::makeShaderExecutable9(vertexExe)->getVertexShader();
+        IDirect3DVertexShader9 *vertexShader = NULL;
+        if (vertexExe) vertexShader = ShaderExecutable9::makeShaderExecutable9(vertexExe)->getVertexShader();
 
-    IDirect3DPixelShader9 *pixelShader = NULL;
-    if (pixelExe) pixelShader = ShaderExecutable9::makeShaderExecutable9(pixelExe)->getPixelShader();
+        IDirect3DPixelShader9 *pixelShader = NULL;
+        if (pixelExe) pixelShader = ShaderExecutable9::makeShaderExecutable9(pixelExe)->getPixelShader();
 
-    mDevice->SetPixelShader(pixelShader);
-    mDevice->SetVertexShader(vertexShader);
-    programBinary->dirtyAllUniforms();
+        mDevice->SetPixelShader(pixelShader);
+        mDevice->SetVertexShader(vertexShader);
+        programBinary->dirtyAllUniforms();
+
+        mAppliedProgramBinarySerial = programBinarySerial;
+    }
 }
 
 void Renderer9::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer)
@@ -1625,6 +1631,7 @@
     mForceSetBlendState = true;
 
     mAppliedIBSerial = 0;
+    mAppliedProgramBinarySerial = 0;
 
     mVertexDeclarationCache.markStateDirty();
 }
diff --git a/src/libGLESv2/renderer/Renderer9.h b/src/libGLESv2/renderer/Renderer9.h
index 45a0914..d5ae773 100644
--- a/src/libGLESv2/renderer/Renderer9.h
+++ b/src/libGLESv2/renderer/Renderer9.h
@@ -259,6 +259,7 @@
     GLuint mCurSampleMask;
 
     unsigned int mAppliedIBSerial;
+    unsigned int mAppliedProgramBinarySerial;
 
     // A pool of event queries that are currently unused.
     std::vector<IDirect3DQuery9*> mEventQueryPool;