From fc0ede06573edebeef3a672278d2142c72b92ed4 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sun, 27 Oct 2019 11:00:59 +0100 Subject: [PATCH] Revert "[d3d11] Recycle command lists from deferred contexts" This reverts commit 4e3da45fdeab9d81601ec1d4b5174cff4c6629d6. For some reason this caused crashes. --- src/d3d11/d3d11_cmdlist.cpp | 64 +++--------------------------- src/d3d11/d3d11_cmdlist.h | 69 +++------------------------------ src/d3d11/d3d11_context_def.cpp | 2 +- src/d3d11/d3d11_device.cpp | 3 +- src/d3d11/d3d11_device.h | 5 --- 5 files changed, 12 insertions(+), 131 deletions(-) diff --git a/src/d3d11/d3d11_cmdlist.cpp b/src/d3d11/d3d11_cmdlist.cpp index 276043ea1..25205e73c 100644 --- a/src/d3d11/d3d11_cmdlist.cpp +++ b/src/d3d11/d3d11_cmdlist.cpp @@ -4,11 +4,10 @@ namespace dxvk { D3D11CommandList::D3D11CommandList( - D3D11Device* pDevice, - D3D11CommandListAllocator* pAllocator) - : m_device(pDevice), m_allocator(pAllocator) { - - } + D3D11Device* pDevice, + UINT ContextFlags) + : m_device (pDevice), + m_contextFlags(ContextFlags) { } D3D11CommandList::~D3D11CommandList() { @@ -26,14 +25,8 @@ namespace dxvk { ULONG STDMETHODCALLTYPE D3D11CommandList::Release() { ULONG refCount = --m_refCount; - - if (!refCount) { - Reset(); - - m_allocator->RecycleCommandList(this); + if (!refCount) m_device->Release(); - } - return refCount; } @@ -88,15 +81,6 @@ namespace dxvk { MarkSubmitted(); } - - - void D3D11CommandList::Reset() { - m_chunks.clear(); - - m_contextFlags = 0; - m_submitted = false; - m_warned = false; - } void D3D11CommandList::MarkSubmitted() { @@ -108,42 +92,4 @@ namespace dxvk { } } - - D3D11CommandListAllocator::D3D11CommandListAllocator(D3D11Device* pDevice) - : m_device(pDevice) { - - } - - - D3D11CommandListAllocator::~D3D11CommandListAllocator() { - for (uint32_t i = 0; i < m_listCount; i++) - delete m_lists[i]; - } - - - D3D11CommandList* D3D11CommandListAllocator::AllocCommandList( - UINT ContextFlags) { - std::lock_guard lock(m_mutex); - D3D11CommandList* result = nullptr; - - if (m_listCount) - result = m_lists[--m_listCount]; - else - result = new D3D11CommandList(m_device, this); - - result->SetContextFlags(ContextFlags); - return result; - } - - - void D3D11CommandListAllocator::RecycleCommandList( - D3D11CommandList* pCommandList) { - std::lock_guard lock(m_mutex); - - if (m_listCount < m_lists.size()) - m_lists[m_listCount++] = pCommandList; - else - delete pCommandList; - } - } \ No newline at end of file diff --git a/src/d3d11/d3d11_cmdlist.h b/src/d3d11/d3d11_cmdlist.h index 78bb1315c..58d16fe6c 100644 --- a/src/d3d11/d3d11_cmdlist.h +++ b/src/d3d11/d3d11_cmdlist.h @@ -1,21 +1,16 @@ #pragma once -#include -#include - #include "d3d11_context.h" namespace dxvk { - - class D3D11CommandListAllocator; class D3D11CommandList : public D3D11DeviceChild { public: D3D11CommandList( - D3D11Device* pDevice, - D3D11CommandListAllocator* pAllocator); + D3D11Device* pDevice, + UINT ContextFlags); ~D3D11CommandList(); @@ -31,10 +26,6 @@ namespace dxvk { ID3D11Device **ppDevice) final; UINT STDMETHODCALLTYPE GetContextFlags() final; - - void SetContextFlags(UINT ContextFlags) { - m_contextFlags = ContextFlags; - } void AddChunk( DxvkCsChunkRef&& Chunk); @@ -47,11 +38,9 @@ namespace dxvk { private: - D3D11Device* m_device; - D3D11CommandListAllocator* m_allocator; - - uint32_t m_contextFlags = 0; - + D3D11Device* const m_device; + UINT const m_contextFlags; + std::vector m_chunks; std::atomic m_submitted = { false }; @@ -59,56 +48,8 @@ namespace dxvk { std::atomic m_refCount = { 0u }; - void Reset(); - void MarkSubmitted(); }; - - /** - * \brief Command list allocator - * - * Creates and recycles command list instances - * in order to reduce deferred context overhead. - */ - class D3D11CommandListAllocator { - - public: - - D3D11CommandListAllocator( - D3D11Device* pDevice); - - ~D3D11CommandListAllocator(); - - /** - * \brief Allocates a command list - * - * \param [in] ContextFlags Flags of the parent context - * \returns The command list - */ - D3D11CommandList* AllocCommandList( - UINT ContextFlags); - - /** - * \brief Recycles a command list - * - * Automatically called when the command list - * in question reaches a ref count of zero. - * \param [in] pCommandList The command list - */ - void RecycleCommandList( - D3D11CommandList* pCommandList); - - private: - - D3D11Device* m_device; - - std::mutex m_mutex; - std::array m_lists; - - uint32_t m_listCount = 0; - - }; - } \ No newline at end of file diff --git a/src/d3d11/d3d11_context_def.cpp b/src/d3d11/d3d11_context_def.cpp index d3793343a..70c1d39de 100644 --- a/src/d3d11/d3d11_context_def.cpp +++ b/src/d3d11/d3d11_context_def.cpp @@ -309,7 +309,7 @@ namespace dxvk { Com D3D11DeferredContext::CreateCommandList() { - return m_parent->AllocCommandList(m_contextFlags); + return new D3D11CommandList(m_parent, m_contextFlags); } diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index 668801ea6..c85130116 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -39,8 +39,7 @@ namespace dxvk { m_dxvkAdapter (m_dxvkDevice->adapter()), m_d3d11Formats (m_dxvkAdapter), m_d3d11Options (m_dxvkAdapter->instance()->config()), - m_dxbcOptions (m_dxvkDevice, m_d3d11Options), - m_commandListAllocator(this) { + m_dxbcOptions (m_dxvkDevice, m_d3d11Options) { m_initializer = new D3D11Initializer(this); m_context = new D3D11ImmediateContext(this, m_dxvkDevice); m_d3d10Device = new D3D10Device(this, m_context); diff --git a/src/d3d11/d3d11_device.h b/src/d3d11/d3d11_device.h index 2e9d56807..3614adbb9 100644 --- a/src/d3d11/d3d11_device.h +++ b/src/d3d11/d3d11_device.h @@ -411,10 +411,6 @@ namespace dxvk { DxvkCsChunk* chunk = m_csChunkPool.allocChunk(flags); return DxvkCsChunkRef(chunk, &m_csChunkPool); } - - D3D11CommandList* AllocCommandList(UINT ContextFlags) { - return m_commandListAllocator.AllocCommandList(ContextFlags); - } const D3D11Options* GetOptions() const { return &m_d3d11Options; @@ -457,7 +453,6 @@ namespace dxvk { D3D11StateObjectSet m_rsStateObjects; D3D11StateObjectSet m_samplerObjects; D3D11ShaderModuleSet m_shaderModules; - D3D11CommandListAllocator m_commandListAllocator; HRESULT CreateShaderModule( D3D11CommonShader* pShaderModule,