summaryrefslogtreecommitdiff
path: root/src/radeon_dri2.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/radeon_dri2.c')
-rw-r--r--src/radeon_dri2.c44
1 files changed, 24 insertions, 20 deletions
diff --git a/src/radeon_dri2.c b/src/radeon_dri2.c
index 83bc2d29..8ebc6871 100644
--- a/src/radeon_dri2.c
+++ b/src/radeon_dri2.c
@@ -774,24 +774,24 @@ radeon_dri2_client_state_changed(CallbackListPtr *ClientStateCallback, pointer d
}
}
-static int radeon_dri2_drawable_crtc(DrawablePtr pDraw)
+static
+xf86CrtcPtr radeon_dri2_drawable_crtc(DrawablePtr pDraw, Bool consider_disabled)
{
ScreenPtr pScreen = pDraw->pScreen;
ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
xf86CrtcPtr crtc;
- int crtc_id = -1;
- crtc = radeon_pick_best_crtc(pScrn, FALSE,
+ crtc = radeon_pick_best_crtc(pScrn, consider_disabled,
pDraw->x,
pDraw->x + pDraw->width,
pDraw->y,
pDraw->y + pDraw->height);
/* Make sure the CRTC is valid and this is the real front buffer */
- if (crtc != NULL && !crtc->rotatedData) {
- crtc_id = drmmode_get_crtc_id(crtc);
- }
- return crtc_id;
+ if (crtc != NULL && !crtc->rotatedData)
+ return crtc;
+ else
+ return NULL;
}
static Bool
@@ -803,9 +803,9 @@ radeon_dri2_schedule_flip(ScrnInfoPtr scrn, ClientPtr client,
struct dri2_buffer_priv *back_priv;
struct radeon_bo *bo;
DRI2FrameEventPtr flip_info;
-
/* Main crtc for this drawable shall finally deliver pageflip event. */
- int ref_crtc_hw_id = radeon_dri2_drawable_crtc(draw);
+ xf86CrtcPtr crtc = radeon_dri2_drawable_crtc(draw, FALSE);
+ int ref_crtc_hw_id = crtc ? drmmode_get_crtc_id(crtc) : -1;
flip_info = calloc(1, sizeof(DRI2FrameEventRec));
if (!flip_info)
@@ -1023,20 +1023,22 @@ cleanup:
free(event);
}
-static drmVBlankSeqType populate_vbl_request_type(RADEONInfoPtr info, int crtc)
+static
+drmVBlankSeqType populate_vbl_request_type(RADEONInfoPtr info, xf86CrtcPtr crtc)
{
drmVBlankSeqType type = 0;
+ int crtc_id = drmmode_get_crtc_id(crtc);
- if (crtc == 1)
+ if (crtc_id == 1)
type |= DRM_VBLANK_SECONDARY;
- else if (crtc > 1)
+ else if (crtc_id > 1)
#ifdef DRM_VBLANK_HIGH_CRTC_SHIFT
- type |= (crtc << DRM_VBLANK_HIGH_CRTC_SHIFT) &
+ type |= (crtc_id << DRM_VBLANK_HIGH_CRTC_SHIFT) &
DRM_VBLANK_HIGH_CRTC_MASK;
#else
ErrorF("radeon driver bug: %s called for CRTC %d > 1, but "
"DRM_VBLANK_HIGH_CRTC_MASK not defined at build time\n",
- __func__, crtc);
+ __func__, crtc_id);
#endif
return type;
@@ -1053,10 +1055,10 @@ static int radeon_dri2_get_msc(DrawablePtr draw, CARD64 *ust, CARD64 *msc)
RADEONInfoPtr info = RADEONPTR(scrn);
drmVBlank vbl;
int ret;
- int crtc = radeon_dri2_drawable_crtc(draw);
+ xf86CrtcPtr crtc = radeon_dri2_drawable_crtc(draw, FALSE);
/* Drawable not displayed, make up a value */
- if (crtc == -1) {
+ if (crtc == NULL) {
*ust = 0;
*msc = 0;
return TRUE;
@@ -1092,8 +1094,9 @@ static int radeon_dri2_schedule_wait_msc(ClientPtr client, DrawablePtr draw,
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
RADEONInfoPtr info = RADEONPTR(scrn);
DRI2FrameEventPtr wait_info = NULL;
+ xf86CrtcPtr crtc = radeon_dri2_drawable_crtc(draw, FALSE);
drmVBlank vbl;
- int ret, crtc = radeon_dri2_drawable_crtc(draw);
+ int ret;
CARD64 current_msc;
/* Truncate to match kernel interfaces; means occasional overflow
@@ -1103,7 +1106,7 @@ static int radeon_dri2_schedule_wait_msc(ClientPtr client, DrawablePtr draw,
remainder &= 0xffffffff;
/* Drawable not visible, return immediately */
- if (crtc == -1)
+ if (crtc == NULL)
goto out_complete;
wait_info = calloc(1, sizeof(DRI2FrameEventRec));
@@ -1289,8 +1292,9 @@ static int radeon_dri2_schedule_swap(ClientPtr client, DrawablePtr draw,
ScreenPtr screen = draw->pScreen;
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
RADEONInfoPtr info = RADEONPTR(scrn);
+ xf86CrtcPtr crtc = radeon_dri2_drawable_crtc(draw, FALSE);
drmVBlank vbl;
- int ret, crtc= radeon_dri2_drawable_crtc(draw), flip = 0;
+ int ret, flip = 0;
DRI2FrameEventPtr swap_info = NULL;
enum DRI2FrameEventType swap_type = DRI2_SWAP;
CARD64 current_msc;
@@ -1311,7 +1315,7 @@ static int radeon_dri2_schedule_swap(ClientPtr client, DrawablePtr draw,
radeon_dri2_ref_buffer(back);
/* Drawable not displayed... just complete the swap */
- if (crtc == -1)
+ if (crtc == NULL)
goto blit_fallback;
swap_info = calloc(1, sizeof(DRI2FrameEventRec));