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);