Fixed rendering bug: Delay calling gbm_surface_release_buffer until it
has been scanned out.
This commit is contained in:
parent
cd6a40d816
commit
63c3faa006
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue