1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2024-12-11 19:24:11 +01:00

[dxvk] Remove command dispatch methods from CS thread

This was bad design. The user of this API should record commands
into a chunk manually and decude what to do with it once it's full.
This commit is contained in:
Philip Rebohle 2018-01-20 14:59:50 +01:00
parent 0b426a0942
commit 0789c5f10d
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
2 changed files with 3 additions and 38 deletions

View File

@ -25,9 +25,7 @@ namespace dxvk {
DxvkCsThread::DxvkCsThread(const Rc<DxvkContext>& context) DxvkCsThread::DxvkCsThread(const Rc<DxvkContext>& context)
: m_context(context), : m_context(context), m_thread([this] { threadFunc(); }) {
m_curChunk(new DxvkCsChunk()),
m_thread([this] { threadFunc(); }) {
} }
@ -44,19 +42,13 @@ 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(m_curChunk)); m_chunks.push(std::move(chunk));
} }
m_condOnAdd.notify_one(); m_condOnAdd.notify_one();
} }
void DxvkCsThread::flush() {
dispatchChunk(std::move(m_curChunk));
m_curChunk = new DxvkCsChunk();
}
void DxvkCsThread::synchronize() { void DxvkCsThread::synchronize() {
std::unique_lock<std::mutex> lock(m_mutex); std::unique_lock<std::mutex> lock(m_mutex);

View File

@ -134,19 +134,6 @@ namespace dxvk {
DxvkCsThread(const Rc<DxvkContext>& context); DxvkCsThread(const Rc<DxvkContext>& context);
~DxvkCsThread(); ~DxvkCsThread();
/**
* \brief Dispatches a new command
*
* Adds the command to the current chunk and
* dispatches the chunk in case it is full.
* \param [in] command The command
*/
template<typename T>
void dispatch(T&& command) {
while (!m_curChunk->push(command))
this->flush();
}
/** /**
* \brief Dispatches an entire chunk * \brief Dispatches an entire chunk
* *
@ -156,15 +143,6 @@ namespace dxvk {
*/ */
void dispatchChunk(Rc<DxvkCsChunk>&& chunk); void dispatchChunk(Rc<DxvkCsChunk>&& chunk);
/**
* \brief Dispatches current chunk
*
* Adds the current chunk to the dispatch
* queue and makes an empty chunk current.
* Call this before \ref synchronize.
*/
void flush();
/** /**
* \brief Synchronizes with the thread * \brief Synchronizes with the thread
* *
@ -179,17 +157,12 @@ namespace dxvk {
const Rc<DxvkContext> m_context; const Rc<DxvkContext> m_context;
// Chunk that is being recorded
Rc<DxvkCsChunk> m_curChunk;
// Chunks that are executing
std::atomic<bool> m_stopped = { false }; std::atomic<bool> m_stopped = { false };
std::mutex m_mutex; std::mutex m_mutex;
std::condition_variable m_condOnAdd; std::condition_variable m_condOnAdd;
std::condition_variable m_condOnSync; std::condition_variable m_condOnSync;
std::queue<Rc<DxvkCsChunk>> m_chunks; std::queue<Rc<DxvkCsChunk>> m_chunks;
std::thread m_thread;
std::thread m_thread;
void threadFunc(); void threadFunc();