Commit 125e220e by Geoff Lang

Track LevelInfoGL per cube map face.

When transitioning between formats in cube maps, tracking of luma workaround information would become incorrect because it was only tracked per-level. There are no failing tests due to this because once the cube map is complete again, the tracking is correct. TEST=conformance/more/conformance/quickCheckAPI-S_V.html BUG=angleproject:2074 Change-Id: If4e1e94061208f0cf3668b2bd6be59a9a21e42b6 Reviewed-on: https://chromium-review.googlesource.com/539956 Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org>
parent fe54834f
...@@ -31,6 +31,13 @@ namespace rx ...@@ -31,6 +31,13 @@ namespace rx
namespace namespace
{ {
size_t GetLevelInfoIndex(GLenum target, size_t level)
{
return gl::IsCubeMapTextureTarget(target)
? ((level * 6) + gl::CubeMapTextureTargetToLayerIndex(target))
: level;
}
bool UseTexImage2D(GLenum textureType) bool UseTexImage2D(GLenum textureType)
{ {
return textureType == GL_TEXTURE_2D || textureType == GL_TEXTURE_CUBE_MAP; return textureType == GL_TEXTURE_2D || textureType == GL_TEXTURE_CUBE_MAP;
...@@ -127,7 +134,7 @@ TextureGL::TextureGL(const gl::TextureState &state, ...@@ -127,7 +134,7 @@ TextureGL::TextureGL(const gl::TextureState &state,
mWorkarounds(workarounds), mWorkarounds(workarounds),
mStateManager(stateManager), mStateManager(stateManager),
mBlitter(blitter), mBlitter(blitter),
mLevelInfo(gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS + 1), mLevelInfo(),
mAppliedSwizzle(state.getSwizzleState()), mAppliedSwizzle(state.getSwizzleState()),
mAppliedSampler(state.getSamplerState()), mAppliedSampler(state.getSamplerState()),
mAppliedBaseLevel(state.getEffectiveBaseLevel()), mAppliedBaseLevel(state.getEffectiveBaseLevel()),
...@@ -140,6 +147,8 @@ TextureGL::TextureGL(const gl::TextureState &state, ...@@ -140,6 +147,8 @@ TextureGL::TextureGL(const gl::TextureState &state,
mFunctions->genTextures(1, &mTextureID); mFunctions->genTextures(1, &mTextureID);
mStateManager->bindTexture(getTarget(), mTextureID); mStateManager->bindTexture(getTarget(), mTextureID);
mLevelInfo.resize((gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS + 1) *
(getTarget() == GL_TEXTURE_CUBE_MAP ? 6 : 1));
} }
TextureGL::~TextureGL() TextureGL::~TextureGL()
...@@ -235,7 +244,7 @@ void TextureGL::setImageHelper(GLenum target, ...@@ -235,7 +244,7 @@ void TextureGL::setImageHelper(GLenum target,
UNREACHABLE(); UNREACHABLE();
} }
setLevelInfo(level, 1, GetLevelInfo(internalFormat, texImageFormat.internalFormat)); setLevelInfo(target, level, 1, GetLevelInfo(internalFormat, texImageFormat.internalFormat));
} }
void TextureGL::reserveTexImageToBeFilled(GLenum target, void TextureGL::reserveTexImageToBeFilled(GLenum target,
...@@ -264,7 +273,7 @@ gl::Error TextureGL::setSubImage(const gl::Context *context, ...@@ -264,7 +273,7 @@ gl::Error TextureGL::setSubImage(const gl::Context *context,
nativegl::TexSubImageFormat texSubImageFormat = nativegl::TexSubImageFormat texSubImageFormat =
nativegl::GetTexSubImageFormat(mFunctions, mWorkarounds, format, type); nativegl::GetTexSubImageFormat(mFunctions, mWorkarounds, format, type);
ASSERT(mLevelInfo[level].lumaWorkaround.enabled == ASSERT(getLevelInfo(target, level).lumaWorkaround.enabled ==
GetLevelInfo(format, texSubImageFormat.format).lumaWorkaround.enabled); GetLevelInfo(format, texSubImageFormat.format).lumaWorkaround.enabled);
mStateManager->bindTexture(getTarget(), mTextureID); mStateManager->bindTexture(getTarget(), mTextureID);
...@@ -482,8 +491,9 @@ gl::Error TextureGL::setCompressedImage(const gl::Context *context, ...@@ -482,8 +491,9 @@ gl::Error TextureGL::setCompressedImage(const gl::Context *context,
UNREACHABLE(); UNREACHABLE();
} }
setLevelInfo(level, 1, GetLevelInfo(internalFormat, compressedTexImageFormat.internalFormat)); LevelInfoGL levelInfo = GetLevelInfo(internalFormat, compressedTexImageFormat.internalFormat);
ASSERT(!mLevelInfo[level].lumaWorkaround.enabled); ASSERT(!levelInfo.lumaWorkaround.enabled);
setLevelInfo(target, level, 1, levelInfo);
return gl::NoError(); return gl::NoError();
} }
...@@ -522,7 +532,7 @@ gl::Error TextureGL::setCompressedSubImage(const gl::Context *context, ...@@ -522,7 +532,7 @@ gl::Error TextureGL::setCompressedSubImage(const gl::Context *context,
UNREACHABLE(); UNREACHABLE();
} }
ASSERT(!mLevelInfo[level].lumaWorkaround.enabled && ASSERT(!getLevelInfo(target, level).lumaWorkaround.enabled &&
!GetLevelInfo(format, compressedTexSubImageFormat.format).lumaWorkaround.enabled); !GetLevelInfo(format, compressedTexSubImageFormat.format).lumaWorkaround.enabled);
return gl::NoError(); return gl::NoError();
...@@ -569,7 +579,7 @@ gl::Error TextureGL::copyImage(const gl::Context *context, ...@@ -569,7 +579,7 @@ gl::Error TextureGL::copyImage(const gl::Context *context,
} }
} }
setLevelInfo(level, 1, levelInfo); setLevelInfo(target, level, 1, levelInfo);
return gl::NoError(); return gl::NoError();
} }
...@@ -586,7 +596,7 @@ gl::Error TextureGL::copySubImage(const gl::Context *context, ...@@ -586,7 +596,7 @@ gl::Error TextureGL::copySubImage(const gl::Context *context,
mStateManager->bindTexture(getTarget(), mTextureID); mStateManager->bindTexture(getTarget(), mTextureID);
mStateManager->bindFramebuffer(GL_READ_FRAMEBUFFER, sourceFramebufferGL->getFramebufferID()); mStateManager->bindFramebuffer(GL_READ_FRAMEBUFFER, sourceFramebufferGL->getFramebufferID());
const LevelInfoGL &levelInfo = mLevelInfo[level]; const LevelInfoGL &levelInfo = getLevelInfo(target, level);
if (levelInfo.lumaWorkaround.enabled) if (levelInfo.lumaWorkaround.enabled)
{ {
gl::Error error = mBlitter->copySubImageToLUMAWorkaroundTexture( gl::Error error = mBlitter->copySubImageToLUMAWorkaroundTexture(
...@@ -677,7 +687,9 @@ gl::Error TextureGL::copySubTextureHelper(GLenum target, ...@@ -677,7 +687,9 @@ gl::Error TextureGL::copySubTextureHelper(GLenum target,
sourceGL->mState.getImageDesc(source->getTarget(), sourceLevel); sourceGL->mState.getImageDesc(source->getTarget(), sourceLevel);
// Check is this is a simple copySubTexture that can be done with a copyTexSubImage // Check is this is a simple copySubTexture that can be done with a copyTexSubImage
bool needsLumaWorkaround = sourceGL->mLevelInfo[sourceLevel].lumaWorkaround.enabled; ASSERT(sourceGL->getTarget() == GL_TEXTURE_2D);
const LevelInfoGL &sourceLevelInfo = sourceGL->getLevelInfo(source->getTarget(), sourceLevel);
bool needsLumaWorkaround = sourceLevelInfo.lumaWorkaround.enabled;
GLenum sourceFormat = sourceImageDesc.format.info->format; GLenum sourceFormat = sourceImageDesc.format.info->format;
bool sourceFormatContainSupersetOfDestFormat = bool sourceFormatContainSupersetOfDestFormat =
...@@ -693,10 +705,10 @@ gl::Error TextureGL::copySubTextureHelper(GLenum target, ...@@ -693,10 +705,10 @@ gl::Error TextureGL::copySubTextureHelper(GLenum target,
} }
// We can't use copyTexSubImage, do a manual copy // We can't use copyTexSubImage, do a manual copy
return mBlitter->copySubTexture( return mBlitter->copySubTexture(sourceGL, sourceLevel, this, target, level,
sourceGL, sourceLevel, this, target, level, sourceImageDesc.size, sourceArea, destOffset, sourceImageDesc.size, sourceArea, destOffset,
needsLumaWorkaround, sourceGL->mLevelInfo[sourceLevel].sourceFormat, unpackFlipY, needsLumaWorkaround, sourceLevelInfo.sourceFormat, unpackFlipY,
unpackPremultiplyAlpha, unpackUnmultiplyAlpha); unpackPremultiplyAlpha, unpackUnmultiplyAlpha);
} }
gl::Error TextureGL::setStorage(const gl::Context *context, gl::Error TextureGL::setStorage(const gl::Context *context,
...@@ -860,7 +872,7 @@ gl::Error TextureGL::setStorage(const gl::Context *context, ...@@ -860,7 +872,7 @@ gl::Error TextureGL::setStorage(const gl::Context *context,
UNREACHABLE(); UNREACHABLE();
} }
setLevelInfo(0, levels, GetLevelInfo(internalFormat, texStorageFormat.internalFormat)); setLevelInfo(target, 0, levels, GetLevelInfo(internalFormat, texStorageFormat.internalFormat));
return gl::NoError(); return gl::NoError();
} }
...@@ -882,7 +894,7 @@ gl::Error TextureGL::setStorageMultisample(const gl::Context *context, ...@@ -882,7 +894,7 @@ gl::Error TextureGL::setStorageMultisample(const gl::Context *context,
mFunctions->texStorage2DMultisample(target, samples, texStorageFormat.internalFormat, mFunctions->texStorage2DMultisample(target, samples, texStorageFormat.internalFormat,
size.width, size.height, fixedSampleLocations); size.width, size.height, fixedSampleLocations);
setLevelInfo(0, 1, GetLevelInfo(internalFormat, texStorageFormat.internalFormat)); setLevelInfo(target, 0, 1, GetLevelInfo(internalFormat, texStorageFormat.internalFormat));
return gl::NoError(); return gl::NoError();
} }
...@@ -903,9 +915,8 @@ gl::Error TextureGL::generateMipmap(const gl::Context *context) ...@@ -903,9 +915,8 @@ gl::Error TextureGL::generateMipmap(const gl::Context *context)
const GLuint effectiveBaseLevel = mState.getEffectiveBaseLevel(); const GLuint effectiveBaseLevel = mState.getEffectiveBaseLevel();
const GLuint maxLevel = mState.getMipmapMaxLevel(); const GLuint maxLevel = mState.getMipmapMaxLevel();
ASSERT(maxLevel < mLevelInfo.size()); setLevelInfo(getTarget(), effectiveBaseLevel, maxLevel - effectiveBaseLevel,
getBaseLevelInfo());
setLevelInfo(effectiveBaseLevel, maxLevel - effectiveBaseLevel, mLevelInfo[effectiveBaseLevel]);
return gl::NoError(); return gl::NoError();
} }
...@@ -917,7 +928,7 @@ void TextureGL::bindTexImage(egl::Surface *surface) ...@@ -917,7 +928,7 @@ void TextureGL::bindTexImage(egl::Surface *surface)
// Make sure this texture is bound // Make sure this texture is bound
mStateManager->bindTexture(getTarget(), mTextureID); mStateManager->bindTexture(getTarget(), mTextureID);
setLevelInfo(0, 1, LevelInfoGL()); setLevelInfo(getTarget(), 0, 1, LevelInfoGL());
} }
void TextureGL::releaseTexImage() void TextureGL::releaseTexImage()
...@@ -1117,7 +1128,7 @@ void TextureGL::syncTextureStateSwizzle(const FunctionsGL *functions, ...@@ -1117,7 +1128,7 @@ void TextureGL::syncTextureStateSwizzle(const FunctionsGL *functions,
GLenum value, GLenum value,
GLenum *outValue) GLenum *outValue)
{ {
const LevelInfoGL &levelInfo = mLevelInfo[mState.getEffectiveBaseLevel()]; const LevelInfoGL &levelInfo = getBaseLevelInfo();
GLenum resultSwizzle = value; GLenum resultSwizzle = value;
if (levelInfo.lumaWorkaround.enabled || levelInfo.depthStencilWorkaround) if (levelInfo.lumaWorkaround.enabled || levelInfo.depthStencilWorkaround)
{ {
...@@ -1227,9 +1238,12 @@ void TextureGL::syncTextureStateSwizzle(const FunctionsGL *functions, ...@@ -1227,9 +1238,12 @@ void TextureGL::syncTextureStateSwizzle(const FunctionsGL *functions,
functions->texParameteri(getTarget(), name, resultSwizzle); functions->texParameteri(getTarget(), name, resultSwizzle);
} }
void TextureGL::setLevelInfo(size_t level, size_t levelCount, const LevelInfoGL &levelInfo) void TextureGL::setLevelInfo(GLenum target,
size_t level,
size_t levelCount,
const LevelInfoGL &levelInfo)
{ {
ASSERT(levelCount > 0 && level + levelCount < mLevelInfo.size()); ASSERT(levelCount > 0);
GLuint baseLevel = mState.getEffectiveBaseLevel(); GLuint baseLevel = mState.getEffectiveBaseLevel();
bool needsResync = level <= baseLevel && level + levelCount >= baseLevel && bool needsResync = level <= baseLevel && level + levelCount >= baseLevel &&
...@@ -1241,10 +1255,39 @@ void TextureGL::setLevelInfo(size_t level, size_t levelCount, const LevelInfoGL ...@@ -1241,10 +1255,39 @@ void TextureGL::setLevelInfo(size_t level, size_t levelCount, const LevelInfoGL
for (size_t i = level; i < level + levelCount; i++) for (size_t i = level; i < level + levelCount; i++)
{ {
mLevelInfo[i] = levelInfo; if (target == GL_TEXTURE_CUBE_MAP)
{
for (GLenum face = gl::FirstCubeMapTextureTarget; face <= gl::LastCubeMapTextureTarget;
face++)
{
size_t index = GetLevelInfoIndex(face, level);
ASSERT(index < mLevelInfo.size());
mLevelInfo[index] = levelInfo;
}
}
else
{
size_t index = GetLevelInfoIndex(target, level);
ASSERT(index < mLevelInfo.size());
mLevelInfo[index] = levelInfo;
}
} }
} }
const LevelInfoGL &TextureGL::getLevelInfo(GLenum target, size_t level) const
{
ASSERT(target != GL_TEXTURE_CUBE_MAP);
return mLevelInfo[GetLevelInfoIndex(target, level)];
}
const LevelInfoGL &TextureGL::getBaseLevelInfo() const
{
GLint effectiveBaseLevel = mState.getEffectiveBaseLevel();
GLenum target =
getTarget() == GL_TEXTURE_CUBE_MAP ? gl::FirstCubeMapTextureTarget : getTarget();
return getLevelInfo(target, effectiveBaseLevel);
}
GLuint TextureGL::getTextureID() const GLuint TextureGL::getTextureID() const
{ {
return mTextureID; return mTextureID;
......
...@@ -211,7 +211,9 @@ class TextureGL : public TextureImpl ...@@ -211,7 +211,9 @@ class TextureGL : public TextureImpl
GLenum value, GLenum value,
GLenum *outValue); GLenum *outValue);
void setLevelInfo(size_t level, size_t levelCount, const LevelInfoGL &levelInfo); void setLevelInfo(GLenum target, size_t level, size_t levelCount, const LevelInfoGL &levelInfo);
const LevelInfoGL &getLevelInfo(GLenum target, size_t level) const;
const LevelInfoGL &getBaseLevelInfo() const;
const FunctionsGL *mFunctions; const FunctionsGL *mFunctions;
const WorkaroundsGL &mWorkarounds; const WorkaroundsGL &mWorkarounds;
......
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