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

[dxvk] Export DxvkDeviceQueue from DxvkDevice

Access to the Vulkan queues provided by the DXVK device
is required for external Vulkan libraries to work.
This commit is contained in:
Philip Rebohle 2018-04-19 15:42:48 +02:00
parent 8eb78591a0
commit a6a22cd00a
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
2 changed files with 57 additions and 9 deletions

View File

@ -18,12 +18,16 @@ namespace dxvk {
m_metaClearObjects(new DxvkMetaClearObjects (vkd)), m_metaClearObjects(new DxvkMetaClearObjects (vkd)),
m_unboundResources(this), m_unboundResources(this),
m_submissionQueue (this) { m_submissionQueue (this) {
m_graphicsQueue.queueFamily = m_adapter->graphicsQueueFamily();
m_presentQueue.queueFamily = m_adapter->presentQueueFamily();
m_vkd->vkGetDeviceQueue(m_vkd->device(), m_vkd->vkGetDeviceQueue(m_vkd->device(),
m_adapter->graphicsQueueFamily(), 0, m_graphicsQueue.queueFamily, 0,
&m_graphicsQueue); &m_graphicsQueue.queueHandle);
m_vkd->vkGetDeviceQueue(m_vkd->device(), m_vkd->vkGetDeviceQueue(m_vkd->device(),
m_adapter->presentQueueFamily(), 0, m_presentQueue.queueFamily, 0,
&m_presentQueue); &m_presentQueue.queueHandle);
} }
@ -202,7 +206,7 @@ namespace dxvk {
std::lock_guard<sync::Spinlock> statLock(m_statLock); std::lock_guard<sync::Spinlock> statLock(m_statLock);
m_statCounters.addCtr(DxvkStatCounter::QueuePresentCount, 1); m_statCounters.addCtr(DxvkStatCounter::QueuePresentCount, 1);
return m_vkd->vkQueuePresentKHR(m_presentQueue, &presentInfo); return m_vkd->vkQueuePresentKHR(m_presentQueue.queueHandle, &presentInfo);
} }
} }
@ -234,7 +238,8 @@ namespace dxvk {
m_statCounters.addCtr(DxvkStatCounter::QueueSubmitCount, 1); m_statCounters.addCtr(DxvkStatCounter::QueueSubmitCount, 1);
status = commandList->submit( status = commandList->submit(
m_graphicsQueue, waitSemaphore, wakeSemaphore); m_graphicsQueue.queueHandle,
waitSemaphore, wakeSemaphore);
} }
if (status == VK_SUCCESS) { if (status == VK_SUCCESS) {

View File

@ -27,6 +27,17 @@ namespace dxvk {
class DxvkInstance; class DxvkInstance;
/**
* \brief Device queue
*
* Stores a Vulkan queue and the
* queue family that it belongs to.
*/
struct DxvkDeviceQueue {
uint32_t queueFamily = 0;
VkQueue queueHandle = VK_NULL_HANDLE;
};
/** /**
* \brief DXVK device * \brief DXVK device
* *
@ -66,6 +77,17 @@ namespace dxvk {
return m_vkd->device(); return m_vkd->device();
} }
/**
* \brief Graphics queue properties
*
* Handle and queue family index of
* the queue used for rendering.
* \returns Graphics queue info
*/
DxvkDeviceQueue graphicsQueue() const {
return m_graphicsQueue;
}
/** /**
* \brief The adapter * \brief The adapter
* *
@ -291,6 +313,27 @@ namespace dxvk {
const Rc<DxvkSemaphore>& waitSync, const Rc<DxvkSemaphore>& waitSync,
const Rc<DxvkSemaphore>& wakeSync); const Rc<DxvkSemaphore>& wakeSync);
/**
* \brief Locks submission queue
*
* Since Vulkan queues are only meant to be accessed
* from one thread at a time, external libraries need
* to lock the queue before submitting command buffers.
*/
void lockSubmission() {
m_submissionLock.lock();
}
/**
* \brief Unlocks submission queue
*
* Releases the Vulkan queues again so that DXVK
* itself can use them for submissions again.
*/
void unlockSubmission() {
m_submissionLock.unlock();
}
/** /**
* \brief Waits until the device becomes idle * \brief Waits until the device becomes idle
* *
@ -318,9 +361,9 @@ namespace dxvk {
sync::Spinlock m_statLock; sync::Spinlock m_statLock;
DxvkStatCounters m_statCounters; DxvkStatCounters m_statCounters;
std::mutex m_submissionLock; std::mutex m_submissionLock;
VkQueue m_graphicsQueue = VK_NULL_HANDLE; DxvkDeviceQueue m_graphicsQueue;
VkQueue m_presentQueue = VK_NULL_HANDLE; DxvkDeviceQueue m_presentQueue;
DxvkRecycler<DxvkCommandList, 16> m_recycledCommandLists; DxvkRecycler<DxvkCommandList, 16> m_recycledCommandLists;
DxvkRecycler<DxvkStagingBuffer, 4> m_recycledStagingBuffers; DxvkRecycler<DxvkStagingBuffer, 4> m_recycledStagingBuffers;