forked from mirrors/gecko-dev
Bug 1936601. r=lsalzman a=RyanVM
Original Revision: https://phabricator.services.mozilla.com/D234803 Differential Revision: https://phabricator.services.mozilla.com/D234973
This commit is contained in:
parent
681c87d49d
commit
cd9ded6063
3 changed files with 13 additions and 19 deletions
|
|
@ -105,7 +105,9 @@ bool SourceSurfaceSharedDataWrapper::Map(MapType aMapType,
|
||||||
MutexAutoLock lock(*mHandleLock);
|
MutexAutoLock lock(*mHandleLock);
|
||||||
dataPtr = GetData();
|
dataPtr = GetData();
|
||||||
if (mMapCount == 0) {
|
if (mMapCount == 0) {
|
||||||
SharedSurfacesParent::RemoveTracking(this);
|
if (mConsumers > 0) {
|
||||||
|
SharedSurfacesParent::RemoveTracking(this);
|
||||||
|
}
|
||||||
if (!dataPtr) {
|
if (!dataPtr) {
|
||||||
size_t len = GetAlignedDataLength();
|
size_t len = GetAlignedDataLength();
|
||||||
if (!EnsureMapped(len)) {
|
if (!EnsureMapped(len)) {
|
||||||
|
|
@ -129,7 +131,7 @@ bool SourceSurfaceSharedDataWrapper::Map(MapType aMapType,
|
||||||
void SourceSurfaceSharedDataWrapper::Unmap() {
|
void SourceSurfaceSharedDataWrapper::Unmap() {
|
||||||
if (mHandleLock) {
|
if (mHandleLock) {
|
||||||
MutexAutoLock lock(*mHandleLock);
|
MutexAutoLock lock(*mHandleLock);
|
||||||
if (--mMapCount == 0) {
|
if (--mMapCount == 0 && mConsumers > 0) {
|
||||||
SharedSurfacesParent::AddTracking(this);
|
SharedSurfacesParent::AddTracking(this);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -39,12 +39,7 @@ class SourceSurfaceSharedDataWrapper final : public DataSourceSurface {
|
||||||
MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(SourceSurfaceSharedDataWrapper,
|
MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(SourceSurfaceSharedDataWrapper,
|
||||||
override)
|
override)
|
||||||
|
|
||||||
SourceSurfaceSharedDataWrapper()
|
SourceSurfaceSharedDataWrapper() = default;
|
||||||
: mStride(0),
|
|
||||||
mConsumers(0),
|
|
||||||
mFormat(SurfaceFormat::UNKNOWN),
|
|
||||||
mCreatorPid(0),
|
|
||||||
mCreatorRef(true) {}
|
|
||||||
|
|
||||||
void Init(const IntSize& aSize, int32_t aStride, SurfaceFormat aFormat,
|
void Init(const IntSize& aSize, int32_t aStride, SurfaceFormat aFormat,
|
||||||
SharedMemoryBasic::Handle aHandle, base::ProcessId aCreatorPid);
|
SharedMemoryBasic::Handle aHandle, base::ProcessId aCreatorPid);
|
||||||
|
|
@ -85,10 +80,7 @@ class SourceSurfaceSharedDataWrapper final : public DataSourceSurface {
|
||||||
return --mConsumers == 0;
|
return --mConsumers == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t GetConsumers() const {
|
uint32_t GetConsumers() const { return mConsumers; }
|
||||||
MOZ_ASSERT(mConsumers > 0);
|
|
||||||
return mConsumers;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HasCreatorRef() const { return mCreatorRef; }
|
bool HasCreatorRef() const { return mCreatorRef; }
|
||||||
|
|
||||||
|
|
@ -112,13 +104,13 @@ class SourceSurfaceSharedDataWrapper final : public DataSourceSurface {
|
||||||
// Protects mapping and unmapping of mBuf.
|
// Protects mapping and unmapping of mBuf.
|
||||||
Maybe<Mutex> mHandleLock;
|
Maybe<Mutex> mHandleLock;
|
||||||
nsExpirationState mExpirationState;
|
nsExpirationState mExpirationState;
|
||||||
int32_t mStride;
|
int32_t mStride = 0;
|
||||||
uint32_t mConsumers;
|
uint32_t mConsumers = 1;
|
||||||
IntSize mSize;
|
IntSize mSize;
|
||||||
RefPtr<SharedMemoryBasic> mBuf;
|
RefPtr<SharedMemoryBasic> mBuf;
|
||||||
SurfaceFormat mFormat;
|
SurfaceFormat mFormat = SurfaceFormat::UNKNOWN;
|
||||||
base::ProcessId mCreatorPid;
|
base::ProcessId mCreatorPid = 0;
|
||||||
bool mCreatorRef;
|
bool mCreatorRef = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -200,7 +200,6 @@ void SharedSurfacesParent::AddSameProcess(const wr::ExternalImageId& aId,
|
||||||
auto texture = MakeRefPtr<wr::RenderSharedSurfaceTextureHost>(surface);
|
auto texture = MakeRefPtr<wr::RenderSharedSurfaceTextureHost>(surface);
|
||||||
wr::RenderThread::Get()->RegisterExternalImage(aId, texture.forget());
|
wr::RenderThread::Get()->RegisterExternalImage(aId, texture.forget());
|
||||||
|
|
||||||
surface->AddConsumer();
|
|
||||||
sInstance->mSurfaces.InsertOrUpdate(id, std::move(surface));
|
sInstance->mSurfaces.InsertOrUpdate(id, std::move(surface));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -269,7 +268,6 @@ void SharedSurfacesParent::Add(const wr::ExternalImageId& aId,
|
||||||
auto texture = MakeRefPtr<wr::RenderSharedSurfaceTextureHost>(surface);
|
auto texture = MakeRefPtr<wr::RenderSharedSurfaceTextureHost>(surface);
|
||||||
wr::RenderThread::Get()->RegisterExternalImage(aId, texture.forget());
|
wr::RenderThread::Get()->RegisterExternalImage(aId, texture.forget());
|
||||||
|
|
||||||
surface->AddConsumer();
|
|
||||||
sInstance->mSurfaces.InsertOrUpdate(id, std::move(surface));
|
sInstance->mSurfaces.InsertOrUpdate(id, std::move(surface));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -284,6 +282,7 @@ void SharedSurfacesParent::AddTrackingLocked(
|
||||||
SourceSurfaceSharedDataWrapper* aSurface,
|
SourceSurfaceSharedDataWrapper* aSurface,
|
||||||
const StaticMutexAutoLock& aAutoLock) {
|
const StaticMutexAutoLock& aAutoLock) {
|
||||||
MOZ_ASSERT(!aSurface->GetExpirationState()->IsTracked());
|
MOZ_ASSERT(!aSurface->GetExpirationState()->IsTracked());
|
||||||
|
MOZ_ASSERT(aSurface->GetConsumers() > 0);
|
||||||
sInstance->mTracker.AddObjectLocked(aSurface, aAutoLock);
|
sInstance->mTracker.AddObjectLocked(aSurface, aAutoLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -356,6 +355,7 @@ bool SharedSurfacesParent::AgeAndExpireOneGeneration() {
|
||||||
void SharedSurfacesParent::ExpireMap(
|
void SharedSurfacesParent::ExpireMap(
|
||||||
nsTArray<RefPtr<SourceSurfaceSharedDataWrapper>>& aExpired) {
|
nsTArray<RefPtr<SourceSurfaceSharedDataWrapper>>& aExpired) {
|
||||||
for (auto& surface : aExpired) {
|
for (auto& surface : aExpired) {
|
||||||
|
MOZ_ASSERT(surface->GetConsumers() > 0);
|
||||||
surface->ExpireMap();
|
surface->ExpireMap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue