aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Weissflog <floooh@gmail.com>2025-10-13 21:27:11 +0200
committerAndre Weissflog <floooh@gmail.com>2025-10-13 21:27:11 +0200
commitfaafae618632276aa026bbb41eedfbfcb109a8a4 (patch)
tree27971fec3a759bc72cb62d2f1651411e3870912a
parentb1b812887779768f29ccd8dea8014f09aa200a8c (diff)
sokol_gfx.h vk: basic frame loop wip
-rw-r--r--sokol_app.h9
-rw-r--r--sokol_gfx.h79
-rw-r--r--sokol_glue.h3
3 files changed, 83 insertions, 8 deletions
diff --git a/sokol_app.h b/sokol_app.h
index 185cb1bf..15238229 100644
--- a/sokol_app.h
+++ b/sokol_app.h
@@ -1909,8 +1909,11 @@ typedef struct sapp_wgpu_swapchain {
} sapp_wgpu_swapchain;
typedef struct sapp_vulkan_swapchain {
+ const void* render_image; // vkImage
const void* render_view; // vkImageView
+ const void* resolve_image; // vkImage;
const void* resolve_view; // vkImageView
+ const void* depth_stencil_image; // vkImage
const void* depth_stencil_view; // vkImageView
const void* render_finished_semaphore; // vkSemaphore
const void* present_complete_semaphore; // vkSemaphore
@@ -13608,15 +13611,17 @@ SOKOL_API_IMPL sapp_swapchain sapp_swapchain_next(void) {
#endif
#if defined(SOKOL_VULKAN)
_sapp_vk_swapchain_next();
+ uint32_t img_idx = _sapp.vk.cur_swapchain_image_index;
if (_sapp.sample_count > 1) {
// FIXME FIXME FIXME
SOKOL_ASSERT(false);
} else {
- res.vulkan.render_view = (const void*) _sapp.vk.swapchain_views[_sapp.vk.cur_swapchain_image_index];
+ res.vulkan.render_image = (const void*) _sapp.vk.swapchain_images[img_idx];
+ res.vulkan.render_view = (const void*) _sapp.vk.swapchain_views[img_idx];
}
// FIXME
// res.vulkan.depth_stencil_view = ...;
- res.vulkan.render_finished_semaphore = _sapp.vk.sync[_sapp.vk.cur_swapchain_image_index].render_finished_sem;
+ res.vulkan.render_finished_semaphore = _sapp.vk.sync[img_idx].render_finished_sem;
res.vulkan.present_complete_semaphore = _sapp.vk.sync[_sapp.vk.sync_slot].present_complete_sem;
#endif
#if defined(_SAPP_ANY_GL)
diff --git a/sokol_gfx.h b/sokol_gfx.h
index 2e62572a..ca0ce7aa 100644
--- a/sokol_gfx.h
+++ b/sokol_gfx.h
@@ -2937,8 +2937,11 @@ typedef struct sg_wgpu_swapchain {
} sg_wgpu_swapchain;
typedef struct sg_vulkan_swapchain {
+ const void* render_image; // vkImage
const void* render_view; // vkImageView
+ const void* resolve_image; // vkImage
const void* resolve_view; // vkImageView
+ const void* depth_stencil_image; // vkImage
const void* depth_stencil_view; // vkImageView
const void* render_finished_semaphore; // vkSemaphore
const void* present_complete_semaphore; // vkSemaphore
@@ -6785,6 +6788,7 @@ typedef struct {
uint32_t queue_family_index;
VkCommandPool cmd_pool;
bool first_pass_in_frame;
+ sg_vulkan_swapchain pass_swapchain;
VkSemaphore present_complete_sem;
VkSemaphore render_finished_sem;
uint32_t frame_slot;
@@ -18475,10 +18479,47 @@ _SOKOL_PRIVATE void _sg_vk_discard_view(_sg_view_t* view) {
SOKOL_ASSERT(false && "FIXME");
}
+_SOKOL_PRIVATE void _sg_vk_transition_image_layout(
+ VkImage vk_img,
+ VkImageLayout old_layout,
+ VkImageLayout new_layout,
+ VkAccessFlags2 src_access_mask,
+ VkAccessFlags2 dst_access_mask,
+ VkPipelineStageFlags src_stage_mask,
+ VkPipelineStageFlags dst_stage_mask,
+ VkImageAspectFlags aspect_mask,
+ uint32_t base_mip_level,
+ uint32_t base_array_layer)
+{
+ VkImageMemoryBarrier2 barrier;
+ _sg_clear(&barrier, sizeof(barrier));
+ barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2;
+ barrier.srcStageMask = src_stage_mask;
+ barrier.srcAccessMask = src_access_mask;
+ barrier.dstStageMask = dst_stage_mask;
+ barrier.dstAccessMask = dst_access_mask;
+ barrier.oldLayout = old_layout;
+ barrier.newLayout = new_layout;
+ barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+ barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+ barrier.image = vk_img;
+ barrier.subresourceRange.aspectMask = aspect_mask;
+ barrier.subresourceRange.baseMipLevel = base_mip_level;
+ barrier.subresourceRange.levelCount = 1;
+ barrier.subresourceRange.baseArrayLayer = base_array_layer;
+ barrier.subresourceRange.layerCount = 1;
+ VkDependencyInfo dep_info;
+ _sg_clear(&dep_info, sizeof(dep_info));
+ dep_info.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO;
+ dep_info.imageMemoryBarrierCount = 1;
+ dep_info.pImageMemoryBarriers = &barrier;
+ vkCmdPipelineBarrier2(_sg.vk.frame[_sg.vk.frame_slot].cmd_buf, &dep_info);
+}
+
_SOKOL_PRIVATE void _sg_vk_begin_pass(const sg_pass* pass, const _sg_attachments_ptrs_t* atts) {
SOKOL_ASSERT(pass && atts);
VkResult res;
- const sg_swapchain* swapchain = &pass->swapchain;
+ _sg.vk.pass_swapchain = pass->swapchain.vulkan;
const bool is_swapchain_pass = atts->empty;
// if this is the first pass in the frame, wait for
@@ -18510,21 +18551,47 @@ _SOKOL_PRIVATE void _sg_vk_begin_pass(const sg_pass* pass, const _sg_attachments
}
if (is_swapchain_pass) {
- SOKOL_ASSERT(swapchain->vulkan.present_complete_semaphore);
- SOKOL_ASSERT(swapchain->vulkan.render_finished_semaphore);
+ SOKOL_ASSERT(_sg.vk.pass_swapchain.render_image);
+ SOKOL_ASSERT(_sg.vk.pass_swapchain.render_view);
+ SOKOL_ASSERT(_sg.vk.pass_swapchain.present_complete_semaphore);
+ SOKOL_ASSERT(_sg.vk.pass_swapchain.render_finished_semaphore);
// FIXME: need to support multiple present_complete_semaphores
SOKOL_ASSERT(0 == _sg.vk.present_complete_sem);
- _sg.vk.present_complete_sem = (VkSemaphore)swapchain->vulkan.present_complete_semaphore;
+ _sg.vk.present_complete_sem = (VkSemaphore)_sg.vk.pass_swapchain.present_complete_semaphore;
if (0 == _sg.vk.render_finished_sem) {
- _sg.vk.render_finished_sem = (VkSemaphore)swapchain->vulkan.render_finished_semaphore;
+ _sg.vk.render_finished_sem = (VkSemaphore)_sg.vk.pass_swapchain.render_finished_semaphore;
} else {
- SOKOL_ASSERT(_sg.vk.render_finished_sem == swapchain->vulkan.render_finished_semaphore);
+ SOKOL_ASSERT(_sg.vk.render_finished_sem == _sg.vk.pass_swapchain.render_finished_semaphore);
}
+ _sg_vk_transition_image_layout(
+ (VkImage)_sg.vk.pass_swapchain.render_image,
+ VK_IMAGE_LAYOUT_UNDEFINED,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ 0,
+ VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT,
+ VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT,
+ VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT,
+ VK_IMAGE_ASPECT_COLOR_BIT,
+ 0, 0); // base_mip_level, base_array_layer
}
}
_SOKOL_PRIVATE void _sg_vk_end_pass(const _sg_attachments_ptrs_t* atts) {
SOKOL_ASSERT(atts);
+ const bool is_swapchain_pass = atts->empty;
+ if (is_swapchain_pass) {
+ SOKOL_ASSERT(_sg.vk.pass_swapchain.render_image);
+ _sg_vk_transition_image_layout(
+ (VkImage)_sg.vk.pass_swapchain.render_image,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
+ VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT,
+ 0,
+ VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT,
+ VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT,
+ VK_IMAGE_ASPECT_COLOR_BIT,
+ 0, 0); // base_mip_level, base_array_layer
+ }
}
_SOKOL_PRIVATE void _sg_vk_commit(void) {
diff --git a/sokol_glue.h b/sokol_glue.h
index 718700fc..5fc4a510 100644
--- a/sokol_glue.h
+++ b/sokol_glue.h
@@ -190,8 +190,11 @@ SOKOL_API_IMPL sg_swapchain sglue_swapchain_next(void) {
res.wgpu.render_view = sc.wgpu.render_view;
res.wgpu.resolve_view = sc.wgpu.resolve_view;
res.wgpu.depth_stencil_view = sc.wgpu.depth_stencil_view;
+ res.vulkan.render_image = sc.vulkan.render_image;
res.vulkan.render_view = sc.vulkan.render_view;
+ res.vulkan.resolve_image = sc.vulkan.resolve_image;
res.vulkan.resolve_view = sc.vulkan.resolve_view;
+ res.vulkan.depth_stencil_image = sc.vulkan.depth_stencil_image;
res.vulkan.depth_stencil_view = sc.vulkan.depth_stencil_view;
res.vulkan.render_finished_semaphore = sc.vulkan.render_finished_semaphore;
res.vulkan.present_complete_semaphore = sc.vulkan.present_complete_semaphore;