From 5e7ce63ed12c96d2bf7de22e1ef8f9815845729f Mon Sep 17 00:00:00 2001 From: Gregory Hainaut Date: Sat, 11 Jul 2015 00:03:33 +0200 Subject: [PATCH] glsl: add a geometry shader to upscale GS_POINT The purpose is to avoid upscaling issue on POINT rendering (black netting on some FMVs) --- plugins/GSdx/res/glsl/tfx_vgs.glsl | 42 ++++++++++++++++++++---------- plugins/GSdx/res/glsl_source.h | 42 ++++++++++++++++++++---------- 2 files changed, 56 insertions(+), 28 deletions(-) diff --git a/plugins/GSdx/res/glsl/tfx_vgs.glsl b/plugins/GSdx/res/glsl/tfx_vgs.glsl index eced8c3cdd..6ff064fbd9 100644 --- a/plugins/GSdx/res/glsl/tfx_vgs.glsl +++ b/plugins/GSdx/res/glsl/tfx_vgs.glsl @@ -187,7 +187,6 @@ struct vertex { vec4 t; vec4 c; - vec2 a; }; void out_vertex(in vertex v) @@ -198,47 +197,62 @@ void out_vertex(in vertex v) EmitVertex(); } -void out_flat(in vec2 dp) +void out_flat() { // Flat output +#if GS_POINT == 1 + GSout.fc = GSin[0].fc; +#else GSout.fc = GSin[1].fc; +#endif } +#if GS_POINT == 1 +layout(points) in; +#else layout(lines) in; +#endif layout(triangle_strip, max_vertices = 6) out; void gs_main() { - // Rescale from -1 1 to 0:1 (require window size) - vec2 dp = vec2(0.0f, 0.0f); - // left top => GSin[0]; // right bottom => GSin[1]; - vertex rb = vertex(GSin[1].t, GSin[1].c, dp); - vertex lt = vertex(GSin[0].t, GSin[0].c, vec2(0.0f, 0.0f)); +#if GS_POINT == 1 + vertex rb = vertex(GSin[0].t, GSin[0].c); +#else + vertex rb = vertex(GSin[1].t, GSin[1].c); +#endif + vertex lt = vertex(GSin[0].t, GSin[0].c); +#if GS_POINT == 1 + // FIXME need pixel size + vec4 rb_p = gl_in[0].gl_Position + vec4(4.0f/1280.0f, 4.0f/1024.0f, 0.0f, 0.0f); +#else vec4 rb_p = gl_in[1].gl_Position; - vec4 lb_p = gl_in[1].gl_Position; - vec4 rt_p = gl_in[1].gl_Position; +#endif + vec4 lb_p = rb_p; + vec4 rt_p = rb_p; vec4 lt_p = gl_in[0].gl_Position; +#if GS_POINT == 0 // flat depth lt_p.z = rb_p.z; // flat fog and texture perspective lt.t.zw = rb.t.zw; // flat color lt.c = rb.c; +#endif // Swap texture and position coordinate vertex lb = rb; - lb_p.x = lt_p.x; lb.t.x = lt.t.x; - lb.a.x = lt.a.x; + lb_p.x = lt_p.x; vertex rt = rb; rt_p.y = lt_p.y; rt.t.y = lt.t.y; - rt.a.y = lt.a.y; + // Triangle 1 gl_Position = lt_p; @@ -248,7 +262,7 @@ void gs_main() out_vertex(lb); gl_Position = rt_p; - out_flat(dp); + out_flat(); out_vertex(rt); EndPrimitive(); @@ -260,7 +274,7 @@ void gs_main() out_vertex(rt); gl_Position = rb_p; - out_flat(dp); + out_flat(); out_vertex(rb); EndPrimitive(); } diff --git a/plugins/GSdx/res/glsl_source.h b/plugins/GSdx/res/glsl_source.h index 14c91f220f..b675e3eb54 100644 --- a/plugins/GSdx/res/glsl_source.h +++ b/plugins/GSdx/res/glsl_source.h @@ -795,7 +795,6 @@ static const char* tfx_vgs_glsl = "{\n" " vec4 t;\n" " vec4 c;\n" - " vec2 a;\n" "};\n" "\n" "void out_vertex(in vertex v)\n" @@ -806,47 +805,62 @@ static const char* tfx_vgs_glsl = " EmitVertex();\n" "}\n" "\n" - "void out_flat(in vec2 dp)\n" + "void out_flat()\n" "{\n" " // Flat output\n" + "#if GS_POINT == 1\n" + " GSout.fc = GSin[0].fc;\n" + "#else\n" " GSout.fc = GSin[1].fc;\n" + "#endif\n" "}\n" "\n" + "#if GS_POINT == 1\n" + "layout(points) in;\n" + "#else\n" "layout(lines) in;\n" + "#endif\n" "layout(triangle_strip, max_vertices = 6) out;\n" "\n" "void gs_main()\n" "{\n" - " // Rescale from -1 1 to 0:1 (require window size)\n" - " vec2 dp = vec2(0.0f, 0.0f);\n" - "\n" " // left top => GSin[0];\n" " // right bottom => GSin[1];\n" - " vertex rb = vertex(GSin[1].t, GSin[1].c, dp);\n" - " vertex lt = vertex(GSin[0].t, GSin[0].c, vec2(0.0f, 0.0f));\n" + "#if GS_POINT == 1\n" + " vertex rb = vertex(GSin[0].t, GSin[0].c);\n" + "#else\n" + " vertex rb = vertex(GSin[1].t, GSin[1].c);\n" + "#endif\n" + " vertex lt = vertex(GSin[0].t, GSin[0].c);\n" "\n" + "#if GS_POINT == 1\n" + " // FIXME need pixel size\n" + " vec4 rb_p = gl_in[0].gl_Position + vec4(4.0f/1280.0f, 4.0f/1024.0f, 0.0f, 0.0f);\n" + "#else\n" " vec4 rb_p = gl_in[1].gl_Position;\n" - " vec4 lb_p = gl_in[1].gl_Position;\n" - " vec4 rt_p = gl_in[1].gl_Position;\n" + "#endif\n" + " vec4 lb_p = rb_p;\n" + " vec4 rt_p = rb_p;\n" " vec4 lt_p = gl_in[0].gl_Position;\n" "\n" + "#if GS_POINT == 0\n" " // flat depth\n" " lt_p.z = rb_p.z;\n" " // flat fog and texture perspective\n" " lt.t.zw = rb.t.zw;\n" " // flat color\n" " lt.c = rb.c;\n" + "#endif\n" "\n" " // Swap texture and position coordinate\n" " vertex lb = rb;\n" - " lb_p.x = lt_p.x;\n" " lb.t.x = lt.t.x;\n" - " lb.a.x = lt.a.x;\n" + " lb_p.x = lt_p.x;\n" "\n" " vertex rt = rb;\n" " rt_p.y = lt_p.y;\n" " rt.t.y = lt.t.y;\n" - " rt.a.y = lt.a.y;\n" + "\n" "\n" " // Triangle 1\n" " gl_Position = lt_p;\n" @@ -856,7 +870,7 @@ static const char* tfx_vgs_glsl = " out_vertex(lb);\n" "\n" " gl_Position = rt_p;\n" - " out_flat(dp);\n" + " out_flat();\n" " out_vertex(rt);\n" " EndPrimitive();\n" "\n" @@ -868,7 +882,7 @@ static const char* tfx_vgs_glsl = " out_vertex(rt);\n" "\n" " gl_Position = rb_p;\n" - " out_flat(dp);\n" + " out_flat();\n" " out_vertex(rb);\n" " EndPrimitive();\n" "}\n"