Bug 1321183 - Deliver TextureFactoryIdentifier r=nical

This commit is contained in:
sotaro 2016-12-01 12:02:37 +09:00
parent 1565dfd024
commit af7a090b59
9 changed files with 50 additions and 19 deletions

View File

@ -2510,7 +2510,11 @@ TabChild::InitRenderingState(const TextureFactoryIdentifier& aTextureFactoryIden
LayerManager* lm = mPuppetWidget->GetLayerManager();
if (lm->AsWebRenderLayerManager()) {
lm->AsWebRenderLayerManager()->Initialize(compositorChild, aLayersId);
lm->AsWebRenderLayerManager()->Initialize(compositorChild,
aLayersId,
&mTextureFactoryIdentifier);
ImageBridgeChild::IdentifyCompositorTextureHost(mTextureFactoryIdentifier);
gfx::VRManagerChild::IdentifyTextureHost(mTextureFactoryIdentifier);
}
if (lf) {
@ -2903,13 +2907,14 @@ TabChild::ReinitRendering()
void
TabChild::CompositorUpdated(const TextureFactoryIdentifier& aNewIdentifier)
{
MOZ_ASSERT(mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_CLIENT
|| mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_WR);
RefPtr<LayerManager> lm = mPuppetWidget->GetLayerManager();
ClientLayerManager* clm = lm->AsClientLayerManager();
MOZ_ASSERT(clm);
mTextureFactoryIdentifier = aNewIdentifier;
clm->UpdateTextureFactoryIdentifier(aNewIdentifier);
FrameLayerBuilder::InvalidateAllLayers(clm);
lm->UpdateTextureFactoryIdentifier(aNewIdentifier);
FrameLayerBuilder::InvalidateAllLayers(lm);
}
NS_IMETHODIMP

View File

@ -684,6 +684,13 @@ public:
const mozilla::TimeStamp& aCompositeStart,
const mozilla::TimeStamp& aCompositeEnd) {}
virtual void UpdateTextureFactoryIdentifier(const TextureFactoryIdentifier& aNewIdentifier) {}
virtual TextureFactoryIdentifier GetTextureFactoryIdentifier()
{
return TextureFactoryIdentifier();
}
protected:
RefPtr<Layer> mRoot;
gfx::UserData mUserData;

View File

@ -91,8 +91,8 @@ public:
virtual already_AddRefed<BorderLayer> CreateBorderLayer() override;
virtual already_AddRefed<RefLayer> CreateRefLayer() override;
void UpdateTextureFactoryIdentifier(const TextureFactoryIdentifier& aNewIdentifier);
TextureFactoryIdentifier GetTextureFactoryIdentifier()
virtual void UpdateTextureFactoryIdentifier(const TextureFactoryIdentifier& aNewIdentifier) override;
virtual TextureFactoryIdentifier GetTextureFactoryIdentifier() override
{
return AsShadowForwarder()->GetTextureFactoryIdentifier();
}

View File

@ -104,8 +104,6 @@ public:
{
MOZ_CRASH("GFX: Shouldn't be called for composited layer manager");
}
virtual TextureFactoryIdentifier GetTextureFactoryIdentifier() = 0;
virtual void ForcePresent() = 0;
virtual void AddInvalidRegion(const nsIntRegion& aRegion) = 0;

View File

@ -202,7 +202,8 @@ TextureHost::Create(const SurfaceDescriptor& aDesc,
return CreateTextureHostOGL(aDesc, aDeallocator, aFlags);
case SurfaceDescriptor::TSurfaceDescriptorMacIOSurface:
if (aBackend == LayersBackend::LAYERS_OPENGL) {
if (aBackend == LayersBackend::LAYERS_OPENGL ||
aBackend == LayersBackend::LAYERS_WR) {
return CreateTextureHostOGL(aDesc, aDeallocator, aFlags);
} else {
return CreateTextureHostBasic(aDesc, aDeallocator, aFlags);

View File

@ -141,9 +141,12 @@ WebRenderLayerManager::WebRenderLayerManager(nsIWidget* aWidget)
}
void
WebRenderLayerManager::Initialize(PCompositorBridgeChild* aCBChild, uint64_t aLayersId)
WebRenderLayerManager::Initialize(PCompositorBridgeChild* aCBChild,
uint64_t aLayersId,
TextureFactoryIdentifier* aTextureFactoryIdentifier)
{
MOZ_ASSERT(mWRChild == nullptr);
MOZ_ASSERT(aTextureFactoryIdentifier);
TextureFactoryIdentifier textureFactoryIdentifier;
PWebRenderBridgeChild* bridge = aCBChild->SendPWebRenderBridgeConstructor(aLayersId,
@ -153,6 +156,7 @@ WebRenderLayerManager::Initialize(PCompositorBridgeChild* aCBChild, uint64_t aLa
LayoutDeviceIntSize size = mWidget->GetClientSize();
WRBridge()->SendCreate(size.width, size.height);
WRBridge()->IdentifyTextureHost(textureFactoryIdentifier);
*aTextureFactoryIdentifier = textureFactoryIdentifier;
}
void
@ -326,6 +330,18 @@ WebRenderLayerManager::ClearCachedResources(Layer* aSubtree)
WRBridge()->SendClearCachedResources();
}
void
WebRenderLayerManager::UpdateTextureFactoryIdentifier(const TextureFactoryIdentifier& aNewIdentifier)
{
WRBridge()->IdentifyTextureHost(aNewIdentifier);
}
TextureFactoryIdentifier
WebRenderLayerManager::GetTextureFactoryIdentifier()
{
return WRBridge()->GetTextureFactoryIdentifier();
}
void
WebRenderLayerManager::SetRoot(Layer* aLayer)
{

View File

@ -76,7 +76,7 @@ class WebRenderLayerManager final : public LayerManager
{
public:
explicit WebRenderLayerManager(nsIWidget* aWidget);
void Initialize(PCompositorBridgeChild* aCBChild, uint64_t aLayersId);
void Initialize(PCompositorBridgeChild* aCBChild, uint64_t aLayersId, TextureFactoryIdentifier* aTextureFactoryIdentifier);
virtual void Destroy() override;
@ -120,7 +120,8 @@ public:
const mozilla::TimeStamp& aCompositeEnd) override;
virtual void ClearCachedResources(Layer* aSubtree = nullptr) override;
virtual void UpdateTextureFactoryIdentifier(const TextureFactoryIdentifier& aNewIdentifier) override;
virtual TextureFactoryIdentifier GetTextureFactoryIdentifier() override;
DrawPaintedLayerCallback GetPaintedLayerCallback() const
{ return mPaintedLayerCallback; }

View File

@ -285,8 +285,8 @@ RenderFrameParent::GetTextureFactoryIdentifier(TextureFactoryIdentifier* aTextur
{
RefPtr<LayerManager> lm = mFrameLoader ? GetFrom(mFrameLoader) : nullptr;
// Perhaps the document containing this frame currently has no presentation?
if (lm && lm->AsClientLayerManager()) {
*aTextureFactoryIdentifier = lm->AsClientLayerManager()->GetTextureFactoryIdentifier();
if (lm) {
*aTextureFactoryIdentifier = lm->GetTextureFactoryIdentifier();
} else {
*aTextureFactoryIdentifier = TextureFactoryIdentifier();
}

View File

@ -1352,7 +1352,12 @@ void nsBaseWidget::CreateCompositor(int aWidth, int aHeight)
}
if (lm->AsWebRenderLayerManager()) {
lm->AsWebRenderLayerManager()->Initialize(mCompositorBridgeChild, mCompositorSession->RootLayerTreeId());
TextureFactoryIdentifier textureFactoryIdentifier;
lm->AsWebRenderLayerManager()->Initialize(mCompositorBridgeChild,
mCompositorSession->RootLayerTreeId(),
&textureFactoryIdentifier);
ImageBridgeChild::IdentifyCompositorTextureHost(textureFactoryIdentifier);
gfx::VRManagerChild::IdentifyTextureHost(textureFactoryIdentifier);
}
ShadowLayerForwarder* lf = lm->AsShadowForwarder();
@ -1378,9 +1383,7 @@ void nsBaseWidget::CreateCompositor(int aWidth, int aHeight)
}
lf->SetShadowManager(shadowManager);
if (ClientLayerManager* clm = lm->AsClientLayerManager()) {
clm->UpdateTextureFactoryIdentifier(textureFactoryIdentifier);
}
lm->UpdateTextureFactoryIdentifier(textureFactoryIdentifier);
// Some popup or transparent widgets may use a different backend than the
// compositors used with ImageBridge and VR (and more generally web content).
if (WidgetTypeSupportsAcceleration()) {