1fda9279dSmrg/* 2fda9279dSmrg * Copyright 2007 Arthur Huillet 3fda9279dSmrg * 4fda9279dSmrg * Permission is hereby granted, free of charge, to any person obtaining a 5fda9279dSmrg * copy of this software and associated documentation files (the "Software"), 6fda9279dSmrg * to deal in the Software without restriction, including without limitation 7fda9279dSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8fda9279dSmrg * and/or sell copies of the Software, and to permit persons to whom the 9fda9279dSmrg * Software is furnished to do so, subject to the following conditions: 10fda9279dSmrg * 11fda9279dSmrg * The above copyright notice and this permission notice shall be included in 12fda9279dSmrg * all copies or substantial portions of the Software. 13fda9279dSmrg * 14fda9279dSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15fda9279dSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16fda9279dSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17fda9279dSmrg * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18fda9279dSmrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19fda9279dSmrg * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20fda9279dSmrg * SOFTWARE. 21fda9279dSmrg */ 22fda9279dSmrg 23fda9279dSmrg#ifdef HAVE_CONFIG_H 24fda9279dSmrg#include "config.h" 25fda9279dSmrg#endif 26fda9279dSmrg 27479f40c1Smrg#include "xorg-config.h" 28fda9279dSmrg#include "xf86xv.h" 29fda9279dSmrg#include <X11/extensions/Xv.h> 30fda9279dSmrg#include "exa.h" 31fda9279dSmrg#include "damage.h" 32fda9279dSmrg#include "dixstruct.h" 33fda9279dSmrg#include "fourcc.h" 34fda9279dSmrg 35fda9279dSmrg#include "nv_include.h" 36fda9279dSmrg#include "nv_dma.h" 37fda9279dSmrg 38fda9279dSmrgextern Atom xvBrightness, xvColorKey, xvAutopaintColorKey, xvSetDefaults; 39fda9279dSmrg 40fda9279dSmrgvoid 41fda9279dSmrgNV04PutOverlayImage(ScrnInfoPtr pScrn, struct nouveau_bo *src, int offset, 42fda9279dSmrg int id, int dstPitch, BoxPtr dstBox, int x1, int y1, 43fda9279dSmrg int x2, int y2, short width, short height, 44fda9279dSmrg short src_w, short src_h, short drw_w, short drw_h, 45fda9279dSmrg RegionPtr clipBoxes) 46fda9279dSmrg{ 47fda9279dSmrg NVPtr pNv = NVPTR(pScrn); 48fda9279dSmrg NVPortPrivPtr pPriv = GET_OVERLAY_PRIVATE(pNv); 49fda9279dSmrg#if NVOVL_SUPPORT 50fda9279dSmrg xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); 51fda9279dSmrg xf86CrtcPtr crtc = xf86_config->crtc[pPriv->overlayCRTC]; 52fda9279dSmrg 53fda9279dSmrg /*This may not work with NV04 overlay according to rivatv source*/ 54fda9279dSmrg if (crtc->mode.Flags & V_DBLSCAN) { 55fda9279dSmrg dstBox->y1 <<= 1; 56fda9279dSmrg dstBox->y2 <<= 1; 57fda9279dSmrg drw_h <<= 1; 58fda9279dSmrg } 59fda9279dSmrg 60fda9279dSmrg /* paint the color key */ 61fda9279dSmrg if(pPriv->autopaintColorKey && (pPriv->grabbedByV4L || 62fda9279dSmrg !REGION_EQUAL(pScrn->pScreen, &pPriv->clip, clipBoxes))) { 63fda9279dSmrg /* we always paint V4L's color key */ 64fda9279dSmrg if (!pPriv->grabbedByV4L) 65fda9279dSmrg REGION_COPY(pScrn->pScreen, &pPriv->clip, clipBoxes); 66fda9279dSmrg { 67fda9279dSmrg xf86XVFillKeyHelper(pScrn->pScreen, pPriv->colorKey, clipBoxes); 68fda9279dSmrg } 69fda9279dSmrg } 70fda9279dSmrg 71fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_OE_STATE, 0); 72fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_SU_STATE, 0); 73fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_RM_STATE, 0); 74fda9279dSmrg 75fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_BUFF0_START_ADDRESS, 76fda9279dSmrg src->offset + offset); 77fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_BUFF0_START_ADDRESS + 4, 78fda9279dSmrg src->offset + offset); 79fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_BUFF0_PITCH_LENGTH, dstPitch); 80fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_BUFF0_PITCH_LENGTH + 4, dstPitch); 81fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_BUFF0_OFFSET, 0); 82fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_BUFF0_OFFSET + 4, 0); 83fda9279dSmrg 84fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_WINDOW_START, (dstBox->y1 << 16) | dstBox->x1); 85fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_WINDOW_SIZE, ((dstBox->y2 - dstBox->y1) << 16) | 86fda9279dSmrg (dstBox->x2 - dstBox->x1)); 87fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_STEP_SIZE, (uint32_t)(((src_h - 1) << 11) / (drw_h - 1)) << 16 | (uint32_t)(((src_w - 1) << 11) / (drw_w - 1))); 88fda9279dSmrg 89fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_RED_CSC_OFFSET, (0x69 - (pPriv->brightness * 62 / 512))); 90fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_GREEN_CSC_OFFSET, (0x3e + (pPriv->brightness * 62 / 512))); 91fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_BLUE_CSC_OFFSET, (0x89 - (pPriv->brightness * 62 / 512))); 92fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_CSC_ADJUST, 0x0); 93fda9279dSmrg 94fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_CONTROL_Y, 0x001); /* (BLUR_ON, LINE_HALF) */ 95fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_CONTROL_X, 0x111); /* (WEIGHT_HEAVY, SHARPENING_ON, SMOOTHING_ON) */ 96fda9279dSmrg 97fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_FIFO_BURST_LENGTH, 0x03); 98fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_FIFO_THRES_SIZE, 0x38); 99fda9279dSmrg 100fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_KEY, pPriv->colorKey); 101fda9279dSmrg 102fda9279dSmrg /* 0x1 Video on 103fda9279dSmrg 0x10 Use colorkey 104fda9279dSmrg 0x100 Format YUY2 */ 105fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_OVERLAY, 0x111); 106fda9279dSmrg 107fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_SU_STATE, (nvReadVIDEO(pNv, NV_PVIDEO_SU_STATE) ^ (1 << 16))); 108fda9279dSmrg#endif 109fda9279dSmrg 110fda9279dSmrg pPriv->videoStatus = CLIENT_VIDEO_ON; 111fda9279dSmrg} 112fda9279dSmrg 113fda9279dSmrg/** 114fda9279dSmrg * NV04SetOverlayPortAttribute 115fda9279dSmrg * sets the attribute "attribute" of port "data" to value "value" 116fda9279dSmrg * calls NVResetVideo(pScrn) to apply changes to hardware 117fda9279dSmrg * 118fda9279dSmrg * @param pScrenInfo 119fda9279dSmrg * @param attribute attribute to set 120fda9279dSmrg * @param value value to which attribute is to be set 121fda9279dSmrg * @param data port from which the attribute is to be set 122fda9279dSmrg * 123fda9279dSmrg * @return Success, if setting is successful 124fda9279dSmrg * BadValue/BadMatch, if value/attribute are invalid 125fda9279dSmrg * @see NVResetVideo(ScrnInfoPtr pScrn) 126fda9279dSmrg */ 127fda9279dSmrgint 128fda9279dSmrgNV04SetOverlayPortAttribute(ScrnInfoPtr pScrn, Atom attribute, 129fda9279dSmrg INT32 value, pointer data) 130fda9279dSmrg{ 131fda9279dSmrg NVPortPrivPtr pPriv = (NVPortPrivPtr)data; 132fda9279dSmrg 133fda9279dSmrg if (attribute == xvBrightness) { 134fda9279dSmrg if ((value < -512) || (value > 512)) 135fda9279dSmrg return BadValue; 136fda9279dSmrg pPriv->brightness = value; 137fda9279dSmrg } else 138fda9279dSmrg if (attribute == xvColorKey) { 139fda9279dSmrg pPriv->colorKey = value; 140fda9279dSmrg REGION_EMPTY(pScrn->pScreen, &pPriv->clip); 141fda9279dSmrg } else 142fda9279dSmrg if (attribute == xvAutopaintColorKey) { 143fda9279dSmrg if ((value < 0) || (value > 1)) 144fda9279dSmrg return BadValue; 145fda9279dSmrg pPriv->autopaintColorKey = value; 146fda9279dSmrg } else 147fda9279dSmrg if (attribute == xvSetDefaults) { 148fda9279dSmrg NVSetPortDefaults(pScrn, pPriv); 149fda9279dSmrg } else 150fda9279dSmrg return BadMatch; 151fda9279dSmrg 152fda9279dSmrg return Success; 153fda9279dSmrg} 154fda9279dSmrg 155fda9279dSmrg/** 156fda9279dSmrg * NV04GetOverlayPortAttribute 157fda9279dSmrg * 158fda9279dSmrg * @param pScrn unused 159fda9279dSmrg * @param attribute attribute to be read 160fda9279dSmrg * @param value value of attribute will be stored in this pointer 161fda9279dSmrg * @param data port from which attribute will be read 162fda9279dSmrg * @return Success, if queried attribute exists 163fda9279dSmrg */ 164fda9279dSmrgint 165fda9279dSmrgNV04GetOverlayPortAttribute(ScrnInfoPtr pScrn, Atom attribute, 166fda9279dSmrg INT32 *value, pointer data) 167fda9279dSmrg{ 168fda9279dSmrg NVPortPrivPtr pPriv = (NVPortPrivPtr)data; 169fda9279dSmrg 170fda9279dSmrg if (attribute == xvBrightness) 171fda9279dSmrg *value = pPriv->brightness; 172fda9279dSmrg else if (attribute == xvColorKey) 173fda9279dSmrg *value = pPriv->colorKey; 174fda9279dSmrg else if (attribute == xvAutopaintColorKey) 175fda9279dSmrg *value = (pPriv->autopaintColorKey) ? 1 : 0; 176fda9279dSmrg else 177fda9279dSmrg return BadMatch; 178fda9279dSmrg 179fda9279dSmrg return Success; 180fda9279dSmrg} 181fda9279dSmrg 182fda9279dSmrg/** 183fda9279dSmrg * NV04StopOverlay 184fda9279dSmrg * Tell the hardware to stop the overlay 185fda9279dSmrg */ 186fda9279dSmrgvoid 187fda9279dSmrgNV04StopOverlay (ScrnInfoPtr pScrn) 188fda9279dSmrg{ 189fda9279dSmrg#ifdef NVOVL_SUPPORT 190fda9279dSmrg NVPtr pNv = NVPTR(pScrn); 191fda9279dSmrg 192fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_OVERLAY, nvReadVIDEO(pNv, NV_PVIDEO_OVERLAY) &~ 0x1); 193fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_OE_STATE, 0); 194fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_SU_STATE, 0); 195fda9279dSmrg nvWriteVIDEO(pNv, NV_PVIDEO_RM_STATE, 0); 196fda9279dSmrg#endif 197fda9279dSmrg} 198fda9279dSmrg 199