gallium: Fix up trace driver for introduction of struct pipe_transfer.
[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_release(struct pipe_screen *_screen,
211 struct pipe_texture **ptexture)
212 {
213 struct trace_screen *tr_scr = trace_screen(_screen);
214 struct pipe_screen *screen = tr_scr->screen;
215 struct trace_texture *tr_tex;
216 struct pipe_texture *texture;
217
218 assert(ptexture);
219 if(*ptexture) {
220 tr_tex = trace_texture(tr_scr, *ptexture);
221 texture = tr_tex->texture;
222 assert(texture->screen == screen);
223 }
224 else
225 texture = NULL;
226
227 if (*ptexture) {
228 if (!--(*ptexture)->refcount) {
229 trace_dump_call_begin("pipe_screen", "texture_destroy");
230
231 trace_dump_arg(ptr, screen);
232 trace_dump_arg(ptr, texture);
233
234 trace_texture_destroy(tr_scr, *ptexture);
235
236 trace_dump_call_end();
237 }
238
239 *ptexture = NULL;
240 }
241 }
242
243
244 static struct pipe_surface *
245 trace_screen_get_tex_surface(struct pipe_screen *_screen,
246 struct pipe_texture *texture,
247 unsigned face, unsigned level,
248 unsigned zslice,
249 unsigned usage)
250 {
251 struct trace_screen *tr_scr = trace_screen(_screen);
252 struct pipe_screen *screen = tr_scr->screen;
253 struct trace_texture *tr_tex;
254 struct pipe_surface *result;
255
256 assert(texture);
257 tr_tex = trace_texture(tr_scr, texture);
258 texture = tr_tex->texture;
259 assert(texture->screen == screen);
260
261 trace_dump_call_begin("pipe_screen", "get_tex_surface");
262
263 trace_dump_arg(ptr, screen);
264 trace_dump_arg(ptr, texture);
265 trace_dump_arg(uint, face);
266 trace_dump_arg(uint, level);
267 trace_dump_arg(uint, zslice);
268 trace_dump_arg(uint, usage);
269
270 result = screen->get_tex_surface(screen, texture, face, level, zslice, usage);
271
272 trace_dump_ret(ptr, result);
273
274 trace_dump_call_end();
275
276 result = trace_surface_create(tr_tex, result);
277
278 return result;
279 }
280
281
282 static void
283 trace_screen_tex_surface_release(struct pipe_screen *_screen,
284 struct pipe_surface **psurface)
285 {
286 struct trace_screen *tr_scr = trace_screen(_screen);
287 struct pipe_screen *screen = tr_scr->screen;
288 struct trace_texture *tr_tex;
289 struct trace_surface *tr_surf;
290 struct pipe_surface *surface;
291
292 assert(psurface);
293 if(*psurface) {
294 tr_tex = trace_texture(tr_scr, (*psurface)->texture);
295 tr_surf = trace_surface(tr_tex, *psurface);
296 surface = tr_surf->surface;
297 }
298 else
299 surface = NULL;
300
301 if (*psurface) {
302 if (!--(*psurface)->refcount) {
303 trace_dump_call_begin("pipe_screen", "tex_surface_destroy");
304
305 trace_dump_arg(ptr, screen);
306 trace_dump_arg(ptr, surface);
307
308 trace_surface_destroy(tr_tex, *psurface);
309
310 trace_dump_call_end();
311 }
312
313 *psurface = NULL;
314 }
315 }
316
317
318 static struct pipe_transfer *
319 trace_screen_get_tex_transfer(struct pipe_screen *_screen,
320 struct pipe_texture *texture,
321 unsigned face, unsigned level,
322 unsigned zslice,
323 enum pipe_transfer_usage usage,
324 unsigned x, unsigned y, unsigned w, unsigned h)
325 {
326 struct trace_screen *tr_scr = trace_screen(_screen);
327 struct pipe_screen *screen = tr_scr->screen;
328 struct trace_texture *tr_tex;
329 struct pipe_transfer *result;
330
331 assert(texture);
332 tr_tex = trace_texture(tr_scr, texture);
333 texture = tr_tex->texture;
334 assert(texture->screen == screen);
335
336 trace_dump_call_begin("pipe_screen", "get_tex_transfer");
337
338 trace_dump_arg(ptr, screen);
339 trace_dump_arg(ptr, texture);
340 trace_dump_arg(uint, face);
341 trace_dump_arg(uint, level);
342 trace_dump_arg(uint, zslice);
343 trace_dump_arg(uint, usage);
344
345 result = screen->get_tex_transfer(screen, texture, face, level, zslice, usage,
346 x, y, w, h);
347
348 trace_dump_ret(ptr, result);
349
350 trace_dump_call_end();
351
352 result = trace_transfer_create(tr_tex, result);
353
354 return result;
355 }
356
357
358 static void
359 trace_screen_tex_transfer_release(struct pipe_screen *_screen,
360 struct pipe_transfer **ptransfer)
361 {
362 struct trace_screen *tr_scr = trace_screen(_screen);
363 struct pipe_screen *screen = tr_scr->screen;
364 struct trace_texture *tr_tex;
365 struct trace_transfer *tr_trans;
366 struct pipe_transfer *transfer;
367
368 assert(ptransfer);
369 if(*ptransfer) {
370 tr_tex = trace_texture(tr_scr, (*ptransfer)->texture);
371 tr_trans = trace_transfer(tr_tex, *ptransfer);
372 transfer = tr_trans->transfer;
373 }
374 else
375 transfer = NULL;
376
377 if (*ptransfer) {
378 if (!--(*ptransfer)->refcount) {
379 trace_dump_call_begin("pipe_screen", "tex_transfer_destroy");
380
381 trace_dump_arg(ptr, screen);
382 trace_dump_arg(ptr, transfer);
383
384 trace_transfer_destroy(tr_tex, *ptransfer);
385
386 trace_dump_call_end();
387 }
388
389 *ptransfer = NULL;
390 }
391 }
392
393
394 static void *
395 trace_screen_transfer_map(struct pipe_screen *_screen,
396 struct pipe_transfer *transfer)
397 {
398 struct trace_screen *tr_scr = trace_screen(_screen);
399 struct pipe_screen *screen = tr_scr->screen;
400 struct trace_texture *tr_tex;
401 struct trace_transfer *tr_trans;
402 void *map;
403
404 tr_tex = trace_texture(tr_scr, transfer->texture);
405 tr_trans = trace_transfer(tr_tex, transfer);
406 transfer = tr_trans->transfer;
407
408 map = screen->transfer_map(screen, transfer);
409 if(map) {
410 if(transfer->usage != PIPE_TRANSFER_READ) {
411 assert(!tr_trans->map);
412 tr_trans->map = map;
413 }
414 }
415
416 return map;
417 }
418
419
420 static void
421 trace_screen_transfer_unmap(struct pipe_screen *_screen,
422 struct pipe_transfer *transfer)
423 {
424 struct trace_screen *tr_scr = trace_screen(_screen);
425 struct pipe_screen *screen = tr_scr->screen;
426 struct trace_texture *tr_tex;
427 struct trace_transfer *tr_trans;
428
429 tr_tex = trace_texture(tr_scr, transfer->texture);
430 tr_trans = trace_transfer(tr_tex, transfer);
431 transfer = tr_trans->transfer;
432
433 if(tr_trans->map) {
434 size_t size = transfer->nblocksy * transfer->stride;
435
436 trace_dump_call_begin("pipe_winsys", "transfer_write");
437
438 trace_dump_arg(ptr, screen);
439
440 trace_dump_arg(ptr, transfer);
441
442 trace_dump_arg_begin("data");
443 trace_dump_bytes(tr_trans->map, size);
444 trace_dump_arg_end();
445
446 trace_dump_arg_begin("stride");
447 trace_dump_uint(transfer->stride);
448 trace_dump_arg_end();
449
450 trace_dump_arg_begin("size");
451 trace_dump_uint(size);
452 trace_dump_arg_end();
453
454 trace_dump_call_end();
455
456 tr_trans->map = NULL;
457 }
458
459 screen->transfer_unmap(screen, transfer);
460 }
461
462
463 static void
464 trace_screen_destroy(struct pipe_screen *_screen)
465 {
466 struct trace_screen *tr_scr = trace_screen(_screen);
467 struct pipe_screen *screen = tr_scr->screen;
468
469 trace_dump_call_begin("pipe_screen", "destroy");
470
471 trace_dump_arg(ptr, screen);
472
473 screen->destroy(screen);
474
475 trace_dump_call_end();
476
477 trace_dump_trace_end();
478
479 FREE(tr_scr);
480 }
481
482
483 struct pipe_screen *
484 trace_screen_create(struct pipe_screen *screen)
485 {
486 struct trace_screen *tr_scr;
487 struct pipe_winsys *winsys;
488
489 if(!screen)
490 goto error1;
491
492 if(!trace_dump_trace_begin())
493 goto error1;
494
495 tr_scr = CALLOC_STRUCT(trace_screen);
496 if(!tr_scr)
497 goto error2;
498
499 winsys = trace_winsys_create(screen->winsys);
500 if(!winsys)
501 goto error3;
502
503 tr_scr->base.winsys = winsys;
504 tr_scr->base.destroy = trace_screen_destroy;
505 tr_scr->base.get_name = trace_screen_get_name;
506 tr_scr->base.get_vendor = trace_screen_get_vendor;
507 tr_scr->base.get_param = trace_screen_get_param;
508 tr_scr->base.get_paramf = trace_screen_get_paramf;
509 tr_scr->base.is_format_supported = trace_screen_is_format_supported;
510 tr_scr->base.texture_create = trace_screen_texture_create;
511 tr_scr->base.texture_blanket = trace_screen_texture_blanket;
512 tr_scr->base.texture_release = trace_screen_texture_release;
513 tr_scr->base.get_tex_surface = trace_screen_get_tex_surface;
514 tr_scr->base.tex_surface_release = trace_screen_tex_surface_release;
515 tr_scr->base.get_tex_transfer = trace_screen_get_tex_transfer;
516 tr_scr->base.tex_transfer_release = trace_screen_tex_transfer_release;
517 tr_scr->base.transfer_map = trace_screen_transfer_map;
518 tr_scr->base.transfer_unmap = trace_screen_transfer_unmap;
519
520 tr_scr->screen = screen;
521
522 trace_dump_call_begin("", "pipe_screen_create");
523 trace_dump_arg_begin("winsys");
524 trace_dump_ptr(screen->winsys);
525 trace_dump_arg_end();
526 trace_dump_ret(ptr, screen);
527 trace_dump_call_end();
528
529 return &tr_scr->base;
530
531 error3:
532 FREE(tr_scr);
533 error2:
534 trace_dump_trace_end();
535 error1:
536 return screen;
537 }
538
539
540 struct trace_screen *
541 trace_screen(struct pipe_screen *screen)
542 {
543 assert(screen);
544 assert(screen->destroy == trace_screen_destroy);
545 return (struct trace_screen *)screen;
546 }