summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichel Dänzer <michel.daenzer@amd.com>2016-09-08 16:48:59 +0900
committerMichel Dänzer <michel@daenzer.net>2016-09-09 19:02:28 +0900
commitb10ecdbd89b0a60a990c78c3e53bab6c4c96fe9f (patch)
treea3b4c7b98c6a5eb68e6cd40211a6e7e0e70d466a
parent9565981f751b0884cbfa885b8f3af3d41a965a2b (diff)
Use drmmode_crtc_scanout_* helpers for RandR 1.4 scanout pixmaps
This should allow using multiple CRTCs via RandR 1.4 even with xserver < 1.17. It also simplifies the code a little, and paves the way for following changes. (Ported from radeon commits 4cfa4615f79f64062e5e771cd45dd7048f48b4f6 and a92c27484703abc7c410b6ae0e4b8d1efbbb8e6f) Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--src/amdgpu_kms.c19
-rw-r--r--src/drmmode_display.c76
-rw-r--r--src/drmmode_display.h1
3 files changed, 34 insertions, 62 deletions
diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c
index 1bce781..9670c3f 100644
--- a/src/amdgpu_kms.c
+++ b/src/amdgpu_kms.c
@@ -595,15 +595,20 @@ static void AMDGPUBlockHandler_KMS(BLOCKHANDLER_ARGS_DECL)
(*pScreen->BlockHandler) (BLOCKHANDLER_ARGS);
pScreen->BlockHandler = AMDGPUBlockHandler_KMS;
- for (c = 0; c < xf86_config->num_crtc; c++) {
- if (info->tear_free)
- amdgpu_scanout_flip(pScreen, info, xf86_config->crtc[c]);
- else if (info->shadow_primary
+#ifdef AMDGPU_PIXMAP_SHARING
+ if (!pScreen->isGPU)
+#endif
+ {
+ for (c = 0; c < xf86_config->num_crtc; c++) {
+ if (info->tear_free)
+ amdgpu_scanout_flip(pScreen, info, xf86_config->crtc[c]);
+ else if (info->shadow_primary
#if XF86_CRTC_VERSION >= 4
- || xf86_config->crtc[c]->driverIsPerformingTransform
+ || xf86_config->crtc[c]->driverIsPerformingTransform
#endif
- )
- amdgpu_scanout_update(xf86_config->crtc[c]);
+ )
+ amdgpu_scanout_update(xf86_config->crtc[c]);
+ }
}
if (info->use_glamor)
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 491599f..a8ee5f0 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -705,18 +705,22 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
fb_id = drmmode->fb_id;
#ifdef AMDGPU_PIXMAP_SHARING
if (crtc->randr_crtc && crtc->randr_crtc->scanout_pixmap) {
- x = drmmode_crtc->prime_pixmap_x;
- y = 0;
+ fb_id = drmmode_crtc->scanout[0].fb_id;
+ x = y = 0;
} else
#endif
if (drmmode_crtc->rotate.fb_id) {
fb_id = drmmode_crtc->rotate.fb_id;
x = y = 0;
- } else if (info->tear_free ||
+ } else if (
+#ifdef AMDGPU_PIXMAP_SHARING
+ !pScreen->isGPU &&
+#endif
+ (info->tear_free ||
#if XF86_CRTC_VERSION >= 4
- crtc->driverIsPerformingTransform ||
+ crtc->driverIsPerformingTransform ||
#endif
- info->shadow_primary) {
+ info->shadow_primary)) {
for (i = 0; i < (info->tear_free ? 2 : 1); i++) {
drmmode_crtc_scanout_create(crtc,
&drmmode_crtc->scanout[i],
@@ -1058,66 +1062,30 @@ drmmode_crtc_gamma_set(xf86CrtcPtr crtc, uint16_t * red, uint16_t * green,
#ifdef AMDGPU_PIXMAP_SHARING
static Bool drmmode_set_scanout_pixmap(xf86CrtcPtr crtc, PixmapPtr ppix)
{
- ScreenPtr screen = xf86ScrnToScreen(crtc->scrn);
- PixmapPtr screenpix = screen->GetScreenPixmap(screen);
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
- int c, total_width = 0, max_height = 0, this_x = 0;
if (!ppix) {
if (crtc->randr_crtc->scanout_pixmap)
- PixmapStopDirtyTracking(crtc->
- randr_crtc->scanout_pixmap,
- screenpix);
- drmmode_crtc->prime_pixmap_x = 0;
+ PixmapStopDirtyTracking(crtc->randr_crtc->scanout_pixmap,
+ drmmode_crtc->scanout[0].pixmap);
+ drmmode_crtc_scanout_destroy(drmmode_crtc->drmmode,
+ &drmmode_crtc->scanout[0]);
return TRUE;
}
- /* iterate over all the attached crtcs -
- work out bounding box */
- for (c = 0; c < xf86_config->num_crtc; c++) {
- xf86CrtcPtr iter = xf86_config->crtc[c];
- if (!iter->enabled && iter != crtc)
- continue;
- if (iter == crtc) {
- this_x = total_width;
- total_width += ppix->drawable.width;
- if (max_height < ppix->drawable.height)
- max_height = ppix->drawable.height;
- } else {
- total_width += iter->mode.HDisplay;
- if (max_height < iter->mode.VDisplay)
- max_height = iter->mode.VDisplay;
- }
-#if !defined(HAS_DIRTYTRACKING_ROTATION) && !defined(HAS_DIRTYTRACKING2)
- if (iter != crtc) {
- ErrorF
- ("Cannot do multiple crtcs without X server dirty tracking 2 interface\n");
- return FALSE;
- }
-#endif
- }
-
- if (total_width != screenpix->drawable.width ||
- max_height != screenpix->drawable.height) {
- Bool ret;
- ret =
- drmmode_xf86crtc_resize(crtc->scrn, total_width,
- max_height);
- if (ret == FALSE)
- return FALSE;
+ if (!drmmode_crtc_scanout_create(crtc, &drmmode_crtc->scanout[0],
+ ppix->drawable.width,
+ ppix->drawable.height))
+ return FALSE;
- screenpix = screen->GetScreenPixmap(screen);
- screen->width = screenpix->drawable.width = total_width;
- screen->height = screenpix->drawable.height = max_height;
- }
- drmmode_crtc->prime_pixmap_x = this_x;
#ifdef HAS_DIRTYTRACKING_ROTATION
- PixmapStartDirtyTracking(ppix, screenpix, 0, 0, this_x, 0, RR_Rotate_0);
+ PixmapStartDirtyTracking(ppix, drmmode_crtc->scanout[0].pixmap,
+ 0, 0, 0, 0, RR_Rotate_0);
#elif defined(HAS_DIRTYTRACKING2)
- PixmapStartDirtyTracking2(ppix, screenpix, 0, 0, this_x, 0);
+ PixmapStartDirtyTracking2(ppix, drmmode_crtc->scanout[0].pixmap,
+ 0, 0, 0, 0);
#else
- PixmapStartDirtyTracking(ppix, screenpix, 0, 0);
+ PixmapStartDirtyTracking(ppix, drmmode_crtc->scanout[0].pixmap, 0, 0);
#endif
return TRUE;
}
diff --git a/src/drmmode_display.h b/src/drmmode_display.h
index 14fbcfc..e739382 100644
--- a/src/drmmode_display.h
+++ b/src/drmmode_display.h
@@ -94,7 +94,6 @@ typedef struct {
uint32_t dpms_last_seq;
int dpms_last_fps;
uint32_t interpolated_vblanks;
- int prime_pixmap_x;
/* Modeset needed for DPMS on */
Bool need_modeset;