Skip to content

Commit fc4a692

Browse files
D3D12/Vulkan: Fix HDR blend for widgets/OSD text, add gfx_widgets_visible() (#18703)
1 parent 99bf823 commit fc4a692

13 files changed

Lines changed: 190 additions & 15 deletions

gfx/drivers/d3d12.c

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4642,9 +4642,21 @@ static bool d3d12_gfx_frame(
46424642
cmd->lpVtbl->SetPipelineState(cmd, d3d12->pipes[VIDEO_SHADER_STOCK_BLEND]);
46434643
cmd->lpVtbl->SetGraphicsRootSignature(cmd, d3d12->desc.rootSignature);
46444644

4645+
#ifdef HAVE_GFX_WIDGETS
4646+
const bool widgets_visible = gfx_widgets_visible(video_info);
4647+
#endif
4648+
4649+
const bool message_visible = ((statistics_show) && (osd_params)) || (msg && *msg);
4650+
46454651
#ifdef HAVE_DXGI_HDR
46464652
if ((d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE) &&
4647-
((d3d12->flags & D3D12_ST_FLAG_MENU_ENABLE) || (d3d12->flags & D3D12_ST_FLAG_OVERLAYS_ENABLE)))
4653+
( (d3d12->flags & D3D12_ST_FLAG_MENU_ENABLE)
4654+
|| (d3d12->flags & D3D12_ST_FLAG_OVERLAYS_ENABLE)
4655+
|| message_visible
4656+
#ifdef HAVE_GFX_WIDGETS
4657+
|| widgets_visible
4658+
#endif
4659+
))
46484660
{
46494661
d3d12->chain.current_rt_format = d3d12->chain.back_buffer.desc.Format;
46504662

@@ -4762,7 +4774,13 @@ static bool d3d12_gfx_frame(
47624774
#ifdef HAVE_DXGI_HDR
47634775
/* Copy over back buffer to swap chain render targets */
47644776
if ((d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE) &&
4765-
((d3d12->flags & D3D12_ST_FLAG_MENU_ENABLE) || (d3d12->flags & D3D12_ST_FLAG_OVERLAYS_ENABLE)))
4777+
( (d3d12->flags & D3D12_ST_FLAG_MENU_ENABLE)
4778+
|| (d3d12->flags & D3D12_ST_FLAG_OVERLAYS_ENABLE)
4779+
|| message_visible
4780+
#ifdef HAVE_GFX_WIDGETS
4781+
|| widgets_visible
4782+
#endif
4783+
))
47664784
{
47674785
D3D12_RESOURCE_TRANSITION(
47684786
cmd,

gfx/drivers/vulkan.c

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5159,8 +5159,19 @@ static bool vulkan_frame(void *data, const void *frame,
51595159
end_main_pass = false;
51605160
}
51615161

5162+
const bool message_visible = !string_is_empty(msg);
5163+
5164+
#ifdef HAVE_GFX_WIDGETS
5165+
const bool widgets_visible = gfx_widgets_visible(video_info);
5166+
#endif
5167+
51625168
if ((vk->context->flags & VK_CTX_FLAG_HDR_ENABLE) &&
5163-
((vk->flags & VK_FLAG_MENU_ENABLE) || (vk->flags & VK_FLAG_OVERLAY_ENABLE)) &&
5169+
((vk->flags & VK_FLAG_MENU_ENABLE) || (vk->flags & VK_FLAG_OVERLAY_ENABLE)
5170+
|| message_visible
5171+
#ifdef HAVE_GFX_WIDGETS
5172+
|| widgets_visible
5173+
#endif
5174+
) &&
51645175
(vk->offscreen_buffer.image != VK_NULL_HANDLE))
51655176
{
51665177
if(end_pass) vkCmdEndRenderPass(vk->cmd);
@@ -5242,7 +5253,7 @@ static bool vulkan_frame(void *data, const void *frame,
52425253
vulkan_render_overlay(vk, video_width, video_height);
52435254
#endif
52445255

5245-
if (!string_is_empty(msg))
5256+
if (message_visible)
52465257
font_driver_render_msg(vk, msg, NULL, NULL);
52475258

52485259
#ifdef HAVE_GFX_WIDGETS
@@ -5256,7 +5267,12 @@ static bool vulkan_frame(void *data, const void *frame,
52565267
#ifdef VULKAN_HDR_SWAPCHAIN
52575268
/* Copy over back buffer to swap chain render targets */
52585269
if ((vk->context->flags & VK_CTX_FLAG_HDR_ENABLE) &&
5259-
((vk->flags & VK_FLAG_MENU_ENABLE) || (vk->flags & VK_FLAG_OVERLAY_ENABLE)) &&
5270+
((vk->flags & VK_FLAG_MENU_ENABLE) || (vk->flags & VK_FLAG_OVERLAY_ENABLE)
5271+
|| message_visible
5272+
#ifdef HAVE_GFX_WIDGETS
5273+
|| widgets_visible
5274+
#endif
5275+
) &&
52605276
(vk->offscreen_buffer.image != VK_NULL_HANDLE))
52615277
{
52625278
backbuffer = &vk->backbuffers[swapchain_index];

gfx/gfx_widgets.c

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1543,6 +1543,54 @@ static void gfx_widgets_draw_regular_msg(
15431543
}
15441544
}
15451545

1546+
bool gfx_widgets_visible(void *data)
1547+
{
1548+
size_t i;
1549+
video_frame_info_t *video_info = (video_frame_info_t*)data;
1550+
dispgfx_widget_t *p_dispwidget = (dispgfx_widget_t*)video_info->widgets_userdata;
1551+
bool fps_show = video_info->fps_show;
1552+
bool framecount_show = video_info->framecount_show;
1553+
bool memory_show = video_info->memory_show;
1554+
bool core_status_msg_show = video_info->core_status_msg_show;
1555+
bool widgets_is_paused = (video_info->video_st_flags & VIDEO_FLAG_WIDGETS_PAUSED) ? true : false;
1556+
bool widgets_is_fastforwarding = (video_info->video_st_flags & VIDEO_FLAG_WIDGETS_FAST_FORWARD) ? true : false;
1557+
bool widgets_is_rewinding = (video_info->video_st_flags & VIDEO_FLAG_WIDGETS_REWINDING) ? true : false;
1558+
bool runloop_is_slowmotion = video_info->runloop_is_slowmotion;
1559+
bool notifications_hidden = video_info->notifications_hidden || video_info->msg_queue_delay;
1560+
1561+
#ifdef HAVE_MENU
1562+
if ((video_info->menu_st_flags & MENU_ST_FLAG_SCREENSAVER_ACTIVE))
1563+
return false;
1564+
#endif
1565+
1566+
if (notifications_hidden)
1567+
return false;
1568+
1569+
#ifdef HAVE_TRANSLATE
1570+
if (p_dispwidget->ai_service_overlay_state > 0)
1571+
return true;
1572+
#endif
1573+
1574+
if (fps_show || framecount_show || memory_show || core_status_msg_show)
1575+
return true;
1576+
1577+
if (widgets_is_paused || widgets_is_fastforwarding
1578+
|| widgets_is_rewinding || runloop_is_slowmotion)
1579+
return true;
1580+
1581+
for (i = 0; i < ARRAY_SIZE(widgets); i++)
1582+
{
1583+
const gfx_widget_t* widget = widgets[i];
1584+
if (widget->visible && widget->visible())
1585+
return true;
1586+
}
1587+
1588+
if (p_dispwidget->current_msgs_size)
1589+
return true;
1590+
1591+
return false;
1592+
}
1593+
15461594
void gfx_widgets_frame(void *data)
15471595
{
15481596
size_t i;

gfx/gfx_widgets.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,11 @@ struct gfx_widget
309309
* -- userdata is a dispgfx_widget_t
310310
* -> draw the widget here */
311311
void (*frame)(void* data, void *userdata);
312+
313+
/* called to check if the widget is currently
314+
* drawing anything on screen
315+
* -> return true if the widget is active */
316+
bool (*visible)(void);
312317
};
313318

314319
float gfx_widgets_get_thumbnail_scale_factor(
@@ -417,6 +422,8 @@ bool gfx_widget_start_load_content_animation(void);
417422
* enable_menu_widgets to true for that driver */
418423
void gfx_widgets_frame(void *data);
419424

425+
bool gfx_widgets_visible(void *data);
426+
420427
bool gfx_widgets_ready(void);
421428

422429
dispgfx_widget_t *dispwidget_get_ptr(void);

gfx/widgets/gfx_widget_achievement_popup.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -632,12 +632,20 @@ void gfx_widgets_push_achievement(const char* title, const char* subtitle, const
632632
#endif
633633
}
634634

635+
static bool gfx_widget_achievement_popup_visible(void)
636+
{
637+
gfx_widget_achievement_popup_state_t *state = &p_w_achievement_popup_st;
638+
return state->queue_read_index >= 0
639+
&& state->queue[state->queue_read_index].title;
640+
}
641+
635642
const gfx_widget_t gfx_widget_achievement_popup = {
636643
&gfx_widget_achievement_popup_init,
637644
&gfx_widget_achievement_popup_free,
638645
NULL, /* context_reset*/
639646
&gfx_widget_achievement_popup_context_destroy,
640647
NULL, /* layout */
641648
NULL, /* iterate */
642-
&gfx_widget_achievement_popup_frame
649+
&gfx_widget_achievement_popup_frame,
650+
&gfx_widget_achievement_popup_visible
643651
};

gfx/widgets/gfx_widget_generic_message.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -557,12 +557,19 @@ static void gfx_widget_generic_message_free(void)
557557

558558
/* Widget definition */
559559

560+
static bool gfx_widget_generic_message_visible(void)
561+
{
562+
gfx_widget_generic_message_state_t *state = &p_w_generic_message_st;
563+
return state->status != GFX_WIDGET_GENERIC_MESSAGE_IDLE;
564+
}
565+
560566
const gfx_widget_t gfx_widget_generic_message = {
561567
NULL, /* init */
562568
gfx_widget_generic_message_free,
563569
NULL, /* context_reset*/
564570
NULL, /* context_destroy */
565571
gfx_widget_generic_message_layout,
566572
gfx_widget_generic_message_iterate,
567-
gfx_widget_generic_message_frame
573+
gfx_widget_generic_message_frame,
574+
gfx_widget_generic_message_visible
568575
};

gfx/widgets/gfx_widget_leaderboard_display.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -635,12 +635,24 @@ void gfx_widget_set_cheevos_set_loading(bool value)
635635
}
636636

637637

638+
static bool gfx_widget_leaderboard_display_visible(void)
639+
{
640+
gfx_widget_leaderboard_display_state_t *state =
641+
&p_w_leaderboard_display_st;
642+
return state->tracker_count != 0
643+
|| state->challenge_count != 0
644+
|| state->progress_tracker.show_until != 0
645+
|| state->loading
646+
|| state->disconnected;
647+
}
648+
638649
const gfx_widget_t gfx_widget_leaderboard_display = {
639650
&gfx_widget_leaderboard_display_init,
640651
&gfx_widget_leaderboard_display_free,
641652
NULL, /* context_reset*/
642653
&gfx_widget_leaderboard_display_context_destroy,
643654
NULL, /* layout */
644655
NULL, /* iterate */
645-
&gfx_widget_leaderboard_display_frame
656+
&gfx_widget_leaderboard_display_frame,
657+
&gfx_widget_leaderboard_display_visible
646658
};

gfx/widgets/gfx_widget_libretro_message.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -500,12 +500,19 @@ static void gfx_widget_libretro_message_free(void)
500500

501501
/* Widget definition */
502502

503+
static bool gfx_widget_libretro_message_visible(void)
504+
{
505+
gfx_widget_libretro_message_state_t *state = &p_w_libretro_message_st;
506+
return state->status != GFX_WIDGET_LIBRETRO_MESSAGE_IDLE;
507+
}
508+
503509
const gfx_widget_t gfx_widget_libretro_message = {
504510
NULL, /* init */
505511
gfx_widget_libretro_message_free,
506512
NULL, /* context_reset*/
507513
NULL, /* context_destroy */
508514
gfx_widget_libretro_message_layout,
509515
gfx_widget_libretro_message_iterate,
510-
gfx_widget_libretro_message_frame
516+
gfx_widget_libretro_message_frame,
517+
gfx_widget_libretro_message_visible
511518
};

gfx/widgets/gfx_widget_load_content_animation.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1012,12 +1012,20 @@ static bool gfx_widget_load_content_animation_init(
10121012
}
10131013
/* Widget definition */
10141014

1015+
static bool gfx_widget_load_content_animation_visible(void)
1016+
{
1017+
gfx_widget_load_content_animation_state_t *state =
1018+
&p_w_load_content_animation_st;
1019+
return state->status != GFX_WIDGET_LOAD_CONTENT_IDLE;
1020+
}
1021+
10151022
const gfx_widget_t gfx_widget_load_content_animation = {
10161023
gfx_widget_load_content_animation_init,
10171024
gfx_widget_load_content_animation_free,
10181025
gfx_widget_load_content_animation_context_reset,
10191026
gfx_widget_load_content_animation_context_destroy,
10201027
gfx_widget_load_content_animation_layout,
10211028
gfx_widget_load_content_animation_iterate,
1022-
gfx_widget_load_content_animation_frame
1029+
gfx_widget_load_content_animation_frame,
1030+
gfx_widget_load_content_animation_visible
10231031
};

gfx/widgets/gfx_widget_progress_message.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,12 +334,19 @@ static void gfx_widget_progress_message_free(void)
334334

335335
/* Widget definition */
336336

337+
static bool gfx_widget_progress_message_visible(void)
338+
{
339+
gfx_widget_progress_message_state_t *state = &p_w_progress_message_st;
340+
return state->active;
341+
}
342+
337343
const gfx_widget_t gfx_widget_progress_message = {
338344
NULL, /* init */
339345
gfx_widget_progress_message_free,
340346
NULL, /* context_reset*/
341347
NULL, /* context_destroy */
342348
gfx_widget_progress_message_layout,
343349
NULL, /* iterate */
344-
gfx_widget_progress_message_frame
350+
gfx_widget_progress_message_frame,
351+
gfx_widget_progress_message_visible
345352
};

0 commit comments

Comments
 (0)