1ab47cfaaSmrg/* 2ab47cfaaSmrg * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. 3ab47cfaaSmrg * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. 4ab47cfaaSmrg * 5ab47cfaaSmrg * Permission is hereby granted, free of charge, to any person obtaining a 6ab47cfaaSmrg * copy of this software and associated documentation files (the "Software"), 7ab47cfaaSmrg * to deal in the Software without restriction, including without limitation 8ab47cfaaSmrg * the rights to use, copy, modify, merge, publish, distribute, sub license, 9ab47cfaaSmrg * and/or sell copies of the Software, and to permit persons to whom the 10ab47cfaaSmrg * Software is furnished to do so, subject to the following conditions: 11ab47cfaaSmrg * 12ab47cfaaSmrg * The above copyright notice and this permission notice (including the 13ab47cfaaSmrg * next paragraph) shall be included in all copies or substantial portions 14ab47cfaaSmrg * of the Software. 15ab47cfaaSmrg * 16ab47cfaaSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17ab47cfaaSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18ab47cfaaSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 19ab47cfaaSmrg * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20ab47cfaaSmrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21ab47cfaaSmrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22ab47cfaaSmrg * DEALINGS IN THE SOFTWARE. 23ab47cfaaSmrg */ 24ab47cfaaSmrg 25ab47cfaaSmrg#ifdef HAVE_CONFIG_H 26ab47cfaaSmrg#include "config.h" 27ab47cfaaSmrg#endif 28ab47cfaaSmrg 29ab47cfaaSmrg#include "xf86.h" 30ab47cfaaSmrg#include "xf86_OSproc.h" 31ab47cfaaSmrg#include "compiler.h" 32ab47cfaaSmrg#include "xf86Pci.h" 33ab47cfaaSmrg#include "xf86fbman.h" 34ab47cfaaSmrg#include "regionstr.h" 35ab47cfaaSmrg 36ab47cfaaSmrg#include "savage_driver.h" 37ab47cfaaSmrg#include "savage_dri.h" 38ab47cfaaSmrg 39ab47cfaaSmrg#include "xf86xv.h" 40ab47cfaaSmrg#include "xf86xvmc.h" 41ab47cfaaSmrg#include <X11/extensions/Xv.h> 42ab47cfaaSmrg#include <X11/extensions/XvMC.h> 43aa9e3350Smrg#ifdef HAVE_XAA_H 44ab47cfaaSmrg#include "xaalocal.h" 45aa9e3350Smrg#endif 46ab47cfaaSmrg#include "dixstruct.h" 47ab47cfaaSmrg#include "fourcc.h" 48ab47cfaaSmrg 49ab47cfaaSmrg#define SAVAGE_MAX_SURFACES 5 50ab47cfaaSmrg#define SAVAGE_MAX_SUBPICTURES 1 51ab47cfaaSmrg 52ab47cfaaSmrg#define XVMC_IDCT_8BIT 0x80000000 53ab47cfaaSmrg 54ab47cfaaSmrg 55ab47cfaaSmrgint SAVAGEXvMCCreateContext (ScrnInfoPtr pScrn, XvMCContextPtr pContext, 56ab47cfaaSmrg int *num_priv, long **priv ); 57ab47cfaaSmrgvoid SAVAGEXvMCDestroyContext (ScrnInfoPtr pScrn, XvMCContextPtr pContext); 58ab47cfaaSmrg 59ab47cfaaSmrgint SAVAGEXvMCCreateSurface (ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf, 60ab47cfaaSmrg int *num_priv, long **priv ); 61ab47cfaaSmrgvoid SAVAGEXvMCDestroySurface (ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf); 62ab47cfaaSmrg 63ab47cfaaSmrgint SAVAGEXvMCCreateSubpicture (ScrnInfoPtr pScrn, XvMCSubpicturePtr pSurf, 64ab47cfaaSmrg int *num_priv, long **priv ); 65ab47cfaaSmrgvoid SAVAGEXvMCDestroySubpicture (ScrnInfoPtr pScrn, XvMCSubpicturePtr pSurf); 66ab47cfaaSmrg 67ab47cfaaSmrg 68ab47cfaaSmrgtypedef struct { 69ab47cfaaSmrg drm_context_t drmcontext; 70ab47cfaaSmrg unsigned int fbBase; 71ab47cfaaSmrg unsigned int MMIOHandle; 72ab47cfaaSmrg unsigned int MMIOSize; 73ab47cfaaSmrg unsigned int SurfaceHandle; 74ab47cfaaSmrg unsigned int SurfaceOffset; 75ab47cfaaSmrg unsigned int SurfaceSize; 76ab47cfaaSmrg unsigned int DCTBlockHandle; 77ab47cfaaSmrg unsigned int DCTBlockOffset; 78ab47cfaaSmrg unsigned int DCTBlockSize; 79ab47cfaaSmrg unsigned int ApertureHandle; 80ab47cfaaSmrg unsigned int ApertureSize; 81ab47cfaaSmrg unsigned int bitsPerPixel; 82ab47cfaaSmrg unsigned int frameX0; 83ab47cfaaSmrg unsigned int frameY0; 84ab47cfaaSmrg unsigned int IOBase; 85ab47cfaaSmrg unsigned int displayWidth; 86ab47cfaaSmrg char busIdString[10]; 87ab47cfaaSmrg char pad[2]; 88ab47cfaaSmrg} SAVAGEXvMCCreateContextRec; 89ab47cfaaSmrg 90ab47cfaaSmrg 91ab47cfaaSmrgstatic int yv12_subpicture_index_list[1] = 92ab47cfaaSmrg{ 93ab47cfaaSmrg FOURCC_IA44 94ab47cfaaSmrg}; 95ab47cfaaSmrg 96ab47cfaaSmrgstatic XF86MCImageIDList yv12_subpicture_list = 97ab47cfaaSmrg{ 98ab47cfaaSmrg 1, 99ab47cfaaSmrg yv12_subpicture_index_list 100ab47cfaaSmrg}; 101ab47cfaaSmrg 102ab47cfaaSmrgstatic XF86MCSurfaceInfoRec savage_YV12_mpg2_surface = 103ab47cfaaSmrg{ 104ab47cfaaSmrg FOURCC_YV12, 105ab47cfaaSmrg XVMC_CHROMA_FORMAT_420, 106ab47cfaaSmrg 0, 107ab47cfaaSmrg 720, 108ab47cfaaSmrg 576, 109ab47cfaaSmrg 720, 110ab47cfaaSmrg 576, 111ab47cfaaSmrg XVMC_MPEG_2, 112ab47cfaaSmrg XVMC_OVERLAID_SURFACE | XVMC_INTRA_UNSIGNED | XVMC_BACKEND_SUBPICTURE | XVMC_IDCT_8BIT, 113ab47cfaaSmrg &yv12_subpicture_list 114ab47cfaaSmrg}; 115ab47cfaaSmrg 116ab47cfaaSmrgstatic XF86MCSurfaceInfoPtr ppSI[1] = 117ab47cfaaSmrg{ 118ab47cfaaSmrg (XF86MCSurfaceInfoPtr)&savage_YV12_mpg2_surface, 119ab47cfaaSmrg}; 120ab47cfaaSmrg 121ab47cfaaSmrg/* List of subpicture types that we support */ 122ab47cfaaSmrgstatic XF86ImageRec ia44_subpicture = XVIMAGE_IA44; 123ab47cfaaSmrg 124ab47cfaaSmrgstatic XF86ImagePtr savage_subpicture_list[1] = 125ab47cfaaSmrg{ 126ab47cfaaSmrg (XF86ImagePtr)&ia44_subpicture, 127ab47cfaaSmrg}; 128ab47cfaaSmrg 129ab47cfaaSmrg/* Fill in the device dependent adaptor record. 130ab47cfaaSmrg * This is named "SAVAGE Video Overlay" because this code falls under the 1312b2b4fcbSmrg * XV extension, the name must match or it won't be used. 132ab47cfaaSmrg * 133ab47cfaaSmrg * Surface and Subpicture - see above 134ab47cfaaSmrg * Function pointers to functions below 135ab47cfaaSmrg */ 136ab47cfaaSmrgstatic XF86MCAdaptorRec pAdapt = 137ab47cfaaSmrg{ 138ab47cfaaSmrg "Savage Streams Engine", /* name */ 139ab47cfaaSmrg 1, /* num_surfaces */ 140ab47cfaaSmrg ppSI, /* surfaces */ 141ab47cfaaSmrg 1, /* num_subpictures */ 142ab47cfaaSmrg savage_subpicture_list, /* subpictures */ 143ab47cfaaSmrg (xf86XvMCCreateContextProcPtr)SAVAGEXvMCCreateContext, 144ab47cfaaSmrg (xf86XvMCDestroyContextProcPtr)SAVAGEXvMCDestroyContext, 145ab47cfaaSmrg (xf86XvMCCreateSurfaceProcPtr)SAVAGEXvMCCreateSurface, 146ab47cfaaSmrg (xf86XvMCDestroySurfaceProcPtr)SAVAGEXvMCDestroySurface, 147ab47cfaaSmrg (xf86XvMCCreateSubpictureProcPtr)SAVAGEXvMCCreateSubpicture, 148ab47cfaaSmrg (xf86XvMCDestroySubpictureProcPtr)SAVAGEXvMCDestroySubpicture 149ab47cfaaSmrg}; 150ab47cfaaSmrg 151ab47cfaaSmrgstatic XF86MCAdaptorPtr ppAdapt[1] = 152ab47cfaaSmrg{ 153ab47cfaaSmrg (XF86MCAdaptorPtr)&pAdapt 154ab47cfaaSmrg}; 155ab47cfaaSmrg 156ab47cfaaSmrg/************************************************************************** 157ab47cfaaSmrg * 158ab47cfaaSmrg * SAVAGEInitMC 159ab47cfaaSmrg * 1602b2b4fcbSmrg * Initialize the hardware motion compensation extension for this 161ab47cfaaSmrg * hardware. The initialization routines want the address of the pointers 162ab47cfaaSmrg * to the structures, not the address of the structures. This means we 163ab47cfaaSmrg * allocate (or create static?) the pointer memory and pass that 164ab47cfaaSmrg * address. This seems a little convoluted. 165ab47cfaaSmrg * 166ab47cfaaSmrg * We need to allocate memory for the device depended adaptor record. 167ab47cfaaSmrg * This is what holds the pointers to all our device functions. 168ab47cfaaSmrg * 169ab47cfaaSmrg * We need to map the overlay registers into the drm. 170ab47cfaaSmrg * 171ab47cfaaSmrg * We need to map the surfaces into the drm. 172ab47cfaaSmrg * 173ab47cfaaSmrg * Inputs: 174ab47cfaaSmrg * Screen pointer 175ab47cfaaSmrg * 176ab47cfaaSmrg * Outputs: 177ab47cfaaSmrg * None, this calls the device independent screen initialization 178ab47cfaaSmrg * function. 179ab47cfaaSmrg * 180ab47cfaaSmrg * Revisions: 181ab47cfaaSmrg * 182ab47cfaaSmrg **************************************************************************/ 183ab47cfaaSmrgBool SAVAGEInitMC(ScreenPtr pScreen) 184ab47cfaaSmrg{ 185aa9e3350Smrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 186ab47cfaaSmrg SavagePtr pSAVAGE = SAVPTR(pScrn); 187ab47cfaaSmrg DRIInfoPtr pDRIInfo = pSAVAGE->pDRIInfo; 188ab47cfaaSmrg SAVAGEDRIPtr pSAVAGEDriPriv = (SAVAGEDRIPtr)pDRIInfo->devPrivate; 189ab47cfaaSmrg int i; 190ab47cfaaSmrg unsigned int offset; 191ab47cfaaSmrg 192ab47cfaaSmrg /* Clear the Surface Allocation */ 193ab47cfaaSmrg for(i=0; i<SAVAGE_MAX_SURFACES; i++) { 194ab47cfaaSmrg pSAVAGE->surfaceAllocation[i] = 0; 195ab47cfaaSmrg } 196ab47cfaaSmrg 197ab47cfaaSmrg if(pSAVAGE->hwmcSize == 0) 198ab47cfaaSmrg { 199ab47cfaaSmrg xf86DrvMsg(X_ERROR, pScrn->scrnIndex, 200ab47cfaaSmrg "SAVAGEInitMC: There is not enough memory!\n"); 201ab47cfaaSmrg return FALSE; 202ab47cfaaSmrg } 203ab47cfaaSmrg 2048697ee19Smrg offset = pSAVAGE->hwmcOffset + pSAVAGE->FbRegion.base; 205ab47cfaaSmrg 206ab47cfaaSmrg if(drmAddMap(pSAVAGE->drmFD, offset, pSAVAGE->hwmcSize, 207ab47cfaaSmrg DRM_FRAME_BUFFER, 0, &pSAVAGEDriPriv->xvmcSurfHandle) < 0) 208ab47cfaaSmrg { 209ab47cfaaSmrg 210ab47cfaaSmrg xf86DrvMsg(X_ERROR, pScrn->scrnIndex, 211ab47cfaaSmrg "SAVAGEInitMC: Cannot add map to drm!\n"); 212ab47cfaaSmrg return FALSE; 213ab47cfaaSmrg } 214ab47cfaaSmrg 215ab47cfaaSmrg return xf86XvMCScreenInit(pScreen, 1, ppAdapt); 216ab47cfaaSmrg} 217ab47cfaaSmrg 218ab47cfaaSmrg/************************************************************************** 219ab47cfaaSmrg * 220ab47cfaaSmrg * SAVAGEXvMCCreateContext 221ab47cfaaSmrg * 222ab47cfaaSmrg * Some info about the private data: 223ab47cfaaSmrg * 224ab47cfaaSmrg * Set *num_priv to the number of 32bit words that make up the size of 225ab47cfaaSmrg * of the data that priv will point to. 226ab47cfaaSmrg * 227aa9e3350Smrg * *priv = (long *) calloc (elements, sizeof(element)) 228ab47cfaaSmrg * *num_priv = (elements * sizeof(element)) >> 2; 229ab47cfaaSmrg * 230ab47cfaaSmrg **************************************************************************/ 231ab47cfaaSmrg 232ab47cfaaSmrgint SAVAGEXvMCCreateContext (ScrnInfoPtr pScrn, XvMCContextPtr pContext, 233ab47cfaaSmrg int *num_priv, long **priv ) 234ab47cfaaSmrg{ 235ab47cfaaSmrg SavagePtr pSAVAGE = SAVPTR(pScrn); 236ab47cfaaSmrg DRIInfoPtr pDRIInfo = pSAVAGE->pDRIInfo; 237ab47cfaaSmrg SAVAGEDRIPtr pSAVAGEDriPriv = (SAVAGEDRIPtr)pDRIInfo->devPrivate; 238ab47cfaaSmrg SAVAGEDRIServerPrivatePtr pSAVAGEDRIServer = pSAVAGE->DRIServerInfo; 239ab47cfaaSmrg SAVAGEXvMCCreateContextRec *contextRec; 240ab47cfaaSmrg vgaHWPtr hwp = VGAHWPTR(pScrn); 241ab47cfaaSmrg 242ab47cfaaSmrg 243ab47cfaaSmrg if(!pSAVAGE->directRenderingEnabled) { 244ab47cfaaSmrg xf86DrvMsg(X_ERROR, pScrn->scrnIndex, 245ab47cfaaSmrg "SAVAGEXvMCCreateContext: Cannot use XvMC without DRI!\n"); 246ab47cfaaSmrg return BadAlloc; 247ab47cfaaSmrg } 248ab47cfaaSmrg 249ab47cfaaSmrg /* Context Already in use! */ 250ab47cfaaSmrg if(pSAVAGE->xvmcContext) { 251ab47cfaaSmrg xf86DrvMsg(X_WARNING, pScrn->scrnIndex, 252ab47cfaaSmrg "SAVAGEXvMCCreateContext: 2 XvMC Contexts Attempted, not supported.\n"); 253ab47cfaaSmrg return BadAlloc; 254ab47cfaaSmrg } 255ab47cfaaSmrg 256aa9e3350Smrg *priv = calloc(1,sizeof(SAVAGEXvMCCreateContextRec)); 257ab47cfaaSmrg contextRec = (SAVAGEXvMCCreateContextRec *)*priv; 258ab47cfaaSmrg 259ab47cfaaSmrg if(!*priv) { 260ab47cfaaSmrg *num_priv = 0; 261ab47cfaaSmrg return(BadAlloc); 262ab47cfaaSmrg } 263ab47cfaaSmrg 264ab47cfaaSmrg *num_priv = sizeof(SAVAGEXvMCCreateContextRec) >> 2; 265ab47cfaaSmrg 266ab47cfaaSmrg if(drmCreateContext(pSAVAGE->drmFD, &(contextRec->drmcontext) ) < 0) { 267ab47cfaaSmrg xf86DrvMsg(X_ERROR, pScrn->scrnIndex, 268ab47cfaaSmrg "SAVAGEXvMCCreateContext: Unable to create DRMContext!\n"); 269aa9e3350Smrg free(*priv); 270ab47cfaaSmrg return(BadAlloc); 271ab47cfaaSmrg } 272ab47cfaaSmrg 273ab47cfaaSmrg drmAuthMagic(pSAVAGE->drmFD, pContext->flags); 274ab47cfaaSmrg 275ab47cfaaSmrg pSAVAGE->xvmcContext = contextRec->drmcontext; 276ab47cfaaSmrg contextRec->fbBase = pScrn->memPhysBase; 277ab47cfaaSmrg 278ab47cfaaSmrg contextRec->MMIOHandle = pSAVAGEDRIServer->registers.handle; 279ab47cfaaSmrg contextRec->MMIOSize = pSAVAGEDRIServer->registers.size; 280ab47cfaaSmrg 281ab47cfaaSmrg contextRec->DCTBlockHandle = pSAVAGEDRIServer->agpTextures.handle; 282ab47cfaaSmrg contextRec->DCTBlockOffset = pSAVAGEDRIServer->agpTextures.offset; 283ab47cfaaSmrg contextRec->DCTBlockSize = pSAVAGEDRIServer->agpTextures.size; 284ab47cfaaSmrg 285ab47cfaaSmrg contextRec->SurfaceHandle = pSAVAGEDriPriv->xvmcSurfHandle; 286ab47cfaaSmrg contextRec->SurfaceOffset = pSAVAGE->hwmcOffset; 287ab47cfaaSmrg contextRec->SurfaceSize = pSAVAGE->hwmcSize; 288ab47cfaaSmrg 289ab47cfaaSmrg contextRec->ApertureHandle = pSAVAGEDriPriv->apertureHandle; 290ab47cfaaSmrg contextRec->ApertureSize = pSAVAGEDriPriv->apertureSize; 291ab47cfaaSmrg 292ab47cfaaSmrg contextRec->bitsPerPixel = pScrn->bitsPerPixel; 293ab47cfaaSmrg contextRec->frameX0 = pScrn->frameX0; 294ab47cfaaSmrg contextRec->frameY0 = pScrn->frameY0; 295ab47cfaaSmrg contextRec->IOBase = hwp->IOBase; 296ab47cfaaSmrg contextRec->displayWidth = pScrn->displayWidth; 297ab47cfaaSmrg 298ab47cfaaSmrg 299ab47cfaaSmrg strncpy (contextRec->busIdString, pDRIInfo->busIdString, 9); 300ab47cfaaSmrg 301ab47cfaaSmrg return Success; 302ab47cfaaSmrg} 303ab47cfaaSmrg 304ab47cfaaSmrg 305ab47cfaaSmrgint SAVAGEXvMCCreateSurface (ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf, 306ab47cfaaSmrg int *num_priv, long **priv ) 307ab47cfaaSmrg{ 308ab47cfaaSmrg SavagePtr pSAVAGE = SAVPTR(pScrn); 309ab47cfaaSmrg int i; 310ab47cfaaSmrg /* This size is used for flip, mixer, subpicture and palette buffers*/ 311ab47cfaaSmrg unsigned int offset = ((786*576*2 + 2048)*5 + 2048) & 0xfffff800; 312ab47cfaaSmrg 313aa9e3350Smrg *priv = (long *)calloc(2,sizeof(long)); 314ab47cfaaSmrg 315ab47cfaaSmrg if(!*priv) { 316ab47cfaaSmrg xf86DrvMsg(X_ERROR, pScrn->scrnIndex, 317ab47cfaaSmrg "SAVAGEXvMCCreateSurface: Unable to allocate memory!\n"); 318ab47cfaaSmrg *num_priv = 0; 319ab47cfaaSmrg return (BadAlloc); 320ab47cfaaSmrg } 321ab47cfaaSmrg *num_priv = 1; 322ab47cfaaSmrg 323ab47cfaaSmrg /* Surface Arrangement is different based on 6 or 7 Surfaces */ 324ab47cfaaSmrg for(i = 0; i < SAVAGE_MAX_SURFACES; i++) { 325ab47cfaaSmrg if(!pSAVAGE->surfaceAllocation[i]) { 326ab47cfaaSmrg pSAVAGE->surfaceAllocation[i] = pSurf->surface_id; 327ab47cfaaSmrg (*priv)[0] = offset + (576 * 786 * 2 + 2048) * i; 328ab47cfaaSmrg /* UV data starts at 0 offset, each set is 288k * */ 329ab47cfaaSmrg return Success; 330ab47cfaaSmrg } 331ab47cfaaSmrg } 332ab47cfaaSmrg 333ab47cfaaSmrg (*priv)[0] = 0; 334ab47cfaaSmrg return BadAlloc; 335ab47cfaaSmrg} 336ab47cfaaSmrg 337ab47cfaaSmrgint SAVAGEXvMCCreateSubpicture (ScrnInfoPtr pScrn, XvMCSubpicturePtr pSubp, 338ab47cfaaSmrg int *num_priv, long **priv ) 339ab47cfaaSmrg{ 340ab47cfaaSmrg SavagePtr pSAVAGE = SAVPTR(pScrn); 341ab47cfaaSmrg int i; 342ab47cfaaSmrg 343aa9e3350Smrg *priv = (long *)calloc(1,sizeof(long)); 344ab47cfaaSmrg 345ab47cfaaSmrg if(!*priv) { 346ab47cfaaSmrg xf86DrvMsg(X_ERROR, pScrn->scrnIndex, 347ab47cfaaSmrg "SAVAGEXvMCCreateSubpicture: Unable to allocate memory!\n"); 348ab47cfaaSmrg *num_priv = 0; 349ab47cfaaSmrg return (BadAlloc); 350ab47cfaaSmrg } 351ab47cfaaSmrg 352ab47cfaaSmrg *num_priv = 1; 353ab47cfaaSmrg 354ab47cfaaSmrg for(i = SAVAGE_MAX_SURFACES; i < SAVAGE_MAX_SURFACES + SAVAGE_MAX_SUBPICTURES; i++) { 355ab47cfaaSmrg if(!pSAVAGE->surfaceAllocation[i]) { 356ab47cfaaSmrg pSAVAGE->surfaceAllocation[i] = pSubp->subpicture_id; 357ab47cfaaSmrg (*priv)[0] = ( 576*1024 * i); 358ab47cfaaSmrg return Success; 359ab47cfaaSmrg } 360ab47cfaaSmrg } 361ab47cfaaSmrg 362ab47cfaaSmrg (*priv)[0] = 0; 363ab47cfaaSmrg return BadAlloc; 364ab47cfaaSmrg} 365ab47cfaaSmrg 366ab47cfaaSmrgvoid SAVAGEXvMCDestroyContext (ScrnInfoPtr pScrn, XvMCContextPtr pContext) 367ab47cfaaSmrg{ 368ab47cfaaSmrg SavagePtr pSAVAGE = SAVPTR(pScrn); 369ab47cfaaSmrg 370ab47cfaaSmrg drmDestroyContext(pSAVAGE->drmFD,pSAVAGE->xvmcContext); 371ab47cfaaSmrg pSAVAGE->xvmcContext = 0; 372ab47cfaaSmrg} 373ab47cfaaSmrg 374ab47cfaaSmrgvoid SAVAGEXvMCDestroySurface (ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf) 375ab47cfaaSmrg{ 376ab47cfaaSmrg SavagePtr pSAVAGE = SAVPTR(pScrn); 377ab47cfaaSmrg int i; 378ab47cfaaSmrg 379ab47cfaaSmrg for(i=0; i<SAVAGE_MAX_SURFACES; i++) { 380ab47cfaaSmrg if(pSAVAGE->surfaceAllocation[i] == pSurf->surface_id) { 381ab47cfaaSmrg pSAVAGE->surfaceAllocation[i] = 0; 382ab47cfaaSmrg return; 383ab47cfaaSmrg } 384ab47cfaaSmrg } 385ab47cfaaSmrg return; 386ab47cfaaSmrg} 387ab47cfaaSmrg 388ab47cfaaSmrgvoid SAVAGEXvMCDestroySubpicture (ScrnInfoPtr pScrn, XvMCSubpicturePtr pSubp) 389ab47cfaaSmrg{ 390ab47cfaaSmrg SavagePtr pSAVAGE = SAVPTR(pScrn); 391ab47cfaaSmrg int i; 392ab47cfaaSmrg 393ab47cfaaSmrg for(i = SAVAGE_MAX_SURFACES; i < SAVAGE_MAX_SURFACES + SAVAGE_MAX_SUBPICTURES; i++) { 394ab47cfaaSmrg if(pSAVAGE->surfaceAllocation[i] == pSubp->subpicture_id) { 395ab47cfaaSmrg pSAVAGE->surfaceAllocation[i] = 0; 396ab47cfaaSmrg return; 397ab47cfaaSmrg } 398ab47cfaaSmrg } 399ab47cfaaSmrg return; 400ab47cfaaSmrg} 401ab47cfaaSmrg 402ab47cfaaSmrg 403ab47cfaaSmrg 404ab47cfaaSmrg 405ab47cfaaSmrg 406ab47cfaaSmrg 407