1
0
mirror of https://github.com/EduApps-CDG/OpenDX synced 2024-12-30 09:45:37 +01:00

[d3d11] Enabled command stream thread

This commit is contained in:
Philip Rebohle 2018-01-20 23:12:03 +01:00
parent 7d7cc1ceda
commit 6ab7897127
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
6 changed files with 25 additions and 12 deletions

View File

@ -14,7 +14,6 @@ namespace dxvk {
Rc<DxvkDevice> device) Rc<DxvkDevice> device)
: m_parent (parent), : m_parent (parent),
m_device (device), m_device (device),
m_context (m_device->createContext()),
m_csChunk (new DxvkCsChunk()) { m_csChunk (new DxvkCsChunk()) {
// Create default state objects. We won't ever return them // Create default state objects. We won't ever return them
// to the application, but we'll use them to apply state. // to the application, but we'll use them to apply state.

View File

@ -518,7 +518,6 @@ namespace dxvk {
D3D11Device* const m_parent; D3D11Device* const m_parent;
Rc<DxvkDevice> m_device; Rc<DxvkDevice> m_device;
Rc<DxvkContext> m_context;
Rc<DxvkCsChunk> m_csChunk; Rc<DxvkCsChunk> m_csChunk;
Rc<DxvkSampler> m_defaultSampler; Rc<DxvkSampler> m_defaultSampler;

View File

@ -7,13 +7,16 @@ namespace dxvk {
D3D11ImmediateContext::D3D11ImmediateContext( D3D11ImmediateContext::D3D11ImmediateContext(
D3D11Device* parent, D3D11Device* parent,
Rc<DxvkDevice> device) Rc<DxvkDevice> device)
: D3D11DeviceContext(parent, device) { : D3D11DeviceContext(parent, device),
m_csThread(device->createContext()) {
} }
D3D11ImmediateContext::~D3D11ImmediateContext() { D3D11ImmediateContext::~D3D11ImmediateContext() {
Flush();
SynchronizeCs();
Synchronize();
} }
@ -113,6 +116,7 @@ namespace dxvk {
return DXGI_ERROR_WAS_STILL_DRAWING; return DXGI_ERROR_WAS_STILL_DRAWING;
Flush(); Flush();
SynchronizeCs();
Synchronize(); Synchronize();
} }
} }
@ -189,6 +193,7 @@ namespace dxvk {
}); });
Flush(); Flush();
SynchronizeCs();
Synchronize(); Synchronize();
physicalSlice = textureInfo->imageBuffer->slice(); physicalSlice = textureInfo->imageBuffer->slice();
@ -247,16 +252,15 @@ namespace dxvk {
void D3D11ImmediateContext::SynchronizeCs() { void D3D11ImmediateContext::SynchronizeCs() {
// Dispatch recorded commands first,
EmitCsChunk(); EmitCsChunk();
// TODO synchronize with CS thread m_csThread.synchronize();
} }
void D3D11ImmediateContext::EmitCsChunk() { void D3D11ImmediateContext::EmitCsChunk() {
if (m_csChunk->commandCount() > 0) { if (m_csChunk->commandCount() > 0) {
m_csChunk->executeAll(m_context.ptr()); m_csThread.dispatchChunk(std::move(m_csChunk));
m_csChunk = new DxvkCsChunk(); m_csChunk = new DxvkCsChunk();
} }
} }

View File

@ -45,6 +45,8 @@ namespace dxvk {
private: private:
DxvkCsThread m_csThread;
void Synchronize(); void Synchronize();
void SynchronizeCs(); void SynchronizeCs();

View File

@ -43,6 +43,7 @@ namespace dxvk {
void DxvkCsThread::dispatchChunk(Rc<DxvkCsChunk>&& chunk) { void DxvkCsThread::dispatchChunk(Rc<DxvkCsChunk>&& chunk) {
{ std::unique_lock<std::mutex> lock(m_mutex); { std::unique_lock<std::mutex> lock(m_mutex);
m_chunks.push(std::move(chunk)); m_chunks.push(std::move(chunk));
m_chunksPending += 1;
} }
m_condOnAdd.notify_one(); m_condOnAdd.notify_one();
@ -53,7 +54,7 @@ namespace dxvk {
std::unique_lock<std::mutex> lock(m_mutex); std::unique_lock<std::mutex> lock(m_mutex);
m_condOnSync.wait(lock, [this] { m_condOnSync.wait(lock, [this] {
return m_chunks.size() == 0; return m_chunksPending == 0;
}); });
} }
@ -71,14 +72,20 @@ namespace dxvk {
if (m_chunks.size() != 0) { if (m_chunks.size() != 0) {
chunk = std::move(m_chunks.front()); chunk = std::move(m_chunks.front());
m_chunks.pop(); m_chunks.pop();
if (m_chunks.size() == 0)
m_condOnSync.notify_one();
} }
} }
if (chunk != nullptr) if (chunk != nullptr) {
chunk->executeAll(m_context.ptr()); chunk->executeAll(m_context.ptr());
const bool doNotify = [this] {
std::unique_lock<std::mutex> lock(m_mutex);
return --m_chunksPending == 0;
}();
if (doNotify)
m_condOnSync.notify_one();
}
} }
} }

View File

@ -174,6 +174,8 @@ namespace dxvk {
std::queue<Rc<DxvkCsChunk>> m_chunks; std::queue<Rc<DxvkCsChunk>> m_chunks;
std::thread m_thread; std::thread m_thread;
uint32_t m_chunksPending = 0;
void threadFunc(); void threadFunc();
}; };