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>
This commit is contained in:
committed by
Pekka Paalanen
parent
576f42effe
commit
05a5ac2b8f
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user