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);
+ }
+ }
}
}