Skip to content

Commit eda5d86

Browse files
authored
Add compatibility with multiple OpenGL versions (#93)
* GL 2.1 and GLSL 1.20 compatibility * Don't specify glsl version * Forgot to remove this * Allow passing different version of GL as command line flag * Support more OpenGL versions * Smaller functions * Break video into smaller files
1 parent 37d1b73 commit eda5d86

9 files changed

Lines changed: 244 additions & 122 deletions

main.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,10 @@ func runLoop(vid *video.Video) {
6262
}
6363

6464
func main() {
65+
var GLVersion uint
6566
flag.StringVar(&state.Global.CorePath, "L", "", "Path to the libretro core")
6667
flag.BoolVar(&state.Global.Verbose, "v", false, "Verbose logs")
68+
flag.UintVar(&GLVersion, "glver", 32, "OpenGL version")
6769
flag.Parse()
6870
args := flag.Args()
6971

@@ -91,7 +93,7 @@ func main() {
9193

9294
playlists.LoadPlaylists()
9395

94-
vid := video.Init(settings.Settings.VideoFullscreen)
96+
vid := video.Init(settings.Settings.VideoFullscreen, GLVersion)
9597

9698
m := menu.Init(vid)
9799
m.ContextReset()

video/border_frag_shader.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
11
package video
22

3-
// source of the shader to draw circles
43
var borderFragmentShader = `
5-
#version 330
4+
#if __VERSION__ >= 130
5+
#define COMPAT_VARYING in
6+
#define COMPAT_ATTRIBUTE in
7+
#define COMPAT_TEXTURE texture
8+
#define COMPAT_FRAGCOLOR FragColor
9+
out vec4 COMPAT_FRAGCOLOR;
10+
#else
11+
#define COMPAT_VARYING varying
12+
#define COMPAT_ATTRIBUTE attribute
13+
#define COMPAT_TEXTURE texture2D
14+
#define COMPAT_FRAGCOLOR gl_FragColor
15+
#endif
616
717
uniform float border_width;
818
uniform vec4 color;
919
uniform vec2 size;
1020
11-
in vec2 fragTexCoord;
12-
out vec4 outputColor;
21+
COMPAT_VARYING vec2 fragTexCoord;
1322
1423
void main() {
1524
float ratio = size.x / size.y;
@@ -20,9 +29,9 @@ void main() {
2029
2130
if (fragTexCoord.x < maxX && fragTexCoord.x > minX &&
2231
fragTexCoord.y < maxY && fragTexCoord.y > minY) {
23-
outputColor = vec4(0,0,0,0);
32+
COMPAT_FRAGCOLOR = vec4(0,0,0,0);
2433
} else {
25-
outputColor = color;
34+
COMPAT_FRAGCOLOR = color;
2635
}
2736
}
2837
` + "\x00"

video/circle_frag_shader.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,30 @@
11
package video
22

3-
// source of the shader to draw circles
43
var circleFragmentShader = `
5-
#version 330
4+
#if __VERSION__ >= 130
5+
#define COMPAT_VARYING in
6+
#define COMPAT_ATTRIBUTE in
7+
#define COMPAT_TEXTURE texture
8+
#define COMPAT_FRAGCOLOR FragColor
9+
out vec4 COMPAT_FRAGCOLOR;
10+
#else
11+
#define COMPAT_VARYING varying
12+
#define COMPAT_ATTRIBUTE attribute
13+
#define COMPAT_TEXTURE texture2D
14+
#define COMPAT_FRAGCOLOR gl_FragColor
15+
#endif
616
717
uniform sampler2D tex;
818
uniform vec4 color;
919
10-
in vec2 fragTexCoord;
11-
out vec4 outputColor;
20+
COMPAT_VARYING vec2 fragTexCoord;
1221
13-
float circle(in vec2 _st, in float _radius) {
22+
float circle(vec2 _st, float _radius) {
1423
vec2 dist = _st - vec2(0.5);
1524
return 1.-smoothstep(_radius-(_radius*0.05), _radius+(_radius*0.05), dot(dist,dist)*4.0);
1625
}
1726
1827
void main() {
19-
outputColor = vec4(color.rgb, circle(fragTexCoord.xy, 0.125));
28+
COMPAT_FRAGCOLOR = vec4(color.rgb, circle(fragTexCoord.xy, 0.125));
2029
}
2130
` + "\x00"

video/darken_frag_shader.go

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,36 @@
11
package video
22

33
var darkenFragmentShader = `
4-
#version 330
4+
#if __VERSION__ >= 130
5+
#define COMPAT_VARYING in
6+
#define COMPAT_ATTRIBUTE in
7+
#define COMPAT_TEXTURE texture
8+
#define COMPAT_FRAGCOLOR FragColor
9+
out vec4 COMPAT_FRAGCOLOR;
10+
#else
11+
#define COMPAT_VARYING varying
12+
#define COMPAT_ATTRIBUTE attribute
13+
#define COMPAT_TEXTURE texture2D
14+
#define COMPAT_FRAGCOLOR gl_FragColor
15+
#endif
516
617
uniform sampler2D tex;
718
uniform float mask;
819
uniform vec4 texColor;
920
10-
in vec2 fragTexCoord;
21+
COMPAT_VARYING vec2 fragTexCoord;
1122
12-
out vec4 outputColor;
13-
14-
vec4 grayscale(in vec4 c) {
23+
vec4 grayscale(vec4 c) {
1524
float average = (c.r + c.g + c.b) / 3.0;
1625
return vec4(average, average, average, 1.0);
1726
}
1827
19-
vec4 darken(in vec4 c) {
20-
return vec4(c.r/4, c.g/4, c.b/4, 1.0);
28+
vec4 darken(vec4 c) {
29+
return vec4(c.r/4.0, c.g/4.0, c.b/4.0, 1.0);
2130
}
2231
2332
void main() {
24-
vec4 color = texture(tex, fragTexCoord);
25-
outputColor = texColor * mix(color, darken(grayscale(color)), mask);
33+
vec4 color = COMPAT_TEXTURE(tex, fragTexCoord);
34+
COMPAT_FRAGCOLOR = texColor * mix(color, darken(grayscale(color)), mask);
2635
}
2736
` + "\x00"

video/default_vert_shader.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package video
2+
3+
var vertexShader = `
4+
#if __VERSION__ >= 130
5+
#define COMPAT_VARYING out
6+
#define COMPAT_ATTRIBUTE in
7+
#define COMPAT_TEXTURE texture
8+
#define COMPAT_FRAGCOLOR FragColor
9+
out vec4 COMPAT_FRAGCOLOR;
10+
#else
11+
#define COMPAT_VARYING varying
12+
#define COMPAT_ATTRIBUTE attribute
13+
#define COMPAT_TEXTURE texture2D
14+
#define COMPAT_FRAGCOLOR gl_FragColor
15+
#endif
16+
17+
COMPAT_ATTRIBUTE vec2 vert;
18+
COMPAT_ATTRIBUTE vec2 vertTexCoord;
19+
20+
COMPAT_VARYING vec2 fragTexCoord;
21+
22+
void main() {
23+
fragTexCoord = vertTexCoord;
24+
gl_Position = vec4(vert, 0, 1);
25+
}
26+
` + "\x00"

video/demul_frag_shader.go

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,31 @@
11
package video
22

33
var demulFragmentShader = `
4-
#version 330
4+
#if __VERSION__ >= 130
5+
#define COMPAT_VARYING in
6+
#define COMPAT_ATTRIBUTE in
7+
#define COMPAT_TEXTURE texture
8+
#define COMPAT_FRAGCOLOR FragColor
9+
out vec4 COMPAT_FRAGCOLOR;
10+
#else
11+
#define COMPAT_VARYING varying
12+
#define COMPAT_ATTRIBUTE attribute
13+
#define COMPAT_TEXTURE texture2D
14+
#define COMPAT_FRAGCOLOR gl_FragColor
15+
#endif
516
617
uniform sampler2D tex;
718
uniform float mask;
819
uniform vec4 texColor;
920
10-
in vec2 fragTexCoord;
21+
COMPAT_VARYING vec2 fragTexCoord;
1122
12-
out vec4 outputColor;
13-
14-
vec4 demultiply(in vec4 c) {
23+
vec4 demultiply(vec4 c) {
1524
return vec4(c.rgb/c.a, c.a);
1625
}
1726
1827
void main() {
19-
vec4 color = demultiply(texture(tex, fragTexCoord));
20-
outputColor = texColor * color;
28+
vec4 color = demultiply(COMPAT_TEXTURE(tex, fragTexCoord));
29+
COMPAT_FRAGCOLOR = texColor * color;
2130
}
2231
` + "\x00"

video/rounded_frag_shader.go

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,24 @@
11
package video
22

33
var roundedFragmentShader = `
4-
#version 330
4+
#if __VERSION__ >= 130
5+
#define COMPAT_VARYING in
6+
#define COMPAT_ATTRIBUTE in
7+
#define COMPAT_TEXTURE texture
8+
#define COMPAT_FRAGCOLOR FragColor
9+
out vec4 COMPAT_FRAGCOLOR;
10+
#else
11+
#define COMPAT_VARYING varying
12+
#define COMPAT_ATTRIBUTE attribute
13+
#define COMPAT_TEXTURE texture2D
14+
#define COMPAT_FRAGCOLOR gl_FragColor
15+
#endif
516
617
uniform vec4 color;
718
uniform float radius;
819
uniform vec2 size;
920
10-
in vec2 fragTexCoord;
11-
out vec4 outputColor;
21+
COMPAT_VARYING vec2 fragTexCoord;
1222
1323
float udRoundBox(vec2 p, vec2 b, float r) {
1424
return length(max(abs(p)-b+r,0.0))-r;
@@ -18,6 +28,6 @@ void main() {
1828
float ratio = size.x / size.y;
1929
vec2 halfRes = vec2(0.5*ratio, 0.5);
2030
float b = udRoundBox(fragTexCoord*vec2(ratio,1.0) - halfRes, halfRes, min(halfRes.x,halfRes.y)*radius);
21-
outputColor = vec4(color.r, color.g, color.b, min(color.a, 1-smoothstep(0.00001,0.001,b)));
31+
COMPAT_FRAGCOLOR = vec4(color.r, color.g, color.b, min(color.a, 1.0-smoothstep(0.00001,0.001,b)));
2232
}
2333
` + "\x00"

video/shader_utils.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package video
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
7+
"github.com/go-gl/gl/all-core/gl"
8+
)
9+
10+
func newProgram(GLSLVersion uint, vertexShaderSource, fragmentShaderSource string) (uint32, error) {
11+
vertexShaderSource = fmt.Sprintf("#version %d\n", GLSLVersion) + vertexShaderSource
12+
fragmentShaderSource = fmt.Sprintf("#version %d\n", GLSLVersion) + fragmentShaderSource
13+
14+
vertexShader, err := compileShader(vertexShaderSource, gl.VERTEX_SHADER)
15+
if err != nil {
16+
return 0, err
17+
}
18+
19+
fragmentShader, err := compileShader(fragmentShaderSource, gl.FRAGMENT_SHADER)
20+
if err != nil {
21+
return 0, err
22+
}
23+
24+
program := gl.CreateProgram()
25+
26+
gl.AttachShader(program, vertexShader)
27+
gl.AttachShader(program, fragmentShader)
28+
gl.LinkProgram(program)
29+
30+
var status int32
31+
gl.GetProgramiv(program, gl.LINK_STATUS, &status)
32+
if status == gl.FALSE {
33+
var logLength int32
34+
gl.GetProgramiv(program, gl.INFO_LOG_LENGTH, &logLength)
35+
36+
log := strings.Repeat("\x00", int(logLength+1))
37+
gl.GetProgramInfoLog(program, logLength, nil, gl.Str(log))
38+
39+
return 0, fmt.Errorf("failed to link program: %v", log)
40+
}
41+
42+
gl.DeleteShader(vertexShader)
43+
gl.DeleteShader(fragmentShader)
44+
45+
return program, nil
46+
}
47+
48+
func compileShader(source string, shaderType uint32) (uint32, error) {
49+
shader := gl.CreateShader(shaderType)
50+
51+
csources, free := gl.Strs(source)
52+
gl.ShaderSource(shader, 1, csources, nil)
53+
free()
54+
gl.CompileShader(shader)
55+
56+
var status int32
57+
gl.GetShaderiv(shader, gl.COMPILE_STATUS, &status)
58+
if status == gl.FALSE {
59+
var logLength int32
60+
gl.GetShaderiv(shader, gl.INFO_LOG_LENGTH, &logLength)
61+
62+
log := strings.Repeat("\x00", int(logLength+1))
63+
gl.GetShaderInfoLog(shader, logLength, nil, gl.Str(log))
64+
65+
return 0, fmt.Errorf("failed to compile %v: %v", source, log)
66+
}
67+
68+
return shader, nil
69+
}

0 commit comments

Comments
 (0)