From 65b8ec4cefbedee70a6682e4dfba603d5cb5b836 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 2 Apr 2022 19:02:54 +0200 Subject: [PATCH] (Vulkan) Fix crashes --- gfx/drivers/vulkan.c | 55 ++++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/gfx/drivers/vulkan.c b/gfx/drivers/vulkan.c index e5fb15aafb..fd54a6cfc0 100644 --- a/gfx/drivers/vulkan.c +++ b/gfx/drivers/vulkan.c @@ -896,27 +896,33 @@ static bool vulkan_init_default_filter_chain(vk_t *vk) #ifdef VULKAN_HDR_SWAPCHAIN if (vk->context->hdr_enable) { - struct video_shader* shader_preset = vulkan_filter_chain_get_preset((vulkan_filter_chain_t*)vk->filter_chain); - VkFormat rt_format = vulkan_filter_chain_get_pass_rt_format((vulkan_filter_chain_t*)vk->filter_chain, shader_preset->passes - 1); + struct video_shader* shader_preset = vulkan_filter_chain_get_preset( + vk->filter_chain); + VkFormat rt_format = (shader_preset && shader_preset->passes) ? vulkan_filter_chain_get_pass_rt_format(vk->filter_chain, shader_preset->passes - 1) : VK_FORMAT_UNDEFINED; - if(shader_preset && shader_preset->passes && (rt_format == VK_FORMAT_A2B10G10R10_UNORM_PACK32)) + switch (rt_format) { - /* If the last shader pass uses a RGB10A2 back buffer and hdr has been enabled assume we want to skip the inverse tonemapper and hdr10 conversion */ - vulkan_set_hdr_inverse_tonemap(vk, false); - vulkan_set_hdr10(vk, false); - vk->should_resize = true; - } - else if(shader_preset && shader_preset->passes && (rt_format == VK_FORMAT_R16G16B16A16_SFLOAT)) - { - /* If the last shader pass uses a RGBA16 back buffer and hdr has been enabled assume we want to skip the inverse tonemapper */ - vulkan_set_hdr_inverse_tonemap(vk, false); - vulkan_set_hdr10(vk, true); - vk->should_resize = true; - } - else - { - vulkan_set_hdr_inverse_tonemap(vk, true); - vulkan_set_hdr10(vk, true); + case VK_FORMAT_A2B10G10R10_UNORM_PACK32: + /* If the last shader pass uses a RGB10A2 back buffer + * and HDR has been enabled, assume we want to skip + * the inverse tonemapper and HDR10 conversion */ + vulkan_set_hdr_inverse_tonemap(vk, false); + vulkan_set_hdr10(vk, false); + vk->should_resize = true; + break; + case VK_FORMAT_R16G16B16A16_SFLOAT: + /* If the last shader pass uses a RGBA16 backbuffer + * and HDR has been enabled, assume we want to + * skip the inverse tonemapper */ + vulkan_set_hdr_inverse_tonemap(vk, false); + vulkan_set_hdr10(vk, true); + vk->should_resize = true; + break; + case VK_FORMAT_UNDEFINED: + default: + vulkan_set_hdr_inverse_tonemap(vk, true); + vulkan_set_hdr10(vk, true); + break; } } #endif /* VULKAN_HDR_SWAPCHAIN */ @@ -958,17 +964,16 @@ static bool vulkan_init_filter_chain_preset(vk_t *vk, const char *shader_path) #ifdef VULKAN_HDR_SWAPCHAIN if (vk->context->hdr_enable) { - struct video_shader* shader_preset = vulkan_filter_chain_get_preset((vulkan_filter_chain_t*)vk->filter_chain); - VkFormat rt_format = vulkan_filter_chain_get_pass_rt_format((vulkan_filter_chain_t*)vk->filter_chain, shader_preset->passes - 1); + struct video_shader* shader_preset = vulkan_filter_chain_get_preset(vk->filter_chain); - if(shader_preset && shader_preset->passes && (rt_format == VK_FORMAT_A2B10G10R10_UNORM_PACK32)) + if(shader_preset && shader_preset->passes && (vulkan_filter_chain_get_pass_rt_format(vk->filter_chain, shader_preset->passes - 1) == VK_FORMAT_A2B10G10R10_UNORM_PACK32)) { /* If the last shader pass uses a RGB10A2 back buffer and hdr has been enabled assume we want to skip the inverse tonemapper and hdr10 conversion */ vulkan_set_hdr_inverse_tonemap(vk, false); vulkan_set_hdr10(vk, false); vk->should_resize = true; } - else if(shader_preset && shader_preset->passes && (rt_format == VK_FORMAT_R16G16B16A16_SFLOAT)) + else if(shader_preset && shader_preset->passes && (vulkan_filter_chain_get_pass_rt_format(vk->filter_chain, shader_preset->passes - 1) == VK_FORMAT_R16G16B16A16_SFLOAT)) { /* If the last shader pass uses a RGBA16 back buffer and hdr has been enabled assume we want to skip the inverse tonemapper */ vulkan_set_hdr_inverse_tonemap(vk, false); @@ -1938,8 +1943,8 @@ static bool vulkan_frame(void *data, const void *frame, bool overlay_behind_menu = video_info->overlay_behind_menu; #ifdef VULKAN_HDR_SWAPCHAIN - struct video_shader* shader_preset = vulkan_filter_chain_get_preset((vulkan_filter_chain_t*)vk->filter_chain); - VkFormat main_buffer_format = shader_preset && shader_preset->passes ? vulkan_filter_chain_get_pass_rt_format((vulkan_filter_chain_t*)vk->filter_chain, shader_preset->passes - 1) : VK_FORMAT_R8G8B8A8_UNORM; + struct video_shader* shader_preset = vulkan_filter_chain_get_preset(vk->filter_chain); + VkFormat main_buffer_format = shader_preset && shader_preset->passes ? vulkan_filter_chain_get_pass_rt_format(vk->filter_chain, shader_preset->passes - 1) : VK_FORMAT_R8G8B8A8_UNORM; bool use_main_buffer = main_buffer_format != vk->context->swapchain_format; #endif /* VULKAN_HDR_SWAPCHAIN */