Bug 1332561 - Enable async video frame update in WebRenderImageLayer r=nical?
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user