aboutsummaryrefslogtreecommitdiff
path: root/render
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2017-06-23 11:38:45 -0400
committerDrew DeVault <sir@cmpwn.com>2017-06-23 11:38:45 -0400
commitb18209c904f421f3065d610718d7d9e9b8b9211f (patch)
treef1b5bcf3c1c7ee50e4a2a3f03c68c1136ef4ed44 /render
parent168f0955ab5d6b614eb841bcb0ea684dd9105ef8 (diff)
Switch to GLES2
Closes #13
Diffstat (limited to 'render')
-rw-r--r--render/CMakeLists.txt8
-rw-r--r--render/gles2/renderer.c (renamed from render/gles3/renderer.c)110
-rw-r--r--render/gles2/shaders.c (renamed from render/gles3/shaders.c)4
-rw-r--r--render/gles2/surface.c (renamed from render/gles3/surface.c)22
-rw-r--r--render/gles2/util.c (renamed from render/gles3/util.c)10
5 files changed, 70 insertions, 84 deletions
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
index 4270bd14..07647f2f 100644
--- a/render/gles3/renderer.c
+++ b/render/gles2/renderer.c
@@ -1,14 +1,14 @@
#include <stdint.h>
#include <stdlib.h>
#include <assert.h>
-#include <GLES3/gl3.h>
+#include <GLES2/gl2.h>
#include <wayland-util.h>
#include <wayland-server-protocol.h>
#include <wlr/render.h>
#include <wlr/render/interface.h>
#include <wlr/render/matrix.h>
#include <wlr/util/log.h>
-#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
index dd7f790f..850c0618 100644
--- a/render/gles3/shaders.c
+++ b/render/gles2/shaders.c
@@ -1,5 +1,5 @@
-#include "render/gles3.h"
-#include <GLES3/gl3.h>
+#include "render/gles2.h"
+#include <GLES2/gl2.h>
// Colored quads
const GLchar quad_vertex_src[] =
diff --git a/render/gles3/surface.c b/render/gles2/surface.c
index 0ddf3ae0..278b3dc3 100644
--- a/render/gles3/surface.c
+++ b/render/gles2/surface.c
@@ -1,15 +1,15 @@
#include <stdint.h>
#include <stdlib.h>
#include <assert.h>
-#include <GLES3/gl3.h>
+#include <GLES2/gl2.h>
#include <wayland-util.h>
#include <wayland-server-protocol.h>
#include <wlr/render.h>
#include <wlr/render/interface.h>
#include <wlr/render/matrix.h>
-#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
index a3aa87f3..9498a1cd 100644
--- a/render/gles3/util.c
+++ b/render/gles2/util.c
@@ -1,10 +1,10 @@
#include <stdlib.h>
#include <stdbool.h>
-#include <GLES3/gl3.h>
+#include <GLES2/gl2.h>
#include <wlr/util/log.h>
-#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;