2017-10-10 23:32:13 +02:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <unordered_set>
|
|
|
|
|
2018-01-10 12:13:46 +01:00
|
|
|
#include "dxvk_binding.h"
|
2017-10-15 19:23:10 +02:00
|
|
|
#include "dxvk_descriptor.h"
|
2017-10-10 23:32:13 +02:00
|
|
|
#include "dxvk_lifetime.h"
|
2017-12-19 19:36:44 +01:00
|
|
|
#include "dxvk_limits.h"
|
2017-12-07 09:38:31 +01:00
|
|
|
#include "dxvk_pipelayout.h"
|
2017-12-10 15:57:51 +01:00
|
|
|
#include "dxvk_staging.h"
|
2017-10-10 23:32:13 +02:00
|
|
|
|
|
|
|
namespace dxvk {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief DXVK command list
|
|
|
|
*
|
|
|
|
* Stores a command buffer that a context can use to record Vulkan
|
|
|
|
* commands. The command list shall also reference the resources
|
|
|
|
* used by the recorded commands for automatic lifetime tracking.
|
|
|
|
* When the command list has completed execution, resources that
|
|
|
|
* are no longer used may get destroyed.
|
|
|
|
*/
|
2017-12-01 09:50:47 +01:00
|
|
|
class DxvkCommandList : public RcObject {
|
2017-10-10 23:32:13 +02:00
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
DxvkCommandList(
|
|
|
|
const Rc<vk::DeviceFn>& vkd,
|
2017-12-10 15:57:51 +01:00
|
|
|
DxvkDevice* device,
|
2017-10-10 23:32:13 +02:00
|
|
|
uint32_t queueFamily);
|
|
|
|
~DxvkCommandList();
|
|
|
|
|
|
|
|
/**
|
2017-12-01 14:27:53 +01:00
|
|
|
* \brief Submits command list
|
|
|
|
*
|
|
|
|
* \param [in] queue Device queue
|
|
|
|
* \param [in] waitSemaphore Semaphore to wait on
|
|
|
|
* \param [in] wakeSemaphore Semaphore to signal
|
|
|
|
* \param [in] fence Fence to signal
|
2017-10-10 23:32:13 +02:00
|
|
|
*/
|
2017-12-01 14:27:53 +01:00
|
|
|
void submit(
|
|
|
|
VkQueue queue,
|
|
|
|
VkSemaphore waitSemaphore,
|
|
|
|
VkSemaphore wakeSemaphore,
|
|
|
|
VkFence fence);
|
2017-10-10 23:32:13 +02:00
|
|
|
|
2017-10-14 14:28:31 +02:00
|
|
|
/**
|
|
|
|
* \brief Begins recording
|
|
|
|
*
|
|
|
|
* Resets the command buffer and
|
|
|
|
* begins command buffer recording.
|
|
|
|
*/
|
2017-12-01 09:50:47 +01:00
|
|
|
void beginRecording();
|
2017-10-14 14:28:31 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Ends recording
|
|
|
|
*
|
|
|
|
* Ends command buffer recording, making
|
|
|
|
* the command list ready for submission.
|
|
|
|
*/
|
2017-12-01 09:50:47 +01:00
|
|
|
void endRecording();
|
2017-10-10 23:32:13 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Adds a resource to track
|
|
|
|
*
|
|
|
|
* Adds a resource to the internal resource tracker.
|
|
|
|
* Resources will be kept alive and "in use" until
|
|
|
|
* the device can guarantee that the submission has
|
|
|
|
* completed.
|
|
|
|
*/
|
2018-01-08 14:21:50 +01:00
|
|
|
void trackResource(const Rc<DxvkResource>& rc) {
|
|
|
|
m_resources.trackResource(rc);
|
|
|
|
}
|
2017-10-10 23:32:13 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Resets the command list
|
|
|
|
*
|
|
|
|
* Resets the internal command buffer of the command list and
|
|
|
|
* marks all tracked resources as unused. When submitting the
|
|
|
|
* command list to the device, this method will be called once
|
|
|
|
* the command list completes execution.
|
|
|
|
*/
|
2017-12-01 09:50:47 +01:00
|
|
|
void reset();
|
2017-10-14 14:28:31 +02:00
|
|
|
|
2018-01-11 20:31:18 +01:00
|
|
|
VkDescriptorSet allocateDescriptorSet(
|
|
|
|
VkDescriptorSetLayout descriptorLayout) {
|
|
|
|
return m_descAlloc.alloc(descriptorLayout);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void updateDescriptorSet(
|
2017-12-03 20:23:26 +01:00
|
|
|
uint32_t descriptorCount,
|
2018-01-11 20:31:18 +01:00
|
|
|
const VkWriteDescriptorSet* descriptorWrites) {
|
|
|
|
m_vkd->vkUpdateDescriptorSets(m_vkd->device(),
|
|
|
|
descriptorCount, descriptorWrites, 0, nullptr);
|
|
|
|
}
|
|
|
|
|
2017-12-03 20:23:26 +01:00
|
|
|
|
2017-10-14 14:28:31 +02:00
|
|
|
void cmdBeginRenderPass(
|
|
|
|
const VkRenderPassBeginInfo* pRenderPassBegin,
|
2018-01-08 14:21:50 +01:00
|
|
|
VkSubpassContents contents) {
|
|
|
|
m_vkd->vkCmdBeginRenderPass(m_buffer,
|
|
|
|
pRenderPassBegin, contents);
|
|
|
|
}
|
|
|
|
|
2017-10-14 14:28:31 +02:00
|
|
|
|
2018-01-11 20:31:18 +01:00
|
|
|
void cmdBindDescriptorSet(
|
|
|
|
VkPipelineBindPoint pipeline,
|
|
|
|
VkPipelineLayout pipelineLayout,
|
|
|
|
VkDescriptorSet descriptorSet) {
|
|
|
|
m_vkd->vkCmdBindDescriptorSets(m_buffer,
|
|
|
|
pipeline, pipelineLayout, 0, 1,
|
|
|
|
&descriptorSet, 0, nullptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-11-20 13:21:27 +01:00
|
|
|
void cmdBindIndexBuffer(
|
|
|
|
VkBuffer buffer,
|
|
|
|
VkDeviceSize offset,
|
2018-01-08 14:21:50 +01:00
|
|
|
VkIndexType indexType) {
|
|
|
|
m_vkd->vkCmdBindIndexBuffer(m_buffer,
|
|
|
|
buffer, offset, indexType);
|
|
|
|
}
|
|
|
|
|
2017-11-20 13:21:27 +01:00
|
|
|
|
2017-10-14 14:28:31 +02:00
|
|
|
void cmdBindPipeline(
|
|
|
|
VkPipelineBindPoint pipelineBindPoint,
|
2018-01-08 14:21:50 +01:00
|
|
|
VkPipeline pipeline) {
|
|
|
|
m_vkd->vkCmdBindPipeline(m_buffer,
|
|
|
|
pipelineBindPoint, pipeline);
|
|
|
|
}
|
|
|
|
|
2017-10-14 14:28:31 +02:00
|
|
|
|
2017-11-21 19:50:57 +01:00
|
|
|
void cmdBindVertexBuffers(
|
|
|
|
uint32_t firstBinding,
|
|
|
|
uint32_t bindingCount,
|
|
|
|
const VkBuffer* pBuffers,
|
2018-01-08 14:21:50 +01:00
|
|
|
const VkDeviceSize* pOffsets) {
|
|
|
|
m_vkd->vkCmdBindVertexBuffers(m_buffer,
|
|
|
|
firstBinding, bindingCount, pBuffers, pOffsets);
|
|
|
|
}
|
|
|
|
|
2017-11-21 19:50:57 +01:00
|
|
|
|
2018-01-20 09:46:54 +01:00
|
|
|
void cmdBlitImage(
|
|
|
|
VkImage srcImage,
|
|
|
|
VkImageLayout srcImageLayout,
|
|
|
|
VkImage dstImage,
|
|
|
|
VkImageLayout dstImageLayout,
|
|
|
|
uint32_t regionCount,
|
|
|
|
const VkImageBlit* pRegions,
|
|
|
|
VkFilter filter) {
|
|
|
|
m_vkd->vkCmdBlitImage(m_buffer,
|
|
|
|
srcImage, srcImageLayout,
|
|
|
|
dstImage, dstImageLayout,
|
|
|
|
regionCount, pRegions, filter);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-10-14 14:28:31 +02:00
|
|
|
void cmdClearAttachments(
|
|
|
|
uint32_t attachmentCount,
|
|
|
|
const VkClearAttachment* pAttachments,
|
|
|
|
uint32_t rectCount,
|
2018-01-08 14:21:50 +01:00
|
|
|
const VkClearRect* pRects) {
|
|
|
|
m_vkd->vkCmdClearAttachments(m_buffer,
|
|
|
|
attachmentCount, pAttachments,
|
|
|
|
rectCount, pRects);
|
|
|
|
}
|
|
|
|
|
2017-10-14 14:28:31 +02:00
|
|
|
|
2017-12-01 00:52:13 +01:00
|
|
|
void cmdClearColorImage(
|
|
|
|
VkImage image,
|
|
|
|
VkImageLayout imageLayout,
|
|
|
|
const VkClearColorValue* pColor,
|
|
|
|
uint32_t rangeCount,
|
2018-01-08 14:21:50 +01:00
|
|
|
const VkImageSubresourceRange* pRanges) {
|
|
|
|
m_vkd->vkCmdClearColorImage(m_buffer,
|
|
|
|
image, imageLayout, pColor,
|
|
|
|
rangeCount, pRanges);
|
|
|
|
}
|
|
|
|
|
2017-12-01 00:52:13 +01:00
|
|
|
|
2017-12-09 03:53:42 +01:00
|
|
|
void cmdClearDepthStencilImage(
|
|
|
|
VkImage image,
|
|
|
|
VkImageLayout imageLayout,
|
|
|
|
const VkClearDepthStencilValue* pDepthStencil,
|
|
|
|
uint32_t rangeCount,
|
2018-01-08 14:21:50 +01:00
|
|
|
const VkImageSubresourceRange* pRanges) {
|
|
|
|
m_vkd->vkCmdClearDepthStencilImage(m_buffer,
|
|
|
|
image, imageLayout, pDepthStencil,
|
|
|
|
rangeCount, pRanges);
|
|
|
|
}
|
|
|
|
|
2017-12-09 03:53:42 +01:00
|
|
|
|
2017-11-26 13:24:01 +01:00
|
|
|
void cmdCopyBuffer(
|
|
|
|
VkBuffer srcBuffer,
|
|
|
|
VkBuffer dstBuffer,
|
|
|
|
uint32_t regionCount,
|
2018-01-08 14:21:50 +01:00
|
|
|
const VkBufferCopy* pRegions) {
|
|
|
|
m_vkd->vkCmdCopyBuffer(m_buffer,
|
|
|
|
srcBuffer, dstBuffer,
|
|
|
|
regionCount, pRegions);
|
|
|
|
}
|
|
|
|
|
2017-11-26 13:24:01 +01:00
|
|
|
|
2018-01-05 03:01:19 +01:00
|
|
|
void cmdCopyBufferToImage(
|
|
|
|
VkBuffer srcBuffer,
|
|
|
|
VkImage dstImage,
|
|
|
|
VkImageLayout dstImageLayout,
|
|
|
|
uint32_t regionCount,
|
2018-01-08 14:21:50 +01:00
|
|
|
const VkBufferImageCopy* pRegions) {
|
|
|
|
m_vkd->vkCmdCopyBufferToImage(m_buffer,
|
|
|
|
srcBuffer, dstImage, dstImageLayout,
|
|
|
|
regionCount, pRegions);
|
|
|
|
}
|
|
|
|
|
2018-01-05 03:01:19 +01:00
|
|
|
|
2017-12-30 19:10:45 +01:00
|
|
|
void cmdCopyImage(
|
|
|
|
VkImage srcImage,
|
|
|
|
VkImageLayout srcImageLayout,
|
|
|
|
VkImage dstImage,
|
|
|
|
VkImageLayout dstImageLayout,
|
|
|
|
uint32_t regionCount,
|
2018-01-08 14:21:50 +01:00
|
|
|
const VkImageCopy* pRegions) {
|
|
|
|
m_vkd->vkCmdCopyImage(m_buffer,
|
|
|
|
srcImage, srcImageLayout,
|
|
|
|
dstImage, dstImageLayout,
|
|
|
|
regionCount, pRegions);
|
|
|
|
}
|
|
|
|
|
2017-12-30 19:10:45 +01:00
|
|
|
|
2018-01-19 18:09:49 +01:00
|
|
|
void cmdCopyImageToBuffer(
|
|
|
|
VkImage srcImage,
|
|
|
|
VkImageLayout srcImageLayout,
|
|
|
|
VkBuffer dstBuffer,
|
|
|
|
uint32_t regionCount,
|
|
|
|
const VkBufferImageCopy* pRegions) {
|
|
|
|
m_vkd->vkCmdCopyImageToBuffer(m_buffer,
|
|
|
|
srcImage, srcImageLayout, dstBuffer,
|
|
|
|
regionCount, pRegions);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-10-14 14:28:31 +02:00
|
|
|
void cmdDispatch(
|
|
|
|
uint32_t x,
|
|
|
|
uint32_t y,
|
2018-01-08 14:21:50 +01:00
|
|
|
uint32_t z) {
|
|
|
|
m_vkd->vkCmdDispatch(m_buffer, x, y, z);
|
|
|
|
}
|
|
|
|
|
2017-10-14 14:28:31 +02:00
|
|
|
|
2017-12-31 01:31:08 +01:00
|
|
|
void cmdDispatchIndirect(
|
|
|
|
VkBuffer buffer,
|
2018-01-08 14:21:50 +01:00
|
|
|
VkDeviceSize offset) {
|
|
|
|
m_vkd->vkCmdDispatchIndirect(
|
|
|
|
m_buffer, buffer, offset);
|
|
|
|
}
|
|
|
|
|
2017-12-31 01:31:08 +01:00
|
|
|
|
2017-10-14 14:28:31 +02:00
|
|
|
void cmdDraw(
|
|
|
|
uint32_t vertexCount,
|
|
|
|
uint32_t instanceCount,
|
|
|
|
uint32_t firstVertex,
|
2018-01-08 14:21:50 +01:00
|
|
|
uint32_t firstInstance) {
|
|
|
|
m_vkd->vkCmdDraw(m_buffer,
|
|
|
|
vertexCount, instanceCount,
|
|
|
|
firstVertex, firstInstance);
|
|
|
|
}
|
|
|
|
|
2017-10-14 14:28:31 +02:00
|
|
|
|
2017-12-31 01:31:08 +01:00
|
|
|
void cmdDrawIndirect(
|
|
|
|
VkBuffer buffer,
|
|
|
|
VkDeviceSize offset,
|
|
|
|
uint32_t drawCount,
|
2018-01-08 14:21:50 +01:00
|
|
|
uint32_t stride) {
|
|
|
|
m_vkd->vkCmdDrawIndirect(m_buffer,
|
|
|
|
buffer, offset, drawCount, stride);
|
|
|
|
}
|
|
|
|
|
2017-12-31 01:31:08 +01:00
|
|
|
|
2017-10-14 14:28:31 +02:00
|
|
|
void cmdDrawIndexed(
|
|
|
|
uint32_t indexCount,
|
|
|
|
uint32_t instanceCount,
|
|
|
|
uint32_t firstIndex,
|
|
|
|
uint32_t vertexOffset,
|
2018-01-08 14:21:50 +01:00
|
|
|
uint32_t firstInstance) {
|
|
|
|
m_vkd->vkCmdDrawIndexed(m_buffer,
|
|
|
|
indexCount, instanceCount,
|
|
|
|
firstIndex, vertexOffset,
|
|
|
|
firstInstance);
|
|
|
|
}
|
|
|
|
|
2017-10-14 14:28:31 +02:00
|
|
|
|
2017-12-31 01:31:08 +01:00
|
|
|
void cmdDrawIndexedIndirect(
|
|
|
|
VkBuffer buffer,
|
|
|
|
VkDeviceSize offset,
|
|
|
|
uint32_t drawCount,
|
2018-01-08 14:21:50 +01:00
|
|
|
uint32_t stride) {
|
|
|
|
m_vkd->vkCmdDrawIndexedIndirect(m_buffer,
|
|
|
|
buffer, offset, drawCount, stride);
|
|
|
|
}
|
2017-12-31 01:31:08 +01:00
|
|
|
|
2018-01-08 14:21:50 +01:00
|
|
|
|
|
|
|
void cmdEndRenderPass() {
|
|
|
|
m_vkd->vkCmdEndRenderPass(m_buffer);
|
|
|
|
}
|
2017-10-10 23:32:13 +02:00
|
|
|
|
2018-02-01 14:26:38 +01:00
|
|
|
|
|
|
|
void cmdFillBuffer(
|
|
|
|
VkBuffer dstBuffer,
|
|
|
|
VkDeviceSize dstOffset,
|
|
|
|
VkDeviceSize size,
|
|
|
|
uint32_t data) {
|
|
|
|
m_vkd->vkCmdFillBuffer(m_buffer,
|
|
|
|
dstBuffer, dstOffset, size, data);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-10-15 17:56:06 +02:00
|
|
|
void cmdPipelineBarrier(
|
|
|
|
VkPipelineStageFlags srcStageMask,
|
|
|
|
VkPipelineStageFlags dstStageMask,
|
|
|
|
VkDependencyFlags dependencyFlags,
|
|
|
|
uint32_t memoryBarrierCount,
|
|
|
|
const VkMemoryBarrier* pMemoryBarriers,
|
|
|
|
uint32_t bufferMemoryBarrierCount,
|
|
|
|
const VkBufferMemoryBarrier* pBufferMemoryBarriers,
|
|
|
|
uint32_t imageMemoryBarrierCount,
|
2018-01-08 14:21:50 +01:00
|
|
|
const VkImageMemoryBarrier* pImageMemoryBarriers) {
|
|
|
|
m_vkd->vkCmdPipelineBarrier(m_buffer,
|
|
|
|
srcStageMask, dstStageMask, dependencyFlags,
|
|
|
|
memoryBarrierCount, pMemoryBarriers,
|
|
|
|
bufferMemoryBarrierCount, pBufferMemoryBarriers,
|
|
|
|
imageMemoryBarrierCount, pImageMemoryBarriers);
|
|
|
|
}
|
|
|
|
|
2017-10-15 17:56:06 +02:00
|
|
|
|
2017-12-12 00:27:49 +01:00
|
|
|
void cmdResolveImage(
|
|
|
|
VkImage srcImage,
|
|
|
|
VkImageLayout srcImageLayout,
|
|
|
|
VkImage dstImage,
|
|
|
|
VkImageLayout dstImageLayout,
|
|
|
|
uint32_t regionCount,
|
2018-01-08 14:21:50 +01:00
|
|
|
const VkImageResolve* pRegions) {
|
|
|
|
m_vkd->vkCmdResolveImage(m_buffer,
|
|
|
|
srcImage, srcImageLayout,
|
|
|
|
dstImage, dstImageLayout,
|
|
|
|
regionCount, pRegions);
|
|
|
|
}
|
|
|
|
|
2017-12-12 00:27:49 +01:00
|
|
|
|
2017-12-07 18:51:41 +01:00
|
|
|
void cmdUpdateBuffer(
|
|
|
|
VkBuffer dstBuffer,
|
|
|
|
VkDeviceSize dstOffset,
|
|
|
|
VkDeviceSize dataSize,
|
2018-01-08 14:21:50 +01:00
|
|
|
const void* pData) {
|
|
|
|
m_vkd->vkCmdUpdateBuffer(m_buffer,
|
|
|
|
dstBuffer, dstOffset, dataSize, pData);
|
|
|
|
}
|
|
|
|
|
2017-12-07 18:51:41 +01:00
|
|
|
|
2018-01-29 20:01:49 +01:00
|
|
|
void cmdSetBlendConstants(const float blendConstants[4]) {
|
2018-01-08 14:21:50 +01:00
|
|
|
m_vkd->vkCmdSetBlendConstants(m_buffer, blendConstants);
|
|
|
|
}
|
|
|
|
|
2017-12-11 14:11:18 +01:00
|
|
|
|
2017-11-20 15:35:29 +01:00
|
|
|
void cmdSetScissor(
|
|
|
|
uint32_t firstScissor,
|
|
|
|
uint32_t scissorCount,
|
2018-01-08 14:21:50 +01:00
|
|
|
const VkRect2D* scissors) {
|
|
|
|
m_vkd->vkCmdSetScissor(m_buffer,
|
|
|
|
firstScissor, scissorCount, scissors);
|
|
|
|
}
|
|
|
|
|
2017-11-20 15:35:29 +01:00
|
|
|
|
2017-12-11 14:11:18 +01:00
|
|
|
void cmdSetStencilReference(
|
|
|
|
VkStencilFaceFlags faceMask,
|
2018-01-08 14:21:50 +01:00
|
|
|
uint32_t reference) {
|
|
|
|
m_vkd->vkCmdSetStencilReference(m_buffer,
|
|
|
|
faceMask, reference);
|
|
|
|
}
|
|
|
|
|
2017-12-11 14:11:18 +01:00
|
|
|
|
2017-11-20 15:35:29 +01:00
|
|
|
void cmdSetViewport(
|
|
|
|
uint32_t firstViewport,
|
|
|
|
uint32_t viewportCount,
|
2018-01-08 14:21:50 +01:00
|
|
|
const VkViewport* viewports) {
|
|
|
|
m_vkd->vkCmdSetViewport(m_buffer,
|
|
|
|
firstViewport, viewportCount, viewports);
|
|
|
|
}
|
|
|
|
|
2017-11-20 15:35:29 +01:00
|
|
|
|
2017-12-10 15:57:51 +01:00
|
|
|
DxvkStagingBufferSlice stagedAlloc(
|
|
|
|
VkDeviceSize size);
|
|
|
|
|
|
|
|
void stagedBufferCopy(
|
|
|
|
VkBuffer dstBuffer,
|
|
|
|
VkDeviceSize dstOffset,
|
|
|
|
VkDeviceSize dataSize,
|
|
|
|
const DxvkStagingBufferSlice& dataSlice);
|
|
|
|
|
|
|
|
void stagedBufferImageCopy(
|
|
|
|
VkImage dstImage,
|
|
|
|
VkImageLayout dstImageLayout,
|
|
|
|
const VkBufferImageCopy& dstImageRegion,
|
|
|
|
const DxvkStagingBufferSlice& dataSlice);
|
|
|
|
|
2017-10-10 23:32:13 +02:00
|
|
|
private:
|
|
|
|
|
|
|
|
Rc<vk::DeviceFn> m_vkd;
|
|
|
|
|
|
|
|
VkCommandPool m_pool;
|
|
|
|
VkCommandBuffer m_buffer;
|
|
|
|
|
|
|
|
DxvkLifetimeTracker m_resources;
|
2017-10-15 19:23:10 +02:00
|
|
|
DxvkDescriptorAlloc m_descAlloc;
|
2017-12-10 15:57:51 +01:00
|
|
|
DxvkStagingAlloc m_stagingAlloc;
|
2017-10-10 23:32:13 +02:00
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|