1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-21 22:54:16 +01:00

[d3d9] Optimize clears with rt mask and better ref tracking

This commit is contained in:
Joshua Ashton 2021-07-24 20:10:30 +01:00 committed by Joshie
parent 072d3a039e
commit 2f22c1b53d

View File

@ -1418,25 +1418,24 @@ namespace dxvk {
VkClearValue clearValueColor; VkClearValue clearValueColor;
DecodeD3DCOLOR(Color, clearValueColor.color.float32); DecodeD3DCOLOR(Color, clearValueColor.color.float32);
auto dsv = m_state.depthStencil != nullptr ? m_state.depthStencil->GetDepthStencilView() : nullptr;
VkImageAspectFlags depthAspectMask = 0; VkImageAspectFlags depthAspectMask = 0;
if (dsv != nullptr) { if (m_state.depthStencil != nullptr) {
if (Flags & D3DCLEAR_ZBUFFER) if (Flags & D3DCLEAR_ZBUFFER)
depthAspectMask |= VK_IMAGE_ASPECT_DEPTH_BIT; depthAspectMask |= VK_IMAGE_ASPECT_DEPTH_BIT;
if (Flags & D3DCLEAR_STENCIL) if (Flags & D3DCLEAR_STENCIL)
depthAspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT; depthAspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT;
depthAspectMask &= imageFormatInfo(dsv->info().format)->aspectMask; depthAspectMask &= imageFormatInfo(m_state.depthStencil->GetCommonTexture()->GetFormatMapping().FormatColor)->aspectMask;
} }
auto ClearImageView = [this]( auto ClearImageView = [this](
bool fullClear, bool fullClear,
VkOffset3D offset, VkOffset3D offset,
VkExtent3D extent, VkExtent3D extent,
Rc<DxvkImageView> imageView, const Rc<DxvkImageView>& imageView,
VkImageAspectFlags aspectMask, VkImageAspectFlags aspectMask,
VkClearValue clearValue) { VkClearValue clearValue) {
if (fullClear) { if (fullClear) {
EmitCs([ EmitCs([
cClearValue = clearValue, cClearValue = clearValue,
@ -1472,14 +1471,14 @@ namespace dxvk {
VkExtent3D extent) { VkExtent3D extent) {
// Clear depth if we need to. // Clear depth if we need to.
if (depthAspectMask != 0) 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. // Clear render targets if we need to.
if (Flags & D3DCLEAR_TARGET) { if (Flags & D3DCLEAR_TARGET) {
for (auto rt : m_state.renderTargets) { for (uint32_t rt = m_boundRTs; rt; rt &= rt - 1) {
auto rtv = rt != nullptr ? rt->GetRenderTargetView(srgb) : nullptr; 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); ClearImageView(fullClear, offset, extent, rtv, VK_IMAGE_ASPECT_COLOR_BIT, clearValueColor);
} }
} }