Skip to content

Commit f1da646

Browse files
HDR: Fix WIDE gamut mode with direct P3-to-2020 colour matrix (#18682)
Replace the incorrect two-step conversion (709->2020 then 2020->P3) in the WIDE gamut mode with a single direct kP3to2020 matrix that correctly converts DCI-P3 colour primaries into Rec.2020. Add the kP3to2020 colour rotation matrix to HLSL (hdr_sm5.hlsl.h), GLSL (hdr_common.glsl), and the Vulkan fragment shader (hdr.frag). Rebuild SPIR-V shader binaries.
1 parent 86d25ec commit f1da646

5 files changed

Lines changed: 882 additions & 851 deletions

File tree

gfx/drivers/d3d_shaders/hdr_sm5.hlsl.h

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,13 @@ static const float3x3 k709to2020 =
111111
{ 0.0163916f, 0.0880132f, 0.8955950f }
112112
};
113113

114+
static const float3x3 kP3to2020 =
115+
{
116+
{ 0.753833f, 0.198597f, 0.047570f },
117+
{ 0.045744f, 0.941777f, 0.012479f },
118+
{-0.001210f, 0.017602f, 0.983609f }
119+
};
120+
114121
static const float3x3 k2020toP3 =
115122
{
116123
{ 1.343578f, -0.282180f, -0.061399f },
@@ -184,12 +191,11 @@ float3 To2020(const float3 sdr_linear)
184191
}
185192
else if(global.expand_gamut == 1)
186193
{
187-
rec2020 = mul( kExpanded709to2020, sdr_linear);
194+
rec2020 = mul(kExpanded709to2020, sdr_linear);
188195
}
189196
else if(global.expand_gamut == 2)
190197
{
191-
rec2020 = mul(k709to2020, sdr_linear);
192-
rec2020 = mul(k2020toP3, rec2020);
198+
rec2020 = mul(kP3to2020, sdr_linear);
193199
}
194200
else
195201
{
@@ -211,12 +217,11 @@ float4 To2020(const float4 sdr_linear)
211217
}
212218
else if(global.expand_gamut == 1)
213219
{
214-
rec2020 = mul( kExpanded709to2020, sdr_linear.rgb);
220+
rec2020 = mul(kExpanded709to2020, sdr_linear.rgb);
215221
}
216222
else if(global.expand_gamut == 2)
217223
{
218-
rec2020 = mul(k709to2020, sdr_linear.rgb);
219-
rec2020 = mul(k2020toP3, rec2020);
224+
rec2020 = mul(kP3to2020, sdr_linear.rgb);
220225
}
221226
else
222227
{

gfx/drivers/vulkan_shaders/hdr.frag

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,7 @@ vec3 To2020(const vec3 sdr_linear)
118118
}
119119
else if(gamut == 2u)
120120
{
121-
rec2020 = sdr_linear * k709to2020;
122-
rec2020 = rec2020 * k2020toP3;
121+
rec2020 = sdr_linear * kP3to2020;
123122
}
124123
else
125124
{
@@ -147,8 +146,7 @@ vec4 To2020(const vec4 sdr_linear)
147146
}
148147
else if(gamut == 2u)
149148
{
150-
rec2020 = sdr_linear.rgb * k709to2020;
151-
rec2020 = rec2020 * k2020toP3;
149+
rec2020 = sdr_linear.rgb * kP3to2020;
152150
}
153151
else
154152
{

0 commit comments

Comments
 (0)