diff options
| author | 2016-04-19 16:29:30 +0200 | |
|---|---|---|
| committer | 2016-04-19 16:29:30 +0200 | |
| commit | f8034ac81238c8637c149dc40efdc4c42dda9545 (patch) | |
| tree | 9c34c76d9067ce8e3803764896b10c4cfa401df9 /src/osd | |
| parent | c64b88bc78a4810ce0c75eb4d6651e5a26cc2bad (diff) | |
bgfx: Added SuperEagle shader. [Ryan Holtz]
Diffstat (limited to 'src/osd')
5 files changed, 250 insertions, 0 deletions
diff --git a/src/osd/modules/render/bgfx/shaders/chains/supereagle/fs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/supereagle/fs_blit.sc new file mode 100644 index 00000000000..874846cce0d --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/supereagle/fs_blit.sc @@ -0,0 +1,14 @@ +$input v_color0, texCoord + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +#include "common.sh" + +// Samplers +SAMPLER2D(s_tex, 0); + +void main() +{ + gl_FragColor = texture2D(s_tex, texCoord) * v_color0; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/supereagle/fs_eagle.sc b/src/osd/modules/render/bgfx/shaders/chains/supereagle/fs_eagle.sc new file mode 100644 index 00000000000..a07a848ffbd --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/supereagle/fs_eagle.sc @@ -0,0 +1,165 @@ +$input v_color0, texCoord, t1, t2, t3, t4, t5, t6, t7, t8 + +// license:GPL-2.0+ +// copyright-holders:The DOSBox Team + +/* SuperEagle code */ +/* Copied from the Dosbox source code */ +/* Copyright (C) 2002-2007 The DOSBox Team */ +/* License: GNU-GPL */ +/* Adapted by guest(r) on 16.4.2007 */ + +#include "common.sh" + +// Autos +uniform vec4 u_tex_size0; + +// Samplers +SAMPLER2D(decal, 0); + +float reduce(vec3 color) +{ + return dot(color, vec3(65536.0, 255.0, 1.0)); +} + +/* GET_RESULT function */ +/* Copyright (c) 1999-2001 by Derek Liauw Kie Fa */ +/* License: GNU-GPL */ +float GET_RESULT(float A, float B, float C, float D) +{ + float x = 0.0; + float y = 0.0; + float r = 0.0; + if (A == C) x += 1.0; else if (B == C) y += 1.0; + if (A == D) x += 1.0; else if (B == D) y += 1.0; + if (x <= 1.0) r += 1.0; + if (y <= 1.0) r -= 1.0; + return r; +} + +void main() +{ + vec2 fp = fract(texCoord * u_tex_size0.xy); + + // Reading the texels + + vec3 C0 = texture2D(decal, t1.xy).xyz; + vec3 C1 = texture2D(decal, t1.zw).xyz; + vec3 C2 = texture2D(decal, t2.xy).xyz; + vec3 D3 = texture2D(decal, t2.zw).xyz; + vec3 C3 = texture2D(decal, t3.xy).xyz; + vec3 C4 = texture2D(decal, texCoord).xyz; + vec3 C5 = texture2D(decal, t3.zw).xyz; + vec3 D4 = texture2D(decal, t4.xy).xyz; + vec3 C6 = texture2D(decal, t4.zw).xyz; + vec3 C7 = texture2D(decal, t5.xy).xyz; + vec3 C8 = texture2D(decal, t5.zw).xyz; + vec3 D5 = texture2D(decal, t6.xy).xyz; + vec3 D0 = texture2D(decal, t6.zw).xyz; + vec3 D1 = texture2D(decal, t7.xy).xyz; + vec3 D2 = texture2D(decal, t7.zw).xyz; + vec3 D6 = texture2D(decal, t8.xy).xyz; + + vec3 p00,p10,p01,p11; + + // reducing float3 to float + float c0 = reduce(C0); float c1 = reduce(C1); + float c2 = reduce(C2); float c3 = reduce(C3); + float c4 = reduce(C4); float c5 = reduce(C5); + float c6 = reduce(C6); float c7 = reduce(C7); + float c8 = reduce(C8); float d0 = reduce(D0); + float d1 = reduce(D1); float d2 = reduce(D2); + float d3 = reduce(D3); float d4 = reduce(D4); + float d5 = reduce(D5); float d6 = reduce(D6); + + /* SuperEagle code */ + /* Copied from the Dosbox source code */ + /* Copyright (C) 2002-2007 The DOSBox Team */ + /* License: GNU-GPL */ + /* Adapted by guest(r) on 16.4.2007 */ + if (c4 != c8) + { + if (c7 == c5) + { + p01 = p10 = C7; + if ((c6 == c7) || (c5 == c2)) + { + p00 = 0.25 * (3.0 * C7 + C4); + } + else + { + p00 = 0.5 * (C4 + C5); + } + + if ((c5 == d4) || (c7 == d1)) + { + p11 = 0.25 * (3.0 * C7 + C8); + } + else + { + p11 = 0.5 * (C7 + C8); + } + } + else + { + p11 = 0.125 * (6.0 * C8 + C7 + C5); + p00 = 0.125 * (6.0 * C4 + C7 + C5); + + p10 = 0.125 * (6.0 * C7 + C4 + C8); + p01 = 0.125 * (6.0 * C5 + C4 + C8); + } + } + else + { + if (c7 != c5) + { + p11 = p00 = C4; + + if ((c1 == c4) || (c8 == d5)) + { + p01 = 0.25 * (3.0 * C4 + C5); + } + else + { + p01 = 0.5 * (C4 + C5); + } + + if ((c8 == d2) || (c3 == c4)) + { + p10 = 0.25 * (3.0 * C4 + C7); + } + else + { + p10 = 0.5 * (C7 + C8); + } + } + else + { + float r = 0.0; + r += GET_RESULT(c5, c4, c6, d1); + r += GET_RESULT(c5, c4, c3, c1); + r += GET_RESULT(c5, c4, d2, d5); + r += GET_RESULT(c5, c4, c2, d4); + + if (r > 0.0) + { + p01 = p10 = C7; + p00 = p11 = 0.5 * (C4 + C5); + } + else if (r < 0.0) + { + p11 = p00 = C4; + p01 = p10 = 0.5 * (C4 + C5); + } + else + { + p11 = p00 = C4; + p01 = p10 = C7; + } + } + } + + p10 = (fp.x < 0.50) ? (fp.y < 0.50 ? p00 : p10) : (fp.y < 0.50 ? p01: p11); + + gl_FragColor = vec4(p10.rgb, 1.0); +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/supereagle/varying.def.sc b/src/osd/modules/render/bgfx/shaders/chains/supereagle/varying.def.sc new file mode 100644 index 00000000000..7adabc462e5 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/supereagle/varying.def.sc @@ -0,0 +1,14 @@ +vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); +vec2 texCoord : TEXCOORD0 = vec2(0.0, 0.0); +vec4 t1 : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 t2 : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 t3 : TEXCOORD3 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 t4 : TEXCOORD4 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 t5 : TEXCOORD5 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 t6 : TEXCOORD6 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 t7 : TEXCOORD7 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 t8 : TEXCOORD8 = vec4(0.0, 0.0, 0.0, 0.0); + +vec3 a_position : POSITION; +vec4 a_color0 : COLOR0; +vec2 a_texcoord0 : TEXCOORD0; diff --git a/src/osd/modules/render/bgfx/shaders/chains/supereagle/vs_blit.sc b/src/osd/modules/render/bgfx/shaders/chains/supereagle/vs_blit.sc new file mode 100644 index 00000000000..7d857008291 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/supereagle/vs_blit.sc @@ -0,0 +1,14 @@ +$input a_position, a_texcoord0, a_color0 +$output texCoord, v_color0 + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +#include "common.sh" + +void main() +{ + gl_Position = mul(u_viewProj, vec4(a_position.xy, 0.0, 1.0)); + texCoord = a_texcoord0.xy; + v_color0 = a_color0; +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/supereagle/vs_eagle.sc b/src/osd/modules/render/bgfx/shaders/chains/supereagle/vs_eagle.sc new file mode 100644 index 00000000000..d233629a036 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/supereagle/vs_eagle.sc @@ -0,0 +1,43 @@ +$input a_position, a_texcoord0, a_color0 +$output v_color0, texCoord, t1, t2, t3, t4, t5, t6, t7, t8 + +// license:GPL-2.0+ +// copyright-holders:The DOSBox Team + +/* SuperEagle code */ +/* Copied from the Dosbox source code */ +/* Copyright (C) 2002-2007 The DOSBox Team */ +/* License: GNU-GPL */ +/* Adapted by guest(r) on 16.4.2007 */ + +#include "common.sh" + +// Autos +uniform vec4 u_tex_size0; + +void main() +{ + gl_Position = mul(u_viewProj, vec4(a_position.xy, 0.0, 1.0)); + v_color0 = a_color0; + + vec2 ps = vec2(1.0, 1.0) / u_tex_size0.xy; + float dx = ps.x; + float dy = ps.y; + + texCoord = a_texcoord0.xy; + t1.xy = texCoord + vec2(-dx,-dy); + t1.zw = texCoord + vec2(-dx, 0); + t2.xy = texCoord + vec2(+dx,-dy); + t2.zw = texCoord + vec2(+dx+dx,-dy); + t3.xy = texCoord + vec2(-dx, 0); + t3.zw = texCoord + vec2(+dx, 0); + t4.xy = texCoord + vec2(+dx+dx, 0); + t4.zw = texCoord + vec2(-dx,+dy); + t5.xy = texCoord + vec2( 0,+dy); + t5.zw = texCoord + vec2(+dx,+dy); + t6.xy = texCoord + vec2(+dx+dx,+dy); + t6.zw = texCoord + vec2(-dx,+dy+dy); + t7.xy = texCoord + vec2( 0,+dy+dy); + t7.zw = texCoord + vec2(+dx,+dy+dy); + t8.xy = texCoord + vec2(+dx+dx,+dy+dy); +} |
