diff options
Diffstat (limited to 'sokol_app.h')
| -rw-r--r-- | sokol_app.h | 110 |
1 files changed, 66 insertions, 44 deletions
diff --git a/sokol_app.h b/sokol_app.h index 560043e9..8df48fe6 100644 --- a/sokol_app.h +++ b/sokol_app.h @@ -4779,6 +4779,36 @@ _SOKOL_PRIVATE uint32_t _sapp_vk_swapchain_min_image_count(const VkSurfaceCapabi return min_image_count; } +_SOKOL_PRIVATE void _sapp_vk_create_swapchain_image_view(uint32_t image_index) { + SOKOL_ASSERT(_sapp.vk.device); + SOKOL_ASSERT(image_index < _sapp.vk.num_swapchain_images); + SOKOL_ASSERT(_sapp.vk.swapchain_images[image_index]); + SOKOL_ASSERT(0 == _sapp.vk.swapchain_views[image_index]); + + _SAPP_STRUCT(VkImageViewCreateInfo, view_create_info); + view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; + view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D; + view_create_info.format = _sapp.vk.surface_format.format; + view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + view_create_info.subresourceRange.levelCount = 1; + view_create_info.subresourceRange.layerCount = 1; + view_create_info.image = _sapp.vk.swapchain_images[image_index]; + VkResult res = vkCreateImageView(_sapp.vk.device, &view_create_info, 0, &_sapp.vk.swapchain_views[image_index]); + if (res != VK_SUCCESS) { + _SAPP_PANIC(VULKAN_SWAPCHAIN_CREATE_IMAGE_VIEW_FAILED); + } + SOKOL_ASSERT(_sapp.vk.swapchain_views[image_index]); + _sapp_vk_set_object_label(VK_OBJECT_TYPE_IMAGE_VIEW, (uint64_t)_sapp.vk.swapchain_views[image_index], "swapchain_view"); +} + +_SOKOL_PRIVATE void _sapp_vk_destroy_swapchain_image_view(uint32_t image_index) { + SOKOL_ASSERT(_sapp.vk.device); + SOKOL_ASSERT(image_index < _sapp.vk.num_swapchain_images); + SOKOL_ASSERT(_sapp.vk.swapchain_views[image_index]); + vkDestroyImageView(_sapp.vk.device, _sapp.vk.swapchain_views[image_index], 0); + _sapp.vk.swapchain_views[image_index] = 0; +} + _SOKOL_PRIVATE void _sapp_vk_create_swapchain(bool recreate) { SOKOL_ASSERT(_sapp.vk.physical_device); SOKOL_ASSERT(_sapp.vk.surface); @@ -4800,23 +4830,21 @@ _SOKOL_PRIVATE void _sapp_vk_create_swapchain(bool recreate) { _SAPP_STRUCT(VkSurfaceCapabilitiesKHR, surf_caps); VkResult res = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(_sapp.vk.physical_device, _sapp.vk.surface, &surf_caps); SOKOL_ASSERT(res == VK_SUCCESS); - const uint32_t width = surf_caps.currentExtent.width; - const uint32_t height = surf_caps.currentExtent.height; + const uint32_t fb_width = surf_caps.currentExtent.width; + const uint32_t fb_height = surf_caps.currentExtent.height; _sapp.vk.surface_format = _sapp_vk_pick_surface_format(); - // FIXME: pick better present-mode if supported - VkPresentModeKHR present_mode = VK_PRESENT_MODE_FIFO_KHR; + const VkPresentModeKHR present_mode = VK_PRESENT_MODE_FIFO_KHR; - // FIXME: better imageExtent (scale vs no-scale!) _SAPP_STRUCT(VkSwapchainCreateInfoKHR, create_info); create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR; - create_info.flags = 0; // FIXME? + create_info.flags = 0; create_info.surface = _sapp.vk.surface; create_info.minImageCount = _sapp_vk_swapchain_min_image_count(&surf_caps); create_info.imageFormat = _sapp.vk.surface_format.format; create_info.imageColorSpace = _sapp.vk.surface_format.colorSpace; - create_info.imageExtent.width = width; - create_info.imageExtent.height = height; + create_info.imageExtent.width = fb_width; + create_info.imageExtent.height = fb_height; create_info.imageArrayLayers = 1; create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE; @@ -4835,9 +4863,7 @@ _SOKOL_PRIVATE void _sapp_vk_create_swapchain(bool recreate) { // NOTE: destroying the depth- and msaa-surfaces happens // down in the respective _sapp_vk_swapchain_create_surface() calls! for (uint32_t i = 0; i < _sapp.vk.num_swapchain_images; i++) { - SOKOL_ASSERT(_sapp.vk.swapchain_views[i]); - vkDestroyImageView(_sapp.vk.device, _sapp.vk.swapchain_views[i], 0); - _sapp.vk.swapchain_views[i] = 0; + _sapp_vk_destroy_swapchain_image_view(i); } vkDestroySwapchainKHR(_sapp.vk.device, old_swapchain, 0); } @@ -4850,31 +4876,16 @@ _SOKOL_PRIVATE void _sapp_vk_create_swapchain(bool recreate) { SOKOL_ASSERT(res == VK_SUCCESS); SOKOL_ASSERT(_sapp.vk.num_swapchain_images >= surf_caps.minImageCount); - _SAPP_STRUCT(VkImageViewCreateInfo, view_create_info); - view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; - view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D; - view_create_info.format = _sapp.vk.surface_format.format; - view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - view_create_info.subresourceRange.levelCount = 1; - view_create_info.subresourceRange.layerCount = 1; for (uint32_t i = 0; i < _sapp.vk.num_swapchain_images; i++) { - SOKOL_ASSERT(_sapp.vk.swapchain_images[i]); - SOKOL_ASSERT(0 == _sapp.vk.swapchain_views[i]); - view_create_info.image = _sapp.vk.swapchain_images[i]; - res = vkCreateImageView(_sapp.vk.device, &view_create_info, 0, &_sapp.vk.swapchain_views[i]); - if (res != VK_SUCCESS) { - _SAPP_PANIC(VULKAN_SWAPCHAIN_CREATE_IMAGE_VIEW_FAILED); - } - SOKOL_ASSERT(_sapp.vk.swapchain_views[i]); - _sapp_vk_set_object_label(VK_OBJECT_TYPE_IMAGE_VIEW, (uint64_t)_sapp.vk.swapchain_views[i], "swapchain_view"); + _sapp_vk_create_swapchain_image_view(i); } // create depth-stencil buffer _sapp_vk_swapchain_create_surface(&_sapp.vk.depth, recreate, VK_FORMAT_D32_SFLOAT_S8_UINT, - width, - height, + fb_width, + fb_height, (VkSampleCountFlagBits)_sapp.sample_count, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT, @@ -4886,8 +4897,8 @@ _SOKOL_PRIVATE void _sapp_vk_create_swapchain(bool recreate) { _sapp_vk_swapchain_create_surface(&_sapp.vk.msaa, recreate, _sapp.vk.surface_format.format, - width, - height, + fb_width, + fb_height, (VkSampleCountFlagBits)_sapp.sample_count, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_ASPECT_COLOR_BIT, @@ -4897,8 +4908,8 @@ _SOKOL_PRIVATE void _sapp_vk_create_swapchain(bool recreate) { // this is the only place in the Vulkan code path which updates // _sapp.framebuffer_width/height - _sapp.framebuffer_width = (int)surf_caps.currentExtent.width; - _sapp.framebuffer_height = (int)surf_caps.currentExtent.height; + _sapp.framebuffer_width = (int)fb_width; + _sapp.framebuffer_height = (int)fb_height; } _SOKOL_PRIVATE void _sapp_vk_destroy_swapchain(void) { @@ -4910,11 +4921,8 @@ _SOKOL_PRIVATE void _sapp_vk_destroy_swapchain(void) { } _sapp_vk_swapchain_destroy_surface(&_sapp.vk.depth); for (uint32_t i = 0; i < _sapp.vk.num_swapchain_images; i++) { - SOKOL_ASSERT(_sapp.vk.swapchain_views[i]); - vkDestroyImageView(_sapp.vk.device, _sapp.vk.swapchain_views[i], 0); - _sapp.vk.swapchain_views[i] = 0; + _sapp_vk_destroy_swapchain_image_view(i); _sapp.vk.swapchain_images[i] = 0; - } vkDestroySwapchainKHR(_sapp.vk.device, _sapp.vk.swapchain, 0); _sapp.vk.swapchain = 0; @@ -4924,6 +4932,9 @@ _SOKOL_PRIVATE void _sapp_vk_destroy_swapchain(void) { #if defined(_SAPP_LINUX) _SOKOL_PRIVATE void _sapp_x11_app_event(sapp_event_type type); #endif +#if defined(_SAPP_WIN32) +_SOKOL_PRIVATE void _sapp_win32_app_event(sapp_event_type type); +#endif _SOKOL_PRIVATE void _sapp_vk_recreate_swapchain(void) { SOKOL_ASSERT(_sapp.vk.device); @@ -4936,6 +4947,9 @@ _SOKOL_PRIVATE void _sapp_vk_recreate_swapchain(void) { #if defined(_SAPP_LINUX) _sapp_x11_app_event(SAPP_EVENTTYPE_RESIZED); #endif + #if defined(_SAPP_WIN32) + _sapp_win32_app_event(SAPP_EVENTTYPE_RESIZED); + #endif } } } @@ -8697,16 +8711,22 @@ _SOKOL_PRIVATE bool _sapp_win32_update_dimensions(void) { float window_height = (float)(rect.bottom - rect.top) / _sapp.win32.dpi.window_scale; _sapp.window_width = _sapp_roundf_gzero(window_width); _sapp.window_height = _sapp_roundf_gzero(window_height); - int fb_width = _sapp_roundf_gzero(window_width * _sapp.win32.dpi.content_scale); - int fb_height = _sapp_roundf_gzero(window_height * _sapp.win32.dpi.content_scale); - if ((fb_width != _sapp.framebuffer_width) || (fb_height != _sapp.framebuffer_height)) { - _sapp.framebuffer_width = fb_width; - _sapp.framebuffer_height = fb_height; - return true; - } + // NOTE: on Vulkan, updating the framebuffer dimensions and firing the resize-event + // is handled entirely by the swapchain management code + #if !defined(SOKOL_VULKAN) + int fb_width = _sapp_roundf_gzero(window_width * _sapp.win32.dpi.content_scale); + int fb_height = _sapp_roundf_gzero(window_height * _sapp.win32.dpi.content_scale); + if ((fb_width != _sapp.framebuffer_width) || (fb_height != _sapp.framebuffer_height)) { + _sapp.framebuffer_width = fb_width; + _sapp.framebuffer_height = fb_height; + return true; + } + #endif } else { _sapp.window_width = _sapp.window_height = 1; + #if !defined(SOKOL_VULKAN) _sapp.framebuffer_width = _sapp.framebuffer_height = 1; + #endif } return false; } @@ -9812,6 +9832,8 @@ _SOKOL_PRIVATE void _sapp_win32_run(const sapp_desc* desc) { } _sapp_win32_frame(false); // check for window resized, this cannot happen in WM_SIZE as it explodes memory usage + // NOTE: when Vulkan is active, _sapp_win32_update_dimensions() will never return true, + // instead the resize-event is fixed by the swapchain management code if (_sapp_win32_update_dimensions()) { #if defined(SOKOL_D3D11) _sapp_d3d11_resize_default_render_target(); |