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) ...@@ -37,9 +37,7 @@ size_t GetImageDescIndex(TextureTarget target, size_t level)
: level; : level;
} }
InitState DetermineInitState(const Context *context, InitState DetermineInitState(const Context *context, Buffer *unpackBuffer, const uint8_t *pixels)
gl::Buffer *unpackBuffer,
const uint8_t *pixels)
{ {
// Can happen in tests. // Can happen in tests.
if (!context || !context->isRobustResourceInitEnabled()) if (!context || !context->isRobustResourceInitEnabled())
...@@ -222,12 +220,12 @@ const ImageDesc &TextureState::getBaseLevelDesc() const ...@@ -222,12 +220,12 @@ const ImageDesc &TextureState::getBaseLevelDesc() const
return getImageDesc(getBaseImageTarget(), getEffectiveBaseLevel()); return getImageDesc(getBaseImageTarget(), getEffectiveBaseLevel());
} }
void TextureState::setCrop(const gl::Rectangle &rect) void TextureState::setCrop(const Rectangle &rect)
{ {
mCropRect = rect; mCropRect = rect;
} }
const gl::Rectangle &TextureState::getCrop() const const Rectangle &TextureState::getCrop() const
{ {
return mCropRect; return mCropRect;
} }
...@@ -935,7 +933,7 @@ const TextureState &Texture::getTextureState() const ...@@ -935,7 +933,7 @@ const TextureState &Texture::getTextureState() const
return mState; 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); ASSERT(TextureTargetToType(target) == mState.mType);
return mState.getImageDesc(target, level).size; return mState.getImageDesc(target, level).size;
...@@ -1084,9 +1082,8 @@ angle::Result Texture::setSubImage(Context *context, ...@@ -1084,9 +1082,8 @@ angle::Result Texture::setSubImage(Context *context,
{ {
ASSERT(TextureTargetToType(target) == mState.mType); ASSERT(TextureTargetToType(target) == mState.mType);
ANGLE_TRY(ensureSubImageInitialized(context, target, level, area));
ImageIndex index = ImageIndex::MakeFromTarget(target, level, area.depth); 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, ANGLE_TRY(mTexture->setSubImage(context, index, area, format, type, unpackState, unpackBuffer,
pixels)); pixels));
...@@ -1118,7 +1115,7 @@ angle::Result Texture::setCompressedImage(Context *context, ...@@ -1118,7 +1115,7 @@ angle::Result Texture::setCompressedImage(Context *context,
ANGLE_TRY(mTexture->setCompressedImage(context, index, internalFormat, size, unpackState, ANGLE_TRY(mTexture->setCompressedImage(context, index, internalFormat, size, unpackState,
imageSize, pixels)); imageSize, pixels));
gl::Buffer *unpackBuffer = context->getState().getTargetBuffer(gl::BufferBinding::PixelUnpack); Buffer *unpackBuffer = context->getState().getTargetBuffer(BufferBinding::PixelUnpack);
InitState initState = DetermineInitState(context, unpackBuffer, pixels); InitState initState = DetermineInitState(context, unpackBuffer, pixels);
mState.setImageDesc(target, level, ImageDesc(size, Format(internalFormat), initState)); mState.setImageDesc(target, level, ImageDesc(size, Format(internalFormat), initState));
...@@ -1138,9 +1135,8 @@ angle::Result Texture::setCompressedSubImage(const Context *context, ...@@ -1138,9 +1135,8 @@ angle::Result Texture::setCompressedSubImage(const Context *context,
{ {
ASSERT(TextureTargetToType(target) == mState.mType); ASSERT(TextureTargetToType(target) == mState.mType);
ANGLE_TRY(ensureSubImageInitialized(context, target, level, area));
ImageIndex index = ImageIndex::MakeFromTarget(target, level, area.depth); ImageIndex index = ImageIndex::MakeFromTarget(target, level, area.depth);
ANGLE_TRY(ensureSubImageInitialized(context, index, area));
ANGLE_TRY(mTexture->setCompressedSubImage(context, index, area, format, unpackState, imageSize, ANGLE_TRY(mTexture->setCompressedSubImage(context, index, area, format, unpackState, imageSize,
pixels)); pixels));
...@@ -1163,11 +1159,11 @@ angle::Result Texture::copyImage(Context *context, ...@@ -1163,11 +1159,11 @@ angle::Result Texture::copyImage(Context *context,
ANGLE_TRY(releaseTexImageInternal(context)); ANGLE_TRY(releaseTexImageInternal(context));
ANGLE_TRY(orphanImages(context)); ANGLE_TRY(orphanImages(context));
ImageIndex index = ImageIndex::MakeFromTarget(target, level, 1);
// Use the source FBO size as the init image area. // Use the source FBO size as the init image area.
Box destBox(0, 0, 0, sourceArea.width, sourceArea.height, 1); Box destBox(0, 0, 0, sourceArea.width, sourceArea.height, 1);
ANGLE_TRY(ensureSubImageInitialized(context, target, level, destBox)); ANGLE_TRY(ensureSubImageInitialized(context, index, destBox));
ImageIndex index = ImageIndex::MakeFromTarget(target, level, 1);
ANGLE_TRY(mTexture->copyImage(context, index, sourceArea, internalFormat, source)); ANGLE_TRY(mTexture->copyImage(context, index, sourceArea, internalFormat, source));
...@@ -1215,8 +1211,7 @@ angle::Result Texture::copySubImage(Context *context, ...@@ -1215,8 +1211,7 @@ angle::Result Texture::copySubImage(Context *context,
} }
} }
ANGLE_TRY( ANGLE_TRY(ensureSubImageInitialized(context, index, destBox));
ensureSubImageInitialized(context, index.getTarget(), index.getLevelIndex(), destBox));
ANGLE_TRY(mTexture->copySubImage(context, index, destOffset, sourceArea, source)); ANGLE_TRY(mTexture->copySubImage(context, index, destOffset, sourceArea, source));
ANGLE_TRY(handleMipmapGenerationHint(context, index.getLevelIndex())); ANGLE_TRY(handleMipmapGenerationHint(context, index.getLevelIndex()));
...@@ -1283,9 +1278,8 @@ angle::Result Texture::copySubTexture(const Context *context, ...@@ -1283,9 +1278,8 @@ angle::Result Texture::copySubTexture(const Context *context,
Box destBox(destOffset.x, destOffset.y, destOffset.z, sourceBox.width, sourceBox.height, Box destBox(destOffset.x, destOffset.y, destOffset.z, sourceBox.width, sourceBox.height,
sourceBox.depth); sourceBox.depth);
ANGLE_TRY(ensureSubImageInitialized(context, target, level, destBox));
ImageIndex index = ImageIndex::MakeFromTarget(target, level, sourceBox.depth); ImageIndex index = ImageIndex::MakeFromTarget(target, level, sourceBox.depth);
ANGLE_TRY(ensureSubImageInitialized(context, index, destBox));
ANGLE_TRY(mTexture->copySubTexture(context, index, destOffset, sourceLevel, sourceBox, ANGLE_TRY(mTexture->copySubTexture(context, index, destOffset, sourceLevel, sourceBox,
unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha, unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha,
...@@ -1704,12 +1698,12 @@ const ColorGeneric &Texture::getBorderColor() const ...@@ -1704,12 +1698,12 @@ const ColorGeneric &Texture::getBorderColor() const
return mState.mSamplerState.getBorderColor(); return mState.mSamplerState.getBorderColor();
} }
void Texture::setCrop(const gl::Rectangle &rect) void Texture::setCrop(const Rectangle &rect)
{ {
mState.setCrop(rect); mState.setCrop(rect);
} }
const gl::Rectangle &Texture::getCrop() const const Rectangle &Texture::getCrop() const
{ {
return mState.getCrop(); return mState.getCrop();
} }
...@@ -1858,36 +1852,40 @@ void Texture::setInitState(const ImageIndex &imageIndex, InitState initState) ...@@ -1858,36 +1852,40 @@ void Texture::setInitState(const ImageIndex &imageIndex, InitState initState)
} }
} }
angle::Result Texture::ensureSubImageInitialized(const Context *context, bool Texture::doesSubImageNeedInit(const Context *context,
TextureTarget target, const ImageIndex &imageIndex,
size_t level, const Box &area) const
const gl::Box &area)
{ {
if (!context->isRobustResourceInitEnabled() || mState.mInitState == InitState::Initialized) if (!context->isRobustResourceInitEnabled() || mState.mInitState == InitState::Initialized)
{ {
return angle::Result::Continue; return false;
} }
// Pre-initialize the texture contents if necessary. // Pre-initialize the texture contents if necessary.
// TODO(jmadill): Check if area overlaps the entire texture. const ImageDesc &desc = mState.getImageDesc(imageIndex);
ImageIndex imageIndex = if (desc.initState != InitState::MayNeedInit)
ImageIndex::MakeFromTarget(target, static_cast<GLint>(level), area.depth);
const auto &desc = mState.getImageDesc(imageIndex);
if (desc.initState == InitState::MayNeedInit)
{ {
ASSERT(mState.mInitState == InitState::MayNeedInit); return false;
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);
} }
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; return angle::Result::Continue;
} }
......
...@@ -155,8 +155,8 @@ class TextureState final : private angle::NonCopyable ...@@ -155,8 +155,8 @@ class TextureState final : private angle::NonCopyable
const ImageDesc &getBaseLevelDesc() const; const ImageDesc &getBaseLevelDesc() const;
// GLES1 emulation: For GL_OES_draw_texture // GLES1 emulation: For GL_OES_draw_texture
void setCrop(const gl::Rectangle &rect); void setCrop(const Rectangle &rect);
const gl::Rectangle &getCrop() const; const Rectangle &getCrop() const;
// GLES1 emulation: Auto-mipmap generation is a texparameter // GLES1 emulation: Auto-mipmap generation is a texparameter
void setGenerateMipmapHint(GLenum hint); void setGenerateMipmapHint(GLenum hint);
...@@ -233,7 +233,7 @@ class TextureState final : private angle::NonCopyable ...@@ -233,7 +233,7 @@ class TextureState final : private angle::NonCopyable
// GLES1 emulation: Texture crop rectangle // GLES1 emulation: Texture crop rectangle
// For GL_OES_draw_texture // For GL_OES_draw_texture
gl::Rectangle mCropRect; Rectangle mCropRect;
// GLES1 emulation: Generate-mipmap hint per texture // GLES1 emulation: Generate-mipmap hint per texture
GLenum mGenerateMipmapHint; GLenum mGenerateMipmapHint;
...@@ -331,7 +331,7 @@ class Texture final : public RefCountObject<TextureID>, ...@@ -331,7 +331,7 @@ class Texture final : public RefCountObject<TextureID>,
const TextureState &getTextureState() const; 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 getWidth(TextureTarget target, size_t level) const;
size_t getHeight(TextureTarget target, size_t level) const; size_t getHeight(TextureTarget target, size_t level) const;
size_t getDepth(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>, ...@@ -516,8 +516,8 @@ class Texture final : public RefCountObject<TextureID>,
bool getAttachmentFixedSampleLocations(const ImageIndex &imageIndex) const; bool getAttachmentFixedSampleLocations(const ImageIndex &imageIndex) const;
// GLES1 emulation // GLES1 emulation
void setCrop(const gl::Rectangle &rect); void setCrop(const Rectangle &rect);
const gl::Rectangle &getCrop() const; const Rectangle &getCrop() const;
void setGenerateMipmapHint(GLenum generate); void setGenerateMipmapHint(GLenum generate);
GLenum getGenerateMipmapHint() const; GLenum getGenerateMipmapHint() const;
...@@ -597,10 +597,12 @@ class Texture final : public RefCountObject<TextureID>, ...@@ -597,10 +597,12 @@ class Texture final : public RefCountObject<TextureID>,
void invalidateCompletenessCache() const; void invalidateCompletenessCache() const;
angle::Result releaseTexImageInternal(Context *context); angle::Result releaseTexImageInternal(Context *context);
bool doesSubImageNeedInit(const Context *context,
const ImageIndex &imageIndex,
const Box &area) const;
angle::Result ensureSubImageInitialized(const Context *context, angle::Result ensureSubImageInitialized(const Context *context,
TextureTarget target, const ImageIndex &imageIndex,
size_t level, const Box &area);
const gl::Box &area);
angle::Result handleMipmapGenerationHint(Context *context, int level); 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