aboutsummaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
Diffstat (limited to 'backend')
-rw-r--r--backend/drm/backend.c7
-rw-r--r--backend/drm/drm.c6
-rw-r--r--backend/drm/renderer.c39
-rw-r--r--backend/multi/backend.c2
4 files changed, 22 insertions, 32 deletions
diff --git a/backend/drm/backend.c b/backend/drm/backend.c
index 5833d46e..1df5cdd1 100644
--- a/backend/drm/backend.c
+++ b/backend/drm/backend.c
@@ -51,7 +51,12 @@ static void backend_destroy(struct wlr_backend *backend) {
static struct wlr_renderer *backend_get_renderer(
struct wlr_backend *backend) {
struct wlr_drm_backend *drm = (struct wlr_drm_backend *)backend;
- return drm->renderer.wlr_rend;
+
+ if (drm->parent) {
+ return drm->parent->renderer.wlr_rend;
+ } else {
+ return drm->renderer.wlr_rend;
+ }
}
static struct wlr_backend_impl backend_impl = {
diff --git a/backend/drm/drm.c b/backend/drm/drm.c
index 9d030dff..c050a356 100644
--- a/backend/drm/drm.c
+++ b/backend/drm/drm.c
@@ -628,7 +628,6 @@ static bool drm_connector_set_cursor(struct wlr_output *output,
bool update_texture) {
struct wlr_drm_connector *conn = (struct wlr_drm_connector *)output;
struct wlr_drm_backend *drm = (struct wlr_drm_backend *)output->backend;
- struct wlr_drm_renderer *renderer = &drm->renderer;
struct wlr_drm_crtc *crtc = conn->crtc;
if (!crtc) {
@@ -654,13 +653,16 @@ static bool drm_connector_set_cursor(struct wlr_output *output,
ret = drmGetCap(drm->fd, DRM_CAP_CURSOR_HEIGHT, &h);
h = ret ? 64 : h;
+ struct wlr_drm_renderer *renderer =
+ drm->parent ? &drm->parent->renderer : &drm->renderer;
+
if (!init_drm_surface(&plane->surf, renderer, w, h,
GBM_FORMAT_ARGB8888, 0)) {
wlr_log(WLR_ERROR, "Cannot allocate cursor resources");
return false;
}
- plane->cursor_bo = gbm_bo_create(renderer->gbm, w, h,
+ plane->cursor_bo = gbm_bo_create(drm->renderer.gbm, w, h,
GBM_FORMAT_ARGB8888, GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE);
if (!plane->cursor_bo) {
wlr_log_errno(WLR_ERROR, "Failed to create cursor bo");
diff --git a/backend/drm/renderer.c b/backend/drm/renderer.c
index 38e6315d..fa7d090e 100644
--- a/backend/drm/renderer.c
+++ b/backend/drm/renderer.c
@@ -188,46 +188,29 @@ bool export_drm_bo(struct gbm_bo *bo, struct wlr_dmabuf_attributes *attribs) {
return true;
}
-struct tex {
- struct wlr_egl *egl;
- EGLImageKHR img;
- struct wlr_texture *tex;
-};
-
-static void free_eglimage(struct gbm_bo *bo, void *data) {
- struct tex *tex = data;
-
- wlr_egl_destroy_image(tex->egl, tex->img);
- wlr_texture_destroy(tex->tex);
- free(tex);
+static void free_tex(struct gbm_bo *bo, void *data) {
+ struct wlr_texture *tex = data;
+ wlr_texture_destroy(tex);
}
static struct wlr_texture *get_tex_for_bo(struct wlr_drm_renderer *renderer,
struct gbm_bo *bo) {
- struct tex *tex = gbm_bo_get_user_data(bo);
- if (tex != NULL) {
- return tex->tex;
- }
-
- tex = calloc(1, sizeof(struct tex));
- if (tex == NULL) {
- return NULL;
+ struct wlr_texture *tex = gbm_bo_get_user_data(bo);
+ if (tex) {
+ return tex;
}
struct wlr_dmabuf_attributes attribs;
if (!export_drm_bo(bo, &attribs)) {
- free(tex);
return NULL;
}
- tex->tex = wlr_texture_from_dmabuf(renderer->wlr_rend, &attribs);
- if (tex->tex == NULL) {
- free(tex);
- return NULL;
+ tex = wlr_texture_from_dmabuf(renderer->wlr_rend, &attribs);
+ if (tex) {
+ gbm_bo_set_user_data(bo, tex, free_tex);
}
- gbm_bo_set_user_data(bo, tex, free_eglimage);
- return tex->tex;
+ return tex;
}
struct gbm_bo *copy_drm_surface_mgpu(struct wlr_drm_surface *dest,
@@ -238,7 +221,7 @@ struct gbm_bo *copy_drm_surface_mgpu(struct wlr_drm_surface *dest,
assert(tex);
float mat[9];
- wlr_matrix_projection(mat, 1, 1, WL_OUTPUT_TRANSFORM_FLIPPED_180);
+ wlr_matrix_projection(mat, 1, 1, WL_OUTPUT_TRANSFORM_NORMAL);
struct wlr_renderer *renderer = dest->renderer->wlr_rend;
wlr_renderer_begin(renderer, dest->width, dest->height);
diff --git a/backend/multi/backend.c b/backend/multi/backend.c
index f1d50347..e0038955 100644
--- a/backend/multi/backend.c
+++ b/backend/multi/backend.c
@@ -143,7 +143,7 @@ bool wlr_multi_backend_add(struct wlr_backend *_multi,
struct wlr_renderer *multi_renderer =
multi_backend_get_renderer(&multi->backend);
struct wlr_renderer *backend_renderer = wlr_backend_get_renderer(backend);
- if (multi_renderer != NULL && backend_renderer != NULL) {
+ if (multi_renderer != NULL && backend_renderer != NULL && multi_renderer != backend_renderer) {
wlr_log(WLR_ERROR, "Could not add backend: multiple renderers at the "
"same time aren't supported");
return false;