Merge branch '7.8'
[mesa.git] / src / gallium / drivers / identity / id_screen.c
1 /**************************************************************************
2 *
3 * Copyright 2009 VMware, Inc.
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
29 #include "pipe/p_screen.h"
30 #include "pipe/p_state.h"
31 #include "util/u_memory.h"
32
33 #include "id_public.h"
34 #include "id_screen.h"
35 #include "id_context.h"
36 #include "id_objects.h"
37
38
39 static void
40 identity_screen_destroy(struct pipe_screen *_screen)
41 {
42 struct identity_screen *id_screen = identity_screen(_screen);
43 struct pipe_screen *screen = id_screen->screen;
44
45 screen->destroy(screen);
46
47 FREE(id_screen);
48 }
49
50 static const char *
51 identity_screen_get_name(struct pipe_screen *_screen)
52 {
53 struct identity_screen *id_screen = identity_screen(_screen);
54 struct pipe_screen *screen = id_screen->screen;
55
56 return screen->get_name(screen);
57 }
58
59 static const char *
60 identity_screen_get_vendor(struct pipe_screen *_screen)
61 {
62 struct identity_screen *id_screen = identity_screen(_screen);
63 struct pipe_screen *screen = id_screen->screen;
64
65 return screen->get_vendor(screen);
66 }
67
68 static int
69 identity_screen_get_param(struct pipe_screen *_screen,
70 int param)
71 {
72 struct identity_screen *id_screen = identity_screen(_screen);
73 struct pipe_screen *screen = id_screen->screen;
74
75 return screen->get_param(screen,
76 param);
77 }
78
79 static float
80 identity_screen_get_paramf(struct pipe_screen *_screen,
81 int param)
82 {
83 struct identity_screen *id_screen = identity_screen(_screen);
84 struct pipe_screen *screen = id_screen->screen;
85
86 return screen->get_paramf(screen,
87 param);
88 }
89
90 static boolean
91 identity_screen_is_format_supported(struct pipe_screen *_screen,
92 enum pipe_format format,
93 enum pipe_texture_target target,
94 unsigned tex_usage,
95 unsigned geom_flags)
96 {
97 struct identity_screen *id_screen = identity_screen(_screen);
98 struct pipe_screen *screen = id_screen->screen;
99
100 return screen->is_format_supported(screen,
101 format,
102 target,
103 tex_usage,
104 geom_flags);
105 }
106
107 static struct pipe_context *
108 identity_screen_context_create(struct pipe_screen *_screen,
109 void *priv)
110 {
111 struct identity_screen *id_screen = identity_screen(_screen);
112 struct pipe_screen *screen = id_screen->screen;
113 struct pipe_context *result;
114
115 result = screen->context_create(screen, priv);
116 if (result)
117 return identity_context_create(_screen, result);
118 return NULL;
119 }
120
121 static struct pipe_texture *
122 identity_screen_texture_create(struct pipe_screen *_screen,
123 const struct pipe_texture *templat)
124 {
125 struct identity_screen *id_screen = identity_screen(_screen);
126 struct pipe_screen *screen = id_screen->screen;
127 struct pipe_texture *result;
128
129 result = screen->texture_create(screen,
130 templat);
131
132 if (result)
133 return identity_texture_create(id_screen, result);
134 return NULL;
135 }
136
137 static struct pipe_texture *
138 identity_screen_texture_from_handle(struct pipe_screen *_screen,
139 const struct pipe_texture *templ,
140 struct winsys_handle *handle)
141 {
142 struct identity_screen *id_screen = identity_screen(_screen);
143 struct pipe_screen *screen = id_screen->screen;
144 struct pipe_texture *result;
145
146 /* TODO trace call */
147
148 result = screen->texture_from_handle(screen, templ, handle);
149
150 result = identity_texture_create(identity_screen(_screen), result);
151
152 return result;
153 }
154
155 static boolean
156 identity_screen_texture_get_handle(struct pipe_screen *_screen,
157 struct pipe_texture *_texture,
158 struct winsys_handle *handle)
159 {
160 struct identity_screen *id_screen = identity_screen(_screen);
161 struct identity_texture *id_texture = identity_texture(_texture);
162 struct pipe_screen *screen = id_screen->screen;
163 struct pipe_texture *texture = id_texture->texture;
164
165 /* TODO trace call */
166
167 return screen->texture_get_handle(screen, texture, handle);
168 }
169
170 static struct pipe_texture *
171 identity_screen_texture_blanket(struct pipe_screen *_screen,
172 const struct pipe_texture *templat,
173 const unsigned *stride,
174 struct pipe_buffer *_buffer)
175 {
176 struct identity_screen *id_screen = identity_screen(_screen);
177 struct identity_buffer *id_buffer = identity_buffer(_buffer);
178 struct pipe_screen *screen = id_screen->screen;
179 struct pipe_buffer *buffer = id_buffer->buffer;
180 struct pipe_texture *result;
181
182 result = screen->texture_blanket(screen,
183 templat,
184 stride,
185 buffer);
186
187 if (result)
188 return identity_texture_create(id_screen, result);
189 return NULL;
190 }
191
192 static void
193 identity_screen_texture_destroy(struct pipe_texture *_texture)
194 {
195 identity_texture_destroy(identity_texture(_texture));
196 }
197
198 static struct pipe_surface *
199 identity_screen_get_tex_surface(struct pipe_screen *_screen,
200 struct pipe_texture *_texture,
201 unsigned face,
202 unsigned level,
203 unsigned zslice,
204 unsigned usage)
205 {
206 struct identity_screen *id_screen = identity_screen(_screen);
207 struct identity_texture *id_texture = identity_texture(_texture);
208 struct pipe_screen *screen = id_screen->screen;
209 struct pipe_texture *texture = id_texture->texture;
210 struct pipe_surface *result;
211
212 result = screen->get_tex_surface(screen,
213 texture,
214 face,
215 level,
216 zslice,
217 usage);
218
219 if (result)
220 return identity_surface_create(id_texture, result);
221 return NULL;
222 }
223
224 static void
225 identity_screen_tex_surface_destroy(struct pipe_surface *_surface)
226 {
227 identity_surface_destroy(identity_surface(_surface));
228 }
229
230 static struct pipe_transfer *
231 identity_screen_get_tex_transfer(struct pipe_screen *_screen,
232 struct pipe_texture *_texture,
233 unsigned face,
234 unsigned level,
235 unsigned zslice,
236 enum pipe_transfer_usage usage,
237 unsigned x,
238 unsigned y,
239 unsigned w,
240 unsigned h)
241 {
242 struct identity_screen *id_screen = identity_screen(_screen);
243 struct identity_texture *id_texture = identity_texture(_texture);
244 struct pipe_screen *screen = id_screen->screen;
245 struct pipe_texture *texture = id_texture->texture;
246 struct pipe_transfer *result;
247
248 result = screen->get_tex_transfer(screen,
249 texture,
250 face,
251 level,
252 zslice,
253 usage,
254 x,
255 y,
256 w,
257 h);
258
259 if (result)
260 return identity_transfer_create(id_texture, result);
261 return NULL;
262 }
263
264 static void
265 identity_screen_tex_transfer_destroy(struct pipe_transfer *_transfer)
266 {
267 identity_transfer_destroy(identity_transfer(_transfer));
268 }
269
270 static void *
271 identity_screen_transfer_map(struct pipe_screen *_screen,
272 struct pipe_transfer *_transfer)
273 {
274 struct identity_screen *id_screen = identity_screen(_screen);
275 struct identity_transfer *id_transfer = identity_transfer(_transfer);
276 struct pipe_screen *screen = id_screen->screen;
277 struct pipe_transfer *transfer = id_transfer->transfer;
278
279 return screen->transfer_map(screen,
280 transfer);
281 }
282
283 static void
284 identity_screen_transfer_unmap(struct pipe_screen *_screen,
285 struct pipe_transfer *_transfer)
286 {
287 struct identity_screen *id_screen = identity_screen(_screen);
288 struct identity_transfer *id_transfer = identity_transfer(_transfer);
289 struct pipe_screen *screen = id_screen->screen;
290 struct pipe_transfer *transfer = id_transfer->transfer;
291
292 screen->transfer_unmap(screen,
293 transfer);
294 }
295
296 static struct pipe_buffer *
297 identity_screen_buffer_create(struct pipe_screen *_screen,
298 unsigned alignment,
299 unsigned usage,
300 unsigned size)
301 {
302 struct identity_screen *id_screen = identity_screen(_screen);
303 struct pipe_screen *screen = id_screen->screen;
304 struct pipe_buffer *result;
305
306 result = screen->buffer_create(screen,
307 alignment,
308 usage,
309 size);
310
311 if (result)
312 return identity_buffer_create(id_screen, result);
313 return NULL;
314 }
315
316 static struct pipe_buffer *
317 identity_screen_user_buffer_create(struct pipe_screen *_screen,
318 void *ptr,
319 unsigned bytes)
320 {
321 struct identity_screen *id_screen = identity_screen(_screen);
322 struct pipe_screen *screen = id_screen->screen;
323 struct pipe_buffer *result;
324
325 result = screen->user_buffer_create(screen,
326 ptr,
327 bytes);
328
329 if (result)
330 return identity_buffer_create(id_screen, result);
331 return NULL;
332 }
333
334 static struct pipe_buffer *
335 identity_screen_surface_buffer_create(struct pipe_screen *_screen,
336 unsigned width,
337 unsigned height,
338 enum pipe_format format,
339 unsigned usage,
340 unsigned tex_usage,
341 unsigned *stride)
342 {
343 struct identity_screen *id_screen = identity_screen(_screen);
344 struct pipe_screen *screen = id_screen->screen;
345 struct pipe_buffer *result;
346
347 result = screen->surface_buffer_create(screen,
348 width,
349 height,
350 format,
351 usage,
352 tex_usage,
353 stride);
354
355 if (result)
356 return identity_buffer_create(id_screen, result);
357 return NULL;
358 }
359
360 static void *
361 identity_screen_buffer_map(struct pipe_screen *_screen,
362 struct pipe_buffer *_buffer,
363 unsigned usage)
364 {
365 struct identity_screen *id_screen = identity_screen(_screen);
366 struct identity_buffer *id_buffer = identity_buffer(_buffer);
367 struct pipe_screen *screen = id_screen->screen;
368 struct pipe_buffer *buffer = id_buffer->buffer;
369
370 return screen->buffer_map(screen,
371 buffer,
372 usage);
373 }
374
375 static void *
376 identity_screen_buffer_map_range(struct pipe_screen *_screen,
377 struct pipe_buffer *_buffer,
378 unsigned offset,
379 unsigned length,
380 unsigned usage)
381 {
382 struct identity_screen *id_screen = identity_screen(_screen);
383 struct identity_buffer *id_buffer = identity_buffer(_buffer);
384 struct pipe_screen *screen = id_screen->screen;
385 struct pipe_buffer *buffer = id_buffer->buffer;
386
387 return screen->buffer_map_range(screen,
388 buffer,
389 offset,
390 length,
391 usage);
392 }
393
394 static void
395 identity_screen_buffer_flush_mapped_range(struct pipe_screen *_screen,
396 struct pipe_buffer *_buffer,
397 unsigned offset,
398 unsigned length)
399 {
400 struct identity_screen *id_screen = identity_screen(_screen);
401 struct identity_buffer *id_buffer = identity_buffer(_buffer);
402 struct pipe_screen *screen = id_screen->screen;
403 struct pipe_buffer *buffer = id_buffer->buffer;
404
405 screen->buffer_flush_mapped_range(screen,
406 buffer,
407 offset,
408 length);
409 }
410
411 static void
412 identity_screen_buffer_unmap(struct pipe_screen *_screen,
413 struct pipe_buffer *_buffer)
414 {
415 struct identity_screen *id_screen = identity_screen(_screen);
416 struct identity_buffer *id_buffer = identity_buffer(_buffer);
417 struct pipe_screen *screen = id_screen->screen;
418 struct pipe_buffer *buffer = id_buffer->buffer;
419
420 screen->buffer_unmap(screen,
421 buffer);
422 }
423
424 static void
425 identity_screen_buffer_destroy(struct pipe_buffer *_buffer)
426 {
427 identity_buffer_destroy(identity_buffer(_buffer));
428 }
429
430 static struct pipe_video_surface *
431 identity_screen_video_surface_create(struct pipe_screen *_screen,
432 enum pipe_video_chroma_format chroma_format,
433 unsigned width,
434 unsigned height)
435 {
436 struct identity_screen *id_screen = identity_screen(_screen);
437 struct pipe_screen *screen = id_screen->screen;
438 struct pipe_video_surface *result;
439
440 result = screen->video_surface_create(screen,
441 chroma_format,
442 width,
443 height);
444
445 if (result) {
446 return identity_video_surface_create(id_screen, result);
447 }
448 return NULL;
449 }
450
451 static void
452 identity_screen_video_surface_destroy(struct pipe_video_surface *_vsfc)
453 {
454 identity_video_surface_destroy(identity_video_surface(_vsfc));
455 }
456
457 static void
458 identity_screen_flush_frontbuffer(struct pipe_screen *_screen,
459 struct pipe_surface *_surface,
460 void *context_private)
461 {
462 struct identity_screen *id_screen = identity_screen(_screen);
463 struct identity_surface *id_surface = identity_surface(_surface);
464 struct pipe_screen *screen = id_screen->screen;
465 struct pipe_surface *surface = id_surface->surface;
466
467 screen->flush_frontbuffer(screen,
468 surface,
469 context_private);
470 }
471
472 static void
473 identity_screen_fence_reference(struct pipe_screen *_screen,
474 struct pipe_fence_handle **ptr,
475 struct pipe_fence_handle *fence)
476 {
477 struct identity_screen *id_screen = identity_screen(_screen);
478 struct pipe_screen *screen = id_screen->screen;
479
480 screen->fence_reference(screen,
481 ptr,
482 fence);
483 }
484
485 static int
486 identity_screen_fence_signalled(struct pipe_screen *_screen,
487 struct pipe_fence_handle *fence,
488 unsigned flags)
489 {
490 struct identity_screen *id_screen = identity_screen(_screen);
491 struct pipe_screen *screen = id_screen->screen;
492
493 return screen->fence_signalled(screen,
494 fence,
495 flags);
496 }
497
498 static int
499 identity_screen_fence_finish(struct pipe_screen *_screen,
500 struct pipe_fence_handle *fence,
501 unsigned flags)
502 {
503 struct identity_screen *id_screen = identity_screen(_screen);
504 struct pipe_screen *screen = id_screen->screen;
505
506 return screen->fence_finish(screen,
507 fence,
508 flags);
509 }
510
511 struct pipe_screen *
512 identity_screen_create(struct pipe_screen *screen)
513 {
514 struct identity_screen *id_screen;
515
516 id_screen = CALLOC_STRUCT(identity_screen);
517 if (!id_screen) {
518 return NULL;
519 }
520
521 id_screen->base.winsys = NULL;
522
523 id_screen->base.destroy = identity_screen_destroy;
524 id_screen->base.get_name = identity_screen_get_name;
525 id_screen->base.get_vendor = identity_screen_get_vendor;
526 id_screen->base.get_param = identity_screen_get_param;
527 id_screen->base.get_paramf = identity_screen_get_paramf;
528 id_screen->base.is_format_supported = identity_screen_is_format_supported;
529 id_screen->base.context_create = identity_screen_context_create;
530 id_screen->base.texture_create = identity_screen_texture_create;
531 id_screen->base.texture_from_handle = identity_screen_texture_from_handle;
532 id_screen->base.texture_get_handle = identity_screen_texture_get_handle;
533 id_screen->base.texture_blanket = identity_screen_texture_blanket;
534 id_screen->base.texture_destroy = identity_screen_texture_destroy;
535 id_screen->base.get_tex_surface = identity_screen_get_tex_surface;
536 id_screen->base.tex_surface_destroy = identity_screen_tex_surface_destroy;
537 id_screen->base.get_tex_transfer = identity_screen_get_tex_transfer;
538 id_screen->base.tex_transfer_destroy = identity_screen_tex_transfer_destroy;
539 id_screen->base.transfer_map = identity_screen_transfer_map;
540 id_screen->base.transfer_unmap = identity_screen_transfer_unmap;
541 id_screen->base.buffer_create = identity_screen_buffer_create;
542 id_screen->base.user_buffer_create = identity_screen_user_buffer_create;
543 id_screen->base.surface_buffer_create = identity_screen_surface_buffer_create;
544 if (screen->buffer_map)
545 id_screen->base.buffer_map = identity_screen_buffer_map;
546 if (screen->buffer_map_range)
547 id_screen->base.buffer_map_range = identity_screen_buffer_map_range;
548 if (screen->buffer_flush_mapped_range)
549 id_screen->base.buffer_flush_mapped_range = identity_screen_buffer_flush_mapped_range;
550 if (screen->buffer_unmap)
551 id_screen->base.buffer_unmap = identity_screen_buffer_unmap;
552 id_screen->base.buffer_destroy = identity_screen_buffer_destroy;
553 if (screen->video_surface_create) {
554 id_screen->base.video_surface_create = identity_screen_video_surface_create;
555 }
556 if (screen->video_surface_destroy) {
557 id_screen->base.video_surface_destroy = identity_screen_video_surface_destroy;
558 }
559 id_screen->base.flush_frontbuffer = identity_screen_flush_frontbuffer;
560 id_screen->base.fence_reference = identity_screen_fence_reference;
561 id_screen->base.fence_signalled = identity_screen_fence_signalled;
562 id_screen->base.fence_finish = identity_screen_fence_finish;
563
564 id_screen->screen = screen;
565
566 return &id_screen->base;
567 }