diff options
Diffstat (limited to 'src/i830_video.c')
-rw-r--r-- | src/i830_video.c | 152 |
1 files changed, 91 insertions, 61 deletions
diff --git a/src/i830_video.c b/src/i830_video.c index 15ada0f5..80f73034 100644 --- a/src/i830_video.c +++ b/src/i830_video.c @@ -942,8 +942,8 @@ I830SetupImageVideoOverlay(ScreenPtr pScreen) xvGamma5 = MAKE_ATOM("XV_GAMMA5"); } + /* XXX These two access the overlay regs, dont call with drmmode */ I830ResetVideo(pScrn); - I830UpdateGamma(pScrn); return adapt; @@ -1043,6 +1043,12 @@ i830_free_video_buffers(I830PortPrivPtr pPriv) } static void +ums_overlay_off(ScrnInfoPtr pScrn) +{ + i830_overlay_off (pScrn); +} + +static void I830StopVideo(ScrnInfoPtr pScrn, pointer data, Bool shutdown) { I830PortPrivPtr pPriv = (I830PortPrivPtr) data; @@ -1056,7 +1062,7 @@ I830StopVideo(ScrnInfoPtr pScrn, pointer data, Bool shutdown) if (shutdown) { if (pPriv->videoStatus & CLIENT_VIDEO_ON) { - i830_overlay_off(pScrn); + ums_overlay_off(pScrn); } i830_free_video_buffers(pPriv); @@ -1089,7 +1095,6 @@ I830SetPortAttributeTextured(ScrnInfoPtr pScrn, } else if (attribute == xvSyncToVblank) { if ((value < -1) || (value > 1)) return BadValue; - pPriv->SyncToVblank = value; return Success; } else { @@ -1097,36 +1102,56 @@ I830SetPortAttributeTextured(ScrnInfoPtr pScrn, } } +static void +ums_overlay_update_attrs(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv) +{ + I830Ptr pI830 = I830PTR(pScrn); + I830OverlayRegPtr overlay; + + overlay = I830OVERLAYREG(pI830); + + overlay->OCLRC0 = (pPriv->contrast << 18) | (pPriv->brightness & 0xff); + overlay->OCLRC0 = (pPriv->contrast << 18) | (pPriv->brightness & 0xff); + overlay->OCLRC1 = pPriv->saturation; + + switch (pScrn->depth) { + case 16: + overlay->DCLRKV = RGB16ToColorKey(pPriv->colorKey); + break; + case 15: + overlay->DCLRKV = RGB15ToColorKey(pPriv->colorKey); + break; + default: + overlay->DCLRKV = pPriv->colorKey; + break; + } + + I830UpdateGamma(pScrn); + + i830_overlay_continue(pScrn, FALSE); +} + static int I830SetPortAttributeOverlay(ScrnInfoPtr pScrn, Atom attribute, INT32 value, pointer data) { I830PortPrivPtr pPriv = (I830PortPrivPtr) data; I830Ptr pI830 = I830PTR(pScrn); - I830OverlayRegPtr overlay; - - overlay = I830OVERLAYREG(pI830); if (attribute == xvBrightness) { if ((value < -128) || (value > 127)) return BadValue; pPriv->brightness = value; - overlay->OCLRC0 = (pPriv->contrast << 18) | (pPriv->brightness & 0xff); OVERLAY_DEBUG("BRIGHTNESS\n"); - i830_overlay_continue (pScrn, FALSE); } else if (attribute == xvContrast) { if ((value < 0) || (value > 255)) return BadValue; pPriv->contrast = value; - overlay->OCLRC0 = (pPriv->contrast << 18) | (pPriv->brightness & 0xff); OVERLAY_DEBUG("CONTRAST\n"); - i830_overlay_continue (pScrn, FALSE); } else if (attribute == xvSaturation) { if ((value < 0) || (value > 1023)) return BadValue; pPriv->saturation = value; - overlay->OCLRC1 = pPriv->saturation; - i830_overlay_continue (pScrn, FALSE); } else if (attribute == xvPipe) { xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); if ((value < -1) || (value > xf86_config->num_crtc)) @@ -1139,7 +1164,7 @@ I830SetPortAttributeOverlay(ScrnInfoPtr pScrn, * Leave this to be updated at the next frame */ } else if (attribute == xvGamma0 && (IS_I9XX(pI830))) { - pPriv->gamma0 = value; + pPriv->gamma0 = value; } else if (attribute == xvGamma1 && (IS_I9XX(pI830))) { pPriv->gamma1 = value; } else if (attribute == xvGamma2 && (IS_I9XX(pI830))) { @@ -1152,20 +1177,7 @@ I830SetPortAttributeOverlay(ScrnInfoPtr pScrn, pPriv->gamma5 = value; } else if (attribute == xvColorKey) { pPriv->colorKey = value; - switch (pScrn->depth) { - case 16: - overlay->DCLRKV = RGB16ToColorKey(pPriv->colorKey); - break; - case 15: - overlay->DCLRKV = RGB15ToColorKey(pPriv->colorKey); - break; - default: - overlay->DCLRKV = pPriv->colorKey; - break; - } OVERLAY_DEBUG("COLORKEY\n"); - i830_overlay_continue (pScrn, FALSE); - REGION_EMPTY(pScrn->pScreen, &pPriv->clip); } else return BadMatch; @@ -1177,9 +1189,13 @@ I830SetPortAttributeOverlay(ScrnInfoPtr pScrn, attribute == xvGamma4 || attribute == xvGamma5) && (IS_I9XX(pI830))) { OVERLAY_DEBUG("GAMMA\n"); - I830UpdateGamma(pScrn); } + ums_overlay_update_attrs(pScrn, pPriv); + + if (attribute == xvColorKey) + REGION_EMPTY(pScrn->pScreen, &pPriv->clip); + return Success; } @@ -1964,7 +1980,7 @@ xvmc_passthrough(int id, Rotation rotation) } static Bool -i830_display_overlay(ScrnInfoPtr pScrn, xf86CrtcPtr crtc, +ums_overlay_put_image(ScrnInfoPtr pScrn, xf86CrtcPtr crtc, int id, short width, short height, int dstPitch, int x1, int y1, int x2, int y2, BoxPtr dstBox, short src_w, short src_h, short drw_w, short drw_h) @@ -1974,29 +1990,12 @@ i830_display_overlay(ScrnInfoPtr pScrn, xf86CrtcPtr crtc, I830OverlayRegPtr overlay = I830OVERLAYREG(pI830); int planar; uint32_t swidth, swidthsw, sheigth; - int tmp; Bool scaleChanged; drm_intel_bo *tmp_buf; - OVERLAY_DEBUG("I830DisplayVideo: %dx%d (pitch %d)\n", width, height, - dstPitch); - -#if VIDEO_DEBUG - CompareOverlay(pI830, (uint32_t *) overlay, 0x100); -#endif - - /* - * If the video isn't visible on any CRTC, turn it off - */ - if (!crtc) - { - pPriv->current_crtc = NULL; - i830_overlay_off (pScrn); - return TRUE; - } - if (crtc != pPriv->current_crtc) { + /* this may adjust pPriv->oneLineMode */ i830_overlay_switch_to_crtc (pScrn, crtc); if (pPriv->overlayOK) { pPriv->current_crtc = crtc; @@ -2007,20 +2006,6 @@ i830_display_overlay(ScrnInfoPtr pScrn, xf86CrtcPtr crtc, if (!pPriv->overlayOK) return TRUE; - i830_update_dst_box_to_crtc_coords(pScrn, crtc, dstBox); - - if (crtc->rotation & (RR_Rotate_90 | RR_Rotate_270)) { - tmp = width; - width = height; - height = tmp; - tmp = drw_w; - drw_w = drw_h; - drw_h = tmp; - tmp = src_w; - src_w = src_h; - src_h = tmp; - } - if (pPriv->oneLineMode) { /* change the coordinates with panel fitting active */ dstBox->y1 = (((dstBox->y1 - 1) * pPriv->scaleRatio) >> 16) + 1; @@ -2101,6 +2086,51 @@ i830_display_overlay(ScrnInfoPtr pScrn, xf86CrtcPtr crtc, } static Bool +i830_display_overlay(ScrnInfoPtr pScrn, xf86CrtcPtr crtc, + int id, short width, short height, + int dstPitch, int x1, int y1, int x2, int y2, BoxPtr dstBox, + short src_w, short src_h, short drw_w, short drw_h) +{ + I830Ptr pI830 = I830PTR(pScrn); + I830PortPrivPtr pPriv = pI830->adaptor->pPortPrivates[0].ptr; + int tmp; + + OVERLAY_DEBUG("I830DisplayVideo: %dx%d (pitch %d)\n", width, height, + dstPitch); + +#if VIDEO_DEBUG + CompareOverlay(pI830, (uint32_t *) overlay, 0x100); +#endif + + /* + * If the video isn't visible on any CRTC, turn it off + */ + if (!crtc) + { + pPriv->current_crtc = NULL; + ums_overlay_off(pScrn); + return TRUE; + } + + i830_update_dst_box_to_crtc_coords(pScrn, crtc, dstBox); + + if (crtc->rotation & (RR_Rotate_90 | RR_Rotate_270)) { + tmp = width; + width = height; + height = tmp; + tmp = drw_w; + drw_w = drw_h; + drw_h = tmp; + tmp = src_w; + src_w = src_h; + src_h = tmp; + } + + return ums_overlay_put_image(pScrn, crtc, id, width, height, dstPitch, + x1, y1, x2, y2, dstBox, src_w, src_h, drw_w, drw_h); +} + +static Bool i830_clip_video_helper (ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, xf86CrtcPtr *crtc_ret, @@ -2606,7 +2636,7 @@ I830VideoBlockHandler(int i, pointer blockData, pointer pTimeout, /* Turn off the overlay */ OVERLAY_DEBUG("BLOCKHANDLER\n"); - i830_overlay_off (pScrn); + ums_overlay_off (pScrn); pPriv->videoStatus = FREE_TIMER; pPriv->freeTime = now + FREE_DELAY; |