Minimizes texture state changes
TRAC #12203
Signed-off-by: Nicolas Capens
Signed-off-by: Daniel Koch

Author:    Shannon Woods

git-svn-id: https://angleproject.googlecode.com/svn/trunk@267 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Context.cpp b/src/libGLESv2/Context.cpp
index b9f82de..bd5ed5b 100644
--- a/src/libGLESv2/Context.cpp
+++ b/src/libGLESv2/Context.cpp
@@ -1993,6 +1993,7 @@
     if (programObject->getSerial() != mAppliedProgram)
     {
         programObject->dirtyAllUniforms();
+        programObject->dirtyAllSamplers();
         mAppliedProgram = programObject->getSerial();
     }
 
@@ -2014,33 +2015,42 @@
 
             Texture *texture = getSamplerTexture(textureUnit, textureType);
 
-            if (texture->isComplete())
+            if (programObject->isSamplerDirty(sampler) || texture->isDirty())
             {
-                GLenum wrapS = texture->getWrapS();
-                GLenum wrapT = texture->getWrapT();
-                GLenum minFilter = texture->getMinFilter();
-                GLenum magFilter = texture->getMagFilter();
+                if (texture->isComplete())
+                {
+                    GLenum wrapS = texture->getWrapS();
+                    GLenum wrapT = texture->getWrapT();
+                    GLenum minFilter = texture->getMinFilter();
+                    GLenum magFilter = texture->getMagFilter();
 
-                device->SetSamplerState(sampler, D3DSAMP_ADDRESSU, es2dx::ConvertTextureWrap(wrapS));
-                device->SetSamplerState(sampler, D3DSAMP_ADDRESSV, es2dx::ConvertTextureWrap(wrapT));
+                    device->SetSamplerState(sampler, D3DSAMP_ADDRESSU, es2dx::ConvertTextureWrap(wrapS));
+                    device->SetSamplerState(sampler, D3DSAMP_ADDRESSV, es2dx::ConvertTextureWrap(wrapT));
 
-                device->SetSamplerState(sampler, D3DSAMP_MAGFILTER, es2dx::ConvertMagFilter(magFilter));
-                D3DTEXTUREFILTERTYPE d3dMinFilter, d3dMipFilter;
-                es2dx::ConvertMinFilter(minFilter, &d3dMinFilter, &d3dMipFilter);
-                device->SetSamplerState(sampler, D3DSAMP_MINFILTER, d3dMinFilter);
-                device->SetSamplerState(sampler, D3DSAMP_MIPFILTER, d3dMipFilter);
+                    device->SetSamplerState(sampler, D3DSAMP_MAGFILTER, es2dx::ConvertMagFilter(magFilter));
+                    D3DTEXTUREFILTERTYPE d3dMinFilter, d3dMipFilter;
+                    es2dx::ConvertMinFilter(minFilter, &d3dMinFilter, &d3dMipFilter);
+                    device->SetSamplerState(sampler, D3DSAMP_MINFILTER, d3dMinFilter);
+                    device->SetSamplerState(sampler, D3DSAMP_MIPFILTER, d3dMipFilter);
 
-                device->SetTexture(sampler, texture->getTexture());
+                    device->SetTexture(sampler, texture->getTexture());
+                }
+                else
+                {
+                    device->SetTexture(sampler, getIncompleteTexture(textureType)->getTexture());
+                }
             }
-            else
-            {
-                device->SetTexture(sampler, getIncompleteTexture(textureType)->getTexture());
-            }
+
+            programObject->setSamplerDirty(sampler, false);
         }
         else
         {
-            device->SetTexture(sampler, NULL);
-        }
+            if (programObject->isSamplerDirty(sampler))
+            {
+                device->SetTexture(sampler, NULL);
+                programObject->setSamplerDirty(sampler, false);
+            }
+        }   
     }
 }