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 } }, { color: { float32: g_vk.depth_clear } },
]; ];
VkRenderPassBeginInfo pass_info = { VkRenderingAttachmentInfo[2] attach_descriptions = [
sType: VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, {
renderPass: g_vk.render_pass, sType: VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO,
framebuffer: g_vk.framebuffer, imageView: g_vk.draw_image.image.view,
renderArea: { imageLayout: VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
offset: { x: 0, y: 0 }, loadOp: VK_ATTACHMENT_LOAD_OP_CLEAR,
extent: { storeOp: VK_ATTACHMENT_STORE_OP_STORE,
width: g_vk.swapchain_extent.width, clearValue: { color: { float32: g_vk.color_clear } },
height: g_vk.swapchain_extent.height, },
}, {
}, sType: VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO,
clearValueCount: cast(u32)clear_color.length, imageView: g_vk.depth_image.image.view,
pClearValues: clear_color.ptr, 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 } },
},
];
vkCmdBeginRenderPass(g_vk.cmd, &pass_info, VK_SUBPASS_CONTENTS_INLINE); 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,
},
}
};
vkCmdBeginRendering(g_vk.cmd, &render_info);
} }
u32[2] u32[2]
@ -883,7 +902,7 @@ CopyToPresentImage(Descriptor* descriptor, UVec2 extent)
void void
FinishRendering() FinishRendering()
{ {
vkCmdEndRenderPass(g_vk.cmd); vkCmdEndRendering(g_vk.cmd);
} }
void void
@ -2901,9 +2920,9 @@ Init(VulkanBuildInfo build_info, u64 permanent_mem, u64 frame_mem)
version(Windows) version(Windows)
{ {
VkWin32SurfaceCreateInfoKHR surface_info = { VkWin32SurfaceCreateInfoKHR surface_info = {
sType: VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR, sType: VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR,
hinstance: g_vk.platform_handles.instance, hinstance: g_vk.platform_handles.instance,
hwnd: g_vk.platform_handles.handle, hwnd: g_vk.platform_handles.handle,
}; };
VkResult result = vkCreateWin32SurfaceKHR(g_vk.instance, &surface_info, null, &g_vk.surface); VkResult result = vkCreateWin32SurfaceKHR(g_vk.instance, &surface_info, null, &g_vk.surface);
@ -3078,8 +3097,8 @@ Init(VulkanBuildInfo build_info, u64 permanent_mem, u64 frame_mem)
} }
discrete_candidate = cast(bool)discrete; discrete_candidate = cast(bool)discrete;
candidate = current; candidate = current;
physical_device = dev; physical_device = dev;
} }
if(physical_device) if(physical_device)
@ -3088,50 +3107,56 @@ Init(VulkanBuildInfo build_info, u64 permanent_mem, u64 frame_mem)
f32 priority = 1.0f; f32 priority = 1.0f;
count = 1; count = 1;
queue_info[0].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; queue_info[0].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
queue_info[0].queueFamilyIndex = candidate.gfx_index; queue_info[0].queueFamilyIndex = candidate.gfx_index;
queue_info[0].queueCount = 1; queue_info[0].queueCount = 1;
queue_info[0].pQueuePriorities = &priority; queue_info[0].pQueuePriorities = &priority;
queue_info[0].flags = 0; queue_info[0].flags = 0;
if(!candidate.single_queue) if(!candidate.single_queue)
{ {
queue_info[1].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; queue_info[1].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
queue_info[1].queueFamilyIndex = candidate.tfer_index; queue_info[1].queueFamilyIndex = candidate.tfer_index;
queue_info[1].queueCount = 1; queue_info[1].queueCount = 1;
queue_info[1].pQueuePriorities = &priority; queue_info[1].pQueuePriorities = &priority;
queue_info[1].flags = 0; queue_info[1].flags = 0;
count += 1; count += 1;
} }
VkPhysicalDeviceDynamicRenderingFeaturesKHR dynamic_rendering = {
sType: VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES,
pNext: null,
dynamicRendering: VK_TRUE,
};
VkPhysicalDeviceExtendedDynamicStateFeaturesEXT extended_dynamic_state = { VkPhysicalDeviceExtendedDynamicStateFeaturesEXT extended_dynamic_state = {
sType: VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT, sType: VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT,
pNext: null, pNext: &dynamic_rendering,
extendedDynamicState: VK_TRUE, extendedDynamicState: VK_TRUE,
}; };
VkPhysicalDeviceSynchronization2Features synchronization2 = { VkPhysicalDeviceSynchronization2Features synchronization2 = {
sType: VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES, sType: VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES,
pNext: &extended_dynamic_state, pNext: &extended_dynamic_state,
synchronization2: VK_TRUE, synchronization2: VK_TRUE,
}; };
VkPhysicalDeviceVulkan12Features features_12 = { VkPhysicalDeviceVulkan12Features features_12 = {
sType: VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, sType: VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES,
pNext: &synchronization2, pNext: &synchronization2,
descriptorIndexing: VK_TRUE, descriptorIndexing: VK_TRUE,
bufferDeviceAddress: VK_TRUE, bufferDeviceAddress: VK_TRUE,
descriptorBindingUniformBufferUpdateAfterBind: VK_TRUE, descriptorBindingUniformBufferUpdateAfterBind: VK_TRUE,
descriptorBindingSampledImageUpdateAfterBind: VK_TRUE, descriptorBindingSampledImageUpdateAfterBind: VK_TRUE,
descriptorBindingStorageImageUpdateAfterBind: VK_TRUE, descriptorBindingStorageImageUpdateAfterBind: VK_TRUE,
descriptorBindingStorageBufferUpdateAfterBind: VK_TRUE, descriptorBindingStorageBufferUpdateAfterBind: VK_TRUE,
descriptorBindingStorageTexelBufferUpdateAfterBind: VK_TRUE, descriptorBindingStorageTexelBufferUpdateAfterBind: VK_TRUE,
descriptorBindingPartiallyBound: VK_TRUE, descriptorBindingPartiallyBound: VK_TRUE,
shaderSampledImageArrayNonUniformIndexing: VK_TRUE, shaderSampledImageArrayNonUniformIndexing: VK_TRUE,
shaderUniformBufferArrayNonUniformIndexing: VK_TRUE, shaderUniformBufferArrayNonUniformIndexing: VK_TRUE,
runtimeDescriptorArray: VK_TRUE, runtimeDescriptorArray: VK_TRUE,
storageBuffer8BitAccess: VK_TRUE, storageBuffer8BitAccess: VK_TRUE,
}; };
VkPhysicalDeviceVulkan11Features features_11 = { VkPhysicalDeviceVulkan11Features features_11 = {
@ -3144,22 +3169,22 @@ Init(VulkanBuildInfo build_info, u64 permanent_mem, u64 frame_mem)
pNext: &features_11, pNext: &features_11,
features: { features: {
shaderUniformBufferArrayDynamicIndexing: VK_TRUE, shaderUniformBufferArrayDynamicIndexing: VK_TRUE,
shaderSampledImageArrayDynamicIndexing: VK_TRUE, shaderSampledImageArrayDynamicIndexing: VK_TRUE,
shaderStorageBufferArrayDynamicIndexing: VK_TRUE, shaderStorageBufferArrayDynamicIndexing: VK_TRUE,
shaderStorageImageArrayDynamicIndexing: VK_TRUE, shaderStorageImageArrayDynamicIndexing: VK_TRUE,
samplerAnisotropy: VK_TRUE, samplerAnisotropy: VK_TRUE,
fragmentStoresAndAtomics: VK_TRUE, fragmentStoresAndAtomics: VK_TRUE,
}, },
}; };
VkDeviceCreateInfo device_info = { VkDeviceCreateInfo device_info = {
sType: VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, sType: VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
pNext: &features, pNext: &features,
ppEnabledExtensionNames: VK_DEVICE_EXTENSIONS.ptr, ppEnabledExtensionNames: VK_DEVICE_EXTENSIONS.ptr,
enabledExtensionCount: cast(u32)VK_DEVICE_EXTENSIONS.length, enabledExtensionCount: cast(u32)VK_DEVICE_EXTENSIONS.length,
queueCreateInfoCount: count, queueCreateInfoCount: count,
pQueueCreateInfos: queue_info.ptr, pQueueCreateInfos: queue_info.ptr,
pEnabledFeatures: null, pEnabledFeatures: null,
}; };
VkResult result = vkCreateDevice(physical_device, &device_info, null, &g_vk.device); VkResult result = vkCreateDevice(physical_device, &device_info, null, &g_vk.device);
@ -3205,16 +3230,16 @@ Init(VulkanBuildInfo build_info, u64 permanent_mem, u64 frame_mem)
{ {
VmaVulkanFunctions vk_functions = { VmaVulkanFunctions vk_functions = {
vkGetInstanceProcAddr: vkGetInstanceProcAddr, vkGetInstanceProcAddr: vkGetInstanceProcAddr,
vkGetDeviceProcAddr: vkGetDeviceProcAddr, vkGetDeviceProcAddr: vkGetDeviceProcAddr,
}; };
VmaAllocatorCreateInfo info = { VmaAllocatorCreateInfo info = {
flags: VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT, flags: VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT,
vulkanApiVersion: VK_MAKE_API_VERSION(0, 1, 2, 0), vulkanApiVersion: VK_MAKE_API_VERSION(0, 1, 2, 0),
pVulkanFunctions: &vk_functions, pVulkanFunctions: &vk_functions,
physicalDevice: g_vk.physical_device, physicalDevice: g_vk.physical_device,
device: g_vk.device, device: g_vk.device,
instance: g_vk.instance, instance: g_vk.instance,
}; };
VkResult result = vmaCreateAllocator(&info, &g_vk.vma); VkResult result = vmaCreateAllocator(&info, &g_vk.vma);
@ -3243,12 +3268,12 @@ Init(VulkanBuildInfo build_info, u64 permanent_mem, u64 frame_mem)
}; };
VkCommandBufferAllocateInfo cmd_info = { VkCommandBufferAllocateInfo cmd_info = {
sType: VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, sType: VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
commandBufferCount: 1, commandBufferCount: 1,
level: VK_COMMAND_BUFFER_LEVEL_PRIMARY, level: VK_COMMAND_BUFFER_LEVEL_PRIMARY,
}; };
u32 sem_count = cast(u32)g_vk.present_images.length; u32 sem_count = cast(u32)g_vk.present_images.length;
g_vk.submit_sems = Alloc!(VkSemaphore)(arena, sem_count); g_vk.submit_sems = Alloc!(VkSemaphore)(arena, sem_count);
VkResult result; VkResult result;

View File

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