diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-04-17 20:08:14 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-04-17 20:08:14 +0100 |
commit | 11599e52b842b5db76798879b0fbb57762fe6002 (patch) | |
tree | f4781a0dc97c4e1fafd5075274c64e3b7137025b | |
parent | b817200371bfe16f44b879a793cf4a75ad17bc5c (diff) |
sna/dri: Decouple the frame event info after attaching along error paths
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | src/sna/sna_dri.c | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c index afec8316..f4d55e0b 100644 --- a/src/sna/sna_dri.c +++ b/src/sna/sna_dri.c @@ -1372,15 +1372,15 @@ sna_dri_schedule_flip(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front, return FALSE; } + sna_dri_reference_buffer(front); + sna_dri_reference_buffer(back); + if (!sna_dri_page_flip(sna, info)) { DBG(("%s: failed to queue page flip\n", __FUNCTION__)); - free(info); + sna_dri_frame_event_info_free(info); return FALSE; } - sna_dri_reference_buffer(front); - sna_dri_reference_buffer(back); - get_private(info->back)->bo = kgem_create_2d(&sna->kgem, draw->width, @@ -1426,7 +1426,7 @@ sna_dri_schedule_flip(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front, vbl.request.type |= DRM_VBLANK_SECONDARY; vbl.request.sequence = 0; if (drmWaitVBlank(sna->kgem.fd, &vbl)) { - free(info); + sna_dri_frame_event_info_free(info); return FALSE; } @@ -1482,7 +1482,7 @@ sna_dri_schedule_flip(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front, vbl.request.sequence -= 1; vbl.request.signal = (unsigned long)info; if (drmWaitVBlank(sna->kgem.fd, &vbl)) { - free(info); + sna_dri_frame_event_info_free(info); return FALSE; } @@ -1610,9 +1610,8 @@ sna_dri_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front, if (pipe > 0) vbl.request.type |= DRM_VBLANK_SECONDARY; vbl.request.sequence = 0; - if (drmWaitVBlank(sna->kgem.fd, &vbl)) { + if (drmWaitVBlank(sna->kgem.fd, &vbl)) goto blit_fallback; - } current_msc = vbl.reply.sequence; @@ -1677,9 +1676,8 @@ sna_dri_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front, vbl.request.sequence += divisor; vbl.request.signal = (unsigned long)info; - if (drmWaitVBlank(sna->kgem.fd, &vbl)) { + if (drmWaitVBlank(sna->kgem.fd, &vbl)) goto blit_fallback; - } *target_msc = vbl.reply.sequence; info->frame = *target_msc; @@ -1762,12 +1760,11 @@ blit: if (!sna_dri_add_frame_event(info)) { DBG(("%s: failed to hook up frame event\n", __FUNCTION__)); free(info); - info = NULL; goto blit; } if (!sna_dri_page_flip(sna, info)) { - free(info); + sna_dri_frame_event_info_free(info); goto blit; } @@ -1935,7 +1932,6 @@ sna_dri_schedule_wait_msc(ClientPtr client, DrawablePtr draw, CARD64 target_msc, if (!sna_dri_add_frame_event(info)) { DBG(("%s: failed to hook up frame event\n", __FUNCTION__)); free(info); - info = NULL; goto out_complete; } @@ -1959,7 +1955,7 @@ sna_dri_schedule_wait_msc(ClientPtr client, DrawablePtr draw, CARD64 target_msc, strerror(errno)); limit--; } - goto out_complete; + goto out_free_info; } info->frame = vbl.reply.sequence; @@ -1996,15 +1992,16 @@ sna_dri_schedule_wait_msc(ClientPtr client, DrawablePtr draw, CARD64 target_msc, strerror(errno)); limit--; } - goto out_complete; + goto out_free_info; } info->frame = vbl.reply.sequence; DRI2BlockClient(client, draw); return TRUE; +out_free_info: + sna_dri_frame_event_info_free(info); out_complete: - free(info); DRI2WaitMSCComplete(client, draw, target_msc, 0, 0); return TRUE; } |