diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/d3dshader/gstd3dshadercache.cpp b/subprojects/gst-plugins-bad/gst-libs/gst/d3dshader/gstd3dshadercache.cpp index c9e1e4cd1d..ef9eeefc20 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/d3dshader/gstd3dshadercache.cpp +++ b/subprojects/gst-plugins-bad/gst-libs/gst/d3dshader/gstd3dshadercache.cpp @@ -75,6 +75,8 @@ static const ShaderItem g_ps_map[] = { {GST_D3D_PLUGIN_PS_COLOR, BUILD_SOURCE (PSMain_color)}, {GST_D3D_PLUGIN_PS_SAMPLE_PREMULT, BUILD_SOURCE (PSMain_sample_premul)}, {GST_D3D_PLUGIN_PS_SAMPLE, BUILD_SOURCE (PSMain_sample)}, + {GST_D3D_PLUGIN_PS_SAMPLE_SCRGB_TONEMAP, BUILD_SOURCE (PSMain_sample_scrgb_tonemap)}, + {GST_D3D_PLUGIN_PS_SAMPLE_SCRGB, BUILD_SOURCE (PSMain_sample_scrgb)}, {GST_D3D_PLUGIN_PS_SNOW, BUILD_SOURCE (PSMain_snow)}, }; diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/d3dshader/gstd3dshadercache.h b/subprojects/gst-plugins-bad/gst-libs/gst/d3dshader/gstd3dshadercache.h index 3bf6d884f1..8601183974 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/d3dshader/gstd3dshadercache.h +++ b/subprojects/gst-plugins-bad/gst-libs/gst/d3dshader/gstd3dshadercache.h @@ -35,6 +35,8 @@ typedef enum GST_D3D_PLUGIN_PS_COLOR, GST_D3D_PLUGIN_PS_SAMPLE_PREMULT, GST_D3D_PLUGIN_PS_SAMPLE, + GST_D3D_PLUGIN_PS_SAMPLE_SCRGB_TONEMAP, + GST_D3D_PLUGIN_PS_SAMPLE_SCRGB, GST_D3D_PLUGIN_PS_SNOW, GST_D3D_PLUGIN_PS_LAST diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/d3dshader/plugin-hlsl/PSMain_sample_scrgb.hlsl b/subprojects/gst-plugins-bad/gst-libs/gst/d3dshader/plugin-hlsl/PSMain_sample_scrgb.hlsl new file mode 100644 index 0000000000..9d8b9ad367 --- /dev/null +++ b/subprojects/gst-plugins-bad/gst-libs/gst/d3dshader/plugin-hlsl/PSMain_sample_scrgb.hlsl @@ -0,0 +1,89 @@ +/* GStreamer + * Copyright (C) 2025 Seungha Yang + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef BUILDING_HLSL +Texture2D shaderTexture; +SamplerState samplerState; + +cbuffer PsConstBuffer +{ + float sdr_white_level; +}; + +struct PS_INPUT +{ + float4 Position : SV_POSITION; + float2 Texture : TEXCOORD; +}; + +float srgb_encode (float val) +{ + if (val <= 0.0031308) + return 12.92 * val; + else + return 1.055 * pow (val, 1.0 / 2.4) - 0.055; +} + +float4 ENTRY_POINT (PS_INPUT input): SV_TARGET +{ + float4 sample = shaderTexture.Sample (samplerState, input.Texture).rgba; + sample.rgb = 80.0f / sdr_white_level * sample.rgb; + sample = saturate (sample); + sample.r = srgb_encode (sample.r); + sample.g = srgb_encode (sample.g); + sample.b = srgb_encode (sample.b); + + return sample; +} +#else +static const char str_PSMain_sample_scrgb[] = +"Texture2D shaderTexture;\n" +"SamplerState samplerState;\n" +"\n" +"cbuffer PsConstBuffer\n" +"{\n" +" float sdr_white_level;\n" +"};\n" +"\n" +"struct PS_INPUT\n" +"{\n" +" float4 Position : SV_POSITION;\n" +" float2 Texture : TEXCOORD;\n" +"};\n" +"\n" +"float srgb_encode (float val)\n" +"{\n" +" if (val <= 0.0031308)\n" +" return 12.92 * val;\n" +" else\n" +" return 1.055 * pow (val, 1.0 / 2.4) - 0.055;\n" +"}\n" +"\n" +"float4 ENTRY_POINT (PS_INPUT input): SV_TARGET\n" +"{\n" +" float4 sample = shaderTexture.Sample (samplerState, input.Texture).rgba;\n" +" sample.rgb = 80.0f / sdr_white_level * sample.rgb;\n" +" sample = saturate (sample);\n" +" sample.r = srgb_encode (sample.r);\n" +" sample.g = srgb_encode (sample.g);\n" +" sample.b = srgb_encode (sample.b);\n" +"\n" +" return sample;\n" +"}\n"; +#endif diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/d3dshader/plugin-hlsl/PSMain_sample_scrgb_tonemap.hlsl b/subprojects/gst-plugins-bad/gst-libs/gst/d3dshader/plugin-hlsl/PSMain_sample_scrgb_tonemap.hlsl new file mode 100644 index 0000000000..0cd5b599c7 --- /dev/null +++ b/subprojects/gst-plugins-bad/gst-libs/gst/d3dshader/plugin-hlsl/PSMain_sample_scrgb_tonemap.hlsl @@ -0,0 +1,99 @@ +/* GStreamer + * Copyright (C) 2025 Seungha Yang + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef BUILDING_HLSL +Texture2D shaderTexture; +SamplerState samplerState; + +cbuffer PsConstBuffer +{ + float sdr_white_level; +}; + +struct PS_INPUT +{ + float4 Position : SV_POSITION; + float2 Texture : TEXCOORD; +}; + +float srgb_encode (float val) +{ + if (val <= 0.0031308) + return 12.92 * val; + else + return 1.055 * pow (val, 1.0 / 2.4) - 0.055; +} + +float4 ENTRY_POINT (PS_INPUT input): SV_TARGET +{ + float4 sample = shaderTexture.Sample (samplerState, input.Texture).rgba; + + sample.rgb = sample.rgb / sdr_white_level; + sample.r = sample.r / (1.0f + sample.r) * 80.f; + sample.g = sample.g / (1.0f + sample.g) * 80.f; + sample.b = sample.b / (1.0f + sample.b) * 80.f; + + sample = saturate (sample); + sample.r = srgb_encode (sample.r); + sample.g = srgb_encode (sample.g); + sample.b = srgb_encode (sample.b); + + return sample; +} +#else +static const char str_PSMain_sample_scrgb_tonemap[] = +"Texture2D shaderTexture;\n" +"SamplerState samplerState;\n" +"\n" +"cbuffer PsConstBuffer\n" +"{\n" +" float sdr_white_level;\n" +"};\n" +"\n" +"struct PS_INPUT\n" +"{\n" +" float4 Position : SV_POSITION;\n" +" float2 Texture : TEXCOORD;\n" +"};\n" +"\n" +"float srgb_encode (float val)\n" +"{\n" +" if (val <= 0.0031308)\n" +" return 12.92 * val;\n" +" else\n" +" return 1.055 * pow (val, 1.0 / 2.4) - 0.055;\n" +"}\n" +"\n" +"float4 ENTRY_POINT (PS_INPUT input): SV_TARGET\n" +"{\n" +" float4 sample = shaderTexture.Sample (samplerState, input.Texture).rgba;\n" +"\n" +" sample.rgb = sample.rgb / sdr_white_level;\n" +" sample.r = sample.r / (1.0f + sample.r) * 80.f;\n" +" sample.g = sample.g / (1.0f + sample.g) * 80.f;\n" +" sample.b = sample.b / (1.0f + sample.b) * 80.f;\n" +"\n" +" sample = saturate (sample);\n" +" sample.r = srgb_encode (sample.r);\n" +" sample.g = srgb_encode (sample.g);\n" +" sample.b = srgb_encode (sample.b);\n" +"\n" +" return sample;\n" +"}\n"; +#endif diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/d3dshader/plugin-hlsl/hlsl.h b/subprojects/gst-plugins-bad/gst-libs/gst/d3dshader/plugin-hlsl/hlsl.h index 5b4783d9b5..acb9c7fce0 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/d3dshader/plugin-hlsl/hlsl.h +++ b/subprojects/gst-plugins-bad/gst-libs/gst/d3dshader/plugin-hlsl/hlsl.h @@ -26,6 +26,8 @@ #include "PSMain_color.hlsl" #include "PSMain_sample_premul.hlsl" #include "PSMain_sample.hlsl" +#include "PSMain_sample_scrgb_tonemap.hlsl" +#include "PSMain_sample_scrgb.hlsl" #include "PSMain_snow.hlsl" #include "VSMain_color.hlsl" #include "VSMain_coord.hlsl" diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/d3dshader/plugin-hlsl/meson.build b/subprojects/gst-plugins-bad/gst-libs/gst/d3dshader/plugin-hlsl/meson.build index 028790dd67..33f69b3015 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/d3dshader/plugin-hlsl/meson.build +++ b/subprojects/gst-plugins-bad/gst-libs/gst/d3dshader/plugin-hlsl/meson.build @@ -6,6 +6,8 @@ hlsl_sources = [ ['PSMain_color', 'ps'], ['PSMain_sample_premul', 'ps'], ['PSMain_sample', 'ps'], + ['PSMain_sample_scrgb_tonemap', 'ps'], + ['PSMain_sample_scrgb', 'ps'], ['PSMain_snow', 'ps'], ['VSMain_color', 'vs'], ['VSMain_coord', 'vs'],