xf86-video-ati: Branch 'master' - 3 commits
Michel Dänzer
daenzer at kemper.freedesktop.org
Wed Aug 2 09:58:58 UTC 2017
man/radeon.man | 2 +-
src/drmmode_display.c | 23 +++++++++++++++--------
src/drmmode_display.h | 13 +++++++++++++
src/radeon_dri2.c | 33 +++++++--------------------------
src/radeon_kms.c | 2 +-
src/radeon_present.c | 14 ++++----------
6 files changed, 41 insertions(+), 46 deletions(-)
New commits:
commit 5309bde0c4e28adf2b167191c6d7011a19e31eed
Author: Michel Dänzer <michel.daenzer at amd.com>
Date: Thu Jul 27 16:11:19 2017 +0900
Allow DRI page flipping when some CRTCs use separate scanout buffers
As long as the CRTC we're synchronizing to doesn't.
v2:
* Remove redundant checks from can_exchange which still prevented DRI2
page flipping
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
diff --git a/man/radeon.man b/man/radeon.man
index 3e1723f2..1e9a7beb 100644
--- a/man/radeon.man
+++ b/man/radeon.man
@@ -285,7 +285,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
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 309ccbd6..03b8a482 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -3014,7 +3014,7 @@ Bool radeon_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++;
diff --git a/src/drmmode_display.h b/src/drmmode_display.h
index 4378be86..f859377c 100644
--- a/src/drmmode_display.h
+++ b/src/drmmode_display.h
@@ -146,7 +146,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;
}
diff --git a/src/radeon_dri2.c b/src/radeon_dri2.c
index 70751b0b..4b059897 100644
--- a/src/radeon_dri2.c
+++ b/src/radeon_dri2.c
@@ -720,18 +720,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;
@@ -754,9 +742,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;
RADEONInfoPtr info = RADEONPTR(pScrn);
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
int num_crtcs_on;
@@ -771,15 +760,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);
@@ -859,7 +843,7 @@ static void radeon_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) &&
radeon_dri2_schedule_flip(crtc,
event->client,
drawable,
@@ -1352,7 +1336,7 @@ static int radeon_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;
}
diff --git a/src/radeon_present.c b/src/radeon_present.c
index 85da655d..4d43733e 100644
--- a/src/radeon_present.c
+++ b/src/radeon_present.c
@@ -243,14 +243,7 @@ radeon_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++;
}
@@ -286,6 +279,9 @@ radeon_present_check_flip(RRCrtcPtr crtc, WindowPtr window, PixmapPtr pixmap,
radeon_present_get_pixmap_tiling_flags(info, screen_pixmap))
return FALSE;
+ if (!drmmode_crtc_can_flip(crtc->devPrivate))
+ return FALSE;
+
return radeon_present_check_unflip(scrn);
}
commit 9bc3eef74452d924f9101c024f66ad9b14c404c8
Author: Michel Dänzer <michel.daenzer at amd.com>
Date: Thu Jul 27 15:46:41 2017 +0900
Add drmmode_crtc_can_flip helper
To reduce code duplication between DRI2 and Present. No functional
change intended yet.
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
diff --git a/src/drmmode_display.h b/src/drmmode_display.h
index b9bc8fd8..4378be86 100644
--- a/src/drmmode_display.h
+++ b/src/drmmode_display.h
@@ -139,6 +139,17 @@ enum drmmode_flip_sync {
};
+/* Can the page flip ioctl be used for this CRTC? */
+static inline Bool
+drmmode_crtc_can_flip(xf86CrtcPtr crtc)
+{
+ drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
+
+ return crtc->enabled &&
+ drmmode_crtc->pending_dpms_mode == DPMSModeOn;
+}
+
+
static inline void
drmmode_fb_reference_loc(int drm_fd, struct drmmode_fb **old, struct drmmode_fb *new,
const char *caller, unsigned line)
diff --git a/src/radeon_dri2.c b/src/radeon_dri2.c
index 35fb60d9..70751b0b 100644
--- a/src/radeon_dri2.c
+++ b/src/radeon_dri2.c
@@ -774,14 +774,11 @@ can_flip(ScrnInfoPtr pScrn, DrawablePtr draw,
xf86CrtcPtr crtc = config->crtc[i];
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
- if (!crtc->enabled)
- continue;
-
if (!drmmode_crtc || drmmode_crtc->rotate.bo ||
drmmode_crtc->scanout[drmmode_crtc->scanout_id].bo)
return FALSE;
- if (drmmode_crtc->pending_dpms_mode == DPMSModeOn)
+ if (drmmode_crtc_can_flip(crtc))
num_crtcs_on++;
}
diff --git a/src/radeon_present.c b/src/radeon_present.c
index e3a8f7e2..85da655d 100644
--- a/src/radeon_present.c
+++ b/src/radeon_present.c
@@ -243,16 +243,14 @@ radeon_present_check_unflip(ScrnInfoPtr scrn)
return FALSE;
for (i = 0, num_crtcs_on = 0; i < config->num_crtc; i++) {
- drmmode_crtc_private_ptr drmmode_crtc = config->crtc[i]->driver_private;
-
- if (!config->crtc[i]->enabled)
- continue;
+ 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->pending_dpms_mode == DPMSModeOn)
+ if (drmmode_crtc_can_flip(crtc))
num_crtcs_on++;
}
commit c2d26890691ec105858f086b63170ad94c6f7f05
Author: Michel Dänzer <michel.daenzer at amd.com>
Date: Wed Jul 12 12:13:03 2017 +0900
Use root window (pixmap) instead of screen pixmap for scanout updates
Preparation for following changes, no functional change intended yet.
v2:
* Add drmmode_screen_damage_destroy callback to prevent use-after-free
on server shutdown
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 245a92fb..309ccbd6 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -529,11 +529,8 @@ drmmode_crtc_scanout_free(drmmode_crtc_private_ptr drmmode_crtc)
&drmmode_crtc->scanout[1]);
}
- if (drmmode_crtc->scanout_damage) {
+ if (drmmode_crtc->scanout_damage)
DamageDestroy(drmmode_crtc->scanout_damage);
- drmmode_crtc->scanout_damage = NULL;
- RegionUninit(&drmmode_crtc->scanout_last_region);
- }
}
void
@@ -605,6 +602,15 @@ radeon_screen_damage_report(DamagePtr damage, RegionPtr region, void *closure)
damage->damage.data = NULL;
}
+static void
+drmmode_screen_damage_destroy(DamagePtr damage, void *closure)
+{
+ drmmode_crtc_private_ptr drmmode_crtc = closure;
+
+ drmmode_crtc->scanout_damage = NULL;
+ RegionUninit(&drmmode_crtc->scanout_last_region);
+}
+
static Bool
drmmode_can_use_hw_cursor(xf86CrtcPtr crtc)
{
@@ -793,9 +799,10 @@ drmmode_crtc_scanout_update(xf86CrtcPtr crtc, DisplayModePtr mode,
if (!drmmode_crtc->scanout_damage) {
drmmode_crtc->scanout_damage =
DamageCreate(radeon_screen_damage_report,
- NULL, DamageReportRawRegion,
- TRUE, screen, NULL);
- DamageRegister(&screen->GetScreenPixmap(screen)->drawable,
+ drmmode_screen_damage_destroy,
+ DamageReportRawRegion,
+ TRUE, screen, drmmode_crtc);
+ DamageRegister(&screen->root->drawable,
drmmode_crtc->scanout_damage);
}
diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index b22c9840..f76d76a9 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -981,7 +981,7 @@ radeon_scanout_do_update(xf86CrtcPtr xf86_crtc, int scanout_id)
GCPtr gc = GetScratchGC(pDraw->depth, pScreen);
ValidateGC(pDraw, gc);
- (*gc->ops->CopyArea)(&pScreen->GetScreenPixmap(pScreen)->drawable,
+ (*gc->ops->CopyArea)(&pScreen->GetWindowPixmap(pScreen->root)->drawable,
pDraw, gc,
xf86_crtc->x + extents.x1, xf86_crtc->y + extents.y1,
extents.x2 - extents.x1, extents.y2 - extents.y1,
More information about the xorg-commit
mailing list