xf86-video-ati: Branch 'master' - 3 commits
Alex Deucher
agd5f at kemper.freedesktop.org
Mon Aug 5 15:29:14 PDT 2013
src/drmmode_display.c | 139 +++++++++++++++++++++++++++++++++++++++++---------
src/drmmode_display.h | 1
src/radeon_kms.c | 4 -
3 files changed, 117 insertions(+), 27 deletions(-)
New commits:
commit c5cbfcf575b0b4aea6f797558ae974c1453c8e07
Author: Alex Deucher <alexander.deucher at amd.com>
Date: Tue Jul 30 10:08:25 2013 -0400
drmmode: add support for multi-screen reverse optimus
Initial reverse optimus didn't consider multiple screens, so
this overhauls the code to use the new X server interface,
and allows for multiple outputs on the dGPU to be used with
the iGPU doing the rendering. Ported from Dave's nouveau
patch.
Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 244a98f..1df104d 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -521,14 +521,15 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
}
crtc->funcs->gamma_set(crtc, crtc->gamma_red, crtc->gamma_green,
crtc->gamma_blue, crtc->gamma_size);
-
+
drmmode_ConvertToKMode(crtc->scrn, &kmode, mode);
fb_id = drmmode->fb_id;
#ifdef RADEON_PIXMAP_SHARING
- if (crtc->randr_crtc && crtc->randr_crtc->scanout_pixmap)
- x = y = 0;
- else
+ if (crtc->randr_crtc && crtc->randr_crtc->scanout_pixmap) {
+ x = drmmode_crtc->scanout_pixmap_x;
+ y = 0;
+ } else
#endif
if (drmmode_crtc->rotate_fb_id) {
fb_id = drmmode_crtc->rotate_fb_id;
@@ -741,25 +742,58 @@ 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->scanout_pixmap_x = 0;
return TRUE;
}
- if (ppix->drawable.width > screenpix->drawable.width ||
- ppix->drawable.height > screenpix->drawable.height) {
+ /* 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;
+ }
+#ifndef 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, ppix->drawable.width, ppix->drawable.height);
+ ret = drmmode_xf86crtc_resize(crtc->scrn, total_width, max_height);
if (ret == FALSE)
return FALSE;
screenpix = screen->GetScreenPixmap(screen);
- screen->width = screenpix->drawable.width = ppix->drawable.width;
- screen->height = screenpix->drawable.height = ppix->drawable.height;
+ screen->width = screenpix->drawable.width = total_width;
+ screen->height = screenpix->drawable.height = max_height;
}
+ drmmode_crtc->scanout_pixmap_x = this_x;
+#ifdef HAS_DIRTYTRACKING2
+ PixmapStartDirtyTracking2(ppix, screenpix, 0, 0, this_x, 0);
+#else
PixmapStartDirtyTracking(ppix, screenpix, 0, 0);
+#endif
return TRUE;
}
#endif
diff --git a/src/drmmode_display.h b/src/drmmode_display.h
index 2fccfda..41e29f6 100644
--- a/src/drmmode_display.h
+++ b/src/drmmode_display.h
@@ -81,6 +81,7 @@ typedef struct {
int dpms_last_fps;
uint32_t interpolated_vblanks;
uint16_t lut_r[256], lut_g[256], lut_b[256];
+ int scanout_pixmap_x;
} drmmode_crtc_private_rec, *drmmode_crtc_private_ptr;
typedef struct {
commit 429d5b797769895eb4f5fef816ce4e2f3a342031
Author: Dave Airlie <airlied at redhat.com>
Date: Tue Jan 8 15:56:37 2013 +1000
radeon: add support for reverse prime (v2)
This adds support for reverse prime configurations
v2: fix compilation with older xservers
Signed-off-by: Alex Deucher <alexdeucher at gmail.com>
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index a614216..244a98f 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -52,6 +52,9 @@
#define DEFAULT_NOMINAL_FRAME_RATE 60
static Bool
+drmmode_xf86crtc_resize (ScrnInfoPtr scrn, int width, int height);
+
+static Bool
RADEONZaphodStringMatches(ScrnInfoPtr pScrn, const char *s, char *output_name)
{
int i = 0;
@@ -522,6 +525,11 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
drmmode_ConvertToKMode(crtc->scrn, &kmode, mode);
fb_id = drmmode->fb_id;
+#ifdef RADEON_PIXMAP_SHARING
+ if (crtc->randr_crtc && crtc->randr_crtc->scanout_pixmap)
+ x = y = 0;
+ else
+#endif
if (drmmode_crtc->rotate_fb_id) {
fb_id = drmmode_crtc->rotate_fb_id;
x = y = 0;
@@ -727,6 +735,35 @@ drmmode_crtc_gamma_set(xf86CrtcPtr crtc, uint16_t *red, uint16_t *green,
size, red, green, blue);
}
+#ifdef RADEON_PIXMAP_SHARING
+static Bool
+drmmode_set_scanout_pixmap(xf86CrtcPtr crtc, PixmapPtr ppix)
+{
+ ScreenPtr screen = xf86ScrnToScreen(crtc->scrn);
+ PixmapPtr screenpix = screen->GetScreenPixmap(screen);
+
+ if (!ppix) {
+ if (crtc->randr_crtc->scanout_pixmap)
+ PixmapStopDirtyTracking(crtc->randr_crtc->scanout_pixmap, screenpix);
+ return TRUE;
+ }
+
+ if (ppix->drawable.width > screenpix->drawable.width ||
+ ppix->drawable.height > screenpix->drawable.height) {
+ Bool ret;
+ ret = drmmode_xf86crtc_resize(crtc->scrn, ppix->drawable.width, ppix->drawable.height);
+ if (ret == FALSE)
+ return FALSE;
+
+ screenpix = screen->GetScreenPixmap(screen);
+ screen->width = screenpix->drawable.width = ppix->drawable.width;
+ screen->height = screenpix->drawable.height = ppix->drawable.height;
+ }
+ PixmapStartDirtyTracking(ppix, screenpix, 0, 0);
+ return TRUE;
+}
+#endif
+
static const xf86CrtcFuncsRec drmmode_crtc_funcs = {
.dpms = drmmode_crtc_dpms,
.set_mode_major = drmmode_set_mode_major,
@@ -741,6 +778,9 @@ static const xf86CrtcFuncsRec drmmode_crtc_funcs = {
.shadow_allocate = drmmode_crtc_shadow_allocate,
.shadow_destroy = drmmode_crtc_shadow_destroy,
.destroy = NULL, /* XXX */
+#ifdef RADEON_PIXMAP_SHARING
+ .set_scanout_pixmap = drmmode_set_scanout_pixmap,
+#endif
};
int drmmode_get_crtc_id(xf86CrtcPtr crtc)
diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index c3f50d5..edc3b04 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -257,7 +257,7 @@ redisplay_dirty(ScreenPtr screen, PixmapDirtyUpdatePtr dirty)
ScrnInfoPtr pScrn = xf86ScreenToScrn(screen);
RegionRec pixregion;
- PixmapRegionInit(&pixregion, dirty->slave_dst->master_pixmap);
+ PixmapRegionInit(&pixregion, dirty->slave_dst);
DamageRegionAppend(&dirty->slave_dst->drawable, &pixregion);
PixmapSyncDirtyHelper(dirty, &pixregion);
@@ -766,7 +766,7 @@ static void RADEONSetupCapabilities(ScrnInfoPtr pScrn)
if (value & DRM_PRIME_CAP_EXPORT)
pScrn->capabilities |= RR_Capability_SourceOutput | RR_Capability_SinkOffload;
if (value & DRM_PRIME_CAP_IMPORT)
- pScrn->capabilities |= RR_Capability_SourceOffload;
+ pScrn->capabilities |= RR_Capability_SourceOffload | RR_Capability_SinkOutput;
}
#endif
}
commit 4de9356a2900ae0fb380a2350791ef045629cd05
Author: Alex Deucher <alexander.deucher at amd.com>
Date: Mon Aug 5 17:57:16 2013 -0400
radeon: fix naming clashes with multiple GPUs (v3)
The compat naming code for UMS causes problems
with multiple GPU as you may end up with the same
output name on multiple GPUs. Adjust the naming on
secondary GPUs to avoid conflicts.
v2: integrate Dave's fixes for nouveau
v3: keep compat with existing naming on primary GPU
Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 3a0187e..a614216 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -1108,6 +1108,8 @@ const char *output_names[] = { "None",
"eDP"
};
+#define NUM_OUTPUT_NAMES (sizeof(output_names) / sizeof(output_names[0]))
+
static void
drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num, int *num_dvi, int *num_hdmi)
{
@@ -1137,30 +1139,43 @@ drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num, int *num_dv
}
}
- /* need to do smart conversion here for compat with non-kms ATI driver */
- if (koutput->connector_type_id == 1) {
- switch(koutput->connector_type) {
- case DRM_MODE_CONNECTOR_DVII:
- case DRM_MODE_CONNECTOR_DVID:
- case DRM_MODE_CONNECTOR_DVIA:
- snprintf(name, 32, "%s-%d", output_names[koutput->connector_type], *num_dvi);
- (*num_dvi)++;
- break;
- case DRM_MODE_CONNECTOR_HDMIA:
- case DRM_MODE_CONNECTOR_HDMIB:
- snprintf(name, 32, "%s-%d", output_names[koutput->connector_type], *num_hdmi);
- (*num_hdmi)++;
- break;
- case DRM_MODE_CONNECTOR_VGA:
- case DRM_MODE_CONNECTOR_DisplayPort:
- snprintf(name, 32, "%s-%d", output_names[koutput->connector_type], koutput->connector_type_id - 1);
- break;
- default:
- snprintf(name, 32, "%s", output_names[koutput->connector_type]);
- break;
- }
- } else {
- snprintf(name, 32, "%s-%d", output_names[koutput->connector_type], koutput->connector_type_id - 1);
+ if (koutput->connector_type >= NUM_OUTPUT_NAMES)
+ snprintf(name, 32, "Unknown%d-%d", koutput->connector_type,
+ koutput->connector_type_id - 1);
+#ifdef RADEON_PIXMAP_SHARING
+ else if (pScrn->is_gpu)
+ snprintf(name, 32, "%s-%d-%d",
+ output_names[koutput->connector_type], pScrn->scrnIndex - GPU_SCREEN_OFFSET + 1,
+ koutput->connector_type_id - 1);
+#endif
+ else {
+ /* need to do smart conversion here for compat with non-kms ATI driver */
+ if (koutput->connector_type_id == 1) {
+ switch(koutput->connector_type) {
+ case DRM_MODE_CONNECTOR_DVII:
+ case DRM_MODE_CONNECTOR_DVID:
+ case DRM_MODE_CONNECTOR_DVIA:
+ snprintf(name, 32, "%s-%d", output_names[koutput->connector_type], *num_dvi);
+ (*num_dvi)++;
+ break;
+ case DRM_MODE_CONNECTOR_HDMIA:
+ case DRM_MODE_CONNECTOR_HDMIB:
+ snprintf(name, 32, "%s-%d", output_names[koutput->connector_type], *num_hdmi);
+ (*num_hdmi)++;
+ break;
+ case DRM_MODE_CONNECTOR_VGA:
+ case DRM_MODE_CONNECTOR_DisplayPort:
+ snprintf(name, 32, "%s-%d", output_names[koutput->connector_type],
+ koutput->connector_type_id - 1);
+ break;
+ default:
+ snprintf(name, 32, "%s", output_names[koutput->connector_type]);
+ break;
+ }
+ } else {
+ snprintf(name, 32, "%s-%d", output_names[koutput->connector_type],
+ koutput->connector_type_id - 1);
+ }
}
if (xf86IsEntityShared(pScrn->entityList[0])) {
More information about the xorg-commit
mailing list