diff options
Diffstat (limited to 'render/gles2/renderer.c')
-rw-r--r-- | render/gles2/renderer.c | 43 |
1 files changed, 28 insertions, 15 deletions
diff --git a/render/gles2/renderer.c b/render/gles2/renderer.c index 8c5b81ad..f57e9dae 100644 --- a/render/gles2/renderer.c +++ b/render/gles2/renderer.c @@ -105,14 +105,9 @@ static void init_globals() { init_default_shaders(); } -static void wlr_gles2_begin(struct wlr_renderer *_renderer, +static void wlr_gles2_begin(struct wlr_renderer *wlr_renderer, struct wlr_output *output) { - // TODO: let users customize the clear color? - GL_CALL(glClearColor(0.25f, 0.25f, 0.25f, 1)); - GL_CALL(glClear(GL_COLOR_BUFFER_BIT)); - int32_t width = output->width; - int32_t height = output->height; - GL_CALL(glViewport(0, 0, width, height)); + GL_CALL(glViewport(0, 0, output->width, output->height)); // enable transparency GL_CALL(glEnable(GL_BLEND)); @@ -122,14 +117,30 @@ static void wlr_gles2_begin(struct wlr_renderer *_renderer, // for users to sling matricies themselves } -static void wlr_gles2_end(struct wlr_renderer *renderer) { +static void wlr_gles2_end(struct wlr_renderer *wlr_renderer) { // no-op } +static void wlr_gles2_clear(struct wlr_renderer *wlr_renderer, + const float (*color)[4]) { + glClearColor((*color)[0], (*color)[1], (*color)[2], (*color)[3]); + glClear(GL_COLOR_BUFFER_BIT); +} + +static void wlr_gles2_scissor(struct wlr_renderer *wlr_renderer, + struct wlr_box *box) { + if (box != NULL) { + glScissor(box->x, box->y, box->width, box->height); + glEnable(GL_SCISSOR_TEST); + } else { + glDisable(GL_SCISSOR_TEST); + } +} + static struct wlr_texture *wlr_gles2_texture_create( - struct wlr_renderer *_renderer) { + struct wlr_renderer *wlr_renderer) { struct wlr_gles2_renderer *renderer = - (struct wlr_gles2_renderer *)_renderer; + (struct wlr_gles2_renderer *)wlr_renderer; return gles2_texture_create(renderer->egl); } @@ -159,7 +170,7 @@ static void draw_quad() { GL_CALL(glDisableVertexAttribArray(1)); } -static bool wlr_gles2_render_texture(struct wlr_renderer *_renderer, +static bool wlr_gles2_render_texture(struct wlr_renderer *wlr_renderer, struct wlr_texture *texture, const float (*matrix)[16]) { if (!texture || !texture->valid) { wlr_log(L_ERROR, "attempt to render invalid texture"); @@ -174,7 +185,7 @@ static bool wlr_gles2_render_texture(struct wlr_renderer *_renderer, return true; } -static void wlr_gles2_render_quad(struct wlr_renderer *renderer, +static void wlr_gles2_render_quad(struct wlr_renderer *wlr_renderer, const float (*color)[4], const float (*matrix)[16]) { GL_CALL(glUseProgram(shaders.quad)); GL_CALL(glUniformMatrix4fv(0, 1, GL_FALSE, *matrix)); @@ -182,7 +193,7 @@ static void wlr_gles2_render_quad(struct wlr_renderer *renderer, draw_quad(); } -static void wlr_gles2_render_ellipse(struct wlr_renderer *renderer, +static void wlr_gles2_render_ellipse(struct wlr_renderer *wlr_renderer, const float (*color)[4], const float (*matrix)[16]) { GL_CALL(glUseProgram(shaders.ellipse)); GL_CALL(glUniformMatrix4fv(0, 1, GL_TRUE, *matrix)); @@ -202,10 +213,10 @@ static const enum wl_shm_format *wlr_gles2_formats( return formats; } -static bool wlr_gles2_buffer_is_drm(struct wlr_renderer *_renderer, +static bool wlr_gles2_buffer_is_drm(struct wlr_renderer *wlr_renderer, struct wl_resource *buffer) { struct wlr_gles2_renderer *renderer = - (struct wlr_gles2_renderer *)_renderer; + (struct wlr_gles2_renderer *)wlr_renderer; EGLint format; return wlr_egl_query_buffer(renderer->egl, buffer, EGL_TEXTURE_FORMAT, &format); @@ -243,6 +254,8 @@ static bool wlr_gles2_format_supported(struct wlr_renderer *r, static struct wlr_renderer_impl wlr_renderer_impl = { .begin = wlr_gles2_begin, .end = wlr_gles2_end, + .clear = wlr_gles2_clear, + .scissor = wlr_gles2_scissor, .texture_create = wlr_gles2_texture_create, .render_with_matrix = wlr_gles2_render_texture, .render_quad = wlr_gles2_render_quad, |