compositor-drm: Drop output from release_fb

We only need it for the GBM surface the FB was originally created
against; a mismatch here is very bad indeed, so no reason to pass it in
explictly every time rather than store it.

Following patches change drm_fb to be explicitly reference counted; in
order to reduce churn, rename drm_output_release_fb to drm_fb_unref
whilst changing its call signature here, even though it does not yet
actually perform reference counting.

Signed-off-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Armin Krezović <krezovic.armin@gmail.com>
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
dev
Daniel Stone 8 years ago committed by Pekka Paalanen
parent 576f42effe
commit 05a5ac2b8f
  1. 20
      libweston/compositor-drm.c

@ -146,6 +146,7 @@ struct drm_fb {
/* Used by gbm fbs */ /* Used by gbm fbs */
struct gbm_bo *bo; struct gbm_bo *bo;
struct gbm_surface *gbm_surface;
/* Used by dumb fbs */ /* Used by dumb fbs */
void *map; void *map;
@ -546,7 +547,7 @@ drm_fb_set_buffer(struct drm_fb *fb, struct weston_buffer *buffer)
} }
static void static void
drm_output_release_fb(struct drm_output *output, struct drm_fb *fb) drm_fb_unref(struct drm_fb *fb)
{ {
if (!fb) if (!fb)
return; return;
@ -559,7 +560,7 @@ drm_output_release_fb(struct drm_output *output, struct drm_fb *fb)
gbm_bo_destroy(fb->bo); gbm_bo_destroy(fb->bo);
break; break;
case BUFFER_GBM_SURFACE: case BUFFER_GBM_SURFACE:
gbm_surface_release_buffer(output->gbm_surface, fb->bo); gbm_surface_release_buffer(fb->gbm_surface, fb->bo);
break; break;
default: default:
assert(NULL); assert(NULL);
@ -695,6 +696,7 @@ drm_output_render_gl(struct drm_output *output, pixman_region32_t *damage)
gbm_surface_release_buffer(output->gbm_surface, bo); gbm_surface_release_buffer(output->gbm_surface, bo);
return; return;
} }
output->next->gbm_surface = output->gbm_surface;
} }
static void static void
@ -883,7 +885,7 @@ drm_output_repaint(struct weston_output *output_base,
err_pageflip: err_pageflip:
output->cursor_view = NULL; output->cursor_view = NULL;
if (output->next) { if (output->next) {
drm_output_release_fb(output, output->next); drm_fb_unref(output->next);
output->next = NULL; output->next = NULL;
} }
@ -988,7 +990,7 @@ vblank_handler(int fd, unsigned int frame, unsigned int sec, unsigned int usec,
drm_output_update_msc(output, frame); drm_output_update_msc(output, frame);
output->vblank_pending = 0; output->vblank_pending = 0;
drm_output_release_fb(output, s->current); drm_fb_unref(s->current);
s->current = s->next; s->current = s->next;
s->next = NULL; s->next = NULL;
@ -1022,7 +1024,7 @@ page_flip_handler(int fd, unsigned int frame,
* we just want to page flip to the current buffer to get an accurate * we just want to page flip to the current buffer to get an accurate
* timestamp */ * timestamp */
if (output->page_flip_pending) { if (output->page_flip_pending) {
drm_output_release_fb(output, output->current); drm_fb_unref(output->current);
output->current = output->next; output->current = output->next;
output->next = NULL; output->next = NULL;
} }
@ -1559,8 +1561,8 @@ drm_output_switch_mode(struct weston_output *output_base, struct weston_mode *mo
WL_OUTPUT_MODE_CURRENT | WL_OUTPUT_MODE_PREFERRED; WL_OUTPUT_MODE_CURRENT | WL_OUTPUT_MODE_PREFERRED;
/* reset rendering stuff. */ /* reset rendering stuff. */
drm_output_release_fb(output, output->current); drm_fb_unref(output->current);
drm_output_release_fb(output, output->next); drm_fb_unref(output->next);
output->current = output->next = NULL; output->current = output->next = NULL;
if (b->use_pixman) { if (b->use_pixman) {
@ -2784,8 +2786,8 @@ destroy_sprites(struct drm_backend *backend)
sprite->plane_id, sprite->plane_id,
output->crtc_id, 0, 0, output->crtc_id, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0); 0, 0, 0, 0, 0, 0, 0, 0);
drm_output_release_fb(output, sprite->current); drm_fb_unref(sprite->current);
drm_output_release_fb(output, sprite->next); drm_fb_unref(sprite->next);
weston_plane_release(&sprite->plane); weston_plane_release(&sprite->plane);
free(sprite); free(sprite);
} }

Loading…
Cancel
Save