vl: move dirty area handling into winsys abstraction
[mesa.git] / src / gallium / state_trackers / vdpau / vdpau_private.h
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 TUNGSTEN GRAPHICS 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_decoder.h"
38
39 #include "util/u_debug.h"
40 #include "util/u_rect.h"
41 #include "vl/vl_compositor.h"
42 #include "vl/vl_matrix_filter.h"
43 #include "vl/vl_median_filter.h"
44
45 #include "vl_winsys.h"
46
47 /* Full VDPAU API documentation available at :
48 * ftp://download.nvidia.com/XFree86/vdpau/doxygen/html/index.html */
49
50 #define INFORMATION G3DVL VDPAU Driver Shared Library version VER_MAJOR.VER_MINOR
51 #define QUOTEME(x) #x
52 #define TOSTRING(x) QUOTEME(x)
53 #define INFORMATION_STRING TOSTRING(INFORMATION)
54 #define VL_HANDLES
55
56 static inline enum pipe_video_chroma_format
57 ChromaToPipe(VdpChromaType vdpau_type)
58 {
59 switch (vdpau_type) {
60 case VDP_CHROMA_TYPE_420:
61 return PIPE_VIDEO_CHROMA_FORMAT_420;
62 case VDP_CHROMA_TYPE_422:
63 return PIPE_VIDEO_CHROMA_FORMAT_422;
64 case VDP_CHROMA_TYPE_444:
65 return PIPE_VIDEO_CHROMA_FORMAT_444;
66 default:
67 assert(0);
68 }
69
70 return -1;
71 }
72
73 static inline VdpChromaType
74 PipeToChroma(enum pipe_video_chroma_format pipe_type)
75 {
76 switch (pipe_type) {
77 case PIPE_VIDEO_CHROMA_FORMAT_420:
78 return VDP_CHROMA_TYPE_420;
79 case PIPE_VIDEO_CHROMA_FORMAT_422:
80 return VDP_CHROMA_TYPE_422;
81 case PIPE_VIDEO_CHROMA_FORMAT_444:
82 return VDP_CHROMA_TYPE_444;
83 default:
84 assert(0);
85 }
86
87 return -1;
88 }
89
90 static inline enum pipe_format
91 FormatYCBCRToPipe(VdpYCbCrFormat vdpau_format)
92 {
93 switch (vdpau_format) {
94 case VDP_YCBCR_FORMAT_NV12:
95 return PIPE_FORMAT_NV12;
96 case VDP_YCBCR_FORMAT_YV12:
97 return PIPE_FORMAT_YV12;
98 case VDP_YCBCR_FORMAT_UYVY:
99 return PIPE_FORMAT_UYVY;
100 case VDP_YCBCR_FORMAT_YUYV:
101 return PIPE_FORMAT_YUYV;
102 case VDP_YCBCR_FORMAT_Y8U8V8A8: /* Not defined in p_format.h */
103 return PIPE_FORMAT_NONE;
104 case VDP_YCBCR_FORMAT_V8U8Y8A8:
105 return PIPE_FORMAT_VUYA;
106 default:
107 assert(0);
108 }
109
110 return PIPE_FORMAT_NONE;
111 }
112
113 static inline VdpYCbCrFormat
114 PipeToFormatYCBCR(enum pipe_format p_format)
115 {
116 switch (p_format) {
117 case PIPE_FORMAT_NV12:
118 return VDP_YCBCR_FORMAT_NV12;
119 case PIPE_FORMAT_YV12:
120 return VDP_YCBCR_FORMAT_YV12;
121 case PIPE_FORMAT_UYVY:
122 return VDP_YCBCR_FORMAT_UYVY;
123 case PIPE_FORMAT_YUYV:
124 return VDP_YCBCR_FORMAT_YUYV;
125 //case PIPE_FORMAT_YUVA:
126 // return VDP_YCBCR_FORMAT_Y8U8V8A8;
127 case PIPE_FORMAT_VUYA:
128 return VDP_YCBCR_FORMAT_V8U8Y8A8;
129 default:
130 assert(0);
131 }
132
133 return -1;
134 }
135
136 static inline enum pipe_format
137 FormatRGBAToPipe(VdpRGBAFormat vdpau_format)
138 {
139 switch (vdpau_format) {
140 case VDP_RGBA_FORMAT_A8:
141 return PIPE_FORMAT_A8_UNORM;
142 case VDP_RGBA_FORMAT_B10G10R10A2:
143 return PIPE_FORMAT_B10G10R10A2_UNORM;
144 case VDP_RGBA_FORMAT_B8G8R8A8:
145 return PIPE_FORMAT_B8G8R8A8_UNORM;
146 case VDP_RGBA_FORMAT_R10G10B10A2:
147 return PIPE_FORMAT_R10G10B10A2_UNORM;
148 case VDP_RGBA_FORMAT_R8G8B8A8:
149 return PIPE_FORMAT_R8G8B8A8_UNORM;
150 default:
151 assert(0);
152 }
153
154 return PIPE_FORMAT_NONE;
155 }
156
157 static inline VdpRGBAFormat
158 PipeToFormatRGBA(enum pipe_format p_format)
159 {
160 switch (p_format) {
161 case PIPE_FORMAT_A8_UNORM:
162 return VDP_RGBA_FORMAT_A8;
163 case PIPE_FORMAT_B10G10R10A2_UNORM:
164 return VDP_RGBA_FORMAT_B10G10R10A2;
165 case PIPE_FORMAT_B8G8R8A8_UNORM:
166 return VDP_RGBA_FORMAT_B8G8R8A8;
167 case PIPE_FORMAT_R10G10B10A2_UNORM:
168 return VDP_RGBA_FORMAT_R10G10B10A2;
169 case PIPE_FORMAT_R8G8B8A8_UNORM:
170 return VDP_RGBA_FORMAT_R8G8B8A8;
171 default:
172 assert(0);
173 }
174
175 return -1;
176 }
177
178 static inline enum pipe_format
179 FormatIndexedToPipe(VdpRGBAFormat vdpau_format)
180 {
181 switch (vdpau_format) {
182 case VDP_INDEXED_FORMAT_A4I4:
183 return PIPE_FORMAT_A4R4_UNORM;
184 case VDP_INDEXED_FORMAT_I4A4:
185 return PIPE_FORMAT_R4A4_UNORM;
186 case VDP_INDEXED_FORMAT_A8I8:
187 return PIPE_FORMAT_A8R8_UNORM;
188 case VDP_INDEXED_FORMAT_I8A8:
189 return PIPE_FORMAT_R8A8_UNORM;
190 default:
191 assert(0);
192 }
193
194 return PIPE_FORMAT_NONE;
195 }
196
197 static inline enum pipe_format
198 FormatColorTableToPipe(VdpColorTableFormat vdpau_format)
199 {
200 switch(vdpau_format) {
201 case VDP_COLOR_TABLE_FORMAT_B8G8R8X8:
202 return PIPE_FORMAT_B8G8R8X8_UNORM;
203 default:
204 assert(0);
205 }
206
207 return PIPE_FORMAT_NONE;
208 }
209
210 static inline enum pipe_video_profile
211 ProfileToPipe(VdpDecoderProfile vdpau_profile)
212 {
213 switch (vdpau_profile) {
214 case VDP_DECODER_PROFILE_MPEG1:
215 return PIPE_VIDEO_PROFILE_MPEG1;
216 case VDP_DECODER_PROFILE_MPEG2_SIMPLE:
217 return PIPE_VIDEO_PROFILE_MPEG2_SIMPLE;
218 case VDP_DECODER_PROFILE_MPEG2_MAIN:
219 return PIPE_VIDEO_PROFILE_MPEG2_MAIN;
220 case VDP_DECODER_PROFILE_H264_BASELINE:
221 return PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE;
222 case VDP_DECODER_PROFILE_H264_MAIN:
223 return PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN;
224 case VDP_DECODER_PROFILE_H264_HIGH:
225 return PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH;
226 case VDP_DECODER_PROFILE_MPEG4_PART2_SP:
227 return PIPE_VIDEO_PROFILE_MPEG4_SIMPLE;
228 case VDP_DECODER_PROFILE_MPEG4_PART2_ASP:
229 return PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE;
230 case VDP_DECODER_PROFILE_VC1_SIMPLE:
231 return PIPE_VIDEO_PROFILE_VC1_SIMPLE;
232 case VDP_DECODER_PROFILE_VC1_MAIN:
233 return PIPE_VIDEO_PROFILE_VC1_MAIN;
234 case VDP_DECODER_PROFILE_VC1_ADVANCED:
235 return PIPE_VIDEO_PROFILE_VC1_ADVANCED;
236 default:
237 return PIPE_VIDEO_PROFILE_UNKNOWN;
238 }
239 }
240
241 static inline VdpDecoderProfile
242 PipeToProfile(enum pipe_video_profile p_profile)
243 {
244 switch (p_profile) {
245 case PIPE_VIDEO_PROFILE_MPEG1:
246 return VDP_DECODER_PROFILE_MPEG1;
247 case PIPE_VIDEO_PROFILE_MPEG2_SIMPLE:
248 return VDP_DECODER_PROFILE_MPEG2_SIMPLE;
249 case PIPE_VIDEO_PROFILE_MPEG2_MAIN:
250 return VDP_DECODER_PROFILE_MPEG2_MAIN;
251 case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE:
252 return VDP_DECODER_PROFILE_H264_BASELINE;
253 case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN:
254 return VDP_DECODER_PROFILE_H264_MAIN;
255 case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH:
256 return VDP_DECODER_PROFILE_H264_HIGH;
257 case PIPE_VIDEO_PROFILE_MPEG4_SIMPLE:
258 return VDP_DECODER_PROFILE_MPEG4_PART2_SP;
259 case PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE:
260 return VDP_DECODER_PROFILE_MPEG4_PART2_ASP;
261 case PIPE_VIDEO_PROFILE_VC1_SIMPLE:
262 return VDP_DECODER_PROFILE_VC1_SIMPLE;
263 case PIPE_VIDEO_PROFILE_VC1_MAIN:
264 return VDP_DECODER_PROFILE_VC1_MAIN;
265 case PIPE_VIDEO_PROFILE_VC1_ADVANCED:
266 return VDP_DECODER_PROFILE_VC1_ADVANCED;
267 default:
268 assert(0);
269 return -1;
270 }
271 }
272
273 static inline struct pipe_video_rect *
274 RectToPipe(const VdpRect *src, struct pipe_video_rect *dst)
275 {
276 if (src) {
277 dst->x = MIN2(src->x1, src->x0);
278 dst->y = MIN2(src->y1, src->y0);
279 dst->w = abs(src->x1 - src->x0);
280 dst->h = abs(src->y1 - src->y0);
281 return dst;
282 }
283 return NULL;
284 }
285
286 typedef struct
287 {
288 struct vl_screen *vscreen;
289 struct pipe_context *context;
290 struct vl_compositor compositor;
291 } vlVdpDevice;
292
293 typedef struct
294 {
295 vlVdpDevice *device;
296 Drawable drawable;
297 } vlVdpPresentationQueueTarget;
298
299 typedef struct
300 {
301 vlVdpDevice *device;
302 Drawable drawable;
303 struct vl_compositor compositor;
304 } vlVdpPresentationQueue;
305
306 typedef struct
307 {
308 vlVdpDevice *device;
309 struct vl_compositor compositor;
310
311 struct {
312 bool supported, enabled;
313 unsigned level;
314 struct vl_median_filter *filter;
315 } noise_reduction;
316
317 struct {
318 bool supported, enabled;
319 float value;
320 struct vl_matrix_filter *filter;
321 } sharpness;
322
323 unsigned video_width, video_height;
324 enum pipe_video_chroma_format chroma_format;
325 unsigned max_layers, skip_chroma_deint, custom_csc;
326 float luma_key_min, luma_key_max;
327 float csc[16];
328 } vlVdpVideoMixer;
329
330 typedef struct
331 {
332 vlVdpDevice *device;
333 struct pipe_video_buffer templat, *video_buffer;
334 } vlVdpSurface;
335
336 typedef uint64_t vlVdpTime;
337
338 typedef struct
339 {
340 vlVdpTime timestamp;
341 vlVdpDevice *device;
342 struct pipe_surface *surface;
343 struct pipe_sampler_view *sampler_view;
344 struct pipe_fence_handle *fence;
345 struct u_rect dirty_area;
346 } vlVdpOutputSurface;
347
348 typedef struct
349 {
350 vlVdpDevice *device;
351 struct pipe_video_decoder *decoder;
352 } vlVdpDecoder;
353
354 typedef uint32_t vlHandle;
355
356 boolean vlCreateHTAB(void);
357 void vlDestroyHTAB(void);
358 vlHandle vlAddDataHTAB(void *data);
359 void* vlGetDataHTAB(vlHandle handle);
360 void vlRemoveDataHTAB(vlHandle handle);
361
362 boolean vlGetFuncFTAB(VdpFuncId function_id, void **func);
363
364 /* Public functions */
365 VdpDeviceCreateX11 vdp_imp_device_create_x11;
366 VdpPresentationQueueTargetCreateX11 vlVdpPresentationQueueTargetCreateX11;
367
368 /* Internal function pointers */
369 VdpGetErrorString vlVdpGetErrorString;
370 VdpDeviceDestroy vlVdpDeviceDestroy;
371 VdpGetProcAddress vlVdpGetProcAddress;
372 VdpGetApiVersion vlVdpGetApiVersion;
373 VdpGetInformationString vlVdpGetInformationString;
374 VdpVideoSurfaceQueryCapabilities vlVdpVideoSurfaceQueryCapabilities;
375 VdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities vlVdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities;
376 VdpDecoderQueryCapabilities vlVdpDecoderQueryCapabilities;
377 VdpOutputSurfaceQueryCapabilities vlVdpOutputSurfaceQueryCapabilities;
378 VdpOutputSurfaceQueryGetPutBitsNativeCapabilities vlVdpOutputSurfaceQueryGetPutBitsNativeCapabilities;
379 VdpOutputSurfaceQueryPutBitsIndexedCapabilities vlVdpOutputSurfaceQueryPutBitsIndexedCapabilities;
380 VdpOutputSurfaceQueryPutBitsYCbCrCapabilities vlVdpOutputSurfaceQueryPutBitsYCbCrCapabilities;
381 VdpBitmapSurfaceQueryCapabilities vlVdpBitmapSurfaceQueryCapabilities;
382 VdpVideoMixerQueryFeatureSupport vlVdpVideoMixerQueryFeatureSupport;
383 VdpVideoMixerQueryParameterSupport vlVdpVideoMixerQueryParameterSupport;
384 VdpVideoMixerQueryParameterValueRange vlVdpVideoMixerQueryParameterValueRange;
385 VdpVideoMixerQueryAttributeSupport vlVdpVideoMixerQueryAttributeSupport;
386 VdpVideoMixerQueryAttributeValueRange vlVdpVideoMixerQueryAttributeValueRange;
387 VdpVideoSurfaceCreate vlVdpVideoSurfaceCreate;
388 VdpVideoSurfaceDestroy vlVdpVideoSurfaceDestroy;
389 VdpVideoSurfaceGetParameters vlVdpVideoSurfaceGetParameters;
390 VdpVideoSurfaceGetBitsYCbCr vlVdpVideoSurfaceGetBitsYCbCr;
391 VdpVideoSurfacePutBitsYCbCr vlVdpVideoSurfacePutBitsYCbCr;
392 VdpDecoderCreate vlVdpDecoderCreate;
393 VdpDecoderDestroy vlVdpDecoderDestroy;
394 VdpDecoderGetParameters vlVdpDecoderGetParameters;
395 VdpDecoderRender vlVdpDecoderRender;
396 VdpOutputSurfaceCreate vlVdpOutputSurfaceCreate;
397 VdpOutputSurfaceDestroy vlVdpOutputSurfaceDestroy;
398 VdpOutputSurfaceGetParameters vlVdpOutputSurfaceGetParameters;
399 VdpOutputSurfaceGetBitsNative vlVdpOutputSurfaceGetBitsNative;
400 VdpOutputSurfacePutBitsNative vlVdpOutputSurfacePutBitsNative;
401 VdpOutputSurfacePutBitsIndexed vlVdpOutputSurfacePutBitsIndexed;
402 VdpOutputSurfacePutBitsYCbCr vlVdpOutputSurfacePutBitsYCbCr;
403 VdpOutputSurfaceRenderOutputSurface vlVdpOutputSurfaceRenderOutputSurface;
404 VdpOutputSurfaceRenderBitmapSurface vlVdpOutputSurfaceRenderBitmapSurface;
405 VdpBitmapSurfaceCreate vlVdpBitmapSurfaceCreate;
406 VdpBitmapSurfaceDestroy vlVdpBitmapSurfaceDestroy;
407 VdpBitmapSurfaceGetParameters vlVdpBitmapSurfaceGetParameters;
408 VdpBitmapSurfacePutBitsNative vlVdpBitmapSurfacePutBitsNative;
409 VdpPresentationQueueTargetDestroy vlVdpPresentationQueueTargetDestroy;
410 VdpPresentationQueueCreate vlVdpPresentationQueueCreate;
411 VdpPresentationQueueDestroy vlVdpPresentationQueueDestroy;
412 VdpPresentationQueueSetBackgroundColor vlVdpPresentationQueueSetBackgroundColor;
413 VdpPresentationQueueGetBackgroundColor vlVdpPresentationQueueGetBackgroundColor;
414 VdpPresentationQueueGetTime vlVdpPresentationQueueGetTime;
415 VdpPresentationQueueDisplay vlVdpPresentationQueueDisplay;
416 VdpPresentationQueueBlockUntilSurfaceIdle vlVdpPresentationQueueBlockUntilSurfaceIdle;
417 VdpPresentationQueueQuerySurfaceStatus vlVdpPresentationQueueQuerySurfaceStatus;
418 VdpPreemptionCallback vlVdpPreemptionCallback;
419 VdpPreemptionCallbackRegister vlVdpPreemptionCallbackRegister;
420 VdpVideoMixerSetFeatureEnables vlVdpVideoMixerSetFeatureEnables;
421 VdpVideoMixerCreate vlVdpVideoMixerCreate;
422 VdpVideoMixerRender vlVdpVideoMixerRender;
423 VdpVideoMixerSetAttributeValues vlVdpVideoMixerSetAttributeValues;
424 VdpVideoMixerGetFeatureSupport vlVdpVideoMixerGetFeatureSupport;
425 VdpVideoMixerGetFeatureEnables vlVdpVideoMixerGetFeatureEnables;
426 VdpVideoMixerGetParameterValues vlVdpVideoMixerGetParameterValues;
427 VdpVideoMixerGetAttributeValues vlVdpVideoMixerGetAttributeValues;
428 VdpVideoMixerDestroy vlVdpVideoMixerDestroy;
429 VdpGenerateCSCMatrix vlVdpGenerateCSCMatrix;
430
431 #define VDPAU_OUT 0
432 #define VDPAU_ERR 1
433 #define VDPAU_WARN 2
434 #define VDPAU_TRACE 3
435
436 static inline void VDPAU_MSG(unsigned int level, const char *fmt, ...)
437 {
438 static int debug_level = -1;
439
440 if (debug_level == -1) {
441 debug_level = MAX2(debug_get_num_option("VDPAU_DEBUG", 0), 0);
442 }
443
444 if (level <= debug_level) {
445 va_list ap;
446 va_start(ap, fmt);
447 _debug_vprintf(fmt, ap);
448 va_end(ap);
449 }
450 }
451
452 #endif /* VDPAU_PRIVATE_H */