1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-15 07:29:17 +01:00

[dxvk] Fix actual render target layout transitions for 3D images

Also, only emit transitions if the layouts differ.
This commit is contained in:
Philip Rebohle 2021-02-10 18:57:20 +01:00
parent bd87c12138
commit 0956050db6
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99

View File

@ -1745,7 +1745,7 @@ namespace dxvk {
if (clearAspects & VK_IMAGE_ASPECT_STENCIL_BIT) if (clearAspects & VK_IMAGE_ASPECT_STENCIL_BIT)
depthOp.loadOpS = VK_ATTACHMENT_LOAD_OP_CLEAR; depthOp.loadOpS = VK_ATTACHMENT_LOAD_OP_CLEAR;
bool is3D = imageView->imageInfo().type != VK_IMAGE_TYPE_3D; bool is3D = imageView->imageInfo().type == VK_IMAGE_TYPE_3D;
if (clearAspects == imageView->info().aspect && !is3D) { if (clearAspects == imageView->info().aspect && !is3D) {
colorOp.loadLayout = VK_IMAGE_LAYOUT_UNDEFINED; colorOp.loadLayout = VK_IMAGE_LAYOUT_UNDEFINED;
@ -4066,24 +4066,27 @@ namespace dxvk {
DxvkBarrierSet& barriers, DxvkBarrierSet& barriers,
const DxvkAttachment& attachment, const DxvkAttachment& attachment,
VkImageLayout oldLayout) { VkImageLayout oldLayout) {
if (oldLayout != attachment.view->imageInfo().layout) {
barriers.accessImage( barriers.accessImage(
attachment.view->image(), attachment.view->image(),
attachment.view->subresources(), oldLayout, attachment.view->imageSubresources(), oldLayout,
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
attachment.view->imageInfo().layout, attachment.view->imageInfo().layout,
attachment.view->imageInfo().stages, attachment.view->imageInfo().stages,
attachment.view->imageInfo().access); attachment.view->imageInfo().access);
} }
}
void DxvkContext::transitionDepthAttachment( void DxvkContext::transitionDepthAttachment(
DxvkBarrierSet& barriers, DxvkBarrierSet& barriers,
const DxvkAttachment& attachment, const DxvkAttachment& attachment,
VkImageLayout oldLayout) { VkImageLayout oldLayout) {
if (oldLayout != attachment.view->imageInfo().layout) {
barriers.accessImage( barriers.accessImage(
attachment.view->image(), attachment.view->image(),
attachment.view->subresources(), oldLayout, attachment.view->imageSubresources(), oldLayout,
VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
oldLayout != VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL oldLayout != VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL
@ -4092,6 +4095,7 @@ namespace dxvk {
attachment.view->imageInfo().stages, attachment.view->imageInfo().stages,
attachment.view->imageInfo().access); attachment.view->imageInfo().access);
} }
}
void DxvkContext::updateRenderTargetLayouts( void DxvkContext::updateRenderTargetLayouts(