move intel crtc xv clipping helper to the xserver
The code is generic and can be used by any overlay-based card when adding randr 1.2 support. Tested on radeon.
This commit is contained in:
parent
a1fe36b772
commit
53c04351c4
|
@ -45,6 +45,8 @@
|
||||||
#include "picturestr.h"
|
#include "picturestr.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "xf86xv.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize xf86CrtcConfig structure
|
* Initialize xf86CrtcConfig structure
|
||||||
*/
|
*/
|
||||||
|
@ -2144,3 +2146,119 @@ xf86ConnectorGetName(xf86ConnectorType connector)
|
||||||
{
|
{
|
||||||
return _xf86ConnectorNames[connector];
|
return _xf86ConnectorNames[connector];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
x86_crtc_box_intersect(BoxPtr dest, BoxPtr a, BoxPtr b)
|
||||||
|
{
|
||||||
|
dest->x1 = a->x1 > b->x1 ? a->x1 : b->x1;
|
||||||
|
dest->x2 = a->x2 < b->x2 ? a->x2 : b->x2;
|
||||||
|
dest->y1 = a->y1 > b->y1 ? a->y1 : b->y1;
|
||||||
|
dest->y2 = a->y2 < b->y2 ? a->y2 : b->y2;
|
||||||
|
|
||||||
|
if (dest->x1 >= dest->x2 || dest->y1 >= dest->y2)
|
||||||
|
dest->x1 = dest->x2 = dest->y1 = dest->y2 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
x86_crtc_box(xf86CrtcPtr crtc, BoxPtr crtc_box)
|
||||||
|
{
|
||||||
|
if (crtc->enabled) {
|
||||||
|
crtc_box->x1 = crtc->x;
|
||||||
|
crtc_box->x2 = crtc->x + xf86ModeWidth(&crtc->mode, crtc->rotation);
|
||||||
|
crtc_box->y1 = crtc->y;
|
||||||
|
crtc_box->y2 = crtc->y + xf86ModeHeight(&crtc->mode, crtc->rotation);
|
||||||
|
} else
|
||||||
|
crtc_box->x1 = crtc_box->x2 = crtc_box->y1 = crtc_box->y2 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
xf86_crtc_box_area(BoxPtr box)
|
||||||
|
{
|
||||||
|
return (int) (box->x2 - box->x1) * (int) (box->y2 - box->y1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return the crtc covering 'box'. If two crtcs cover a portion of
|
||||||
|
* 'box', then prefer 'desired'. If 'desired' is NULL, then prefer the crtc
|
||||||
|
* with greater coverage
|
||||||
|
*/
|
||||||
|
|
||||||
|
static xf86CrtcPtr
|
||||||
|
xf86_covering_crtc(ScrnInfoPtr pScrn,
|
||||||
|
BoxPtr box,
|
||||||
|
xf86CrtcPtr desired,
|
||||||
|
BoxPtr crtc_box_ret)
|
||||||
|
{
|
||||||
|
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||||||
|
xf86CrtcPtr crtc, best_crtc;
|
||||||
|
int coverage, best_coverage;
|
||||||
|
int c;
|
||||||
|
BoxRec crtc_box, cover_box;
|
||||||
|
|
||||||
|
best_crtc = NULL;
|
||||||
|
best_coverage = 0;
|
||||||
|
crtc_box_ret->x1 = 0;
|
||||||
|
crtc_box_ret->x2 = 0;
|
||||||
|
crtc_box_ret->y1 = 0;
|
||||||
|
crtc_box_ret->y2 = 0;
|
||||||
|
for (c = 0; c < xf86_config->num_crtc; c++) {
|
||||||
|
crtc = xf86_config->crtc[c];
|
||||||
|
x86_crtc_box(crtc, &crtc_box);
|
||||||
|
x86_crtc_box_intersect(&cover_box, &crtc_box, box);
|
||||||
|
coverage = xf86_crtc_box_area(&cover_box);
|
||||||
|
if (coverage && crtc == desired) {
|
||||||
|
*crtc_box_ret = crtc_box;
|
||||||
|
return crtc;
|
||||||
|
} else if (coverage > best_coverage) {
|
||||||
|
*crtc_box_ret = crtc_box;
|
||||||
|
best_crtc = crtc;
|
||||||
|
best_coverage = coverage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return best_crtc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For overlay video, compute the relevant CRTC and
|
||||||
|
* clip video to that
|
||||||
|
*/
|
||||||
|
|
||||||
|
Bool
|
||||||
|
xf86_crtc_clip_video_helper(ScrnInfoPtr pScrn,
|
||||||
|
xf86CrtcPtr *crtc_ret,
|
||||||
|
xf86CrtcPtr desired_crtc,
|
||||||
|
BoxPtr dst,
|
||||||
|
INT32 *xa,
|
||||||
|
INT32 *xb,
|
||||||
|
INT32 *ya,
|
||||||
|
INT32 *yb,
|
||||||
|
RegionPtr reg,
|
||||||
|
INT32 width,
|
||||||
|
INT32 height)
|
||||||
|
{
|
||||||
|
Bool ret;
|
||||||
|
RegionRec crtc_region_local;
|
||||||
|
RegionPtr crtc_region = reg;
|
||||||
|
|
||||||
|
if (crtc_ret) {
|
||||||
|
BoxRec crtc_box;
|
||||||
|
xf86CrtcPtr crtc = xf86_covering_crtc(pScrn, dst,
|
||||||
|
desired_crtc,
|
||||||
|
&crtc_box);
|
||||||
|
|
||||||
|
if (crtc) {
|
||||||
|
REGION_INIT (pScreen, &crtc_region_local, &crtc_box, 1);
|
||||||
|
crtc_region = &crtc_region_local;
|
||||||
|
REGION_INTERSECT (pScreen, crtc_region, crtc_region, reg);
|
||||||
|
}
|
||||||
|
*crtc_ret = crtc;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = xf86XVClipVideoHelper(dst, xa, xb, ya, yb,
|
||||||
|
crtc_region, width, height);
|
||||||
|
|
||||||
|
if (crtc_region != reg)
|
||||||
|
REGION_UNINIT (pScreen, &crtc_region_local);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
|
@ -765,5 +765,24 @@ xf86_hide_cursors (ScrnInfoPtr scrn);
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
xf86_cursors_fini (ScreenPtr screen);
|
xf86_cursors_fini (ScreenPtr screen);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For overlay video, compute the relevant CRTC and
|
||||||
|
* clip video to that.
|
||||||
|
* wraps xf86XVClipVideoHelper()
|
||||||
|
*/
|
||||||
|
|
||||||
|
Bool
|
||||||
|
xf86_crtc_clip_video_helper(ScrnInfoPtr pScrn,
|
||||||
|
xf86CrtcPtr *crtc_ret,
|
||||||
|
xf86CrtcPtr desired_crtc,
|
||||||
|
BoxPtr dst,
|
||||||
|
INT32 *xa,
|
||||||
|
INT32 *xb,
|
||||||
|
INT32 *ya,
|
||||||
|
INT32 *yb,
|
||||||
|
RegionPtr reg,
|
||||||
|
INT32 width,
|
||||||
|
INT32 height);
|
||||||
|
|
||||||
#endif /* _XF86CRTC_H_ */
|
#endif /* _XF86CRTC_H_ */
|
||||||
|
|
Loading…
Reference in New Issue