Skip to content

Commit

Permalink
Merge remote-tracking branch 'gitlab/main'
Browse files Browse the repository at this point in the history
  • Loading branch information
ravi688 committed May 24, 2024
2 parents de1ae3f + 156c26e commit c0e63a2
Show file tree
Hide file tree
Showing 22 changed files with 723 additions and 229 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ RENDERER_API void vulkan_render_pass_create_info_builder_destroy(vulkan_render_p

RENDERER_API void vulkan_render_pass_create_info_builder_add(vulkan_render_pass_create_info_builder_t* builder, u32 count);
RENDERER_API void vulkan_render_pass_create_info_builder_bind(vulkan_render_pass_create_info_builder_t* builder, u32 index);
RENDERER_API void vulkan_render_pass_create_info_builder_add_next(vulkan_render_pass_create_info_builder_t* builder);

RENDERER_API vulkan_render_pass_create_info_t* vulkan_render_pass_create_info_builder_get(vulkan_render_pass_create_info_builder_t* builder);
RENDERER_API u32 vulkan_render_pass_create_info_builder_get_count(vulkan_render_pass_create_info_builder_t* builder);
Expand All @@ -94,6 +95,7 @@ RENDERER_API void vulkan_render_pass_create_info_builder_set_subpasses(vulkan_re
RENDERER_API void vulkan_render_pass_create_info_builder_set_subpasses_builder(vulkan_render_pass_create_info_builder_t* builder, vulkan_subpass_create_info_builder_t* sci_builder, bool is_destroy);
RENDERER_API void vulkan_render_pass_create_info_builder_add_dependencies(vulkan_render_pass_create_info_builder_t* builder, VkSubpassDependency* dependencies, u32 dependency_count);
RENDERER_API void vulkan_render_pass_create_info_builder_set_dependencies(vulkan_render_pass_create_info_builder_t* builder, VkSubpassDependency* dependencies, u32 dependency_count);
RENDERER_API buffer_t* vulkan_render_pass_create_info_builder_get_dependencies_buffer(vulkan_render_pass_create_info_builder_t* builder);



Expand Down
20 changes: 17 additions & 3 deletions include/renderer/internal/vulkan/vulkan_renderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,21 @@ typedef struct vulkan_renderer_t
VkCommandPool vo_command_pool;
VkDescriptorPool vo_descriptor_pool;

VkSemaphore vo_image_available_semaphore;
VkSemaphore vo_render_finished_semaphore;
VkFence vo_fence;
/* index of the current frame, it ranges from 0 (inclusive) to swapchain->image_count (exclusive) */
u32 current_frame_index;

struct
{
/* number of VkSemaphore or VkFence objects in vo_image_available_semaphores and vo_render_finished_semaphores, or vo_fences */
u32 primitive_count;
/* semaphores for max number of frames in flight to indicate presentation has finished for them */
VkSemaphore* vo_image_available_semaphores;
/* semaphores for max number of frames in flight to indicate rendering has finished on them */
VkSemaphore* vo_render_finished_semaphores;
/* fences */
VkFence* vo_fences;
} render_present_sync_primitives;


/* global_set::screen_info
* {
Expand Down Expand Up @@ -142,6 +154,8 @@ RENDERER_API void vulkan_renderer_begin_frame(vulkan_renderer_t* renderer);
/* ends the command buffer recording */
RENDERER_API void vulkan_renderer_end_frame(vulkan_renderer_t* renderer);

RENDERER_API void vulkan_renderer_wait_idle(vulkan_renderer_t* renderer);

RENDERER_API render_window_t* vulkan_renderer_get_window(vulkan_renderer_t* renderer);

END_CPP_COMPATIBLE
2 changes: 1 addition & 1 deletion include/renderer/internal/vulkan/vulkan_swapchain.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,6 @@ RENDERER_API void vulkan_swapchain_create_no_alloc(vulkan_renderer_t* renderer,
RENDERER_API void vulkan_swapchain_destroy(vulkan_swapchain_t* swapchain);
RENDERER_API void vulkan_swapchain_release_resources(vulkan_swapchain_t* swapchain);
RENDERER_API void vulkan_swapchain_refresh(vulkan_swapchain_t* swapchain, vulkan_swapchain_create_info_t* create_info);
RENDERER_API u32 vulkan_swapchain_acquire_next_image(vulkan_swapchain_t* swapchain);
RENDERER_API u32 vulkan_swapchain_acquire_next_image(vulkan_swapchain_t* swapchain, VkSemaphore signal_semaphore);

END_CPP_COMPATIBLE
2 changes: 2 additions & 0 deletions include/renderer/memory_allocation_type.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@ typedef enum memory_allocation_type_t
MEMORY_ALLOCATION_TYPE_OBJ_VKAPI_ATTACHMENT_DESCRIPTION,
MEMORY_ALLOCATION_TYPE_OBJ_VKAPI_DESCRIPTOR_SET_LAYOUT_BINDING_ARRAY,
MEMORY_ALLOCATION_TYPE_OBJ_VKAPI_DEVICE_QUEUE_CREATE_INFO_ARRAY,
MEMORY_ALLOCATION_TYPE_OBJ_VKAPI_SEMAPHORE_ARRAY,
MEMORY_ALLOCATION_TYPE_OBJ_VKAPI_FENCE_ARRAY,

MEMORY_ALLOCATION_TYPE_OBJ_VKAPI_CLEAR_VALUE_ARRAY,
MEMORY_ALLOCATION_TYPE_OBJ_VKAPI_FORMAT_ARRAY,
Expand Down
2 changes: 2 additions & 0 deletions include/renderer/renderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,8 @@ RENDERER_API void renderer_begin_frame(renderer_t* renderer);
*/
RENDERER_API void renderer_end_frame(renderer_t* renderer);

RENDERER_API void renderer_wait_idle(renderer_t* renderer);

/* getters */
RENDERER_API render_window_t* renderer_get_window(renderer_t* renderer);
RENDERER_API shader_library_t* renderer_get_shader_library(renderer_t* renderer);
Expand Down
4 changes: 3 additions & 1 deletion source/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,9 @@ int main(int argc, const char** argv)
test->update(driver, deltaTime, test->user_data);
}

/* REASON: Takes too much time for complex allocation trees! */
/* we need to wait for the device to finish any pending tasks, so that all the resources/objects will be unreferenced
* , as test->terminate() destroys the test related objects etc. */
renderer_wait_idle(driver);
test->terminate(driver, test->user_data);
test_destroy(test);

Expand Down
5 changes: 5 additions & 0 deletions source/renderer/renderer.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,11 @@ RENDERER_API void renderer_end_frame(renderer_t* renderer)
vulkan_renderer_end_frame(renderer->vulkan_handle);
}

RENDERER_API void renderer_wait_idle(renderer_t* renderer)
{
vulkan_renderer_wait_idle(renderer->vulkan_handle);
}

/* getters */
RENDERER_API render_window_t* renderer_get_window(renderer_t* renderer)
{
Expand Down
9 changes: 7 additions & 2 deletions source/renderer/vulkan/vulkan_camera.c
Original file line number Diff line number Diff line change
Expand Up @@ -664,7 +664,7 @@ RENDERER_API void vulkan_camera_release_resources(vulkan_camera_t* camera)

UNUSED_FUNCTION static void transition_target_layout_for_write(VkFormat format, vulkan_image_view_t* view)
{
VkCommandBuffer cb = view->renderer->vo_command_buffers[view->renderer->swapchain->current_image_index];
VkCommandBuffer cb = view->renderer->vo_command_buffers[view->renderer->current_frame_index];
switch(format)
{
case VK_FORMAT_B8G8R8A8_SRGB:
Expand Down Expand Up @@ -696,7 +696,7 @@ UNUSED_FUNCTION static void transition_target_layout_for_write(VkFormat format,

static void transition_target_layout_for_sample(VkFormat format, vulkan_image_view_t* view)
{
VkCommandBuffer cb = view->renderer->vo_command_buffers[view->renderer->swapchain->current_image_index];
VkCommandBuffer cb = view->renderer->vo_command_buffers[view->renderer->current_frame_index];
switch(format)
{
case VK_FORMAT_B8G8R8A8_SRGB:
Expand Down Expand Up @@ -1370,6 +1370,11 @@ RENDERER_API void vulkan_camera_set_render_target(vulkan_camera_t* camera, vulka
else
camera->max_shot_count = 1;

/* setting to a different render targets might also destroy existing framebuffer objects
* , as per vulkan spec, VkFramebuffer object can only be destroyed if nothing is use it,
* therefore, make sure all of the command buffers have finished their execution and no one is referencing the VkFramebuffer objects */
vulkan_renderer_wait_idle(camera->renderer);

switch(target_type)
{
case VULKAN_CAMERA_RENDER_TARGET_TYPE_COLOR:
Expand Down
2 changes: 1 addition & 1 deletion source/renderer/vulkan/vulkan_descriptor_set.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ RENDERER_API void vulkan_descriptor_set_release_resources(vulkan_descriptor_set_

RENDERER_API void vulkan_descriptor_set_bind(vulkan_descriptor_set_t* set, u32 set_number, vulkan_pipeline_layout_t* pipeline_layout)
{
u32 image_index = set->renderer->swapchain->current_image_index;
u32 image_index = set->renderer->current_frame_index;
vkCmdBindDescriptorSets(set->renderer->vo_command_buffers[image_index], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout->vo_handle, set_number, 1, &set->vo_handle, 0, NULL);
}

Expand Down
2 changes: 1 addition & 1 deletion source/renderer/vulkan/vulkan_graphics_pipeline.c
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ RENDERER_API vulkan_graphics_pipeline_t* vulkan_graphics_pipeline_create(vulkan_

RENDERER_API void vulkan_graphics_pipeline_bind(vulkan_graphics_pipeline_t* pipeline)
{
AUTO command_buffer = pipeline->renderer->vo_command_buffers[pipeline->renderer->swapchain->current_image_index];
AUTO command_buffer = pipeline->renderer->vo_command_buffers[pipeline->renderer->current_frame_index];
vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline->vo_handle);

debug_assert__(!pipeline->is_user_defined_viewport, "For now let's focus on full render area of the render target\n");
Expand Down
6 changes: 3 additions & 3 deletions source/renderer/vulkan/vulkan_mesh.c
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ RENDERER_API void vulkan_mesh_draw_indexed_instanced_only(vulkan_mesh_t* mesh, u
_debug_assert__(mesh->index_buffer.buffer != NULL);
_debug_assert__(mesh->index_buffer.index_type != VK_INDEX_TYPE_MAX_ENUM);

VkCommandBuffer vo_command_buffer = mesh->renderer->vo_command_buffers[mesh->renderer->swapchain->current_image_index];
VkCommandBuffer vo_command_buffer = mesh->renderer->vo_command_buffers[mesh->renderer->current_frame_index];
vkCmdBindIndexBuffer(vo_command_buffer, mesh->index_buffer.buffer->vo_handle, 0, mesh->index_buffer.index_type);
vkCmdDrawIndexed(vo_command_buffer, mesh->index_buffer.buffer->count, instance_count, 0, 0, 0);

Expand All @@ -165,7 +165,7 @@ RENDERER_API void vulkan_mesh_bind_all_vertex_buffers(vulkan_mesh_t* mesh)

if(count > 0)
{
VkCommandBuffer vo_command_buffer = mesh->renderer->vo_command_buffers[mesh->renderer->swapchain->current_image_index];
VkCommandBuffer vo_command_buffer = mesh->renderer->vo_command_buffers[mesh->renderer->current_frame_index];
vulkan_command_bind_vertex_buffers(vo_command_buffer, bindings, buffers, count);
}
}
Expand All @@ -182,7 +182,7 @@ RENDERER_API void vulkan_mesh_draw_indexed_instanced(vulkan_mesh_t* mesh, u32 in
RENDERER_API void vulkan_mesh_draw_instanced(vulkan_mesh_t* mesh, u32 instance_count)
{
vulkan_mesh_bind_all_vertex_buffers(mesh);
VkCommandBuffer vo_command_buffer = mesh->renderer->vo_command_buffers[mesh->renderer->swapchain->current_image_index];
VkCommandBuffer vo_command_buffer = mesh->renderer->vo_command_buffers[mesh->renderer->current_frame_index];
vkCmdDraw(vo_command_buffer, CAST_TO(vulkan_vertex_buffer_t*, buf_get_ptr_at(&mesh->vertex_buffers, 0))->buffer->count, instance_count, 0, 0);

// set the binding index to zero, for the next frame
Expand Down
2 changes: 1 addition & 1 deletion source/renderer/vulkan/vulkan_pipeline_layout.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,6 @@ RENDERER_API void vulkan_pipeline_layout_release_resources(vulkan_pipeline_layou

RENDERER_API void vulkan_pipeline_layout_push_constants(vulkan_pipeline_layout_t* layout, VkShaderStageFlagBits stage_flags, u32 offset, u32 size, void* bytes)
{
VkCommandBuffer command_buffer = layout->renderer->vo_command_buffers[layout->renderer->swapchain->current_image_index];
VkCommandBuffer command_buffer = layout->renderer->vo_command_buffers[layout->renderer->current_frame_index];
vkCmdPushConstants(command_buffer, layout->vo_handle, stage_flags, offset, size, bytes);
}
6 changes: 3 additions & 3 deletions source/renderer/vulkan/vulkan_render_pass.c
Original file line number Diff line number Diff line change
Expand Up @@ -241,14 +241,14 @@ RENDERER_API void vulkan_render_pass_begin(vulkan_render_pass_t* render_pass, u3
.clearValueCount = render_pass->clear_value_count,
.pClearValues = render_pass->vo_clear_values
};
vkCmdBeginRenderPass(render_pass->renderer->vo_command_buffers[render_pass->renderer->swapchain->current_image_index], &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE);
vkCmdBeginRenderPass(render_pass->renderer->vo_command_buffers[render_pass->renderer->current_frame_index], &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE);

render_pass->current_subpass_index = 0;
}

RENDERER_API void vulkan_render_pass_end(vulkan_render_pass_t* render_pass)
{
vkCmdEndRenderPass(render_pass->renderer->vo_command_buffers[render_pass->renderer->swapchain->current_image_index]);
vkCmdEndRenderPass(render_pass->renderer->vo_command_buffers[render_pass->renderer->current_frame_index]);
}

RENDERER_API void vulkan_render_pass_next(vulkan_render_pass_t* render_pass)
Expand All @@ -258,6 +258,6 @@ RENDERER_API void vulkan_render_pass_next(vulkan_render_pass_t* render_pass)
log_wrn("There are only %u subpasses but you're trying to exceed it\n", render_pass->subpass_count);
return;
}
vkCmdNextSubpass(render_pass->renderer->vo_command_buffers[render_pass->renderer->swapchain->current_image_index], VK_SUBPASS_CONTENTS_INLINE);
vkCmdNextSubpass(render_pass->renderer->vo_command_buffers[render_pass->renderer->current_frame_index], VK_SUBPASS_CONTENTS_INLINE);
++(render_pass->current_subpass_index);
}
14 changes: 14 additions & 0 deletions source/renderer/vulkan/vulkan_render_pass_create_info_builder.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,11 @@ RENDERER_API void vulkan_render_pass_create_info_builder_bind(vulkan_render_pass
_debug_assert__(index < buf_get_element_count(&builder->build_info_array));
builder->bind_index = index;
}
RENDERER_API void vulkan_render_pass_create_info_builder_add_next(vulkan_render_pass_create_info_builder_t* builder)
{
vulkan_render_pass_create_info_builder_add(builder, 1);
vulkan_render_pass_create_info_builder_bind(builder, CAST_TO(u32, buf_get_element_count(&builder->build_info_array) - 1u));
}

static vulkan_render_pass_create_info_build_info_t* get_build_info(vulkan_render_pass_create_info_builder_t* builder, u32 index)
{
Expand Down Expand Up @@ -261,6 +266,15 @@ RENDERER_API void vulkan_render_pass_create_info_builder_add_dependencies(vulkan
build_info->is_supbass_dependencies_internal = true;
}

RENDERER_API buffer_t* vulkan_render_pass_create_info_builder_get_dependencies_buffer(vulkan_render_pass_create_info_builder_t* builder)
{
AUTO build_info = get_bound_build_info(builder);
if(!build_info->is_supbass_dependencies_internal)
build_info->subpass_dependencies = memory_allocator_buf_new(builder->allocator, VkSubpassDependency);
build_info->is_supbass_dependencies_internal = true;
return &build_info->subpass_dependencies;
}

RENDERER_API void vulkan_render_pass_create_info_builder_set_dependencies(vulkan_render_pass_create_info_builder_t* builder, VkSubpassDependency* dependencies, u32 dependency_count)
{
AUTO create_info = get_bound_create_info(builder);
Expand Down
2 changes: 1 addition & 1 deletion source/renderer/vulkan/vulkan_render_queue.c
Original file line number Diff line number Diff line change
Expand Up @@ -393,7 +393,7 @@ RENDERER_API void vulkan_render_queue_dispatch(vulkan_render_queue_t* queue, vul
vulkan_render_pass_t* pass = vulkan_render_pass_pool_getH(pass_pool, pass_handle);

// begin the render pass
vulkan_render_pass_begin(pass, queue->renderer->swapchain->current_image_index, camera);
vulkan_render_pass_begin(pass, VULKAN_RENDER_PASS_FRAMEBUFFER_INDEX_SWAPCHAIN, camera);

// get the number of sub passes that this render pass has
u32 sub_pass_count = pass->subpass_count;
Expand Down
Loading

0 comments on commit c0e63a2

Please sign in to comment.