1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-23 19:54:16 +01:00

[dxvk] Add more convenience methods to track buffer barriers

This commit is contained in:
Philip Rebohle 2025-02-14 19:47:50 +01:00
parent 23067c48c7
commit cb92589452
2 changed files with 97 additions and 7 deletions

View File

@ -936,13 +936,8 @@ namespace dxvk {
m_queryManager.endQueries(m_cmd, m_queryManager.endQueries(m_cmd,
VK_QUERY_TYPE_PIPELINE_STATISTICS); VK_QUERY_TYPE_PIPELINE_STATISTICS);
accessBuffer(DxvkCmdBuffer::ExecBuffer, accessDrawBuffer(offset, 1, 0, sizeof(VkDispatchIndirectCommand));
*m_state.id.argBuffer.buffer(),
m_state.id.argBuffer.offset() + offset,
sizeof(VkDispatchIndirectCommand),
VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT,
VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT);
this->trackDrawBuffer(); this->trackDrawBuffer();
} }
} }
@ -7659,6 +7654,18 @@ namespace dxvk {
} }
void DxvkContext::accessImage(
DxvkCmdBuffer cmdBuffer,
const DxvkImageView& imageView,
VkPipelineStageFlags2 srcStages,
VkAccessFlags2 srcAccess) {
accessImage(cmdBuffer, *imageView.image(),
imageView.imageSubresources(),
imageView.image()->info().layout,
srcStages, srcAccess);
}
void DxvkContext::accessImage( void DxvkContext::accessImage(
DxvkCmdBuffer cmdBuffer, DxvkCmdBuffer cmdBuffer,
DxvkImage& image, DxvkImage& image,
@ -7773,6 +7780,35 @@ namespace dxvk {
} }
void DxvkContext::accessBuffer(
DxvkCmdBuffer cmdBuffer,
const DxvkBufferSlice& bufferSlice,
VkPipelineStageFlags2 srcStages,
VkAccessFlags2 srcAccess) {
accessBuffer(cmdBuffer,
*bufferSlice.buffer(),
bufferSlice.offset(),
bufferSlice.length(),
srcStages, srcAccess);
}
void DxvkContext::accessBuffer(
DxvkCmdBuffer cmdBuffer,
const DxvkBufferSlice& bufferSlice,
VkPipelineStageFlags2 srcStages,
VkAccessFlags2 srcAccess,
VkPipelineStageFlags2 dstStages,
VkAccessFlags2 dstAccess) {
accessBuffer(cmdBuffer,
*bufferSlice.buffer(),
bufferSlice.offset(),
bufferSlice.length(),
srcStages, srcAccess,
dstStages, dstAccess);
}
void DxvkContext::accessBuffer( void DxvkContext::accessBuffer(
DxvkCmdBuffer cmdBuffer, DxvkCmdBuffer cmdBuffer,
DxvkBufferView& bufferView, DxvkBufferView& bufferView,
@ -7802,6 +7838,31 @@ namespace dxvk {
} }
void DxvkContext::accessDrawBuffer(
VkDeviceSize offset,
uint32_t count,
uint32_t stride,
uint32_t size) {
uint32_t dataSize = count ? (count - 1u) * stride + size : 0u;
accessBuffer(DxvkCmdBuffer::ExecBuffer,
*m_state.id.argBuffer.buffer(),
m_state.id.argBuffer.offset() + offset, dataSize,
VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT,
VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT_KHR);
}
void DxvkContext::accessDrawCountBuffer(
VkDeviceSize offset) {
accessBuffer(DxvkCmdBuffer::ExecBuffer,
*m_state.id.cntBuffer.buffer(),
m_state.id.cntBuffer.offset() + offset, sizeof(uint32_t),
VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT,
VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT_KHR);
}
void DxvkContext::flushPendingAccesses( void DxvkContext::flushPendingAccesses(
DxvkBuffer& buffer, DxvkBuffer& buffer,
VkDeviceSize offset, VkDeviceSize offset,

View File

@ -1878,6 +1878,12 @@ namespace dxvk {
VkPipelineStageFlags2 srcStages, VkPipelineStageFlags2 srcStages,
VkAccessFlags2 srcAccess); VkAccessFlags2 srcAccess);
void accessImage(
DxvkCmdBuffer cmdBuffer,
const DxvkImageView& imageView,
VkPipelineStageFlags2 srcStages,
VkAccessFlags2 srcAccess);
void accessImage( void accessImage(
DxvkCmdBuffer cmdBuffer, DxvkCmdBuffer cmdBuffer,
DxvkImage& image, DxvkImage& image,
@ -1907,6 +1913,20 @@ namespace dxvk {
VkPipelineStageFlags2 dstStages, VkPipelineStageFlags2 dstStages,
VkAccessFlags2 dstAccess); VkAccessFlags2 dstAccess);
void accessBuffer(
DxvkCmdBuffer cmdBuffer,
const DxvkBufferSlice& bufferSlice,
VkPipelineStageFlags2 srcStages,
VkAccessFlags2 srcAccess);
void accessBuffer(
DxvkCmdBuffer cmdBuffer,
const DxvkBufferSlice& bufferSlice,
VkPipelineStageFlags2 srcStages,
VkAccessFlags2 srcAccess,
VkPipelineStageFlags2 dstStages,
VkAccessFlags2 dstAccess);
void accessBuffer( void accessBuffer(
DxvkCmdBuffer cmdBuffer, DxvkCmdBuffer cmdBuffer,
DxvkBufferView& bufferView, DxvkBufferView& bufferView,
@ -1921,6 +1941,15 @@ namespace dxvk {
VkPipelineStageFlags2 dstStages, VkPipelineStageFlags2 dstStages,
VkAccessFlags2 dstAccess); VkAccessFlags2 dstAccess);
void accessDrawBuffer(
VkDeviceSize offset,
uint32_t count,
uint32_t stride,
uint32_t size);
void accessDrawCountBuffer(
VkDeviceSize offset);
void flushPendingAccesses( void flushPendingAccesses(
DxvkBuffer& buffer, DxvkBuffer& buffer,
VkDeviceSize offset, VkDeviceSize offset,