diff options
| -rw-r--r-- | sokol_app.h | 9 | ||||
| -rw-r--r-- | sokol_gfx.h | 79 | ||||
| -rw-r--r-- | sokol_glue.h | 3 |
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; |