Skip to content

Commit 2ebb8bd

Browse files
committed
feat(vulkan): implement secondary command buffer system for improved rendering
- Introduced a new secondary command buffer system to enhance parallel command recording, allowing for more efficient rendering of draw surfaces. - Implemented functions for initializing, shutting down, and managing secondary command buffers, improving the Vulkan renderer's performance. - Updated command buffer management to utilize per-frame fences, ensuring better synchronization and resource handling during rendering. - Enhanced error handling for device loss scenarios in secondary buffer operations, contributing to improved stability and recovery. - Added comprehensive documentation and comments to clarify the functionality and usage of the secondary command buffer system. This commit significantly enhances the Vulkan renderer's capability to handle complex rendering tasks, leading to better performance and maintainability.
1 parent 6db0603 commit 2ebb8bd

5 files changed

Lines changed: 609 additions & 69 deletions

File tree

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1547,6 +1547,7 @@ SET(RENDERER_VK_SRCS
15471547
src/renderers/vulkan/vk_utils.c
15481548
src/renderers/vulkan/vk_commands.c
15491549
src/renderers/vulkan/vk_resource_state.c
1550+
src/renderers/vulkan/vk_secondary_buffers.c
15501551
src/renderers/vulkan/vk_pipeline.c
15511552
src/renderers/vulkan/vk_shader_manager.cpp
15521553
src/renderers/vulkan/vk_shader_validation.c

src/renderers/vulkan/vk.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ void *Sys_LoadFunction(void *handle, const char *name) {
110110
#include "vk_world_effects.h"
111111
#include "vk_frame.h"
112112
#include "vk_resource_state.h"
113+
#include "vk_secondary_buffers.h"
113114

114115
#include "vk_post_process.h"
115116
#ifdef USE_VULKAN_RAY_TRACING
@@ -569,6 +570,7 @@ PFN_vkCmdEndRenderPass qvkCmdEndRenderPass;
569570
PFN_vkCmdNextSubpass qvkCmdNextSubpass;
570571
PFN_vkCmdPipelineBarrier qvkCmdPipelineBarrier;
571572
PFN_vkCmdPushConstants qvkCmdPushConstants;
573+
PFN_vkCmdExecuteCommands qvkCmdExecuteCommands;
572574
PFN_vkCmdSetDepthBias qvkCmdSetDepthBias;
573575
PFN_vkCmdSetScissor qvkCmdSetScissor;
574576
PFN_vkCmdSetViewport qvkCmdSetViewport;
@@ -3749,6 +3751,7 @@ static void init_vulkan_library( void )
37493751
INIT_DEVICE_FUNCTION(vkCmdDraw)
37503752
INIT_DEVICE_FUNCTION(vkCmdDrawIndexed)
37513753
INIT_DEVICE_FUNCTION(vkCmdDrawIndexedIndirect)
3754+
INIT_DEVICE_FUNCTION(vkCmdExecuteCommands)
37523755
INIT_DEVICE_FUNCTION(vkCmdEndRenderPass)
37533756
INIT_DEVICE_FUNCTION(vkCmdNextSubpass)
37543757
INIT_DEVICE_FUNCTION(vkCmdPipelineBarrier)
@@ -4326,6 +4329,7 @@ static void __attribute__((unused)) deinit_device_functions( void )
43264329
qvkCmdDraw = NULL;
43274330
qvkCmdDrawIndexed = NULL;
43284331
qvkCmdDrawIndexedIndirect = NULL;
4332+
qvkCmdExecuteCommands = NULL;
43294333
qvkCmdEndRenderPass = NULL;
43304334
qvkCmdNextSubpass = NULL;
43314335
qvkCmdPipelineBarrier = NULL;
@@ -4742,6 +4746,9 @@ void vk_initialize( void )
47424746

47434747
// Initialize resource state tracker
47444748
vk_resource_state_init();
4749+
4750+
// Initialize secondary command buffer system
4751+
vk_secondary_buffers_init();
47454752
// Optional: initialize timeline semaphore if available
47464753
#ifdef VK_KHR_TIMELINE_SEMAPHORE
47474754
if (qvkCreateSemaphore) {
@@ -9793,6 +9800,9 @@ void vk_shutdown( refShutdownCode_t code ) {
97939800

97949801
// Shutdown resource state tracker
97959802
vk_resource_state_shutdown();
9803+
9804+
// Shutdown secondary command buffer system
9805+
vk_secondary_buffers_shutdown();
97969806

97979807
// Ray tracing and raymarching moved to RTX renderer only
97989808

0 commit comments

Comments
 (0)