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