1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-04-12 03:02:33 +02:00

[dxvk] Add callback to lock submission queue

Can be used to perform additional synchronization as necessary.
This commit is contained in:
Philip Rebohle 2023-03-16 01:32:46 +01:00
parent 56a8fa2e6f
commit 35895ba05b
6 changed files with 31 additions and 9 deletions

View File

@ -543,7 +543,7 @@ namespace dxvk {
queues.transfer = getDeviceQueue(vkd, queueFamilies.transfer, 0); queues.transfer = getDeviceQueue(vkd, queueFamilies.transfer, 0);
queues.sparse = getDeviceQueue(vkd, queueFamilies.sparse, 0); queues.sparse = getDeviceQueue(vkd, queueFamilies.sparse, 0);
return new DxvkDevice(instance, this, vkd, enabledFeatures, queues); return new DxvkDevice(instance, this, vkd, enabledFeatures, queues, DxvkQueueCallback());
} }
@ -655,7 +655,7 @@ namespace dxvk {
queues.graphics = { args.queue, args.queueFamily }; queues.graphics = { args.queue, args.queueFamily };
queues.transfer = queues.graphics; queues.transfer = queues.graphics;
return new DxvkDevice(instance, this, vkd, enabledFeatures, queues); return new DxvkDevice(instance, this, vkd, enabledFeatures, queues, args.queueCallback);
} }

View File

@ -1,5 +1,6 @@
#pragma once #pragma once
#include <functional>
#include <optional> #include <optional>
#include "dxvk_device_info.h" #include "dxvk_device_info.h"
@ -11,7 +12,9 @@ namespace dxvk {
class DxvkDevice; class DxvkDevice;
class DxvkInstance; class DxvkInstance;
using DxvkQueueCallback = std::function<void (bool)>;
/** /**
* \brief GPU vendors * \brief GPU vendors
* Based on PCIe IDs. * Based on PCIe IDs.
@ -65,6 +68,7 @@ namespace dxvk {
uint32_t extensionCount; uint32_t extensionCount;
const char** extensionNames; const char** extensionNames;
const VkPhysicalDeviceFeatures2* features; const VkPhysicalDeviceFeatures2* features;
DxvkQueueCallback queueCallback;
}; };
/** /**

View File

@ -8,7 +8,8 @@ namespace dxvk {
const Rc<DxvkAdapter>& adapter, const Rc<DxvkAdapter>& adapter,
const Rc<vk::DeviceFn>& vkd, const Rc<vk::DeviceFn>& vkd,
const DxvkDeviceFeatures& features, const DxvkDeviceFeatures& features,
const DxvkDeviceQueueSet& queues) const DxvkDeviceQueueSet& queues,
const DxvkQueueCallback& queueCallback)
: m_options (instance->options()), : m_options (instance->options()),
m_instance (instance), m_instance (instance),
m_adapter (adapter), m_adapter (adapter),
@ -18,7 +19,7 @@ namespace dxvk {
m_perfHints (getPerfHints()), m_perfHints (getPerfHints()),
m_objects (this), m_objects (this),
m_queues (queues), m_queues (queues),
m_submissionQueue (this) { m_submissionQueue (this, queueCallback) {
} }

View File

@ -87,7 +87,8 @@ namespace dxvk {
const Rc<DxvkAdapter>& adapter, const Rc<DxvkAdapter>& adapter,
const Rc<vk::DeviceFn>& vkd, const Rc<vk::DeviceFn>& vkd,
const DxvkDeviceFeatures& features, const DxvkDeviceFeatures& features,
const DxvkDeviceQueueSet& queues); const DxvkDeviceQueueSet& queues,
const DxvkQueueCallback& queueCallback);
~DxvkDevice(); ~DxvkDevice();

View File

@ -3,8 +3,8 @@
namespace dxvk { namespace dxvk {
DxvkSubmissionQueue::DxvkSubmissionQueue(DxvkDevice* device) DxvkSubmissionQueue::DxvkSubmissionQueue(DxvkDevice* device, const DxvkQueueCallback& callback)
: m_device(device), : m_device(device), m_callback(callback),
m_submitThread([this] () { submitCmdLists(); }), m_submitThread([this] () { submitCmdLists(); }),
m_finishThread([this] () { finishCmdLists(); }) { m_finishThread([this] () { finishCmdLists(); }) {
@ -75,10 +75,16 @@ namespace dxvk {
void DxvkSubmissionQueue::lockDeviceQueue() { void DxvkSubmissionQueue::lockDeviceQueue() {
m_mutexQueue.lock(); m_mutexQueue.lock();
if (m_callback)
m_callback(true);
} }
void DxvkSubmissionQueue::unlockDeviceQueue() { void DxvkSubmissionQueue::unlockDeviceQueue() {
if (m_callback)
m_callback(false);
m_mutexQueue.unlock(); m_mutexQueue.unlock();
} }
@ -105,10 +111,16 @@ namespace dxvk {
if (m_lastError != VK_ERROR_DEVICE_LOST) { if (m_lastError != VK_ERROR_DEVICE_LOST) {
std::lock_guard<dxvk::mutex> lock(m_mutexQueue); std::lock_guard<dxvk::mutex> lock(m_mutexQueue);
if (m_callback)
m_callback(true);
if (entry.submit.cmdList != nullptr) if (entry.submit.cmdList != nullptr)
status = entry.submit.cmdList->submit(); status = entry.submit.cmdList->submit();
else if (entry.present.presenter != nullptr) else if (entry.present.presenter != nullptr)
status = entry.present.presenter->presentImage(); status = entry.present.presenter->presentImage();
if (m_callback)
m_callback(false);
} else { } else {
// Don't submit anything after device loss // Don't submit anything after device loss
// so that drivers get a chance to recover // so that drivers get a chance to recover

View File

@ -64,7 +64,10 @@ namespace dxvk {
public: public:
DxvkSubmissionQueue(DxvkDevice* device); DxvkSubmissionQueue(
DxvkDevice* device,
const DxvkQueueCallback& callback);
~DxvkSubmissionQueue(); ~DxvkSubmissionQueue();
/** /**
@ -176,6 +179,7 @@ namespace dxvk {
private: private:
DxvkDevice* m_device; DxvkDevice* m_device;
DxvkQueueCallback m_callback;
std::atomic<VkResult> m_lastError = { VK_SUCCESS }; std::atomic<VkResult> m_lastError = { VK_SUCCESS };