ddebug/rbug/trace: add get_disk_shader_cache() to pass-throughs
[mesa.git] / src / gallium / drivers / trace / tr_screen.c
1 /**************************************************************************
2 *
3 * Copyright 2008 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 #include "util/u_format.h"
29 #include "util/u_memory.h"
30 #include "util/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 const char *
86 trace_screen_get_device_vendor(struct pipe_screen *_screen)
87 {
88 struct trace_screen *tr_scr = trace_screen(_screen);
89 struct pipe_screen *screen = tr_scr->screen;
90 const char *result;
91
92 trace_dump_call_begin("pipe_screen", "get_device_vendor");
93
94 trace_dump_arg(ptr, screen);
95
96 result = screen->get_device_vendor(screen);
97
98 trace_dump_ret(string, result);
99
100 trace_dump_call_end();
101
102 return result;
103 }
104
105
106 static struct disk_cache *
107 trace_screen_get_disk_shader_cache(struct pipe_screen *_screen)
108 {
109 struct trace_screen *tr_scr = trace_screen(_screen);
110 struct pipe_screen *screen = tr_scr->screen;
111
112 trace_dump_call_begin("pipe_screen", "get_disk_shader_cache");
113
114 trace_dump_arg(ptr, screen);
115
116 struct disk_cache *result = screen->get_disk_shader_cache(screen);
117
118 trace_dump_ret(ptr, result);
119
120 trace_dump_call_end();
121
122 return result;
123 }
124
125
126 static int
127 trace_screen_get_param(struct pipe_screen *_screen,
128 enum pipe_cap param)
129 {
130 struct trace_screen *tr_scr = trace_screen(_screen);
131 struct pipe_screen *screen = tr_scr->screen;
132 int result;
133
134 trace_dump_call_begin("pipe_screen", "get_param");
135
136 trace_dump_arg(ptr, screen);
137 trace_dump_arg(int, param);
138
139 result = screen->get_param(screen, param);
140
141 trace_dump_ret(int, result);
142
143 trace_dump_call_end();
144
145 return result;
146 }
147
148
149 static int
150 trace_screen_get_shader_param(struct pipe_screen *_screen, unsigned shader,
151 enum pipe_shader_cap param)
152 {
153 struct trace_screen *tr_scr = trace_screen(_screen);
154 struct pipe_screen *screen = tr_scr->screen;
155 int result;
156
157 trace_dump_call_begin("pipe_screen", "get_shader_param");
158
159 trace_dump_arg(ptr, screen);
160 trace_dump_arg(uint, shader);
161 trace_dump_arg(int, param);
162
163 result = screen->get_shader_param(screen, shader, param);
164
165 trace_dump_ret(int, result);
166
167 trace_dump_call_end();
168
169 return result;
170 }
171
172
173 static float
174 trace_screen_get_paramf(struct pipe_screen *_screen,
175 enum pipe_capf param)
176 {
177 struct trace_screen *tr_scr = trace_screen(_screen);
178 struct pipe_screen *screen = tr_scr->screen;
179 float result;
180
181 trace_dump_call_begin("pipe_screen", "get_paramf");
182
183 trace_dump_arg(ptr, screen);
184 trace_dump_arg(int, param);
185
186 result = screen->get_paramf(screen, param);
187
188 trace_dump_ret(float, result);
189
190 trace_dump_call_end();
191
192 return result;
193 }
194
195
196 static int
197 trace_screen_get_compute_param(struct pipe_screen *_screen,
198 enum pipe_shader_ir ir_type,
199 enum pipe_compute_cap param, void *data)
200 {
201 struct trace_screen *tr_scr = trace_screen(_screen);
202 struct pipe_screen *screen = tr_scr->screen;
203 int result;
204
205 trace_dump_call_begin("pipe_screen", "get_compute_param");
206
207 trace_dump_arg(ptr, screen);
208 trace_dump_arg(int, ir_type);
209 trace_dump_arg(int, param);
210 trace_dump_arg(ptr, data);
211
212 result = screen->get_compute_param(screen, ir_type, param, data);
213
214 trace_dump_ret(int, result);
215
216 trace_dump_call_end();
217
218 return result;
219 }
220
221
222 static boolean
223 trace_screen_is_format_supported(struct pipe_screen *_screen,
224 enum pipe_format format,
225 enum pipe_texture_target target,
226 unsigned sample_count,
227 unsigned tex_usage)
228 {
229 struct trace_screen *tr_scr = trace_screen(_screen);
230 struct pipe_screen *screen = tr_scr->screen;
231 boolean result;
232
233 trace_dump_call_begin("pipe_screen", "is_format_supported");
234
235 trace_dump_arg(ptr, screen);
236 trace_dump_arg(format, format);
237 trace_dump_arg(int, target);
238 trace_dump_arg(uint, sample_count);
239 trace_dump_arg(uint, tex_usage);
240
241 result = screen->is_format_supported(screen, format, target, sample_count,
242 tex_usage);
243
244 trace_dump_ret(bool, result);
245
246 trace_dump_call_end();
247
248 return result;
249 }
250
251
252 static struct pipe_context *
253 trace_screen_context_create(struct pipe_screen *_screen, void *priv,
254 unsigned flags)
255 {
256 struct trace_screen *tr_scr = trace_screen(_screen);
257 struct pipe_screen *screen = tr_scr->screen;
258 struct pipe_context *result;
259
260 trace_dump_call_begin("pipe_screen", "context_create");
261
262 trace_dump_arg(ptr, screen);
263 trace_dump_arg(ptr, priv);
264 trace_dump_arg(uint, flags);
265
266 result = screen->context_create(screen, priv, flags);
267
268 trace_dump_ret(ptr, result);
269
270 trace_dump_call_end();
271
272 result = trace_context_create(tr_scr, result);
273
274 return result;
275 }
276
277
278 static void
279 trace_screen_flush_frontbuffer(struct pipe_screen *_screen,
280 struct pipe_resource *_resource,
281 unsigned level, unsigned layer,
282 void *context_private,
283 struct pipe_box *sub_box)
284 {
285 struct trace_screen *tr_scr = trace_screen(_screen);
286 struct trace_resource *tr_res = trace_resource(_resource);
287 struct pipe_screen *screen = tr_scr->screen;
288 struct pipe_resource *resource = tr_res->resource;
289
290 trace_dump_call_begin("pipe_screen", "flush_frontbuffer");
291
292 trace_dump_arg(ptr, screen);
293 trace_dump_arg(ptr, resource);
294 trace_dump_arg(uint, level);
295 trace_dump_arg(uint, layer);
296 /* XXX: hide, as there is nothing we can do with this
297 trace_dump_arg(ptr, context_private);
298 */
299
300 screen->flush_frontbuffer(screen, resource, level, layer, context_private, sub_box);
301
302 trace_dump_call_end();
303 }
304
305
306 /********************************************************************
307 * texture
308 */
309
310
311 static struct pipe_resource *
312 trace_screen_resource_create(struct pipe_screen *_screen,
313 const struct pipe_resource *templat)
314 {
315 struct trace_screen *tr_scr = trace_screen(_screen);
316 struct pipe_screen *screen = tr_scr->screen;
317 struct pipe_resource *result;
318
319 trace_dump_call_begin("pipe_screen", "resource_create");
320
321 trace_dump_arg(ptr, screen);
322 trace_dump_arg(resource_template, templat);
323
324 result = screen->resource_create(screen, templat);
325
326 trace_dump_ret(ptr, result);
327
328 trace_dump_call_end();
329
330 result = trace_resource_create(tr_scr, result);
331
332 return result;
333 }
334
335 static struct pipe_resource *
336 trace_screen_resource_from_handle(struct pipe_screen *_screen,
337 const struct pipe_resource *templ,
338 struct winsys_handle *handle,
339 unsigned usage)
340 {
341 struct trace_screen *tr_screen = trace_screen(_screen);
342 struct pipe_screen *screen = tr_screen->screen;
343 struct pipe_resource *result;
344
345 /* TODO trace call */
346
347 result = screen->resource_from_handle(screen, templ, handle, usage);
348
349 result = trace_resource_create(trace_screen(_screen), result);
350
351 return result;
352 }
353
354 static boolean
355 trace_screen_resource_get_handle(struct pipe_screen *_screen,
356 struct pipe_context *_pipe,
357 struct pipe_resource *_resource,
358 struct winsys_handle *handle,
359 unsigned usage)
360 {
361 struct trace_screen *tr_screen = trace_screen(_screen);
362 struct trace_context *tr_pipe = _pipe ? trace_context(_pipe) : NULL;
363 struct trace_resource *tr_resource = trace_resource(_resource);
364 struct pipe_screen *screen = tr_screen->screen;
365 struct pipe_resource *resource = tr_resource->resource;
366
367 /* TODO trace call */
368
369 return screen->resource_get_handle(screen, tr_pipe ? tr_pipe->pipe : NULL,
370 resource, handle, usage);
371 }
372
373 static void
374 trace_screen_resource_changed(struct pipe_screen *_screen,
375 struct pipe_resource *_resource)
376 {
377 struct trace_screen *tr_scr = trace_screen(_screen);
378 struct trace_resource *tr_res = trace_resource(_resource);
379 struct pipe_screen *screen = tr_scr->screen;
380 struct pipe_resource *resource = tr_res->resource;
381
382 assert(resource->screen == screen);
383
384 trace_dump_call_begin("pipe_screen", "resource_changed");
385
386 trace_dump_arg(ptr, screen);
387 trace_dump_arg(ptr, resource);
388
389 screen->resource_changed(screen, resource);
390
391 trace_dump_call_end();
392 }
393
394 static void
395 trace_screen_resource_destroy(struct pipe_screen *_screen,
396 struct pipe_resource *_resource)
397 {
398 struct trace_screen *tr_scr = trace_screen(_screen);
399 struct trace_resource *tr_res = trace_resource(_resource);
400 struct pipe_screen *screen = tr_scr->screen;
401 struct pipe_resource *resource = tr_res->resource;
402
403 assert(resource->screen == screen);
404
405 trace_dump_call_begin("pipe_screen", "resource_destroy");
406
407 trace_dump_arg(ptr, screen);
408 trace_dump_arg(ptr, resource);
409
410 trace_dump_call_end();
411
412 trace_resource_destroy(tr_scr, tr_res);
413 }
414
415
416 /********************************************************************
417 * fence
418 */
419
420
421 static void
422 trace_screen_fence_reference(struct pipe_screen *_screen,
423 struct pipe_fence_handle **pdst,
424 struct pipe_fence_handle *src)
425 {
426 struct trace_screen *tr_scr = trace_screen(_screen);
427 struct pipe_screen *screen = tr_scr->screen;
428 struct pipe_fence_handle *dst;
429
430 assert(pdst);
431 dst = *pdst;
432
433 trace_dump_call_begin("pipe_screen", "fence_reference");
434
435 trace_dump_arg(ptr, screen);
436 trace_dump_arg(ptr, dst);
437 trace_dump_arg(ptr, src);
438
439 screen->fence_reference(screen, pdst, src);
440
441 trace_dump_call_end();
442 }
443
444
445 static boolean
446 trace_screen_fence_finish(struct pipe_screen *_screen,
447 struct pipe_context *_ctx,
448 struct pipe_fence_handle *fence,
449 uint64_t timeout)
450 {
451 struct trace_screen *tr_scr = trace_screen(_screen);
452 struct pipe_screen *screen = tr_scr->screen;
453 struct pipe_context *ctx = _ctx ? trace_context(_ctx)->pipe : NULL;
454 int result;
455
456 trace_dump_call_begin("pipe_screen", "fence_finish");
457
458 trace_dump_arg(ptr, screen);
459 trace_dump_arg(ptr, ctx);
460 trace_dump_arg(ptr, fence);
461 trace_dump_arg(uint, timeout);
462
463 result = screen->fence_finish(screen, ctx, fence, timeout);
464
465 trace_dump_ret(bool, result);
466
467 trace_dump_call_end();
468
469 return result;
470 }
471
472
473 /********************************************************************
474 * screen
475 */
476
477 static uint64_t
478 trace_screen_get_timestamp(struct pipe_screen *_screen)
479 {
480 struct trace_screen *tr_scr = trace_screen(_screen);
481 struct pipe_screen *screen = tr_scr->screen;
482 uint64_t result;
483
484 trace_dump_call_begin("pipe_screen", "get_timestamp");
485 trace_dump_arg(ptr, screen);
486
487 result = screen->get_timestamp(screen);
488
489 trace_dump_ret(uint, result);
490 trace_dump_call_end();
491
492 return result;
493 }
494
495 static void
496 trace_screen_destroy(struct pipe_screen *_screen)
497 {
498 struct trace_screen *tr_scr = trace_screen(_screen);
499 struct pipe_screen *screen = tr_scr->screen;
500
501 trace_dump_call_begin("pipe_screen", "destroy");
502 trace_dump_arg(ptr, screen);
503 trace_dump_call_end();
504
505 screen->destroy(screen);
506
507 FREE(tr_scr);
508 }
509
510 boolean
511 trace_enabled(void)
512 {
513 static boolean firstrun = TRUE;
514
515 if (!firstrun)
516 return trace;
517 firstrun = FALSE;
518
519 if(trace_dump_trace_begin()) {
520 trace_dumping_start();
521 trace = TRUE;
522 }
523
524 return trace;
525 }
526
527 struct pipe_screen *
528 trace_screen_create(struct pipe_screen *screen)
529 {
530 struct trace_screen *tr_scr;
531
532 if (!trace_enabled())
533 goto error1;
534
535 trace_dump_call_begin("", "pipe_screen_create");
536
537 tr_scr = CALLOC_STRUCT(trace_screen);
538 if (!tr_scr)
539 goto error2;
540
541 #define SCR_INIT(_member) \
542 tr_scr->base._member = screen->_member ? trace_screen_##_member : NULL
543
544 tr_scr->base.destroy = trace_screen_destroy;
545 tr_scr->base.get_name = trace_screen_get_name;
546 tr_scr->base.get_vendor = trace_screen_get_vendor;
547 tr_scr->base.get_device_vendor = trace_screen_get_device_vendor;
548 SCR_INIT(get_disk_shader_cache);
549 tr_scr->base.get_param = trace_screen_get_param;
550 tr_scr->base.get_shader_param = trace_screen_get_shader_param;
551 tr_scr->base.get_paramf = trace_screen_get_paramf;
552 tr_scr->base.get_compute_param = trace_screen_get_compute_param;
553 tr_scr->base.is_format_supported = trace_screen_is_format_supported;
554 assert(screen->context_create);
555 tr_scr->base.context_create = trace_screen_context_create;
556 tr_scr->base.resource_create = trace_screen_resource_create;
557 tr_scr->base.resource_from_handle = trace_screen_resource_from_handle;
558 tr_scr->base.resource_get_handle = trace_screen_resource_get_handle;
559 SCR_INIT(resource_changed);
560 tr_scr->base.resource_destroy = trace_screen_resource_destroy;
561 tr_scr->base.fence_reference = trace_screen_fence_reference;
562 tr_scr->base.fence_finish = trace_screen_fence_finish;
563 tr_scr->base.flush_frontbuffer = trace_screen_flush_frontbuffer;
564 tr_scr->base.get_timestamp = trace_screen_get_timestamp;
565
566 tr_scr->screen = screen;
567
568 trace_dump_ret(ptr, screen);
569 trace_dump_call_end();
570
571 return &tr_scr->base;
572
573 error2:
574 trace_dump_ret(ptr, screen);
575 trace_dump_call_end();
576 error1:
577 return screen;
578 }
579
580
581 struct trace_screen *
582 trace_screen(struct pipe_screen *screen)
583 {
584 assert(screen);
585 assert(screen->destroy == trace_screen_destroy);
586 return (struct trace_screen *)screen;
587 }