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 *stride)
293 {
294 struct identity_screen *id_screen = identity_screen(_screen);
295 struct pipe_screen *screen = id_screen->screen;
296 struct pipe_buffer *result;
297
298 result = screen->surface_buffer_create(screen,
299 width,
300 height,
301 format,
302 usage,
303 stride);
304
305 if (result)
306 return identity_buffer_create(id_screen, result);
307 return NULL;
308 }
309
310 static void *
311 identity_screen_buffer_map(struct pipe_screen *_screen,
312 struct pipe_buffer *_buffer,
313 unsigned usage)
314 {
315 struct identity_screen *id_screen = identity_screen(_screen);
316 struct identity_buffer *id_buffer = identity_buffer(_buffer);
317 struct pipe_screen *screen = id_screen->screen;
318 struct pipe_buffer *buffer = id_buffer->buffer;
319
320 return screen->buffer_map(screen,
321 buffer,
322 usage);
323 }
324
325 static void *
326 identity_screen_buffer_map_range(struct pipe_screen *_screen,
327 struct pipe_buffer *_buffer,
328 unsigned offset,
329 unsigned length,
330 unsigned usage)
331 {
332 struct identity_screen *id_screen = identity_screen(_screen);
333 struct identity_buffer *id_buffer = identity_buffer(_buffer);
334 struct pipe_screen *screen = id_screen->screen;
335 struct pipe_buffer *buffer = id_buffer->buffer;
336
337 return screen->buffer_map_range(screen,
338 buffer,
339 offset,
340 length,
341 usage);
342 }
343
344 static void
345 identity_screen_buffer_flush_mapped_range(struct pipe_screen *_screen,
346 struct pipe_buffer *_buffer,
347 unsigned offset,
348 unsigned length)
349 {
350 struct identity_screen *id_screen = identity_screen(_screen);
351 struct identity_buffer *id_buffer = identity_buffer(_buffer);
352 struct pipe_screen *screen = id_screen->screen;
353 struct pipe_buffer *buffer = id_buffer->buffer;
354
355 screen->buffer_flush_mapped_range(screen,
356 buffer,
357 offset,
358 length);
359 }
360
361 static void
362 identity_screen_buffer_unmap(struct pipe_screen *_screen,
363 struct pipe_buffer *_buffer)
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 screen->buffer_unmap(screen,
371 buffer);
372 }
373
374 static void
375 identity_screen_buffer_destroy(struct pipe_buffer *_buffer)
376 {
377 identity_buffer_destroy(identity_buffer(_buffer));
378 }
379
380 static void
381 identity_screen_flush_frontbuffer(struct pipe_screen *_screen,
382 struct pipe_surface *_surface,
383 void *context_private)
384 {
385 struct identity_screen *id_screen = identity_screen(_screen);
386 struct identity_surface *id_surface = identity_surface(_surface);
387 struct pipe_screen *screen = id_screen->screen;
388 struct pipe_surface *surface = id_surface->surface;
389
390 screen->flush_frontbuffer(screen,
391 surface,
392 context_private);
393 }
394
395 static void
396 identity_screen_fence_reference(struct pipe_screen *_screen,
397 struct pipe_fence_handle **ptr,
398 struct pipe_fence_handle *fence)
399 {
400 struct identity_screen *id_screen = identity_screen(_screen);
401 struct pipe_screen *screen = id_screen->screen;
402
403 screen->fence_reference(screen,
404 ptr,
405 fence);
406 }
407
408 static int
409 identity_screen_fence_signalled(struct pipe_screen *_screen,
410 struct pipe_fence_handle *fence,
411 unsigned flags)
412 {
413 struct identity_screen *id_screen = identity_screen(_screen);
414 struct pipe_screen *screen = id_screen->screen;
415
416 return screen->fence_signalled(screen,
417 fence,
418 flags);
419 }
420
421 static int
422 identity_screen_fence_finish(struct pipe_screen *_screen,
423 struct pipe_fence_handle *fence,
424 unsigned flags)
425 {
426 struct identity_screen *id_screen = identity_screen(_screen);
427 struct pipe_screen *screen = id_screen->screen;
428
429 return screen->fence_finish(screen,
430 fence,
431 flags);
432 }
433
434 struct pipe_screen *
435 identity_screen_create(struct pipe_screen *screen)
436 {
437 struct identity_screen *id_screen;
438
439 id_screen = CALLOC_STRUCT(identity_screen);
440 if (!id_screen) {
441 return NULL;
442 }
443
444 id_screen->base.winsys = NULL;
445
446 id_screen->base.destroy = identity_screen_destroy;
447 id_screen->base.get_name = identity_screen_get_name;
448 id_screen->base.get_vendor = identity_screen_get_vendor;
449 id_screen->base.get_param = identity_screen_get_param;
450 id_screen->base.get_paramf = identity_screen_get_paramf;
451 id_screen->base.is_format_supported = identity_screen_is_format_supported;
452 id_screen->base.texture_create = identity_screen_texture_create;
453 id_screen->base.texture_blanket = identity_screen_texture_blanket;
454 id_screen->base.texture_destroy = identity_screen_texture_destroy;
455 id_screen->base.get_tex_surface = identity_screen_get_tex_surface;
456 id_screen->base.tex_surface_destroy = identity_screen_tex_surface_destroy;
457 id_screen->base.get_tex_transfer = identity_screen_get_tex_transfer;
458 id_screen->base.tex_transfer_destroy = identity_screen_tex_transfer_destroy;
459 id_screen->base.transfer_map = identity_screen_transfer_map;
460 id_screen->base.transfer_unmap = identity_screen_transfer_unmap;
461 id_screen->base.buffer_create = identity_screen_buffer_create;
462 id_screen->base.user_buffer_create = identity_screen_user_buffer_create;
463 id_screen->base.surface_buffer_create = identity_screen_surface_buffer_create;
464 if (screen->buffer_map)
465 id_screen->base.buffer_map = identity_screen_buffer_map;
466 if (screen->buffer_map_range)
467 id_screen->base.buffer_map_range = identity_screen_buffer_map_range;
468 if (screen->buffer_flush_mapped_range)
469 id_screen->base.buffer_flush_mapped_range = identity_screen_buffer_flush_mapped_range;
470 if (screen->buffer_unmap)
471 id_screen->base.buffer_unmap = identity_screen_buffer_unmap;
472 id_screen->base.buffer_destroy = identity_screen_buffer_destroy;
473 id_screen->base.flush_frontbuffer = identity_screen_flush_frontbuffer;
474 id_screen->base.fence_reference = identity_screen_fence_reference;
475 id_screen->base.fence_signalled = identity_screen_fence_signalled;
476 id_screen->base.fence_finish = identity_screen_fence_finish;
477
478 id_screen->screen = screen;
479
480 return &id_screen->base;
481 }