Fixed rendering bug: Delay calling gbm_surface_release_buffer until it

has been scanned out.
This commit is contained in:
Scott Anderson 2017-06-09 17:15:55 +12:00
parent cd6a40d816
commit 63c3faa006
2 changed files with 12 additions and 2 deletions

View file

@ -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); uint32_t fb_id = get_fb_for_bo(renderer->fd, bo);
drmModePageFlip(renderer->fd, output->crtc, fb_id, DRM_MODE_PAGE_FLIP_EVENT, output); 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->pageflip_pending = true;
output->bo_last = output->bo_current;
output->bo_current = bo;
} }
void wlr_drm_output_start_renderer(struct wlr_output_state *output) { 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, drmModePageFlip(renderer->fd, output->crtc, fb_id,
DRM_MODE_PAGE_FLIP_EVENT, output); 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, 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 = struct wlr_backend_state *state =
wl_container_of(output->renderer, state, renderer); 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; output->pageflip_pending = false;
if (output->state == DRM_OUTPUT_CONNECTED) { if (output->state == DRM_OUTPUT_CONNECTED) {
wlr_drm_output_begin(output); wlr_drm_output_begin(output);

View file

@ -47,6 +47,8 @@ struct wlr_output_state {
struct wlr_drm_renderer *renderer; struct wlr_drm_renderer *renderer;
struct gbm_surface *gbm; struct gbm_surface *gbm;
struct gbm_bo *bo_last;
struct gbm_bo *bo_current;
EGLSurface *egl; EGLSurface *egl;
bool pageflip_pending; bool pageflip_pending;