From ba5ec29211741b9f18334fb94f812c9d3979f582 Mon Sep 17 00:00:00 2001 From: MooglyGuy Date: Sun, 19 Mar 2023 17:59:44 +0100 Subject: [PATCH] Swapped R and B channels in lut-default.png, and adjusted D3D9 LUT-application behaviour. (#11004) [Ryan Holtz] * lut-default.png: Swapped red and blue channels (fixes GitHub #11001). * render/d3d/d3dlsl.cpp: Changed screen LUT application to be applied during the color convolution pass on raster systems. --- artwork/lut-default.png | Bin 491596 -> 2025 bytes hlsl/color.fx | 44 ++++++++++++++++++++++++- hlsl/primary.fx | 6 +--- src/osd/modules/render/d3d/d3dhlsl.cpp | 12 ++++--- 4 files changed, 51 insertions(+), 11 deletions(-) diff --git a/artwork/lut-default.png b/artwork/lut-default.png index 7c82396f7eb578f4fb2a3a76bec4dc5ccfc33094..45ec1aae37010c96964a637871436a3de3205222 100644 GIT binary patch literal 2025 zcmeAS@N?(olHy`uVBq!ia0y~y5CAe695~p3Pnv;&z0T9cF{C2y?VXLeI_v^22Y2%u8Z2FQ zMMUB#!@P@E822a!xUIc-K#D&ieQu?lT>ts~`{e##ch9;1@!j|N@#k-a|Ei9E`M!4P z{_j)k{%&3W<@>%%_kVlUzt{fzD;p|t_4Qx*o$KrB_rKr&ZR)>!FdgyrZ?*sKh3VM; z4{X%l{rCT46UVUP)z`ZJ|FPQ#w&Uw{s6$qV-~T^Z8|Zsv@L{nGG8e>dU>>1D^ZNJ8 z&)<07F6nn)`TqZZs;1sVZ`Rx7mZ+;9TY792WKSdP)@?;*2OrZ}oe?I@{sr@E+ zyL`{@zt694CYbMl`Ri-dfA@E*@85s_n{XVwfB*eIJT0Kc4JfA~vUb&8V)OIW@Bg2G ziZ*2MM}r-i3t~TD7@0y1&mZ4Ep8jTY|BZc*@4mO+KaZ%g@A_~1qWHi6>h2RRQ>*It z|Nl>9aZYT0-uGWU94!JLxLcx$0P7%&5h;}az2XmhOfJ`R9-TW=K_TGj>gTe~DWM4f D2;X!I literal 491596 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℞4OO%iW5~tgd6mJQdYBbo`6Q62^?} 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 + MinFilter = LINEAR; + MagFilter = LINEAR; + MipFilter = LINEAR; + AddressU = CLAMP; + AddressV = CLAMP; + AddressW = CLAMP; +}; + +//----------------------------------------------------------------------------- +// Utilities +//----------------------------------------------------------------------------- + +float3 apply_lut(float3 color) +{ + // NOTE: Do not change the order of parameters here. + float3 lutcoord = float3((color.rg * (LUT_SIZE - 1.0f) + 0.5f) * + LUT_SCALE, color.b * (LUT_SIZE - 1.0f)); + float shift = floor(lutcoord.z); + + lutcoord.x += shift * LUT_SCALE.y; + color.rgb = lerp(tex2D(LutSampler, lutcoord.xy).rgb, tex2D(LutSampler, + float2(lutcoord.x + LUT_SCALE.y, lutcoord.y)).rgb, + lutcoord.z - shift); + return color; +} + //----------------------------------------------------------------------------- // Vertex Definitions //----------------------------------------------------------------------------- @@ -83,11 +121,15 @@ uniform float3 BluRatios = float3(0.0f, 0.0f, 1.0f); uniform float3 Offset = float3(0.0f, 0.0f, 0.0f); uniform float3 Scale = float3(1.0f, 1.0f, 1.0f); uniform float Saturation = 1.0f; +uniform bool LutEnable; float4 ps_main(PS_INPUT Input) : COLOR { float4 BaseTexel = tex2D(DiffuseSampler, Input.TexCoord); + if (LutEnable) + BaseTexel.rgb = apply_lut(BaseTexel.rgb); + float3 OutRGB = BaseTexel.rgb; // RGB Tint & Shift diff --git a/hlsl/primary.fx b/hlsl/primary.fx index 73dab1a7cbe..82306d3d01f 100644 --- a/hlsl/primary.fx +++ b/hlsl/primary.fx @@ -166,11 +166,7 @@ uniform bool UiLutEnable; float4 ps_screen_main(PS_INPUT Input) : COLOR { - float4 BaseTexel = tex2D(DiffuseSampler, Input.TexCoord); - - if (LutEnable) - BaseTexel.rgb = apply_lut(BaseTexel.rgb); - return BaseTexel; + return tex2D(DiffuseSampler, Input.TexCoord); } float4 ps_vector_buffer_main(PS_INPUT Input) : COLOR diff --git a/src/osd/modules/render/d3d/d3dhlsl.cpp b/src/osd/modules/render/d3d/d3dhlsl.cpp index 68647366665..e2daedff166 100644 --- a/src/osd/modules/render/d3d/d3dhlsl.cpp +++ b/src/osd/modules/render/d3d/d3dhlsl.cpp @@ -879,6 +879,7 @@ int shaders::create_resources() color_effect->add_uniform("Scale", uniform::UT_VEC3, uniform::CU_COLOR_SCALE); color_effect->add_uniform("Saturation", uniform::UT_FLOAT, uniform::CU_COLOR_SATURATION); color_effect->add_uniform("SourceDims", uniform::UT_VEC2, uniform::CU_SOURCE_DIMS); + color_effect->add_uniform("LutEnable", uniform::UT_BOOL, uniform::CU_LUT_ENABLE); deconverge_effect->add_uniform("ConvergeX", uniform::UT_VEC3, uniform::CU_CONVERGE_LINEAR_X); deconverge_effect->add_uniform("ConvergeY", uniform::UT_VEC3, uniform::CU_CONVERGE_LINEAR_Y); @@ -932,9 +933,6 @@ int shaders::create_resources() prescale_point_effect->add_uniform("SourceDims", uniform::UT_VEC2, uniform::CU_SOURCE_DIMS); - default_effect->add_uniform("LutEnable", uniform::UT_BOOL, uniform::CU_LUT_ENABLE); - default_effect->add_uniform("UiLutEnable", uniform::UT_BOOL, uniform::CU_UI_LUT_ENABLE); - ui_effect->add_uniform("LutEnable", uniform::UT_BOOL, uniform::CU_LUT_ENABLE); ui_effect->add_uniform("UiLutEnable", uniform::UT_BOOL, uniform::CU_UI_LUT_ENABLE); @@ -942,7 +940,6 @@ int shaders::create_resources() ui_wrap_effect->add_uniform("UiLutEnable", uniform::UT_BOOL, uniform::CU_UI_LUT_ENABLE); vector_buffer_effect->add_uniform("LutEnable", uniform::UT_BOOL, uniform::CU_LUT_ENABLE); - vector_buffer_effect->add_uniform("UiLutEnable", uniform::UT_BOOL, uniform::CU_UI_LUT_ENABLE); return 0; } @@ -1159,6 +1156,8 @@ int shaders::color_convolution_pass(d3d_render_target *rt, int source_index, pol uint32_t tint = (uint32_t)poly->tint(); float prim_tint[3] = { ((tint >> 16) & 0xff) / 255.0f, ((tint >> 8) & 0xff) / 255.0f, (tint & 0xff) / 255.0f }; curr_effect->set_vector("PrimTint", 3, prim_tint); + curr_effect->set_texture("LutTexture", !lut_texture ? nullptr : lut_texture->get_finaltex()); + curr_effect->set_bool("UiLutEnable", false); next_index = rt->next_index(next_index); blit(rt->source_surface[next_index].Get(), false, D3DPT_TRIANGLELIST, 0, 2); @@ -1467,6 +1466,7 @@ int shaders::vector_buffer_pass(d3d_render_target *rt, int source_index, poly_in curr_effect->set_texture("Diffuse", rt->target_texture[next_index].Get()); curr_effect->set_texture("LutTexture", !lut_texture ? nullptr : lut_texture->get_finaltex()); + curr_effect->set_bool("UiLutEnable", false); // we need to clear the vector render target here next_index = rt->next_index(next_index); @@ -1486,7 +1486,9 @@ int shaders::screen_pass(d3d_render_target *rt, int source_index, poly_info *pol curr_effect->update_uniforms(); curr_effect->set_texture("Diffuse", rt->target_texture[next_index].Get()); - curr_effect->set_texture("LutTexture", !lut_texture ? nullptr : lut_texture->get_finaltex()); + curr_effect->set_texture("LutTexture", nullptr); + curr_effect->set_bool("LutEnable", false); + curr_effect->set_bool("UiLutEnable", false); blit(backbuffer.Get(), false, poly->type(), vertnum, poly->count());