vl/compositor: split shaders and state
[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_state cstate;
304 } vlVdpPresentationQueue;
305
306 typedef struct
307 {
308 vlVdpDevice *device;
309 struct vl_compositor_state cstate;
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 vl_compositor_state cstate;
346 struct u_rect dirty_area;
347 } vlVdpOutputSurface;
348
349 typedef struct
350 {
351 vlVdpDevice *device;
352 struct pipe_video_decoder *decoder;
353 } vlVdpDecoder;
354
355 typedef uint32_t vlHandle;
356
357 boolean vlCreateHTAB(void);
358 void vlDestroyHTAB(void);
359 vlHandle vlAddDataHTAB(void *data);
360 void* vlGetDataHTAB(vlHandle handle);
361 void vlRemoveDataHTAB(vlHandle handle);
362
363 boolean vlGetFuncFTAB(VdpFuncId function_id, void **func);
364
365 /* Public functions */
366 VdpDeviceCreateX11 vdp_imp_device_create_x11;
367 VdpPresentationQueueTargetCreateX11 vlVdpPresentationQueueTargetCreateX11;
368
369 /* Internal function pointers */
370 VdpGetErrorString vlVdpGetErrorString;
371 VdpDeviceDestroy vlVdpDeviceDestroy;
372 VdpGetProcAddress vlVdpGetProcAddress;
373 VdpGetApiVersion vlVdpGetApiVersion;
374 VdpGetInformationString vlVdpGetInformationString;
375 VdpVideoSurfaceQueryCapabilities vlVdpVideoSurfaceQueryCapabilities;
376 VdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities vlVdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities;
377 VdpDecoderQueryCapabilities vlVdpDecoderQueryCapabilities;
378 VdpOutputSurfaceQueryCapabilities vlVdpOutputSurfaceQueryCapabilities;
379 VdpOutputSurfaceQueryGetPutBitsNativeCapabilities vlVdpOutputSurfaceQueryGetPutBitsNativeCapabilities;
380 VdpOutputSurfaceQueryPutBitsIndexedCapabilities vlVdpOutputSurfaceQueryPutBitsIndexedCapabilities;
381 VdpOutputSurfaceQueryPutBitsYCbCrCapabilities vlVdpOutputSurfaceQueryPutBitsYCbCrCapabilities;
382 VdpBitmapSurfaceQueryCapabilities vlVdpBitmapSurfaceQueryCapabilities;
383 VdpVideoMixerQueryFeatureSupport vlVdpVideoMixerQueryFeatureSupport;
384 VdpVideoMixerQueryParameterSupport vlVdpVideoMixerQueryParameterSupport;
385 VdpVideoMixerQueryParameterValueRange vlVdpVideoMixerQueryParameterValueRange;
386 VdpVideoMixerQueryAttributeSupport vlVdpVideoMixerQueryAttributeSupport;
387 VdpVideoMixerQueryAttributeValueRange vlVdpVideoMixerQueryAttributeValueRange;
388 VdpVideoSurfaceCreate vlVdpVideoSurfaceCreate;
389 VdpVideoSurfaceDestroy vlVdpVideoSurfaceDestroy;
390 VdpVideoSurfaceGetParameters vlVdpVideoSurfaceGetParameters;
391 VdpVideoSurfaceGetBitsYCbCr vlVdpVideoSurfaceGetBitsYCbCr;
392 VdpVideoSurfacePutBitsYCbCr vlVdpVideoSurfacePutBitsYCbCr;
393 VdpDecoderCreate vlVdpDecoderCreate;
394 VdpDecoderDestroy vlVdpDecoderDestroy;
395 VdpDecoderGetParameters vlVdpDecoderGetParameters;
396 VdpDecoderRender vlVdpDecoderRender;
397 VdpOutputSurfaceCreate vlVdpOutputSurfaceCreate;
398 VdpOutputSurfaceDestroy vlVdpOutputSurfaceDestroy;
399 VdpOutputSurfaceGetParameters vlVdpOutputSurfaceGetParameters;
400 VdpOutputSurfaceGetBitsNative vlVdpOutputSurfaceGetBitsNative;
401 VdpOutputSurfacePutBitsNative vlVdpOutputSurfacePutBitsNative;
402 VdpOutputSurfacePutBitsIndexed vlVdpOutputSurfacePutBitsIndexed;
403 VdpOutputSurfacePutBitsYCbCr vlVdpOutputSurfacePutBitsYCbCr;
404 VdpOutputSurfaceRenderOutputSurface vlVdpOutputSurfaceRenderOutputSurface;
405 VdpOutputSurfaceRenderBitmapSurface vlVdpOutputSurfaceRenderBitmapSurface;
406 VdpBitmapSurfaceCreate vlVdpBitmapSurfaceCreate;
407 VdpBitmapSurfaceDestroy vlVdpBitmapSurfaceDestroy;
408 VdpBitmapSurfaceGetParameters vlVdpBitmapSurfaceGetParameters;
409 VdpBitmapSurfacePutBitsNative vlVdpBitmapSurfacePutBitsNative;
410 VdpPresentationQueueTargetDestroy vlVdpPresentationQueueTargetDestroy;
411 VdpPresentationQueueCreate vlVdpPresentationQueueCreate;
412 VdpPresentationQueueDestroy vlVdpPresentationQueueDestroy;
413 VdpPresentationQueueSetBackgroundColor vlVdpPresentationQueueSetBackgroundColor;
414 VdpPresentationQueueGetBackgroundColor vlVdpPresentationQueueGetBackgroundColor;
415 VdpPresentationQueueGetTime vlVdpPresentationQueueGetTime;
416 VdpPresentationQueueDisplay vlVdpPresentationQueueDisplay;
417 VdpPresentationQueueBlockUntilSurfaceIdle vlVdpPresentationQueueBlockUntilSurfaceIdle;
418 VdpPresentationQueueQuerySurfaceStatus vlVdpPresentationQueueQuerySurfaceStatus;
419 VdpPreemptionCallback vlVdpPreemptionCallback;
420 VdpPreemptionCallbackRegister vlVdpPreemptionCallbackRegister;
421 VdpVideoMixerSetFeatureEnables vlVdpVideoMixerSetFeatureEnables;
422 VdpVideoMixerCreate vlVdpVideoMixerCreate;
423 VdpVideoMixerRender vlVdpVideoMixerRender;
424 VdpVideoMixerSetAttributeValues vlVdpVideoMixerSetAttributeValues;
425 VdpVideoMixerGetFeatureSupport vlVdpVideoMixerGetFeatureSupport;
426 VdpVideoMixerGetFeatureEnables vlVdpVideoMixerGetFeatureEnables;
427 VdpVideoMixerGetParameterValues vlVdpVideoMixerGetParameterValues;
428 VdpVideoMixerGetAttributeValues vlVdpVideoMixerGetAttributeValues;
429 VdpVideoMixerDestroy vlVdpVideoMixerDestroy;
430 VdpGenerateCSCMatrix vlVdpGenerateCSCMatrix;
431
432 #define VDPAU_OUT 0
433 #define VDPAU_ERR 1
434 #define VDPAU_WARN 2
435 #define VDPAU_TRACE 3
436
437 static inline void VDPAU_MSG(unsigned int level, const char *fmt, ...)
438 {
439 static int debug_level = -1;
440
441 if (debug_level == -1) {
442 debug_level = MAX2(debug_get_num_option("VDPAU_DEBUG", 0), 0);
443 }
444
445 if (level <= debug_level) {
446 va_list ap;
447 va_start(ap, fmt);
448 _debug_vprintf(fmt, ap);
449 va_end(ap);
450 }
451 }
452
453 #endif /* VDPAU_PRIVATE_H */