From 625e930222debfba743f6455f2f1d954384e35e1 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Mon, 25 Apr 2016 12:26:46 +0100 Subject: [PATCH] gsk: Port GskGLRenderer to GLES Use the appropriate API and shaders if the GdkGLContext was created for OpenGL ES instead of OpenGL. --- gsk/gskglrenderer.c | 18 +++++++++++++++--- gsk/resources/glsl/gles-base.fs.glsl | 11 +++++++++++ gsk/resources/glsl/gles-base.vs.glsl | 12 ++++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 gsk/resources/glsl/gles-base.fs.glsl create mode 100644 gsk/resources/glsl/gles-base.vs.glsl diff --git a/gsk/gskglrenderer.c b/gsk/gskglrenderer.c index 4a5a03fbeb..53945ee7a4 100644 --- a/gsk/gskglrenderer.c +++ b/gsk/gskglrenderer.c @@ -160,7 +160,11 @@ gsk_gl_renderer_allocate_buffers (GskGLRenderer *self, glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); + + if (gdk_gl_context_get_use_es (self->context)) + glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + else + glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); } if (self->render_buffer != 0) @@ -302,8 +306,16 @@ gsk_gl_renderer_create_program (GskGLRenderer *self) GBytes *source; int status; - vs_path = "/org/gtk/libgsk/glsl/gl3-base.vs.glsl"; - fs_path = "/org/gtk/libgsk/glsl/gl3-base.fs.glsl"; + if (gdk_gl_context_get_use_es (self->context)) + { + vs_path = "/org/gtk/libgsk/glsl/gles-base.vs.glsl"; + fs_path = "/org/gtk/libgsk/glsl/gles-base.fs.glsl"; + } + else + { + vs_path = "/org/gtk/libgsk/glsl/gl3-base.vs.glsl"; + fs_path = "/org/gtk/libgsk/glsl/gl3-base.fs.glsl"; + } GSK_NOTE (OPENGL, g_print ("Compiling vertex shader\n")); source = g_resources_lookup_data (vs_path, 0, NULL); diff --git a/gsk/resources/glsl/gles-base.fs.glsl b/gsk/resources/glsl/gles-base.fs.glsl new file mode 100644 index 0000000000..ff43db9e6d --- /dev/null +++ b/gsk/resources/glsl/gles-base.fs.glsl @@ -0,0 +1,11 @@ +precision mediump float; + +uniform mat4 mvp; +uniform sampler2D map; +uniform float alpha; + +varying vec2 vUv; + +void main() { + gl_FragColor = texture2D(map, vUv) * vec4(alpha); +} diff --git a/gsk/resources/glsl/gles-base.vs.glsl b/gsk/resources/glsl/gles-base.vs.glsl new file mode 100644 index 0000000000..747e05e157 --- /dev/null +++ b/gsk/resources/glsl/gles-base.vs.glsl @@ -0,0 +1,12 @@ +uniform mat4 mvp; + +attribute vec2 position; +attribute vec2 uv; + +varying vec2 vUv; + +void main() { + gl_Position = mvp * vec4(position, 0.0, 1.0); + + vUv = vec2(uv.x, 1.0 - uv.y); +}