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:
@@ -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(
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user