From 604fe14b87023c7b131e01deca5e92683b99ed98 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 23 Jul 2026 08:16:47 -0700 Subject: [PATCH] Make sure the PQ shader will output the input value before using the simple shader Note that we don't account for vertex color here. If HDR10 content needs to be tinted by vertex color, it can't use the simple shader. I'm assuming that the use case for this will be video content which generally won't use vertex color and this optimization is fine. --- src/render/direct3d11/SDL_render_d3d11.c | 9 ++------- src/render/direct3d12/SDL_render_d3d12.c | 9 ++------- src/render/vulkan/SDL_render_vulkan.c | 9 ++------- 3 files changed, 6 insertions(+), 21 deletions(-) diff --git a/src/render/direct3d11/SDL_render_d3d11.c b/src/render/direct3d11/SDL_render_d3d11.c index abbcd50ff6..9ec760e25d 100644 --- a/src/render/direct3d11/SDL_render_d3d11.c +++ b/src/render/direct3d11/SDL_render_d3d11.c @@ -2286,14 +2286,9 @@ static D3D11_Shader SelectShader(SDL_Renderer *renderer, const D3D11_PixelShader { if (shader_constants) { if (renderer->current_colorspace == SDL_COLORSPACE_HDR10) { - float SDR_white_point; - if (renderer->target) { - SDR_white_point = renderer->target->SDR_white_point; - } else { - SDR_white_point = renderer->SDR_white_point; - } if (shader_constants->input_type == INPUTTYPE_HDR10 && - shader_constants->color_scale == SDR_white_point) { + shader_constants->tonemap_method == 0.0f && + (shader_constants->sdr_white_point / SCRGB_NITS) == shader_constants->color_scale) { // 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 bb2f5c59be..df4acc8a29 100644 --- a/src/render/direct3d12/SDL_render_d3d12.c +++ b/src/render/direct3d12/SDL_render_d3d12.c @@ -2746,14 +2746,9 @@ static D3D12_Shader SelectShader(SDL_Renderer *renderer, const D3D12_PixelShader { if (shader_constants) { if (renderer->current_colorspace == SDL_COLORSPACE_HDR10) { - float SDR_white_point; - if (renderer->target) { - SDR_white_point = renderer->target->SDR_white_point; - } else { - SDR_white_point = renderer->SDR_white_point; - } if (shader_constants->input_type == INPUTTYPE_HDR10 && - shader_constants->color_scale == SDR_white_point) { + shader_constants->tonemap_method == 0.0f && + (shader_constants->sdr_white_point / SCRGB_NITS) == shader_constants->color_scale) { // 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 01e0d33727..cf3e77b9bc 100644 --- a/src/render/vulkan/SDL_render_vulkan.c +++ b/src/render/vulkan/SDL_render_vulkan.c @@ -3558,14 +3558,9 @@ static VULKAN_Shader SelectShader(SDL_Renderer *renderer, const VULKAN_PixelShad { if (shader_constants) { if (renderer->current_colorspace == SDL_COLORSPACE_HDR10) { - float SDR_white_point; - if (renderer->target) { - SDR_white_point = renderer->target->SDR_white_point; - } else { - SDR_white_point = renderer->SDR_white_point; - } if (shader_constants->input_type == INPUTTYPE_HDR10 && - shader_constants->color_scale == SDR_white_point) { + shader_constants->tonemap_method == 0.0f && + (shader_constants->sdr_white_point / SCRGB_NITS) == shader_constants->color_scale) { // Do a simple 1-1 copy return SHADER_RGB_SIMPLE; } else {