Bug 1568419 - Handle a case that NumSubTextures() returns 0 in AsyncImagePipelineManager::UpdateImageKeys() r=nical

GPUVideoTextureHost::NumSubTextures() returns 0 when wrapped TextureHost does not exist. In this case, we do not have a content of GPUVideoTextureHost for WR render. And EnsureWrappedTextureHost() calling is added in GPUVideoTextureHost::NumSubTextures(), since GPUVideoTextureHost is not explicit about when a wrapped TextureHost is created.

Differential Revision: https://phabricator.services.mozilla.com/D39137
This commit is contained in:
sotaro
2019-07-24 13:33:57 +00:00
parent ed7bbfc7f1
commit a2d3f5b62e
11 changed files with 20 additions and 18 deletions

View File

@@ -118,12 +118,12 @@ void GPUVideoTextureHost::CreateRenderTexture(
EnsureWrappedTextureHost()->CreateRenderTexture(aExternalImageId);
}
uint32_t GPUVideoTextureHost::NumSubTextures() const {
MOZ_ASSERT(mWrappedTextureHost);
if (!mWrappedTextureHost) {
uint32_t GPUVideoTextureHost::NumSubTextures() {
MOZ_ASSERT(EnsureWrappedTextureHost());
if (!EnsureWrappedTextureHost()) {
return 0;
}
return mWrappedTextureHost->NumSubTextures();
return EnsureWrappedTextureHost()->NumSubTextures();
}
void GPUVideoTextureHost::PushResourceUpdates(

View File

@@ -50,7 +50,7 @@ class GPUVideoTextureHost : public TextureHost {
void CreateRenderTexture(
const wr::ExternalImageId& aExternalImageId) override;
uint32_t NumSubTextures() const override;
uint32_t NumSubTextures() override;
void PushResourceUpdates(wr::TransactionBuilder& aResources,
ResourceUpdateOp aOp,

View File

@@ -574,7 +574,7 @@ void BufferTextureHost::CreateRenderTexture(
texture.forget());
}
uint32_t BufferTextureHost::NumSubTextures() const {
uint32_t BufferTextureHost::NumSubTextures() {
if (GetFormat() == gfx::SurfaceFormat::YUV) {
return 3;
}

View File

@@ -642,7 +642,7 @@ class TextureHost : public AtomicRefCountedWithFinalize<TextureHost> {
/// Returns the number of actual textures that will be used to render this.
/// For example in a lot of YUV cases it will be 3
virtual uint32_t NumSubTextures() const { return 1; }
virtual uint32_t NumSubTextures() { return 1; }
enum ResourceUpdateOp {
ADD_IMAGE,
@@ -777,7 +777,7 @@ class BufferTextureHost : public TextureHost {
void CreateRenderTexture(
const wr::ExternalImageId& aExternalImageId) override;
uint32_t NumSubTextures() const override;
uint32_t NumSubTextures() override;
void PushResourceUpdates(wr::TransactionBuilder& aResources,
ResourceUpdateOp aOp,

View File

@@ -983,7 +983,7 @@ void DXGITextureHostD3D11::CreateRenderTexture(
texture.forget());
}
uint32_t DXGITextureHostD3D11::NumSubTextures() const {
uint32_t DXGITextureHostD3D11::NumSubTextures() {
switch (GetFormat()) {
case gfx::SurfaceFormat::R8G8B8X8:
case gfx::SurfaceFormat::R8G8B8A8:
@@ -1243,7 +1243,7 @@ void DXGIYCbCrTextureHostD3D11::CreateRenderTexture(
texture.forget());
}
uint32_t DXGIYCbCrTextureHostD3D11::NumSubTextures() const {
uint32_t DXGIYCbCrTextureHostD3D11::NumSubTextures() {
// ycbcr use 3 sub textures.
return 3;
}

View File

@@ -342,7 +342,7 @@ class DXGITextureHostD3D11 : public TextureHost {
void CreateRenderTexture(
const wr::ExternalImageId& aExternalImageId) override;
uint32_t NumSubTextures() const override;
uint32_t NumSubTextures() override;
void PushResourceUpdates(wr::TransactionBuilder& aResources,
ResourceUpdateOp aOp,
@@ -409,7 +409,7 @@ class DXGIYCbCrTextureHostD3D11 : public TextureHost {
void CreateRenderTexture(
const wr::ExternalImageId& aExternalImageId) override;
uint32_t NumSubTextures() const override;
uint32_t NumSubTextures() override;
void PushResourceUpdates(wr::TransactionBuilder& aResources,
ResourceUpdateOp aOp,

View File

@@ -131,7 +131,7 @@ void MacIOSurfaceTextureHostOGL::CreateRenderTexture(
texture.forget());
}
uint32_t MacIOSurfaceTextureHostOGL::NumSubTextures() const {
uint32_t MacIOSurfaceTextureHostOGL::NumSubTextures() {
switch (GetFormat()) {
case gfx::SurfaceFormat::R8G8B8X8:
case gfx::SurfaceFormat::R8G8B8A8:

View File

@@ -66,7 +66,7 @@ class MacIOSurfaceTextureHostOGL : public TextureHost {
void CreateRenderTexture(
const wr::ExternalImageId& aExternalImageId) override;
uint32_t NumSubTextures() const override;
uint32_t NumSubTextures() override;
void PushResourceUpdates(wr::TransactionBuilder& aResources,
ResourceUpdateOp aOp,

View File

@@ -223,8 +223,9 @@ Maybe<TextureHost::ResourceUpdateOp> AsyncImagePipelineManager::UpdateImageKeys(
return Nothing();
}
if (!texture) {
// We don't have a new texture, there isn't much we can do.
if (!texture || texture->NumSubTextures() == 0) {
// We don't have a new texture or texture does not have SubTextures, there
// isn't much we can do.
aKeys = aPipeline->mKeys;
return Nothing();
}
@@ -243,6 +244,7 @@ Maybe<TextureHost::ResourceUpdateOp> AsyncImagePipelineManager::UpdateImageKeys(
// The non-external image code path falls back to converting the texture into
// an rgb image.
auto numKeys = useExternalImage ? texture->NumSubTextures() : 1;
MOZ_ASSERT(numKeys > 0);
// If we already had a texture and the format hasn't changed, better to reuse
// the image keys than create new ones.

View File

@@ -201,7 +201,7 @@ bool WebRenderTextureHost::HasIntermediateBuffer() const {
return mWrappedTextureHost->HasIntermediateBuffer();
}
uint32_t WebRenderTextureHost::NumSubTextures() const {
uint32_t WebRenderTextureHost::NumSubTextures() {
MOZ_ASSERT(mWrappedTextureHost);
return mWrappedTextureHost->NumSubTextures();
}

View File

@@ -69,7 +69,7 @@ class WebRenderTextureHost : public TextureHost {
bool HasIntermediateBuffer() const override;
uint32_t NumSubTextures() const override;
uint32_t NumSubTextures() override;
void PushResourceUpdates(wr::TransactionBuilder& aResources,
ResourceUpdateOp aOp,