@@ -37,9 +37,7 @@ size_t GetImageDescIndex(TextureTarget target, size_t level)
3737 : level;
3838}
3939
40- InitState DetermineInitState (const Context *context,
41- gl::Buffer *unpackBuffer,
42- const uint8_t *pixels)
40+ InitState DetermineInitState (const Context *context, Buffer *unpackBuffer, const uint8_t *pixels)
4341{
4442 // Can happen in tests.
4543 if (!context || !context->isRobustResourceInitEnabled ())
@@ -222,12 +220,12 @@ const ImageDesc &TextureState::getBaseLevelDesc() const
222220 return getImageDesc (getBaseImageTarget (), getEffectiveBaseLevel ());
223221}
224222
225- void TextureState::setCrop (const gl:: Rectangle &rect)
223+ void TextureState::setCrop (const Rectangle &rect)
226224{
227225 mCropRect = rect;
228226}
229227
230- const gl:: Rectangle &TextureState::getCrop () const
228+ const Rectangle &TextureState::getCrop () const
231229{
232230 return mCropRect ;
233231}
@@ -935,7 +933,7 @@ const TextureState &Texture::getTextureState() const
935933 return mState ;
936934}
937935
938- const gl:: Extents &Texture::getExtents (TextureTarget target, size_t level) const
936+ const Extents &Texture::getExtents (TextureTarget target, size_t level) const
939937{
940938 ASSERT (TextureTargetToType (target) == mState .mType );
941939 return mState .getImageDesc (target, level).size ;
@@ -1084,9 +1082,8 @@ angle::Result Texture::setSubImage(Context *context,
10841082{
10851083 ASSERT (TextureTargetToType (target) == mState .mType );
10861084
1087- ANGLE_TRY (ensureSubImageInitialized (context, target, level, area));
1088-
10891085 ImageIndex index = ImageIndex::MakeFromTarget (target, level, area.depth );
1086+ ANGLE_TRY (ensureSubImageInitialized (context, index, area));
10901087
10911088 ANGLE_TRY (mTexture ->setSubImage (context, index, area, format, type, unpackState, unpackBuffer,
10921089 pixels));
@@ -1118,7 +1115,7 @@ angle::Result Texture::setCompressedImage(Context *context,
11181115 ANGLE_TRY (mTexture ->setCompressedImage (context, index, internalFormat, size, unpackState,
11191116 imageSize, pixels));
11201117
1121- gl:: Buffer *unpackBuffer = context->getState ().getTargetBuffer (gl:: BufferBinding::PixelUnpack);
1118+ Buffer *unpackBuffer = context->getState ().getTargetBuffer (BufferBinding::PixelUnpack);
11221119
11231120 InitState initState = DetermineInitState (context, unpackBuffer, pixels);
11241121 mState .setImageDesc (target, level, ImageDesc (size, Format (internalFormat), initState));
@@ -1138,9 +1135,8 @@ angle::Result Texture::setCompressedSubImage(const Context *context,
11381135{
11391136 ASSERT (TextureTargetToType (target) == mState .mType );
11401137
1141- ANGLE_TRY (ensureSubImageInitialized (context, target, level, area));
1142-
11431138 ImageIndex index = ImageIndex::MakeFromTarget (target, level, area.depth );
1139+ ANGLE_TRY (ensureSubImageInitialized (context, index, area));
11441140
11451141 ANGLE_TRY (mTexture ->setCompressedSubImage (context, index, area, format, unpackState, imageSize,
11461142 pixels));
@@ -1163,11 +1159,11 @@ angle::Result Texture::copyImage(Context *context,
11631159 ANGLE_TRY (releaseTexImageInternal (context));
11641160 ANGLE_TRY (orphanImages (context));
11651161
1162+ ImageIndex index = ImageIndex::MakeFromTarget (target, level, 1 );
1163+
11661164 // Use the source FBO size as the init image area.
11671165 Box destBox (0 , 0 , 0 , sourceArea.width , sourceArea.height , 1 );
1168- ANGLE_TRY (ensureSubImageInitialized (context, target, level, destBox));
1169-
1170- ImageIndex index = ImageIndex::MakeFromTarget (target, level, 1 );
1166+ ANGLE_TRY (ensureSubImageInitialized (context, index, destBox));
11711167
11721168 ANGLE_TRY (mTexture ->copyImage (context, index, sourceArea, internalFormat, source));
11731169
@@ -1215,8 +1211,7 @@ angle::Result Texture::copySubImage(Context *context,
12151211 }
12161212 }
12171213
1218- ANGLE_TRY (
1219- ensureSubImageInitialized (context, index.getTarget (), index.getLevelIndex (), destBox));
1214+ ANGLE_TRY (ensureSubImageInitialized (context, index, destBox));
12201215
12211216 ANGLE_TRY (mTexture ->copySubImage (context, index, destOffset, sourceArea, source));
12221217 ANGLE_TRY (handleMipmapGenerationHint (context, index.getLevelIndex ()));
@@ -1283,9 +1278,8 @@ angle::Result Texture::copySubTexture(const Context *context,
12831278
12841279 Box destBox (destOffset.x , destOffset.y , destOffset.z , sourceBox.width , sourceBox.height ,
12851280 sourceBox.depth );
1286- ANGLE_TRY (ensureSubImageInitialized (context, target, level, destBox));
1287-
12881281 ImageIndex index = ImageIndex::MakeFromTarget (target, level, sourceBox.depth );
1282+ ANGLE_TRY (ensureSubImageInitialized (context, index, destBox));
12891283
12901284 ANGLE_TRY (mTexture ->copySubTexture (context, index, destOffset, sourceLevel, sourceBox,
12911285 unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha,
@@ -1704,12 +1698,12 @@ const ColorGeneric &Texture::getBorderColor() const
17041698 return mState .mSamplerState .getBorderColor ();
17051699}
17061700
1707- void Texture::setCrop (const gl:: Rectangle &rect)
1701+ void Texture::setCrop (const Rectangle &rect)
17081702{
17091703 mState .setCrop (rect);
17101704}
17111705
1712- const gl:: Rectangle &Texture::getCrop () const
1706+ const Rectangle &Texture::getCrop () const
17131707{
17141708 return mState .getCrop ();
17151709}
@@ -1858,36 +1852,40 @@ void Texture::setInitState(const ImageIndex &imageIndex, InitState initState)
18581852 }
18591853}
18601854
1861- angle::Result Texture::ensureSubImageInitialized (const Context *context,
1862- TextureTarget target,
1863- size_t level,
1864- const gl::Box &area)
1855+ bool Texture::doesSubImageNeedInit (const Context *context,
1856+ const ImageIndex &imageIndex,
1857+ const Box &area) const
18651858{
18661859 if (!context->isRobustResourceInitEnabled () || mState .mInitState == InitState::Initialized)
18671860 {
1868- return angle::Result::Continue ;
1861+ return false ;
18691862 }
18701863
18711864 // Pre-initialize the texture contents if necessary.
1872- // TODO(jmadill): Check if area overlaps the entire texture.
1873- ImageIndex imageIndex =
1874- ImageIndex::MakeFromTarget (target, static_cast <GLint>(level), area.depth );
1875- const auto &desc = mState .getImageDesc (imageIndex);
1876- if (desc.initState == InitState::MayNeedInit)
1865+ const ImageDesc &desc = mState .getImageDesc (imageIndex);
1866+ if (desc.initState != InitState::MayNeedInit)
18771867 {
1878- ASSERT (mState .mInitState == InitState::MayNeedInit);
1879- bool coversWholeImage = area.x == 0 && area.y == 0 && area.z == 0 &&
1880- area.width == desc.size .width && area.height == desc.size .height &&
1881- area.depth == desc.size .depth ;
1882- if (!coversWholeImage)
1883- {
1884- // NOTE: do not optimize this to only initialize the passed area of the texture, or the
1885- // initialization logic in copySubImage will be incorrect.
1886- ANGLE_TRY (initializeContents (context, imageIndex));
1887- }
1888- setInitState (imageIndex, InitState::Initialized);
1868+ return false ;
18891869 }
18901870
1871+ ASSERT (mState .mInitState == InitState::MayNeedInit);
1872+ bool coversWholeImage = area.x == 0 && area.y == 0 && area.z == 0 &&
1873+ area.width == desc.size .width && area.height == desc.size .height &&
1874+ area.depth == desc.size .depth ;
1875+ return !coversWholeImage;
1876+ }
1877+
1878+ angle::Result Texture::ensureSubImageInitialized (const Context *context,
1879+ const ImageIndex &imageIndex,
1880+ const Box &area)
1881+ {
1882+ if (doesSubImageNeedInit (context, imageIndex, area))
1883+ {
1884+ // NOTE: do not optimize this to only initialize the passed area of the texture, or the
1885+ // initialization logic in copySubImage will be incorrect.
1886+ ANGLE_TRY (initializeContents (context, imageIndex));
1887+ }
1888+ setInitState (imageIndex, InitState::Initialized);
18911889 return angle::Result::Continue;
18921890}
18931891
0 commit comments