gfx_ctx_vulkan_data - use flags instead of booleans

This commit is contained in:
LibretroAdmin 2022-10-30 22:03:36 +01:00
parent 250a0b9542
commit 0159c2f70f
8 changed files with 78 additions and 67 deletions

View File

@ -1636,21 +1636,24 @@ static bool vulkan_context_init_device(gfx_ctx_vulkan_data_t *vk)
#ifdef VULKAN_EMULATE_MAILBOX #ifdef VULKAN_EMULATE_MAILBOX
/* Win32 windowed mode seems to deal just fine with toggling VSync. /* Win32 windowed mode seems to deal just fine with toggling VSync.
* Fullscreen however ... */ * Fullscreen however ... */
vk->emulate_mailbox = vk->fullscreen; if (vk->flags & VK_DATA_FLAG_FULLSCREEN)
vk->flags |= VK_DATA_FLAG_EMULATE_MAILBOX;
else
vk->flags &= ~VK_DATA_FLAG_EMULATE_MAILBOX;
#endif #endif
/* If we're emulating mailbox, stick to using fences rather than semaphores. /* If we're emulating mailbox, stick to using fences rather than semaphores.
* Avoids some really weird driver bugs. */ * Avoids some really weird driver bugs. */
if (!vk->emulate_mailbox) if (!(vk->flags & VK_DATA_FLAG_EMULATE_MAILBOX))
{ {
if (vk->context.gpu_properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU) if (vk->context.gpu_properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU)
{ {
vk->use_wsi_semaphore = true; vk->flags |= VK_DATA_FLAG_USE_WSI_SEMAPHORE;
RARCH_LOG("[Vulkan]: Using semaphores for WSI acquire.\n"); RARCH_LOG("[Vulkan]: Using semaphores for WSI acquire.\n");
} }
else else
{ {
vk->use_wsi_semaphore = false; vk->flags &= ~VK_DATA_FLAG_USE_WSI_SEMAPHORE;
RARCH_LOG("[Vulkan]: Using fences for WSI acquire.\n"); RARCH_LOG("[Vulkan]: Using fences for WSI acquire.\n");
} }
} }
@ -2733,7 +2736,7 @@ retry:
retro_assert(!vk->context.has_acquired_swapchain); retro_assert(!vk->context.has_acquired_swapchain);
if (vk->emulating_mailbox) if (vk->flags & VK_DATA_FLAG_EMULATING_MAILBOX)
{ {
/* Non-blocking acquire. If we don't get a swapchain frame right away, /* Non-blocking acquire. If we don't get a swapchain frame right away,
* just skip rendering to the swapchain this frame, similar to what * just skip rendering to the swapchain this frame, similar to what
@ -2746,7 +2749,7 @@ retry:
} }
else else
{ {
if (vk->use_wsi_semaphore) if (vk->flags & VK_DATA_FLAG_USE_WSI_SEMAPHORE)
semaphore = vulkan_get_wsi_acquire_semaphore(&vk->context); semaphore = vulkan_get_wsi_acquire_semaphore(&vk->context);
else else
vkCreateFence(vk->context.device, &fence_info, NULL, &fence); vkCreateFence(vk->context.device, &fence_info, NULL, &fence);
@ -2877,15 +2880,17 @@ bool vulkan_create_swapchain(gfx_ctx_vulkan_data_t *vk,
!surface_properties.currentExtent.height) !surface_properties.currentExtent.height)
return false; return false;
if (swap_interval == 0 && vk->emulate_mailbox && vsync) if ( (swap_interval == 0)
&& (vk->flags & VK_DATA_FLAG_EMULATE_MAILBOX)
&& vsync)
{ {
swap_interval = 1; swap_interval = 1;
vk->emulating_mailbox = true; vk->flags |= VK_DATA_FLAG_EMULATING_MAILBOX;
} }
else else
vk->emulating_mailbox = false; vk->flags &= ~VK_DATA_FLAG_EMULATING_MAILBOX;
vk->created_new_swapchain = true; vk->flags |= VK_DATA_FLAG_CREATED_NEW_SWAPCHAIN;
if (vk->swapchain != VK_NULL_HANDLE && if (vk->swapchain != VK_NULL_HANDLE &&
!vk->context.invalid_swapchain && !vk->context.invalid_swapchain &&
@ -2899,17 +2904,17 @@ bool vulkan_create_swapchain(gfx_ctx_vulkan_data_t *vk,
#endif #endif
vulkan_create_wait_fences(vk); vulkan_create_wait_fences(vk);
if ( vk->emulating_mailbox if ( (vk->flags & VK_DATA_FLAG_EMULATING_MAILBOX)
&& vk->mailbox.swapchain == VK_NULL_HANDLE) && vk->mailbox.swapchain == VK_NULL_HANDLE)
{ {
vulkan_emulated_mailbox_init( vulkan_emulated_mailbox_init(
&vk->mailbox, vk->context.device, vk->swapchain); &vk->mailbox, vk->context.device, vk->swapchain);
vk->created_new_swapchain = false; vk->flags &= ~VK_DATA_FLAG_CREATED_NEW_SWAPCHAIN;
return true; return true;
} }
else if ( else if (
!vk->emulating_mailbox (!(vk->flags & VK_DATA_FLAG_EMULATING_MAILBOX))
&& vk->mailbox.swapchain != VK_NULL_HANDLE) && (vk->mailbox.swapchain != VK_NULL_HANDLE))
{ {
VkResult res = VK_SUCCESS; VkResult res = VK_SUCCESS;
/* We are tearing down, and entering a state /* We are tearing down, and entering a state
@ -2926,7 +2931,7 @@ bool vulkan_create_swapchain(gfx_ctx_vulkan_data_t *vk,
if (res == VK_SUCCESS) if (res == VK_SUCCESS)
{ {
vk->context.has_acquired_swapchain = true; vk->context.has_acquired_swapchain = true;
vk->created_new_swapchain = false; vk->flags &= ~VK_DATA_FLAG_CREATED_NEW_SWAPCHAIN;
return true; return true;
} }
@ -2935,7 +2940,7 @@ bool vulkan_create_swapchain(gfx_ctx_vulkan_data_t *vk,
} }
else else
{ {
vk->created_new_swapchain = false; vk->flags &= ~VK_DATA_FLAG_CREATED_NEW_SWAPCHAIN;
return true; return true;
} }
} }
@ -3212,7 +3217,7 @@ bool vulkan_create_swapchain(gfx_ctx_vulkan_data_t *vk,
vk->context.has_acquired_swapchain = false; vk->context.has_acquired_swapchain = false;
vulkan_create_wait_fences(vk); vulkan_create_wait_fences(vk);
if (vk->emulating_mailbox) if (vk->flags & VK_DATA_FLAG_EMULATING_MAILBOX)
vulkan_emulated_mailbox_init(&vk->mailbox, vk->context.device, vk->swapchain); vulkan_emulated_mailbox_init(&vk->mailbox, vk->context.device, vk->swapchain);
return true; return true;

View File

@ -186,28 +186,29 @@ struct vulkan_emulated_mailbox
uint8_t flags; uint8_t flags;
}; };
typedef struct gfx_ctx_vulkan_data enum gfx_ctx_vulkan_data_flags
{ {
struct string_list *gpu_list;
vulkan_context_t context;
VkSurfaceKHR vk_surface; /* ptr alignment */
VkSwapchainKHR swapchain; /* ptr alignment */
struct vulkan_emulated_mailbox mailbox;
/* Used to check if we need to use mailbox emulation or not.
* Only relevant on Windows for now. */
bool fullscreen;
bool need_new_swapchain;
bool created_new_swapchain;
bool emulate_mailbox;
bool emulating_mailbox;
/* If set, prefer a path where we use /* If set, prefer a path where we use
* semaphores instead of fences for vkAcquireNextImageKHR. * semaphores instead of fences for vkAcquireNextImageKHR.
* Helps workaround certain performance issues on some drivers. */ * Helps workaround certain performance issues on some drivers. */
bool use_wsi_semaphore; VK_DATA_FLAG_USE_WSI_SEMAPHORE = (1 << 0),
VK_DATA_FLAG_NEED_NEW_SWAPCHAIN = (1 << 1),
VK_DATA_FLAG_CREATED_NEW_SWAPCHAIN = (1 << 2),
VK_DATA_FLAG_EMULATE_MAILBOX = (1 << 3),
VK_DATA_FLAG_EMULATING_MAILBOX = (1 << 4),
/* Used to check if we need to use mailbox emulation or not.
* Only relevant on Windows for now. */
VK_DATA_FLAG_FULLSCREEN = (1 << 5)
};
typedef struct gfx_ctx_vulkan_data
{
struct string_list *gpu_list;
vulkan_context_t context;
VkSurfaceKHR vk_surface; /* ptr alignment */
VkSwapchainKHR swapchain; /* ptr alignment */
struct vulkan_emulated_mailbox mailbox;
uint8_t flags;
} gfx_ctx_vulkan_data_t; } gfx_ctx_vulkan_data_t;
struct vulkan_display_surface_info struct vulkan_display_surface_info

