Skip to content

Commit ba5ec29

Browse files
authored
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.
1 parent 4ff301b commit ba5ec29

File tree

4 files changed

+51
-11
lines changed

4 files changed

+51
-11
lines changed

artwork/lut-default.png

-478 KB
Loading

hlsl/color.fx

+43-1
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,23 @@
11
// license:BSD-3-Clause
2-
// copyright-holders:Ryan Holtz
2+
// copyright-holders:Ryan Holtz, W. M. Martinez
33
//-----------------------------------------------------------------------------
44
// Color-Convolution Effect
55
//-----------------------------------------------------------------------------
66

7+
//-----------------------------------------------------------------------------
8+
// Macros
9+
//-----------------------------------------------------------------------------
10+
11+
#define LUT_TEXTURE_WIDTH 4096.0f
12+
#define LUT_SIZE 64.0f
13+
#define LUT_SCALE float2(1.0f / LUT_TEXTURE_WIDTH, 1.0f / LUT_SIZE)
14+
715
//-----------------------------------------------------------------------------
816
// Sampler Definitions
917
//-----------------------------------------------------------------------------
1018

1119
texture Diffuse;
20+
texture LutTexture;
1221

1322
sampler DiffuseSampler = sampler_state
1423
{
@@ -21,6 +30,35 @@ sampler DiffuseSampler = sampler_state
2130
AddressW = CLAMP;
2231
};
2332

33+
sampler2D LutSampler = sampler_state
34+
{
35+
Texture = <LutTexture>;
36+
MinFilter = LINEAR;
37+
MagFilter = LINEAR;
38+
MipFilter = LINEAR;
39+
AddressU = CLAMP;
40+
AddressV = CLAMP;
41+
AddressW = CLAMP;
42+
};
43+
44+
//-----------------------------------------------------------------------------
45+
// Utilities
46+
//-----------------------------------------------------------------------------
47+
48+
float3 apply_lut(float3 color)
49+
{
50+
// NOTE: Do not change the order of parameters here.
51+
float3 lutcoord = float3((color.rg * (LUT_SIZE - 1.0f) + 0.5f) *
52+
LUT_SCALE, color.b * (LUT_SIZE - 1.0f));
53+
float shift = floor(lutcoord.z);
54+
55+
lutcoord.x += shift * LUT_SCALE.y;
56+
color.rgb = lerp(tex2D(LutSampler, lutcoord.xy).rgb, tex2D(LutSampler,
57+
float2(lutcoord.x + LUT_SCALE.y, lutcoord.y)).rgb,
58+
lutcoord.z - shift);
59+
return color;
60+
}
61+
2462
//-----------------------------------------------------------------------------
2563
// Vertex Definitions
2664
//-----------------------------------------------------------------------------
@@ -83,11 +121,15 @@ uniform float3 BluRatios = float3(0.0f, 0.0f, 1.0f);
83121
uniform float3 Offset = float3(0.0f, 0.0f, 0.0f);
84122
uniform float3 Scale = float3(1.0f, 1.0f, 1.0f);
85123
uniform float Saturation = 1.0f;
124+
uniform bool LutEnable;
86125

