Use timestamp to detect when client GL calls could cause Gr's cache of glTexParam values to be invalid.
git-svn-id: http://skia.googlecode.com/svn/trunk@2609 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/GrGpuGL.cpp b/src/gpu/GrGpuGL.cpp
index 1b06a4d..10c0fa6 100644
--- a/src/gpu/GrGpuGL.cpp
+++ b/src/gpu/GrGpuGL.cpp
@@ -681,9 +681,6 @@
&texDesc.fUploadType)) {
return NULL;
}
-
- GrGLTexture::TexParams params;
-
texDesc.fAllocWidth = texDesc.fContentWidth = desc.fWidth;
texDesc.fAllocHeight = texDesc.fContentHeight = desc.fHeight;
@@ -691,14 +688,13 @@
texDesc.fOrientation = GrGLTexture::kBottomUp_Orientation;
texDesc.fTextureID = desc.fPlatformTexture;
texDesc.fOwnsID = false;
-
- params.invalidate(); // rather than do glGets.
+
if (isRenderTarget) {
- GrTexture* tex = new GrGLTexture(this, texDesc, rtDesc, params);
+ GrTexture* tex = new GrGLTexture(this, texDesc, rtDesc);
tex->asRenderTarget()->setStencilBuffer(sb.get());
return tex;
} else {
- return new GrGLTexture(this, texDesc, params);
+ return new GrGLTexture(this, texDesc);
}
} else {
GrGLIRect viewport;
@@ -1057,10 +1053,11 @@
GL_CALL(DeleteTextures(1, &glTexDesc.fTextureID));
return return_null_texture();
}
- tex = new GrGLTexture(this, glTexDesc, glRTDesc, DEFAULT_PARAMS);
+ tex = new GrGLTexture(this, glTexDesc, glRTDesc);
} else {
- tex = new GrGLTexture(this, glTexDesc, DEFAULT_PARAMS);
+ tex = new GrGLTexture(this, glTexDesc);
}
+ tex->setCachedTexParams(DEFAULT_PARAMS, this->getResetTimestamp());
#ifdef TRACE_TEXTURE_CREATION
GrPrintf("--- new texture [%d] size=(%d %d) config=%d\n",
glTexDesc.fTextureID, desc.fWidth, desc.fHeight, desc.fConfig);
@@ -1952,8 +1949,10 @@
}
const GrSamplerState& sampler = fCurrDrawState.fSamplerStates[s];
+ ResetTimestamp timestamp;
const GrGLTexture::TexParams& oldTexParams =
- nextTexture->getTexParams();
+ nextTexture->getCachedTexParams(×tamp);
+ bool setAll = timestamp < this->getResetTimestamp();
GrGLTexture::TexParams newTexParams;
newTexParams.fFilter = grToGLFilter(sampler.getFilter());
@@ -1962,8 +1961,7 @@
GrGLTexture::WrapMode2GLWrap(this->glBinding());
newTexParams.fWrapS = wraps[sampler.getWrapX()];
newTexParams.fWrapT = wraps[sampler.getWrapY()];
-
- if (newTexParams.fFilter != oldTexParams.fFilter) {
+ if (setAll) {
setTextureUnit(s);
GL_CALL(TexParameteri(GR_GL_TEXTURE_2D,
GR_GL_TEXTURE_MAG_FILTER,
@@ -1971,20 +1969,37 @@
GL_CALL(TexParameteri(GR_GL_TEXTURE_2D,
GR_GL_TEXTURE_MIN_FILTER,
newTexParams.fFilter));
- }
- if (newTexParams.fWrapS != oldTexParams.fWrapS) {
- setTextureUnit(s);
GL_CALL(TexParameteri(GR_GL_TEXTURE_2D,
GR_GL_TEXTURE_WRAP_S,
newTexParams.fWrapS));
- }
- if (newTexParams.fWrapT != oldTexParams.fWrapT) {
- setTextureUnit(s);
GL_CALL(TexParameteri(GR_GL_TEXTURE_2D,
GR_GL_TEXTURE_WRAP_T,
newTexParams.fWrapT));
+ } else {
+ if (newTexParams.fFilter != oldTexParams.fFilter) {
+ setTextureUnit(s);
+ GL_CALL(TexParameteri(GR_GL_TEXTURE_2D,
+ GR_GL_TEXTURE_MAG_FILTER,
+ newTexParams.fFilter));
+ GL_CALL(TexParameteri(GR_GL_TEXTURE_2D,
+ GR_GL_TEXTURE_MIN_FILTER,
+ newTexParams.fFilter));
+ }
+ if (newTexParams.fWrapS != oldTexParams.fWrapS) {
+ setTextureUnit(s);
+ GL_CALL(TexParameteri(GR_GL_TEXTURE_2D,
+ GR_GL_TEXTURE_WRAP_S,
+ newTexParams.fWrapS));
+ }
+ if (newTexParams.fWrapT != oldTexParams.fWrapT) {
+ setTextureUnit(s);
+ GL_CALL(TexParameteri(GR_GL_TEXTURE_2D,
+ GR_GL_TEXTURE_WRAP_T,
+ newTexParams.fWrapT));
+ }
}
- nextTexture->setTexParams(newTexParams);
+ nextTexture->setCachedTexParams(newTexParams,
+ this->getResetTimestamp());
}
}