c6745af09f2f76cd621ff6c8427d85737422db10
[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_format.h"
29 #include "util/u_memory.h"
30 #include "util/u_simple_list.h"
31
32 #include "tr_dump.h"
33 #include "tr_dump_defines.h"
34 #include "tr_dump_state.h"
35 #include "tr_texture.h"
36 #include "tr_context.h"
37 #include "tr_screen.h"
38 #include "tr_public.h"
39
40
41 static boolean trace = FALSE;
42
43 static const char *
44 trace_screen_get_name(struct pipe_screen *_screen)
45 {
46 struct trace_screen *tr_scr = trace_screen(_screen);
47 struct pipe_screen *screen = tr_scr->screen;
48 const char *result;
49
50 trace_dump_call_begin("pipe_screen", "get_name");
51
52 trace_dump_arg(ptr, screen);
53
54 result = screen->get_name(screen);
55
56 trace_dump_ret(string, result);
57
58 trace_dump_call_end();
59
60 return result;
61 }
62
63
64 static const char *
65 trace_screen_get_vendor(struct pipe_screen *_screen)
66 {
67 struct trace_screen *tr_scr = trace_screen(_screen);
68 struct pipe_screen *screen = tr_scr->screen;
69 const char *result;
70
71 trace_dump_call_begin("pipe_screen", "get_vendor");
72
73 trace_dump_arg(ptr, screen);
74
75 result = screen->get_vendor(screen);
76
77 trace_dump_ret(string, result);
78
79 trace_dump_call_end();
80
81 return result;
82 }
83
84
85 static int
86 trace_screen_get_param(struct pipe_screen *_screen,
87 enum pipe_cap param)
88 {
89 struct trace_screen *tr_scr = trace_screen(_screen);
90 struct pipe_screen *screen = tr_scr->screen;
91 int result;
92
93 trace_dump_call_begin("pipe_screen", "get_param");
94
95 trace_dump_arg(ptr, screen);
96 trace_dump_arg(int, param);
97
98 result = screen->get_param(screen, param);
99
100 trace_dump_ret(int, result);
101
102 trace_dump_call_end();
103
104 return result;
105 }
106
107
108 static int
109 trace_screen_get_shader_param(struct pipe_screen *_screen, unsigned shader,
110 enum pipe_shader_cap param)
111 {
112 struct trace_screen *tr_scr = trace_screen(_screen);
113 struct pipe_screen *screen = tr_scr->screen;
114 int result;
115
116 trace_dump_call_begin("pipe_screen", "get_shader_param");
117
118 trace_dump_arg(ptr, screen);
119 trace_dump_arg(uint, shader);
120 trace_dump_arg(int, param);
121
122 result = screen->get_shader_param(screen, shader, param);
123
124 trace_dump_ret(int, result);
125
126 trace_dump_call_end();
127
128 return result;
129 }
130
131
132 static float
133 trace_screen_get_paramf(struct pipe_screen *_screen,
134 enum pipe_capf param)
135 {
136 struct trace_screen *tr_scr = trace_screen(_screen);
137 struct pipe_screen *screen = tr_scr->screen;
138 float result;
139
140 trace_dump_call_begin("pipe_screen", "get_paramf");
141
142 trace_dump_arg(ptr, screen);
143 trace_dump_arg(int, param);
144
145 result = screen->get_paramf(screen, param);
146
147 trace_dump_ret(float, result);
148
149 trace_dump_call_end();
150
151 return result;
152 }
153
154
155 static boolean
156 trace_screen_is_format_supported(struct pipe_screen *_screen,
157 enum pipe_format format,
158 enum pipe_texture_target target,
159 unsigned sample_count,
160 unsigned tex_usage)
161 {
162 struct trace_screen *tr_scr = trace_screen(_screen);
163 struct pipe_screen *screen = tr_scr->screen;
164 boolean result;
165
166 trace_dump_call_begin("pipe_screen", "is_format_supported");
167
168 trace_dump_arg(ptr, screen);
169 trace_dump_arg(format, format);
170 trace_dump_arg(int, target);
171 trace_dump_arg(uint, sample_count);
172 trace_dump_arg(uint, tex_usage);
173
174 result = screen->is_format_supported(screen, format, target, sample_count,
175 tex_usage);
176
177 trace_dump_ret(bool, result);
178
179 trace_dump_call_end();
180
181 return result;
182 }
183
184
185 static struct pipe_context *
186 trace_screen_context_create(struct pipe_screen *_screen, void *priv)
187 {
188 struct trace_screen *tr_scr = trace_screen(_screen);
189 struct pipe_screen *screen = tr_scr->screen;
190 struct pipe_context *result;
191
192 trace_dump_call_begin("pipe_screen", "context_create");
193
194 trace_dump_arg(ptr, screen);
195
196 result = screen->context_create(screen, priv);
197
198 trace_dump_ret(ptr, result);
199
200 trace_dump_call_end();
201
202 result = trace_context_create(tr_scr, result);
203
204 return result;
205 }
206
207
208 static void
209 trace_screen_flush_frontbuffer(struct pipe_screen *_screen,
210 struct pipe_resource *_resource,
211 unsigned level, unsigned layer,
212 void *context_private)
213 {
214 struct trace_screen *tr_scr = trace_screen(_screen);
215 struct trace_resource *tr_res = trace_resource(_resource);
216 struct pipe_screen *screen = tr_scr->screen;
217 struct pipe_resource *resource = tr_res->resource;
218
219 trace_dump_call_begin("pipe_screen", "flush_frontbuffer");
220
221 trace_dump_arg(ptr, screen);
222 trace_dump_arg(ptr, resource);
223 trace_dump_arg(uint, level);
224 trace_dump_arg(uint, layer);
225 /* XXX: hide, as there is nothing we can do with this
226 trace_dump_arg(ptr, context_private);
227 */
228
229 screen->flush_frontbuffer(screen, resource, level, layer, context_private);
230
231 trace_dump_call_end();
232 }
233
234
235 /********************************************************************
236 * texture
237 */
238
239
240 static struct pipe_resource *
241 trace_screen_resource_create(struct pipe_screen *_screen,
242 const struct pipe_resource *templat)
243 {
244 struct trace_screen *tr_scr = trace_screen(_screen);
245 struct pipe_screen *screen = tr_scr->screen;
246 struct pipe_resource *result;
247
248 trace_dump_call_begin("pipe_screen", "resource_create");
249
250 trace_dump_arg(ptr, screen);
251 trace_dump_arg(resource_template, templat);
252
253 result = screen->resource_create(screen, templat);
254
255 trace_dump_ret(ptr, result);
256
257 trace_dump_call_end();
258
259 result = trace_resource_create(tr_scr, result);
260
261 return result;
262 }
263
264 static struct pipe_resource *
265 trace_screen_resource_from_handle(struct pipe_screen *_screen,
266 const struct pipe_resource *templ,
267 struct winsys_handle *handle)
268 {
269 struct trace_screen *tr_screen = trace_screen(_screen);
270 struct pipe_screen *screen = tr_screen->screen;
271 struct pipe_resource *result;
272
273 /* TODO trace call */
274
275 result = screen->resource_from_handle(screen, templ, handle);
276
277 result = trace_resource_create(trace_screen(_screen), result);
278
279 return result;
280 }
281
282 static boolean
283 trace_screen_resource_get_handle(struct pipe_screen *_screen,
284 struct pipe_resource *_resource,
285 struct winsys_handle *handle)
286 {
287 struct trace_screen *tr_screen = trace_screen(_screen);
288 struct trace_resource *tr_resource = trace_resource(_resource);
289 struct pipe_screen *screen = tr_screen->screen;
290 struct pipe_resource *resource = tr_resource->resource;
291
292 /* TODO trace call */
293
294 return screen->resource_get_handle(screen, resource, handle);
295 }
296
297
298
299 static void
300 trace_screen_resource_destroy(struct pipe_screen *_screen,
301 struct pipe_resource *_resource)
302 {
303 struct trace_screen *tr_scr = trace_screen(_screen);
304 struct trace_resource *tr_res = trace_resource(_resource);
305 struct pipe_screen *screen = tr_scr->screen;
306 struct pipe_resource *resource = tr_res->resource;
307
308 assert(resource->screen == screen);
309
310 trace_dump_call_begin("pipe_screen", "resource_destroy");
311
312 trace_dump_arg(ptr, screen);
313 trace_dump_arg(ptr, resource);
314
315 trace_dump_call_end();
316
317 trace_resource_destroy(tr_scr, tr_res);
318 }
319
320
321 /********************************************************************
322 * fence
323 */
324
325
326 static void
327 trace_screen_fence_reference(struct pipe_screen *_screen,
328 struct pipe_fence_handle **pdst,
329 struct pipe_fence_handle *src)
330 {
331 struct trace_screen *tr_scr = trace_screen(_screen);
332 struct pipe_screen *screen = tr_scr->screen;
333 struct pipe_fence_handle *dst;
334
335 assert(pdst);
336 dst = *pdst;
337
338 trace_dump_call_begin("pipe_screen", "fence_reference");
339
340 trace_dump_arg(ptr, screen);
341 trace_dump_arg(ptr, dst);
342 trace_dump_arg(ptr, src);
343
344 screen->fence_reference(screen, pdst, src);
345
346 trace_dump_call_end();
347 }
348
349
350 static boolean
351 trace_screen_fence_signalled(struct pipe_screen *_screen,
352 struct pipe_fence_handle *fence)
353 {
354 struct trace_screen *tr_scr = trace_screen(_screen);
355 struct pipe_screen *screen = tr_scr->screen;
356 int result;
357
358 trace_dump_call_begin("pipe_screen", "fence_signalled");
359
360 trace_dump_arg(ptr, screen);
361 trace_dump_arg(ptr, fence);
362
363 result = screen->fence_signalled(screen, fence);
364
365 trace_dump_ret(bool, result);
366
367 trace_dump_call_end();
368
369 return result;
370 }
371
372
373 static boolean
374 trace_screen_fence_finish(struct pipe_screen *_screen,
375 struct pipe_fence_handle *fence,
376 uint64_t timeout)
377 {
378 struct trace_screen *tr_scr = trace_screen(_screen);
379 struct pipe_screen *screen = tr_scr->screen;
380 int result;
381
382 trace_dump_call_begin("pipe_screen", "fence_finish");
383
384 trace_dump_arg(ptr, screen);
385 trace_dump_arg(ptr, fence);
386 trace_dump_arg(uint, timeout);
387
388 result = screen->fence_finish(screen, fence, timeout);
389
390 trace_dump_ret(bool, result);
391
392 trace_dump_call_end();
393
394 return result;
395 }
396
397
398 /********************************************************************
399 * screen
400 */
401
402 static uint64_t
403 trace_screen_get_timestamp(struct pipe_screen *_screen)
404 {
405 struct trace_screen *tr_scr = trace_screen(_screen);
406 struct pipe_screen *screen = tr_scr->screen;
407 uint64_t result;
408
409 trace_dump_call_begin("pipe_screen", "get_timestamp");
410 trace_dump_arg(ptr, screen);
411
412 result = screen->get_timestamp(screen);
413
414 trace_dump_ret(uint, result);
415 trace_dump_call_end();
416
417 return result;
418 }
419
420 static void
421 trace_screen_destroy(struct pipe_screen *_screen)
422 {
423 struct trace_screen *tr_scr = trace_screen(_screen);
424 struct pipe_screen *screen = tr_scr->screen;
425
426 trace_dump_call_begin("pipe_screen", "destroy");
427 trace_dump_arg(ptr, screen);
428 trace_dump_call_end();
429
430 screen->destroy(screen);
431
432 FREE(tr_scr);
433 }
434
435 boolean
436 trace_enabled(void)
437 {
438 static boolean firstrun = TRUE;
439
440 if (!firstrun)
441 return trace;
442 firstrun = FALSE;
443
444 if(trace_dump_trace_begin()) {
445 trace_dumping_start();
446 trace = TRUE;
447 }
448
449 return trace;
450 }
451
452 struct pipe_screen *
453 trace_screen_create(struct pipe_screen *screen)
454 {
455 struct trace_screen *tr_scr;
456
457 if(!screen)
458 goto error1;
459
460 if (!trace_enabled())
461 goto error1;
462
463 trace_dump_call_begin("", "pipe_screen_create");
464
465 tr_scr = CALLOC_STRUCT(trace_screen);
466 if(!tr_scr)
467 goto error2;
468
469 tr_scr->base.destroy = trace_screen_destroy;
470 tr_scr->base.get_name = trace_screen_get_name;
471 tr_scr->base.get_vendor = trace_screen_get_vendor;
472 tr_scr->base.get_param = trace_screen_get_param;
473 tr_scr->base.get_shader_param = trace_screen_get_shader_param;
474 tr_scr->base.get_paramf = trace_screen_get_paramf;
475 tr_scr->base.is_format_supported = trace_screen_is_format_supported;
476 assert(screen->context_create);
477 tr_scr->base.context_create = trace_screen_context_create;
478 tr_scr->base.resource_create = trace_screen_resource_create;
479 tr_scr->base.resource_from_handle = trace_screen_resource_from_handle;
480 tr_scr->base.resource_get_handle = trace_screen_resource_get_handle;
481 tr_scr->base.resource_destroy = trace_screen_resource_destroy;
482 tr_scr->base.fence_reference = trace_screen_fence_reference;
483 tr_scr->base.fence_signalled = trace_screen_fence_signalled;
484 tr_scr->base.fence_finish = trace_screen_fence_finish;
485 tr_scr->base.flush_frontbuffer = trace_screen_flush_frontbuffer;
486 tr_scr->base.get_timestamp = trace_screen_get_timestamp;
487
488 tr_scr->screen = screen;
489
490 trace_dump_ret(ptr, screen);
491 trace_dump_call_end();
492
493 return &tr_scr->base;
494
495 error2:
496 trace_dump_ret(ptr, screen);
497 trace_dump_call_end();
498 error1:
499 return screen;
500 }
501
502
503 struct trace_screen *
504 trace_screen(struct pipe_screen *screen)
505 {
506 assert(screen);
507 assert(screen->destroy == trace_screen_destroy);
508 return (struct trace_screen *)screen;
509 }