Merge branch 'mesa_7_5_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 void
383 identity_screen_flush_frontbuffer(struct pipe_screen *_screen,
384 struct pipe_surface *_surface,
385 void *context_private)
386 {
387 struct identity_screen *id_screen = identity_screen(_screen);
388 struct identity_surface *id_surface = identity_surface(_surface);
389 struct pipe_screen *screen = id_screen->screen;
390 struct pipe_surface *surface = id_surface->surface;
391
392 screen->flush_frontbuffer(screen,
393 surface,
394 context_private);
395 }
396
397 static void
398 identity_screen_fence_reference(struct pipe_screen *_screen,
399 struct pipe_fence_handle **ptr,
400 struct pipe_fence_handle *fence)
401 {
402 struct identity_screen *id_screen = identity_screen(_screen);
403 struct pipe_screen *screen = id_screen->screen;
404
405 screen->fence_reference(screen,
406 ptr,
407 fence);
408 }
409
410 static int
411 identity_screen_fence_signalled(struct pipe_screen *_screen,
412 struct pipe_fence_handle *fence,
413 unsigned flags)
414 {
415 struct identity_screen *id_screen = identity_screen(_screen);
416 struct pipe_screen *screen = id_screen->screen;
417
418 return screen->fence_signalled(screen,
419 fence,
420 flags);
421 }
422
423 static int
424 identity_screen_fence_finish(struct pipe_screen *_screen,
425 struct pipe_fence_handle *fence,
426 unsigned flags)
427 {
428 struct identity_screen *id_screen = identity_screen(_screen);
429 struct pipe_screen *screen = id_screen->screen;
430
431 return screen->fence_finish(screen,
432 fence,
433 flags);
434 }
435
436 struct pipe_screen *
437 identity_screen_create(struct pipe_screen *screen)
438 {
439 struct identity_screen *id_screen;
440
441 id_screen = CALLOC_STRUCT(identity_screen);
442 if (!id_screen) {
443 return NULL;
444 }
445
446 id_screen->base.winsys = NULL;
447
448 id_screen->base.destroy = identity_screen_destroy;
449 id_screen->base.get_name = identity_screen_get_name;
450 id_screen->base.get_vendor = identity_screen_get_vendor;
451 id_screen->base.get_param = identity_screen_get_param;
452 id_screen->base.get_paramf = identity_screen_get_paramf;
453 id_screen->base.is_format_supported = identity_screen_is_format_supported;
454 id_screen->base.texture_create = identity_screen_texture_create;
455 id_screen->base.texture_blanket = identity_screen_texture_blanket;
456 id_screen->base.texture_destroy = identity_screen_texture_destroy;
457 id_screen->base.get_tex_surface = identity_screen_get_tex_surface;
458 id_screen->base.tex_surface_destroy = identity_screen_tex_surface_destroy;
459 id_screen->base.get_tex_transfer = identity_screen_get_tex_transfer;
460 id_screen->base.tex_transfer_destroy = identity_screen_tex_transfer_destroy;
461 id_screen->base.transfer_map = identity_screen_transfer_map;
462 id_screen->base.transfer_unmap = identity_screen_transfer_unmap;
463 id_screen->base.buffer_create = identity_screen_buffer_create;
464 id_screen->base.user_buffer_create = identity_screen_user_buffer_create;
465 id_screen->base.surface_buffer_create = identity_screen_surface_buffer_create;
466 if (screen->buffer_map)
467 id_screen->base.buffer_map = identity_screen_buffer_map;
468 if (screen->buffer_map_range)
469 id_screen->base.buffer_map_range = identity_screen_buffer_map_range;
470 if (screen->buffer_flush_mapped_range)
471 id_screen->base.buffer_flush_mapped_range = identity_screen_buffer_flush_mapped_range;
472 if (screen->buffer_unmap)
473 id_screen->base.buffer_unmap = identity_screen_buffer_unmap;
474 id_screen->base.buffer_destroy = identity_screen_buffer_destroy;
475 id_screen->base.flush_frontbuffer = identity_screen_flush_frontbuffer;
476 id_screen->base.fence_reference = identity_screen_fence_reference;
477 id_screen->base.fence_signalled = identity_screen_fence_signalled;
478 id_screen->base.fence_finish = identity_screen_fence_finish;
479
480 id_screen->screen = screen;
481
482 return &id_screen->base;
483 }