Skip to content

Commit

Permalink
Vulkan: Add adaptive vsync support
Browse files Browse the repository at this point in the history
  • Loading branch information
sonninnos committed Feb 21, 2025
1 parent 9005e1b commit f2ddb23
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 8 deletions.
14 changes: 12 additions & 2 deletions gfx/common/vulkan_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -1533,7 +1533,7 @@ bool vulkan_surface_create(gfx_ctx_vulkan_data_t *vk,
enum vulkan_wsi_type type,
void *display, void *surface,
unsigned width, unsigned height,
unsigned swap_interval)
int8_t swap_interval)
{
switch (type)
{
Expand Down Expand Up @@ -1914,7 +1914,7 @@ bool vulkan_is_hdr10_format(VkFormat format)

bool vulkan_create_swapchain(gfx_ctx_vulkan_data_t *vk,
unsigned width, unsigned height,
unsigned swap_interval)
int8_t swap_interval)
{
unsigned i;
uint32_t format_count;
Expand Down Expand Up @@ -2028,6 +2028,9 @@ bool vulkan_create_swapchain(gfx_ctx_vulkan_data_t *vk,

vk->context.swap_interval = swap_interval;

for (i = 0; i < present_mode_count; i++)
vk->context.present_modes[i] = present_modes[i];

/* Prefer IMMEDIATE without vsync */
for (i = 0; i < present_mode_count; i++)
{
Expand All @@ -2038,6 +2041,13 @@ bool vulkan_create_swapchain(gfx_ctx_vulkan_data_t *vk,
swapchain_present_mode = VK_PRESENT_MODE_IMMEDIATE_KHR;
break;
}

if ( swap_interval < 0
&& present_modes[i] == VK_PRESENT_MODE_FIFO_RELAXED_KHR)
{
swapchain_present_mode = VK_PRESENT_MODE_FIFO_RELAXED_KHR;
break;
}
}

/* If still in FIFO with no swap interval, try MAILBOX */
Expand Down
7 changes: 4 additions & 3 deletions gfx/common/vulkan_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -363,6 +363,7 @@ typedef struct vulkan_context
VkPhysicalDeviceProperties gpu_properties;
VkPhysicalDeviceMemoryProperties memory_properties;

VkPresentModeKHR present_modes[16];
VkImage swapchain_images[VULKAN_MAX_SWAPCHAIN_IMAGES];
VkFence swapchain_fences[VULKAN_MAX_SWAPCHAIN_IMAGES];
VkFormat swapchain_format;
Expand All @@ -385,9 +386,9 @@ typedef struct vulkan_context

unsigned swapchain_width;
unsigned swapchain_height;
unsigned swap_interval;
unsigned num_recycled_acquire_semaphores;

int8_t swap_interval;
uint8_t flags;

bool swapchain_fences_signalled[VULKAN_MAX_SWAPCHAIN_IMAGES];
Expand Down Expand Up @@ -723,15 +724,15 @@ bool vulkan_surface_create(gfx_ctx_vulkan_data_t *vk,
enum vulkan_wsi_type type,
void *display, void *surface,
unsigned width, unsigned height,
unsigned swap_interval);
int8_t swap_interval);

void vulkan_present(gfx_ctx_vulkan_data_t *vk, unsigned index);

void vulkan_acquire_next_image(gfx_ctx_vulkan_data_t *vk);

bool vulkan_create_swapchain(gfx_ctx_vulkan_data_t *vk,
unsigned width, unsigned height,
unsigned swap_interval);
int8_t swap_interval);

void vulkan_debug_mark_image(VkDevice device, VkImage image);
void vulkan_debug_mark_memory(VkDevice device, VkDeviceMemory memory);
Expand Down
16 changes: 15 additions & 1 deletion gfx/drivers_context/w_vk_ctx.c
Original file line number Diff line number Diff line change
Expand Up @@ -271,10 +271,24 @@ static void *gfx_ctx_w_vk_get_context_data(void *data) { return &win32_vk.contex

static uint32_t gfx_ctx_w_vk_get_flags(void *data)
{
uint32_t flags = 0;
uint32_t flags = 0;
uint8_t present_mode_count = 16;
uint8_t i = 0;

/* Check for FIFO_RELAXED_KHR capability */
for (i = 0; i < present_mode_count; i++)
{
if (win32_vk.context.present_modes[i] == VK_PRESENT_MODE_FIFO_RELAXED_KHR)
{
BIT32_SET(flags, GFX_CTX_FLAGS_ADAPTIVE_VSYNC);
break;
}
}

#if defined(HAVE_SLANG) && defined(HAVE_SPIRV_CROSS)
BIT32_SET(flags, GFX_CTX_FLAGS_SHADERS_SLANG);
#endif

return flags;
}

Expand Down
16 changes: 14 additions & 2 deletions gfx/drivers_context/x_vk_ctx.c
Original file line number Diff line number Diff line change
Expand Up @@ -526,8 +526,20 @@ static void *gfx_ctx_x_vk_get_context_data(void *data)

static uint32_t gfx_ctx_x_vk_get_flags(void *data)
{
uint32_t flags = 0;
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;
uint32_t flags = 0;
uint8_t present_mode_count = 16;
uint8_t i = 0;

/* Check for FIFO_RELAXED_KHR capability */
for (i = 0; i < present_mode_count; i++)
{
if (x->vk.context.present_modes[i] == VK_PRESENT_MODE_FIFO_RELAXED_KHR)
{
BIT32_SET(flags, GFX_CTX_FLAGS_ADAPTIVE_VSYNC);
break;
}
}

#if defined(HAVE_SLANG) && defined(HAVE_SPIRV_CROSS)
BIT32_SET(flags, GFX_CTX_FLAGS_SHADERS_SLANG);
Expand Down

0 comments on commit f2ddb23

Please sign in to comment.