Commit 3377f51e by Corentin Wallez Committed by Commit Bot

TextureGL: track the currently applied state.

Use it to implement lazy state setting methods for texture filters and swizzle that will be used in subsequent workarounds. BUG=angleproject:1356 Change-Id: Ia58267c4f125262cf57fbd98438a6d8eb8a04b33 Reviewed-on: https://chromium-review.googlesource.com/412404Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Commit-Queue: Corentin Wallez <cwallez@chromium.org>
parent 41f9f673
...@@ -136,7 +136,10 @@ TextureGL::TextureGL(const gl::TextureState &state, ...@@ -136,7 +136,10 @@ TextureGL::TextureGL(const gl::TextureState &state,
mStateManager(stateManager), mStateManager(stateManager),
mBlitter(blitter), mBlitter(blitter),
mLevelInfo(gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS + 1), mLevelInfo(gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS + 1),
mAppliedTextureState(state.mTarget), mAppliedSwizzle(state.getSwizzleState()),
mAppliedSampler(state.getSamplerState()),
mAppliedBaseLevel(state.getEffectiveBaseLevel()),
mAppliedMaxLevel(state.getEffectiveMaxLevel()),
mTextureID(0) mTextureID(0)
{ {
ASSERT(mFunctions); ASSERT(mFunctions);
...@@ -818,74 +821,86 @@ void TextureGL::syncState(const gl::Texture::DirtyBits &dirtyBits) ...@@ -818,74 +821,86 @@ void TextureGL::syncState(const gl::Texture::DirtyBits &dirtyBits)
switch (dirtyBit) switch (dirtyBit)
{ {
case gl::Texture::DIRTY_BIT_MIN_FILTER: case gl::Texture::DIRTY_BIT_MIN_FILTER:
mAppliedSampler.minFilter = mState.getSamplerState().minFilter;
mFunctions->texParameteri(mState.mTarget, GL_TEXTURE_MIN_FILTER, mFunctions->texParameteri(mState.mTarget, GL_TEXTURE_MIN_FILTER,
mState.getSamplerState().minFilter); mAppliedSampler.minFilter);
break; break;
case gl::Texture::DIRTY_BIT_MAG_FILTER: case gl::Texture::DIRTY_BIT_MAG_FILTER:
mAppliedSampler.magFilter = mState.getSamplerState().magFilter;
mFunctions->texParameteri(mState.mTarget, GL_TEXTURE_MAG_FILTER, mFunctions->texParameteri(mState.mTarget, GL_TEXTURE_MAG_FILTER,
mState.getSamplerState().magFilter); mAppliedSampler.magFilter);
break; break;
case gl::Texture::DIRTY_BIT_WRAP_S: case gl::Texture::DIRTY_BIT_WRAP_S:
mFunctions->texParameteri(mState.mTarget, GL_TEXTURE_WRAP_S, mAppliedSampler.wrapS = mState.getSamplerState().wrapS;
mState.getSamplerState().wrapS); mFunctions->texParameteri(mState.mTarget, GL_TEXTURE_WRAP_S, mAppliedSampler.wrapS);
break; break;
case gl::Texture::DIRTY_BIT_WRAP_T: case gl::Texture::DIRTY_BIT_WRAP_T:
mFunctions->texParameteri(mState.mTarget, GL_TEXTURE_WRAP_T, mAppliedSampler.wrapT = mState.getSamplerState().wrapT;
mState.getSamplerState().wrapT); mFunctions->texParameteri(mState.mTarget, GL_TEXTURE_WRAP_T, mAppliedSampler.wrapT);
break; break;
case gl::Texture::DIRTY_BIT_WRAP_R: case gl::Texture::DIRTY_BIT_WRAP_R:
mFunctions->texParameteri(mState.mTarget, GL_TEXTURE_WRAP_R, mAppliedSampler.wrapR = mState.getSamplerState().wrapR;
mState.getSamplerState().wrapR); mFunctions->texParameteri(mState.mTarget, GL_TEXTURE_WRAP_R, mAppliedSampler.wrapR);
break; break;
case gl::Texture::DIRTY_BIT_MAX_ANISOTROPY: case gl::Texture::DIRTY_BIT_MAX_ANISOTROPY:
mAppliedSampler.maxAnisotropy = mState.getSamplerState().maxAnisotropy;
mFunctions->texParameterf(mState.mTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT, mFunctions->texParameterf(mState.mTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT,
mState.getSamplerState().maxAnisotropy); mAppliedSampler.maxAnisotropy);
break; break;
case gl::Texture::DIRTY_BIT_MIN_LOD: case gl::Texture::DIRTY_BIT_MIN_LOD:
mAppliedSampler.minLod = mState.getSamplerState().minLod;
mFunctions->texParameterf(mState.mTarget, GL_TEXTURE_MIN_LOD, mFunctions->texParameterf(mState.mTarget, GL_TEXTURE_MIN_LOD,
mState.getSamplerState().minLod); mAppliedSampler.minLod);
break; break;
case gl::Texture::DIRTY_BIT_MAX_LOD: case gl::Texture::DIRTY_BIT_MAX_LOD:
mAppliedSampler.maxLod = mState.getSamplerState().maxLod;
mFunctions->texParameterf(mState.mTarget, GL_TEXTURE_MAX_LOD, mFunctions->texParameterf(mState.mTarget, GL_TEXTURE_MAX_LOD,
mState.getSamplerState().maxLod); mAppliedSampler.maxLod);
break; break;
case gl::Texture::DIRTY_BIT_COMPARE_MODE: case gl::Texture::DIRTY_BIT_COMPARE_MODE:
mAppliedSampler.compareMode = mState.getSamplerState().compareMode;
mFunctions->texParameteri(mState.mTarget, GL_TEXTURE_COMPARE_MODE, mFunctions->texParameteri(mState.mTarget, GL_TEXTURE_COMPARE_MODE,
mState.getSamplerState().compareMode); mAppliedSampler.compareMode);
break; break;
case gl::Texture::DIRTY_BIT_COMPARE_FUNC: case gl::Texture::DIRTY_BIT_COMPARE_FUNC:
mAppliedSampler.compareFunc = mState.getSamplerState().compareFunc;
mFunctions->texParameteri(mState.mTarget, GL_TEXTURE_COMPARE_FUNC, mFunctions->texParameteri(mState.mTarget, GL_TEXTURE_COMPARE_FUNC,
mState.getSamplerState().compareFunc); mAppliedSampler.compareFunc);
break; break;
case gl::Texture::DIRTY_BIT_SRGB_DECODE: case gl::Texture::DIRTY_BIT_SRGB_DECODE:
mAppliedSampler.sRGBDecode = mState.getSamplerState().sRGBDecode;
mFunctions->texParameteri(mState.mTarget, GL_TEXTURE_SRGB_DECODE_EXT, mFunctions->texParameteri(mState.mTarget, GL_TEXTURE_SRGB_DECODE_EXT,
mState.getSamplerState().sRGBDecode); mAppliedSampler.sRGBDecode);
break; break;
// Texture state // Texture state
case gl::Texture::DIRTY_BIT_SWIZZLE_RED: case gl::Texture::DIRTY_BIT_SWIZZLE_RED:
syncTextureStateSwizzle(mFunctions, GL_TEXTURE_SWIZZLE_R, syncTextureStateSwizzle(mFunctions, GL_TEXTURE_SWIZZLE_R,
mState.getSwizzleState().swizzleRed); mState.getSwizzleState().swizzleRed,
&mAppliedSwizzle.swizzleRed);
break; break;
case gl::Texture::DIRTY_BIT_SWIZZLE_GREEN: case gl::Texture::DIRTY_BIT_SWIZZLE_GREEN:
syncTextureStateSwizzle(mFunctions, GL_TEXTURE_SWIZZLE_G, syncTextureStateSwizzle(mFunctions, GL_TEXTURE_SWIZZLE_G,
mState.getSwizzleState().swizzleGreen); mState.getSwizzleState().swizzleGreen,
&mAppliedSwizzle.swizzleGreen);
break; break;
case gl::Texture::DIRTY_BIT_SWIZZLE_BLUE: case gl::Texture::DIRTY_BIT_SWIZZLE_BLUE:
syncTextureStateSwizzle(mFunctions, GL_TEXTURE_SWIZZLE_B, syncTextureStateSwizzle(mFunctions, GL_TEXTURE_SWIZZLE_B,
mState.getSwizzleState().swizzleBlue); mState.getSwizzleState().swizzleBlue,
&mAppliedSwizzle.swizzleBlue);
break; break;
case gl::Texture::DIRTY_BIT_SWIZZLE_ALPHA: case gl::Texture::DIRTY_BIT_SWIZZLE_ALPHA:
syncTextureStateSwizzle(mFunctions, GL_TEXTURE_SWIZZLE_A, syncTextureStateSwizzle(mFunctions, GL_TEXTURE_SWIZZLE_A,
mState.getSwizzleState().swizzleAlpha); mState.getSwizzleState().swizzleAlpha,
&mAppliedSwizzle.swizzleAlpha);
break; break;
case gl::Texture::DIRTY_BIT_BASE_LEVEL: case gl::Texture::DIRTY_BIT_BASE_LEVEL:
mFunctions->texParameteri(mState.mTarget, GL_TEXTURE_BASE_LEVEL, mAppliedBaseLevel = mState.getEffectiveBaseLevel();
mState.getEffectiveBaseLevel()); mFunctions->texParameteri(mState.mTarget, GL_TEXTURE_BASE_LEVEL, mAppliedBaseLevel);
break; break;
case gl::Texture::DIRTY_BIT_MAX_LEVEL: case gl::Texture::DIRTY_BIT_MAX_LEVEL:
mFunctions->texParameteri(mState.mTarget, GL_TEXTURE_MAX_LEVEL, mAppliedMaxLevel = mState.getEffectiveMaxLevel();
mState.getEffectiveMaxLevel()); mFunctions->texParameteri(mState.mTarget, GL_TEXTURE_MAX_LEVEL, mAppliedMaxLevel);
break; break;
case gl::Texture::DIRTY_BIT_USAGE: case gl::Texture::DIRTY_BIT_USAGE:
break; break;
...@@ -903,7 +918,51 @@ bool TextureGL::hasAnyDirtyBit() const ...@@ -903,7 +918,51 @@ bool TextureGL::hasAnyDirtyBit() const
return mLocalDirtyBits.any(); return mLocalDirtyBits.any();
} }
void TextureGL::syncTextureStateSwizzle(const FunctionsGL *functions, GLenum name, GLenum value) void TextureGL::setMinFilter(GLenum filter)
{
if (filter != mAppliedSampler.minFilter)
{
mAppliedSampler.minFilter = filter;
mLocalDirtyBits.set(gl::Texture::DIRTY_BIT_MIN_FILTER);
mStateManager->bindTexture(mState.mTarget, mTextureID);
mFunctions->texParameteri(mState.mTarget, GL_TEXTURE_MIN_FILTER, filter);
}
}
void TextureGL::setMagFilter(GLenum filter)
{
if (filter != mAppliedSampler.magFilter)
{
mAppliedSampler.magFilter = filter;
mLocalDirtyBits.set(gl::Texture::DIRTY_BIT_MAG_FILTER);
mStateManager->bindTexture(mState.mTarget, mTextureID);
mFunctions->texParameteri(mState.mTarget, GL_TEXTURE_MAG_FILTER, filter);
}
}
void TextureGL::setSwizzle(GLint swizzle[4])
{
gl::SwizzleState resultingSwizzle =
gl::SwizzleState(swizzle[0], swizzle[1], swizzle[2], swizzle[3]);
if (resultingSwizzle != mAppliedSwizzle)
{
mAppliedSwizzle = resultingSwizzle;
mLocalDirtyBits.set(gl::Texture::DIRTY_BIT_SWIZZLE_RED);
mLocalDirtyBits.set(gl::Texture::DIRTY_BIT_SWIZZLE_GREEN);
mLocalDirtyBits.set(gl::Texture::DIRTY_BIT_SWIZZLE_BLUE);
mLocalDirtyBits.set(gl::Texture::DIRTY_BIT_SWIZZLE_ALPHA);
mStateManager->bindTexture(mState.mTarget, mTextureID);
mFunctions->texParameteriv(mState.mTarget, GL_TEXTURE_SWIZZLE_RGBA, swizzle);
}
}
void TextureGL::syncTextureStateSwizzle(const FunctionsGL *functions,
GLenum name,
GLenum value,
GLenum *outValue)
{ {
const LevelInfoGL &levelInfo = mLevelInfo[mState.getEffectiveBaseLevel()]; const LevelInfoGL &levelInfo = mLevelInfo[mState.getEffectiveBaseLevel()];
GLenum resultSwizzle = value; GLenum resultSwizzle = value;
...@@ -1011,6 +1070,7 @@ void TextureGL::syncTextureStateSwizzle(const FunctionsGL *functions, GLenum nam ...@@ -1011,6 +1070,7 @@ void TextureGL::syncTextureStateSwizzle(const FunctionsGL *functions, GLenum nam
} }
*outValue = resultSwizzle;
functions->texParameteri(mState.mTarget, name, resultSwizzle); functions->texParameteri(mState.mTarget, name, resultSwizzle);
} }
......
...@@ -94,6 +94,11 @@ class TextureGL : public TextureImpl ...@@ -94,6 +94,11 @@ class TextureGL : public TextureImpl
void syncState(const gl::Texture::DirtyBits &dirtyBits) override; void syncState(const gl::Texture::DirtyBits &dirtyBits) override;
bool hasAnyDirtyBit() const; bool hasAnyDirtyBit() const;
void setMinFilter(GLenum filter);
void setMagFilter(GLenum filter);
void setSwizzle(GLint swizzle[4]);
private: private:
void setImageHelper(GLenum target, void setImageHelper(GLenum target,
size_t level, size_t level,
...@@ -124,7 +129,10 @@ class TextureGL : public TextureImpl ...@@ -124,7 +129,10 @@ class TextureGL : public TextureImpl
const gl::PixelUnpackState &unpack, const gl::PixelUnpackState &unpack,
const uint8_t *pixels); const uint8_t *pixels);
void syncTextureStateSwizzle(const FunctionsGL *functions, GLenum name, GLenum value); void syncTextureStateSwizzle(const FunctionsGL *functions,
GLenum name,
GLenum value,
GLenum *outValue);
void setLevelInfo(size_t level, size_t levelCount, const LevelInfoGL &levelInfo); void setLevelInfo(size_t level, size_t levelCount, const LevelInfoGL &levelInfo);
...@@ -136,7 +144,11 @@ class TextureGL : public TextureImpl ...@@ -136,7 +144,11 @@ class TextureGL : public TextureImpl
std::vector<LevelInfoGL> mLevelInfo; std::vector<LevelInfoGL> mLevelInfo;
gl::Texture::DirtyBits mLocalDirtyBits; gl::Texture::DirtyBits mLocalDirtyBits;
mutable gl::TextureState mAppliedTextureState; gl::SwizzleState mAppliedSwizzle;
gl::SamplerState mAppliedSampler;
GLuint mAppliedBaseLevel;
GLuint mAppliedMaxLevel;
GLuint mTextureID; GLuint mTextureID;
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment