mirror of
https://github.com/doitsujin/dxvk.git
synced 2024-12-02 01:24:11 +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);
|
m_queries.endQueries(m_cmd, VK_QUERY_TYPE_PIPELINE_STATISTICS);
|
||||||
|
|
||||||
this->renderPassUnbindFramebuffer();
|
this->renderPassUnbindFramebuffer();
|
||||||
|
|
||||||
|
m_flags.clr(DxvkContextFlag::GpDirtyXfbCounters);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2256,6 +2258,16 @@ namespace dxvk {
|
|||||||
if (!m_flags.test(DxvkContextFlag::GpXfbActive)) {
|
if (!m_flags.test(DxvkContextFlag::GpXfbActive)) {
|
||||||
m_flags.set(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];
|
VkBuffer ctrBuffers[MaxNumXfbBuffers];
|
||||||
VkDeviceSize ctrOffsets[MaxNumXfbBuffers];
|
VkDeviceSize ctrOffsets[MaxNumXfbBuffers];
|
||||||
|
|
||||||
@ -2294,6 +2306,8 @@ namespace dxvk {
|
|||||||
|
|
||||||
m_cmd->cmdEndTransformFeedback(
|
m_cmd->cmdEndTransformFeedback(
|
||||||
0, MaxNumXfbBuffers, ctrBuffers, ctrOffsets);
|
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() {
|
void DxvkContext::trackDrawBuffer() {
|
||||||
if (m_flags.test(DxvkContextFlag::DirtyDrawBuffer)) {
|
if (m_flags.test(DxvkContextFlag::DirtyDrawBuffer)) {
|
||||||
m_flags.clr(DxvkContextFlag::DirtyDrawBuffer);
|
m_flags.clr(DxvkContextFlag::DirtyDrawBuffer);
|
||||||
|
@ -838,6 +838,12 @@ namespace dxvk {
|
|||||||
void commitComputeInitBarriers();
|
void commitComputeInitBarriers();
|
||||||
void commitComputePostBarriers();
|
void commitComputePostBarriers();
|
||||||
|
|
||||||
|
void emitMemoryBarrier(
|
||||||
|
VkPipelineStageFlags srcStages,
|
||||||
|
VkAccessFlags srcAccess,
|
||||||
|
VkPipelineStageFlags dstStages,
|
||||||
|
VkAccessFlags dstAccess);
|
||||||
|
|
||||||
void trackDrawBuffer();
|
void trackDrawBuffer();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -33,6 +33,7 @@ namespace dxvk {
|
|||||||
GpDirtyVertexBuffers, ///< Vertex buffer bindings are out of date
|
GpDirtyVertexBuffers, ///< Vertex buffer bindings are out of date
|
||||||
GpDirtyIndexBuffer, ///< Index buffer binding are out of date
|
GpDirtyIndexBuffer, ///< Index buffer binding are out of date
|
||||||
GpDirtyXfbBuffers, ///< Transform feedback buffer bindings are out of date
|
GpDirtyXfbBuffers, ///< Transform feedback buffer bindings are out of date
|
||||||
|
GpDirtyXfbCounters, ///< Counter buffer values are dirty
|
||||||
GpDirtyBlendConstants, ///< Blend constants have changed
|
GpDirtyBlendConstants, ///< Blend constants have changed
|
||||||
GpDirtyStencilRef, ///< Stencil reference has changed
|
GpDirtyStencilRef, ///< Stencil reference has changed
|
||||||
GpDirtyViewport, ///< Viewport state has changed
|
GpDirtyViewport, ///< Viewport state has changed
|
||||||
|
@ -121,7 +121,7 @@ namespace dxvk {
|
|||||||
if (m_format.depth.format == VK_FORMAT_UNDEFINED)
|
if (m_format.depth.format == VK_FORMAT_UNDEFINED)
|
||||||
subpass.pDepthStencilAttachment = nullptr;
|
subpass.pDepthStencilAttachment = nullptr;
|
||||||
|
|
||||||
const std::array<VkSubpassDependency, 2> subpassDeps = {{
|
const std::array<VkSubpassDependency, 3> subpassDeps = {{
|
||||||
{ VK_SUBPASS_EXTERNAL, 0,
|
{ VK_SUBPASS_EXTERNAL, 0,
|
||||||
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
|
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
|
||||||
VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
|
VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
|
||||||
@ -130,6 +130,11 @@ namespace dxvk {
|
|||||||
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
|
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
|
||||||
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
|
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
|
||||||
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, 0 },
|
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,
|
{ 0, VK_SUBPASS_EXTERNAL,
|
||||||
VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
|
VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
|
||||||
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
|
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
|
||||||
|
Loading…
Reference in New Issue
Block a user