From b18209c904f421f3065d610718d7d9e9b8b9211f Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Fri, 23 Jun 2017 11:38:45 -0400 Subject: [PATCH] Switch to GLES2 Closes #13 --- backend/egl.c | 2 +- example/pointer.c | 6 +- example/rotation.c | 6 +- example/simple.c | 2 +- example/tablet.c | 6 +- example/touch.c | 6 +- include/render/{gles3.h => gles2.h} | 12 +-- include/wlr/render/gles2.h | 7 ++ include/wlr/render/gles3.h | 7 -- render/CMakeLists.txt | 8 +- render/{gles3 => gles2}/renderer.c | 110 ++++++++++++---------------- render/{gles3 => gles2}/shaders.c | 4 +- render/{gles3 => gles2}/surface.c | 22 +++--- render/{gles3 => gles2}/util.c | 10 +-- 14 files changed, 97 insertions(+), 111 deletions(-) rename include/render/{gles3.h => gles2.h} (65%) create mode 100644 include/wlr/render/gles2.h delete mode 100644 include/wlr/render/gles3.h rename render/{gles3 => gles2}/renderer.c (61%) rename render/{gles3 => gles2}/shaders.c (96%) rename render/{gles3 => gles2}/surface.c (77%) rename render/{gles3 => gles2}/util.c (82%) diff --git a/backend/egl.c b/backend/egl.c index 66aa6a4e..8bb05f6f 100644 --- a/backend/egl.c +++ b/backend/egl.c @@ -136,7 +136,7 @@ bool wlr_egl_init(struct wlr_egl *egl, EGLenum platform, void *display) { goto error; } - static const EGLint attribs[] = {EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE}; + static const EGLint attribs[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE}; egl->context = eglCreateContext(egl->display, egl->config, EGL_NO_CONTEXT, attribs); diff --git a/example/pointer.c b/example/pointer.c index 035af240..8dba5454 100644 --- a/example/pointer.c +++ b/example/pointer.c @@ -9,9 +9,9 @@ #include #include #include -#include +#include #include -#include +#include #include #include #include @@ -121,7 +121,7 @@ int main(int argc, char *argv[]) { compositor.pointer_axis_cb = handle_pointer_axis; compositor_init(&compositor); - state.renderer = wlr_gles3_renderer_init(); + state.renderer = wlr_gles2_renderer_init(); state.cat_texture = wlr_render_surface_init(state.renderer); wlr_surface_attach_pixels(state.cat_texture, GL_RGBA, cat_tex.width, cat_tex.height, cat_tex.pixel_data); diff --git a/example/rotation.c b/example/rotation.c index 7eed1c2e..b8c43d4c 100644 --- a/example/rotation.c +++ b/example/rotation.c @@ -9,9 +9,9 @@ #include #include #include -#include +#include #include -#include +#include #include #include #include @@ -202,7 +202,7 @@ int main(int argc, char *argv[]) { compositor.keyboard_key_cb = handle_keyboard_key; compositor_init(&compositor); - state.renderer = wlr_gles3_renderer_init(); + state.renderer = wlr_gles2_renderer_init(); state.cat_texture = wlr_render_surface_init(state.renderer); wlr_surface_attach_pixels(state.cat_texture, GL_RGBA, cat_tex.width, cat_tex.height, cat_tex.pixel_data); diff --git a/example/simple.c b/example/simple.c index 8a01fab8..4bbdf399 100644 --- a/example/simple.c +++ b/example/simple.c @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/example/tablet.c b/example/tablet.c index 69c530a6..0343bd0a 100644 --- a/example/tablet.c +++ b/example/tablet.c @@ -8,9 +8,9 @@ #include #include #include -#include +#include #include -#include +#include #include #include #include @@ -150,7 +150,7 @@ int main(int argc, char *argv[]) { }; compositor_init(&compositor); - state.renderer = wlr_gles3_renderer_init(); + state.renderer = wlr_gles2_renderer_init(); compositor_run(&compositor); diff --git a/example/touch.c b/example/touch.c index 4b4782f1..29380ed4 100644 --- a/example/touch.c +++ b/example/touch.c @@ -10,9 +10,9 @@ #include #include #include -#include +#include #include -#include +#include #include #include #include @@ -101,7 +101,7 @@ int main(int argc, char *argv[]) { }; compositor_init(&compositor); - state.renderer = wlr_gles3_renderer_init(); + state.renderer = wlr_gles2_renderer_init(); state.cat_texture = wlr_render_surface_init(state.renderer); wlr_surface_attach_pixels(state.cat_texture, GL_RGBA, cat_tex.width, cat_tex.height, cat_tex.pixel_data); diff --git a/include/render/gles3.h b/include/render/gles2.h similarity index 65% rename from include/render/gles3.h rename to include/render/gles2.h index 9acc1088..bd0106b3 100644 --- a/include/render/gles3.h +++ b/include/render/gles2.h @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include struct wlr_surface_state { @@ -11,7 +11,7 @@ struct wlr_surface_state { GLuint tex_id; }; -struct wlr_surface *gles3_surface_init(); +struct wlr_surface *gles2_surface_init(); extern const GLchar quad_vertex_src[]; extern const GLchar quad_fragment_src[]; @@ -20,10 +20,10 @@ extern const GLchar vertex_src[]; extern const GLchar fragment_src_RGB[]; extern const GLchar fragment_src_RGBA[]; -bool _gles3_flush_errors(const char *file, int line); -#define gles3_flush_errors(...) \ - _gles3_flush_errors(__FILE__ + strlen(WLR_SRC_DIR) + 1, __LINE__) +bool _gles2_flush_errors(const char *file, int line); +#define gles2_flush_errors(...) \ + _gles2_flush_errors(__FILE__ + strlen(WLR_SRC_DIR) + 1, __LINE__) -#define GL_CALL(func) func; gles3_flush_errors() +#define GL_CALL(func) func; gles2_flush_errors() #endif diff --git a/include/wlr/render/gles2.h b/include/wlr/render/gles2.h new file mode 100644 index 00000000..a779ffff --- /dev/null +++ b/include/wlr/render/gles2.h @@ -0,0 +1,7 @@ +#ifndef _WLR_GLES2_RENDERER_H +#define _WLR_GLES2_RENDERER_H +#include + +struct wlr_renderer *wlr_gles2_renderer_init(); + +#endif diff --git a/include/wlr/render/gles3.h b/include/wlr/render/gles3.h deleted file mode 100644 index 7b60bb97..00000000 --- a/include/wlr/render/gles3.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _WLR_GLES3_RENDERER_H -#define _WLR_GLES3_RENDERER_H -#include - -struct wlr_renderer *wlr_gles3_renderer_init(); - -#endif diff --git a/render/CMakeLists.txt b/render/CMakeLists.txt index 7b863d64..70ebced2 100644 --- a/render/CMakeLists.txt +++ b/render/CMakeLists.txt @@ -2,8 +2,8 @@ add_library(wlr-render STATIC matrix.c wlr_renderer.c wlr_surface.c - gles3/shaders.c - gles3/renderer.c - gles3/surface.c - gles3/util.c + gles2/shaders.c + gles2/renderer.c + gles2/surface.c + gles2/util.c ) diff --git a/render/gles3/renderer.c b/render/gles2/renderer.c similarity index 61% rename from render/gles3/renderer.c rename to render/gles2/renderer.c index 4270bd14..07647f2f 100644 --- a/render/gles3/renderer.c +++ b/render/gles2/renderer.c @@ -1,14 +1,14 @@ #include #include #include -#include +#include #include #include #include #include #include #include -#include "render/gles3.h" +#include "render/gles2.h" static struct { bool initialized; @@ -16,7 +16,6 @@ static struct { GLuint quad; GLuint ellipse; } shaders; -static GLuint vao, vbo, ebo; static bool compile_shader(GLuint type, const GLchar *src, GLuint *shader) { *shader = GL_CALL(glCreateShader(type)); @@ -77,41 +76,11 @@ error: wlr_log(L_ERROR, "Failed to set up default shaders!"); } -static void init_default_quad() { - GLfloat verticies[] = { - 1, 1, 1, 1, // bottom right - 1, 0, 1, 0, // top right - 0, 0, 0, 0, // top left - 0, 1, 0, 1, // bottom left - }; - GLuint indicies[] = { - 0, 1, 3, - 1, 2, 3, - }; - - GL_CALL(glGenVertexArrays(1, &vao)); - GL_CALL(glGenBuffers(1, &vbo)); - - GL_CALL(glBindVertexArray(vao)); - GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, vbo)); - - GL_CALL(glEnableVertexAttribArray(0)); - GL_CALL(glEnableVertexAttribArray(1)); - GL_CALL(glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (void *)0)); - GL_CALL(glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (void *)(2 * sizeof(GLfloat)))); - GL_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(verticies), verticies, GL_STATIC_DRAW)); - - GL_CALL(glGenBuffers(1, &ebo)); - GL_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo)); - GL_CALL(glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indicies), indicies, GL_STATIC_DRAW)); -} - static void init_globals() { init_default_shaders(); - init_default_quad(); } -static void wlr_gles3_begin(struct wlr_renderer_state *state, +static void wlr_gles2_begin(struct wlr_renderer_state *state, struct wlr_output *output) { // TODO: let users customize the clear color? GL_CALL(glClearColor(0.25f, 0.25f, 0.25f, 1)); @@ -123,15 +92,41 @@ static void wlr_gles3_begin(struct wlr_renderer_state *state, // for users to sling matricies themselves } -static void wlr_gles3_end(struct wlr_renderer_state *state) { +static void wlr_gles2_end(struct wlr_renderer_state *state) { // no-op } -static struct wlr_surface *wlr_gles3_surface_init(struct wlr_renderer_state *state) { - return gles3_surface_init(); +static struct wlr_surface *wlr_gles2_surface_init(struct wlr_renderer_state *state) { + return gles2_surface_init(); +} + +static void draw_quad() { + GLfloat verts[] = { + 1, 0, // top right + 0, 0, // top left + 1, 1, // bottom right + 0, 1, // bottom left + }; + GLfloat texcoord[] = { + 1, 0, // top right + 0, 0, // top left + 1, 1, // bottom right + 0, 1, // bottom left + }; + + GL_CALL(glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, verts)); + GL_CALL(glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, texcoord)); + + GL_CALL(glEnableVertexAttribArray(0)); + GL_CALL(glEnableVertexAttribArray(1)); + + GL_CALL(glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)); + + GL_CALL(glDisableVertexAttribArray(0)); + GL_CALL(glDisableVertexAttribArray(1)); } -static bool wlr_gles3_render_surface(struct wlr_renderer_state *state, +static bool wlr_gles2_render_surface(struct wlr_renderer_state *state, struct wlr_surface *surface, const float (*matrix)[16]) { assert(surface && surface->valid); switch (surface->format) { @@ -145,53 +140,44 @@ static bool wlr_gles3_render_surface(struct wlr_renderer_state *state, wlr_log(L_ERROR, "No shader for this surface format"); return false; } - gles3_flush_errors(); - GL_CALL(glBindVertexArray(vao)); - GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, vbo)); - GL_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo)); + gles2_flush_errors(); wlr_surface_bind(surface); GL_CALL(glUniformMatrix4fv(0, 1, GL_TRUE, *matrix)); - GL_CALL(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0)); + draw_quad(); return true; } -static void wlr_gles3_render_quad(struct wlr_renderer_state *state, +static void wlr_gles2_render_quad(struct wlr_renderer_state *state, const float (*color)[4], const float (*matrix)[16]) { GL_CALL(glUseProgram(shaders.quad)); - GL_CALL(glBindVertexArray(vao)); - GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, vbo)); - GL_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo)); GL_CALL(glUniformMatrix4fv(0, 1, GL_TRUE, *matrix)); GL_CALL(glUniform4f(1, (*color)[0], (*color)[1], (*color)[2], (*color)[3])); - GL_CALL(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0)); + draw_quad(); } -static void wlr_gles3_render_ellipse(struct wlr_renderer_state *state, +static void wlr_gles2_render_ellipse(struct wlr_renderer_state *state, const float (*color)[4], const float (*matrix)[16]) { GL_CALL(glUseProgram(shaders.ellipse)); - GL_CALL(glBindVertexArray(vao)); - GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, vbo)); - GL_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo)); GL_CALL(glUniformMatrix4fv(0, 1, GL_TRUE, *matrix)); GL_CALL(glUniform4f(1, (*color)[0], (*color)[1], (*color)[2], (*color)[3])); - GL_CALL(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0)); + draw_quad(); } -static void wlr_gles3_destroy(struct wlr_renderer_state *state) { +static void wlr_gles2_destroy(struct wlr_renderer_state *state) { // no-op } static struct wlr_renderer_impl wlr_renderer_impl = { - .begin = wlr_gles3_begin, - .end = wlr_gles3_end, - .surface_init = wlr_gles3_surface_init, - .render_with_matrix = wlr_gles3_render_surface, - .render_quad = wlr_gles3_render_quad, - .render_ellipse = wlr_gles3_render_ellipse, - .destroy = wlr_gles3_destroy + .begin = wlr_gles2_begin, + .end = wlr_gles2_end, + .surface_init = wlr_gles2_surface_init, + .render_with_matrix = wlr_gles2_render_surface, + .render_quad = wlr_gles2_render_quad, + .render_ellipse = wlr_gles2_render_ellipse, + .destroy = wlr_gles2_destroy }; -struct wlr_renderer *wlr_gles3_renderer_init() { +struct wlr_renderer *wlr_gles2_renderer_init() { init_globals(); return wlr_renderer_init(NULL, &wlr_renderer_impl); } diff --git a/render/gles3/shaders.c b/render/gles2/shaders.c similarity index 96% rename from render/gles3/shaders.c rename to render/gles2/shaders.c index dd7f790f..850c0618 100644 --- a/render/gles3/shaders.c +++ b/render/gles2/shaders.c @@ -1,5 +1,5 @@ -#include "render/gles3.h" -#include +#include "render/gles2.h" +#include // Colored quads const GLchar quad_vertex_src[] = diff --git a/render/gles3/surface.c b/render/gles2/surface.c similarity index 77% rename from render/gles3/surface.c rename to render/gles2/surface.c index 0ddf3ae0..278b3dc3 100644 --- a/render/gles3/surface.c +++ b/render/gles2/surface.c @@ -1,15 +1,15 @@ #include #include #include -#include +#include #include #include #include #include #include -#include "render/gles3.h" +#include "render/gles2.h" -static bool gles3_surface_attach_pixels(struct wlr_surface_state *surface, +static bool gles2_surface_attach_pixels(struct wlr_surface_state *surface, uint32_t format, int width, int height, const unsigned char *pixels) { assert(surface); surface->wlr_surface->width = width; @@ -23,7 +23,7 @@ static bool gles3_surface_attach_pixels(struct wlr_surface_state *surface, return true; } -static void gles3_surface_get_matrix(struct wlr_surface_state *surface, +static void gles2_surface_get_matrix(struct wlr_surface_state *surface, float (*matrix)[16], const float (*projection)[16], int x, int y) { struct wlr_surface *_surface = surface->wlr_surface; float world[16]; @@ -35,27 +35,27 @@ static void gles3_surface_get_matrix(struct wlr_surface_state *surface, wlr_matrix_mul(projection, matrix, matrix); } -static void gles3_surface_bind(struct wlr_surface_state *surface) { +static void gles2_surface_bind(struct wlr_surface_state *surface) { GL_CALL(glActiveTexture(GL_TEXTURE0 + 1)); GL_CALL(glBindTexture(GL_TEXTURE_2D, surface->tex_id)); GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); } -static void gles3_surface_destroy(struct wlr_surface_state *surface) { +static void gles2_surface_destroy(struct wlr_surface_state *surface) { GL_CALL(glDeleteTextures(1, &surface->tex_id)); free(surface); } static struct wlr_surface_impl wlr_surface_impl = { - .attach_pixels = gles3_surface_attach_pixels, + .attach_pixels = gles2_surface_attach_pixels, // .attach_shm = TODO - .get_matrix = gles3_surface_get_matrix, - .bind = gles3_surface_bind, - .destroy = gles3_surface_destroy, + .get_matrix = gles2_surface_get_matrix, + .bind = gles2_surface_bind, + .destroy = gles2_surface_destroy, }; -struct wlr_surface *gles3_surface_init() { +struct wlr_surface *gles2_surface_init() { struct wlr_surface_state *state = calloc(sizeof(struct wlr_surface_state), 1); struct wlr_surface *surface = wlr_surface_init(state, &wlr_surface_impl); state->wlr_surface = surface; diff --git a/render/gles3/util.c b/render/gles2/util.c similarity index 82% rename from render/gles3/util.c rename to render/gles2/util.c index a3aa87f3..9498a1cd 100644 --- a/render/gles3/util.c +++ b/render/gles2/util.c @@ -1,10 +1,10 @@ #include #include -#include +#include #include -#include "render/gles3.h" +#include "render/gles2.h" -const char *gles3_strerror(GLenum err) { +const char *gles2_strerror(GLenum err) { switch (err) { case GL_INVALID_ENUM: return "Invalid enum"; @@ -21,7 +21,7 @@ const char *gles3_strerror(GLenum err) { } } -bool _gles3_flush_errors(const char *file, int line) { +bool _gles2_flush_errors(const char *file, int line) { GLenum err; bool failure = false; while ((err = glGetError()) != GL_NO_ERROR) { @@ -31,7 +31,7 @@ bool _gles3_flush_errors(const char *file, int line) { _wlr_log(L_ERROR, "[%s:%d] Fatal GL error: out of memory", file, line); exit(1); } else { - _wlr_log(L_ERROR, "[%s:%d] GL error %d %s", file, line, err, gles3_strerror(err)); + _wlr_log(L_ERROR, "[%s:%d] GL error %d %s", file, line, err, gles2_strerror(err)); } } return failure;