mirror of
https://github.com/X11Libre/xf86-video-amdgpu.git
synced 2026-03-24 01:24:31 +00:00
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>
This commit is contained in:
committed by
Michel Dänzer
parent
9565981f75
commit
b10ecdbd89
@@ -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
|
||||
#if XF86_CRTC_VERSION >= 4
|
||||
|| xf86_config->crtc[c]->driverIsPerformingTransform
|
||||
#ifdef AMDGPU_PIXMAP_SHARING
|
||||
if (!pScreen->isGPU)
|
||||
#endif
|
||||
)
|
||||
amdgpu_scanout_update(xf86_config->crtc[c]);
|
||||
{
|
||||
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
|
||||
#endif
|
||||
)
|
||||
amdgpu_scanout_update(xf86_config->crtc[c]);
|
||||
}
|
||||
}
|
||||
|
||||
if (info->use_glamor)
|
||||
|
||||
@@ -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 ||
|
||||
#if XF86_CRTC_VERSION >= 4
|
||||
crtc->driverIsPerformingTransform ||
|
||||
} else if (
|
||||
#ifdef AMDGPU_PIXMAP_SHARING
|
||||
!pScreen->isGPU &&
|
||||
#endif
|
||||
info->shadow_primary) {
|
||||
(info->tear_free ||
|
||||
#if XF86_CRTC_VERSION >= 4
|
||||
crtc->driverIsPerformingTransform ||
|
||||
#endif
|
||||
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 (!drmmode_crtc_scanout_create(crtc, &drmmode_crtc->scanout[0],
|
||||
ppix->drawable.width,
|
||||
ppix->drawable.height))
|
||||
return FALSE;
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user