aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backend/drm/drm.c13
-rw-r--r--backend/drm/renderer.c23
-rw-r--r--backend/headless/output.c14
-rw-r--r--backend/wayland/output.c21
-rw-r--r--examples/output-layout.c2
-rw-r--r--examples/rotation.c2
-rw-r--r--examples/tablet.c2
-rw-r--r--examples/touch.c2
-rw-r--r--include/wlr/render/interface.h3
-rw-r--r--include/wlr/render/wlr_renderer.h2
-rw-r--r--render/gles2/renderer.c6
-rw-r--r--render/wlr_renderer.c4
-rw-r--r--rootston/output.c2
-rw-r--r--wlroots.syms2
14 files changed, 47 insertions, 51 deletions
diff --git a/backend/drm/drm.c b/backend/drm/drm.c
index 344756f8..345c0dd8 100644
--- a/backend/drm/drm.c
+++ b/backend/drm/drm.c
@@ -643,14 +643,13 @@ static bool wlr_drm_connector_set_cursor(struct wlr_output *output,
wlr_texture_upload_pixels(plane->wlr_tex, WL_SHM_FORMAT_ARGB8888,
stride, width, height, buf);
- glViewport(0, 0, plane->surf.width, plane->surf.height);
- glClearColor(0.0, 0.0, 0.0, 0.0);
- glClear(GL_COLOR_BUFFER_BIT);
+ struct wlr_renderer *rend = plane->surf.renderer->wlr_rend;
+ wlr_renderer_begin(rend, plane->surf.width, plane->surf.height);
+ wlr_renderer_clear(rend, (float[]){ 0.0, 0.0, 0.0, 0.0 });
+ wlr_render_texture(rend, plane->wlr_tex, plane->matrix, 0, 0, 1.0f);
+ wlr_renderer_end(rend);
- wlr_render_texture(plane->surf.renderer->wlr_rend, plane->wlr_tex,
- plane->matrix, 0, 0, 1.0f);
-
- glFinish();
+ // TODO: remove these raw GL calls
glPixelStorei(GL_UNPACK_ROW_LENGTH_EXT, bo_stride);
glReadPixels(0, 0, plane->surf.width, plane->surf.height, GL_BGRA_EXT,
GL_UNSIGNED_BYTE, bo_data);
diff --git a/backend/drm/renderer.c b/backend/drm/renderer.c
index 7e330990..3b9aaded 100644
--- a/backend/drm/renderer.c
+++ b/backend/drm/renderer.c
@@ -2,7 +2,6 @@
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <gbm.h>
-#include <GLES2/gl2.h>
#include <stdbool.h>
#include <stdlib.h>
#include <unistd.h>
@@ -107,9 +106,6 @@ void wlr_drm_surface_finish(struct wlr_drm_surface *surf) {
return;
}
- eglMakeCurrent(surf->renderer->egl.display, EGL_NO_SURFACE, EGL_NO_SURFACE,
- EGL_NO_CONTEXT);
-
if (surf->front) {
gbm_surface_release_buffer(surf->gbm, surf->front);
}
@@ -151,9 +147,10 @@ struct gbm_bo *wlr_drm_surface_get_front(struct wlr_drm_surface *surf) {
}
wlr_drm_surface_make_current(surf, NULL);
- glViewport(0, 0, surf->width, surf->height);
- glClearColor(0.0, 0.0, 0.0, 1.0);
- glClear(GL_COLOR_BUFFER_BIT);
+ struct wlr_renderer *renderer = surf->renderer->wlr_rend;
+ wlr_renderer_begin(renderer, surf->width, surf->height);
+ wlr_renderer_clear(renderer, (float[]){ 0.0, 0.0, 0.0, 1.0 });
+ wlr_renderer_end(renderer);
return wlr_drm_surface_swap_buffers(surf, NULL);
}
@@ -185,6 +182,8 @@ static struct wlr_texture *get_tex_for_bo(struct wlr_drm_renderer *renderer,
return tex->tex;
}
+ // TODO: use wlr_texture_upload_dmabuf instead
+
tex = malloc(sizeof(*tex));
if (!tex) {
wlr_log_errno(L_ERROR, "Allocation failed");
@@ -230,14 +229,14 @@ struct gbm_bo *wlr_drm_surface_mgpu_copy(struct wlr_drm_surface *dest,
struct wlr_texture *tex = get_tex_for_bo(dest->renderer, src);
assert(tex);
- static const float color[] = {0.0, 0.0, 0.0, 1.0};
-
float mat[9];
wlr_matrix_projection(mat, 1, 1, WL_OUTPUT_TRANSFORM_FLIPPED_180);
- glViewport(0, 0, dest->width, dest->height);
- wlr_renderer_clear(dest->renderer->wlr_rend, color);
- wlr_render_texture_with_matrix(dest->renderer->wlr_rend, tex, mat, 1.0f);
+ struct wlr_renderer *renderer = dest->renderer->wlr_rend;
+ wlr_renderer_begin(renderer, dest->width, dest->height);
+ wlr_renderer_clear(renderer, (float[]){ 0.0, 0.0, 0.0, 1.0 });
+ wlr_render_texture_with_matrix(renderer, tex, mat, 1.0f);
+ wlr_renderer_end(renderer);
return wlr_drm_surface_swap_buffers(dest, NULL);
}
diff --git a/backend/headless/output.c b/backend/headless/output.c
index 6ce8fc35..4746d2f2 100644
--- a/backend/headless/output.c
+++ b/backend/headless/output.c
@@ -1,8 +1,8 @@
#include <EGL/egl.h>
#include <EGL/eglext.h>
-#include <GLES2/gl2.h>
#include <stdlib.h>
#include <wlr/interfaces/wlr_output.h>
+#include <wlr/render/wlr_renderer.h>
#include <wlr/util/log.h>
#include "backend/headless.h"
#include "util/signal.h"
@@ -120,16 +120,14 @@ struct wlr_output *wlr_headless_add_output(struct wlr_backend *wlr_backend,
snprintf(wlr_output->name, sizeof(wlr_output->name), "HEADLESS-%d",
wl_list_length(&backend->outputs) + 1);
- if (!eglMakeCurrent(output->backend->egl.display,
- output->egl_surface, output->egl_surface,
- output->backend->egl.context)) {
- wlr_log(L_ERROR, "eglMakeCurrent failed: %s", egl_error());
+ if (!wlr_egl_make_current(&output->backend->egl, output->egl_surface,
+ NULL)) {
goto error;
}
- glViewport(0, 0, wlr_output->width, wlr_output->height);
- glClearColor(1.0, 1.0, 1.0, 1.0);
- glClear(GL_COLOR_BUFFER_BIT);
+ wlr_renderer_begin(backend->renderer, wlr_output->width, wlr_output->height);
+ wlr_renderer_clear(backend->renderer, (float[]){ 1.0, 1.0, 1.0, 1.0 });
+ wlr_renderer_end(backend->renderer);
struct wl_event_loop *ev = wl_display_get_event_loop(backend->display);
output->frame_timer = wl_event_loop_add_timer(ev, signal_frame, output);
diff --git a/backend/wayland/output.c b/backend/wayland/output.c
index fc40dea0..d528c888 100644
--- a/backend/wayland/output.c
+++ b/backend/wayland/output.c
@@ -1,5 +1,4 @@
#include <assert.h>
-#include <GLES2/gl2.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
@@ -9,6 +8,7 @@
#include <unistd.h>
#include <wayland-client.h>
#include <wlr/interfaces/wlr_output.h>
+#include <wlr/render/wlr_renderer.h>
#include <wlr/util/log.h>
#include "backend/wayland.h"
#include "util/signal.h"
@@ -313,27 +313,26 @@ struct wlr_output *wlr_wl_output_create(struct wlr_backend *_backend) {
output->egl_window = wl_egl_window_create(output->surface,
wlr_output->width, wlr_output->height);
- output->egl_surface = wlr_egl_create_surface(&backend->egl, output->egl_window);
+ output->egl_surface = wlr_egl_create_surface(&backend->egl,
+ output->egl_window);
wl_display_roundtrip(output->backend->remote_display);
// start rendering loop per callbacks by rendering first frame
- if (!eglMakeCurrent(output->backend->egl.display,
- output->egl_surface, output->egl_surface,
- output->backend->egl.context)) {
- wlr_log(L_ERROR, "eglMakeCurrent failed: %s", egl_error());
+ if (!wlr_egl_make_current(&output->backend->egl, output->egl_surface,
+ NULL)) {
goto error;
}
- glViewport(0, 0, wlr_output->width, wlr_output->height);
- glClearColor(1.0, 1.0, 1.0, 1.0);
- glClear(GL_COLOR_BUFFER_BIT);
+ wlr_renderer_begin(backend->renderer, wlr_output->width, wlr_output->height);
+ wlr_renderer_clear(backend->renderer, (float[]){ 1.0, 1.0, 1.0, 1.0 });
+ wlr_renderer_end(backend->renderer);
output->frame_callback = wl_surface_frame(output->surface);
wl_callback_add_listener(output->frame_callback, &frame_listener, output);
- if (!eglSwapBuffers(output->backend->egl.display, output->egl_surface)) {
- wlr_log(L_ERROR, "eglSwapBuffers failed: %s", egl_error());
+ if (!wlr_egl_swap_buffers(&output->backend->egl, output->egl_surface,
+ NULL)) {
goto error;
}
diff --git a/examples/output-layout.c b/examples/output-layout.c
index de134a71..45d896b0 100644
--- a/examples/output-layout.c
+++ b/examples/output-layout.c
@@ -101,7 +101,7 @@ static void handle_output_frame(struct output_state *output,
struct wlr_output *wlr_output = output->output;
wlr_output_make_current(wlr_output, NULL);
- wlr_renderer_begin(sample->renderer, wlr_output);
+ wlr_renderer_begin(sample->renderer, wlr_output->width, wlr_output->height);
wlr_renderer_clear(sample->renderer, (float[]){0.25f, 0.25f, 0.25f, 1});
animate_cat(sample, output->output);
diff --git a/examples/rotation.c b/examples/rotation.c
index 7f50b620..cbff09a1 100644
--- a/examples/rotation.c
+++ b/examples/rotation.c
@@ -43,7 +43,7 @@ static void handle_output_frame(struct output_state *output, struct timespec *ts
wlr_output_effective_resolution(wlr_output, &width, &height);
wlr_output_make_current(wlr_output, NULL);
- wlr_renderer_begin(sample->renderer, wlr_output);
+ wlr_renderer_begin(sample->renderer, wlr_output->width, wlr_output->height);
wlr_renderer_clear(sample->renderer, (float[]){0.25f, 0.25f, 0.25f, 1});
for (int y = -128 + (int)odata->y_offs; y < height; y += 128) {
diff --git a/examples/tablet.c b/examples/tablet.c
index 1b995003..65c559cb 100644
--- a/examples/tablet.c
+++ b/examples/tablet.c
@@ -46,7 +46,7 @@ static void handle_output_frame(struct output_state *output, struct timespec *ts
wlr_output_effective_resolution(wlr_output, &width, &height);
wlr_output_make_current(wlr_output, NULL);
- wlr_renderer_begin(sample->renderer, wlr_output);
+ wlr_renderer_begin(sample->renderer, wlr_output->width, wlr_output->height);
wlr_renderer_clear(sample->renderer, (float[]){0.25f, 0.25f, 0.25f, 1});
float matrix[9];
diff --git a/examples/touch.c b/examples/touch.c
index 0968e82a..f9c496cf 100644
--- a/examples/touch.c
+++ b/examples/touch.c
@@ -42,7 +42,7 @@ static void handle_output_frame(struct output_state *output, struct timespec *ts
wlr_output_effective_resolution(wlr_output, &width, &height);
wlr_output_make_current(wlr_output, NULL);
- wlr_renderer_begin(sample->renderer, wlr_output);
+ wlr_renderer_begin(sample->renderer, wlr_output->width, wlr_output->height);
wlr_renderer_clear(sample->renderer, (float[]){0.25f, 0.25f, 0.25f, 1});
struct touch_point *p;
diff --git a/include/wlr/render/interface.h b/include/wlr/render/interface.h
index da0aaec9..7f25c0ff 100644
--- a/include/wlr/render/interface.h
+++ b/include/wlr/render/interface.h
@@ -18,7 +18,8 @@ struct wlr_renderer {
};
struct wlr_renderer_impl {
- void (*begin)(struct wlr_renderer *renderer, struct wlr_output *output);
+ void (*begin)(struct wlr_renderer *renderer, uint32_t width,
+ uint32_t height);
void (*end)(struct wlr_renderer *renderer);
void (*clear)(struct wlr_renderer *renderer, const float color[static 4]);
void (*scissor)(struct wlr_renderer *renderer, struct wlr_box *box);
diff --git a/include/wlr/render/wlr_renderer.h b/include/wlr/render/wlr_renderer.h
index d5f3cf70..6f0d2ecc 100644
--- a/include/wlr/render/wlr_renderer.h
+++ b/include/wlr/render/wlr_renderer.h
@@ -12,7 +12,7 @@ struct wlr_output;
struct wlr_renderer;
-void wlr_renderer_begin(struct wlr_renderer *r, struct wlr_output *output);
+void wlr_renderer_begin(struct wlr_renderer *r, int width, int height);
void wlr_renderer_end(struct wlr_renderer *r);
void wlr_renderer_clear(struct wlr_renderer *r, const float color[static 4]);
/**
diff --git a/render/gles2/renderer.c b/render/gles2/renderer.c
index 14eea666..6b046bc4 100644
--- a/render/gles2/renderer.c
+++ b/render/gles2/renderer.c
@@ -26,13 +26,13 @@ static struct wlr_gles2_renderer *gles2_get_renderer(
return renderer;
}
-static void gles2_begin(struct wlr_renderer *wlr_renderer,
- struct wlr_output *output) {
+static void gles2_begin(struct wlr_renderer *wlr_renderer, uint32_t width,
+ uint32_t height) {
gles2_get_renderer(wlr_renderer);
GLES2_DEBUG_PUSH;
- glViewport(0, 0, output->width, output->height);
+ glViewport(0, 0, width, height);
// enable transparency
glEnable(GL_BLEND);
diff --git a/render/wlr_renderer.c b/render/wlr_renderer.c
index 79e0b5d5..622aa1dd 100644
--- a/render/wlr_renderer.c
+++ b/render/wlr_renderer.c
@@ -17,8 +17,8 @@ void wlr_renderer_destroy(struct wlr_renderer *r) {
}
}
-void wlr_renderer_begin(struct wlr_renderer *r, struct wlr_output *o) {
- r->impl->begin(r, o);
+void wlr_renderer_begin(struct wlr_renderer *r, int width, int height) {
+ r->impl->begin(r, width, height);
}
void wlr_renderer_end(struct wlr_renderer *r) {
diff --git a/rootston/output.c b/rootston/output.c
index 4146e3e2..1de27bad 100644
--- a/rootston/output.c
+++ b/rootston/output.c
@@ -479,7 +479,7 @@ static void render_output(struct roots_output *output) {
goto damage_finish;
}
- wlr_renderer_begin(renderer, wlr_output);
+ wlr_renderer_begin(renderer, wlr_output->width, wlr_output->height);
if (!pixman_region32_not_empty(&damage)) {
// Output isn't damaged but needs buffer swap
diff --git a/wlroots.syms b/wlroots.syms
index 3f45e045..cb030a6d 100644
--- a/wlroots.syms
+++ b/wlroots.syms
@@ -15,8 +15,8 @@ WLROOTS_0_0_0 {
wlr_drm_get_connector_props;
wlr_drm_get_crtc_props;
wlr_drm_get_plane_props;
- wlr_drm_get_prop;
wlr_drm_get_prop_blob;
+ wlr_drm_get_prop;
wlr_drm_plane_surfaces_init;
wlr_drm_renderer_finish;
wlr_drm_renderer_init;