mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-15 07:29:17 +01:00
[dxvk] Introduce DxvkCommandPool
This commit is contained in:
parent
def93fd18b
commit
c3a721f562
@ -87,6 +87,71 @@ namespace dxvk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DxvkCommandPool::DxvkCommandPool(
|
||||||
|
DxvkDevice* device,
|
||||||
|
uint32_t queueFamily)
|
||||||
|
: m_device(device) {
|
||||||
|
auto vk = m_device->vkd();
|
||||||
|
|
||||||
|
VkCommandPoolCreateInfo poolInfo = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO };
|
||||||
|
poolInfo.queueFamilyIndex = queueFamily;
|
||||||
|
|
||||||
|
if (vk->vkCreateCommandPool(vk->device(), &poolInfo, nullptr, &m_commandPool))
|
||||||
|
throw DxvkError("DxvkCommandPool: Failed to create command pool");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DxvkCommandPool::~DxvkCommandPool() {
|
||||||
|
auto vk = m_device->vkd();
|
||||||
|
|
||||||
|
vk->vkDestroyCommandPool(vk->device(), m_commandPool, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
VkCommandBuffer DxvkCommandPool::getCommandBuffer() {
|
||||||
|
auto vk = m_device->vkd();
|
||||||
|
|
||||||
|
if (m_next == m_commandBuffers.size()) {
|
||||||
|
// Allocate a new command buffer and add it to the list
|
||||||
|
VkCommandBufferAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO };
|
||||||
|
allocInfo.commandPool = m_commandPool;
|
||||||
|
allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
|
||||||
|
allocInfo.commandBufferCount = 1;
|
||||||
|
|
||||||
|
VkCommandBuffer commandBuffer = VK_NULL_HANDLE;
|
||||||
|
|
||||||
|
if (vk->vkAllocateCommandBuffers(vk->device(), &allocInfo, &commandBuffer))
|
||||||
|
throw DxvkError("DxvkCommandPool: Failed to allocate command buffer");
|
||||||
|
|
||||||
|
m_commandBuffers.push_back(commandBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Take existing command buffer. All command buffers
|
||||||
|
// will be in reset state, so we can begin it safely.
|
||||||
|
VkCommandBuffer commandBuffer = m_commandBuffers[m_next++];
|
||||||
|
|
||||||
|
VkCommandBufferBeginInfo info = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO };
|
||||||
|
info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
|
||||||
|
|
||||||
|
if (vk->vkBeginCommandBuffer(commandBuffer, &info))
|
||||||
|
throw DxvkError("DxvkCommandPool: Failed to begin command buffer");
|
||||||
|
|
||||||
|
return commandBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DxvkCommandPool::reset() {
|
||||||
|
auto vk = m_device->vkd();
|
||||||
|
|
||||||
|
if (m_next) {
|
||||||
|
if (vk->vkResetCommandPool(vk->device(), m_commandPool, 0))
|
||||||
|
throw DxvkError("DxvkCommandPool: Failed to reset command pool");
|
||||||
|
|
||||||
|
m_next = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
DxvkCommandList::DxvkCommandList(DxvkDevice* device)
|
DxvkCommandList::DxvkCommandList(DxvkDevice* device)
|
||||||
: m_device (device),
|
: m_device (device),
|
||||||
m_vkd (device->vkd()),
|
m_vkd (device->vkd()),
|
||||||
|
@ -118,7 +118,51 @@ namespace dxvk {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief DXVK command list
|
* \brief Command pool
|
||||||
|
*
|
||||||
|
* Simple command pool abstraction that allows
|
||||||
|
* us to easily obtain command buffers.
|
||||||
|
*/
|
||||||
|
class DxvkCommandPool : public RcObject {
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Creates command pool
|
||||||
|
*
|
||||||
|
* \param [in] device DXVK device
|
||||||
|
* \param [in] queueFamily Target queue family
|
||||||
|
*/
|
||||||
|
DxvkCommandPool(
|
||||||
|
DxvkDevice* device,
|
||||||
|
uint32_t queueFamily);
|
||||||
|
|
||||||
|
~DxvkCommandPool();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieves or allocates a command buffer
|
||||||
|
* \returns New command buffer in begun state
|
||||||
|
*/
|
||||||
|
VkCommandBuffer getCommandBuffer();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Resets command pool and all command buffers
|
||||||
|
*/
|
||||||
|
void reset();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
DxvkDevice* m_device;
|
||||||
|
|
||||||
|
VkCommandPool m_commandPool = VK_NULL_HANDLE;
|
||||||
|
std::vector<VkCommandBuffer> m_commandBuffers;
|
||||||
|
size_t m_next = 0;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Command list
|
||||||
*
|
*
|
||||||
* Stores a command buffer that a context can use to record Vulkan
|
* Stores a command buffer that a context can use to record Vulkan
|
||||||
* commands. The command list shall also reference the resources
|
* commands. The command list shall also reference the resources
|
||||||
|
Loading…
x
Reference in New Issue
Block a user