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