|
@@ -1597,6 +1597,7 @@ static void ImGui_ImplVulkan_CreateWindow(ImGuiViewport* viewport)
|
|
|
|
|
|
// Create SwapChain, RenderPass, Framebuffer, etc.
|
|
|
wd->ClearEnable = (viewport->Flags & ImGuiViewportFlags_NoRendererClear) ? false : true;
|
|
|
+ wd->UseDynamicRendering = v->UseDynamicRendering;
|
|
|
ImGui_ImplVulkanH_CreateOrResizeWindow(v->Instance, v->PhysicalDevice, v->Device, wd, v->QueueFamily, v->Allocator, (int)viewport->Size.x, (int)viewport->Size.y, v->MinImageCount);
|
|
|
vd->WindowOwned = true;
|
|
|
}
|
|
@@ -1662,7 +1663,45 @@ static void ImGui_ImplVulkan_RenderWindow(ImGuiViewport* viewport, void*)
|
|
|
{
|
|
|
ImVec4 clear_color = ImVec4(0.0f, 0.0f, 0.0f, 1.0f);
|
|
|
memcpy(&wd->ClearValue.color.float32[0], &clear_color, 4 * sizeof(float));
|
|
|
-
|
|
|
+ }
|
|
|
+#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|
|
|
+ if (v->UseDynamicRendering)
|
|
|
+ {
|
|
|
+ // Transition swapchain image to a layout suitable for drawing.
|
|
|
+ VkImageMemoryBarrier barrier = {};
|
|
|
+ barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
|
|
|
+ barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
|
|
+ barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
|
|
+ barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
|
|
+ barrier.image = fd->Backbuffer;
|
|
|
+ barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
|
|
+ barrier.subresourceRange.levelCount = 1;
|
|
|
+ barrier.subresourceRange.layerCount = 1;
|
|
|
+ vkCmdPipelineBarrier(fd->CommandBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0, 0, nullptr, 0, nullptr, 1, &barrier);
|
|
|
+
|
|
|
+ VkRenderingAttachmentInfo attachmentInfo = {};
|
|
|
+ attachmentInfo.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR;
|
|
|
+ attachmentInfo.imageView = fd->BackbufferView;
|
|
|
+ attachmentInfo.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
|
|
+ attachmentInfo.resolveMode = VK_RESOLVE_MODE_NONE;
|
|
|
+ attachmentInfo.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
|
|
|
+ attachmentInfo.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
|
|
+ attachmentInfo.clearValue = wd->ClearValue;
|
|
|
+
|
|
|
+ VkRenderingInfo renderingInfo = {};
|
|
|
+ renderingInfo.sType = VK_STRUCTURE_TYPE_RENDERING_INFO_KHR;
|
|
|
+ renderingInfo.renderArea.extent.width = wd->Width;
|
|
|
+ renderingInfo.renderArea.extent.height = wd->Height;
|
|
|
+ renderingInfo.layerCount = 1;
|
|
|
+ renderingInfo.viewMask = 0;
|
|
|
+ renderingInfo.colorAttachmentCount = 1;
|
|
|
+ renderingInfo.pColorAttachments = &attachmentInfo;
|
|
|
+
|
|
|
+ ImGuiImplVulkanFuncs_vkCmdBeginRenderingKHR(fd->CommandBuffer, &renderingInfo);
|
|
|
+ }
|
|
|
+ else
|
|
|
+#endif
|
|
|
+ {
|
|
|
VkRenderPassBeginInfo info = {};
|
|
|
info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
|
|
|
info.renderPass = wd->RenderPass;
|
|
@@ -1678,7 +1717,28 @@ static void ImGui_ImplVulkan_RenderWindow(ImGuiViewport* viewport, void*)
|
|
|
ImGui_ImplVulkan_RenderDrawData(viewport->DrawData, fd->CommandBuffer, wd->Pipeline);
|
|
|
|
|
|
{
|
|
|
- vkCmdEndRenderPass(fd->CommandBuffer);
|
|
|
+#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|
|
|
+ if (v->UseDynamicRendering)
|
|
|
+ {
|
|
|
+ ImGuiImplVulkanFuncs_vkCmdEndRenderingKHR(fd->CommandBuffer);
|
|
|
+
|
|
|
+ // Transition image to a layout suitable for presentation
|
|
|
+ VkImageMemoryBarrier barrier = {};
|
|
|
+ barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
|
|
|
+ barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
|
|
+ barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
|
|
+ barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
|
|
|
+ barrier.image = fd->Backbuffer;
|
|
|
+ barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
|
|
+ barrier.subresourceRange.levelCount = 1;
|
|
|
+ barrier.subresourceRange.layerCount = 1;
|
|
|
+ vkCmdPipelineBarrier(fd->CommandBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 0, nullptr, 0, nullptr, 1, &barrier);
|
|
|
+ }
|
|
|
+ else
|
|
|
+#endif
|
|
|
+ {
|
|
|
+ vkCmdEndRenderPass(fd->CommandBuffer);
|
|
|
+ }
|
|
|
{
|
|
|
VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
|
|
VkSubmitInfo info = {};
|