@@ -55,6 +55,9 @@ VulkanReplay::OutputWindow::OutputWindow()
55
55
bbmem = VK_NULL_HANDLE;
56
56
bbview = VK_NULL_HANDLE;
57
57
58
+ resolveimg = VK_NULL_HANDLE;
59
+ resolvemem = VK_NULL_HANDLE;
60
+
58
61
dsimg = VK_NULL_HANDLE;
59
62
dsmem = VK_NULL_HANDLE;
60
63
dsview = VK_NULL_HANDLE;
@@ -151,6 +154,13 @@ void VulkanReplay::OutputWindow::Destroy(WrappedVulkan *driver, VkDevice device)
151
154
vt->DestroyFramebuffer (Unwrap (device), Unwrap (fbdepth), NULL );
152
155
GetResourceManager ()->ReleaseWrappedResource (fbdepth);
153
156
157
+ vt->DestroyImage (Unwrap (device), Unwrap (resolveimg), NULL );
158
+ GetResourceManager ()->ReleaseWrappedResource (resolveimg);
159
+ vt->FreeMemory (Unwrap (device), Unwrap (resolvemem), NULL );
160
+ GetResourceManager ()->ReleaseWrappedResource (resolvemem);
161
+
162
+ resolveimg = VK_NULL_HANDLE;
163
+ resolvemem = VK_NULL_HANDLE;
154
164
dsview = VK_NULL_HANDLE;
155
165
dsimg = VK_NULL_HANDLE;
156
166
dsmem = VK_NULL_HANDLE;
@@ -450,6 +460,30 @@ void VulkanReplay::OutputWindow::Create(WrappedVulkan *driver, VkDevice device,
450
460
RDCASSERTEQUAL (vkr, VK_SUCCESS);
451
461
452
462
GetResourceManager ()->WrapResource (Unwrap (device), dsview);
463
+
464
+ // create resolve target, since it must precisely match the pre-resolve format, it doesn't allow
465
+ // any format conversion.
466
+ imInfo.samples = VK_SAMPLE_COUNT_1_BIT;
467
+ imInfo.format = imformat;
468
+ imInfo.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
469
+
470
+ vkr = vt->CreateImage (Unwrap (device), &imInfo, NULL , &resolveimg);
471
+ RDCASSERTEQUAL (vkr, VK_SUCCESS);
472
+
473
+ GetResourceManager ()->WrapResource (Unwrap (device), resolveimg);
474
+
475
+ vt->GetImageMemoryRequirements (Unwrap (device), Unwrap (resolveimg), &mrq);
476
+
477
+ allocInfo.allocationSize = mrq.size ;
478
+ allocInfo.memoryTypeIndex = driver->GetGPULocalMemoryIndex (mrq.memoryTypeBits );
479
+
480
+ vkr = vt->AllocateMemory (Unwrap (device), &allocInfo, NULL , &resolvemem);
481
+ RDCASSERTEQUAL (vkr, VK_SUCCESS);
482
+
483
+ GetResourceManager ()->WrapResource (Unwrap (device), resolvemem);
484
+
485
+ vkr = vt->BindImageMemory (Unwrap (device), Unwrap (resolveimg), Unwrap (resolvemem), 0 );
486
+ RDCASSERTEQUAL (vkr, VK_SUCCESS);
453
487
}
454
488
455
489
{
@@ -2713,22 +2747,48 @@ void VulkanReplay::FlipOutputWindow(uint64_t id)
2713
2747
},
2714
2748
};
2715
2749
2716
- #if ENABLED(MSAA_MESH_VIEW)
2717
- VkImageResolve resolve = {
2718
- {VK_IMAGE_ASPECT_COLOR_BIT, 0 , 0 , 1 }, {0 , 0 , 0 },
2719
- {VK_IMAGE_ASPECT_COLOR_BIT, 0 , 0 , 1 }, {0 , 0 , 0 },
2720
- {outw.width , outw.height , 1 },
2721
- };
2750
+ VkImage blitSource = outw.bb ;
2722
2751
2752
+ #if ENABLED(MSAA_MESH_VIEW)
2723
2753
if (outw.dsimg != VK_NULL_HANDLE)
2754
+ {
2755
+ VkImageResolve resolve = {
2756
+ {VK_IMAGE_ASPECT_COLOR_BIT, 0 , 0 , 1 }, {0 , 0 , 0 },
2757
+ {VK_IMAGE_ASPECT_COLOR_BIT, 0 , 0 , 1 }, {0 , 0 , 0 },
2758
+ {outw.width , outw.height , 1 },
2759
+ };
2760
+
2761
+ VkImageMemoryBarrier resolveBarrier = {
2762
+ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
2763
+ NULL ,
2764
+ VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT,
2765
+ VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT,
2766
+ VK_IMAGE_LAYOUT_UNDEFINED,
2767
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
2768
+ VK_QUEUE_FAMILY_IGNORED,
2769
+ VK_QUEUE_FAMILY_IGNORED,
2770
+ Unwrap (outw.resolveimg ),
2771
+ {VK_IMAGE_ASPECT_COLOR_BIT, 0 , 1 , 0 , 1 }};
2772
+
2773
+ // discard previous contents of resolve buffer and finish any work with it.
2774
+ DoPipelineBarrier (cmd, 1 , &resolveBarrier);
2775
+
2776
+ // resolve from the backbuffer to resolve buffer (identical format)
2724
2777
vt->CmdResolveImage (Unwrap (cmd), Unwrap (outw.bb ), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2725
- Unwrap (outw.colimg [outw.curidx ]), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1 ,
2726
- &resolve);
2727
- else
2778
+ Unwrap (outw.resolveimg ), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1 , &resolve);
2779
+
2780
+ // wait for resolve to finish before we blit
2781
+ blitSource = outw.resolveimg ;
2782
+
2783
+ resolveBarrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
2784
+ resolveBarrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
2785
+ DoPipelineBarrier (cmd, 1 , &resolveBarrier);
2786
+ }
2728
2787
#endif
2729
- vt->CmdBlitImage (Unwrap (cmd), Unwrap (outw.bb ), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2730
- Unwrap (outw.colimg [outw.curidx ]), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1 ,
2731
- &blit, VK_FILTER_NEAREST);
2788
+
2789
+ vt->CmdBlitImage (Unwrap (cmd), Unwrap (blitSource), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2790
+ Unwrap (outw.colimg [outw.curidx ]), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1 , &blit,
2791
+ VK_FILTER_NEAREST);
2732
2792
2733
2793
outw.bbBarrier .srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
2734
2794
outw.bbBarrier .dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
0 commit comments