Commit 1c95795f by Jamie Madill Committed by Commit Bot

Use ImageIndex in ensureSubImageInitialized.

Passes an already initialized struct so we don't need to separately pass a level and layer. Also removes some redundant gl:: prefixes in Texture.cpp and adds a new helper function doesSubImageNeedInit. Refactoring change only. Bug: angleproject:4517 Change-Id: Ib2d8a5c9ceaada03cc8d299adcb5aed53a0cf13c Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2135928Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCourtney Goeltzenleuchter <courtneygo@google.com> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent c9c4e4ed
......@@ -37,9 +37,7 @@ size_t GetImageDescIndex(TextureTarget target, size_t level)
: level;
}
InitState DetermineInitState(const Context *context,
gl::Buffer *unpackBuffer,
const uint8_t *pixels)
InitState DetermineInitState(const Context *context, Buffer *unpackBuffer, const uint8_t *pixels)
{
// Can happen in tests.
if (!context || !context->isRobustResourceInitEnabled())
......@@ -222,12 +220,12 @@ const ImageDesc &TextureState::getBaseLevelDesc() const
return getImageDesc(getBaseImageTarget(), getEffectiveBaseLevel());
}
void TextureState::setCrop(const gl::Rectangle &rect)
void TextureState::setCrop(const Rectangle &rect)
{
mCropRect = rect;
}
const gl::Rectangle &TextureState::getCrop() const
const Rectangle &TextureState::getCrop() const
{
return mCropRect;
}
......@@ -935,7 +933,7 @@ const TextureState &Texture::getTextureState() const
return mState;
}
const gl::Extents &Texture::getExtents(TextureTarget target, size_t level) const
const Extents &Texture::getExtents(TextureTarget target, size_t level) const
{
ASSERT(TextureTargetToType(target) == mState.mType);
return mState.getImageDesc(target, level).size;
......@@ -1084,9 +1082,8 @@ angle::Result Texture::setSubImage(Context *context,
{
ASSERT(TextureTargetToType(target) == mState.mType);
ANGLE_TRY(ensureSubImageInitialized(context, target, level, area));
ImageIndex index = ImageIndex::MakeFromTarget(target, level, area.depth);
ANGLE_TRY(ensureSubImageInitialized(context, index, area));
ANGLE_TRY(mTexture->setSubImage(context, index, area, format, type, unpackState, unpackBuffer,
pixels));
......@@ -1118,7 +1115,7 @@ angle::Result Texture::setCompressedImage(Context *context,
ANGLE_TRY(mTexture->setCompressedImage(context, index, internalFormat, size, unpackState,
imageSize, pixels));
gl::Buffer *unpackBuffer = context->getState().getTargetBuffer(gl::BufferBinding::PixelUnpack);
Buffer *unpackBuffer = context->getState().getTargetBuffer(BufferBinding::PixelUnpack);
InitState initState = DetermineInitState(context, unpackBuffer, pixels);
mState.setImageDesc(target, level, ImageDesc(size, Format(internalFormat), initState));
......@@ -1138,9 +1135,8 @@ angle::Result Texture::setCompressedSubImage(const Context *context,
{
ASSERT(TextureTargetToType(target) == mState.mType);
ANGLE_TRY(ensureSubImageInitialized(context, target, level, area));
ImageIndex index = ImageIndex::MakeFromTarget(target, level, area.depth);
ANGLE_TRY(ensureSubImageInitialized(context, index, area));
ANGLE_TRY(mTexture->setCompressedSubImage(context, index, area, format, unpackState, imageSize,
pixels));
......@@ -1163,11 +1159,11 @@ angle::Result Texture::copyImage(Context *context,
ANGLE_TRY(releaseTexImageInternal(context));
ANGLE_TRY(orphanImages(context));
ImageIndex index = ImageIndex::MakeFromTarget(target, level, 1);
// Use the source FBO size as the init image area.
Box destBox(0, 0, 0, sourceArea.width, sourceArea.height, 1);
ANGLE_TRY(ensureSubImageInitialized(context, target, level, destBox));
ImageIndex index = ImageIndex::MakeFromTarget(target, level, 1);
ANGLE_TRY(ensureSubImageInitialized(context, index, destBox));
ANGLE_TRY(mTexture->copyImage(context, index, sourceArea, internalFormat, source));
......@@ -1215,8 +1211,7 @@ angle::Result Texture::copySubImage(Context *context,
}
}
ANGLE_TRY(
ensureSubImageInitialized(context, index.getTarget(), index.getLevelIndex(), destBox));
ANGLE_TRY(ensureSubImageInitialized(context, index, destBox));
ANGLE_TRY(mTexture->copySubImage(context, index, destOffset, sourceArea, source));
ANGLE_TRY(handleMipmapGenerationHint(context, index.getLevelIndex()));
......@@ -1283,9 +1278,8 @@ angle::Result Texture::copySubTexture(const Context *context,
Box destBox(destOffset.x, destOffset.y, destOffset.z, sourceBox.width, sourceBox.height,
sourceBox.depth);
ANGLE_TRY(ensureSubImageInitialized(context, target, level, destBox));
ImageIndex index = ImageIndex::MakeFromTarget(target, level, sourceBox.depth);
ANGLE_TRY(ensureSubImageInitialized(context, index, destBox));
ANGLE_TRY(mTexture->copySubTexture(context, index, destOffset, sourceLevel, sourceBox,
unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha,
......@@ -1704,12 +1698,12 @@ const ColorGeneric &Texture::getBorderColor() const
return mState.mSamplerState.getBorderColor();
}
void Texture::setCrop(const gl::Rectangle &rect)
void Texture::setCrop(const Rectangle &rect)
{
mState.setCrop(rect);
}
const gl::Rectangle &Texture::getCrop() const
const Rectangle &Texture::getCrop() const
{
return mState.getCrop();
}
......@@ -1858,36 +1852,40 @@ void Texture::setInitState(const ImageIndex &imageIndex, InitState initState)
}
}
angle::Result Texture::ensureSubImageInitialized(const Context *context,
TextureTarget target,
size_t level,
const gl::Box &area)
bool Texture::doesSubImageNeedInit(const Context *context,
const ImageIndex &imageIndex,
const Box &area) const
{
if (!context->isRobustResourceInitEnabled() || mState.mInitState == InitState::Initialized)
{
return angle::Result::Continue;
return false;
}
// Pre-initialize the texture contents if necessary.
// TODO(jmadill): Check if area overlaps the entire texture.
ImageIndex imageIndex =
ImageIndex::MakeFromTarget(target, static_cast<GLint>(level), area.depth);
const auto &desc = mState.getImageDesc(imageIndex);
if (desc.initState == InitState::MayNeedInit)
const ImageDesc &desc = mState.getImageDesc(imageIndex);
if (desc.initState != InitState::MayNeedInit)
{
ASSERT(mState.mInitState == InitState::MayNeedInit);
bool coversWholeImage = area.x == 0 && area.y == 0 && area.z == 0 &&
area.width == desc.size.width && area.height == desc.size.height &&
area.depth == desc.size.depth;
if (!coversWholeImage)
{
// NOTE: do not optimize this to only initialize the passed area of the texture, or the
// initialization logic in copySubImage will be incorrect.
ANGLE_TRY(initializeContents(context, imageIndex));
}
setInitState(imageIndex, InitState::Initialized);
return false;
}
ASSERT(mState.mInitState == InitState::MayNeedInit);
bool coversWholeImage = area.x == 0 && area.y == 0 && area.z == 0 &&
area.width == desc.size.width && area.height == desc.size.height &&
area.depth == desc.size.depth;
return !coversWholeImage;
}
angle::Result Texture::ensureSubImageInitialized(const Context *context,
const ImageIndex &imageIndex,
const Box &area)
{
if (doesSubImageNeedInit(context, imageIndex, area))
{
// NOTE: do not optimize this to only initialize the passed area of the texture, or the
// initialization logic in copySubImage will be incorrect.
ANGLE_TRY(initializeContents(context, imageIndex));
}
setInitState(imageIndex, InitState::Initialized);
return angle::Result::Continue;
}
......
......@@ -155,8 +155,8 @@ class TextureState final : private angle::NonCopyable
const ImageDesc &getBaseLevelDesc() const;
// GLES1 emulation: For GL_OES_draw_texture
void setCrop(const gl::Rectangle &rect);
const gl::Rectangle &getCrop() const;
void setCrop(const Rectangle &rect);
const Rectangle &getCrop() const;
// GLES1 emulation: Auto-mipmap generation is a texparameter
void setGenerateMipmapHint(GLenum hint);
......@@ -233,7 +233,7 @@ class TextureState final : private angle::NonCopyable
// GLES1 emulation: Texture crop rectangle
// For GL_OES_draw_texture
gl::Rectangle mCropRect;
Rectangle mCropRect;
// GLES1 emulation: Generate-mipmap hint per texture
GLenum mGenerateMipmapHint;
......@@ -331,7 +331,7 @@ class Texture final : public RefCountObject<TextureID>,
const TextureState &getTextureState() const;
const gl::Extents &getExtents(TextureTarget target, size_t level) const;
const Extents &getExtents(TextureTarget target, size_t level) const;
size_t getWidth(TextureTarget target, size_t level) const;
size_t getHeight(TextureTarget target, size_t level) const;
size_t getDepth(TextureTarget target, size_t level) const;
......@@ -516,8 +516,8 @@ class Texture final : public RefCountObject<TextureID>,
bool getAttachmentFixedSampleLocations(const ImageIndex &imageIndex) const;
// GLES1 emulation
void setCrop(const gl::Rectangle &rect);
const gl::Rectangle &getCrop() const;
void setCrop(const Rectangle &rect);
const Rectangle &getCrop() const;
void setGenerateMipmapHint(GLenum generate);
GLenum getGenerateMipmapHint() const;
......@@ -597,10 +597,12 @@ class Texture final : public RefCountObject<TextureID>,
void invalidateCompletenessCache() const;
angle::Result releaseTexImageInternal(Context *context);
bool doesSubImageNeedInit(const Context *context,
const ImageIndex &imageIndex,
const Box &area) const;
angle::Result ensureSubImageInitialized(const Context *context,
TextureTarget target,
size_t level,
const gl::Box &area);
const ImageIndex &imageIndex,
const Box &area);
angle::Result handleMipmapGenerationHint(Context *context, int level);
......
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