diff --git a/binaries/data/mods/public/shaders/effects/gui_add.xml b/binaries/data/mods/public/shaders/effects/gui_add.xml
new file mode 100644
index 0000000000..116b1db8eb
--- /dev/null
+++ b/binaries/data/mods/public/shaders/effects/gui_add.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/binaries/data/mods/public/shaders/effects/gui_basic.xml b/binaries/data/mods/public/shaders/effects/gui_basic.xml
new file mode 100644
index 0000000000..b35b36cb44
--- /dev/null
+++ b/binaries/data/mods/public/shaders/effects/gui_basic.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/binaries/data/mods/public/shaders/effects/gui_grayscale.xml b/binaries/data/mods/public/shaders/effects/gui_grayscale.xml
new file mode 100644
index 0000000000..dcced98104
--- /dev/null
+++ b/binaries/data/mods/public/shaders/effects/gui_grayscale.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/binaries/data/mods/public/shaders/effects/gui_solid.xml b/binaries/data/mods/public/shaders/effects/gui_solid.xml
new file mode 100644
index 0000000000..c03383d55f
--- /dev/null
+++ b/binaries/data/mods/public/shaders/effects/gui_solid.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/binaries/data/mods/public/shaders/effects/gui_text.xml b/binaries/data/mods/public/shaders/effects/gui_text.xml
index cc2f8f36db..e6941c3101 100644
--- a/binaries/data/mods/public/shaders/effects/gui_text.xml
+++ b/binaries/data/mods/public/shaders/effects/gui_text.xml
@@ -1,18 +1,18 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/binaries/data/mods/public/shaders/effects/model_normal.xml b/binaries/data/mods/public/shaders/effects/model_normal.xml
index d995aebc19..59c51a260f 100644
--- a/binaries/data/mods/public/shaders/effects/model_normal.xml
+++ b/binaries/data/mods/public/shaders/effects/model_normal.xml
@@ -1,14 +1,14 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/binaries/data/mods/public/shaders/effects/model_normal_instancing.xml b/binaries/data/mods/public/shaders/effects/model_normal_instancing.xml
index bcb2e4a864..43a1187de4 100644
--- a/binaries/data/mods/public/shaders/effects/model_normal_instancing.xml
+++ b/binaries/data/mods/public/shaders/effects/model_normal_instancing.xml
@@ -1,14 +1,14 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/binaries/data/mods/public/shaders/effects/solid.xml b/binaries/data/mods/public/shaders/effects/solid.xml
index 2296b23fcd..4121f7197a 100644
--- a/binaries/data/mods/public/shaders/effects/solid.xml
+++ b/binaries/data/mods/public/shaders/effects/solid.xml
@@ -1,9 +1,9 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/binaries/data/mods/public/shaders/glsl/gui_add.fs b/binaries/data/mods/public/shaders/glsl/gui_add.fs
new file mode 100644
index 0000000000..b29f31bb6e
--- /dev/null
+++ b/binaries/data/mods/public/shaders/glsl/gui_add.fs
@@ -0,0 +1,11 @@
+#version 110
+
+uniform sampler2D tex;
+uniform vec4 color;
+
+varying vec2 v_tex;
+
+void main()
+{
+ gl_FragColor = texture2D(tex, v_tex) + color;
+}
diff --git a/binaries/data/mods/public/shaders/glsl/gui_add.vs b/binaries/data/mods/public/shaders/glsl/gui_add.vs
new file mode 100644
index 0000000000..b79b568d93
--- /dev/null
+++ b/binaries/data/mods/public/shaders/glsl/gui_add.vs
@@ -0,0 +1,15 @@
+#version 110
+
+uniform mat4 transform;
+
+varying vec2 v_tex;
+
+attribute vec3 a_vertex;
+attribute vec2 a_uv0;
+
+void main()
+{
+ gl_Position = transform * vec4(a_vertex, 1.0);
+
+ v_tex = a_uv0;
+}
diff --git a/binaries/data/mods/public/shaders/glsl/gui_add.xml b/binaries/data/mods/public/shaders/glsl/gui_add.xml
new file mode 100644
index 0000000000..c2dc6acd59
--- /dev/null
+++ b/binaries/data/mods/public/shaders/glsl/gui_add.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/binaries/data/mods/public/shaders/glsl/gui_basic.fs b/binaries/data/mods/public/shaders/glsl/gui_basic.fs
new file mode 100644
index 0000000000..a695ccd0ab
--- /dev/null
+++ b/binaries/data/mods/public/shaders/glsl/gui_basic.fs
@@ -0,0 +1,10 @@
+#version 110
+
+uniform sampler2D tex;
+
+varying vec2 v_tex;
+
+void main()
+{
+ gl_FragColor = texture2D(tex, v_tex);
+}
diff --git a/binaries/data/mods/public/shaders/glsl/gui_basic.vs b/binaries/data/mods/public/shaders/glsl/gui_basic.vs
new file mode 100644
index 0000000000..b79b568d93
--- /dev/null
+++ b/binaries/data/mods/public/shaders/glsl/gui_basic.vs
@@ -0,0 +1,15 @@
+#version 110
+
+uniform mat4 transform;
+
+varying vec2 v_tex;
+
+attribute vec3 a_vertex;
+attribute vec2 a_uv0;
+
+void main()
+{
+ gl_Position = transform * vec4(a_vertex, 1.0);
+
+ v_tex = a_uv0;
+}
diff --git a/binaries/data/mods/public/shaders/glsl/gui_basic.xml b/binaries/data/mods/public/shaders/glsl/gui_basic.xml
new file mode 100644
index 0000000000..36ef4e1b28
--- /dev/null
+++ b/binaries/data/mods/public/shaders/glsl/gui_basic.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/binaries/data/mods/public/shaders/glsl/gui_grayscale.fs b/binaries/data/mods/public/shaders/glsl/gui_grayscale.fs
new file mode 100644
index 0000000000..a545bb7241
--- /dev/null
+++ b/binaries/data/mods/public/shaders/glsl/gui_grayscale.fs
@@ -0,0 +1,13 @@
+#version 110
+
+uniform sampler2D tex;
+uniform vec4 color;
+
+varying vec2 v_tex;
+
+void main()
+{
+ vec4 t = texture2D(tex, v_tex);
+ gl_FragColor.rgb = vec3(dot(t.rgb, vec3(0.3, 0.59, 0.11)));
+ gl_FragColor.a = t.a;
+}
diff --git a/binaries/data/mods/public/shaders/glsl/gui_grayscale.vs b/binaries/data/mods/public/shaders/glsl/gui_grayscale.vs
new file mode 100644
index 0000000000..b79b568d93
--- /dev/null
+++ b/binaries/data/mods/public/shaders/glsl/gui_grayscale.vs
@@ -0,0 +1,15 @@
+#version 110
+
+uniform mat4 transform;
+
+varying vec2 v_tex;
+
+attribute vec3 a_vertex;
+attribute vec2 a_uv0;
+
+void main()
+{
+ gl_Position = transform * vec4(a_vertex, 1.0);
+
+ v_tex = a_uv0;
+}
diff --git a/binaries/data/mods/public/shaders/glsl/gui_grayscale.xml b/binaries/data/mods/public/shaders/glsl/gui_grayscale.xml
new file mode 100644
index 0000000000..5e7ef877ce
--- /dev/null
+++ b/binaries/data/mods/public/shaders/glsl/gui_grayscale.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/binaries/data/mods/public/shaders/glsl/gui_solid.fs b/binaries/data/mods/public/shaders/glsl/gui_solid.fs
new file mode 100644
index 0000000000..29681c5e83
--- /dev/null
+++ b/binaries/data/mods/public/shaders/glsl/gui_solid.fs
@@ -0,0 +1,8 @@
+#version 110
+
+uniform vec4 color;
+
+void main()
+{
+ gl_FragColor = color;
+}
diff --git a/binaries/data/mods/public/shaders/glsl/gui_solid.vs b/binaries/data/mods/public/shaders/glsl/gui_solid.vs
new file mode 100644
index 0000000000..c082b49d0d
--- /dev/null
+++ b/binaries/data/mods/public/shaders/glsl/gui_solid.vs
@@ -0,0 +1,10 @@
+#version 110
+
+uniform mat4 transform;
+
+attribute vec3 a_vertex;
+
+void main()
+{
+ gl_Position = transform * vec4(a_vertex, 1.0);
+}
diff --git a/binaries/data/mods/public/shaders/glsl/gui_solid.xml b/binaries/data/mods/public/shaders/glsl/gui_solid.xml
new file mode 100644
index 0000000000..dc7b7973b0
--- /dev/null
+++ b/binaries/data/mods/public/shaders/glsl/gui_solid.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/binaries/data/mods/public/shaders/gui_text.fs b/binaries/data/mods/public/shaders/glsl/gui_text.fs
similarity index 92%
rename from binaries/data/mods/public/shaders/gui_text.fs
rename to binaries/data/mods/public/shaders/glsl/gui_text.fs
index 0333ee3de0..1eb19c0498 100644
--- a/binaries/data/mods/public/shaders/gui_text.fs
+++ b/binaries/data/mods/public/shaders/glsl/gui_text.fs
@@ -1,10 +1,12 @@
-uniform vec4 colorAdd;
-uniform vec4 colorMul;
-uniform sampler2D tex;
-
-varying vec2 v_texcoord;
-
-void main()
-{
- gl_FragColor = (texture2D(tex, v_texcoord) + colorAdd) * colorMul;
-}
+#version 110
+
+uniform vec4 colorAdd;
+uniform vec4 colorMul;
+uniform sampler2D tex;
+
+varying vec2 v_texcoord;
+
+void main()
+{
+ gl_FragColor = (texture2D(tex, v_texcoord) + colorAdd) * colorMul;
+}
diff --git a/binaries/data/mods/public/shaders/gui_text.vs b/binaries/data/mods/public/shaders/glsl/gui_text.vs
similarity index 91%
rename from binaries/data/mods/public/shaders/gui_text.vs
rename to binaries/data/mods/public/shaders/glsl/gui_text.vs
index a27db1f8f8..c6f772fff0 100644
--- a/binaries/data/mods/public/shaders/gui_text.vs
+++ b/binaries/data/mods/public/shaders/glsl/gui_text.vs
@@ -1,9 +1,11 @@
-uniform mat4 transform;
-
-varying vec2 v_texcoord;
-
-void main()
-{
- gl_Position = transform * gl_Vertex;
- v_texcoord = gl_MultiTexCoord0.xy;
-}
+#version 110
+
+uniform mat4 transform;
+
+varying vec2 v_texcoord;
+
+void main()
+{
+ gl_Position = transform * gl_Vertex;
+ v_texcoord = gl_MultiTexCoord0.xy;
+}
diff --git a/binaries/data/mods/public/shaders/gui_text.xml b/binaries/data/mods/public/shaders/glsl/gui_text.xml
similarity index 65%
rename from binaries/data/mods/public/shaders/gui_text.xml
rename to binaries/data/mods/public/shaders/glsl/gui_text.xml
index dd125a9b13..145c38c428 100644
--- a/binaries/data/mods/public/shaders/gui_text.xml
+++ b/binaries/data/mods/public/shaders/glsl/gui_text.xml
@@ -1,11 +1,11 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build/premake/extern_libs4.lua b/build/premake/extern_libs4.lua
index d94d1ba84a..b6e864dbd3 100644
--- a/build/premake/extern_libs4.lua
+++ b/build/premake/extern_libs4.lua
@@ -429,13 +429,20 @@ extern_lib_defs = {
if os.is("windows") then
add_default_lib_paths("opengl")
end
- add_default_links({
- win_names = { "opengl32", "gdi32" },
- unix_names = { "GL", "X11" },
- osx_frameworks = { "OpenGL" },
- dbg_suffix = "",
- no_delayload = 1, -- delayload seems to cause errors on startup
- })
+ if _OPTIONS["gles"] then
+ add_default_links({
+ unix_names = { "GLESv2" },
+ dbg_suffix = "",
+ })
+ else
+ add_default_links({
+ win_names = { "opengl32", "gdi32" },
+ unix_names = { "GL" },
+ osx_frameworks = { "OpenGL" },
+ dbg_suffix = "",
+ no_delayload = 1, -- delayload seems to cause errors on startup
+ })
+ end
end,
},
sdl = {
diff --git a/build/premake/premake4.lua b/build/premake/premake4.lua
index 1d5eab4cb4..4ff4c035f4 100644
--- a/build/premake/premake4.lua
+++ b/build/premake/premake4.lua
@@ -673,6 +673,7 @@ end
used_extern_libs = {
"opengl",
"sdl",
+ "x11",
"libjpg",
"libpng",
diff --git a/source/gui/GUIRenderer.cpp b/source/gui/GUIRenderer.cpp
index fe22758153..89fa4d3803 100644
--- a/source/gui/GUIRenderer.cpp
+++ b/source/gui/GUIRenderer.cpp
@@ -188,13 +188,13 @@ void GUIRenderer::UpdateDrawCallCache(DrawCalls &Calls, const CStr& SpriteName,
if (!Call.m_HasTexture)
{
- Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect("shader:fixed:gui_solid");
+ Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect("gui_solid");
}
else if (cit->m_Effects)
{
if (cit->m_Effects->m_AddColor != CColor())
{
- Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect("shader:fixed:gui_add");
+ Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect("gui_add");
Call.m_ShaderColorParameter = cit->m_Effects->m_AddColor;
// Always enable blending if something's being subtracted from
// the alpha channel
@@ -203,16 +203,16 @@ void GUIRenderer::UpdateDrawCallCache(DrawCalls &Calls, const CStr& SpriteName,
}
else if (cit->m_Effects->m_Greyscale)
{
- Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect("shader:fixed:gui_grayscale");
+ Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect("gui_grayscale");
}
else /* Slight confusion - why no effects? */
{
- Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect("shader:fixed:gui_basic");
+ Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect("gui_basic");
}
}
else
{
- Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect("shader:fixed:gui_basic");
+ Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect("gui_basic");
}
Calls.push_back(Call);
diff --git a/source/lib/external_libraries/glext_funcs.h b/source/lib/external_libraries/glext_funcs.h
index c9ab586315..408bb1aef6 100644
--- a/source/lib/external_libraries/glext_funcs.h
+++ b/source/lib/external_libraries/glext_funcs.h
@@ -89,6 +89,7 @@ actually supported).
#define pglGetProgramInfoLog glGetProgramInfoLog
#define pglGetShaderiv glGetShaderiv
#define pglGetShaderInfoLog glGetShaderInfoLog
+#define pglGetUniformLocationARB glGetUniformLocation
#define pglLinkProgramARB glLinkProgram
#define pglShaderSourceARB glShaderSource
#define pglUniform1fARB glUniform1i
diff --git a/source/lib/res/graphics/cursor.cpp b/source/lib/res/graphics/cursor.cpp
index 0a429457d0..b4e303f511 100644
--- a/source/lib/res/graphics/cursor.cpp
+++ b/source/lib/res/graphics/cursor.cpp
@@ -118,6 +118,7 @@ public:
#else
(void)ogl_tex_bind(ht);
glEnable(GL_TEXTURE_2D);
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
@@ -129,6 +130,9 @@ public:
glTexCoord2i(0, 1); glVertex2i( x-hotspotx, y+hotspoty-h );
glTexCoord2i(1, 1); glVertex2i( x-hotspotx+w, y+hotspoty-h );
glEnd();
+
+ glDisable(GL_BLEND);
+ glEnable(GL_DEPTH_TEST);
#endif
}
diff --git a/source/lib/res/graphics/ogl_tex.cpp b/source/lib/res/graphics/ogl_tex.cpp
index e080395264..49564ccd1c 100644
--- a/source/lib/res/graphics/ogl_tex.cpp
+++ b/source/lib/res/graphics/ogl_tex.cpp
@@ -747,9 +747,15 @@ static void detect_gl_upload_caps()
}
if(have_s3tc == -1)
{
+#if CONFIG2_GLES
+ // some GLES implementations have GL_EXT_texture_compression_dxt1
+ // but that only supports DXT1 so we can't use it anyway
+ have_s3tc = 0;
+#else
// note: we don't bother checking for GL_S3_s3tc - it is incompatible
// and irrelevant (was never widespread).
have_s3tc = ogl_HaveExtensions(0, "GL_ARB_texture_compression", "GL_EXT_texture_compression_s3tc", NULL) == 0;
+#endif
}
if(have_anistropy == -1)
{
diff --git a/source/ps/VideoMode.cpp b/source/ps/VideoMode.cpp
index b342b68425..5115dbc049 100644
--- a/source/ps/VideoMode.cpp
+++ b/source/ps/VideoMode.cpp
@@ -203,8 +203,8 @@ bool CVideoMode::InitSDL()
#if !SDL_VERSION_ATLEAST(1, 3, 0)
SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, g_VSync ? 1 : 0);
#endif
-
-#if CONFIG2_GLES
+
+#if CONFIG2_GLES && SDL_VERSION_ATLEAST(1, 3, 0)
// Require GLES 2.0
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
diff --git a/source/renderer/Renderer.cpp b/source/renderer/Renderer.cpp
index 9ae326761f..d55fc5632d 100644
--- a/source/renderer/Renderer.cpp
+++ b/source/renderer/Renderer.cpp
@@ -455,6 +455,11 @@ CRenderer::CRenderer()
// TODO: be more consistent in use of the config system
CFG_GET_USER_VAL("preferglsl", Bool, m_Options.m_PreferGLSL);
+#if CONFIG2_GLES
+ // Override config option since GLES only supports GLSL
+ m_Options.m_PreferGLSL = true;
+#endif
+
m_ShadowZBias = 0.02f;
m_ShadowMapSize = 0;
@@ -548,6 +553,11 @@ void CRenderer::ReloadShaders()
{
ENSURE(m->IsOpen);
+#if CONFIG2_GLES
+#warning TODO: move ARB shader programs to effect/technique files, and add GLSL versions
+ return;
+#endif
+
typedef std::map Defines;
Defines defBasic;
@@ -853,6 +863,11 @@ void CRenderer::BeginFrame()
// zero out all the per-frame stats
m_Stats.Reset();
+#if CONFIG2_GLES
+#warning TODO: move ARB shader programs to effect/technique files, and add GLSL versions
+ return;
+#endif
+
// choose model renderers for this frame
if (m_Options.m_RenderPath == RP_SHADER)
@@ -1653,6 +1668,9 @@ void CRenderer::EndFrame()
m->overlayRenderer.EndFrame();
m->particleRenderer.EndFrame();
+#if CONFIG2_GLES
+#warning TODO: move ARB shader programs to effect/technique files, and add GLSL versions
+#else
// Finish model renderers
m->Model.Normal->EndFrame();
m->Model.Player->EndFrame();
@@ -1661,6 +1679,7 @@ void CRenderer::EndFrame()
if (m->Model.Player != m->Model.PlayerInstancing)
m->Model.PlayerInstancing->EndFrame();
m->Model.Transp->EndFrame();
+#endif
ogl_tex_bind(0, 0);