SDL: Make sure the PQ shader will output the input value before using the simple shader

From 604fe14b87023c7b131e01deca5e92683b99ed98 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
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 abbcd50ff6779..9ec760e25dab1 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 bb2f5c59be67f..df4acc8a29e35 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 01e0d33727100..cf3e77b9bc002 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 {