1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-23 10:54:14 +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,
VK_QUERY_TYPE_PIPELINE_STATISTICS);
accessBuffer(DxvkCmdBuffer::ExecBuffer,
*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);
accessDrawBuffer(offset, 1, 0, sizeof(VkDispatchIndirectCommand));
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(
DxvkCmdBuffer cmdBuffer,
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(
DxvkCmdBuffer cmdBuffer,
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(
DxvkBuffer& buffer,
VkDeviceSize offset,

View File

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