diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index 9f2593d7..28c01e26 100644 --- a/src/d3d11/d3d11_context.cpp +++ b/src/d3d11/d3d11_context.cpp @@ -127,13 +127,6 @@ namespace dxvk { } - void STDMETHODCALLTYPE D3D11DeviceContext::SwapDeviceContextState( - ID3DDeviceContextState* pState, - ID3DDeviceContextState** ppPreviousState) { - Logger::err("D3D11DeviceContext::SwapDeviceContextState: Not implemented"); - } - - void STDMETHODCALLTYPE D3D11DeviceContext::GetDevice(ID3D11Device **ppDevice) { *ppDevice = ref(m_parent); } diff --git a/src/d3d11/d3d11_context.h b/src/d3d11/d3d11_context.h index e42a683b..deac4a25 100644 --- a/src/d3d11/d3d11_context.h +++ b/src/d3d11/d3d11_context.h @@ -39,10 +39,6 @@ namespace dxvk { const D3D11_RECT* pRects, UINT NumRects); - void STDMETHODCALLTYPE SwapDeviceContextState( - ID3DDeviceContextState* pState, - ID3DDeviceContextState** ppPreviousState); - void STDMETHODCALLTYPE GetDevice(ID3D11Device **ppDevice); void STDMETHODCALLTYPE ClearState(); diff --git a/src/d3d11/d3d11_context_def.cpp b/src/d3d11/d3d11_context_def.cpp index 1cff7839..4f1d63d3 100644 --- a/src/d3d11/d3d11_context_def.cpp +++ b/src/d3d11/d3d11_context_def.cpp @@ -159,6 +159,13 @@ namespace dxvk { } + void STDMETHODCALLTYPE D3D11DeferredContext::SwapDeviceContextState( + ID3DDeviceContextState* pState, + ID3DDeviceContextState** ppPreviousState) { + Logger::err("D3D11: SwapDeviceContextState called on a deferred context"); + } + + HRESULT D3D11DeferredContext::MapBuffer( ID3D11Resource* pResource, D3D11_MAP MapType, diff --git a/src/d3d11/d3d11_context_def.h b/src/d3d11/d3d11_context_def.h index 32e50365..a2d5a664 100644 --- a/src/d3d11/d3d11_context_def.h +++ b/src/d3d11/d3d11_context_def.h @@ -61,6 +61,10 @@ namespace dxvk { ID3D11Resource* pResource, UINT Subresource); + void STDMETHODCALLTYPE SwapDeviceContextState( + ID3DDeviceContextState* pState, + ID3DDeviceContextState** ppPreviousState); + private: const UINT m_contextFlags; diff --git a/src/d3d11/d3d11_context_imm.cpp b/src/d3d11/d3d11_context_imm.cpp index 24bc6da2..7676dfce 100644 --- a/src/d3d11/d3d11_context_imm.cpp +++ b/src/d3d11/d3d11_context_imm.cpp @@ -535,6 +535,32 @@ namespace dxvk { } + void STDMETHODCALLTYPE D3D11ImmediateContext::SwapDeviceContextState( + ID3DDeviceContextState* pState, + ID3DDeviceContextState** ppPreviousState) { + InitReturnPtr(ppPreviousState); + + if (!pState) + return; + + Com oldState = std::move(m_stateObject); + Com newState = static_cast(pState); + + if (oldState == nullptr) + oldState = new D3D11DeviceContextState(m_parent); + + if (ppPreviousState) + *ppPreviousState = oldState.ref(); + + m_stateObject = newState; + + oldState->SetState(m_state); + newState->GetState(m_state); + + RestoreState(); + } + + void D3D11ImmediateContext::SynchronizeCsThread() { D3D10DeviceLock lock = LockContext(); diff --git a/src/d3d11/d3d11_context_imm.h b/src/d3d11/d3d11_context_imm.h index 103a41e4..f12fb1c3 100644 --- a/src/d3d11/d3d11_context_imm.h +++ b/src/d3d11/d3d11_context_imm.h @@ -3,6 +3,7 @@ #include #include "d3d11_context.h" +#include "d3d11_state_object.h" namespace dxvk { @@ -121,6 +122,10 @@ namespace dxvk { ID3D11UnorderedAccessView* const* ppUnorderedAccessViews, const UINT* pUAVInitialCounts); + void STDMETHODCALLTYPE SwapDeviceContextState( + ID3DDeviceContextState* pState, + ID3DDeviceContextState** ppPreviousState); + void SynchronizeCsThread(); private: @@ -131,6 +136,8 @@ namespace dxvk { std::chrono::high_resolution_clock::time_point m_lastFlush = std::chrono::high_resolution_clock::now(); + Com m_stateObject; + HRESULT MapBuffer( D3D11Buffer* pResource, D3D11_MAP MapType,