Merge branch 'keep-used-transformation-filters' into 'master'

xf86Crtc: keep transformation filters used by CRTCs around

Closes #14

See merge request xorg/xserver!101
This commit is contained in:
Marco Trevisan 2025-12-10 13:49:37 +00:00
commit 90e1d98287
4 changed files with 74 additions and 3 deletions

View file

@ -152,6 +152,7 @@ xf86CrtcDestroy(xf86CrtcPtr crtc)
xf86_config->num_crtc--; xf86_config->num_crtc--;
break; break;
} }
RRTransformFini(&crtc->transform);
free(crtc->params); free(crtc->params);
free(crtc->gamma_red); free(crtc->gamma_red);
free(crtc); free(crtc);
@ -260,6 +261,54 @@ xf86CrtcSetScreenSubpixelOrder(ScreenPtr pScreen)
PictureSetSubpixelOrder(pScreen, subpixel_order); PictureSetSubpixelOrder(pScreen, subpixel_order);
} }
static Bool
xf86CrtcCopyTransformFilter(RRTransformPtr transform)
{
PictFilterRec *filter;
PictFilterRec *filterCopy;
filter = transform->filter;
if (filter->tempCopy)
return TRUE;
filterCopy = malloc(sizeof(PictFilterRec));
if (!filterCopy)
return FALSE;
memcpy(filterCopy, filter, sizeof(PictFilterRec));
filterCopy->name = strdup(filter->name);
filterCopy->tempCopy = TRUE;
transform->filter = filterCopy;
return TRUE;
}
static Bool
xf86CrtcTryRestoreTransformFilterCopy(ScreenPtr pScreen, RRTransformPtr transform)
{
PictFilterPtr actualFilter;
PictFilterPtr filterCopy;
if (!transform->filter->tempCopy)
return TRUE;
filterCopy = transform->filter;
actualFilter = PictureFindFilter(pScreen, filterCopy->name, -1);
if (!actualFilter) {
if (PictureAddFilter(pScreen, filterCopy->name,
filterCopy->ValidateParams,
filterCopy->width, filterCopy->height) > -1)
actualFilter = PictureFindFilter(pScreen, filterCopy->name, -1);
}
free(filterCopy->name);
free(filterCopy);
transform->filter = actualFilter;
return transform->filter != NULL;
}
/** /**
* Sets the given video mode on the given crtc * Sets the given video mode on the given crtc
*/ */
@ -295,7 +344,8 @@ xf86CrtcSetModeTransform(xf86CrtcPtr crtc, DisplayModePtr mode,
saved_x = crtc->x; saved_x = crtc->x;
saved_y = crtc->y; saved_y = crtc->y;
saved_rotation = crtc->rotation; saved_rotation = crtc->rotation;
if (crtc->transformPresent) { if (crtc->transformPresent &&
xf86CrtcTryRestoreTransformFilterCopy(scrn->pScreen, &crtc->transform)) {
RRTransformInit(&saved_transform); RRTransformInit(&saved_transform);
RRTransformCopy(&saved_transform, &crtc->transform); RRTransformCopy(&saved_transform, &crtc->transform);
} }
@ -786,6 +836,15 @@ xf86CrtcCloseScreen(ScreenPtr screen)
xf86CrtcPtr crtc = config->crtc[c]; xf86CrtcPtr crtc = config->crtc[c];
crtc->randr_crtc = NULL; crtc->randr_crtc = NULL;
if (crtc->transformPresent) {
if (!xf86CrtcCopyTransformFilter(&crtc->transform))
crtc->transformPresent = FALSE;
}
if (crtc->desiredTransformPresent) {
if (!xf86CrtcCopyTransformFilter(&crtc->desiredTransform))
crtc->desiredTransformPresent = FALSE;
}
} }
screen->CloseScreen = config->CloseScreen; screen->CloseScreen = config->CloseScreen;
@ -2863,12 +2922,17 @@ xf86SetDesiredModes(ScrnInfoPtr scrn)
crtc->desiredTransformPresent = FALSE; crtc->desiredTransformPresent = FALSE;
crtc->desiredX = 0; crtc->desiredX = 0;
crtc->desiredY = 0; crtc->desiredY = 0;
RRTransformFini(&crtc->desiredTransform);
} }
if (crtc->desiredTransformPresent) if (crtc->desiredTransformPresent &&
xf86CrtcTryRestoreTransformFilterCopy(scrn->pScreen,
&crtc->desiredTransform)) {
transform = &crtc->desiredTransform; transform = &crtc->desiredTransform;
else } else {
crtc->desiredTransformPresent = FALSE;
transform = NULL; transform = NULL;
}
if (xf86CrtcSetModeTransform if (xf86CrtcSetModeTransform
(crtc, &crtc->desiredMode, crtc->desiredRotation, transform, (crtc, &crtc->desiredMode, crtc->desiredRotation, transform,
crtc->desiredX, crtc->desiredY)) { crtc->desiredX, crtc->desiredY)) {
@ -3009,6 +3073,7 @@ xf86SetSingleMode(ScrnInfoPtr pScrn, DisplayModePtr desired, Rotation rotation)
crtc->desiredTransformPresent = FALSE; crtc->desiredTransformPresent = FALSE;
crtc->desiredX = 0; crtc->desiredX = 0;
crtc->desiredY = 0; crtc->desiredY = 0;
RRTransformFini(&crtc->desiredTransform);
} }
} }
xf86DisableUnusedFunctions(pScrn); xf86DisableUnusedFunctions(pScrn);

View file

@ -37,6 +37,10 @@ RRTransformInit(RRTransformPtr transform)
void void
RRTransformFini(RRTransformPtr transform) RRTransformFini(RRTransformPtr transform)
{ {
if (transform->filter && transform->filter->tempCopy) {
free(transform->filter->name);
free(transform->filter);
}
free(transform->params); free(transform->params);
} }

View file

@ -199,6 +199,7 @@ PictureAddFilter(ScreenPtr pScreen,
ps->filters[i].ValidateParams = ValidateParams; ps->filters[i].ValidateParams = ValidateParams;
ps->filters[i].width = width; ps->filters[i].width = width;
ps->filters[i].height = height; ps->filters[i].height = height;
ps->filters[i].tempCopy = FALSE;
return id; return id;
} }

View file

@ -165,6 +165,7 @@ typedef struct {
int id; int id;
PictFilterValidateParamsProcPtr ValidateParams; PictFilterValidateParamsProcPtr ValidateParams;
int width, height; int width, height;
Bool tempCopy;
} PictFilterRec, *PictFilterPtr; } PictFilterRec, *PictFilterPtr;
#define PictFilterNearest 0 #define PictFilterNearest 0