Skip to content

Commit c6d8595

Browse files
MajorPainTheCactusLibretroAdmin
authored andcommitted
HDR: add menu brightness setting, remove MaxNits, refactor HDR UBO
Repurpose the old max_nits/Peak Luminance setting as a menu brightness control. When compositing the SDR menu/overlay into the HDR backbuffer, the driver temporarily overrides paper_white_nits with the new menu_nits value so the existing shader handles brightness correctly. - Rename set_hdr_max_nits -> set_hdr_menu_nits across all drivers - Remove MaxNits from slang reflection and internal shader UBOs - InverseTonemap/Tonemap now take explicit arguments (no UBO dependency) - Internal shaders use BrightnessNits consistently for scRGB scaling - Menu composite path: paper_white_nits = menu_nits during draw - New setting in Settings > User Interface > Appearance (HDR only) - Remove old Peak Luminance translations from locale files - Fix HDR Brightness format string (whole number, no decimal/suffix) - Default 200 nits, range 40-1000
1 parent 2ce2a36 commit c6d8595

87 files changed

Lines changed: 1619 additions & 1836 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

config.def.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -503,8 +503,8 @@
503503
/* HDR output mode: 0 = off, 1 = HDR10, 2 = scRGB */
504504
#define DEFAULT_VIDEO_HDR_MODE 0
505505

506-
/* The maximum nunmber of nits the actual display can show - needs to be calibrated */
507-
#define DEFAULT_VIDEO_HDR_MAX_NITS 1000.0f
506+
/* Brightness of the SDR menu/overlay when composited into the HDR backbuffer */
507+
#define DEFAULT_MENU_HDR_BRIGHTNESS_NITS 200.0f
508508

509509
/* The number of nits that paper white is at */
510510
#define DEFAULT_VIDEO_HDR_PAPER_WHITE_NITS 200.0f

configuration.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2384,7 +2384,7 @@ static struct config_float_setting *populate_settings_float(
23842384
SETTING_FLOAT("video_message_pos_y", &settings->floats.video_msg_pos_y, true, DEFAULT_MESSAGE_POS_OFFSET_Y, false);
23852385
SETTING_FLOAT("video_font_size", &settings->floats.video_font_size, true, DEFAULT_FONT_SIZE, false);
23862386
SETTING_FLOAT("video_msg_bgcolor_opacity", &settings->floats.video_msg_bgcolor_opacity, true, DEFAULT_MESSAGE_BGCOLOR_OPACITY, false);
2387-
SETTING_FLOAT("video_hdr_max_nits", &settings->floats.video_hdr_max_nits, true, DEFAULT_VIDEO_HDR_MAX_NITS, false);
2387+
SETTING_FLOAT("video_hdr_menu_nits", &settings->floats.video_hdr_menu_nits, true, DEFAULT_MENU_HDR_BRIGHTNESS_NITS, false);
23882388
SETTING_FLOAT("video_hdr_paper_white_nits", &settings->floats.video_hdr_paper_white_nits, true, DEFAULT_VIDEO_HDR_PAPER_WHITE_NITS, false);
23892389

23902390
SETTING_FLOAT("input_axis_threshold", &settings->floats.input_axis_threshold, true, DEFAULT_AXIS_THRESHOLD, false);

configuration.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ typedef struct settings
429429
float video_msg_color_g;
430430
float video_msg_color_b;
431431
float video_msg_bgcolor_opacity;
432-
float video_hdr_max_nits;
432+
float video_hdr_menu_nits;
433433
float video_hdr_paper_white_nits;
434434

435435
float menu_scale_factor;

gfx/common/dxgi_common.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ typedef struct ALIGN(16)
3535
float height;
3636
} output_size;
3737
float paper_white_nits; /* 200.0f */
38-
float max_nits; /* 1000.0f */
3938
unsigned subpixel_layout; /* 0 */
4039
float scanlines; /* 1.0f */
4140
unsigned expand_gamut; /* 0 */

