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