mirror of
https://github.com/doitsujin/dxvk.git
synced 2024-12-04 16:24:29 +01:00
[d3d11] Filter redundant OMSetRenderTargets calls
Since rebinding render targets is a rather expensive operation, we should avoid doing so whenever possible. Affects Resident Evil 2 and Devil May Cry 5.
This commit is contained in:
parent
4789790087
commit
afc8e4c29d
@ -2597,6 +2597,9 @@ namespace dxvk {
|
|||||||
const UINT* pUAVInitialCounts) {
|
const UINT* pUAVInitialCounts) {
|
||||||
D3D10DeviceLock lock = LockContext();
|
D3D10DeviceLock lock = LockContext();
|
||||||
|
|
||||||
|
bool needsUpdate = false;
|
||||||
|
bool needsSpill = false;
|
||||||
|
|
||||||
if (likely(NumRTVs != D3D11_KEEP_RENDER_TARGETS_AND_DEPTH_STENCIL)) {
|
if (likely(NumRTVs != D3D11_KEEP_RENDER_TARGETS_AND_DEPTH_STENCIL)) {
|
||||||
// Native D3D11 does not change the render targets if
|
// Native D3D11 does not change the render targets if
|
||||||
// the parameters passed to this method are invalid.
|
// the parameters passed to this method are invalid.
|
||||||
@ -2610,6 +2613,7 @@ namespace dxvk {
|
|||||||
|
|
||||||
if (m_state.om.renderTargetViews[i] != rtv) {
|
if (m_state.om.renderTargetViews[i] != rtv) {
|
||||||
m_state.om.renderTargetViews[i] = rtv;
|
m_state.om.renderTargetViews[i] = rtv;
|
||||||
|
needsUpdate = true;
|
||||||
TestOmSrvHazards(rtv);
|
TestOmSrvHazards(rtv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2618,14 +2622,13 @@ namespace dxvk {
|
|||||||
|
|
||||||
if (m_state.om.depthStencilView != dsv) {
|
if (m_state.om.depthStencilView != dsv) {
|
||||||
m_state.om.depthStencilView = dsv;
|
m_state.om.depthStencilView = dsv;
|
||||||
|
needsUpdate = true;
|
||||||
TestOmSrvHazards(dsv);
|
TestOmSrvHazards(dsv);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_state.om.maxRtv = NumRTVs;
|
m_state.om.maxRtv = NumRTVs;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool spillRenderPass = false;
|
|
||||||
|
|
||||||
if (unlikely(NumUAVs || m_state.om.maxUav)) {
|
if (unlikely(NumUAVs || m_state.om.maxUav)) {
|
||||||
uint32_t uavSlotId = computeUavBinding (DxbcProgramType::PixelShader, 0);
|
uint32_t uavSlotId = computeUavBinding (DxbcProgramType::PixelShader, 0);
|
||||||
uint32_t ctrSlotId = computeUavCounterBinding(DxbcProgramType::PixelShader, 0);
|
uint32_t ctrSlotId = computeUavCounterBinding(DxbcProgramType::PixelShader, 0);
|
||||||
@ -2652,13 +2655,14 @@ namespace dxvk {
|
|||||||
|
|
||||||
TestOmSrvHazards(uav);
|
TestOmSrvHazards(uav);
|
||||||
|
|
||||||
spillRenderPass = true;
|
needsSpill = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BindFramebuffer(spillRenderPass);
|
if (needsUpdate || needsSpill)
|
||||||
|
BindFramebuffer(needsSpill);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user