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

112 lines
2.3 KiB
C++
Raw Normal View History

#include "dxvk_cs.h"
namespace dxvk {
DxvkCsChunk::DxvkCsChunk() {
}
DxvkCsChunk::~DxvkCsChunk() {
auto cmd = m_head;
while (cmd != nullptr) {
auto next = cmd->next();
cmd->~DxvkCsCmd();
cmd = next;
}
}
void DxvkCsChunk::executeAll(DxvkContext* ctx) {
auto cmd = m_head;
while (cmd != nullptr) {
auto next = cmd->next();
cmd->exec(ctx);
cmd->~DxvkCsCmd();
cmd = next;
}
m_commandCount = 0;
m_commandOffset = 0;
m_head = nullptr;
m_tail = nullptr;
}
DxvkCsThread::DxvkCsThread(const Rc<DxvkContext>& context)
: m_context(context), m_thread([this] { threadFunc(); }) {
}
DxvkCsThread::~DxvkCsThread() {
{ std::unique_lock<std::mutex> lock(m_mutex);
m_stopped.store(true);
}
m_condOnAdd.notify_one();
m_thread.join();
}
void DxvkCsThread::dispatchChunk(Rc<DxvkCsChunk>&& chunk) {
{ std::unique_lock<std::mutex> lock(m_mutex);
2018-01-21 12:59:43 +01:00
m_chunksQueued.push(std::move(chunk));
2018-01-20 23:12:03 +01:00
m_chunksPending += 1;
if (m_chunksPending > MaxChunksInFlight) {
2018-01-21 12:59:43 +01:00
m_condOnSync.wait(lock, [this] {
return (m_chunksPending <= MaxChunksInFlight )
2018-01-21 12:59:43 +01:00
|| (m_stopped.load());
});
}
}
2018-01-21 12:59:43 +01:00
// Wake CS thread
m_condOnAdd.notify_one();
}
void DxvkCsThread::synchronize() {
std::unique_lock<std::mutex> lock(m_mutex);
m_condOnSync.wait(lock, [this] {
2018-01-20 23:12:03 +01:00
return m_chunksPending == 0;
});
}
void DxvkCsThread::threadFunc() {
2018-01-21 12:59:43 +01:00
Rc<DxvkCsChunk> chunk;
while (!m_stopped.load()) {
{ std::unique_lock<std::mutex> lock(m_mutex);
2018-01-21 12:59:43 +01:00
if (chunk != nullptr) {
m_chunksPending -= 1;
m_condOnSync.notify_one();
}
2018-01-29 00:00:19 +01:00
if (m_chunksQueued.size() == 0) {
m_condOnAdd.wait(lock, [this] {
return (m_chunksQueued.size() != 0)
|| (m_stopped.load());
});
}
2018-01-21 12:59:43 +01:00
if (m_chunksQueued.size() != 0) {
chunk = std::move(m_chunksQueued.front());
m_chunksQueued.pop();
} else {
chunk = nullptr;
}
}
2018-01-21 12:59:43 +01:00
if (chunk != nullptr)
chunk->executeAll(m_context.ptr());
}
}
}