View File

@ -107,13 +107,13 @@ static void android_gfx_ctx_vk_check_window(void *data, bool *quit,
if (android_app->content_rect.changed) if (android_app->content_rect.changed)
{ {
and->vk.need_new_swapchain = true; and->vk.flags |= VK_DATA_FLAG_NEED_NEW_SWAPCHAIN;
android_app->content_rect.changed = false; android_app->content_rect.changed = false;
} }
/* Swapchains are recreated in set_resize as a /* Swapchains are recreated in set_resize as a
* central place, so use that to trigger swapchain reinit. */ * central place, so use that to trigger swapchain reinit. */
*resize = and->vk.need_new_swapchain; *resize = and->vk.flags & VK_DATA_FLAG_NEED_NEW_SWAPCHAIN;
new_width = android_app->content_rect.width; new_width = android_app->content_rect.width;
new_height = android_app->content_rect.height; new_height = android_app->content_rect.height;
@ -143,10 +143,10 @@ static bool android_gfx_ctx_vk_set_resize(void *data,
return false; return false;
} }
if (and->vk.created_new_swapchain) if (and->vk.flags & VK_DATA_FLAG_CREATED_NEW_SWAPCHAIN)
vulkan_acquire_next_image(&and->vk); vulkan_acquire_next_image(&and->vk);
and->vk.context.invalid_swapchain = true; and->vk.context.invalid_swapchain = true;
and->vk.need_new_swapchain = false; and->vk.flags &= ~VK_DATA_FLAG_NEED_NEW_SWAPCHAIN;
return true; return true;
} }
@ -276,7 +276,7 @@ static void android_gfx_ctx_vk_set_swap_interval(void *data, int swap_interval)
RARCH_LOG("[Vulkan]: Setting swap interval: %u.\n", swap_interval); RARCH_LOG("[Vulkan]: Setting swap interval: %u.\n", swap_interval);
and->swap_interval = swap_interval; and->swap_interval = swap_interval;
if (and->vk.swapchain) if (and->vk.swapchain)
and->vk.need_new_swapchain = true; and->vk.flags |= VK_DATA_FLAG_NEED_NEW_SWAPCHAIN;
} }
} }

