Skip to content

Commit b024cbb

Browse files
D3D12: Fix HDR blend for widgets/OSD text, add gfx_widgets_visible()
Add gfx_widgets_visible() to check if any widgets are actively drawing on screen without performing actual rendering. Each widget gets a new optional 'visible' callback in gfx_widget_t that reports its draw state. Use this in the D3D12 HDR path to ensure the SDR-to-HDR composition pass runs when widgets or OSD messages are visible, not just when the menu or overlays are enabled. This fixes text and widget rendering appearing washed out or invisible in HDR mode.
1 parent e661dde commit b024cbb

12 files changed

+171
-12
lines changed

gfx/drivers/d3d12.c

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

4658+
#ifdef HAVE_GFX_WIDGETS
4659+
const bool widgets_visible = gfx_widgets_visible(video_info);
4660+
#endif
4661+
4662+
const bool message_visible = ((statistics_show) && (osd_params)) || (msg && *msg);
4663+
46584664
#ifdef HAVE_DXGI_HDR
46594665
if ((d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE) &&
4660-
((d3d12->flags & D3D12_ST_FLAG_MENU_ENABLE) || (d3d12->flags & D3D12_ST_FLAG_OVERLAYS_ENABLE)))
4666+
( (d3d12->flags & D3D12_ST_FLAG_MENU_ENABLE)
4667+
|| (d3d12->flags & D3D12_ST_FLAG_OVERLAYS_ENABLE)
4668+
|| message_visible
4669+
#ifdef HAVE_GFX_WIDGETS
4670+
|| widgets_visible
4671+
#endif
4672+
))
46614673
{
46624674
d3d12->chain.current_rt_format = d3d12->chain.back_buffer.desc.Format;
46634675

@@ -4775,7 +4787,13 @@ static bool d3d12_gfx_frame(
47754787
#ifdef HAVE_DXGI_HDR
47764788
/* Copy over back buffer to swap chain render targets */
47774789
if ((d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE) &&
4778-
((d3d12->flags & D3D12_ST_FLAG_MENU_ENABLE) || (d3d12->flags & D3D12_ST_FLAG_OVERLAYS_ENABLE)))
4790+
( (d3d12->flags & D3D12_ST_FLAG_MENU_ENABLE)
4791+
|| (d3d12->flags & D3D12_ST_FLAG_OVERLAYS_ENABLE)
4792+
|| message_visible
4793+
#ifdef HAVE_GFX_WIDGETS
4794+
|| widgets_visible
4795+
#endif
4796+
))
47794797
{
47804798
D3D12_RESOURCE_TRANSITION(
47814799
cmd,

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
};

gfx/widgets/gfx_widget_screenshot.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -453,12 +453,19 @@ static bool gfx_widget_screenshot_init(
453453
return false;
454454
}
455455

456+
static bool gfx_widget_screenshot_visible(void)
457+
{
458+
gfx_widget_screenshot_state_t *state = &p_w_screenshot_st;
459+
return state->loaded || state->alpha > 0.0f;
460+
}
461+
456462
const gfx_widget_t gfx_widget_screenshot = {
457463
gfx_widget_screenshot_init,
458464
gfx_widget_screenshot_free,
459465
NULL, /* context_reset*/
460466
gfx_widget_screenshot_context_destroy,
461467
NULL, /* layout */
462468
gfx_widget_screenshot_iterate,
463-
gfx_widget_screenshot_frame
469+
gfx_widget_screenshot_frame,
470+
gfx_widget_screenshot_visible
464471
};

0 commit comments

Comments
 (0)