1/**************************************************************************
2 *
3 * Copyright 2010 Younes Manton & Thomas Balling Sørensen.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28#ifndef VDPAU_PRIVATE_H
29#define VDPAU_PRIVATE_H
30
31#include <assert.h>
32
33#include <vdpau/vdpau.h>
34#include <vdpau/vdpau_x11.h>
35
36#include "pipe/p_compiler.h"
37#include "pipe/p_video_codec.h"
38
39#include "state_tracker/vdpau_interop.h"
40#include "state_tracker/vdpau_dmabuf.h"
41#include "state_tracker/vdpau_funcs.h"
42
43#include "util/u_debug.h"
44#include "util/u_rect.h"
45#include "os/os_thread.h"
46
47#include "vl/vl_video_buffer.h"
48#include "vl/vl_bicubic_filter.h"
49#include "vl/vl_compositor.h"
50#include "vl/vl_csc.h"
51#include "vl/vl_deint_filter.h"
52#include "vl/vl_matrix_filter.h"
53#include "vl/vl_median_filter.h"
54#include "vl/vl_winsys.h"
55
56/* Full VDPAU API documentation available at :
57 * ftp://download.nvidia.com/XFree86/vdpau/doxygen/html/index.html */
58
59#define INFORMATION G3DVL VDPAU Driver Shared Library version VER_MAJOR.VER_MINOR
60#define QUOTEME(x) #x
61#define TOSTRING(x) QUOTEME(x)
62#define INFORMATION_STRING TOSTRING(INFORMATION)
63
64static inline enum pipe_video_chroma_format
65ChromaToPipe(VdpChromaType vdpau_type)
66{
67   switch (vdpau_type) {
68      case VDP_CHROMA_TYPE_420:
69         return PIPE_VIDEO_CHROMA_FORMAT_420;
70      case VDP_CHROMA_TYPE_422:
71         return PIPE_VIDEO_CHROMA_FORMAT_422;
72      case VDP_CHROMA_TYPE_444:
73         return PIPE_VIDEO_CHROMA_FORMAT_444;
74      default:
75         assert(0);
76   }
77
78   return -1;
79}
80
81static inline VdpChromaType
82PipeToChroma(enum pipe_video_chroma_format pipe_type)
83{
84   switch (pipe_type) {
85      case PIPE_VIDEO_CHROMA_FORMAT_420:
86         return VDP_CHROMA_TYPE_420;
87      case PIPE_VIDEO_CHROMA_FORMAT_422:
88         return VDP_CHROMA_TYPE_422;
89      case PIPE_VIDEO_CHROMA_FORMAT_444:
90         return VDP_CHROMA_TYPE_444;
91      default:
92         assert(0);
93   }
94
95   return -1;
96}
97
98static inline enum pipe_video_chroma_format
99FormatYCBCRToPipeChroma(VdpYCbCrFormat vdpau_format)
100{
101   switch (vdpau_format) {
102      case VDP_YCBCR_FORMAT_NV12:
103         return PIPE_VIDEO_CHROMA_FORMAT_420;
104      case VDP_YCBCR_FORMAT_YV12:
105         return PIPE_VIDEO_CHROMA_FORMAT_420;
106      case VDP_YCBCR_FORMAT_UYVY:
107         return PIPE_VIDEO_CHROMA_FORMAT_422;
108      case VDP_YCBCR_FORMAT_YUYV:
109         return PIPE_VIDEO_CHROMA_FORMAT_422;
110      case VDP_YCBCR_FORMAT_Y8U8V8A8:
111         return PIPE_VIDEO_CHROMA_FORMAT_444;
112      case VDP_YCBCR_FORMAT_V8U8Y8A8:
113         return PIPE_VIDEO_CHROMA_FORMAT_444;
114      default:
115         assert(0);
116   }
117
118   return PIPE_FORMAT_NONE;
119}
120
121static inline enum pipe_format
122FormatYCBCRToPipe(VdpYCbCrFormat vdpau_format)
123{
124   switch (vdpau_format) {
125      case VDP_YCBCR_FORMAT_NV12:
126         return PIPE_FORMAT_NV12;
127      case VDP_YCBCR_FORMAT_YV12:
128         return PIPE_FORMAT_YV12;
129      case VDP_YCBCR_FORMAT_UYVY:
130         return PIPE_FORMAT_UYVY;
131      case VDP_YCBCR_FORMAT_YUYV:
132         return PIPE_FORMAT_YUYV;
133      case VDP_YCBCR_FORMAT_Y8U8V8A8:
134         return PIPE_FORMAT_R8G8B8A8_UNORM;
135      case VDP_YCBCR_FORMAT_V8U8Y8A8:
136         return PIPE_FORMAT_B8G8R8A8_UNORM;
137      default:
138         assert(0);
139   }
140
141   return PIPE_FORMAT_NONE;
142}
143
144static inline VdpYCbCrFormat
145PipeToFormatYCBCR(enum pipe_format p_format)
146{
147   switch (p_format) {
148      case PIPE_FORMAT_NV12:
149         return VDP_YCBCR_FORMAT_NV12;
150      case PIPE_FORMAT_YV12:
151         return VDP_YCBCR_FORMAT_YV12;
152      case PIPE_FORMAT_UYVY:
153         return VDP_YCBCR_FORMAT_UYVY;
154      case PIPE_FORMAT_YUYV:
155         return VDP_YCBCR_FORMAT_YUYV;
156      case PIPE_FORMAT_R8G8B8A8_UNORM:
157        return VDP_YCBCR_FORMAT_Y8U8V8A8;
158      case PIPE_FORMAT_B8G8R8A8_UNORM:
159         return VDP_YCBCR_FORMAT_V8U8Y8A8;
160      default:
161         assert(0);
162   }
163
164   return -1;
165}
166
167static inline VdpRGBAFormat
168PipeToFormatRGBA(enum pipe_format p_format)
169{
170   switch (p_format) {
171      case PIPE_FORMAT_A8_UNORM:
172         return VDP_RGBA_FORMAT_A8;
173      case PIPE_FORMAT_B10G10R10A2_UNORM:
174         return VDP_RGBA_FORMAT_B10G10R10A2;
175      case PIPE_FORMAT_B8G8R8A8_UNORM:
176         return VDP_RGBA_FORMAT_B8G8R8A8;
177      case PIPE_FORMAT_R10G10B10A2_UNORM:
178         return VDP_RGBA_FORMAT_R10G10B10A2;
179      case PIPE_FORMAT_R8G8B8A8_UNORM:
180         return VDP_RGBA_FORMAT_R8G8B8A8;
181      default:
182         assert(0);
183   }
184
185   return -1;
186}
187
188static inline enum pipe_format
189FormatIndexedToPipe(VdpRGBAFormat vdpau_format)
190{
191   switch (vdpau_format) {
192      case VDP_INDEXED_FORMAT_A4I4:
193         return PIPE_FORMAT_R4A4_UNORM;
194      case VDP_INDEXED_FORMAT_I4A4:
195         return PIPE_FORMAT_A4R4_UNORM;
196      case VDP_INDEXED_FORMAT_A8I8:
197         return PIPE_FORMAT_A8R8_UNORM;
198      case VDP_INDEXED_FORMAT_I8A8:
199         return PIPE_FORMAT_R8A8_UNORM;
200      default:
201         assert(0);
202   }
203
204   return PIPE_FORMAT_NONE;
205}
206
207static inline enum pipe_format
208FormatColorTableToPipe(VdpColorTableFormat vdpau_format)
209{
210   switch(vdpau_format) {
211      case VDP_COLOR_TABLE_FORMAT_B8G8R8X8:
212         return PIPE_FORMAT_B8G8R8X8_UNORM;
213      default:
214         assert(0);
215   }
216
217   return PIPE_FORMAT_NONE;
218}
219
220static inline enum pipe_video_profile
221ProfileToPipe(VdpDecoderProfile vdpau_profile)
222{
223   switch (vdpau_profile) {
224      case VDP_DECODER_PROFILE_MPEG1:
225         return PIPE_VIDEO_PROFILE_MPEG1;
226      case VDP_DECODER_PROFILE_MPEG2_SIMPLE:
227         return PIPE_VIDEO_PROFILE_MPEG2_SIMPLE;
228      case VDP_DECODER_PROFILE_MPEG2_MAIN:
229         return PIPE_VIDEO_PROFILE_MPEG2_MAIN;
230      case VDP_DECODER_PROFILE_H264_BASELINE:
231         return PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE;
232      case VDP_DECODER_PROFILE_H264_CONSTRAINED_BASELINE:
233         return PIPE_VIDEO_PROFILE_MPEG4_AVC_CONSTRAINED_BASELINE;
234      case VDP_DECODER_PROFILE_H264_MAIN:
235         return PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN;
236      case VDP_DECODER_PROFILE_H264_HIGH:
237         return PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH;
238      case VDP_DECODER_PROFILE_MPEG4_PART2_SP:
239         return PIPE_VIDEO_PROFILE_MPEG4_SIMPLE;
240      case VDP_DECODER_PROFILE_MPEG4_PART2_ASP:
241         return PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE;
242      case VDP_DECODER_PROFILE_VC1_SIMPLE:
243         return PIPE_VIDEO_PROFILE_VC1_SIMPLE;
244      case VDP_DECODER_PROFILE_VC1_MAIN:
245         return PIPE_VIDEO_PROFILE_VC1_MAIN;
246      case VDP_DECODER_PROFILE_VC1_ADVANCED:
247         return PIPE_VIDEO_PROFILE_VC1_ADVANCED;
248      case VDP_DECODER_PROFILE_HEVC_MAIN:
249         return PIPE_VIDEO_PROFILE_HEVC_MAIN;
250      case VDP_DECODER_PROFILE_HEVC_MAIN_10:
251         return PIPE_VIDEO_PROFILE_HEVC_MAIN_10;
252      case VDP_DECODER_PROFILE_HEVC_MAIN_STILL:
253         return PIPE_VIDEO_PROFILE_HEVC_MAIN_STILL;
254      case VDP_DECODER_PROFILE_HEVC_MAIN_12:
255         return PIPE_VIDEO_PROFILE_HEVC_MAIN_12;
256      case VDP_DECODER_PROFILE_HEVC_MAIN_444:
257         return PIPE_VIDEO_PROFILE_HEVC_MAIN_444;
258      default:
259         return PIPE_VIDEO_PROFILE_UNKNOWN;
260   }
261}
262
263static inline VdpDecoderProfile
264PipeToProfile(enum pipe_video_profile p_profile)
265{
266   switch (p_profile) {
267      case PIPE_VIDEO_PROFILE_MPEG1:
268         return VDP_DECODER_PROFILE_MPEG1;
269      case PIPE_VIDEO_PROFILE_MPEG2_SIMPLE:
270         return VDP_DECODER_PROFILE_MPEG2_SIMPLE;
271      case PIPE_VIDEO_PROFILE_MPEG2_MAIN:
272         return VDP_DECODER_PROFILE_MPEG2_MAIN;
273      case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE:
274         return VDP_DECODER_PROFILE_H264_BASELINE;
275      case PIPE_VIDEO_PROFILE_MPEG4_AVC_CONSTRAINED_BASELINE:
276         return VDP_DECODER_PROFILE_H264_CONSTRAINED_BASELINE;
277      case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN:
278         return VDP_DECODER_PROFILE_H264_MAIN;
279      case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH:
280         return VDP_DECODER_PROFILE_H264_HIGH;
281      case PIPE_VIDEO_PROFILE_MPEG4_SIMPLE:
282         return VDP_DECODER_PROFILE_MPEG4_PART2_SP;
283      case PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE:
284         return VDP_DECODER_PROFILE_MPEG4_PART2_ASP;
285      case PIPE_VIDEO_PROFILE_VC1_SIMPLE:
286         return VDP_DECODER_PROFILE_VC1_SIMPLE;
287      case PIPE_VIDEO_PROFILE_VC1_MAIN:
288         return VDP_DECODER_PROFILE_VC1_MAIN;
289      case PIPE_VIDEO_PROFILE_VC1_ADVANCED:
290         return VDP_DECODER_PROFILE_VC1_ADVANCED;
291      case PIPE_VIDEO_PROFILE_HEVC_MAIN:
292         return VDP_DECODER_PROFILE_HEVC_MAIN;
293      case PIPE_VIDEO_PROFILE_HEVC_MAIN_10:
294         return VDP_DECODER_PROFILE_HEVC_MAIN_10;
295      case PIPE_VIDEO_PROFILE_HEVC_MAIN_STILL:
296         return VDP_DECODER_PROFILE_HEVC_MAIN_STILL;
297      case PIPE_VIDEO_PROFILE_HEVC_MAIN_12:
298         return VDP_DECODER_PROFILE_HEVC_MAIN_12;
299      case PIPE_VIDEO_PROFILE_HEVC_MAIN_444:
300         return VDP_DECODER_PROFILE_HEVC_MAIN_444;
301      default:
302         assert(0);
303         return -1;
304   }
305}
306
307static inline struct u_rect *
308RectToPipe(const VdpRect *src, struct u_rect *dst)
309{
310   if (src) {
311      dst->x0 = src->x0;
312      dst->y0 = src->y0;
313      dst->x1 = src->x1;
314      dst->y1 = src->y1;
315      return dst;
316   }
317   return NULL;
318}
319
320static inline struct pipe_box
321RectToPipeBox(const VdpRect *rect, struct pipe_resource *res)
322{
323   struct pipe_box box;
324
325   box.x = 0;
326   box.y = 0;
327   box.z = 0;
328   box.width = res->width0;
329   box.height = res->height0;
330   box.depth = 1;
331
332   if (rect) {
333      box.x = MIN2(rect->x0, rect->x1);
334      box.y = MIN2(rect->y0, rect->y1);
335      box.width = abs(rect->x1 - rect->x0);
336      box.height = abs(rect->y1 - rect->y0);
337   }
338
339   return box;
340}
341
342static inline bool
343CheckSurfaceParams(struct pipe_screen *screen,
344                   const struct pipe_resource *templ)
345{
346   return screen->is_format_supported(screen, templ->format, templ->target,
347                                      templ->nr_samples,
348                                      templ->nr_storage_samples, templ->bind);
349}
350
351typedef struct
352{
353   struct pipe_reference reference;
354   struct vl_screen *vscreen;
355   struct pipe_context *context;
356   struct vl_compositor compositor;
357   struct pipe_sampler_view *dummy_sv;
358   mtx_t mutex;
359} vlVdpDevice;
360
361typedef struct
362{
363   vlVdpDevice *device;
364   struct vl_compositor_state cstate;
365
366   struct {
367       bool supported, enabled;
368       float luma_min, luma_max;
369   } luma_key;
370
371   struct {
372	  bool supported, enabled, spatial;
373	  struct vl_deint_filter *filter;
374   } deint;
375
376   struct {
377	  bool supported, enabled;
378	  struct vl_bicubic_filter *filter;
379   } bicubic;
380
381   struct {
382      bool supported, enabled;
383      unsigned level;
384      struct vl_median_filter *filter;
385   } noise_reduction;
386
387   struct {
388      bool supported, enabled;
389      float value;
390      struct vl_matrix_filter *filter;
391   } sharpness;
392
393   unsigned video_width, video_height;
394   enum pipe_video_chroma_format chroma_format;
395   unsigned max_layers, skip_chroma_deint;
396
397   bool custom_csc;
398   vl_csc_matrix csc;
399} vlVdpVideoMixer;
400
401typedef struct
402{
403   vlVdpDevice *device;
404   struct pipe_video_buffer templat, *video_buffer;
405} vlVdpSurface;
406
407typedef struct
408{
409   vlVdpDevice *device;
410   struct pipe_sampler_view *sampler_view;
411} vlVdpBitmapSurface;
412
413typedef uint64_t vlVdpTime;
414
415typedef struct
416{
417   vlVdpDevice *device;
418   struct pipe_surface *surface;
419   struct pipe_sampler_view *sampler_view;
420   struct pipe_fence_handle *fence;
421   struct vl_compositor_state cstate;
422   struct u_rect dirty_area;
423   bool send_to_X;
424} vlVdpOutputSurface;
425
426typedef struct
427{
428   vlVdpDevice *device;
429   Drawable drawable;
430} vlVdpPresentationQueueTarget;
431
432typedef struct
433{
434   vlVdpDevice *device;
435   Drawable drawable;
436   struct vl_compositor_state cstate;
437   vlVdpOutputSurface *last_surf;
438} vlVdpPresentationQueue;
439
440typedef struct
441{
442   vlVdpDevice *device;
443   mtx_t mutex;
444   struct pipe_video_codec *decoder;
445} vlVdpDecoder;
446
447typedef uint32_t vlHandle;
448
449boolean vlCreateHTAB(void);
450void vlDestroyHTAB(void);
451vlHandle vlAddDataHTAB(void *data);
452void* vlGetDataHTAB(vlHandle handle);
453void vlRemoveDataHTAB(vlHandle handle);
454
455boolean vlGetFuncFTAB(VdpFuncId function_id, void **func);
456
457/* Public functions */
458VdpDeviceCreateX11 vdp_imp_device_create_x11;
459
460void vlVdpDefaultSamplerViewTemplate(struct pipe_sampler_view *templ, struct pipe_resource *res);
461
462/* Internal function pointers */
463VdpGetErrorString vlVdpGetErrorString;
464VdpDeviceDestroy vlVdpDeviceDestroy;
465void vlVdpDeviceFree(vlVdpDevice *dev);
466VdpGetProcAddress vlVdpGetProcAddress;
467VdpGetApiVersion vlVdpGetApiVersion;
468VdpGetInformationString vlVdpGetInformationString;
469VdpVideoSurfaceQueryCapabilities vlVdpVideoSurfaceQueryCapabilities;
470VdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities vlVdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities;
471VdpDecoderQueryCapabilities vlVdpDecoderQueryCapabilities;
472VdpOutputSurfaceQueryCapabilities vlVdpOutputSurfaceQueryCapabilities;
473VdpOutputSurfaceQueryGetPutBitsNativeCapabilities vlVdpOutputSurfaceQueryGetPutBitsNativeCapabilities;
474VdpOutputSurfaceQueryPutBitsIndexedCapabilities vlVdpOutputSurfaceQueryPutBitsIndexedCapabilities;
475VdpOutputSurfaceQueryPutBitsYCbCrCapabilities vlVdpOutputSurfaceQueryPutBitsYCbCrCapabilities;
476VdpBitmapSurfaceQueryCapabilities vlVdpBitmapSurfaceQueryCapabilities;
477VdpVideoMixerQueryFeatureSupport vlVdpVideoMixerQueryFeatureSupport;
478VdpVideoMixerQueryParameterSupport vlVdpVideoMixerQueryParameterSupport;
479VdpVideoMixerQueryParameterValueRange vlVdpVideoMixerQueryParameterValueRange;
480VdpVideoMixerQueryAttributeSupport vlVdpVideoMixerQueryAttributeSupport;
481VdpVideoMixerQueryAttributeValueRange vlVdpVideoMixerQueryAttributeValueRange;
482VdpVideoSurfaceCreate vlVdpVideoSurfaceCreate;
483VdpVideoSurfaceDestroy vlVdpVideoSurfaceDestroy;
484VdpVideoSurfaceGetParameters vlVdpVideoSurfaceGetParameters;
485VdpVideoSurfaceGetBitsYCbCr vlVdpVideoSurfaceGetBitsYCbCr;
486VdpVideoSurfacePutBitsYCbCr vlVdpVideoSurfacePutBitsYCbCr;
487void vlVdpVideoSurfaceClear(vlVdpSurface *vlsurf);
488VdpDecoderCreate vlVdpDecoderCreate;
489VdpDecoderDestroy vlVdpDecoderDestroy;
490VdpDecoderGetParameters vlVdpDecoderGetParameters;
491VdpDecoderRender vlVdpDecoderRender;
492VdpOutputSurfaceCreate vlVdpOutputSurfaceCreate;
493VdpOutputSurfaceDestroy vlVdpOutputSurfaceDestroy;
494VdpOutputSurfaceGetParameters vlVdpOutputSurfaceGetParameters;
495VdpOutputSurfaceGetBitsNative vlVdpOutputSurfaceGetBitsNative;
496VdpOutputSurfacePutBitsNative vlVdpOutputSurfacePutBitsNative;
497VdpOutputSurfacePutBitsIndexed vlVdpOutputSurfacePutBitsIndexed;
498VdpOutputSurfacePutBitsYCbCr vlVdpOutputSurfacePutBitsYCbCr;
499VdpOutputSurfaceRenderOutputSurface vlVdpOutputSurfaceRenderOutputSurface;
500VdpOutputSurfaceRenderBitmapSurface vlVdpOutputSurfaceRenderBitmapSurface;
501VdpBitmapSurfaceCreate vlVdpBitmapSurfaceCreate;
502VdpBitmapSurfaceDestroy vlVdpBitmapSurfaceDestroy;
503VdpBitmapSurfaceGetParameters vlVdpBitmapSurfaceGetParameters;
504VdpBitmapSurfacePutBitsNative vlVdpBitmapSurfacePutBitsNative;
505VdpPresentationQueueTargetDestroy vlVdpPresentationQueueTargetDestroy;
506VdpPresentationQueueCreate vlVdpPresentationQueueCreate;
507VdpPresentationQueueDestroy vlVdpPresentationQueueDestroy;
508VdpPresentationQueueSetBackgroundColor vlVdpPresentationQueueSetBackgroundColor;
509VdpPresentationQueueGetBackgroundColor vlVdpPresentationQueueGetBackgroundColor;
510VdpPresentationQueueGetTime vlVdpPresentationQueueGetTime;
511VdpPresentationQueueDisplay vlVdpPresentationQueueDisplay;
512VdpPresentationQueueBlockUntilSurfaceIdle vlVdpPresentationQueueBlockUntilSurfaceIdle;
513VdpPresentationQueueQuerySurfaceStatus vlVdpPresentationQueueQuerySurfaceStatus;
514VdpPreemptionCallback vlVdpPreemptionCallback;
515VdpPreemptionCallbackRegister vlVdpPreemptionCallbackRegister;
516VdpVideoMixerSetFeatureEnables vlVdpVideoMixerSetFeatureEnables;
517VdpVideoMixerCreate vlVdpVideoMixerCreate;
518VdpVideoMixerRender vlVdpVideoMixerRender;
519VdpVideoMixerSetAttributeValues vlVdpVideoMixerSetAttributeValues;
520VdpVideoMixerGetFeatureSupport vlVdpVideoMixerGetFeatureSupport;
521VdpVideoMixerGetFeatureEnables vlVdpVideoMixerGetFeatureEnables;
522VdpVideoMixerGetParameterValues vlVdpVideoMixerGetParameterValues;
523VdpVideoMixerGetAttributeValues vlVdpVideoMixerGetAttributeValues;
524VdpVideoMixerDestroy vlVdpVideoMixerDestroy;
525VdpGenerateCSCMatrix vlVdpGenerateCSCMatrix;
526/* Winsys specific internal function pointers */
527VdpPresentationQueueTargetCreateX11 vlVdpPresentationQueueTargetCreateX11;
528
529
530/* interop to mesa state tracker */
531VdpVideoSurfaceGallium vlVdpVideoSurfaceGallium;
532VdpOutputSurfaceGallium vlVdpOutputSurfaceGallium;
533VdpVideoSurfaceDMABuf vlVdpVideoSurfaceDMABuf;
534VdpOutputSurfaceDMABuf vlVdpOutputSurfaceDMABuf;
535
536#define VDPAU_OUT   0
537#define VDPAU_ERR   1
538#define VDPAU_WARN  2
539#define VDPAU_TRACE 3
540
541static inline void VDPAU_MSG(unsigned int level, const char *fmt, ...)
542{
543   static int debug_level = -1;
544
545   if (debug_level == -1) {
546      debug_level = MAX2(debug_get_num_option("VDPAU_DEBUG", 0), 0);
547   }
548
549   if (level <= debug_level) {
550      va_list ap;
551      va_start(ap, fmt);
552      _debug_vprintf(fmt, ap);
553      va_end(ap);
554   }
555}
556
557static inline void
558DeviceReference(vlVdpDevice **ptr, vlVdpDevice *dev)
559{
560   vlVdpDevice *old_dev = *ptr;
561
562   if (pipe_reference(&(*ptr)->reference, &dev->reference))
563      vlVdpDeviceFree(old_dev);
564   *ptr = dev;
565}
566
567#endif /* VDPAU_PRIVATE_H */
568