d3d: move device lock from ExternalImageDXGIImpl to ExternalImageDXGI
In follow up CLs, we will add subclasses of ExternalImageDXGIImpl, so
move the device lock to ExternalImageDXGI. so ExternalImageDXGIImpl
and subclasses don't need to handle device lock.
Bug: dawn:1662
Change-Id: I223361cb3f3088fdc3b85763b05a456bb93acc29
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/140322
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Peng Huang <penghuang@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/dawn/native/d3d/D3DBackend.cpp b/src/dawn/native/d3d/D3DBackend.cpp
index 3117cab..8beb4f8 100644
--- a/src/dawn/native/d3d/D3DBackend.cpp
+++ b/src/dawn/native/d3d/D3DBackend.cpp
@@ -53,19 +53,25 @@
ASSERT(mImpl != nullptr);
}
-ExternalImageDXGI::~ExternalImageDXGI() = default;
+ExternalImageDXGI::~ExternalImageDXGI() {
+ auto deviceLock = mImpl->GetScopedDeviceLock();
+ mImpl = nullptr;
+}
bool ExternalImageDXGI::IsValid() const {
+ auto deviceLock = mImpl->GetScopedDeviceLock();
return mImpl->IsValid();
}
WGPUTexture ExternalImageDXGI::BeginAccess(
const ExternalImageDXGIBeginAccessDescriptor* descriptor) {
+ auto deviceLock = mImpl->GetScopedDeviceLock();
return mImpl->BeginAccess(descriptor);
}
void ExternalImageDXGI::EndAccess(WGPUTexture texture,
ExternalImageDXGIFenceDescriptor* signalFence) {
+ auto deviceLock = mImpl->GetScopedDeviceLock();
mImpl->EndAccess(texture, signalFence);
}
@@ -74,7 +80,8 @@
WGPUDevice device,
const ExternalImageDescriptor* descriptor) {
Device* backendDevice = ToBackend(FromAPI(device));
- auto deviceLock(backendDevice->GetScopedLock());
+ auto deviceLock = backendDevice->GetScopedLock();
+
std::unique_ptr<ExternalImageDXGIImpl> impl =
backendDevice->CreateExternalImageDXGIImpl(descriptor);
if (!impl) {
diff --git a/src/dawn/native/d3d/ExternalImageDXGIImpl.cpp b/src/dawn/native/d3d/ExternalImageDXGIImpl.cpp
index 0445c58..d747bf1 100644
--- a/src/dawn/native/d3d/ExternalImageDXGIImpl.cpp
+++ b/src/dawn/native/d3d/ExternalImageDXGIImpl.cpp
@@ -57,6 +57,7 @@
mSampleCount(textureDescriptor->sampleCount),
mViewFormats(textureDescriptor->viewFormats,
textureDescriptor->viewFormats + textureDescriptor->viewFormatCount) {
+ ASSERT(mBackendDevice->IsLockedByCurrentThreadIfNeeded());
ASSERT(mBackendDevice != nullptr);
ASSERT(!textureDescriptor->nextInChain || textureDescriptor->nextInChain->sType ==
wgpu::SType::DawnTextureInternalUsageDescriptor);
@@ -68,31 +69,25 @@
}
ExternalImageDXGIImpl::~ExternalImageDXGIImpl() {
- auto deviceLock(GetScopedDeviceLock());
+ ASSERT(mBackendDevice->IsLockedByCurrentThreadIfNeeded());
DestroyInternal();
}
Mutex::AutoLock ExternalImageDXGIImpl::GetScopedDeviceLock() const {
- if (mBackendDevice != nullptr) {
- return mBackendDevice->GetScopedLock();
- }
- return Mutex::AutoLock();
+ return mBackendDevice->GetScopedLock();
}
bool ExternalImageDXGIImpl::IsValid() const {
- auto deviceLock(GetScopedDeviceLock());
-
+ ASSERT(mBackendDevice->IsLockedByCurrentThreadIfNeeded());
return IsInList();
}
void ExternalImageDXGIImpl::DestroyInternal() {
+ ASSERT(mBackendDevice->IsLockedByCurrentThreadIfNeeded());
if (IsInList()) {
mD3DResource = nullptr;
}
- // Linked list is not thread safe. A mutex must already be locked before
- // endtering this method. Either via Device::DestroyImpl() or ~ExternalImageDXGIImpl.
- ASSERT(mBackendDevice == nullptr || mBackendDevice->IsLockedByCurrentThreadIfNeeded());
if (IsInList()) {
RemoveFromList();
}
@@ -100,10 +95,9 @@
WGPUTexture ExternalImageDXGIImpl::BeginAccess(
const d3d::ExternalImageDXGIBeginAccessDescriptor* descriptor) {
+ ASSERT(mBackendDevice->IsLockedByCurrentThreadIfNeeded());
ASSERT(descriptor != nullptr);
- auto deviceLock(GetScopedDeviceLock());
-
if (!IsInList()) {
dawn::ErrorLog() << "Cannot use external image after device destruction";
return nullptr;
@@ -161,7 +155,7 @@
void ExternalImageDXGIImpl::EndAccess(WGPUTexture texture,
d3d::ExternalImageDXGIFenceDescriptor* signalFence) {
- auto deviceLock(GetScopedDeviceLock());
+ ASSERT(mBackendDevice->IsLockedByCurrentThreadIfNeeded());
if (!IsInList()) {
dawn::ErrorLog() << "Cannot use external image after device destruction";
diff --git a/src/dawn/native/d3d/ExternalImageDXGIImpl.h b/src/dawn/native/d3d/ExternalImageDXGIImpl.h
index 08a30ed..5d358a7 100644
--- a/src/dawn/native/d3d/ExternalImageDXGIImpl.h
+++ b/src/dawn/native/d3d/ExternalImageDXGIImpl.h
@@ -56,9 +56,9 @@
// or without locking.
void DestroyInternal();
- protected:
[[nodiscard]] Mutex::AutoLock GetScopedDeviceLock() const;
+ protected:
Ref<DeviceBase> mBackendDevice;
ComPtr<IUnknown> mD3DResource;
wgpu::TextureUsage mUsage;