Commit 583e0924 authored by sotaro's avatar sotaro
Browse files

Bug 1743335 - Clean up ImageBridgeChild::UpdateTextureFactoryIdentifier() r=gfx-reviewers,aosmond

Drop ImageClient was necessary, since ImageHost and WebRenderImageHost was incompatible. It is not necessary any more.

Differential Revision: https://phabricator.services.mozilla.com/D132327
parent 09a73de6
Loading
Loading
Loading
Loading
+0 −49
Original line number Diff line number Diff line
@@ -590,56 +590,7 @@ void ImageBridgeChild::IdentifyCompositorTextureHost(

void ImageBridgeChild::UpdateTextureFactoryIdentifier(
    const TextureFactoryIdentifier& aIdentifier) {
  // ImageHost is incompatible between WebRender enabled and WebRender disabled.
  // Then drop all ImageContainers' ImageClients during disabling WebRender.
  bool disablingWebRender =
      GetCompositorBackendType() == LayersBackend::LAYERS_WR &&
      aIdentifier.mParentBackend != LayersBackend::LAYERS_WR;

  // Do not update TextureFactoryIdentifier if aIdentifier is going to disable
  // WebRender, but gecko is still using WebRender. Since gecko uses different
  // incompatible ImageHost and TextureHost between WebRender and non-WebRender.
  //
  // Even when WebRender is still in use, if non-accelerated widget is opened,
  // aIdentifier disables WebRender at ImageBridgeChild.
  if (disablingWebRender && gfxVars::UseWebRender()) {
    return;
  }

  // D3DTexture might become obsolte. To prevent to use obsoleted D3DTexture,
  // drop all ImageContainers' ImageClients.

  // During re-creating GPU process, there was a period that ImageBridgeChild
  // was re-created, but ImageBridgeChild::UpdateTextureFactoryIdentifier() was
  // not called yet. In the period, if ImageBridgeChild::CreateImageClient() is
  // called, ImageBridgeParent creates incompatible ImageHost than
  // WebRenderImageHost.
  bool initializingWebRender =
      GetCompositorBackendType() != LayersBackend::LAYERS_WR &&
      aIdentifier.mParentBackend == LayersBackend::LAYERS_WR;

  bool needsDrop = disablingWebRender || initializingWebRender;

#if defined(XP_WIN)
  RefPtr<ID3D11Device> device = gfx::DeviceManagerDx::Get()->GetImageDevice();
  mImageDevice = device;
#endif

  IdentifyTextureHost(aIdentifier);
  if (needsDrop) {
    nsTArray<RefPtr<ImageContainerListener> > listeners;
    {
      MutexAutoLock lock(mContainerMapLock);
      for (const auto& entry : mImageContainerListeners) {
        listeners.AppendElement(entry.second);
      }
    }
    // Drop ImageContainer's ImageClient whithout holding mContainerMapLock to
    // avoid deadlock.
    for (auto container : listeners) {
      container->DropImageClient();
    }
  }
}

RefPtr<ImageClient> ImageBridgeChild::CreateImageClient(
+0 −7
Original line number Diff line number Diff line
@@ -360,13 +360,6 @@ class ImageBridgeChild final : public PImageBridgeChild,
      mImageContainerListeners;
  RefPtr<ImageContainerListener> FindListener(
      const CompositableHandle& aHandle);

#if defined(XP_WIN)
  /**
   * Used for checking if D3D11Device is updated.
   */
  RefPtr<ID3D11Device> mImageDevice;
#endif
};

}  // namespace layers