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