87126
float4 ps_main(PS_INPUT Input) : COLOR
88127
{
89128
float4 BaseTexel = tex2D(DiffuseSampler, Input.TexCoord);
90129

130+
if (LutEnable)
131+
BaseTexel.rgb = apply_lut(BaseTexel.rgb);
132+
91133
float3 OutRGB = BaseTexel.rgb;
92134

93135
// RGB Tint & Shift

hlsl/primary.fx

+1-5
Original file line numberDiff line numberDiff line change
@@ -166,11 +166,7 @@ uniform bool UiLutEnable;
166166

167167
float4 ps_screen_main(PS_INPUT Input) : COLOR
168168
{
169-
float4 BaseTexel = tex2D(DiffuseSampler, Input.TexCoord);
170-
171-
if (LutEnable)
172-
BaseTexel.rgb = apply_lut(BaseTexel.rgb);
173-
return BaseTexel;
169+
return tex2D(DiffuseSampler, Input.TexCoord);
174170
}
175171

176172
float4 ps_vector_buffer_main(PS_INPUT Input) : COLOR

src/osd/modules/render/d3d/d3dhlsl.cpp

+7-5
Original file line numberDiff line numberDiff line change
@@ -879,6 +879,7 @@ int shaders::create_resources()
879879
color_effect->add_uniform("Scale", uniform::UT_VEC3, uniform::CU_COLOR_SCALE);
880880
color_effect->add_uniform("Saturation", uniform::UT_FLOAT, uniform::CU_COLOR_SATURATION);
881881
color_effect->add_uniform("SourceDims", uniform::UT_VEC2, uniform::CU_SOURCE_DIMS);
882+
color_effect->add_uniform("LutEnable", uniform::UT_BOOL, uniform::CU_LUT_ENABLE);
882883

883884
deconverge_effect->add_uniform("ConvergeX", uniform::UT_VEC3, uniform::CU_CONVERGE_LINEAR_X);
884885
deconverge_effect->add_uniform("ConvergeY", uniform::UT_VEC3, uniform::CU_CONVERGE_LINEAR_Y);
@@ -932,17 +933,13 @@ int shaders::create_resources()
932933

933934
prescale_point_effect->add_uniform("SourceDims", uniform::UT_VEC2, uniform::CU_SOURCE_DIMS);
934935

935-
default_effect->add_uniform("LutEnable", uniform::UT_BOOL, uniform::CU_LUT_ENABLE);
936-
default_effect->add_uniform("UiLutEnable", uniform::UT_BOOL, uniform::CU_UI_LUT_ENABLE);
937-
938936
ui_effect->add_uniform("LutEnable", uniform::UT_BOOL, uniform::CU_LUT_ENABLE);
939937
ui_effect->add_uniform("UiLutEnable", uniform::UT_BOOL, uniform::CU_UI_LUT_ENABLE);
940938

941939
ui_wrap_effect->add_uniform("LutEnable", uniform::UT_BOOL, uniform::CU_LUT_ENABLE);
942940
ui_wrap_effect->add_uniform("UiLutEnable", uniform::UT_BOOL, uniform::CU_UI_LUT_ENABLE);
943941

944942
vector_buffer_effect->add_uniform("LutEnable", uniform::UT_BOOL, uniform::CU_LUT_ENABLE);
945-
vector_buffer_effect->add_uniform("UiLutEnable", uniform::UT_BOOL, uniform::CU_UI_LUT_ENABLE);
946943

947944
return 0;
948945
}
@@ -1159,6 +1156,8 @@ int shaders::color_convolution_pass(d3d_render_target *rt, int source_index, pol
11591156
uint32_t tint = (uint32_t)poly->tint();
11601157
float prim_tint[3] = { ((tint >> 16) & 0xff) / 255.0f, ((tint >> 8) & 0xff) / 255.0f, (tint & 0xff) / 255.0f };
11611158
curr_effect->set_vector("PrimTint", 3, prim_tint);
1159+
curr_effect->set_texture("LutTexture", !lut_texture ? nullptr : lut_texture->get_finaltex());
1160+
curr_effect->set_bool("UiLutEnable", false);
11621161

11631162
next_index = rt->next_index(next_index);
11641163
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
14671466

14681467
curr_effect->set_texture("Diffuse", rt->target_texture[next_index].Get());
14691468
curr_effect->set_texture("LutTexture", !lut_texture ? nullptr : lut_texture->get_finaltex());
1469+
curr_effect->set_bool("UiLutEnable", false);
14701470

14711471
// we need to clear the vector render target here
14721472
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
14861486
curr_effect->update_uniforms();
14871487

14881488
curr_effect->set_texture("Diffuse", rt->target_texture[next_index].Get());
1489-
curr_effect->set_texture("LutTexture", !lut_texture ? nullptr : lut_texture->get_finaltex());
1489+
curr_effect->set_texture("LutTexture", nullptr);
1490+
curr_effect->set_bool("LutEnable", false);
1491+
curr_effect->set_bool("UiLutEnable", false);
14901492

14911493
blit(backbuffer.Get(), false, poly->type(), vertnum, poly->count());
14921494

0 commit comments

Comments
 (0)