forked from mirrors/gecko-dev
UnregisterTextureOwner, if called before any use of UseRemoteTexture, can cause UseRemoteTexture to wait for the texture owner to be created, since the texture owner does not exist, and there is no evidence it was previously unregistered. This patch attempts to address the issue by delaying the actual UnregisterTextureOwner until all such UseRemoteTexture instances are processed. This is accomplished by noting that UseRemoteTexture ops come in via transactions from a CompositableForwarder and so all are associated with a forwarder transaction with a FwdTransactionId. RecordedTextureData on destruction reports the last FwdTransactionId associated with its final UseRemoteTexture before it attempts to call UnregisterTextureOwner. If RemoteTextureMap has not been notified of a given FwdTransactionId yet, then the UnregisterTextureOwner call will be deferred until it has seen this FwdTransactionId. This adds a RemoteTextureTxnScheduler to track the issuing of dependencies and waiting for FwdTransactionIds. This patch also cleans up the issuing of FwdTransactionIds themselves to be associated with a given top-level protocol so that all sub-protocols have transaction numbers that can be safely compared amongst each other. This makes dependency expiration more robust since any advancement of the transaction number from any source can help retire expired dependencies. Differential Revision: https://phabricator.services.mozilla.com/D197895
114 lines
4.1 KiB
C++
114 lines
4.1 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef MOZILLA_GFX_COMPOSITORMANAGERPARENT_H
|
|
#define MOZILLA_GFX_COMPOSITORMANAGERPARENT_H
|
|
|
|
#include <map>
|
|
#include <stdint.h> // for uint32_t
|
|
#include "mozilla/Attributes.h" // for override
|
|
#include "mozilla/StaticPtr.h" // for StaticRefPtr
|
|
#include "mozilla/StaticMonitor.h" // for StaticMonitor
|
|
#include "mozilla/RefPtr.h" // for already_AddRefed
|
|
#include "mozilla/dom/ipc/IdType.h"
|
|
#include "mozilla/layers/PCompositorManagerParent.h"
|
|
#include "nsTArray.h" // for AutoTArray
|
|
|
|
namespace mozilla {
|
|
|
|
namespace gfx {
|
|
class SourceSurfaceSharedData;
|
|
}
|
|
|
|
namespace layers {
|
|
|
|
class CompositorBridgeParent;
|
|
class CompositorThreadHolder;
|
|
class RemoteTextureTxnScheduler;
|
|
class SharedSurfacesHolder;
|
|
|
|
class CompositorManagerParent final : public PCompositorManagerParent {
|
|
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(CompositorManagerParent, final)
|
|
|
|
public:
|
|
static already_AddRefed<CompositorManagerParent> CreateSameProcess(
|
|
uint32_t aNamespace);
|
|
static bool Create(Endpoint<PCompositorManagerParent>&& aEndpoint,
|
|
dom::ContentParentId aContentId, uint32_t aNamespace,
|
|
bool aIsRoot);
|
|
static void Shutdown();
|
|
|
|
static already_AddRefed<CompositorBridgeParent>
|
|
CreateSameProcessWidgetCompositorBridge(CSSToLayoutDeviceScale aScale,
|
|
const CompositorOptions& aOptions,
|
|
bool aUseExternalSurfaceSize,
|
|
const gfx::IntSize& aSurfaceSize,
|
|
uint64_t aInnerWindowId);
|
|
|
|
static void WaitForSharedSurface(const wr::ExternalImageId& aId);
|
|
|
|
static void AddSharedSurface(const wr::ExternalImageId& aId,
|
|
gfx::SourceSurfaceSharedData* aSurface);
|
|
|
|
mozilla::ipc::IPCResult RecvAddSharedSurface(const wr::ExternalImageId& aId,
|
|
SurfaceDescriptorShared&& aDesc);
|
|
mozilla::ipc::IPCResult RecvRemoveSharedSurface(
|
|
const wr::ExternalImageId& aId);
|
|
mozilla::ipc::IPCResult RecvReportSharedSurfacesMemory(
|
|
ReportSharedSurfacesMemoryResolver&&);
|
|
|
|
mozilla::ipc::IPCResult RecvNotifyMemoryPressure();
|
|
|
|
mozilla::ipc::IPCResult RecvReportMemory(ReportMemoryResolver&&);
|
|
|
|
mozilla::ipc::IPCResult RecvInitCanvasManager(
|
|
Endpoint<PCanvasManagerParent>&&);
|
|
|
|
void BindComplete(bool aIsRoot);
|
|
void ActorDestroy(ActorDestroyReason aReason) override;
|
|
|
|
already_AddRefed<PCompositorBridgeParent> AllocPCompositorBridgeParent(
|
|
const CompositorBridgeOptions& aOpt);
|
|
|
|
static void NotifyWebRenderError(wr::WebRenderError aError);
|
|
|
|
const dom::ContentParentId& GetContentId() const { return mContentId; }
|
|
|
|
bool OwnsExternalImageId(const wr::ExternalImageId& aId) const {
|
|
return mNamespace == static_cast<uint32_t>(wr::AsUint64(aId) >> 32);
|
|
}
|
|
|
|
private:
|
|
static StaticMonitor sMonitor;
|
|
static StaticRefPtr<CompositorManagerParent> sInstance
|
|
MOZ_GUARDED_BY(sMonitor);
|
|
|
|
// Indexed by namespace.
|
|
using ManagerMap = std::map<uint32_t, CompositorManagerParent*>;
|
|
static ManagerMap sManagers MOZ_GUARDED_BY(sMonitor);
|
|
|
|
static void ShutdownInternal();
|
|
|
|
CompositorManagerParent(dom::ContentParentId aContentId, uint32_t aNamespace);
|
|
virtual ~CompositorManagerParent();
|
|
|
|
void Bind(Endpoint<PCompositorManagerParent>&& aEndpoint, bool aIsRoot);
|
|
|
|
void DeferredDestroy();
|
|
|
|
RefPtr<CompositorThreadHolder> mCompositorThreadHolder;
|
|
RefPtr<SharedSurfacesHolder> mSharedSurfacesHolder;
|
|
AutoTArray<RefPtr<CompositorBridgeParent>, 1> mPendingCompositorBridges;
|
|
const dom::ContentParentId mContentId;
|
|
const uint32_t mNamespace;
|
|
uint32_t mLastSharedSurfaceResourceId MOZ_GUARDED_BY(sMonitor) = 0;
|
|
RefPtr<RemoteTextureTxnScheduler> mRemoteTextureTxnScheduler;
|
|
};
|
|
|
|
} // namespace layers
|
|
} // namespace mozilla
|
|
|
|
#endif
|