1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2024-12-03 04:24:11 +01:00

[d3d9] Unbind RTs which are unwritten by a PS

Otherwise we can end up with feedback loops on RTs with a 0 color mask.

Closes: #3447
This commit is contained in:
Joshua Ashton 2023-05-24 13:27:53 +01:00 committed by Joshie
parent b9b2db510e
commit 8560efa3c7

View File

@ -3278,21 +3278,33 @@ namespace dxvk {
m_state.pixelShader = shader;
D3D9ShaderMasks newShaderMasks;
if (shader != nullptr) {
m_flags.set(D3D9DeviceFlag::DirtyFFPixelShader);
BindShader<DxsoProgramTypes::PixelShader>(GetCommonShader(shader));
m_psShaderMasks = newShader->GetShaderMask();
newShaderMasks = newShader->GetShaderMask();
}
else {
// TODO: What fixed function textures are in use?
// Currently we are making all 8 of them as in use here.
// The RT output is always 0 for fixed function.
m_psShaderMasks = FixedFunctionMask;
newShaderMasks = FixedFunctionMask;
}
UpdateActiveHazardsRT(UINT32_MAX);
// If we have any RTs we would have bound to the the FB
// not in the new shader mask, mark the framebuffer as dirty
// so we unbind them.
if (m_activeRTs & m_psShaderMasks.rtMask & (~newShaderMasks.rtMask))
m_flags.set(D3D9DeviceFlag::DirtyFramebuffer);
if (m_psShaderMasks.samplerMask != newShaderMasks.samplerMask ||
m_psShaderMasks.rtMask != newShaderMasks.rtMask) {
m_psShaderMasks = newShaderMasks;
UpdateActiveHazardsRT(UINT32_MAX);
}
return D3D_OK;
}
@ -5666,6 +5678,9 @@ namespace dxvk {
if (!m_state.renderStates[ColorWriteIndex(i)])
continue;
if (!(m_psShaderMasks.rtMask & (1 << i)))
continue;
attachments.color[i] = {
m_state.renderTargets[i]->GetRenderTargetView(srgb),
m_state.renderTargets[i]->GetRenderTargetLayout(m_hazardLayout) };