mirror of
https://github.com/doitsujin/dxvk.git
synced 2024-11-29 19:24:10 +01:00
[dxvk] Add xfb counter write -> xfb counter read barrier
- Update xfb counter barrier
This commit is contained in:
parent
93b1b9bc00
commit
76d917df20
@ -2176,6 +2176,8 @@ namespace dxvk {
|
||||
m_queries.endQueries(m_cmd, VK_QUERY_TYPE_PIPELINE_STATISTICS);
|
||||
|
||||
this->renderPassUnbindFramebuffer();
|
||||
|
||||
m_flags.clr(DxvkContextFlag::GpDirtyXfbCounters);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2256,6 +2258,16 @@ namespace dxvk {
|
||||
if (!m_flags.test(DxvkContextFlag::GpXfbActive)) {
|
||||
m_flags.set(DxvkContextFlag::GpXfbActive);
|
||||
|
||||
if (m_flags.test(DxvkContextFlag::GpDirtyXfbCounters)) {
|
||||
m_flags.clr(DxvkContextFlag::GpDirtyXfbCounters);
|
||||
|
||||
this->emitMemoryBarrier(
|
||||
VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT,
|
||||
VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT,
|
||||
VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, /* XXX */
|
||||
VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT);
|
||||
}
|
||||
|
||||
VkBuffer ctrBuffers[MaxNumXfbBuffers];
|
||||
VkDeviceSize ctrOffsets[MaxNumXfbBuffers];
|
||||
|
||||
@ -2294,6 +2306,8 @@ namespace dxvk {
|
||||
|
||||
m_cmd->cmdEndTransformFeedback(
|
||||
0, MaxNumXfbBuffers, ctrBuffers, ctrOffsets);
|
||||
|
||||
m_flags.set(DxvkContextFlag::GpDirtyXfbCounters);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2967,6 +2981,22 @@ namespace dxvk {
|
||||
}
|
||||
|
||||
|
||||
void DxvkContext::emitMemoryBarrier(
|
||||
VkPipelineStageFlags srcStages,
|
||||
VkAccessFlags srcAccess,
|
||||
VkPipelineStageFlags dstStages,
|
||||
VkAccessFlags dstAccess) {
|
||||
VkMemoryBarrier barrier;
|
||||
barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
|
||||
barrier.pNext = nullptr;
|
||||
barrier.srcAccessMask = srcAccess;
|
||||
barrier.dstAccessMask = dstAccess;
|
||||
|
||||
m_cmd->cmdPipelineBarrier(srcStages, dstStages,
|
||||
0, 1, &barrier, 0, nullptr, 0, nullptr);
|
||||
}
|
||||
|
||||
|
||||
void DxvkContext::trackDrawBuffer() {
|
||||
if (m_flags.test(DxvkContextFlag::DirtyDrawBuffer)) {
|
||||
m_flags.clr(DxvkContextFlag::DirtyDrawBuffer);
|
||||
|
@ -838,6 +838,12 @@ namespace dxvk {
|
||||
void commitComputeInitBarriers();
|
||||
void commitComputePostBarriers();
|
||||
|
||||
void emitMemoryBarrier(
|
||||
VkPipelineStageFlags srcStages,
|
||||
VkAccessFlags srcAccess,
|
||||
VkPipelineStageFlags dstStages,
|
||||
VkAccessFlags dstAccess);
|
||||
|
||||
void trackDrawBuffer();
|
||||
|
||||
};
|
||||
|
@ -33,6 +33,7 @@ namespace dxvk {
|
||||
GpDirtyVertexBuffers, ///< Vertex buffer bindings are out of date
|
||||
GpDirtyIndexBuffer, ///< Index buffer binding are out of date
|
||||
GpDirtyXfbBuffers, ///< Transform feedback buffer bindings are out of date
|
||||
GpDirtyXfbCounters, ///< Counter buffer values are dirty
|
||||
GpDirtyBlendConstants, ///< Blend constants have changed
|
||||
GpDirtyStencilRef, ///< Stencil reference has changed
|
||||
GpDirtyViewport, ///< Viewport state has changed
|
||||
|
@ -121,7 +121,7 @@ namespace dxvk {
|
||||
if (m_format.depth.format == VK_FORMAT_UNDEFINED)
|
||||
subpass.pDepthStencilAttachment = nullptr;
|
||||
|
||||
const std::array<VkSubpassDependency, 2> subpassDeps = {{
|
||||
const std::array<VkSubpassDependency, 3> subpassDeps = {{
|
||||
{ VK_SUBPASS_EXTERNAL, 0,
|
||||
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
|
||||
VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
|
||||
@ -130,6 +130,11 @@ namespace dxvk {
|
||||
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
|
||||
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
|
||||
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, 0 },
|
||||
{ 0, 0,
|
||||
VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT,
|
||||
VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT,
|
||||
VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, /* XXX */
|
||||
VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT, 0 },
|
||||
{ 0, VK_SUBPASS_EXTERNAL,
|
||||
VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
|
||||
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
|
||||
|
Loading…
Reference in New Issue
Block a user