summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-04-17 20:08:14 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2012-04-17 20:08:14 +0100
commit11599e52b842b5db76798879b0fbb57762fe6002 (patch)
treef4781a0dc97c4e1fafd5075274c64e3b7137025b
parentb817200371bfe16f44b879a793cf4a75ad17bc5c (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.c29
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;
}