diff options
Diffstat (limited to 'src/osd/modules/opengl')
-rw-r--r-- | src/osd/modules/opengl/gl_shader_mgr.cpp | 17 | ||||
-rw-r--r-- | src/osd/modules/opengl/gl_shader_mgr.h | 1 | ||||
-rwxr-xr-x[-rw-r--r--] | src/osd/modules/opengl/shader/genc.sh | 4 | ||||
-rw-r--r-- | src/osd/modules/opengl/shader/glsl_bicubic_rgb32_dir.fsh | 81 | ||||
-rw-r--r-- | src/osd/modules/opengl/shader/glsl_bicubic_rgb32_dir.fsh.c | 82 |
5 files changed, 179 insertions, 6 deletions
diff --git a/src/osd/modules/opengl/gl_shader_mgr.cpp b/src/osd/modules/opengl/gl_shader_mgr.cpp index 9f8dc8acd05..26eb0d35ee0 100644 --- a/src/osd/modules/opengl/gl_shader_mgr.cpp +++ b/src/osd/modules/opengl/gl_shader_mgr.cpp @@ -23,7 +23,8 @@ static const char * glsl_mamebm_vsh_files [GLSL_VERTEX_SHADER_INT_NUMBER] = static const char * glsl_mamebm_fsh_files [GLSL_SHADER_FEAT_INT_NUMBER] = { "/tmp/glsl_plain_rgb32_dir.fsh", // rgb32 dir plain - "/tmp/glsl_bilinear_rgb32_dir.fsh" // rgb32 dir bilinear + "/tmp/glsl_bilinear_rgb32_dir.fsh", // rgb32 dir bilinear + "/tmp/glsl_bicubic_rgb32_dir.fsh", // rgb32 dir bicubic }; #else // GLSL_SOURCE_ON_DISK @@ -32,6 +33,7 @@ static const char * glsl_mamebm_fsh_files [GLSL_SHADER_FEAT_INT_NUMBER] = #include "shader/glsl_plain_rgb32_dir.fsh.c" #include "shader/glsl_bilinear_rgb32_dir.fsh.c" +#include "shader/glsl_bicubic_rgb32_dir.fsh.c" static const char * glsl_mamebm_vsh_sources [GLSL_VERTEX_SHADER_INT_NUMBER] = { @@ -40,8 +42,9 @@ static const char * glsl_mamebm_vsh_sources [GLSL_VERTEX_SHADER_INT_NUMBER] = static const char * glsl_mamebm_fsh_sources [GLSL_SHADER_FEAT_INT_NUMBER] = { - glsl_plain_rgb32_dir_fsh_src, // rgb32 dir plain - glsl_bilinear_rgb32_dir_fsh_src // rgb32 dir bilinear + glsl_plain_rgb32_dir_fsh_src, // rgb32 dir plain + glsl_bilinear_rgb32_dir_fsh_src, // rgb32 dir bilinear + glsl_bicubic_rgb32_dir_fsh_src, // rgb32 dir bicubic }; #endif // GLSL_SOURCE_ON_DISK @@ -50,12 +53,13 @@ static const char * glsl_mamebm_filter_names [GLSL_SHADER_FEAT_MAX_NUMBER] = { "plain", "bilinear", + "bicubic", "custom" }; static GLhandleARB glsl_mamebm_programs [GLSL_SHADER_FEAT_MAX_NUMBER+9] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* rgb32 dir: plain, bilinear, custom0-9, .. */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* rgb32 dir: plain, bilinear, bicubic, custom0-9, .. */ }; /** @@ -65,6 +69,7 @@ static int glsl_mamebm_fsh2vsh[GLSL_SHADER_FEAT_MAX_NUMBER] = { 0, // plain -> general 0, // bilinear -> general + 0, // bicubic -> general 1, // custom -> custom }; @@ -75,7 +80,7 @@ static GLhandleARB glsl_mamebm_vsh_shader[GLSL_VERTEX_SHADER_MAX_NUMBER+9] = static GLhandleARB glsl_mamebm_fsh_shader [GLSL_SHADER_FEAT_MAX_NUMBER+9] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* rgb32 dir: plain, bilinear, custom0-9 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* rgb32 dir: plain, bilinear, bicubic, custom0-9 */ }; static GLhandleARB glsl_scrn_programs [10] = @@ -145,7 +150,7 @@ glsl_shader_info *glsl_shader_init(osd_gl_context *gl_ctx) if(glsl_mamebm_fsh_files[j]) err = gl_compile_shader_files (&glsl_mamebm_programs[j], &glsl_mamebm_vsh_shader[glsl_mamebm_fsh2vsh[j]], - &glsl_mamebmfsh_shader[j], + &glsl_mamebm_fsh_shader[j], nullptr /*precompiled*/, glsl_mamebm_fsh_files[j], 0); #else if(glsl_mamebm_fsh_sources[j]) diff --git a/src/osd/modules/opengl/gl_shader_mgr.h b/src/osd/modules/opengl/gl_shader_mgr.h index b232243f636..f95ec8c2244 100644 --- a/src/osd/modules/opengl/gl_shader_mgr.h +++ b/src/osd/modules/opengl/gl_shader_mgr.h @@ -11,6 +11,7 @@ enum GLSL_SHADER_FEATURE { GLSL_SHADER_FEAT_PLAIN, GLSL_SHADER_FEAT_BILINEAR, + GLSL_SHADER_FEAT_BICUBIC, GLSL_SHADER_FEAT_INT_NUMBER, GLSL_SHADER_FEAT_CUSTOM = GLSL_SHADER_FEAT_INT_NUMBER, GLSL_SHADER_FEAT_MAX_NUMBER diff --git a/src/osd/modules/opengl/shader/genc.sh b/src/osd/modules/opengl/shader/genc.sh index 2c676e62f9b..339babedc0b 100644..100755 --- a/src/osd/modules/opengl/shader/genc.sh +++ b/src/osd/modules/opengl/shader/genc.sh @@ -44,3 +44,7 @@ echo "const char glsl_bilinear_rgb32_dir_fsh_src[] =" > glsl_bilinear_rgb32_dir. sed -e 's/^/"/g' -e 's/$/\\n"/g' glsl_bilinear_rgb32_dir.fsh >> glsl_bilinear_rgb32_dir.fsh.c echo ";" >> glsl_bilinear_rgb32_dir.fsh.c +echo "const char glsl_bicubic_rgb32_dir_fsh_src[] =" > glsl_bicubic_rgb32_dir.fsh.c +sed -e 's/^/"/g' -e 's/$/\\n"/g' glsl_bicubic_rgb32_dir.fsh >> glsl_bicubic_rgb32_dir.fsh.c +echo ";" >> glsl_bicubic_rgb32_dir.fsh.c + diff --git a/src/osd/modules/opengl/shader/glsl_bicubic_rgb32_dir.fsh b/src/osd/modules/opengl/shader/glsl_bicubic_rgb32_dir.fsh new file mode 100644 index 00000000000..1617bd13a1d --- /dev/null +++ b/src/osd/modules/opengl/shader/glsl_bicubic_rgb32_dir.fsh @@ -0,0 +1,81 @@ +// license:BSD-3-Clause +// copyright-holders:Aaron Stover +#pragma optimize (on) +#pragma debug (off) + +uniform sampler2D color_texture; +uniform vec2 color_texture_pow2_sz; // pow2 tex size +uniform vec4 vid_attributes; // gamma, contrast, brightness + +#define TEX2D(v) texture2D(color_texture,(v)) + +void main() +{ + vec2 pixel = gl_TexCoord[0].st * color_texture_pow2_sz - 0.5; + vec2 uv_ratio = fract(pixel); + vec2 one = 1.0 / color_texture_pow2_sz; + vec2 xy = (floor(pixel) + 0.5) * one; + + // + // Robert G. Keys' + // + // 'Cubic Convolution Interpolation for Digital Image Processing' + // IEEE TRANSACTIONS ON ACOUSTICS, SPEECH, AND SIGNAL PROCESSING, + // VOL. ASSP-29, NO. 6, DECEMBER 1981 + // + // gives the following equation: + // + // g(x) = c_k-1(-s^3 + 2s^2 - s)/2 + // + c_k(3s^3 - 5s^2 + 2)/2 + // + c_k+1(-3s^3 + 4s^2 + s)/2 + // + c_k+2(s^3 - s^2)/2 + // + // c_* are the sample values, s is our uv_ratio. + // + // Weight equations are taken from above. + // + vec2 s = uv_ratio; + vec2 s2 = uv_ratio*uv_ratio; + vec2 s3 = uv_ratio*uv_ratio*uv_ratio; + vec2 w0 = 0.5 * (-s3 + 2.0*s2 - s); + vec2 w1 = 0.5 * (3.0*s3 - 5.0*s2 + 2.0); + vec2 w2 = 0.5 * (-3.0*s3 + 4.0*s2 + s); + vec2 w3 = 0.5 * (s3 - s2); + + // Compute the coordinates to sample from + vec2 pos0 = xy - 1.0*one.xy; + vec2 pos1 = xy; + vec2 pos2 = xy + 1.0*one.xy; + vec2 pos3 = xy + 2.0*one.xy; + + // Finally - take the samples, multiply by weight, and sum + vec4 col = 0.0; + col += TEX2D(vec2(pos0.x, pos0.y)) * w0.x * w0.y; + col += TEX2D(vec2(pos1.x, pos0.y)) * w1.x * w0.y; + col += TEX2D(vec2(pos2.x, pos0.y)) * w2.x * w0.y; + col += TEX2D(vec2(pos3.x, pos0.y)) * w3.x * w0.y; + + col += TEX2D(vec2(pos0.x, pos1.y)) * w0.x * w1.y; + col += TEX2D(vec2(pos1.x, pos1.y)) * w1.x * w1.y; + col += TEX2D(vec2(pos2.x, pos1.y)) * w2.x * w1.y; + col += TEX2D(vec2(pos3.x, pos1.y)) * w3.x * w1.y; + + col += TEX2D(vec2(pos0.x, pos2.y)) * w0.x * w2.y; + col += TEX2D(vec2(pos1.x, pos2.y)) * w1.x * w2.y; + col += TEX2D(vec2(pos2.x, pos2.y)) * w2.x * w2.y; + col += TEX2D(vec2(pos3.x, pos2.y)) * w3.x * w2.y; + + col += TEX2D(vec2(pos0.x, pos3.y)) * w0.x * w3.y; + col += TEX2D(vec2(pos1.x, pos3.y)) * w1.x * w3.y; + col += TEX2D(vec2(pos2.x, pos3.y)) * w2.x * w3.y; + col += TEX2D(vec2(pos3.x, pos3.y)) * w3.x * w3.y; + +#ifdef DO_GAMMA + // gamma/contrast/brightness + vec4 gamma = vec4(1.0 / vid_attributes.r, 1.0 / vid_attributes.r, 1.0 / vid_attributes.r, 0.0); + gl_FragColor = ( pow ( col, gamma ) * vid_attributes.g) + vid_attributes.b - 1.0; +#else + // contrast/brightness + gl_FragColor = ( col * vid_attributes.g) + vid_attributes.b - 1.0; +#endif +}
\ No newline at end of file diff --git a/src/osd/modules/opengl/shader/glsl_bicubic_rgb32_dir.fsh.c b/src/osd/modules/opengl/shader/glsl_bicubic_rgb32_dir.fsh.c new file mode 100644 index 00000000000..cd5655438af --- /dev/null +++ b/src/osd/modules/opengl/shader/glsl_bicubic_rgb32_dir.fsh.c @@ -0,0 +1,82 @@ +const char glsl_bicubic_rgb32_dir_fsh_src[] = +"// license:BSD-3-Clause\n" +"// copyright-holders:Aaron Stover\n" +"#pragma optimize (on)\n" +"#pragma debug (off)\n" +"\n" +"uniform sampler2D color_texture;\n" +"uniform vec2 color_texture_pow2_sz; // pow2 tex size\n" +"uniform vec4 vid_attributes; // gamma, contrast, brightness\n" +"\n" +"#define TEX2D(v) texture2D(color_texture,(v))\n" +"\n" +"void main()\n" +"{\n" +" vec2 pixel = gl_TexCoord[0].st * color_texture_pow2_sz - 0.5;\n" +" vec2 uv_ratio = fract(pixel);\n" +" vec2 one = 1.0 / color_texture_pow2_sz;\n" +" vec2 xy = (floor(pixel) + 0.5) * one;\n" +"\n" +" //\n" +" // Robert G. Keys'\n" +" //\n" +" // 'Cubic Convolution Interpolation for Digital Image Processing'\n" +" // IEEE TRANSACTIONS ON ACOUSTICS, SPEECH, AND SIGNAL PROCESSING, \n" +" // VOL. ASSP-29, NO. 6, DECEMBER 1981 \n" +" //\n" +" // gives the following equation:\n" +" //\n" +" // g(x) = c_k-1(-s^3 + 2s^2 - s)/2 \n" +" // + c_k(3s^3 - 5s^2 + 2)/2\n" +" // + c_k+1(-3s^3 + 4s^2 + s)/2 \n" +" // + c_k+2(s^3 - s^2)/2\n" +" //\n" +" // c_* are the sample values, s is our uv_ratio. \n" +" //\n" +" // Weight equations are taken from above.\n" +" //\n" +" vec2 s = uv_ratio;\n" +" vec2 s2 = uv_ratio*uv_ratio;\n" +" vec2 s3 = uv_ratio*uv_ratio*uv_ratio;\n" +" vec2 w0 = 0.5 * (-s3 + 2.0*s2 - s);\n" +" vec2 w1 = 0.5 * (3.0*s3 - 5.0*s2 + 2.0);\n" +" vec2 w2 = 0.5 * (-3.0*s3 + 4.0*s2 + s);\n" +" vec2 w3 = 0.5 * (s3 - s2);\n" +"\n" +" // Compute the coordinates to sample from\n" +" vec2 pos0 = xy - 1.0*one.xy;\n" +" vec2 pos1 = xy;\n" +" vec2 pos2 = xy + 1.0*one.xy;\n" +" vec2 pos3 = xy + 2.0*one.xy;\n" +"\n" +" // Finally - take the samples, multiply by weight, and sum\n" +" vec4 col = 0.0;\n" +" col += TEX2D(vec2(pos0.x, pos0.y)) * w0.x * w0.y;\n" +" col += TEX2D(vec2(pos1.x, pos0.y)) * w1.x * w0.y;\n" +" col += TEX2D(vec2(pos2.x, pos0.y)) * w2.x * w0.y;\n" +" col += TEX2D(vec2(pos3.x, pos0.y)) * w3.x * w0.y;\n" +"\n" +" col += TEX2D(vec2(pos0.x, pos1.y)) * w0.x * w1.y;\n" +" col += TEX2D(vec2(pos1.x, pos1.y)) * w1.x * w1.y;\n" +" col += TEX2D(vec2(pos2.x, pos1.y)) * w2.x * w1.y;\n" +" col += TEX2D(vec2(pos3.x, pos1.y)) * w3.x * w1.y;\n" +" \n" +" col += TEX2D(vec2(pos0.x, pos2.y)) * w0.x * w2.y;\n" +" col += TEX2D(vec2(pos1.x, pos2.y)) * w1.x * w2.y;\n" +" col += TEX2D(vec2(pos2.x, pos2.y)) * w2.x * w2.y;\n" +" col += TEX2D(vec2(pos3.x, pos2.y)) * w3.x * w2.y;\n" +"\n" +" col += TEX2D(vec2(pos0.x, pos3.y)) * w0.x * w3.y;\n" +" col += TEX2D(vec2(pos1.x, pos3.y)) * w1.x * w3.y;\n" +" col += TEX2D(vec2(pos2.x, pos3.y)) * w2.x * w3.y;\n" +" col += TEX2D(vec2(pos3.x, pos3.y)) * w3.x * w3.y;\n" +"\n" +"#ifdef DO_GAMMA\n" +" // gamma/contrast/brightness\n" +" vec4 gamma = vec4(1.0 / vid_attributes.r, 1.0 / vid_attributes.r, 1.0 / vid_attributes.r, 0.0);\n" +" gl_FragColor = ( pow ( col, gamma ) * vid_attributes.g) + vid_attributes.b - 1.0;\n" +"#else\n" +" // contrast/brightness\n" +" gl_FragColor = ( col * vid_attributes.g) + vid_attributes.b - 1.0;\n" +"#endif\n" +"}\n"; |