diff options
author | Drew DeVault <sir@cmpwn.com> | 2018-08-04 12:16:34 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-04 12:16:34 -0400 |
commit | e8fa25e0276e179015c8bcd70e857734cb32ab08 (patch) | |
tree | 9dc5c73a9b7b7c82998001b3c35d36b61671a58a /backend/drm | |
parent | 23e2c3c75968f5b2905b761e6cfc7eedb3f8ce81 (diff) | |
parent | 1a2b3445dcd2c53fa5a1e315e436f5814c8765e6 (diff) |
Merge pull request #1168 from manio/multi-gpu
Fix support for multiple GPU
Diffstat (limited to 'backend/drm')
-rw-r--r-- | backend/drm/backend.c | 7 | ||||
-rw-r--r-- | backend/drm/drm.c | 6 | ||||
-rw-r--r-- | backend/drm/renderer.c | 39 |
3 files changed, 21 insertions, 31 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); |