diff --git a/src/dxvk/dxvk_cmdlist.cpp b/src/dxvk/dxvk_cmdlist.cpp index 131fd1e58..1c401dff6 100644 --- a/src/dxvk/dxvk_cmdlist.cpp +++ b/src/dxvk/dxvk_cmdlist.cpp @@ -171,6 +171,7 @@ namespace dxvk { // Signal resources and events to // avoid stalling main thread m_eventTracker.reset(); + m_signalTracker.reset(); m_resources.reset(); // Recycle heavy Vulkan objects diff --git a/src/dxvk/dxvk_cmdlist.h b/src/dxvk/dxvk_cmdlist.h index 71d99fcb1..4d4f1872a 100644 --- a/src/dxvk/dxvk_cmdlist.h +++ b/src/dxvk/dxvk_cmdlist.h @@ -11,6 +11,7 @@ #include "dxvk_lifetime.h" #include "dxvk_limits.h" #include "dxvk_pipelayout.h" +#include "dxvk_signal.h" #include "dxvk_staging.h" #include "dxvk_stats.h" @@ -199,6 +200,23 @@ namespace dxvk { void signalEvents() { m_eventTracker.signalEvents(); } + + /** + * \brief Queues signal + * + * The signal will be notified once the command + * buffer has finished executing on the GPU. + */ + void queueSignal(const Rc& signal) { + m_signalTracker.add(signal); + } + + /** + * \brief Notifies signals + */ + void notifySignals() { + m_signalTracker.notify(); + } /** * \brief Resets the command list @@ -769,6 +787,7 @@ namespace dxvk { DxvkLifetimeTracker m_resources; DxvkDescriptorPoolTracker m_descriptorPoolTracker; DxvkEventTracker m_eventTracker; + DxvkSignalTracker m_signalTracker; DxvkGpuEventTracker m_gpuEventTracker; DxvkGpuQueryTracker m_gpuQueryTracker; DxvkBufferTracker m_bufferTracker; diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 98a5b385d..e5b46911c 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -2395,6 +2395,11 @@ namespace dxvk { } + void DxvkContext::queueSignal(const Rc& signal) { + m_cmd->queueSignal(signal); + } + + void DxvkContext::trimStagingBuffers() { m_staging.trim(); } diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index 495dfde7d..cd03b2222 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -982,6 +982,17 @@ namespace dxvk { void writeTimestamp( const Rc& query); + /** + * \brief Queues a signal + * + * The signal will be notified after all + * previously submitted commands have + * finished execution on the GPU. + * \param [in] signal The signal + */ + void queueSignal( + const Rc& signal); + /** * \brief Trims staging buffers * diff --git a/src/dxvk/dxvk_include.h b/src/dxvk/dxvk_include.h index a025fb465..80877ca8c 100644 --- a/src/dxvk/dxvk_include.h +++ b/src/dxvk/dxvk_include.h @@ -15,6 +15,7 @@ #include "../util/sha1/sha1_util.h" +#include "../util/sync/sync_signal.h" #include "../util/sync/sync_spinlock.h" #include "../util/sync/sync_ticketlock.h" diff --git a/src/dxvk/dxvk_queue.cpp b/src/dxvk/dxvk_queue.cpp index 8c8460745..e02b11713 100644 --- a/src/dxvk/dxvk_queue.cpp +++ b/src/dxvk/dxvk_queue.cpp @@ -151,6 +151,7 @@ namespace dxvk { if (status == VK_SUCCESS) { entry.submit.cmdList->signalEvents(); + entry.submit.cmdList->notifySignals(); entry.submit.cmdList->reset(); m_device->recycleCommandList(entry.submit.cmdList); diff --git a/src/dxvk/dxvk_signal.cpp b/src/dxvk/dxvk_signal.cpp new file mode 100644 index 000000000..fc9420fae --- /dev/null +++ b/src/dxvk/dxvk_signal.cpp @@ -0,0 +1,30 @@ +#include "dxvk_signal.h" + +namespace dxvk { + + DxvkSignalTracker::DxvkSignalTracker() { + + } + + + DxvkSignalTracker::~DxvkSignalTracker() { + + } + + + void DxvkSignalTracker::add(const Rc& signal) { + m_signals.push_back(signal); + } + + + void DxvkSignalTracker::notify() { + for (const auto& sig : m_signals) + sig->notify(); + } + + + void DxvkSignalTracker::reset() { + m_signals.clear(); + } + +} \ No newline at end of file diff --git a/src/dxvk/dxvk_signal.h b/src/dxvk/dxvk_signal.h new file mode 100644 index 000000000..1be38e194 --- /dev/null +++ b/src/dxvk/dxvk_signal.h @@ -0,0 +1,39 @@ +#pragma once + +#include "dxvk_include.h" + +namespace dxvk { + + /** + * \brief Signal tracker + */ + class DxvkSignalTracker { + + public: + + DxvkSignalTracker(); + ~DxvkSignalTracker(); + + /** + * \brief Adds a signal to track + * \param [in] signal The signal + */ + void add(const Rc& signal); + + /** + * \brief Notifies tracked signals + */ + void notify(); + + /** + * \brief Resets signal tracker + */ + void reset(); + + private: + + std::vector> m_signals; + + }; + +} \ No newline at end of file diff --git a/src/dxvk/meson.build b/src/dxvk/meson.build index 64f20998c..34f853a98 100644 --- a/src/dxvk/meson.build +++ b/src/dxvk/meson.build @@ -86,6 +86,7 @@ dxvk_src = files([ 'dxvk_sampler.cpp', 'dxvk_shader.cpp', 'dxvk_shader_key.cpp', + 'dxvk_signal.cpp', 'dxvk_spec_const.cpp', 'dxvk_staging.cpp', 'dxvk_state_cache.cpp',