diff --git a/renderdoc/driver/d3d12/d3d12_command_list1_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_list1_wrap.cpp index 4b4a34108..cb22429c9 100644 --- a/renderdoc/driver/d3d12/d3d12_command_list1_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_list1_wrap.cpp @@ -280,6 +280,12 @@ bool WrappedID3D12GraphicsCommandList2::Serialise_OMSetDepthBounds(SerialiserTyp return false; } + if(m_pDevice->GetOpts2().DepthBoundsTestSupported == 0) + { + RDCERR("Can't replay OMSetDepthBounds without device support"); + return false; + } + if(IsReplayingAndReading()) { m_Cmd->m_LastCmdListID = GetResourceManager()->GetOriginalID(GetResID(pCommandList)); @@ -526,6 +532,12 @@ bool WrappedID3D12GraphicsCommandList2::Serialise_SetViewInstanceMask(Serialiser return false; } + if(m_pDevice->GetOpts3().ViewInstancingTier == D3D12_VIEW_INSTANCING_TIER_NOT_SUPPORTED) + { + RDCERR("Can't replay SetViewInstanceMask without device support"); + return false; + } + if(IsReplayingAndReading()) { m_Cmd->m_LastCmdListID = GetResourceManager()->GetOriginalID(GetResID(pCommandList)); diff --git a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp index b7c6bba12..9c7adfed7 100644 --- a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp @@ -4304,7 +4304,7 @@ bool WrappedID3D12GraphicsCommandList2::Serialise_ExecuteIndirect( m_Cmd->m_BakedCmdListInfo[m_Cmd->m_LastCmdListID].crackedLists.push_back(list); - m_Cmd->m_BakedCmdListInfo[m_Cmd->m_LastCmdListID].state.ApplyState(list); + m_Cmd->m_BakedCmdListInfo[m_Cmd->m_LastCmdListID].state.ApplyState(m_pDevice, list); } // perform indirect draw, but from patched buffer. It will be patched between the above list diff --git a/renderdoc/driver/d3d12/d3d12_device.cpp b/renderdoc/driver/d3d12/d3d12_device.cpp index 046a53522..e958c09e9 100644 --- a/renderdoc/driver/d3d12/d3d12_device.cpp +++ b/renderdoc/driver/d3d12/d3d12_device.cpp @@ -148,6 +148,9 @@ WrappedID3D12Device::WrappedID3D12Device(ID3D12Device *realDevice, D3D12InitPara m_StructuredFile = &m_StoredStructuredData; RDCEraseEl(m_D3D12Opts); + RDCEraseEl(m_D3D12Opts1); + RDCEraseEl(m_D3D12Opts2); + RDCEraseEl(m_D3D12Opts3); m_pDevice1 = NULL; m_pDevice2 = NULL; @@ -162,7 +165,20 @@ WrappedID3D12Device::WrappedID3D12Device(ID3D12Device *realDevice, D3D12InitPara m_DescriptorIncrements[i] = m_pDevice->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE(i)); - m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS, &m_D3D12Opts, sizeof(m_D3D12Opts)); + HRESULT hr = S_OK; + + hr = m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS, &m_D3D12Opts, + sizeof(m_D3D12Opts)); + RDCASSERTEQUAL(hr, S_OK); + hr = m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS1, &m_D3D12Opts1, + sizeof(m_D3D12Opts1)); + RDCASSERTEQUAL(hr, S_OK); + hr = m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS2, &m_D3D12Opts2, + sizeof(m_D3D12Opts2)); + RDCASSERTEQUAL(hr, S_OK); + hr = m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS3, &m_D3D12Opts3, + sizeof(m_D3D12Opts3)); + RDCASSERTEQUAL(hr, S_OK); } // refcounters implicitly construct with one reference, but we don't start with any soft @@ -2843,7 +2859,7 @@ void WrappedID3D12Device::ReplayLog(uint32_t startEventID, uint32_t endEventID, { ID3D12GraphicsCommandList2 *list = cmd.m_OutsideCmdList = GetNewList(); - cmd.m_RenderState.ApplyState(list); + cmd.m_RenderState.ApplyState(this, list); } ReplayStatus status = ReplayStatus::Succeeded; diff --git a/renderdoc/driver/d3d12/d3d12_device.h b/renderdoc/driver/d3d12/d3d12_device.h index d7f04716a..215be3a15 100644 --- a/renderdoc/driver/d3d12/d3d12_device.h +++ b/renderdoc/driver/d3d12/d3d12_device.h @@ -364,6 +364,9 @@ private: WrappedIDXGISwapChain4 *m_LastSwap; D3D12_FEATURE_DATA_D3D12_OPTIONS m_D3D12Opts; + D3D12_FEATURE_DATA_D3D12_OPTIONS1 m_D3D12Opts1; + D3D12_FEATURE_DATA_D3D12_OPTIONS2 m_D3D12Opts2; + D3D12_FEATURE_DATA_D3D12_OPTIONS3 m_D3D12Opts3; UINT m_DescriptorIncrements[D3D12_DESCRIPTOR_HEAP_TYPE_NUM_TYPES]; template @@ -385,6 +388,10 @@ public: return m_DescriptorIncrements[type]; } + const D3D12_FEATURE_DATA_D3D12_OPTIONS &GetOpts() { return m_D3D12Opts; } + const D3D12_FEATURE_DATA_D3D12_OPTIONS1 &GetOpts1() { return m_D3D12Opts1; } + const D3D12_FEATURE_DATA_D3D12_OPTIONS2 &GetOpts2() { return m_D3D12Opts2; } + const D3D12_FEATURE_DATA_D3D12_OPTIONS3 &GetOpts3() { return m_D3D12Opts3; } void RemoveQueue(WrappedID3D12CommandQueue *queue); //////////////////////////////////////////////////////////////// diff --git a/renderdoc/driver/d3d12/d3d12_overlay.cpp b/renderdoc/driver/d3d12/d3d12_overlay.cpp index 238b1e074..56cc8c7c1 100644 --- a/renderdoc/driver/d3d12/d3d12_overlay.cpp +++ b/renderdoc/driver/d3d12/d3d12_overlay.cpp @@ -210,7 +210,7 @@ struct D3D12QuadOverdrawCallback : public D3D12DrawcallCallback // as we're changing the root signature, we need to reapply all elements, // so just apply all state if(cmd) - rs.ApplyState(cmd); + rs.ApplyState(m_pDevice, cmd); } bool PostDraw(uint32_t eid, ID3D12GraphicsCommandList2 *cmd) @@ -222,7 +222,7 @@ struct D3D12QuadOverdrawCallback : public D3D12DrawcallCallback m_pDevice->GetQueue()->GetCommandData()->m_RenderState = m_PrevState; RDCASSERT(cmd); - m_pDevice->GetQueue()->GetCommandData()->m_RenderState.ApplyState(cmd); + m_pDevice->GetQueue()->GetCommandData()->m_RenderState.ApplyState(m_pDevice, cmd); return true; } diff --git a/renderdoc/driver/d3d12/d3d12_postvs.cpp b/renderdoc/driver/d3d12/d3d12_postvs.cpp index 9a99f9de4..afd60cd5f 100644 --- a/renderdoc/driver/d3d12/d3d12_postvs.cpp +++ b/renderdoc/driver/d3d12/d3d12_postvs.cpp @@ -349,7 +349,7 @@ void D3D12Replay::InitPostVSBuffers(uint32_t eventId) list = GetDebugManager()->ResetDebugList(); - rs.ApplyState(list); + rs.ApplyState(m_pDevice, list); list->SetPipelineState(pipe); @@ -461,7 +461,7 @@ void D3D12Replay::InitPostVSBuffers(uint32_t eventId) list = GetDebugManager()->ResetDebugList(); - rs.ApplyState(list); + rs.ApplyState(m_pDevice, list); list->SetPipelineState(pipe); @@ -830,7 +830,7 @@ void D3D12Replay::InitPostVSBuffers(uint32_t eventId) { list = GetDebugManager()->ResetDebugList(); - rs.ApplyState(list); + rs.ApplyState(m_pDevice, list); list->SetPipelineState(pipe); @@ -919,7 +919,7 @@ void D3D12Replay::InitPostVSBuffers(uint32_t eventId) list->ResourceBarrier(1, &sobarr); } - rs.ApplyState(list); + rs.ApplyState(m_pDevice, list); list->SetPipelineState(pipe); @@ -975,7 +975,7 @@ void D3D12Replay::InitPostVSBuffers(uint32_t eventId) { list = GetDebugManager()->ResetDebugList(); - rs.ApplyState(list); + rs.ApplyState(m_pDevice, list); list->SetPipelineState(pipe); diff --git a/renderdoc/driver/d3d12/d3d12_state.cpp b/renderdoc/driver/d3d12/d3d12_state.cpp index a2009d10f..46ce93b15 100644 --- a/renderdoc/driver/d3d12/d3d12_state.cpp +++ b/renderdoc/driver/d3d12/d3d12_state.cpp @@ -73,7 +73,7 @@ ResourceId D3D12RenderState::GetDSVID() const return dsv.GetResResourceId(); } -void D3D12RenderState::ApplyState(ID3D12GraphicsCommandList2 *cmd) const +void D3D12RenderState::ApplyState(WrappedID3D12Device *dev, ID3D12GraphicsCommandList2 *cmd) const { D3D12_COMMAND_LIST_TYPE type = cmd->GetType(); @@ -96,10 +96,12 @@ void D3D12RenderState::ApplyState(ID3D12GraphicsCommandList2 *cmd) const if(GetWrapped(cmd)->GetReal1()) { - cmd->OMSetDepthBounds(depthBoundsMin, depthBoundsMax); + if(dev->GetOpts2().DepthBoundsTestSupported) + cmd->OMSetDepthBounds(depthBoundsMin, depthBoundsMax); // safe to set this - if the pipeline has view instancing disabled, it will do nothing - cmd->SetViewInstanceMask(viewInstMask); + if(dev->GetOpts3().ViewInstancingTier != D3D12_VIEW_INSTANCING_TIER_NOT_SUPPORTED) + cmd->SetViewInstanceMask(viewInstMask); } if(ibuffer.buf != ResourceId()) diff --git a/renderdoc/driver/d3d12/d3d12_state.h b/renderdoc/driver/d3d12/d3d12_state.h index 6d0c4f56c..7bde29a64 100644 --- a/renderdoc/driver/d3d12/d3d12_state.h +++ b/renderdoc/driver/d3d12/d3d12_state.h @@ -46,7 +46,7 @@ struct D3D12RenderState D3D12RenderState() = default; D3D12RenderState &operator=(const D3D12RenderState &o); - void ApplyState(ID3D12GraphicsCommandList2 *list) const; + void ApplyState(WrappedID3D12Device *dev, ID3D12GraphicsCommandList2 *list) const; void ApplyComputeRootElements(ID3D12GraphicsCommandList2 *cmd) const; void ApplyGraphicsRootElements(ID3D12GraphicsCommandList2 *cmd) const;