gfx/drivers/caca_gfx.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ static const video_poke_interface_t caca_poke_interface = {
416416
NULL, /* get_current_shader */
417417
NULL, /* get_current_software_framebuffer */
418418
NULL, /* get_hw_render_interface */
419-
NULL, /* set_hdr_max_nits */
419+
NULL, /* set_hdr_menu_nits */
420420
NULL, /* set_hdr_paper_white_nits */
421421
NULL, /* set_hdr_expand_gamut */
422422
NULL, /* set_hdr_scanlines */

gfx/drivers/ctr_gfx.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2986,7 +2986,7 @@ static const video_poke_interface_t ctr_poke_interface = {
29862986
NULL, /* get_current_shader */
29872987
NULL, /* get_current_software_framebuffer */
29882988
NULL, /* get_hw_render_interface */
2989-
NULL, /* set_hdr_max_nits */
2989+
NULL, /* set_hdr_menu_nits */
29902990
NULL, /* set_hdr_paper_white_nits */
29912991
NULL, /* set_hdr_expand_gamut */
29922992
NULL, /* set_hdr_scanlines */

gfx/drivers/d3d10.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3268,7 +3268,7 @@ static const video_poke_interface_t d3d10_poke_interface = {
32683268
#else
32693269
NULL, /* get_hw_render_interface */
32703270
#endif
3271-
NULL, /* set_hdr_max_nits */
3271+
NULL, /* set_hdr_menu_nits */
32723272
NULL, /* set_hdr_paper_white_nits */
32733273
NULL, /* set_hdr_expand_gamut */
32743274
NULL, /* set_hdr_scanlines */

gfx/drivers/d3d11.c

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,7 @@ typedef struct
350350
{
351351
dxgi_hdr_uniform_t ubo_values;
352352
D3D11Buffer ubo;
353+
float menu_nits;
353354
float max_output_nits;
354355
float min_output_nits;
355356
float max_cll;
@@ -411,7 +412,6 @@ typedef struct
411412
#ifdef HAVE_DXGI_HDR
412413
unsigned hdr_mode;
413414
float paper_white_nits;
414-
float max_nits;
415415
unsigned expand_gamut;
416416
float scanlines;
417417
unsigned subpixel_layout;
@@ -1576,13 +1576,12 @@ static void d3d11_render_overlay(d3d11_video_t *d3d11)
15761576
#endif
15771577

15781578
#ifdef HAVE_DXGI_HDR
1579-
static void d3d11_set_hdr_max_nits(void *data, float max_nits)
1579+
static void d3d11_set_hdr_menu_nits(void *data, float menu_nits)
15801580
{
15811581
D3D11_MAPPED_SUBRESOURCE mapped_ubo;
15821582
d3d11_video_t* d3d11 = (d3d11_video_t*)data;
15831583

1584-
d3d11->hdr.max_output_nits = max_nits;
1585-
d3d11->hdr.ubo_values.max_nits = max_nits;
1584+
d3d11->hdr.menu_nits = menu_nits;
15861585

15871586
d3d11->context->lpVtbl->Map(
15881587
d3d11->context, (D3D11Resource)d3d11->hdr.ubo, 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &mapped_ubo);
@@ -1591,20 +1590,6 @@ static void d3d11_set_hdr_max_nits(void *data, float max_nits)
15911590
*ubo = d3d11->hdr.ubo_values;
15921591
}
15931592
d3d11->context->lpVtbl->Unmap(d3d11->context, (D3D11Resource)d3d11->hdr.ubo, 0);
1594-
1595-
/* Do NOT update display HDR metadata here. max_nits is an internal
1596-
* shader parameter (InverseTonemap target), not the actual mastering
1597-
* display luminance. Sending it as MaxMasteringLuminance causes the
1598-
* display's tone mapper to switch modes every time the user moves the
1599-
* slider, producing color shifts and delays. */
1600-
1601-
if(d3d11->shader_preset)
1602-
{
1603-
for (unsigned i = 0; i < d3d11->shader_preset->passes; i++)
1604-
{
1605-
d3d11->pass[i].max_nits = max_nits;
1606-
}
1607-
}
16081593
}
16091594

16101595
static void d3d11_set_hdr_paper_white_nits(void* data, float paper_white_nits)
@@ -1989,7 +1974,6 @@ static bool d3d11_gfx_set_shader(void* data, enum rarch_shader_type type, const
19891974
#ifdef HAVE_DXGI_HDR
19901975
&d3d11->pass[i].hdr_mode, /* HDRMode */
19911976
&d3d11->pass[i].paper_white_nits,/* PaperWhiteNits */
1992-
&d3d11->pass[i].max_nits, /* MaxNits */
19931977
&d3d11->pass[i].scanlines, /* Scanlines */
19941978
&d3d11->pass[i].subpixel_layout, /* SubpixelLayout */
19951979
&d3d11->pass[i].expand_gamut, /* ExpandGamut */
@@ -2632,7 +2616,7 @@ static void *d3d11_gfx_init(const video_info_t* video,
26322616
DXGICreateFactory1(&d3d11->factory);
26332617
#endif
26342618
#ifdef HAVE_DXGI_HDR
2635-
d3d11->hdr.max_output_nits = settings->floats.video_hdr_max_nits;
2619+
d3d11->hdr.max_output_nits = 1000.0f;
26362620
d3d11->hdr.min_output_nits = 0.001f;
26372621
d3d11->hdr.max_cll = 0.0f;
26382622
d3d11->hdr.max_fall = 0.0f;
@@ -2738,8 +2722,8 @@ static void *d3d11_gfx_init(const video_info_t* video,
27382722
d3d11->hdr.ubo_values.source_size.height = 0.0f;
27392723
d3d11->hdr.ubo_values.output_size.width = d3d11->frame.output_size.x;
27402724
d3d11->hdr.ubo_values.output_size.height = d3d11->frame.output_size.y;
2741-
d3d11->hdr.ubo_values.max_nits =
2742-
settings->floats.video_hdr_max_nits;
2725+
d3d11->hdr.menu_nits =
2726+
settings->floats.video_hdr_menu_nits;
27432727
d3d11->hdr.ubo_values.paper_white_nits =
27442728
settings->floats.video_hdr_paper_white_nits;
27452729
d3d11->hdr.ubo_values.scanlines =
@@ -3688,7 +3672,6 @@ static bool d3d11_gfx_frame(
36883672
if (d3d11->flags & D3D11_ST_FLAG_HDR_ENABLE)
36893673
{
36903674
d3d11->pass[i].paper_white_nits = settings->floats.video_hdr_paper_white_nits;
3691-
d3d11->pass[i].max_nits = settings->floats.video_hdr_max_nits;
36923675
d3d11->pass[i].scanlines = settings->bools.video_hdr_scanlines ? 1.0f : 0.0f;
36933676
d3d11->pass[i].subpixel_layout = settings->uints.video_hdr_subpixel_layout;
36943677
d3d11->pass[i].expand_gamut = settings->uints.video_hdr_expand_gamut;
@@ -4171,9 +4154,13 @@ static bool d3d11_gfx_frame(
41714154
const float prev_inverse_tonemap = d3d11->hdr.ubo_values.inverse_tonemap;
41724155
const float prev_hdr10 = d3d11->hdr.ubo_values.hdr10;
41734156
const unsigned prev_hdr_mode = d3d11->hdr.ubo_values.hdr_mode;
4157+
const float prev_paper_white_nits = d3d11->hdr.ubo_values.paper_white_nits;
41744158

41754159
d3d11->hdr.ubo_values.scanlines = 0.0f;
41764160

4161+
/* Menu/overlay composite: use menu_nits for SDR menu brightness */
4162+
d3d11->hdr.ubo_values.paper_white_nits = d3d11->hdr.menu_nits;
4163+
41774164
if (video_info->hdr_mode == 2) /* scRGB: menu source is SDR */
41784165
{
41794166
d3d11->hdr.ubo_values.inverse_tonemap = 0.0f;
@@ -4203,6 +4190,7 @@ static bool d3d11_gfx_frame(
42034190
d3d11->hdr.ubo_values.inverse_tonemap = prev_inverse_tonemap;
42044191
d3d11->hdr.ubo_values.hdr10 = prev_hdr10;
42054192
d3d11->hdr.ubo_values.hdr_mode = prev_hdr_mode;
4193+
d3d11->hdr.ubo_values.paper_white_nits = prev_paper_white_nits;
42064194
}
42074195

42084196
context->lpVtbl->VSSetConstantBuffers(context, 0, 1, &d3d11->hdr.ubo);
@@ -4698,13 +4686,13 @@ static const video_poke_interface_t d3d11_poke_interface = {
46984686
NULL, /* get_current_software_framebuffer */
46994687
d3d11_get_hw_render_interface,
47004688
#ifdef HAVE_DXGI_HDR
4701-
d3d11_set_hdr_max_nits,
4689+
d3d11_set_hdr_menu_nits,
47024690
d3d11_set_hdr_paper_white_nits,
47034691
d3d11_set_hdr_expand_gamut,
47044692
d3d11_set_hdr_scanlines,
47054693
d3d11_set_hdr_subpixel_layout
47064694
#else
4707-
NULL, /* set_hdr_max_nits */
4695+
NULL, /* set_hdr_menu_nits */
47084696
NULL, /* set_hdr_paper_white_nits */
47094697
NULL, /* set_hdr_expand_gamut */
47104698
NULL, /* set_hdr_scanlines */

gfx/drivers/d3d12.c

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,7 @@ typedef struct
340340
D3D12_CONSTANT_BUFFER_VIEW_DESC ubo_view;
341341
D3D12Resource ubo_post;
342342
D3D12_CONSTANT_BUFFER_VIEW_DESC ubo_post_view;
343+
float menu_nits;
343344
float max_output_nits;
344345
float min_output_nits;
345346
float max_cll;
@@ -406,7 +407,6 @@ typedef struct
406407
#ifdef HAVE_DXGI_HDR
407408
unsigned hdr_mode;
408409
float paper_white_nits;
409-
float max_nits;
410410
float scanlines;
411411
unsigned subpixel_layout;
412412
unsigned expand_gamut;
@@ -1885,25 +1885,10 @@ static void d3d12_render_overlay(d3d12_video_t *d3d12)
18851885
#endif
18861886

18871887
#ifdef HAVE_DXGI_HDR
1888-
static void d3d12_set_hdr_max_nits(void* data, float max_nits)
1888+
static void d3d12_set_hdr_menu_nits(void* data, float menu_nits)
18891889
{
18901890
d3d12_video_t *d3d12 = (d3d12_video_t*)data;
1891-
d3d12->hdr.max_output_nits = max_nits;
1892-
d3d12->hdr.ubo_values.max_nits = max_nits;
1893-
1894-
/* Do NOT update display HDR metadata here. max_nits is an internal
1895-
* shader parameter (InverseTonemap target), not the actual mastering
1896-
* display luminance. Sending it as MaxMasteringLuminance causes the
1897-
* display's tone mapper to switch modes every time the user moves the
1898-
* slider, producing color shifts and delays. */
1899-
1900-
if(d3d12->shader_preset)
1901-
{
1902-
for (unsigned i = 0; i < d3d12->shader_preset->passes; i++)
1903-
{
1904-
d3d12->pass[i].max_nits = max_nits;
1905-
}
1906-
}
1891+
d3d12->hdr.menu_nits = menu_nits;
19071892
}
19081893

19091894
static void d3d12_set_hdr_paper_white_nits(void* data, float paper_white_nits)
@@ -2270,7 +2255,6 @@ static bool d3d12_gfx_set_shader(void* data, enum rarch_shader_type type, const
22702255
#ifdef HAVE_DXGI_HDR
22712256
&d3d12->pass[i].hdr_mode, /* HDRMode */
22722257
&d3d12->pass[i].paper_white_nits,/* PaperWhiteNits */
2273-
&d3d12->pass[i].max_nits, /* MaxNits */
22742258
&d3d12->pass[i].scanlines, /* Scanlines */
22752259
&d3d12->pass[i].subpixel_layout, /* SubpixelLayout */
22762260
&d3d12->pass[i].expand_gamut, /* ExpandGamut */
@@ -3592,7 +3576,7 @@ static void *d3d12_gfx_init(const video_info_t* video,
35923576
d3d12->flags |= D3D12_ST_FLAG_HDR_ENABLE;
35933577
else
35943578
d3d12->flags &= ~D3D12_ST_FLAG_HDR_ENABLE;
3595-
d3d12->hdr.max_output_nits = settings->floats.video_hdr_max_nits;
3579+
d3d12->hdr.max_output_nits = 1000.0f;
35963580
d3d12->hdr.min_output_nits = 0.001f;
35973581
d3d12->hdr.max_cll = 0.0f;
35983582
d3d12->hdr.max_fall = 0.0f;
@@ -3678,7 +3662,7 @@ static void *d3d12_gfx_init(const video_info_t* video,
36783662
d3d12_create_buffer(d3d12->device, d3d12->hdr.ubo_post_view.SizeInBytes, &d3d12->hdr.ubo_post);
36793663

36803664
d3d12->hdr.ubo_values.mvp = d3d12->mvp_no_rot;
3681-
d3d12->hdr.ubo_values.max_nits = settings->floats.video_hdr_max_nits;
3665+
d3d12->hdr.menu_nits = settings->floats.video_hdr_menu_nits;
36823666
d3d12->hdr.ubo_values.paper_white_nits = settings->floats.video_hdr_paper_white_nits;
36833667

36843668
d3d12->hdr.ubo_values.source_size.width = 0.0f;
@@ -4429,7 +4413,6 @@ static bool d3d12_gfx_frame(
44294413
if(d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE)
44304414
{
44314415
d3d12->pass[i].paper_white_nits = settings->floats.video_hdr_paper_white_nits;
4432-
d3d12->pass[i].max_nits = settings->floats.video_hdr_max_nits;
44334416
d3d12->pass[i].scanlines = settings->bools.video_hdr_scanlines ? 1.0f : 0.0f;
44344417
d3d12->pass[i].subpixel_layout = settings->uints.video_hdr_subpixel_layout;
44354418
d3d12->pass[i].expand_gamut = settings->uints.video_hdr_expand_gamut;
@@ -5029,9 +5012,13 @@ static bool d3d12_gfx_frame(
50295012
const float prev_inverse_tonemap = d3d12->hdr.ubo_values.inverse_tonemap;
50305013
const float prev_hdr10 = d3d12->hdr.ubo_values.hdr10;
50315014
const unsigned prev_hdr_mode = d3d12->hdr.ubo_values.hdr_mode;
5015+
const float prev_paper_white_nits = d3d12->hdr.ubo_values.paper_white_nits;
50325016

50335017
d3d12->hdr.ubo_values.scanlines = 0.0f;
50345018

5019+
/* Menu/overlay composite: use menu_nits for SDR menu brightness */
5020+
d3d12->hdr.ubo_values.paper_white_nits = d3d12->hdr.menu_nits;
5021+
50355022
if (video_info->hdr_mode == 2) /* scRGB: menu source is SDR */
50365023
{
50375024
d3d12->hdr.ubo_values.inverse_tonemap = 0.0f;
@@ -5063,6 +5050,7 @@ static bool d3d12_gfx_frame(
50635050
d3d12->hdr.ubo_values.inverse_tonemap = prev_inverse_tonemap;
50645051
d3d12->hdr.ubo_values.hdr10 = prev_hdr10;
50655052
d3d12->hdr.ubo_values.hdr_mode = prev_hdr_mode;
5053+
d3d12->hdr.ubo_values.paper_white_nits = prev_paper_white_nits;
50665054
}
50675055

50685056
cmd->lpVtbl->IASetVertexBuffers(cmd, 0, 1, &d3d12->frame.vbo_view);
@@ -5462,13 +5450,13 @@ static const video_poke_interface_t d3d12_poke_interface = {
54625450
NULL, /* get_current_software_framebuffer */
54635451
d3d12_get_hw_render_interface,
54645452
#ifdef HAVE_DXGI_HDR
5465-
d3d12_set_hdr_max_nits,
5453+
d3d12_set_hdr_menu_nits,
54665454
d3d12_set_hdr_paper_white_nits,
54675455
d3d12_set_hdr_expand_gamut,
54685456
d3d12_set_hdr_scanlines,
54695457
d3d12_set_hdr_subpixel_layout
54705458
#else
5471-
NULL, /* set_hdr_max_nits */
5459+
NULL, /* set_hdr_menu_nits */
54725460
NULL, /* set_hdr_paper_white_nits */
54735461
NULL, /* set_hdr_expand_gamut */
54745462
NULL, /* set_hdr_scanlines */

gfx/drivers/d3d8.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2172,7 +2172,7 @@ static const video_poke_interface_t d3d_poke_interface = {
21722172
NULL, /* get_current_shader */
21732173
NULL, /* get_current_software_framebuffer */
21742174
NULL, /* get_hw_render_interface */
2175-
NULL, /* set_hdr_max_nits */
2175+
NULL, /* set_hdr_menu_nits */
21762176
NULL, /* set_hdr_paper_white_nits */
21772177
NULL, /* set_hdr_expand_gamut */
21782178
NULL, /* set_hdr_scanlines */

0 commit comments

Comments
 (0)