mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-23 01:54:22 +01:00
[dxvk] Use explicit barriers after framebuffer clears
This may allow clears to overlap with subsequent commands unless a barrier is actually required.
This commit is contained in:
parent
2aeef063c1
commit
8cfb7936ed
@ -556,26 +556,27 @@ namespace dxvk {
|
|||||||
attachments.color[0].view = imageView;
|
attachments.color[0].view = imageView;
|
||||||
attachments.color[0].layout = imageView->pickLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
|
attachments.color[0].layout = imageView->pickLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
|
||||||
|
|
||||||
ops.barrier.srcStages = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
|
||||||
ops.barrier.srcAccess = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
|
||||||
ops.colorOps[0] = colorOp;
|
ops.colorOps[0] = colorOp;
|
||||||
} else {
|
} else {
|
||||||
attachments.depth.view = imageView;
|
attachments.depth.view = imageView;
|
||||||
attachments.depth.layout = imageView->pickLayout(VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
|
attachments.depth.layout = imageView->pickLayout(VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
|
||||||
|
|
||||||
ops.barrier.srcStages = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
|
|
||||||
| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
|
|
||||||
ops.barrier.srcAccess = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
|
|
||||||
ops.depthOps = depthOp;
|
ops.depthOps = depthOp;
|
||||||
}
|
}
|
||||||
|
|
||||||
ops.barrier.dstStages = imageView->imageInfo().stages;
|
|
||||||
ops.barrier.dstAccess = imageView->imageInfo().access;
|
|
||||||
|
|
||||||
this->renderPassBindFramebuffer(
|
this->renderPassBindFramebuffer(
|
||||||
m_device->createFramebuffer(attachments),
|
m_device->createFramebuffer(attachments),
|
||||||
ops, 1, &clearValue);
|
ops, 1, &clearValue);
|
||||||
this->renderPassUnbindFramebuffer();
|
this->renderPassUnbindFramebuffer();
|
||||||
|
|
||||||
|
m_barriers.accessImage(
|
||||||
|
imageView->image(),
|
||||||
|
imageView->subresources(),
|
||||||
|
imageView->imageInfo().layout,
|
||||||
|
VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0,
|
||||||
|
imageView->imageInfo().layout,
|
||||||
|
imageView->imageInfo().stages,
|
||||||
|
imageView->imageInfo().access);
|
||||||
} else if (m_flags.test(DxvkContextFlag::GpRenderPassBound)) {
|
} else if (m_flags.test(DxvkContextFlag::GpRenderPassBound)) {
|
||||||
// Clear the attachment in quesion. For color images,
|
// Clear the attachment in quesion. For color images,
|
||||||
// the attachment index for the current subpass is
|
// the attachment index for the current subpass is
|
||||||
@ -1784,10 +1785,6 @@ namespace dxvk {
|
|||||||
attachments.color[0].view = imageView;
|
attachments.color[0].view = imageView;
|
||||||
attachments.color[0].layout = imageView->pickLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
|
attachments.color[0].layout = imageView->pickLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
|
||||||
|
|
||||||
ops.barrier.srcStages = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
|
||||||
ops.barrier.srcAccess = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT
|
|
||||||
| VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
|
||||||
|
|
||||||
ops.colorOps[0].loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
|
ops.colorOps[0].loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
|
||||||
ops.colorOps[0].loadLayout = imageView->imageInfo().layout;
|
ops.colorOps[0].loadLayout = imageView->imageInfo().layout;
|
||||||
ops.colorOps[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
ops.colorOps[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
||||||
@ -1796,11 +1793,6 @@ namespace dxvk {
|
|||||||
attachments.depth.view = imageView;
|
attachments.depth.view = imageView;
|
||||||
attachments.depth.layout = imageView->pickLayout(VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
|
attachments.depth.layout = imageView->pickLayout(VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
|
||||||
|
|
||||||
ops.barrier.srcStages = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
|
|
||||||
| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
|
|
||||||
ops.barrier.srcAccess = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT
|
|
||||||
| VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
|
||||||
|
|
||||||
ops.depthOps.loadOpD = VK_ATTACHMENT_LOAD_OP_LOAD;
|
ops.depthOps.loadOpD = VK_ATTACHMENT_LOAD_OP_LOAD;
|
||||||
ops.depthOps.loadOpS = VK_ATTACHMENT_LOAD_OP_LOAD;
|
ops.depthOps.loadOpS = VK_ATTACHMENT_LOAD_OP_LOAD;
|
||||||
ops.depthOps.loadLayout = imageView->imageInfo().layout;
|
ops.depthOps.loadLayout = imageView->imageInfo().layout;
|
||||||
@ -1809,14 +1801,20 @@ namespace dxvk {
|
|||||||
ops.depthOps.storeLayout = imageView->imageInfo().layout;
|
ops.depthOps.storeLayout = imageView->imageInfo().layout;
|
||||||
}
|
}
|
||||||
|
|
||||||
ops.barrier.dstStages = imageView->imageInfo().stages;
|
|
||||||
ops.barrier.dstAccess = imageView->imageInfo().access;
|
|
||||||
|
|
||||||
// We cannot leverage render pass clears
|
// We cannot leverage render pass clears
|
||||||
// because we clear only part of the view
|
// because we clear only part of the view
|
||||||
this->renderPassBindFramebuffer(
|
this->renderPassBindFramebuffer(
|
||||||
m_device->createFramebuffer(attachments),
|
m_device->createFramebuffer(attachments),
|
||||||
ops, 0, nullptr);
|
ops, 0, nullptr);
|
||||||
|
|
||||||
|
m_barriers.accessImage(
|
||||||
|
imageView->image(),
|
||||||
|
imageView->subresources(),
|
||||||
|
imageView->imageInfo().layout,
|
||||||
|
VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0,
|
||||||
|
imageView->imageInfo().layout,
|
||||||
|
imageView->imageInfo().stages,
|
||||||
|
imageView->imageInfo().access);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Perform the actual clear operation
|
// Perform the actual clear operation
|
||||||
|
Loading…
x
Reference in New Issue
Block a user