Bug 1332561 - Enable async video frame update in WebRenderImageLayer r=nical?

This commit is contained in:
sotaro
2017-01-20 19:16:39 +09:00
parent 2113636162
commit d7c75212fa
2 changed files with 46 additions and 43 deletions

View File

@@ -20,6 +20,7 @@ using namespace gfx;
WebRenderImageLayer::WebRenderImageLayer(WebRenderLayerManager* aLayerManager) WebRenderImageLayer::WebRenderImageLayer(WebRenderLayerManager* aLayerManager)
: ImageLayer(aLayerManager, static_cast<WebRenderLayer*>(this)) : ImageLayer(aLayerManager, static_cast<WebRenderLayer*>(this))
, mExternalImageId(0) , mExternalImageId(0)
, mImageClientTypeContainer(CompositableType::UNKNOWN)
{ {
MOZ_COUNT_CTOR(WebRenderImageLayer); MOZ_COUNT_CTOR(WebRenderImageLayer);
} }
@@ -32,6 +33,25 @@ WebRenderImageLayer::~WebRenderImageLayer()
} }
} }
CompositableType
WebRenderImageLayer::GetImageClientType()
{
if (mImageClientTypeContainer != CompositableType::UNKNOWN) {
return mImageClientTypeContainer;
}
if (mContainer->IsAsync()) {
mImageClientTypeContainer = CompositableType::IMAGE_BRIDGE;
return mImageClientTypeContainer;
}
AutoLockImage autoLock(mContainer);
mImageClientTypeContainer = autoLock.HasImage()
? CompositableType::IMAGE : CompositableType::UNKNOWN;
return mImageClientTypeContainer;
}
already_AddRefed<gfx::SourceSurface> already_AddRefed<gfx::SourceSurface>
WebRenderImageLayer::GetAsSourceSurface() WebRenderImageLayer::GetAsSourceSurface()
{ {
@@ -61,16 +81,18 @@ WebRenderImageLayer::ClearCachedResources()
void void
WebRenderImageLayer::RenderLayer() WebRenderImageLayer::RenderLayer()
{ {
RefPtr<gfx::SourceSurface> surface = GetAsSourceSurface(); if (!mContainer) {
if (!surface) {
return; return;
} }
if (!mImageContainerForWR) { CompositableType type = GetImageClientType();
mImageContainerForWR = LayerManager::CreateImageContainer(); if (type == CompositableType::UNKNOWN) {
return;
} }
if (!mImageClient) { MOZ_ASSERT(GetImageClientType() != CompositableType::UNKNOWN);
if (GetImageClientType() == CompositableType::IMAGE && !mImageClient) {
mImageClient = ImageClient::CreateImageClient(CompositableType::IMAGE, mImageClient = ImageClient::CreateImageClient(CompositableType::IMAGE,
WrBridge(), WrBridge(),
TextureFlags::DEFAULT); TextureFlags::DEFAULT);
@@ -80,47 +102,27 @@ WebRenderImageLayer::RenderLayer()
mImageClient->Connect(); mImageClient->Connect();
} }
// XXX Enable external image id for async image container.
// XXX update async ImageContainer rendering path
//if (mContainer->IsAsync() && !mImageId) {
// mExternalImageId = WrBridge()->AllocExternalImageId(mContainer->GetAsyncContainerID());
// MOZ_ASSERT(mImageId);
//}
if (!mExternalImageId) { if (!mExternalImageId) {
if (GetImageClientType() == CompositableType::IMAGE_BRIDGE) {
MOZ_ASSERT(!mImageClient);
mExternalImageId = WrBridge()->AllocExternalImageId(mContainer->GetAsyncContainerHandle());
} else {
// Handle CompositableType::IMAGE case
MOZ_ASSERT(mImageClient);
mExternalImageId = WrBridge()->AllocExternalImageIdForCompositable(mImageClient); mExternalImageId = WrBridge()->AllocExternalImageIdForCompositable(mImageClient);
}
}
MOZ_ASSERT(mExternalImageId); MOZ_ASSERT(mExternalImageId);
}
gfx::IntSize size = surface->GetSize(); // XXX Not good for async ImageContainer case.
AutoLockImage autoLock(mContainer);
RefPtr<TextureClient> texture = mImageClient->GetTextureClientRecycler() Image* image = autoLock.GetImage();
->CreateOrRecycle(surface->GetFormat(), if (!image) {
size,
BackendSelector::Content,
TextureFlags::DEFAULT);
if (!texture) {
return; return;
} }
gfx::IntSize size = image->GetSize();
MOZ_ASSERT(texture->CanExposeDrawTarget()); if (mImageClient && !mImageClient->UpdateImage(mContainer, /* unused */0)) {
{
TextureClientAutoLock autoLock(texture, OpenMode::OPEN_WRITE_ONLY);
if (!autoLock.Succeeded()) {
return;
}
RefPtr<DrawTarget> drawTarget = texture->BorrowDrawTarget();
if (!drawTarget || !drawTarget->IsValid()) {
return;
}
drawTarget->CopySurface(surface, IntRect(IntPoint(), size), IntPoint());
}
RefPtr<TextureWrapperImage> image =
new TextureWrapperImage(texture, IntRect(IntPoint(0, 0), size));
mImageContainerForWR->SetCurrentImageInTransaction(image);
if (!mImageClient->UpdateImage(mImageContainerForWR, /* unused */0)) {
return; return;
} }

View File

@@ -35,10 +35,11 @@ public:
void RenderLayer() override; void RenderLayer() override;
protected: protected:
CompositableType GetImageClientType();
uint64_t mExternalImageId; uint64_t mExternalImageId;
// XXX remove it when external image id is used.
RefPtr<ImageContainer> mImageContainerForWR;
RefPtr<ImageClient> mImageClient; RefPtr<ImageClient> mImageClient;
CompositableType mImageClientTypeContainer;
}; };
} // namespace layers } // namespace layers