diff --git a/src/render/direct3d11/SDL_render_d3d11.c b/src/render/direct3d11/SDL_render_d3d11.c index 9ec760e25d..0128ff793a 100644 --- a/src/render/direct3d11/SDL_render_d3d11.c +++ b/src/render/direct3d11/SDL_render_d3d11.c @@ -2282,13 +2282,27 @@ static void D3D11_SetupShaderConstants(SDL_Renderer *renderer, const SDL_RenderC } } +static bool PQShaderScalesInput(const D3D11_PixelShaderConstants *shader_constants) +{ + if (shader_constants->tonemap_method != 0.0f) { + // Tone mapping always scales + return true; + } + + // The shader normalizes the PQ input using the SDR white point and then multiplies by the color scale + if (SDL_fabs((shader_constants->sdr_white_point - (shader_constants->color_scale * SCRGB_NITS))) > 1.0f) { + return true; + } + + return false; +} + static D3D11_Shader SelectShader(SDL_Renderer *renderer, const D3D11_PixelShaderConstants *shader_constants) { if (shader_constants) { if (renderer->current_colorspace == SDL_COLORSPACE_HDR10) { if (shader_constants->input_type == INPUTTYPE_HDR10 && - shader_constants->tonemap_method == 0.0f && - (shader_constants->sdr_white_point / SCRGB_NITS) == shader_constants->color_scale) { + !PQShaderScalesInput(shader_constants)) { // Do a simple 1-1 copy return SHADER_RGB_SIMPLE; } else { diff --git a/src/render/direct3d12/SDL_render_d3d12.c b/src/render/direct3d12/SDL_render_d3d12.c index df4acc8a29..b6e7c2ef8b 100644 --- a/src/render/direct3d12/SDL_render_d3d12.c +++ b/src/render/direct3d12/SDL_render_d3d12.c @@ -2742,13 +2742,27 @@ static void D3D12_SetupShaderConstants(SDL_Renderer *renderer, const SDL_RenderC } } +static bool PQShaderScalesInput(const D3D12_PixelShaderConstants *shader_constants) +{ + if (shader_constants->tonemap_method != 0.0f) { + // Tone mapping always scales + return true; + } + + // The shader normalizes the PQ input using the SDR white point and then multiplies by the color scale + if (SDL_fabs((shader_constants->sdr_white_point - (shader_constants->color_scale * SCRGB_NITS))) > 1.0f) { + return true; + } + + return false; +} + static D3D12_Shader SelectShader(SDL_Renderer *renderer, const D3D12_PixelShaderConstants *shader_constants) { if (shader_constants) { if (renderer->current_colorspace == SDL_COLORSPACE_HDR10) { if (shader_constants->input_type == INPUTTYPE_HDR10 && - shader_constants->tonemap_method == 0.0f && - (shader_constants->sdr_white_point / SCRGB_NITS) == shader_constants->color_scale) { + !PQShaderScalesInput(shader_constants)) { // Do a simple 1-1 copy return SHADER_RGB_SIMPLE; } else { diff --git a/src/render/vulkan/SDL_render_vulkan.c b/src/render/vulkan/SDL_render_vulkan.c index cf3e77b9bc..e75e807d25 100644 --- a/src/render/vulkan/SDL_render_vulkan.c +++ b/src/render/vulkan/SDL_render_vulkan.c @@ -3554,13 +3554,27 @@ static void VULKAN_SetupShaderConstants(SDL_Renderer *renderer, const SDL_Render } } +static bool PQShaderScalesInput(const VULKAN_PixelShaderConstants *shader_constants) +{ + if (shader_constants->tonemap_method != 0.0f) { + // Tone mapping always scales + return true; + } + + // The shader normalizes the PQ input using the SDR white point and then multiplies by the color scale + if (SDL_fabs((shader_constants->sdr_white_point - (shader_constants->color_scale * SCRGB_NITS))) > 1.0f) { + return true; + } + + return false; +} + static VULKAN_Shader SelectShader(SDL_Renderer *renderer, const VULKAN_PixelShaderConstants *shader_constants, bool yuv) { if (shader_constants) { if (renderer->current_colorspace == SDL_COLORSPACE_HDR10) { if (shader_constants->input_type == INPUTTYPE_HDR10 && - shader_constants->tonemap_method == 0.0f && - (shader_constants->sdr_white_point / SCRGB_NITS) == shader_constants->color_scale) { + !PQShaderScalesInput(shader_constants)) { // Do a simple 1-1 copy return SHADER_RGB_SIMPLE; } else {