View File

@ -144,7 +144,8 @@ static void cocoa_vk_gfx_ctx_check_window(void *data, bool *quit,
*quit = false; *quit = false;
*resize = cocoa_ctx->vk.need_new_swapchain; *resize = cocoa_ctx->vk.flags &
VK_DATA_FLAG_NEED_NEW_SWAPCHAIN;
#if MAC_OS_X_VERSION_10_7 && defined(OSX) #if MAC_OS_X_VERSION_10_7 && defined(OSX)
cocoa_vk_gfx_ctx_get_video_size_osx10_7_and_up(data, &new_width, &new_height); cocoa_vk_gfx_ctx_get_video_size_osx10_7_and_up(data, &new_width, &new_height);
@ -169,7 +170,7 @@ static void cocoa_vk_gfx_ctx_swap_interval(void *data, int i)
{ {
cocoa_ctx->swap_interval = interval; cocoa_ctx->swap_interval = interval;
if (cocoa_ctx->vk.swapchain) if (cocoa_ctx->vk.swapchain)
cocoa_ctx->vk.need_new_swapchain = true; cocoa_ctx->vk.flags |= VK_DATA_FLAG_NEED_NEW_SWAPCHAIN;
} }
} }
@ -320,10 +321,10 @@ static bool cocoa_vk_gfx_ctx_set_resize(void *data, unsigned width, unsigned hei
} }
cocoa_ctx->vk.context.invalid_swapchain = true; cocoa_ctx->vk.context.invalid_swapchain = true;
if (cocoa_ctx->vk.created_new_swapchain) if (cocoa_ctx->vk.flags & VK_DATA_FLAG_CREATED_NEW_SWAPCHAIN)
vulkan_acquire_next_image(&cocoa_ctx->vk); vulkan_acquire_next_image(&cocoa_ctx->vk);
cocoa_ctx->vk.need_new_swapchain = false; cocoa_ctx->vk.flags &= ~VK_DATA_FLAG_NEED_NEW_SWAPCHAIN;
return true; return true;
} }

