Allow DRI page flipping when some CRTCs use separate scanout buffers

As long as the CRTC we're synchronizing to doesn't.

(Ported from radeon commit 5309bde0c4e28adf2b167191c6d7011a19e31eed)
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Michel Dänzer
2017-08-02 19:07:40 +09:00
committed by Michel Dänzer
parent 4441c7c6dd
commit 9caa9dd9cc
5 changed files with 16 additions and 34 deletions

View File

@@ -77,7 +77,7 @@ Set the default value of the per-output 'TearFree' property, which controls
tearing prevention using the hardware page flipping mechanism. TearFree is
on for any CRTC associated with one or more outputs with TearFree on. Two
separate scanout buffers need to be allocated for each CRTC with TearFree
on. While TearFree is on for any CRTC, it currently prevents clients from using
on. While TearFree is on for any CRTC, it may prevent clients from using
DRI page flipping. If this option is set, the default value of the property
is 'on' or 'off' accordingly. If this option isn't set, the default value of the
property is

View File

@@ -600,18 +600,6 @@ can_exchange(ScrnInfoPtr pScrn, DrawablePtr draw,
struct dri2_buffer_priv *back_priv = back->driverPrivate;
PixmapPtr front_pixmap;
PixmapPtr back_pixmap = back_priv->pixmap;
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
int i;
for (i = 0; i < xf86_config->num_crtc; i++) {
xf86CrtcPtr crtc = xf86_config->crtc[i];
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
if (crtc->enabled &&
(crtc->rotatedData ||
drmmode_crtc->scanout[drmmode_crtc->scanout_id].bo))
return FALSE;
}
if (!update_front(draw, front))
return FALSE;
@@ -635,9 +623,10 @@ can_exchange(ScrnInfoPtr pScrn, DrawablePtr draw,
}
static Bool
can_flip(ScrnInfoPtr pScrn, DrawablePtr draw,
can_flip(xf86CrtcPtr crtc, DrawablePtr draw,
DRI2BufferPtr front, DRI2BufferPtr back)
{
ScrnInfoPtr pScrn = crtc->scrn;
AMDGPUInfoPtr info = AMDGPUPTR(pScrn);
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
int num_crtcs_on;
@@ -652,15 +641,10 @@ can_flip(ScrnInfoPtr pScrn, DrawablePtr draw,
return FALSE;
for (i = 0, num_crtcs_on = 0; i < config->num_crtc; i++) {
xf86CrtcPtr crtc = config->crtc[i];
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
if (!drmmode_crtc || drmmode_crtc->rotate.bo ||
drmmode_crtc->scanout[drmmode_crtc->scanout_id].bo)
return FALSE;
if (drmmode_crtc_can_flip(crtc))
if (drmmode_crtc_can_flip(config->crtc[i]))
num_crtcs_on++;
else if (config->crtc[i] == crtc)
return FALSE;
}
return num_crtcs_on > 0 && can_exchange(pScrn, draw, front, back);
@@ -745,7 +729,7 @@ static void amdgpu_dri2_frame_event_handler(xf86CrtcPtr crtc, uint32_t seq,
switch (event->type) {
case DRI2_FLIP:
if (can_flip(scrn, drawable, event->front, event->back) &&
if (can_flip(crtc, drawable, event->front, event->back) &&
amdgpu_dri2_schedule_flip(crtc,
event->client,
drawable,
@@ -1237,7 +1221,7 @@ static int amdgpu_dri2_schedule_swap(ClientPtr client, DrawablePtr draw,
current_msc &= 0xffffffff;
/* Flips need to be submitted one frame before */
if (can_flip(scrn, draw, front, back)) {
if (can_flip(crtc, draw, front, back)) {
swap_info->type = DRI2_FLIP;
flip = 1;
}

View File

@@ -228,14 +228,7 @@ amdgpu_present_check_unflip(ScrnInfoPtr scrn)
return FALSE;
for (i = 0, num_crtcs_on = 0; i < config->num_crtc; i++) {
xf86CrtcPtr crtc = config->crtc[i];
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
if (!drmmode_crtc || drmmode_crtc->rotate.bo ||
drmmode_crtc->scanout[drmmode_crtc->scanout_id].bo)
return FALSE;
if (drmmode_crtc_can_flip(crtc))
if (drmmode_crtc_can_flip(config->crtc[i]))
num_crtcs_on++;
}
@@ -269,6 +262,9 @@ amdgpu_present_check_flip(RRCrtcPtr crtc, WindowPtr window, PixmapPtr pixmap,
amdgpu_pixmap_get_tiling_info(screen->GetScreenPixmap(screen)))
return FALSE;
if (!drmmode_crtc_can_flip(crtc->devPrivate))
return FALSE;
return amdgpu_present_check_unflip(scrn);
}

View File

@@ -2814,7 +2814,7 @@ Bool amdgpu_do_pageflip(ScrnInfoPtr scrn, ClientPtr client,
for (i = 0; i < config->num_crtc; i++) {
crtc = config->crtc[i];
if (!crtc->enabled)
if (!drmmode_crtc_can_flip(crtc))
continue;
flipdata->flip_count++;

View File

@@ -139,7 +139,9 @@ drmmode_crtc_can_flip(xf86CrtcPtr crtc)
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
return crtc->enabled &&
drmmode_crtc->pending_dpms_mode == DPMSModeOn;
drmmode_crtc->pending_dpms_mode == DPMSModeOn &&
!drmmode_crtc->rotate.bo &&
!drmmode_crtc->scanout[drmmode_crtc->scanout_id].bo;
}