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