bool sna_video_clip_helper(ScrnInfoPtr scrn, struct sna_video *video, struct sna_video_frame *frame, xf86CrtcPtr * crtc_ret, BoxPtr dst, short src_x, short src_y, short drw_x, short drw_y, short src_w, short src_h, short drw_w, short drw_h, RegionPtr reg) { bool ret; RegionRec crtc_region_local; RegionPtr crtc_region = reg; INT32 x1, x2, y1, y2; xf86CrtcPtr crtc; x1 = src_x; x2 = src_x + src_w; y1 = src_y; y2 = src_y + src_h; dst->x1 = drw_x; dst->x2 = drw_x + drw_w; dst->y1 = drw_y; dst->y2 = drw_y + drw_h; /* * For overlay video, compute the relevant CRTC and * clip video to that */ crtc = sna_covering_crtc(scrn, dst, video->desired_crtc); /* For textured video, we don't actually want to clip at all. */ if (crtc && !video->textured) { crtc_region_local.extents = crtc->bounds; crtc_region_local.data = NULL; crtc_region = &crtc_region_local; RegionIntersect(crtc_region, crtc_region, reg); } *crtc_ret = crtc; ret = xf86XVClipVideoHelper(dst, &x1, &x2, &y1, &y2, crtc_region, frame->width, frame->height); if (crtc_region != reg) RegionUninit(crtc_region); frame->top = y1 >> 16; frame->left = (x1 >> 16) & ~1; frame->npixels = ALIGN(((x2 + 0xffff) >> 16), 2) - frame->left; if (is_planar_fourcc(frame->id)) { frame->top &= ~1; frame->nlines = ALIGN(((y2 + 0xffff) >> 16), 2) - frame->top; } else
static RRCrtcPtr sna_present_get_crtc(WindowPtr window) { struct sna *sna = to_sna_from_drawable(&window->drawable); BoxRec box; xf86CrtcPtr crtc; DBG(("%s\n", __FUNCTION__)); box.x1 = window->drawable.x; box.y1 = window->drawable.y; box.x2 = box.x1 + window->drawable.width; box.y2 = box.y1 + window->drawable.height; crtc = sna_covering_crtc(sna, &box, NULL); if (crtc) return crtc->randr_crtc; return NULL; }