use dynamic rendering instead of render passes

This commit is contained in:
Matthew 2026-06-14 15:37:47 +10:00
parent c9aca769b2
commit 2f8929d5fb
2 changed files with 92 additions and 61 deletions

View File

@ -831,22 +831,41 @@ BeginRendering()
{ color: { float32: g_vk.depth_clear } },
];
VkRenderPassBeginInfo pass_info = {
sType: VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
renderPass: g_vk.render_pass,
framebuffer: g_vk.framebuffer,
VkRenderingAttachmentInfo[2] attach_descriptions = [
{
sType: VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO,
imageView: g_vk.draw_image.image.view,
imageLayout: VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
loadOp: VK_ATTACHMENT_LOAD_OP_CLEAR,
storeOp: VK_ATTACHMENT_STORE_OP_STORE,
clearValue: { color: { float32: g_vk.color_clear } },
},
{
sType: VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO,
imageView: g_vk.depth_image.image.view,
imageLayout: VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
loadOp: VK_ATTACHMENT_LOAD_OP_CLEAR,
storeOp: VK_ATTACHMENT_STORE_OP_STORE,
clearValue: { color: { float32: g_vk.depth_clear } },
},
];
VkRenderingInfo render_info = {
sType: VK_STRUCTURE_TYPE_RENDERING_INFO,
layerCount: 1,
colorAttachmentCount: 1,
pColorAttachments: &attach_descriptions[0],
pDepthAttachment: &attach_descriptions[1],
renderArea: {
offset: { x: 0, y: 0 },
extent: {
width: g_vk.swapchain_extent.width,
height: g_vk.swapchain_extent.height,
},
},
clearValueCount: cast(u32)clear_color.length,
pClearValues: clear_color.ptr,
}
};
vkCmdBeginRenderPass(g_vk.cmd, &pass_info, VK_SUBPASS_CONTENTS_INLINE);
vkCmdBeginRendering(g_vk.cmd, &render_info);
}
u32[2]
@ -883,7 +902,7 @@ CopyToPresentImage(Descriptor* descriptor, UVec2 extent)
void
FinishRendering()
{
vkCmdEndRenderPass(g_vk.cmd);
vkCmdEndRendering(g_vk.cmd);
}
void
@ -3105,9 +3124,15 @@ Init(VulkanBuildInfo build_info, u64 permanent_mem, u64 frame_mem)
count += 1;
}
VkPhysicalDeviceDynamicRenderingFeaturesKHR dynamic_rendering = {
sType: VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES,
pNext: null,
dynamicRendering: VK_TRUE,
};
VkPhysicalDeviceExtendedDynamicStateFeaturesEXT extended_dynamic_state = {
sType: VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT,
pNext: null,
pNext: &dynamic_rendering,
extendedDynamicState: VK_TRUE,
};

View File

@ -125,11 +125,15 @@ PFN_vkCmdSetStencilOpEXT vkCmdSetStencilOpEXT;
PFN_vkCmdSetStencilReference vkCmdSetStencilReference;
PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask;
PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask;
PFN_vkCmdBeginRenderingKHR vkCmdBeginRenderingKHR;
PFN_vkCmdEndRenderingKHR vkCmdEndRenderingKHR;
alias vkQueueSubmit2 = vkQueueSubmit2KHR;
alias vkCmdPipelineBarrier2 = vkCmdPipelineBarrier2KHR;
alias vkCmdSetStencilTestEnable = vkCmdSetStencilTestEnableEXT;
alias vkCmdSetStencilOp = vkCmdSetStencilOpEXT;
alias vkCmdBeginRendering = vkCmdBeginRenderingKHR;
alias vkCmdEndRendering = vkCmdEndRenderingKHR;
static string
LoadDeviceFunc(alias fn)()
@ -228,6 +232,8 @@ LoadDeviceFunctions()
mixin(LoadDeviceFunc!(vkCmdSetStencilReference));
mixin(LoadDeviceFunc!(vkCmdSetStencilCompareMask));
mixin(LoadDeviceFunc!(vkCmdSetStencilWriteMask));
mixin(LoadDeviceFunc!(vkCmdBeginRenderingKHR));
mixin(LoadDeviceFunc!(vkCmdEndRenderingKHR));
version(AMD_GPU) version(VULKAN_DEBUG)
{