[d3d11] Implement D3D11DeviceContext::SwapDeviceContextState

This commit is contained in:
Philip Rebohle 2019-05-03 16:41:44 +02:00
parent 82c6a5eb1a
commit f733d082f4
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
6 changed files with 44 additions and 11 deletions

View File

@ -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);
}

View File

@ -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();

View File

@ -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,

View File

@ -61,6 +61,10 @@ namespace dxvk {
ID3D11Resource* pResource,
UINT Subresource);
void STDMETHODCALLTYPE SwapDeviceContextState(
ID3DDeviceContextState* pState,
ID3DDeviceContextState** ppPreviousState);
private:
const UINT m_contextFlags;

View File

@ -535,6 +535,32 @@ namespace dxvk {
}
void STDMETHODCALLTYPE D3D11ImmediateContext::SwapDeviceContextState(
ID3DDeviceContextState* pState,
ID3DDeviceContextState** ppPreviousState) {
InitReturnPtr(ppPreviousState);
if (!pState)
return;
Com<D3D11DeviceContextState> oldState = std::move(m_stateObject);
Com<D3D11DeviceContextState> newState = static_cast<D3D11DeviceContextState*>(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();

View File

@ -3,6 +3,7 @@
#include <chrono>
#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<D3D11DeviceContextState> m_stateObject;
HRESULT MapBuffer(
D3D11Buffer* pResource,
D3D11_MAP MapType,