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"
|
||||
#endif
|
||||
|
||||
#include "xf86xv.h"
|
||||
|
||||
/*
|
||||
* Initialize xf86CrtcConfig structure
|
||||
*/
|
||||
|
@ -2144,3 +2146,119 @@ xf86ConnectorGetName(xf86ConnectorType 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
|
||||
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_ */
|
||||
|
|
Loading…
Reference in New Issue
Block a user