Bug 1974174 - Ensure we don't release the fences holder too early. r=sotaro,gfx-reviewers, a=dsmith
This patch adds an additional reference count to each FencesHolder stored in the map, so that TextureHosts can acquire a reference at initialization and release it at destruction. Previously the lifetime of the entry was controlled by the TextureClient + TextureData. Differential Revision: https://phabricator.services.mozilla.com/D255536
This commit is contained in:
committed by
dsmith@mozilla.com
parent
c95346b790
commit
442a28af4b
@@ -34,20 +34,52 @@ CompositeProcessD3D11FencesHolderMap::~CompositeProcessD3D11FencesHolderMap() {}
|
|||||||
|
|
||||||
void CompositeProcessD3D11FencesHolderMap::Register(
|
void CompositeProcessD3D11FencesHolderMap::Register(
|
||||||
CompositeProcessFencesHolderId aHolderId) {
|
CompositeProcessFencesHolderId aHolderId) {
|
||||||
|
MOZ_ASSERT(aHolderId.IsValid());
|
||||||
|
|
||||||
MonitorAutoLock lock(mMonitor);
|
MonitorAutoLock lock(mMonitor);
|
||||||
|
|
||||||
mFencesHolderById[aHolderId] = MakeUnique<FencesHolder>();
|
DebugOnly<bool> inserted =
|
||||||
|
mFencesHolderById.emplace(aHolderId, MakeUnique<FencesHolder>()).second;
|
||||||
|
MOZ_ASSERT(inserted, "Map already contained FencesHolder for id!");
|
||||||
}
|
}
|
||||||
void CompositeProcessD3D11FencesHolderMap::Unregister(
|
|
||||||
|
void CompositeProcessD3D11FencesHolderMap::RegisterReference(
|
||||||
CompositeProcessFencesHolderId aHolderId) {
|
CompositeProcessFencesHolderId aHolderId) {
|
||||||
|
if (!aHolderId.IsValid()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
MonitorAutoLock lock(mMonitor);
|
MonitorAutoLock lock(mMonitor);
|
||||||
|
|
||||||
auto it = mFencesHolderById.find(aHolderId);
|
auto it = mFencesHolderById.find(aHolderId);
|
||||||
if (it == mFencesHolderById.end()) {
|
if (it == mFencesHolderById.end()) {
|
||||||
|
MOZ_ASSERT_UNREACHABLE("Map missing FencesHolder for id!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MOZ_ASSERT(it->second->mOwners > 0);
|
||||||
|
++it->second->mOwners;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CompositeProcessD3D11FencesHolderMap::Unregister(
|
||||||
|
CompositeProcessFencesHolderId aHolderId) {
|
||||||
|
if (!aHolderId.IsValid()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
MonitorAutoLock lock(mMonitor);
|
||||||
|
|
||||||
|
auto it = mFencesHolderById.find(aHolderId);
|
||||||
|
if (it == mFencesHolderById.end()) {
|
||||||
|
MOZ_ASSERT_UNREACHABLE("Map missing FencesHolder for id!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
MOZ_ASSERT(it->second->mOwners > 0);
|
||||||
|
if (--it->second->mOwners == 0) {
|
||||||
mFencesHolderById.erase(it);
|
mFencesHolderById.erase(it);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CompositeProcessD3D11FencesHolderMap::SetWriteFence(
|
void CompositeProcessD3D11FencesHolderMap::SetWriteFence(
|
||||||
CompositeProcessFencesHolderId aHolderId, RefPtr<FenceD3D11> aWriteFence) {
|
CompositeProcessFencesHolderId aHolderId, RefPtr<FenceD3D11> aWriteFence) {
|
||||||
@@ -59,6 +91,7 @@ void CompositeProcessD3D11FencesHolderMap::SetWriteFence(
|
|||||||
|
|
||||||
MonitorAutoLock lock(mMonitor);
|
MonitorAutoLock lock(mMonitor);
|
||||||
|
|
||||||
|
MOZ_ASSERT(aHolderId.IsValid());
|
||||||
auto it = mFencesHolderById.find(aHolderId);
|
auto it = mFencesHolderById.find(aHolderId);
|
||||||
if (it == mFencesHolderById.end()) {
|
if (it == mFencesHolderById.end()) {
|
||||||
MOZ_ASSERT_UNREACHABLE("unexpected to be called");
|
MOZ_ASSERT_UNREACHABLE("unexpected to be called");
|
||||||
@@ -87,6 +120,7 @@ void CompositeProcessD3D11FencesHolderMap::SetReadFence(
|
|||||||
|
|
||||||
MonitorAutoLock lock(mMonitor);
|
MonitorAutoLock lock(mMonitor);
|
||||||
|
|
||||||
|
MOZ_ASSERT(aHolderId.IsValid());
|
||||||
auto it = mFencesHolderById.find(aHolderId);
|
auto it = mFencesHolderById.find(aHolderId);
|
||||||
if (it == mFencesHolderById.end()) {
|
if (it == mFencesHolderById.end()) {
|
||||||
MOZ_ASSERT_UNREACHABLE("unexpected to be called");
|
MOZ_ASSERT_UNREACHABLE("unexpected to be called");
|
||||||
@@ -114,6 +148,7 @@ bool CompositeProcessD3D11FencesHolderMap::WaitWriteFence(
|
|||||||
{
|
{
|
||||||
MonitorAutoLock lock(mMonitor);
|
MonitorAutoLock lock(mMonitor);
|
||||||
|
|
||||||
|
MOZ_ASSERT(aHolderId.IsValid());
|
||||||
auto it = mFencesHolderById.find(aHolderId);
|
auto it = mFencesHolderById.find(aHolderId);
|
||||||
if (it == mFencesHolderById.end()) {
|
if (it == mFencesHolderById.end()) {
|
||||||
MOZ_ASSERT_UNREACHABLE("unexpected to be called");
|
MOZ_ASSERT_UNREACHABLE("unexpected to be called");
|
||||||
@@ -142,6 +177,7 @@ bool CompositeProcessD3D11FencesHolderMap::WaitAllFencesAndForget(
|
|||||||
{
|
{
|
||||||
MonitorAutoLock lock(mMonitor);
|
MonitorAutoLock lock(mMonitor);
|
||||||
|
|
||||||
|
MOZ_ASSERT(aHolderId.IsValid());
|
||||||
auto it = mFencesHolderById.find(aHolderId);
|
auto it = mFencesHolderById.find(aHolderId);
|
||||||
if (it == mFencesHolderById.end()) {
|
if (it == mFencesHolderById.end()) {
|
||||||
MOZ_ASSERT_UNREACHABLE("unexpected to be called");
|
MOZ_ASSERT_UNREACHABLE("unexpected to be called");
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ class CompositeProcessD3D11FencesHolderMap {
|
|||||||
~CompositeProcessD3D11FencesHolderMap();
|
~CompositeProcessD3D11FencesHolderMap();
|
||||||
|
|
||||||
void Register(CompositeProcessFencesHolderId aHolderId);
|
void Register(CompositeProcessFencesHolderId aHolderId);
|
||||||
|
void RegisterReference(CompositeProcessFencesHolderId aHolderId);
|
||||||
void Unregister(CompositeProcessFencesHolderId aHolderId);
|
void Unregister(CompositeProcessFencesHolderId aHolderId);
|
||||||
|
|
||||||
void SetWriteFence(CompositeProcessFencesHolderId aHolderId,
|
void SetWriteFence(CompositeProcessFencesHolderId aHolderId,
|
||||||
@@ -51,13 +52,14 @@ class CompositeProcessD3D11FencesHolderMap {
|
|||||||
|
|
||||||
RefPtr<FenceD3D11> mWriteFence;
|
RefPtr<FenceD3D11> mWriteFence;
|
||||||
std::vector<RefPtr<FenceD3D11>> mReadFences;
|
std::vector<RefPtr<FenceD3D11>> mReadFences;
|
||||||
|
uint32_t mOwners = 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
mutable Monitor mMonitor MOZ_UNANNOTATED;
|
mutable Monitor mMonitor;
|
||||||
|
|
||||||
std::unordered_map<CompositeProcessFencesHolderId, UniquePtr<FencesHolder>,
|
std::unordered_map<CompositeProcessFencesHolderId, UniquePtr<FencesHolder>,
|
||||||
CompositeProcessFencesHolderId::HashFn>
|
CompositeProcessFencesHolderId::HashFn>
|
||||||
mFencesHolderById;
|
mFencesHolderById MOZ_GUARDED_BY(mMonitor);
|
||||||
|
|
||||||
static StaticAutoPtr<CompositeProcessD3D11FencesHolderMap> sInstance;
|
static StaticAutoPtr<CompositeProcessD3D11FencesHolderMap> sInstance;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -359,6 +359,7 @@ D3D11TextureData::~D3D11TextureData() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (mFencesHolderId.isSome()) {
|
if (mFencesHolderId.isSome()) {
|
||||||
|
MOZ_ASSERT(mFencesHolderId->IsValid());
|
||||||
auto* fencesHolderMap = CompositeProcessD3D11FencesHolderMap::Get();
|
auto* fencesHolderMap = CompositeProcessD3D11FencesHolderMap::Get();
|
||||||
if (fencesHolderMap) {
|
if (fencesHolderMap) {
|
||||||
fencesHolderMap->Unregister(mFencesHolderId.ref());
|
fencesHolderMap->Unregister(mFencesHolderId.ref());
|
||||||
@@ -371,6 +372,7 @@ D3D11TextureData::~D3D11TextureData() {
|
|||||||
|
|
||||||
bool D3D11TextureData::Lock(OpenMode aMode) {
|
bool D3D11TextureData::Lock(OpenMode aMode) {
|
||||||
if (mFencesHolderId.isSome()) {
|
if (mFencesHolderId.isSome()) {
|
||||||
|
MOZ_ASSERT(mFencesHolderId->IsValid());
|
||||||
auto* fencesHolderMap = CompositeProcessD3D11FencesHolderMap::Get();
|
auto* fencesHolderMap = CompositeProcessD3D11FencesHolderMap::Get();
|
||||||
fencesHolderMap->WaitAllFencesAndForget(mFencesHolderId.ref(), mDevice);
|
fencesHolderMap->WaitAllFencesAndForget(mFencesHolderId.ref(), mDevice);
|
||||||
}
|
}
|
||||||
@@ -414,6 +416,7 @@ bool D3D11TextureData::PrepareDrawTargetInLock(OpenMode aMode) {
|
|||||||
void D3D11TextureData::Unlock() {
|
void D3D11TextureData::Unlock() {
|
||||||
IncrementAndSignalWriteFence();
|
IncrementAndSignalWriteFence();
|
||||||
if (mFencesHolderId.isSome()) {
|
if (mFencesHolderId.isSome()) {
|
||||||
|
MOZ_ASSERT(mFencesHolderId->IsValid());
|
||||||
auto* fencesHolderMap = CompositeProcessD3D11FencesHolderMap::Get();
|
auto* fencesHolderMap = CompositeProcessD3D11FencesHolderMap::Get();
|
||||||
fencesHolderMap->SetWriteFence(mFencesHolderId.ref(), mWriteFence);
|
fencesHolderMap->SetWriteFence(mFencesHolderId.ref(), mWriteFence);
|
||||||
}
|
}
|
||||||
@@ -719,6 +722,9 @@ void D3D11TextureData::IncrementAndSignalWriteFence() {
|
|||||||
if (mFencesHolderId.isNothing() || !mWriteFence) {
|
if (mFencesHolderId.isNothing() || !mWriteFence) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MOZ_ASSERT(mFencesHolderId->IsValid());
|
||||||
|
|
||||||
auto* fencesHolderMap = CompositeProcessD3D11FencesHolderMap::Get();
|
auto* fencesHolderMap = CompositeProcessD3D11FencesHolderMap::Get();
|
||||||
if (!fencesHolderMap) {
|
if (!fencesHolderMap) {
|
||||||
MOZ_ASSERT_UNREACHABLE("unexpected to be called");
|
MOZ_ASSERT_UNREACHABLE("unexpected to be called");
|
||||||
@@ -993,7 +999,28 @@ DXGITextureHostD3D11::DXGITextureHostD3D11(
|
|||||||
mHasKeyedMutex(aDescriptor.hasKeyedMutex()),
|
mHasKeyedMutex(aDescriptor.hasKeyedMutex()),
|
||||||
mFencesHolderId(aDescriptor.fencesHolderId()),
|
mFencesHolderId(aDescriptor.fencesHolderId()),
|
||||||
mColorSpace(aDescriptor.colorSpace()),
|
mColorSpace(aDescriptor.colorSpace()),
|
||||||
mColorRange(aDescriptor.colorRange()) {}
|
mColorRange(aDescriptor.colorRange()) {
|
||||||
|
if (!mFencesHolderId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
MOZ_ASSERT(mFencesHolderId->IsValid());
|
||||||
|
if (auto* fenceHolderMap = CompositeProcessD3D11FencesHolderMap::Get()) {
|
||||||
|
fenceHolderMap->RegisterReference(mFencesHolderId.ref());
|
||||||
|
} else {
|
||||||
|
MOZ_ASSERT_UNREACHABLE("FencesHolderMap not available");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DXGITextureHostD3D11::~DXGITextureHostD3D11() {
|
||||||
|
if (!mFencesHolderId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (auto* fenceHolderMap = CompositeProcessD3D11FencesHolderMap::Get()) {
|
||||||
|
fenceHolderMap->Unregister(mFencesHolderId.ref());
|
||||||
|
} else {
|
||||||
|
MOZ_ASSERT_UNREACHABLE("FencesHolderMap not available");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
already_AddRefed<gfx::DataSourceSurface> DXGITextureHostD3D11::GetAsSurface(
|
already_AddRefed<gfx::DataSourceSurface> DXGITextureHostD3D11::GetAsSurface(
|
||||||
gfx::DataSourceSurface* aSurface) {
|
gfx::DataSourceSurface* aSurface) {
|
||||||
@@ -1445,11 +1472,24 @@ DXGIYCbCrTextureHostD3D11::DXGIYCbCrTextureHostD3D11(
|
|||||||
mYUVColorSpace(aDescriptor.yUVColorSpace()),
|
mYUVColorSpace(aDescriptor.yUVColorSpace()),
|
||||||
mColorRange(aDescriptor.colorRange()),
|
mColorRange(aDescriptor.colorRange()),
|
||||||
mFencesHolderId(aDescriptor.fencesHolderId()) {
|
mFencesHolderId(aDescriptor.fencesHolderId()) {
|
||||||
|
if (auto* fenceHolderMap = CompositeProcessD3D11FencesHolderMap::Get()) {
|
||||||
|
fenceHolderMap->RegisterReference(mFencesHolderId);
|
||||||
|
} else {
|
||||||
|
MOZ_ASSERT_UNREACHABLE("FencesHolderMap not available");
|
||||||
|
}
|
||||||
mHandles[0] = aDescriptor.handleY();
|
mHandles[0] = aDescriptor.handleY();
|
||||||
mHandles[1] = aDescriptor.handleCb();
|
mHandles[1] = aDescriptor.handleCb();
|
||||||
mHandles[2] = aDescriptor.handleCr();
|
mHandles[2] = aDescriptor.handleCr();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DXGIYCbCrTextureHostD3D11::~DXGIYCbCrTextureHostD3D11() {
|
||||||
|
if (auto* fenceHolderMap = CompositeProcessD3D11FencesHolderMap::Get()) {
|
||||||
|
fenceHolderMap->Unregister(mFencesHolderId);
|
||||||
|
} else {
|
||||||
|
MOZ_ASSERT_UNREACHABLE("FencesHolderMap not available");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void DXGIYCbCrTextureHostD3D11::CreateRenderTexture(
|
void DXGIYCbCrTextureHostD3D11::CreateRenderTexture(
|
||||||
const wr::ExternalImageId& aExternalImageId) {
|
const wr::ExternalImageId& aExternalImageId) {
|
||||||
MOZ_ASSERT(mExternalImageId.isSome());
|
MOZ_ASSERT(mExternalImageId.isSome());
|
||||||
|
|||||||
@@ -364,6 +364,7 @@ class DXGITextureHostD3D11 : public TextureHost {
|
|||||||
public:
|
public:
|
||||||
DXGITextureHostD3D11(TextureFlags aFlags,
|
DXGITextureHostD3D11(TextureFlags aFlags,
|
||||||
const SurfaceDescriptorD3D10& aDescriptor);
|
const SurfaceDescriptorD3D10& aDescriptor);
|
||||||
|
~DXGITextureHostD3D11() override;
|
||||||
|
|
||||||
void DeallocateDeviceData() override {}
|
void DeallocateDeviceData() override {}
|
||||||
|
|
||||||
@@ -415,6 +416,7 @@ class DXGIYCbCrTextureHostD3D11 : public TextureHost {
|
|||||||
public:
|
public:
|
||||||
DXGIYCbCrTextureHostD3D11(TextureFlags aFlags,
|
DXGIYCbCrTextureHostD3D11(TextureFlags aFlags,
|
||||||
const SurfaceDescriptorDXGIYCbCr& aDescriptor);
|
const SurfaceDescriptorDXGIYCbCr& aDescriptor);
|
||||||
|
~DXGIYCbCrTextureHostD3D11() override;
|
||||||
|
|
||||||
void DeallocateDeviceData() override {}
|
void DeallocateDeviceData() override {}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user