trace: Wrap all textures and surface created by the pipe driver.
[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 "pipe/p_util.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 trace_dump_call_begin("pipe_screen", "texture_release");
228
229 trace_dump_arg(ptr, screen);
230 trace_dump_arg(ptr, texture);
231
232 if (*ptexture) {
233 if (!--(*ptexture)->refcount)
234 trace_texture_destroy(tr_scr, *ptexture);
235
236 *ptexture = NULL;
237 }
238
239 trace_dump_call_end();
240 }
241
242
243 static struct pipe_surface *
244 trace_screen_get_tex_surface(struct pipe_screen *_screen,
245 struct pipe_texture *texture,
246 unsigned face, unsigned level,
247 unsigned zslice,
248 unsigned usage)
249 {
250 struct trace_screen *tr_scr = trace_screen(_screen);
251 struct pipe_screen *screen = tr_scr->screen;
252 struct trace_texture *tr_tex;
253 struct pipe_surface *result;
254
255 assert(texture);
256 tr_tex = trace_texture(tr_scr, texture);
257 texture = tr_tex->texture;
258 assert(texture->screen == screen);
259
260 trace_dump_call_begin("pipe_screen", "get_tex_surface");
261
262 trace_dump_arg(ptr, screen);
263 trace_dump_arg(ptr, texture);
264 trace_dump_arg(uint, face);
265 trace_dump_arg(uint, level);
266 trace_dump_arg(uint, zslice);
267 trace_dump_arg(uint, usage);
268
269 result = screen->get_tex_surface(screen, texture, face, level, zslice, usage);
270
271 trace_dump_ret(ptr, result);
272
273 trace_dump_call_end();
274
275 result = trace_surface_create(tr_tex, result);
276
277 return result;
278 }
279
280
281 static void
282 trace_screen_tex_surface_release(struct pipe_screen *_screen,
283 struct pipe_surface **psurface)
284 {
285 struct trace_screen *tr_scr = trace_screen(_screen);
286 struct pipe_screen *screen = tr_scr->screen;
287 struct trace_texture *tr_tex;
288 struct trace_surface *tr_surf;
289 struct pipe_surface *surface;
290
291 assert(psurface);
292 if(*psurface) {
293 tr_tex = trace_texture(tr_scr, (*psurface)->texture);
294 tr_surf = trace_surface(tr_tex, *psurface);
295 surface = tr_surf->surface;
296 }
297 else
298 surface = NULL;
299
300 trace_dump_call_begin("pipe_screen", "tex_surface_release");
301
302 trace_dump_arg(ptr, screen);
303 trace_dump_arg(ptr, surface);
304
305 if (*psurface) {
306 if (!--(*psurface)->refcount)
307 trace_surface_destroy(tr_tex, *psurface);
308
309 *psurface = NULL;
310 }
311
312 trace_dump_call_end();
313 }
314
315
316 static void *
317 trace_screen_surface_map(struct pipe_screen *_screen,
318 struct pipe_surface *surface,
319 unsigned flags)
320 {
321 struct trace_screen *tr_scr = trace_screen(_screen);
322 struct pipe_screen *screen = tr_scr->screen;
323 struct trace_texture *tr_tex;
324 struct trace_surface *tr_surf;
325 void *map;
326
327 tr_tex = trace_texture(tr_scr, surface->texture);
328 tr_surf = trace_surface(tr_tex, surface);
329 surface = tr_surf->surface;
330
331 map = screen->surface_map(screen, surface, flags);
332 if(map) {
333 if(flags & PIPE_BUFFER_USAGE_CPU_WRITE) {
334 assert(!tr_surf->map);
335 tr_surf->map = map;
336 }
337 }
338
339 return map;
340 }
341
342
343 static void
344 trace_screen_surface_unmap(struct pipe_screen *_screen,
345 struct pipe_surface *surface)
346 {
347 struct trace_screen *tr_scr = trace_screen(_screen);
348 struct pipe_screen *screen = tr_scr->screen;
349 struct trace_texture *tr_tex;
350 struct trace_surface *tr_surf;
351
352 tr_tex = trace_texture(tr_scr, surface->texture);
353 tr_surf = trace_surface(tr_tex, surface);
354 surface = tr_surf->surface;
355
356 if(tr_surf->map) {
357 size_t size = surface->nblocksy * surface->stride;
358
359 trace_dump_call_begin("pipe_winsys", "surface_write");
360
361 trace_dump_arg(ptr, screen);
362
363 trace_dump_arg(ptr, surface);
364
365 trace_dump_arg_begin("data");
366 trace_dump_bytes(tr_surf->map, size);
367 trace_dump_arg_end();
368
369 trace_dump_arg_begin("stride");
370 trace_dump_uint(surface->stride);
371 trace_dump_arg_end();
372
373 trace_dump_arg_begin("size");
374 trace_dump_uint(size);
375 trace_dump_arg_end();
376
377 trace_dump_call_end();
378
379 tr_surf->map = NULL;
380 }
381
382 screen->surface_unmap(screen, surface);
383 }
384
385
386 static void
387 trace_screen_destroy(struct pipe_screen *_screen)
388 {
389 struct trace_screen *tr_scr = trace_screen(_screen);
390 struct pipe_screen *screen = tr_scr->screen;
391
392 trace_dump_call_begin("pipe_screen", "destroy");
393
394 trace_dump_arg(ptr, screen);
395
396 screen->destroy(screen);
397
398 trace_dump_call_end();
399
400 trace_dump_trace_end();
401
402 FREE(tr_scr);
403 }
404
405
406 struct pipe_screen *
407 trace_screen_create(struct pipe_screen *screen)
408 {
409 struct trace_screen *tr_scr;
410 struct pipe_winsys *winsys;
411
412 if(!screen)
413 goto error1;
414
415 if(!trace_dump_trace_begin())
416 goto error1;
417
418 tr_scr = CALLOC_STRUCT(trace_screen);
419 if(!tr_scr)
420 goto error2;
421
422 winsys = trace_winsys_create(screen->winsys);
423 if(!winsys)
424 goto error3;
425
426 tr_scr->base.winsys = winsys;
427 tr_scr->base.destroy = trace_screen_destroy;
428 tr_scr->base.get_name = trace_screen_get_name;
429 tr_scr->base.get_vendor = trace_screen_get_vendor;
430 tr_scr->base.get_param = trace_screen_get_param;
431 tr_scr->base.get_paramf = trace_screen_get_paramf;
432 tr_scr->base.is_format_supported = trace_screen_is_format_supported;
433 tr_scr->base.texture_create = trace_screen_texture_create;
434 tr_scr->base.texture_blanket = trace_screen_texture_blanket;
435 tr_scr->base.texture_release = trace_screen_texture_release;
436 tr_scr->base.get_tex_surface = trace_screen_get_tex_surface;
437 tr_scr->base.tex_surface_release = trace_screen_tex_surface_release;
438 tr_scr->base.surface_map = trace_screen_surface_map;
439 tr_scr->base.surface_unmap = trace_screen_surface_unmap;
440
441 tr_scr->screen = screen;
442
443 trace_dump_call_begin("", "pipe_screen_create");
444 trace_dump_arg_begin("winsys");
445 trace_dump_ptr(screen->winsys);
446 trace_dump_arg_end();
447 trace_dump_ret(ptr, screen);
448 trace_dump_call_end();
449
450 return &tr_scr->base;
451
452 error3:
453 FREE(tr_scr);
454 error2:
455 trace_dump_trace_end();
456 error1:
457 return screen;
458 }
459
460
461 struct trace_screen *
462 trace_screen(struct pipe_screen *screen)
463 {
464 assert(screen);
465 assert(screen->destroy == trace_screen_destroy);
466 return (struct trace_screen *)screen;
467 }