mirror of
https://github.com/X11Libre/xf86-video-amdgpu.git
synced 2026-03-24 01:24:31 +00:00
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:
committed by
Michel Dänzer
parent
4441c7c6dd
commit
9caa9dd9cc
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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++;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user