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:
Andrew Osmond 2025-01-21 17:54:30 +00:00
parent 681c87d49d
commit cd9ded6063
3 changed files with 13 additions and 19 deletions

View file

@ -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 {

View file

@ -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;
}; };
/** /**

View file

@ -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();
} }
} }