Optimize subresource tracking - use texture view
Bug: dawn:441
Change-Id: I5cdfc1d84b27eb0b127d34ee829ceedf15f1150c
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/22321
Commit-Queue: Yunchao He <yunchao.he@intel.com>
Reviewed-by: Austin Eng <enga@chromium.org>
diff --git a/src/dawn_native/SwapChain.cpp b/src/dawn_native/SwapChain.cpp
index 3650fc0..6358567 100644
--- a/src/dawn_native/SwapChain.cpp
+++ b/src/dawn_native/SwapChain.cpp
@@ -199,7 +199,7 @@
}
ASSERT(!IsError());
- if (GetDevice()->ConsumedError(OnBeforePresent(mCurrentTexture.Get()))) {
+ if (GetDevice()->ConsumedError(OnBeforePresent(mCurrentTextureView.Get()))) {
return;
}
diff --git a/src/dawn_native/SwapChain.h b/src/dawn_native/SwapChain.h
index 3997611..6e32e53 100644
--- a/src/dawn_native/SwapChain.h
+++ b/src/dawn_native/SwapChain.h
@@ -68,7 +68,7 @@
~OldSwapChainBase() override;
const DawnSwapChainImplementation& GetImplementation();
virtual TextureBase* GetNextTextureImpl(const TextureDescriptor*) = 0;
- virtual MaybeError OnBeforePresent(TextureBase* texture) = 0;
+ virtual MaybeError OnBeforePresent(TextureViewBase* view) = 0;
private:
MaybeError ValidateConfigure(wgpu::TextureFormat format,
diff --git a/src/dawn_native/d3d12/SwapChainD3D12.cpp b/src/dawn_native/d3d12/SwapChainD3D12.cpp
index ee5e9cc..7479805 100644
--- a/src/dawn_native/d3d12/SwapChainD3D12.cpp
+++ b/src/dawn_native/d3d12/SwapChainD3D12.cpp
@@ -48,14 +48,16 @@
return new Texture(ToBackend(GetDevice()), descriptor, std::move(d3d12Texture));
}
- MaybeError SwapChain::OnBeforePresent(TextureBase* texture) {
+ MaybeError SwapChain::OnBeforePresent(TextureViewBase* view) {
Device* device = ToBackend(GetDevice());
CommandRecordingContext* commandContext;
DAWN_TRY_ASSIGN(commandContext, device->GetPendingCommandContext());
// Perform the necessary transition for the texture to be presented.
- ToBackend(texture)->TrackAllUsageAndTransitionNow(commandContext, mTextureUsage);
+ ToBackend(view->GetTexture())
+ ->TrackUsageAndTransitionNow(commandContext, mTextureUsage,
+ view->GetSubresourceRange());
DAWN_TRY(device->ExecutePendingCommandContext());
diff --git a/src/dawn_native/d3d12/SwapChainD3D12.h b/src/dawn_native/d3d12/SwapChainD3D12.h
index ee92e09..6938e20 100644
--- a/src/dawn_native/d3d12/SwapChainD3D12.h
+++ b/src/dawn_native/d3d12/SwapChainD3D12.h
@@ -28,7 +28,7 @@
protected:
~SwapChain() override;
TextureBase* GetNextTextureImpl(const TextureDescriptor* descriptor) override;
- MaybeError OnBeforePresent(TextureBase* texture) override;
+ MaybeError OnBeforePresent(TextureViewBase* view) override;
wgpu::TextureUsage mTextureUsage;
};
diff --git a/src/dawn_native/metal/SwapChainMTL.h b/src/dawn_native/metal/SwapChainMTL.h
index adfd632..19abc7f 100644
--- a/src/dawn_native/metal/SwapChainMTL.h
+++ b/src/dawn_native/metal/SwapChainMTL.h
@@ -32,7 +32,7 @@
protected:
~OldSwapChain() override;
TextureBase* GetNextTextureImpl(const TextureDescriptor* descriptor) override;
- MaybeError OnBeforePresent(TextureBase* texture) override;
+ MaybeError OnBeforePresent(TextureViewBase* view) override;
};
class SwapChain final : public NewSwapChainBase {
diff --git a/src/dawn_native/metal/SwapChainMTL.mm b/src/dawn_native/metal/SwapChainMTL.mm
index 2a5ffb1..f581da9 100644
--- a/src/dawn_native/metal/SwapChainMTL.mm
+++ b/src/dawn_native/metal/SwapChainMTL.mm
@@ -51,7 +51,7 @@
return new Texture(ToBackend(GetDevice()), descriptor, nativeTexture);
}
- MaybeError OldSwapChain::OnBeforePresent(TextureBase*) {
+ MaybeError OldSwapChain::OnBeforePresent(TextureViewBase*) {
return {};
}
diff --git a/src/dawn_native/null/DeviceNull.cpp b/src/dawn_native/null/DeviceNull.cpp
index c19670e..adc44f0 100644
--- a/src/dawn_native/null/DeviceNull.cpp
+++ b/src/dawn_native/null/DeviceNull.cpp
@@ -443,7 +443,7 @@
return GetDevice()->CreateTexture(descriptor);
}
- MaybeError OldSwapChain::OnBeforePresent(TextureBase*) {
+ MaybeError OldSwapChain::OnBeforePresent(TextureViewBase*) {
return {};
}
diff --git a/src/dawn_native/null/DeviceNull.h b/src/dawn_native/null/DeviceNull.h
index 42fce4d..f6f3611 100644
--- a/src/dawn_native/null/DeviceNull.h
+++ b/src/dawn_native/null/DeviceNull.h
@@ -268,7 +268,7 @@
protected:
~OldSwapChain() override;
TextureBase* GetNextTextureImpl(const TextureDescriptor* descriptor) override;
- MaybeError OnBeforePresent(TextureBase*) override;
+ MaybeError OnBeforePresent(TextureViewBase*) override;
};
class NativeSwapChainImpl {
diff --git a/src/dawn_native/opengl/SwapChainGL.cpp b/src/dawn_native/opengl/SwapChainGL.cpp
index 40efd0a..8223a2c 100644
--- a/src/dawn_native/opengl/SwapChainGL.cpp
+++ b/src/dawn_native/opengl/SwapChainGL.cpp
@@ -44,7 +44,7 @@
TextureBase::TextureState::OwnedExternal);
}
- MaybeError SwapChain::OnBeforePresent(TextureBase*) {
+ MaybeError SwapChain::OnBeforePresent(TextureViewBase*) {
return {};
}
diff --git a/src/dawn_native/opengl/SwapChainGL.h b/src/dawn_native/opengl/SwapChainGL.h
index a483e70..0cce925 100644
--- a/src/dawn_native/opengl/SwapChainGL.h
+++ b/src/dawn_native/opengl/SwapChainGL.h
@@ -30,7 +30,7 @@
protected:
~SwapChain() override;
TextureBase* GetNextTextureImpl(const TextureDescriptor* descriptor) override;
- MaybeError OnBeforePresent(TextureBase* texture) override;
+ MaybeError OnBeforePresent(TextureViewBase* view) override;
};
}} // namespace dawn_native::opengl
diff --git a/src/dawn_native/vulkan/CommandBufferVk.cpp b/src/dawn_native/vulkan/CommandBufferVk.cpp
index 73d6bbc..f1003c1 100644
--- a/src/dawn_native/vulkan/CommandBufferVk.cpp
+++ b/src/dawn_native/vulkan/CommandBufferVk.cpp
@@ -153,16 +153,15 @@
break;
case wgpu::BindingType::ReadonlyStorageTexture:
- case wgpu::BindingType::WriteonlyStorageTexture:
- // TODO (yunchao.he@intel.com): Do the transition for texture's
- // subresource via its view.
- ToBackend(
- static_cast<TextureViewBase*>(mBindings[index][bindingIndex])
- ->GetTexture())
- ->TransitionFullUsage(recordingContext,
- wgpu::TextureUsage::Storage);
+ case wgpu::BindingType::WriteonlyStorageTexture: {
+ TextureViewBase* view =
+ static_cast<TextureViewBase*>(mBindings[index][bindingIndex]);
+ ToBackend(view->GetTexture())
+ ->TransitionUsageNow(recordingContext,
+ wgpu::TextureUsage::Storage,
+ view->GetSubresourceRange());
break;
-
+ }
case wgpu::BindingType::StorageTexture:
// Not implemented.
diff --git a/src/dawn_native/vulkan/SwapChainVk.cpp b/src/dawn_native/vulkan/SwapChainVk.cpp
index 99c4775..6601287 100644
--- a/src/dawn_native/vulkan/SwapChainVk.cpp
+++ b/src/dawn_native/vulkan/SwapChainVk.cpp
@@ -53,13 +53,14 @@
.Detach();
}
- MaybeError SwapChain::OnBeforePresent(TextureBase* texture) {
+ MaybeError SwapChain::OnBeforePresent(TextureViewBase* view) {
Device* device = ToBackend(GetDevice());
// Perform the necessary pipeline barriers for the texture to be used with the usage
// requested by the implementation.
CommandRecordingContext* recordingContext = device->GetPendingRecordingContext();
- ToBackend(texture)->TransitionFullUsage(recordingContext, mTextureUsage);
+ ToBackend(view->GetTexture())
+ ->TransitionUsageNow(recordingContext, mTextureUsage, view->GetSubresourceRange());
DAWN_TRY(device->SubmitPendingCommands());
diff --git a/src/dawn_native/vulkan/SwapChainVk.h b/src/dawn_native/vulkan/SwapChainVk.h
index 7765fc0..9ee1792 100644
--- a/src/dawn_native/vulkan/SwapChainVk.h
+++ b/src/dawn_native/vulkan/SwapChainVk.h
@@ -32,7 +32,7 @@
~SwapChain() override;
TextureBase* GetNextTextureImpl(const TextureDescriptor* descriptor) override;
- MaybeError OnBeforePresent(TextureBase* texture) override;
+ MaybeError OnBeforePresent(TextureViewBase* view) override;
private:
wgpu::TextureUsage mTextureUsage;