mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 03:15:11 +00:00
Bug 1366915 part 2 - Make CompositorBridgeChild allocate pipeline id for async image pipeline r=nical
This commit is contained in:
parent
3e55c4713f
commit
1885be3a3f
@ -81,8 +81,9 @@ GPUProcessManager::Shutdown()
|
||||
|
||||
GPUProcessManager::GPUProcessManager()
|
||||
: mTaskFactory(this),
|
||||
mNextLayerTreeId(0),
|
||||
mNextNamespace(0),
|
||||
mIdNamespace(0),
|
||||
mResourceId(0),
|
||||
mNumProcessAttempts(0),
|
||||
mDeviceResetCount(0),
|
||||
mProcess(nullptr),
|
||||
@ -90,6 +91,7 @@ GPUProcessManager::GPUProcessManager()
|
||||
{
|
||||
MOZ_COUNT_CTOR(GPUProcessManager);
|
||||
|
||||
mIdNamespace = AllocateNamespace();
|
||||
mObserver = new Observer(this);
|
||||
nsContentUtils::RegisterShutdownObserver(mObserver);
|
||||
|
||||
@ -888,8 +890,20 @@ GPUProcessManager::IsLayerTreeIdMapped(uint64_t aLayersId, base::ProcessId aRequ
|
||||
uint64_t
|
||||
GPUProcessManager::AllocateLayerTreeId()
|
||||
{
|
||||
// Allocate tree id by using id namespace.
|
||||
// By it, tree id does not conflict with external image id and
|
||||
// async image pipeline id.
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
return ++mNextLayerTreeId;
|
||||
++mResourceId;
|
||||
if (mResourceId == UINT32_MAX) {
|
||||
// Move to next id namespace.
|
||||
mIdNamespace = AllocateNamespace();
|
||||
mResourceId = 1;
|
||||
}
|
||||
|
||||
uint64_t layerTreeId = mIdNamespace;
|
||||
layerTreeId = (layerTreeId << 32) | mResourceId;
|
||||
return layerTreeId;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
|
@ -244,8 +244,9 @@ private:
|
||||
RefPtr<Observer> mObserver;
|
||||
ipc::TaskFactory<GPUProcessManager> mTaskFactory;
|
||||
RefPtr<VsyncIOThreadHolder> mVsyncIOThread;
|
||||
uint64_t mNextLayerTreeId;
|
||||
uint32_t mNextNamespace;
|
||||
uint32_t mIdNamespace;
|
||||
uint32_t mResourceId;
|
||||
uint32_t mNumProcessAttempts;
|
||||
|
||||
nsTArray<RefPtr<RemoteCompositorSession>> mRemoteSessions;
|
||||
|
@ -79,14 +79,15 @@ Atomic<int32_t> KnowsCompositor::sSerialCounter(0);
|
||||
|
||||
CompositorBridgeChild::CompositorBridgeChild(LayerManager *aLayerManager, uint32_t aNamespace)
|
||||
: mLayerManager(aLayerManager)
|
||||
, mNamespace(aNamespace)
|
||||
, mIdNamespace(aNamespace)
|
||||
, mResourceId(0)
|
||||
, mCanSend(false)
|
||||
, mFwdTransactionId(0)
|
||||
, mDeviceResetSequenceNumber(0)
|
||||
, mMessageLoop(MessageLoop::current())
|
||||
, mSectionAllocator(nullptr)
|
||||
{
|
||||
MOZ_ASSERT(mNamespace);
|
||||
MOZ_ASSERT(mIdNamespace);
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
}
|
||||
|
||||
@ -1169,16 +1170,28 @@ CompositorBridgeChild::DeallocPWebRenderBridgeChild(PWebRenderBridgeChild* aActo
|
||||
return true;
|
||||
}
|
||||
|
||||
uint64_t
|
||||
CompositorBridgeChild::GetNextResourceId()
|
||||
{
|
||||
++mResourceId;
|
||||
MOZ_RELEASE_ASSERT(mResourceId != UINT32_MAX);
|
||||
|
||||
uint64_t id = mIdNamespace;
|
||||
id = (id << 32) | mResourceId;
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
wr::MaybeExternalImageId
|
||||
CompositorBridgeChild::GetNextExternalImageId()
|
||||
{
|
||||
static uint32_t sNextID = 1;
|
||||
++sNextID;
|
||||
MOZ_RELEASE_ASSERT(sNextID != UINT32_MAX);
|
||||
return Some(wr::ToExternalImageId(GetNextResourceId()));
|
||||
}
|
||||
|
||||
uint64_t imageId = mNamespace;
|
||||
imageId = (imageId << 32) | sNextID;
|
||||
return Some(wr::ToExternalImageId(imageId));
|
||||
wr::PipelineId
|
||||
CompositorBridgeChild::GetNextPipelineId()
|
||||
{
|
||||
return wr::AsPipelineId(GetNextResourceId());
|
||||
}
|
||||
|
||||
} // namespace layers
|
||||
|
@ -235,6 +235,8 @@ public:
|
||||
|
||||
wr::MaybeExternalImageId GetNextExternalImageId() override;
|
||||
|
||||
wr::PipelineId GetNextPipelineId();
|
||||
|
||||
private:
|
||||
// Private destructor, to discourage deletion outside of Release():
|
||||
virtual ~CompositorBridgeChild();
|
||||
@ -268,6 +270,8 @@ private:
|
||||
already_AddRefed<nsIEventTarget>
|
||||
GetSpecificMessageEventTarget(const Message& aMsg) override;
|
||||
|
||||
uint64_t GetNextResourceId();
|
||||
|
||||
// Class used to store the shared FrameMetrics, mutex, and APZCId in a hash table
|
||||
class SharedFrameMetricsData {
|
||||
public:
|
||||
@ -296,7 +300,8 @@ private:
|
||||
|
||||
RefPtr<LayerManager> mLayerManager;
|
||||
|
||||
uint32_t mNamespace;
|
||||
uint32_t mIdNamespace;
|
||||
uint32_t mResourceId;
|
||||
|
||||
// When not multi-process, hold a reference to the CompositorBridgeParent to keep it
|
||||
// alive. This reference should be null in multi-process.
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include "gfxPrefs.h"
|
||||
#include "LayersLogging.h"
|
||||
#include "mozilla/gfx/gfxVars.h"
|
||||
#include "mozilla/layers/CompositorBridgeChild.h"
|
||||
#include "mozilla/layers/ImageClient.h"
|
||||
#include "mozilla/layers/ScrollingLayersHelper.h"
|
||||
#include "mozilla/layers/StackingContextHelper.h"
|
||||
@ -129,6 +130,8 @@ WebRenderImageLayer::RenderLayer(wr::DisplayListBuilder& aBuilder,
|
||||
if (GetImageClientType() == CompositableType::IMAGE_BRIDGE) {
|
||||
MOZ_ASSERT(!mImageClient);
|
||||
mExternalImageId = Some(WrBridge()->AllocExternalImageId(mContainer->GetAsyncContainerHandle()));
|
||||
// Alloc async image pipeline id.
|
||||
mPipelineId = Some(WrBridge()->GetCompositorBridgeChild()->GetNextPipelineId());
|
||||
} else {
|
||||
// Handle CompositableType::IMAGE case
|
||||
MOZ_ASSERT(mImageClient);
|
||||
|
Loading…
Reference in New Issue
Block a user