Bug 1383786 - Simplify generating image keys for TextureHosts. r=sotaro

This commit is contained in:
Nicolas Silva
2017-09-26 15:30:46 +02:00
parent 55cc6bcd6c
commit 2d83e5c303
11 changed files with 37 additions and 99 deletions

View File

@@ -111,14 +111,11 @@ GPUVideoTextureHost::CreateRenderTexture(const wr::ExternalImageId& aExternalIma
mWrappedTextureHost->CreateRenderTexture(aExternalImageId); mWrappedTextureHost->CreateRenderTexture(aExternalImageId);
} }
void uint32_t
GPUVideoTextureHost::GetWRImageKeys(nsTArray<wr::ImageKey>& aImageKeys, GPUVideoTextureHost::NumSubTextures() const
const std::function<wr::ImageKey()>& aImageKeyAllocator)
{ {
MOZ_ASSERT(mWrappedTextureHost); MOZ_ASSERT(mWrappedTextureHost);
MOZ_ASSERT(aImageKeys.IsEmpty()); return mWrappedTextureHost->NumSubTextures();
mWrappedTextureHost->GetWRImageKeys(aImageKeys, aImageKeyAllocator);
} }
void void

View File

@@ -48,8 +48,7 @@ public:
virtual void CreateRenderTexture(const wr::ExternalImageId& aExternalImageId) override; virtual void CreateRenderTexture(const wr::ExternalImageId& aExternalImageId) override;
virtual void GetWRImageKeys(nsTArray<wr::ImageKey>& aImageKeys, virtual uint32_t NumSubTextures() const override;
const std::function<wr::ImageKey()>& aImageKeyAllocator) override;
virtual void AddWRImage(wr::ResourceUpdateQueue& aResources, virtual void AddWRImage(wr::ResourceUpdateQueue& aResources,
Range<const wr::ImageKey>& aImageKeys, Range<const wr::ImageKey>& aImageKeys,

View File

@@ -566,23 +566,14 @@ BufferTextureHost::CreateRenderTexture(const wr::ExternalImageId& aExternalImage
wr::RenderThread::Get()->RegisterExternalImage(wr::AsUint64(aExternalImageId), texture.forget()); wr::RenderThread::Get()->RegisterExternalImage(wr::AsUint64(aExternalImageId), texture.forget());
} }
void uint32_t
BufferTextureHost::GetWRImageKeys(nsTArray<wr::ImageKey>& aImageKeys, BufferTextureHost::NumSubTextures() const
const std::function<wr::ImageKey()>& aImageKeyAllocator)
{ {
MOZ_ASSERT(aImageKeys.IsEmpty()); if (GetFormat() == gfx::SurfaceFormat::YUV) {
return 3;
if (GetFormat() != gfx::SurfaceFormat::YUV) {
// 1 image key
aImageKeys.AppendElement(aImageKeyAllocator());
MOZ_ASSERT(aImageKeys.Length() == 1);
} else {
// 3 image key
aImageKeys.AppendElement(aImageKeyAllocator());
aImageKeys.AppendElement(aImageKeyAllocator());
aImageKeys.AppendElement(aImageKeyAllocator());
MOZ_ASSERT(aImageKeys.Length() == 3);
} }
return 1;
} }
void void

View File

@@ -621,17 +621,9 @@ public:
MOZ_RELEASE_ASSERT(false, "No CreateRenderTexture() implementation for this TextureHost type."); MOZ_RELEASE_ASSERT(false, "No CreateRenderTexture() implementation for this TextureHost type.");
} }
// Create all necessary image keys for this textureHost rendering. /// Returns the number of actual textures that will be used to render this.
// @param aImageKeys - [out] The set of ImageKeys used for this textureHost /// For example in a lot of YUV cases it will be 3
// composing. virtual uint32_t NumSubTextures() const { return 1; }
// @param aImageKeyAllocator - [in] The function which is used for creating
// the new ImageKey.
virtual void GetWRImageKeys(nsTArray<wr::ImageKey>& aImageKeys,
const std::function<wr::ImageKey()>& aImageKeyAllocator)
{
MOZ_ASSERT(aImageKeys.IsEmpty());
MOZ_ASSERT_UNREACHABLE("No GetWRImageKeys() implementation for this TextureHost type.");
}
// Add all necessary TextureHost informations to the resource update queue. // Add all necessary TextureHost informations to the resource update queue.
// Then, WR will use this informations to read from the TextureHost. // Then, WR will use this informations to read from the TextureHost.
@@ -747,8 +739,7 @@ public:
virtual void CreateRenderTexture(const wr::ExternalImageId& aExternalImageId) override; virtual void CreateRenderTexture(const wr::ExternalImageId& aExternalImageId) override;
virtual void GetWRImageKeys(nsTArray<wr::ImageKey>& aImageKeys, virtual uint32_t NumSubTextures() const override;
const std::function<wr::ImageKey()>& aImageKeyAllocator) override;
virtual void AddWRImage(wr::ResourceUpdateQueue& aResources, virtual void AddWRImage(wr::ResourceUpdateQueue& aResources,
Range<const wr::ImageKey>& aImageKeys, Range<const wr::ImageKey>& aImageKeys,

View File

@@ -1042,31 +1042,22 @@ DXGITextureHostD3D11::CreateRenderTexture(const wr::ExternalImageId& aExternalIm
wr::RenderThread::Get()->RegisterExternalImage(wr::AsUint64(aExternalImageId), texture.forget()); wr::RenderThread::Get()->RegisterExternalImage(wr::AsUint64(aExternalImageId), texture.forget());
} }
void uint32_t
DXGITextureHostD3D11::GetWRImageKeys(nsTArray<wr::ImageKey>& aImageKeys, DXGITextureHostD3D11::NumSubTextures() const
const std::function<wr::ImageKey()>& aImageKeyAllocator)
{ {
MOZ_ASSERT(aImageKeys.IsEmpty());
switch (GetFormat()) { switch (GetFormat()) {
case gfx::SurfaceFormat::R8G8B8X8: case gfx::SurfaceFormat::R8G8B8X8:
case gfx::SurfaceFormat::R8G8B8A8: case gfx::SurfaceFormat::R8G8B8A8:
case gfx::SurfaceFormat::B8G8R8A8: case gfx::SurfaceFormat::B8G8R8A8:
case gfx::SurfaceFormat::B8G8R8X8: { case gfx::SurfaceFormat::B8G8R8X8: {
// 1 image key return 1;
aImageKeys.AppendElement(aImageKeyAllocator());
MOZ_ASSERT(aImageKeys.Length() == 1);
break;
} }
case gfx::SurfaceFormat::NV12: { case gfx::SurfaceFormat::NV12: {
// 2 image key return 2;
aImageKeys.AppendElement(aImageKeyAllocator());
aImageKeys.AppendElement(aImageKeyAllocator());
MOZ_ASSERT(aImageKeys.Length() == 2);
break;
} }
default: { default: {
MOZ_ASSERT_UNREACHABLE("unexpected to be called"); MOZ_ASSERT_UNREACHABLE("unexpected format");
return 1;
} }
} }
} }
@@ -1311,17 +1302,6 @@ DXGIYCbCrTextureHostD3D11::CreateRenderTexture(const wr::ExternalImageId& aExter
// We use AddImage() directly. It's no corresponding RenderTextureHost. // We use AddImage() directly. It's no corresponding RenderTextureHost.
} }
void
DXGIYCbCrTextureHostD3D11::GetWRImageKeys(nsTArray<wr::ImageKey>& aImageKeys,
const std::function<wr::ImageKey()>& aImageKeyAllocator)
{
MOZ_ASSERT(aImageKeys.IsEmpty());
// 1 image key
aImageKeys.AppendElement(aImageKeyAllocator());
MOZ_ASSERT(aImageKeys.Length() == 1);
}
void void
DXGIYCbCrTextureHostD3D11::AddWRImage(wr::ResourceUpdateQueue& aResources, DXGIYCbCrTextureHostD3D11::AddWRImage(wr::ResourceUpdateQueue& aResources,
Range<const wr::ImageKey>& aImageKeys, Range<const wr::ImageKey>& aImageKeys,

View File

@@ -335,8 +335,7 @@ public:
virtual void CreateRenderTexture(const wr::ExternalImageId& aExternalImageId) override; virtual void CreateRenderTexture(const wr::ExternalImageId& aExternalImageId) override;
virtual void GetWRImageKeys(nsTArray<wr::ImageKey>& aImageKeys, virtual uint32_t NumSubTextures() const override;
const std::function<wr::ImageKey()>& aImageKeyAllocator) override;
virtual void AddWRImage(wr::ResourceUpdateQueue& aAPI, virtual void AddWRImage(wr::ResourceUpdateQueue& aAPI,
Range<const wr::ImageKey>& aImageKeys, Range<const wr::ImageKey>& aImageKeys,
@@ -398,9 +397,6 @@ public:
virtual void CreateRenderTexture(const wr::ExternalImageId& aExternalImageId) override; virtual void CreateRenderTexture(const wr::ExternalImageId& aExternalImageId) override;
virtual void GetWRImageKeys(nsTArray<wr::ImageKey>& aImageKeys,
const std::function<wr::ImageKey()>& aImageKeyAllocator) override;
virtual void AddWRImage(wr::ResourceUpdateQueue& aResources, virtual void AddWRImage(wr::ResourceUpdateQueue& aResources,
Range<const wr::ImageKey>& aImageKeys, Range<const wr::ImageKey>& aImageKeys,
const wr::ExternalImageId& aExtID) override; const wr::ExternalImageId& aExtID) override;

View File

@@ -125,37 +125,23 @@ MacIOSurfaceTextureHostOGL::CreateRenderTexture(const wr::ExternalImageId& aExte
wr::RenderThread::Get()->RegisterExternalImage(wr::AsUint64(aExternalImageId), texture.forget()); wr::RenderThread::Get()->RegisterExternalImage(wr::AsUint64(aExternalImageId), texture.forget());
} }
void uint32_t
MacIOSurfaceTextureHostOGL::GetWRImageKeys(nsTArray<wr::ImageKey>& aImageKeys, MacIOSurfaceTextureHostOGL::NumSubTextures() const
const std::function<wr::ImageKey()>& aImageKeyAllocator)
{ {
MOZ_ASSERT(aImageKeys.IsEmpty());
switch (GetFormat()) { switch (GetFormat()) {
case gfx::SurfaceFormat::R8G8B8X8: case gfx::SurfaceFormat::R8G8B8X8:
case gfx::SurfaceFormat::R8G8B8A8: case gfx::SurfaceFormat::R8G8B8A8:
case gfx::SurfaceFormat::B8G8R8A8: case gfx::SurfaceFormat::B8G8R8A8:
case gfx::SurfaceFormat::B8G8R8X8: { case gfx::SurfaceFormat::B8G8R8X8:
// 1 image key
aImageKeys.AppendElement(aImageKeyAllocator());
MOZ_ASSERT(aImageKeys.Length() == 1);
break;
}
case gfx::SurfaceFormat::YUV422: { case gfx::SurfaceFormat::YUV422: {
// 1 image key return 1;
aImageKeys.AppendElement(aImageKeyAllocator());
MOZ_ASSERT(aImageKeys.Length() == 1);
break;
} }
case gfx::SurfaceFormat::NV12: { case gfx::SurfaceFormat::NV12: {
// 2 image key return 2;
aImageKeys.AppendElement(aImageKeyAllocator());
aImageKeys.AppendElement(aImageKeyAllocator());
MOZ_ASSERT(aImageKeys.Length() == 2);
break;
} }
default: { default: {
MOZ_ASSERT_UNREACHABLE("unexpected to be called"); MOZ_ASSERT_UNREACHABLE("unexpected format");
return 1;
} }
} }
} }

View File

@@ -64,8 +64,7 @@ public:
virtual void CreateRenderTexture(const wr::ExternalImageId& aExternalImageId) override; virtual void CreateRenderTexture(const wr::ExternalImageId& aExternalImageId) override;
virtual void GetWRImageKeys(nsTArray<wr::ImageKey>& aImageKeys, virtual uint32_t NumSubTextures() const override;
const std::function<wr::ImageKey()>& aImageKeyAllocator) override;
virtual void AddWRImage(wr::ResourceUpdateQueue& aResources, virtual void AddWRImage(wr::ResourceUpdateQueue& aResources,
Range<const wr::ImageKey>& aImageKeys, Range<const wr::ImageKey>& aImageKeys,

View File

@@ -173,7 +173,10 @@ AsyncImagePipelineManager::GenerateImageKeyForTextureHost(wr::ResourceUpdateQueu
WebRenderTextureHost* wrTexture = aTexture->AsWebRenderTextureHost(); WebRenderTextureHost* wrTexture = aTexture->AsWebRenderTextureHost();
if (!gfxEnv::EnableWebRenderRecording() && wrTexture) { if (!gfxEnv::EnableWebRenderRecording() && wrTexture) {
wrTexture->GetWRImageKeys(aKeys, std::bind(&AsyncImagePipelineManager::GenerateImageKey, this)); auto numKeys = wrTexture->NumSubTextures();
for (uint32_t i = 0; i < numKeys; ++i) {
aKeys.AppendElement(GenerateImageKey());
}
MOZ_ASSERT(!aKeys.IsEmpty()); MOZ_ASSERT(!aKeys.IsEmpty());
Range<const wr::ImageKey> keys(&aKeys[0], aKeys.Length()); Range<const wr::ImageKey> keys(&aKeys[0], aKeys.Length());
wrTexture->AddWRImage(aResources, keys, wrTexture->GetExternalImageKey()); wrTexture->AddWRImage(aResources, keys, wrTexture->GetExternalImageKey());

View File

@@ -134,14 +134,11 @@ WebRenderTextureHost::GetRGBStride()
return ImageDataSerializer::ComputeRGBStride(format, GetSize().width); return ImageDataSerializer::ComputeRGBStride(format, GetSize().width);
} }
void uint32_t
WebRenderTextureHost::GetWRImageKeys(nsTArray<wr::ImageKey>& aImageKeys, WebRenderTextureHost::NumSubTextures() const
const std::function<wr::ImageKey()>& aImageKeyAllocator)
{ {
MOZ_ASSERT(mWrappedTextureHost); MOZ_ASSERT(mWrappedTextureHost);
MOZ_ASSERT(aImageKeys.IsEmpty()); return mWrappedTextureHost->NumSubTextures();
mWrappedTextureHost->GetWRImageKeys(aImageKeys, aImageKeyAllocator);
} }
void void

View File

@@ -63,8 +63,7 @@ public:
int32_t GetRGBStride(); int32_t GetRGBStride();
virtual void GetWRImageKeys(nsTArray<wr::ImageKey>& aImageKeys, virtual uint32_t NumSubTextures() const override;
const std::function<wr::ImageKey()>& aImageKeyAllocator) override;
virtual void AddWRImage(wr::ResourceUpdateQueue& aResources, virtual void AddWRImage(wr::ResourceUpdateQueue& aResources,
Range<const wr::ImageKey>& aImageKeys, Range<const wr::ImageKey>& aImageKeys,