aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Anderson <ascent12@hotmail.com>2017-06-09 17:15:55 +1200
committerScott Anderson <ascent12@hotmail.com>2017-06-09 17:15:55 +1200
commit63c3faa006dd477faba635eb5c9962077058ffb3 (patch)
treefba8298e684b282ab640c5213b6f2b9f0514c504
parentcd6a40d81679c37795e9d24354a8bbbf84cd53a6 (diff)
Fixed rendering bug: Delay calling gbm_surface_release_buffer until it
has been scanned out.
-rw-r--r--backend/drm/drm.c12
-rw-r--r--include/backend/drm/drm.h2
2 files changed, 12 insertions, 2 deletions
diff --git a/backend/drm/drm.c b/backend/drm/drm.c
index 90695175..066edd67 100644
--- a/backend/drm/drm.c
+++ b/backend/drm/drm.c
@@ -111,8 +111,10 @@ static void wlr_drm_output_end(struct wlr_output_state *output) {
}
uint32_t fb_id = get_fb_for_bo(renderer->fd, bo);
drmModePageFlip(renderer->fd, output->crtc, fb_id, DRM_MODE_PAGE_FLIP_EVENT, output);
- gbm_surface_release_buffer(output->gbm, bo);
output->pageflip_pending = true;
+
+ output->bo_last = output->bo_current;
+ output->bo_current = bo;
}
void wlr_drm_output_start_renderer(struct wlr_output_state *output) {
@@ -140,7 +142,8 @@ void wlr_drm_output_start_renderer(struct wlr_output_state *output) {
drmModePageFlip(renderer->fd, output->crtc, fb_id,
DRM_MODE_PAGE_FLIP_EVENT, output);
- gbm_surface_release_buffer(output->gbm, bo);
+ output->bo_last = NULL;
+ output->bo_current = bo;
}
static bool display_init_renderer(struct wlr_drm_renderer *renderer,
@@ -517,6 +520,11 @@ static void page_flip_handler(int fd, unsigned seq,
struct wlr_backend_state *state =
wl_container_of(output->renderer, state, renderer);
+ if (output->bo_last) {
+ gbm_surface_release_buffer(output->gbm, output->bo_last);
+ output->bo_last = NULL;
+ }
+
output->pageflip_pending = false;
if (output->state == DRM_OUTPUT_CONNECTED) {
wlr_drm_output_begin(output);
diff --git a/include/backend/drm/drm.h b/include/backend/drm/drm.h
index 2d063adb..443873fd 100644
--- a/include/backend/drm/drm.h
+++ b/include/backend/drm/drm.h
@@ -47,6 +47,8 @@ struct wlr_output_state {
struct wlr_drm_renderer *renderer;
struct gbm_surface *gbm;
+ struct gbm_bo *bo_last;
+ struct gbm_bo *bo_current;
EGLSurface *egl;
bool pageflip_pending;