diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index f9251f447..17656170d 100644 --- a/src/d3d11/d3d11_context.cpp +++ b/src/d3d11/d3d11_context.cpp @@ -15,7 +15,6 @@ namespace dxvk { const Rc& Device, DxvkCsChunkFlags CsFlags) : D3D11DeviceChild(pParent), - m_contextExt(this), m_multithread(this, false), m_device (Device), m_staging (Device, StagingBufferSize), diff --git a/src/d3d11/d3d11_context.h b/src/d3d11/d3d11_context.h index 93e85e879..4e153f254 100644 --- a/src/d3d11/d3d11_context.h +++ b/src/d3d11/d3d11_context.h @@ -19,6 +19,7 @@ namespace dxvk { class D3D11Device; class D3D11DeviceContext : public D3D11DeviceChild { + template friend class D3D11DeviceContextExt; // Needed in order to call EmitCs for pushing markers template @@ -687,7 +688,6 @@ namespace dxvk { protected: - D3D11DeviceContextExt m_contextExt; D3D10Multithread m_multithread; Rc m_device; diff --git a/src/d3d11/d3d11_context_common.cpp b/src/d3d11/d3d11_context_common.cpp index 786e9840c..188d9b344 100644 --- a/src/d3d11/d3d11_context_common.cpp +++ b/src/d3d11/d3d11_context_common.cpp @@ -10,6 +10,7 @@ namespace dxvk { const Rc& Device, DxvkCsChunkFlags CsFlags) : D3D11DeviceContext(pParent, Device, CsFlags), + m_contextExt(static_cast(this)), m_annotation(static_cast(this), Device) { } diff --git a/src/d3d11/d3d11_context_common.h b/src/d3d11/d3d11_context_common.h index 8161142bf..544e8b0c9 100644 --- a/src/d3d11/d3d11_context_common.h +++ b/src/d3d11/d3d11_context_common.h @@ -89,6 +89,7 @@ namespace dxvk { protected: + D3D11DeviceContextExt m_contextExt; D3D11UserDefinedAnnotation m_annotation; void UpdateResource( diff --git a/src/d3d11/d3d11_context_ext.cpp b/src/d3d11/d3d11_context_ext.cpp index ecd41e832..c89e0bc06 100644 --- a/src/d3d11/d3d11_context_ext.cpp +++ b/src/d3d11/d3d11_context_ext.cpp @@ -3,38 +3,44 @@ #include #include "d3d11_device.h" -#include "d3d11_context.h" +#include "d3d11_context_imm.h" +#include "d3d11_context_def.h" #include "d3d11_cuda.h" #include "../util/log/log.h" namespace dxvk { - D3D11DeviceContextExt::D3D11DeviceContextExt( - D3D11DeviceContext* pContext) + template + D3D11DeviceContextExt::D3D11DeviceContextExt( + ContextType* pContext) : m_ctx(pContext) { } - ULONG STDMETHODCALLTYPE D3D11DeviceContextExt::AddRef() { + template + ULONG STDMETHODCALLTYPE D3D11DeviceContextExt::AddRef() { return m_ctx->AddRef(); } - ULONG STDMETHODCALLTYPE D3D11DeviceContextExt::Release() { + template + ULONG STDMETHODCALLTYPE D3D11DeviceContextExt::Release() { return m_ctx->Release(); } - HRESULT STDMETHODCALLTYPE D3D11DeviceContextExt::QueryInterface( + template + HRESULT STDMETHODCALLTYPE D3D11DeviceContextExt::QueryInterface( REFIID riid, void** ppvObject) { return m_ctx->QueryInterface(riid, ppvObject); } - void STDMETHODCALLTYPE D3D11DeviceContextExt::MultiDrawIndirect( + template + void STDMETHODCALLTYPE D3D11DeviceContextExt::MultiDrawIndirect( UINT DrawCount, ID3D11Buffer* pBufferForArgs, UINT ByteOffsetForArgs, @@ -52,7 +58,8 @@ namespace dxvk { } - void STDMETHODCALLTYPE D3D11DeviceContextExt::MultiDrawIndexedIndirect( + template + void STDMETHODCALLTYPE D3D11DeviceContextExt::MultiDrawIndexedIndirect( UINT DrawCount, ID3D11Buffer* pBufferForArgs, UINT ByteOffsetForArgs, @@ -70,7 +77,8 @@ namespace dxvk { } - void STDMETHODCALLTYPE D3D11DeviceContextExt::MultiDrawIndirectCount( + template + void STDMETHODCALLTYPE D3D11DeviceContextExt::MultiDrawIndirectCount( UINT MaxDrawCount, ID3D11Buffer* pBufferForCount, UINT ByteOffsetForCount, @@ -91,7 +99,8 @@ namespace dxvk { } - void STDMETHODCALLTYPE D3D11DeviceContextExt::MultiDrawIndexedIndirectCount( + template + void STDMETHODCALLTYPE D3D11DeviceContextExt::MultiDrawIndexedIndirectCount( UINT MaxDrawCount, ID3D11Buffer* pBufferForCount, UINT ByteOffsetForCount, @@ -112,7 +121,8 @@ namespace dxvk { } - void STDMETHODCALLTYPE D3D11DeviceContextExt::SetDepthBoundsTest( + template + void STDMETHODCALLTYPE D3D11DeviceContextExt::SetDepthBoundsTest( BOOL Enable, FLOAT MinDepthBounds, FLOAT MaxDepthBounds) { @@ -129,7 +139,8 @@ namespace dxvk { } - void STDMETHODCALLTYPE D3D11DeviceContextExt::SetBarrierControl( + template + void STDMETHODCALLTYPE D3D11DeviceContextExt::SetBarrierControl( UINT ControlFlags) { D3D10DeviceLock lock = m_ctx->LockContext(); DxvkBarrierControlFlags flags; @@ -146,7 +157,8 @@ namespace dxvk { } - bool STDMETHODCALLTYPE D3D11DeviceContextExt::LaunchCubinShaderNVX(IUnknown* hShader, uint32_t GridX, uint32_t GridY, uint32_t GridZ, + template + bool STDMETHODCALLTYPE D3D11DeviceContextExt::LaunchCubinShaderNVX(IUnknown* hShader, uint32_t GridX, uint32_t GridY, uint32_t GridZ, const void* pParams, uint32_t ParamSize, void* const* pReadResources, uint32_t NumReadResources, void* const* pWriteResources, uint32_t NumWriteResources) { D3D10DeviceLock lock = m_ctx->LockContext(); @@ -202,4 +214,9 @@ namespace dxvk { return true; } + + + template class D3D11DeviceContextExt; + template class D3D11DeviceContextExt; + } diff --git a/src/d3d11/d3d11_context_ext.h b/src/d3d11/d3d11_context_ext.h index 2109a0dea..6b95dcf95 100644 --- a/src/d3d11/d3d11_context_ext.h +++ b/src/d3d11/d3d11_context_ext.h @@ -4,14 +4,16 @@ namespace dxvk { - class D3D11DeviceContext; + class D3D11DeferredContext; + class D3D11ImmediateContext; + template class D3D11DeviceContextExt : public ID3D11VkExtContext1 { public: D3D11DeviceContextExt( - D3D11DeviceContext* pContext); + ContextType* pContext); ULONG STDMETHODCALLTYPE AddRef(); @@ -71,7 +73,7 @@ namespace dxvk { private: - D3D11DeviceContext* m_ctx; + ContextType* m_ctx; };