diff options
author | Joshua Ashton <joshua@froggi.es> | 2021-07-24 22:10:30 +0300 |
---|---|---|
committer | Joshua Ashton <joshua@froggi.es> | 2021-07-24 22:15:57 +0300 |
commit | 4f996fc70b8455ec1cf19a1dfd1af6c11405ffe6 (patch) | |
tree | 3adf0493c0c4655dfb6beb0c300b74b471591367 | |
parent | 6094f9dc21c362c3336ae0469ef25f209a390891 (diff) |
[d3d9] Optimize clears with rt mask and better ref trackingd3d9-cleanups-josh
-rw-r--r-- | src/d3d9/d3d9_device.cpp | 25 |
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); } } |