View File

@ -84,7 +84,7 @@ static void gfx_ctx_khr_display_check_window(void *data, bool *quit,
{ {
khr_display_ctx_data_t *khr = (khr_display_ctx_data_t*)data; khr_display_ctx_data_t *khr = (khr_display_ctx_data_t*)data;
*resize = khr->vk.need_new_swapchain; *resize = khr->vk.flags & VK_DATA_FLAG_NEED_NEW_SWAPCHAIN;
if (khr->width != *width || khr->height != *height) if (khr->width != *width || khr->height != *height)
{ {
@ -112,11 +112,11 @@ static bool gfx_ctx_khr_display_set_resize(void *data,
return false; return false;
} }
if (khr->vk.created_new_swapchain) if (khr->vk.flags & VK_DATA_FLAG_CREATED_NEW_SWAPCHAIN)
vulkan_acquire_next_image(&khr->vk); vulkan_acquire_next_image(&khr->vk);
khr->vk.context.invalid_swapchain = true; khr->vk.context.invalid_swapchain = true;
khr->vk.need_new_swapchain = false; khr->vk.flags &= ~VK_DATA_FLAG_NEED_NEW_SWAPCHAIN;
return true; return true;
} }
@ -224,7 +224,7 @@ static void gfx_ctx_khr_display_set_swap_interval(void *data,
{ {
khr->swap_interval = swap_interval; khr->swap_interval = swap_interval;
if (khr->vk.swapchain) if (khr->vk.swapchain)
khr->vk.need_new_swapchain = true; khr->vk.flags |= VK_DATA_FLAG_NEED_NEW_SWAPCHAIN;
} }
} }

View File

@ -87,7 +87,7 @@ static void gfx_ctx_w_vk_swap_interval(void *data, int interval)
{ {
win32_vk_interval = interval; win32_vk_interval = interval;
if (win32_vk.swapchain) if (win32_vk.swapchain)
win32_vk.need_new_swapchain = true; win32_vk.flags |= VK_DATA_FLAG_NEED_NEW_SWAPCHAIN;
} }
} }
@ -99,7 +99,7 @@ static void gfx_ctx_w_vk_check_window(void *data, bool *quit,
win32_check_window(NULL, quit, resize, width, height); win32_check_window(NULL, quit, resize, width, height);
if (win32_vk.need_new_swapchain) if (win32_vk.flags & VK_DATA_FLAG_NEED_NEW_SWAPCHAIN)
*resize = true; *resize = true;
/* Trigger video driver init when changing refresh rate /* Trigger video driver init when changing refresh rate
@ -111,11 +111,12 @@ static void gfx_ctx_w_vk_check_window(void *data, bool *quit,
* Bigger than zero difference required in order to prevent * Bigger than zero difference required in order to prevent
* constant reinit when adjusting rate option in 0.001 increments. * constant reinit when adjusting rate option in 0.001 increments.
*/ */
if (win32_vk.fullscreen && g_win32_refresh_rate && if ( (win32_vk.flags & VK_DATA_FLAG_FULLSCREEN)
g_win32_refresh_rate != refresh_rate && && (g_win32_refresh_rate)
abs(g_win32_refresh_rate - refresh_rate) > 0 && && (g_win32_refresh_rate != refresh_rate)
g_win32_resize_width == *width && && (abs(g_win32_refresh_rate - refresh_rate) > 0)
g_win32_resize_height == *height) && (g_win32_resize_width == *width)
&& (g_win32_resize_height == *height))
{ {
g_win32_refresh_rate = settings->floats.video_refresh_rate; g_win32_refresh_rate = settings->floats.video_refresh_rate;
command_event(CMD_EVENT_REINIT, NULL); command_event(CMD_EVENT_REINIT, NULL);
@ -141,10 +142,10 @@ static bool gfx_ctx_w_vk_set_resize(void *data,
{ {
if (vulkan_create_swapchain(&win32_vk, width, height, win32_vk_interval)) if (vulkan_create_swapchain(&win32_vk, width, height, win32_vk_interval))
{ {
if (win32_vk.created_new_swapchain) if (win32_vk.flags & VK_DATA_FLAG_CREATED_NEW_SWAPCHAIN)
vulkan_acquire_next_image(&win32_vk); vulkan_acquire_next_image(&win32_vk);
win32_vk.context.invalid_swapchain = true; win32_vk.context.invalid_swapchain = true;
win32_vk.need_new_swapchain = false; win32_vk.flags &= ~VK_DATA_FLAG_NEED_NEW_SWAPCHAIN;
return true; return true;
} }
@ -267,7 +268,10 @@ static bool gfx_ctx_w_vk_set_video_mode(void *data,
unsigned width, unsigned height, unsigned width, unsigned height,
bool fullscreen) bool fullscreen)
{ {
win32_vk.fullscreen = fullscreen; if (fullscreen)
win32_vk.flags |= VK_DATA_FLAG_FULLSCREEN;
else
win32_vk.flags &= ~VK_DATA_FLAG_FULLSCREEN;
if (win32_set_video_mode(NULL, width, height, fullscreen)) if (win32_set_video_mode(NULL, width, height, fullscreen))
{ {

View File

@ -82,7 +82,7 @@ static void gfx_ctx_wl_check_window(void *data, bool *quit,
/* Swapchains are recreated in set_resize as a /* Swapchains are recreated in set_resize as a
* central place, so use that to trigger swapchain reinit. */ * central place, so use that to trigger swapchain reinit. */
*resize = wl->vk.need_new_swapchain; *resize = wl->vk.flags & VK_DATA_FLAG_NEED_NEW_SWAPCHAIN;
gfx_ctx_wl_check_window_common(wl, gfx_ctx_wl_get_video_size, quit, resize, gfx_ctx_wl_check_window_common(wl, gfx_ctx_wl_get_video_size, quit, resize,
width, height); width, height);
@ -96,10 +96,10 @@ static bool gfx_ctx_wl_set_resize(void *data, unsigned width, unsigned height)
if (vulkan_create_swapchain(&wl->vk, width, height, wl->swap_interval)) if (vulkan_create_swapchain(&wl->vk, width, height, wl->swap_interval))
{ {
wl->vk.context.invalid_swapchain = true; wl->vk.context.invalid_swapchain = true;
if (wl->vk.created_new_swapchain) if (wl->vk.flags & VK_DATA_FLAG_CREATED_NEW_SWAPCHAIN)
vulkan_acquire_next_image(&wl->vk); vulkan_acquire_next_image(&wl->vk);
wl->vk.need_new_swapchain = false; wl->vk.flags &= ~VK_DATA_FLAG_NEED_NEW_SWAPCHAIN;
wl_surface_set_buffer_scale(wl->surface, wl->buffer_scale); wl_surface_set_buffer_scale(wl->surface, wl->buffer_scale);
@ -196,7 +196,7 @@ static void gfx_ctx_wl_set_swap_interval(void *data, int swap_interval)
{ {
wl->swap_interval = swap_interval; wl->swap_interval = swap_interval;
if (wl->vk.swapchain) if (wl->vk.swapchain)
wl->vk.need_new_swapchain = true; wl->vk.flags |= VK_DATA_FLAG_NEED_NEW_SWAPCHAIN;
} }
} }

View File

@ -141,7 +141,7 @@ static void gfx_ctx_x_vk_swap_interval(void *data, int interval)
{ {
x->interval = interval; x->interval = interval;
if (x->vk.swapchain) if (x->vk.swapchain)
x->vk.need_new_swapchain = true; x->vk.flags |= VK_DATA_FLAG_NEED_NEW_SWAPCHAIN;
} }
} }
@ -168,7 +168,7 @@ static void gfx_ctx_x_vk_check_window(void *data, bool *quit,
gfx_ctx_x_vk_data_t *x = (gfx_ctx_x_vk_data_t*)data; gfx_ctx_x_vk_data_t *x = (gfx_ctx_x_vk_data_t*)data;
x11_check_window(data, quit, resize, width, height); x11_check_window(data, quit, resize, width, height);
if (x->vk.need_new_swapchain) if (x->vk.flags & VK_DATA_FLAG_NEED_NEW_SWAPCHAIN)
*resize = true; *resize = true;
} }
@ -198,10 +198,10 @@ static bool gfx_ctx_x_vk_set_resize(void *data,
return false; return false;
} }
if (x->vk.created_new_swapchain) if (x->vk.flags & VK_DATA_FLAG_CREATED_NEW_SWAPCHAIN)
vulkan_acquire_next_image(&x->vk); vulkan_acquire_next_image(&x->vk);
x->vk.context.invalid_swapchain = true; x->vk.context.invalid_swapchain = true;
x->vk.need_new_swapchain = false; x->vk.flags &= ~VK_DATA_FLAG_NEED_NEW_SWAPCHAIN;
return true; return true;
} }