Merge commit 'origin/master' into gallium-map-range
[mesa.git] / src / gallium / drivers / trace / tr_screen.c
1 /**************************************************************************
2 *
3 * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
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 #include "util/u_memory.h"
29
30 #include "tr_dump.h"
31 #include "tr_state.h"
32 #include "tr_winsys.h"
33 #include "tr_texture.h"
34 #include "tr_screen.h"
35
36
37 static const char *
38 trace_screen_get_name(struct pipe_screen *_screen)
39 {
40 struct trace_screen *tr_scr = trace_screen(_screen);
41 struct pipe_screen *screen = tr_scr->screen;
42 const char *result;
43
44 trace_dump_call_begin("pipe_screen", "get_name");
45
46 trace_dump_arg(ptr, screen);
47
48 result = screen->get_name(screen);
49
50 trace_dump_ret(string, result);
51
52 trace_dump_call_end();
53
54 return result;
55 }
56
57
58 static const char *
59 trace_screen_get_vendor(struct pipe_screen *_screen)
60 {
61 struct trace_screen *tr_scr = trace_screen(_screen);
62 struct pipe_screen *screen = tr_scr->screen;
63 const char *result;
64
65 trace_dump_call_begin("pipe_screen", "get_vendor");
66
67 trace_dump_arg(ptr, screen);
68
69 result = screen->get_vendor(screen);
70
71 trace_dump_ret(string, result);
72
73 trace_dump_call_end();
74
75 return result;
76 }
77
78
79 static int
80 trace_screen_get_param(struct pipe_screen *_screen,
81 int param)
82 {
83 struct trace_screen *tr_scr = trace_screen(_screen);
84 struct pipe_screen *screen = tr_scr->screen;
85 int result;
86
87 trace_dump_call_begin("pipe_screen", "get_param");
88
89 trace_dump_arg(ptr, screen);
90 trace_dump_arg(int, param);
91
92 result = screen->get_param(screen, param);
93
94 trace_dump_ret(int, result);
95
96 trace_dump_call_end();
97
98 return result;
99 }
100
101
102 static float
103 trace_screen_get_paramf(struct pipe_screen *_screen,
104 int param)
105 {
106 struct trace_screen *tr_scr = trace_screen(_screen);
107 struct pipe_screen *screen = tr_scr->screen;
108 float result;
109
110 trace_dump_call_begin("pipe_screen", "get_paramf");
111
112 trace_dump_arg(ptr, screen);
113 trace_dump_arg(int, param);
114
115 result = screen->get_paramf(screen, param);
116
117 trace_dump_ret(float, result);
118
119 trace_dump_call_end();
120
121 return result;
122 }
123
124
125 static boolean
126 trace_screen_is_format_supported(struct pipe_screen *_screen,
127 enum pipe_format format,
128 enum pipe_texture_target target,
129 unsigned tex_usage,
130 unsigned geom_flags)
131 {
132 struct trace_screen *tr_scr = trace_screen(_screen);
133 struct pipe_screen *screen = tr_scr->screen;
134 boolean result;
135
136 trace_dump_call_begin("pipe_screen", "is_format_supported");
137
138 trace_dump_arg(ptr, screen);
139 trace_dump_arg(format, format);
140 trace_dump_arg(int, target);
141 trace_dump_arg(uint, tex_usage);
142 trace_dump_arg(uint, geom_flags);
143
144 result = screen->is_format_supported(screen, format, target, tex_usage, geom_flags);
145
146 trace_dump_ret(bool, result);
147
148 trace_dump_call_end();
149
150 return result;
151 }
152
153
154 static struct pipe_texture *
155 trace_screen_texture_create(struct pipe_screen *_screen,
156 const struct pipe_texture *templat)
157 {
158 struct trace_screen *tr_scr = trace_screen(_screen);
159 struct pipe_screen *screen = tr_scr->screen;
160 struct pipe_texture *result;
161
162 trace_dump_call_begin("pipe_screen", "texture_create");
163
164 trace_dump_arg(ptr, screen);
165 trace_dump_arg(template, templat);
166
167 result = screen->texture_create(screen, templat);
168
169 trace_dump_ret(ptr, result);
170
171 trace_dump_call_end();
172
173 result = trace_texture_create(tr_scr, result);
174
175 return result;
176 }
177
178
179 static struct pipe_texture *
180 trace_screen_texture_blanket(struct pipe_screen *_screen,
181 const struct pipe_texture *templat,
182 const unsigned *ppitch,
183 struct pipe_buffer *buffer)
184 {
185 struct trace_screen *tr_scr = trace_screen(_screen);
186 struct pipe_screen *screen = tr_scr->screen;
187 unsigned pitch = *ppitch;
188 struct pipe_texture *result;
189
190 trace_dump_call_begin("pipe_screen", "texture_blanket");
191
192 trace_dump_arg(ptr, screen);
193 trace_dump_arg(template, templat);
194 trace_dump_arg(uint, pitch);
195 trace_dump_arg(ptr, buffer);
196
197 result = screen->texture_blanket(screen, templat, ppitch, buffer);
198
199 trace_dump_ret(ptr, result);
200
201 trace_dump_call_end();
202
203 result = trace_texture_create(tr_scr, result);
204
205 return result;
206 }
207
208
209 static void
210 trace_screen_texture_destroy(struct pipe_texture *texture)
211 {
212 struct pipe_screen *screen = texture->screen;
213
214 trace_dump_call_begin("pipe_screen", "texture_destroy");
215
216 trace_dump_arg(ptr, screen);
217 trace_dump_arg(ptr, texture);
218
219 trace_texture_destroy(trace_screen(screen), texture);
220
221 trace_dump_call_end();
222 }
223
224
225 static struct pipe_surface *
226 trace_screen_get_tex_surface(struct pipe_screen *_screen,
227 struct pipe_texture *texture,
228 unsigned face, unsigned level,
229 unsigned zslice,
230 unsigned usage)
231 {
232 struct trace_screen *tr_scr = trace_screen(_screen);
233 struct pipe_screen *screen = tr_scr->screen;
234 struct trace_texture *tr_tex;
235 struct pipe_surface *result;
236
237 assert(texture);
238 tr_tex = trace_texture(tr_scr, texture);
239 texture = tr_tex->texture;
240 assert(texture->screen == screen);
241
242 trace_dump_call_begin("pipe_screen", "get_tex_surface");
243
244 trace_dump_arg(ptr, screen);
245 trace_dump_arg(ptr, texture);
246 trace_dump_arg(uint, face);
247 trace_dump_arg(uint, level);
248 trace_dump_arg(uint, zslice);
249 trace_dump_arg(uint, usage);
250
251 result = screen->get_tex_surface(screen, texture, face, level, zslice, usage);
252
253 trace_dump_ret(ptr, result);
254
255 trace_dump_call_end();
256
257 result = trace_surface_create(tr_tex, result);
258
259 return result;
260 }
261
262
263 static void
264 trace_screen_tex_surface_destroy(struct pipe_surface *surface)
265 {
266 struct pipe_screen *screen = surface->texture->screen;
267
268 trace_dump_call_begin("pipe_screen", "tex_surface_destroy");
269
270 trace_dump_arg(ptr, screen);
271 trace_dump_arg(ptr, surface);
272
273 trace_surface_destroy(trace_texture(trace_screen(screen), surface->texture),
274 surface);
275
276 trace_dump_call_end();
277 }
278
279
280 static struct pipe_transfer *
281 trace_screen_get_tex_transfer(struct pipe_screen *_screen,
282 struct pipe_texture *texture,
283 unsigned face, unsigned level,
284 unsigned zslice,
285 enum pipe_transfer_usage usage,
286 unsigned x, unsigned y, unsigned w, unsigned h)
287 {
288 struct trace_screen *tr_scr = trace_screen(_screen);
289 struct pipe_screen *screen = tr_scr->screen;
290 struct trace_texture *tr_tex;
291 struct pipe_transfer *result;
292
293 assert(texture);
294 tr_tex = trace_texture(tr_scr, texture);
295 texture = tr_tex->texture;
296 assert(texture->screen == screen);
297
298 trace_dump_call_begin("pipe_screen", "get_tex_transfer");
299
300 trace_dump_arg(ptr, screen);
301 trace_dump_arg(ptr, texture);
302 trace_dump_arg(uint, face);
303 trace_dump_arg(uint, level);
304 trace_dump_arg(uint, zslice);
305 trace_dump_arg(uint, usage);
306
307 result = screen->get_tex_transfer(screen, texture, face, level, zslice, usage,
308 x, y, w, h);
309
310 trace_dump_ret(ptr, result);
311
312 trace_dump_call_end();
313
314 result = trace_transfer_create(tr_tex, result);
315
316 return result;
317 }
318
319
320 static void
321 trace_screen_tex_transfer_destroy(struct pipe_transfer *transfer)
322 {
323 struct pipe_texture *texture = transfer->texture;
324 struct pipe_screen *screen = texture->screen;
325
326 trace_dump_call_begin("pipe_screen", "tex_transfer_destroy");
327
328 trace_dump_arg(ptr, screen);
329 trace_dump_arg(ptr, transfer);
330
331 trace_transfer_destroy(trace_texture(trace_screen(screen), texture),
332 transfer);
333
334 trace_dump_call_end();
335 }
336
337
338 static void *
339 trace_screen_transfer_map(struct pipe_screen *_screen,
340 struct pipe_transfer *transfer)
341 {
342 struct trace_screen *tr_scr = trace_screen(_screen);
343 struct pipe_screen *screen = tr_scr->screen;
344 struct trace_texture *tr_tex;
345 struct trace_transfer *tr_trans;
346 void *map;
347
348 tr_tex = trace_texture(tr_scr, transfer->texture);
349 tr_trans = trace_transfer(tr_tex, transfer);
350 transfer = tr_trans->transfer;
351
352 map = screen->transfer_map(screen, transfer);
353 if(map) {
354 if(transfer->usage != PIPE_TRANSFER_READ) {
355 assert(!tr_trans->map);
356 tr_trans->map = map;
357 }
358 }
359
360 return map;
361 }
362
363
364 static void
365 trace_screen_transfer_unmap(struct pipe_screen *_screen,
366 struct pipe_transfer *transfer)
367 {
368 struct trace_screen *tr_scr = trace_screen(_screen);
369 struct pipe_screen *screen = tr_scr->screen;
370 struct trace_texture *tr_tex;
371 struct trace_transfer *tr_trans;
372
373 tr_tex = trace_texture(tr_scr, transfer->texture);
374 tr_trans = trace_transfer(tr_tex, transfer);
375 transfer = tr_trans->transfer;
376
377 if(tr_trans->map) {
378 size_t size = transfer->nblocksy * transfer->stride;
379
380 trace_dump_call_begin("pipe_winsys", "transfer_write");
381
382 trace_dump_arg(ptr, screen);
383
384 trace_dump_arg(ptr, transfer);
385
386 trace_dump_arg_begin("data");
387 trace_dump_bytes(tr_trans->map, size);
388 trace_dump_arg_end();
389
390 trace_dump_arg_begin("stride");
391 trace_dump_uint(transfer->stride);
392 trace_dump_arg_end();
393
394 trace_dump_arg_begin("size");
395 trace_dump_uint(size);
396 trace_dump_arg_end();
397
398 trace_dump_call_end();
399
400 tr_trans->map = NULL;
401 }
402
403 screen->transfer_unmap(screen, transfer);
404 }
405
406
407 static void
408 trace_screen_destroy(struct pipe_screen *_screen)
409 {
410 struct trace_screen *tr_scr = trace_screen(_screen);
411 struct pipe_screen *screen = tr_scr->screen;
412
413 trace_dump_call_begin("pipe_screen", "destroy");
414
415 trace_dump_arg(ptr, screen);
416
417 screen->destroy(screen);
418
419 trace_dump_call_end();
420
421 trace_dump_trace_end();
422
423 FREE(tr_scr);
424 }
425
426
427 struct pipe_screen *
428 trace_screen_create(struct pipe_screen *screen)
429 {
430 struct trace_screen *tr_scr;
431 struct pipe_winsys *winsys;
432
433 if(!screen)
434 goto error1;
435
436 if(!trace_dump_trace_begin())
437 goto error1;
438
439 tr_scr = CALLOC_STRUCT(trace_screen);
440 if(!tr_scr)
441 goto error2;
442
443 winsys = trace_winsys_create(screen->winsys);
444 if(!winsys)
445 goto error3;
446
447 tr_scr->base.winsys = winsys;
448 tr_scr->base.destroy = trace_screen_destroy;
449 tr_scr->base.get_name = trace_screen_get_name;
450 tr_scr->base.get_vendor = trace_screen_get_vendor;
451 tr_scr->base.get_param = trace_screen_get_param;
452 tr_scr->base.get_paramf = trace_screen_get_paramf;
453 tr_scr->base.is_format_supported = trace_screen_is_format_supported;
454 tr_scr->base.texture_create = trace_screen_texture_create;
455 tr_scr->base.texture_blanket = trace_screen_texture_blanket;
456 tr_scr->base.texture_destroy = trace_screen_texture_destroy;
457 tr_scr->base.get_tex_surface = trace_screen_get_tex_surface;
458 tr_scr->base.tex_surface_destroy = trace_screen_tex_surface_destroy;
459 tr_scr->base.get_tex_transfer = trace_screen_get_tex_transfer;
460 tr_scr->base.tex_transfer_destroy = trace_screen_tex_transfer_destroy;
461 tr_scr->base.transfer_map = trace_screen_transfer_map;
462 tr_scr->base.transfer_unmap = trace_screen_transfer_unmap;
463
464 tr_scr->screen = screen;
465
466 trace_dump_call_begin("", "pipe_screen_create");
467 trace_dump_arg_begin("winsys");
468 trace_dump_ptr(screen->winsys);
469 trace_dump_arg_end();
470 trace_dump_ret(ptr, screen);
471 trace_dump_call_end();
472
473 return &tr_scr->base;
474
475 error3:
476 FREE(tr_scr);
477 error2:
478 trace_dump_trace_end();
479 error1:
480 return screen;
481 }
482
483
484 struct trace_screen *
485 trace_screen(struct pipe_screen *screen)
486 {
487 assert(screen);
488 assert(screen->destroy == trace_screen_destroy);
489 return (struct trace_screen *)screen;
490 }