Stop using GrSamplerState to track the texture parameters for GL textures. It has become larger and now holds state that isn't tracked per-texture by GL. Also remove unused setSamplerStateImm from GrGpuGL
git-svn-id: http://skia.googlecode.com/svn/trunk@659 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
parent
f3c1cc9063
commit
da96ea01fe
@ -93,13 +93,19 @@ public:
|
||||
kBottomUp_Orientation,
|
||||
kTopDown_Orientation,
|
||||
};
|
||||
|
||||
struct TexParams {
|
||||
GLenum fFilter;
|
||||
GLenum fWrapS;
|
||||
GLenum fWrapT;
|
||||
};
|
||||
|
||||
protected:
|
||||
struct GLTextureDesc {
|
||||
uint32_t fContentWidth;
|
||||
uint32_t fContentHeight;
|
||||
uint32_t fAllocWidth;
|
||||
uint32_t fAllocHeight;
|
||||
uint32_t fAllocHeight;
|
||||
PixelConfig fFormat;
|
||||
GLuint fTextureID;
|
||||
GLenum fUploadFormat;
|
||||
@ -110,6 +116,7 @@ protected:
|
||||
typedef GrGLRenderTarget::GLRenderTargetIDs GLRenderTargetIDs;
|
||||
GrGLTexture(const GLTextureDesc& textureDesc,
|
||||
const GLRenderTargetIDs& rtIDs,
|
||||
const TexParams& initialTexParams,
|
||||
GrGpuGL* gl);
|
||||
|
||||
public:
|
||||
@ -127,9 +134,8 @@ public:
|
||||
const void* srcData);
|
||||
virtual intptr_t getTextureHandle();
|
||||
|
||||
const GrSamplerState& samplerState() const { return fSamplerState; }
|
||||
void setSamplerState(const GrSamplerState& state)
|
||||
{ fSamplerState = state; }
|
||||
const TexParams& getTexParams() const { return fTexParams; }
|
||||
void setTexParams(const TexParams& texParams) { fTexParams = texParams; }
|
||||
GLuint textureID() const { return fTextureID; }
|
||||
|
||||
GLenum uploadFormat() const { return fUploadFormat; }
|
||||
@ -147,7 +153,7 @@ public:
|
||||
Orientation orientation() const { return fOrientation; }
|
||||
|
||||
private:
|
||||
GrSamplerState fSamplerState;
|
||||
TexParams fTexParams;
|
||||
GLuint fTextureID;
|
||||
GLenum fUploadFormat;
|
||||
GLenum fUploadByteCount;
|
||||
|
@ -75,12 +75,14 @@ const GLenum GrGLTexture::gWrapMode2GLWrap[] = {
|
||||
|
||||
GrGLTexture::GrGLTexture(const GLTextureDesc& textureDesc,
|
||||
const GLRenderTargetIDs& rtIDs,
|
||||
const TexParams& initialTexParams,
|
||||
GrGpuGL* gl) :
|
||||
INHERITED(textureDesc.fContentWidth,
|
||||
textureDesc.fContentHeight,
|
||||
textureDesc.fAllocWidth,
|
||||
textureDesc.fAllocHeight,
|
||||
textureDesc.fFormat),
|
||||
fTexParams(initialTexParams),
|
||||
fTextureID(textureDesc.fTextureID),
|
||||
fUploadFormat(textureDesc.fUploadFormat),
|
||||
fUploadByteCount(textureDesc.fUploadByteCount),
|
||||
@ -101,15 +103,6 @@ GrGLTexture::GrGLTexture(const GLTextureDesc& textureDesc,
|
||||
(int32_t)textureDesc.fContentHeight;
|
||||
fRenderTarget = new GrGLRenderTarget(rtIDs, vp, this, gl);
|
||||
}
|
||||
|
||||
fSamplerState.setClampNoFilter();
|
||||
|
||||
GR_GL(BindTexture(GL_TEXTURE_2D, fTextureID));
|
||||
gl->notifyTextureBind(this);
|
||||
GR_GL(TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST));
|
||||
GR_GL(TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST));
|
||||
GR_GL(TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
|
||||
GR_GL(TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
|
||||
}
|
||||
|
||||
GrGLTexture::~GrGLTexture() {
|
||||
@ -124,7 +117,7 @@ GrGLTexture::~GrGLTexture() {
|
||||
void GrGLTexture::abandon() {
|
||||
fTextureID = 0;
|
||||
if (NULL != fRenderTarget) {
|
||||
fRenderTarget->abandon();
|
||||
fRenderTarget->abandon();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -426,7 +426,7 @@ void GrGpuGL::resetContextHelper() {
|
||||
#if GR_GL_DESKTOP
|
||||
GR_GL(Disable(GL_LINE_SMOOTH));
|
||||
GR_GL(Disable(GL_POINT_SMOOTH));
|
||||
GR_GL(Disable(GL_MULTISAMPLE));
|
||||
GR_GL(Disable(GL_MULTISAMPLE));
|
||||
#endif
|
||||
|
||||
// we only ever use lines in hairline mode
|
||||
@ -533,6 +533,13 @@ GrTexture* GrGpuGL::createTexture(const TextureDesc& desc,
|
||||
#if GR_COLLECT_STATS
|
||||
++fStats.fTextureCreateCnt;
|
||||
#endif
|
||||
|
||||
static const GrGLTexture::TexParams DEFAULT_PARAMS = {
|
||||
GL_NEAREST,
|
||||
GL_CLAMP_TO_EDGE,
|
||||
GL_CLAMP_TO_EDGE
|
||||
};
|
||||
|
||||
GrGLTexture::GLTextureDesc glDesc;
|
||||
GLenum internalFormat;
|
||||
|
||||
@ -607,6 +614,18 @@ GrTexture* GrGpuGL::createTexture(const TextureDesc& desc,
|
||||
}
|
||||
|
||||
GR_GL(BindTexture(GL_TEXTURE_2D, glDesc.fTextureID));
|
||||
GR_GL(TexParameteri(GL_TEXTURE_2D,
|
||||
GL_TEXTURE_MAG_FILTER,
|
||||
DEFAULT_PARAMS.fFilter));
|
||||
GR_GL(TexParameteri(GL_TEXTURE_2D,
|
||||
GL_TEXTURE_MIN_FILTER,
|
||||
DEFAULT_PARAMS.fFilter));
|
||||
GR_GL(TexParameteri(GL_TEXTURE_2D,
|
||||
GL_TEXTURE_WRAP_S,
|
||||
DEFAULT_PARAMS.fWrapS));
|
||||
GR_GL(TexParameteri(GL_TEXTURE_2D,
|
||||
GL_TEXTURE_WRAP_T,
|
||||
DEFAULT_PARAMS.fWrapT));
|
||||
#if GR_COLLECT_STATS
|
||||
++fStats.fTextureChngCnt;
|
||||
#endif
|
||||
@ -898,7 +917,7 @@ GrTexture* GrGpuGL::createTexture(const TextureDesc& desc,
|
||||
GrPrintf("--- new texture [%d] size=(%d %d) bpp=%d\n",
|
||||
tex->fTextureID, width, height, tex->fUploadByteCount);
|
||||
#endif
|
||||
GrGLTexture* tex = new GrGLTexture(glDesc, rtIDs, this);
|
||||
GrGLTexture* tex = new GrGLTexture(glDesc, rtIDs, DEFAULT_PARAMS, this);
|
||||
|
||||
if (0 != rtIDs.fTexFBOID) {
|
||||
GrRenderTarget* rt = tex->asRenderTarget();
|
||||
@ -1014,18 +1033,6 @@ void GrGpuGL::flushScissor(const GrIRect* rect) {
|
||||
}
|
||||
}
|
||||
|
||||
void GrGpuGL::setSamplerStateImm(const GrSamplerState& state) {
|
||||
|
||||
GLenum filter = state.isFilter() ? GL_LINEAR : GL_NEAREST;
|
||||
GR_GL(TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter));
|
||||
GR_GL(TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter));
|
||||
GR_GL(TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
|
||||
GrGLTexture::gWrapMode2GLWrap[state.getWrapX()]));
|
||||
GR_GL(TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
|
||||
GrGLTexture::gWrapMode2GLWrap[state.getWrapY()]));
|
||||
|
||||
}
|
||||
|
||||
void GrGpuGL::eraseColor(GrColor color) {
|
||||
flushRenderTarget();
|
||||
if (fHWBounds.fScissorEnabled) {
|
||||
@ -1433,27 +1440,33 @@ void GrGpuGL::flushGLStateCommon(PrimitiveType type) {
|
||||
//GrPrintf("---- bindtexture %d\n", nextTexture->textureID());
|
||||
fHWDrawState.fTexture = nextTexture;
|
||||
}
|
||||
const GrSamplerState& lastSampler = nextTexture->samplerState();
|
||||
if (lastSampler.isFilter() != fCurrDrawState.fSamplerState.isFilter()) {
|
||||
GLenum filter = fCurrDrawState.fSamplerState.isFilter() ?
|
||||
GL_LINEAR :
|
||||
GL_NEAREST;
|
||||
GR_GL(TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
|
||||
filter));
|
||||
GR_GL(TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
|
||||
filter));
|
||||
const GrGLTexture::TexParams& oldTexParams = nextTexture->getTexParams();
|
||||
GrGLTexture::TexParams newTexParams;
|
||||
newTexParams.fFilter = fCurrDrawState.fSamplerState.isFilter() ?
|
||||
GL_LINEAR :
|
||||
GL_NEAREST;
|
||||
newTexParams.fWrapS = GrGLTexture::gWrapMode2GLWrap[fCurrDrawState.fSamplerState.getWrapX()];
|
||||
newTexParams.fWrapT = GrGLTexture::gWrapMode2GLWrap[fCurrDrawState.fSamplerState.getWrapY()];
|
||||
|
||||
if (newTexParams.fFilter != oldTexParams.fFilter) {
|
||||
GR_GL(TexParameteri(GL_TEXTURE_2D,
|
||||
GL_TEXTURE_MAG_FILTER,
|
||||
newTexParams.fFilter));
|
||||
GR_GL(TexParameteri(GL_TEXTURE_2D,
|
||||
GL_TEXTURE_MIN_FILTER,
|
||||
newTexParams.fFilter));
|
||||
}
|
||||
if (lastSampler.getWrapX() != fCurrDrawState.fSamplerState.getWrapX()) {
|
||||
GR_GL(TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
|
||||
GrGLTexture::gWrapMode2GLWrap[
|
||||
fCurrDrawState.fSamplerState.getWrapX()]));
|
||||
if (newTexParams.fWrapS != oldTexParams.fWrapS) {
|
||||
GR_GL(TexParameteri(GL_TEXTURE_2D,
|
||||
GL_TEXTURE_WRAP_S,
|
||||
newTexParams.fWrapS));
|
||||
}
|
||||
if (lastSampler.getWrapY() != fCurrDrawState.fSamplerState.getWrapY()) {
|
||||
GR_GL(TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
|
||||
GrGLTexture::gWrapMode2GLWrap[
|
||||
fCurrDrawState.fSamplerState.getWrapY()]));
|
||||
if (newTexParams.fWrapT != oldTexParams.fWrapT) {
|
||||
GR_GL(TexParameteri(GL_TEXTURE_2D,
|
||||
GL_TEXTURE_WRAP_T,
|
||||
newTexParams.fWrapT));
|
||||
}
|
||||
nextTexture->setSamplerState(fCurrDrawState.fSamplerState);
|
||||
nextTexture->setTexParams(newTexParams);
|
||||
} else {
|
||||
GrAssert(!"Rendering with texture vert flag set but no texture");
|
||||
if (NULL != fHWDrawState.fTexture) {
|
||||
|
@ -98,9 +98,6 @@ protected:
|
||||
// line width
|
||||
void flushGLStateCommon(PrimitiveType type);
|
||||
|
||||
// pushes the filtering and tiling modes to GL
|
||||
void setSamplerStateImm(const GrSamplerState& samplerState);
|
||||
|
||||
// set when this class changes the rendertarget.
|
||||
// Subclass should notice at flush time, take appropriate action,
|
||||
// and set false.
|
||||
|
Loading…
Reference in New Issue
Block a user