diff --git a/artwork/lut-default.png b/artwork/lut-default.png index 7c82396f7eb..45ec1aae370 100644 Binary files a/artwork/lut-default.png and b/artwork/lut-default.png differ diff --git a/hlsl/color.fx b/hlsl/color.fx index 3c13fc8d400..78b20bbb904 100644 --- a/hlsl/color.fx +++ b/hlsl/color.fx @@ -1,14 +1,23 @@ // license:BSD-3-Clause -// copyright-holders:Ryan Holtz +// copyright-holders:Ryan Holtz, W. M. Martinez //----------------------------------------------------------------------------- // Color-Convolution Effect //----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Macros +//----------------------------------------------------------------------------- + +#define LUT_TEXTURE_WIDTH 4096.0f +#define LUT_SIZE 64.0f +#define LUT_SCALE float2(1.0f / LUT_TEXTURE_WIDTH, 1.0f / LUT_SIZE) + //----------------------------------------------------------------------------- // Sampler Definitions //----------------------------------------------------------------------------- texture Diffuse; +texture LutTexture; sampler DiffuseSampler = sampler_state { @@ -21,6 +30,35 @@ sampler DiffuseSampler = sampler_state AddressW = CLAMP; }; +sampler2D LutSampler = sampler_state +{ + Texture = ; + 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());