Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/doitsujin/dxvk.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Ashton <joshua@froggi.es>2021-07-24 22:10:30 +0300
committerJoshua Ashton <joshua@froggi.es>2021-07-24 22:15:57 +0300
commit4f996fc70b8455ec1cf19a1dfd1af6c11405ffe6 (patch)
tree3adf0493c0c4655dfb6beb0c300b74b471591367
parent6094f9dc21c362c3336ae0469ef25f209a390891 (diff)
[d3d9] Optimize clears with rt mask and better ref trackingd3d9-cleanups-josh
-rw-r--r--src/d3d9/d3d9_device.cpp25
1 files changed, 12 insertions, 13 deletions
diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp
index 02613a1a..81208972 100644
--- a/src/d3d9/d3d9_device.cpp
+++ b/src/d3d9/d3d9_device.cpp
@@ -1414,25 +1414,24 @@ namespace dxvk {
VkClearValue clearValueColor;
DecodeD3DCOLOR(Color, clearValueColor.color.float32);
- auto dsv = m_state.depthStencil != nullptr ? m_state.depthStencil->GetDepthStencilView() : nullptr;
VkImageAspectFlags depthAspectMask = 0;
- if (dsv != nullptr) {
+ if (m_state.depthStencil != nullptr) {
if (Flags & D3DCLEAR_ZBUFFER)
depthAspectMask |= VK_IMAGE_ASPECT_DEPTH_BIT;
if (Flags & D3DCLEAR_STENCIL)
depthAspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT;
- depthAspectMask &= imageFormatInfo(dsv->info().format)->aspectMask;
+ depthAspectMask &= imageFormatInfo(m_state.depthStencil->GetCommonTexture()->GetFormatMapping().FormatColor)->aspectMask;
}
auto ClearImageView = [this](
- bool fullClear,
- VkOffset3D offset,
- VkExtent3D extent,
- Rc<DxvkImageView> imageView,
- VkImageAspectFlags aspectMask,
- VkClearValue clearValue) {
+ bool fullClear,
+ VkOffset3D offset,
+ VkExtent3D extent,
+ const Rc<DxvkImageView>& imageView,
+ VkImageAspectFlags aspectMask,
+ VkClearValue clearValue) {
if (fullClear) {
EmitCs([
cClearValue = clearValue,
@@ -1468,14 +1467,14 @@ namespace dxvk {
VkExtent3D extent) {
// Clear depth if we need to.
if (depthAspectMask != 0)
- ClearImageView(fullClear, offset, extent, dsv, depthAspectMask, clearValueDepth);
+ ClearImageView(fullClear, offset, extent, m_state.depthStencil->GetDepthStencilView(), depthAspectMask, clearValueDepth);
// Clear render targets if we need to.
if (Flags & D3DCLEAR_TARGET) {
- for (auto rt : m_state.renderTargets) {
- auto rtv = rt != nullptr ? rt->GetRenderTargetView(srgb) : nullptr;
+ for (uint32_t rt = m_activeRTs; rt; rt &= rt - 1) {
+ const auto& rtv = m_state.renderTargets[bit::tzcnt(rt)]->GetRenderTargetView(srgb);
- if (unlikely(rtv != nullptr))
+ if (likely(rtv != nullptr))
ClearImageView(fullClear, offset, extent, rtv, VK_IMAGE_ASPECT_COLOR_BIT, clearValueColor);
}
}