From 1863c6e81ced9b59dbb92d8705b9bec6ae4e00f4 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 7 Oct 2020 16:29:07 +0200 Subject: [PATCH] [dxvk] Catch exceptions of type DxvkError on CS thread --- src/dxvk/dxvk_cs.cpp | 47 ++++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/src/dxvk/dxvk_cs.cpp b/src/dxvk/dxvk_cs.cpp index 8999a5d5..f9061cb1 100644 --- a/src/dxvk/dxvk_cs.cpp +++ b/src/dxvk/dxvk_cs.cpp @@ -134,31 +134,36 @@ namespace dxvk { env::setThreadName("dxvk-cs"); DxvkCsChunkRef chunk; - - while (!m_stopped.load()) { - { std::unique_lock lock(m_mutex); - if (chunk) { - if (--m_chunksPending == 0) - m_condOnSync.notify_one(); + + try { + while (!m_stopped.load()) { + { std::unique_lock lock(m_mutex); + if (chunk) { + if (--m_chunksPending == 0) + m_condOnSync.notify_one(); + + chunk = DxvkCsChunkRef(); + } - chunk = DxvkCsChunkRef(); + if (m_chunksQueued.size() == 0) { + m_condOnAdd.wait(lock, [this] { + return (m_chunksQueued.size() != 0) + || (m_stopped.load()); + }); + } + + if (m_chunksQueued.size() != 0) { + chunk = std::move(m_chunksQueued.front()); + m_chunksQueued.pop(); + } } - if (m_chunksQueued.size() == 0) { - m_condOnAdd.wait(lock, [this] { - return (m_chunksQueued.size() != 0) - || (m_stopped.load()); - }); - } - - if (m_chunksQueued.size() != 0) { - chunk = std::move(m_chunksQueued.front()); - m_chunksQueued.pop(); - } + if (chunk) + chunk->executeAll(m_context.ptr()); } - - if (chunk) - chunk->executeAll(m_context.ptr()); + } catch (const DxvkError& e) { + Logger::err("Exception on CS thread!"); + Logger::err(e.message()); } }