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/format/u_format.h"
29 #include "util/u_memory.h"
30 #include "util/hash_table.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 #include "tr_util.h"
40
41
42 static bool trace = false;
43 static struct hash_table *trace_screens;
44
45 static const char *
trace_screen_get_name(struct pipe_screen * _screen)46 trace_screen_get_name(struct pipe_screen *_screen)
47 {
48 struct trace_screen *tr_scr = trace_screen(_screen);
49 struct pipe_screen *screen = tr_scr->screen;
50 const char *result;
51
52 trace_dump_call_begin("pipe_screen", "get_name");
53
54 trace_dump_arg(ptr, screen);
55
56 result = screen->get_name(screen);
57
58 trace_dump_ret(string, result);
59
60 trace_dump_call_end();
61
62 return result;
63 }
64
65
66 static const char *
trace_screen_get_vendor(struct pipe_screen * _screen)67 trace_screen_get_vendor(struct pipe_screen *_screen)
68 {
69 struct trace_screen *tr_scr = trace_screen(_screen);
70 struct pipe_screen *screen = tr_scr->screen;
71 const char *result;
72
73 trace_dump_call_begin("pipe_screen", "get_vendor");
74
75 trace_dump_arg(ptr, screen);
76
77 result = screen->get_vendor(screen);
78
79 trace_dump_ret(string, result);
80
81 trace_dump_call_end();
82
83 return result;
84 }
85
86
87 static const char *
trace_screen_get_device_vendor(struct pipe_screen * _screen)88 trace_screen_get_device_vendor(struct pipe_screen *_screen)
89 {
90 struct trace_screen *tr_scr = trace_screen(_screen);
91 struct pipe_screen *screen = tr_scr->screen;
92 const char *result;
93
94 trace_dump_call_begin("pipe_screen", "get_device_vendor");
95
96 trace_dump_arg(ptr, screen);
97
98 result = screen->get_device_vendor(screen);
99
100 trace_dump_ret(string, result);
101
102 trace_dump_call_end();
103
104 return result;
105 }
106
107
108 static const void *
trace_screen_get_compiler_options(struct pipe_screen * _screen,enum pipe_shader_ir ir,enum pipe_shader_type shader)109 trace_screen_get_compiler_options(struct pipe_screen *_screen,
110 enum pipe_shader_ir ir,
111 enum pipe_shader_type shader)
112 {
113 struct trace_screen *tr_scr = trace_screen(_screen);
114 struct pipe_screen *screen = tr_scr->screen;
115 const void *result;
116
117 trace_dump_call_begin("pipe_screen", "get_compiler_options");
118
119 trace_dump_arg(ptr, screen);
120 trace_dump_arg_enum(pipe_shader_ir, ir);
121 trace_dump_arg_enum(pipe_shader_type, shader);
122
123 result = screen->get_compiler_options(screen, ir, shader);
124
125 trace_dump_ret(ptr, result);
126
127 trace_dump_call_end();
128
129 return result;
130 }
131
132
133 static struct disk_cache *
trace_screen_get_disk_shader_cache(struct pipe_screen * _screen)134 trace_screen_get_disk_shader_cache(struct pipe_screen *_screen)
135 {
136 struct trace_screen *tr_scr = trace_screen(_screen);
137 struct pipe_screen *screen = tr_scr->screen;
138
139 trace_dump_call_begin("pipe_screen", "get_disk_shader_cache");
140
141 trace_dump_arg(ptr, screen);
142
143 struct disk_cache *result = screen->get_disk_shader_cache(screen);
144
145 trace_dump_ret(ptr, result);
146
147 trace_dump_call_end();
148
149 return result;
150 }
151
152
153 static int
trace_screen_get_shader_param(struct pipe_screen * _screen,enum pipe_shader_type shader,enum pipe_shader_cap param)154 trace_screen_get_shader_param(struct pipe_screen *_screen,
155 enum pipe_shader_type shader,
156 enum pipe_shader_cap param)
157 {
158 struct trace_screen *tr_scr = trace_screen(_screen);
159 struct pipe_screen *screen = tr_scr->screen;
160 int result;
161
162 trace_dump_call_begin("pipe_screen", "get_shader_param");
163
164 trace_dump_arg(ptr, screen);
165 trace_dump_arg_enum(pipe_shader_type, shader);
166 trace_dump_arg_enum(pipe_shader_cap, param);
167
168 result = screen->get_shader_param(screen, shader, param);
169
170 trace_dump_ret(int, result);
171
172 trace_dump_call_end();
173
174 return result;
175 }
176
177
178 static int
trace_screen_get_compute_param(struct pipe_screen * _screen,enum pipe_shader_ir ir_type,enum pipe_compute_cap param,void * data)179 trace_screen_get_compute_param(struct pipe_screen *_screen,
180 enum pipe_shader_ir ir_type,
181 enum pipe_compute_cap param,
182 void *data)
183 {
184 struct trace_screen *tr_scr = trace_screen(_screen);
185 struct pipe_screen *screen = tr_scr->screen;
186 int result;
187
188 trace_dump_call_begin("pipe_screen", "get_compute_param");
189
190 trace_dump_arg(ptr, screen);
191 trace_dump_arg_enum(pipe_shader_ir, ir_type);
192 trace_dump_arg_enum(pipe_compute_cap, param);
193 trace_dump_arg(ptr, data);
194
195 result = screen->get_compute_param(screen, ir_type, param, data);
196
197 trace_dump_ret(int, result);
198
199 trace_dump_call_end();
200
201 return result;
202 }
203
204 static int
trace_screen_get_video_param(struct pipe_screen * _screen,enum pipe_video_profile profile,enum pipe_video_entrypoint entrypoint,enum pipe_video_cap param)205 trace_screen_get_video_param(struct pipe_screen *_screen,
206 enum pipe_video_profile profile,
207 enum pipe_video_entrypoint entrypoint,
208 enum pipe_video_cap param)
209 {
210 struct trace_screen *tr_scr = trace_screen(_screen);
211 struct pipe_screen *screen = tr_scr->screen;
212 int result;
213
214 trace_dump_call_begin("pipe_screen", "get_video_param");
215
216 trace_dump_arg(ptr, screen);
217 trace_dump_arg_enum(pipe_video_profile, profile);
218 trace_dump_arg_enum(pipe_video_entrypoint, entrypoint);
219 trace_dump_arg_enum(pipe_video_cap, param);
220
221 result = screen->get_video_param(screen, profile, entrypoint, param);
222
223 trace_dump_ret(int, result);
224
225 trace_dump_call_end();
226
227 return result;
228 }
229
230 static bool
trace_screen_is_format_supported(struct pipe_screen * _screen,enum pipe_format format,enum pipe_texture_target target,unsigned sample_count,unsigned storage_sample_count,unsigned tex_usage)231 trace_screen_is_format_supported(struct pipe_screen *_screen,
232 enum pipe_format format,
233 enum pipe_texture_target target,
234 unsigned sample_count,
235 unsigned storage_sample_count,
236 unsigned tex_usage)
237 {
238 struct trace_screen *tr_scr = trace_screen(_screen);
239 struct pipe_screen *screen = tr_scr->screen;
240 bool result;
241
242 trace_dump_call_begin("pipe_screen", "is_format_supported");
243
244 trace_dump_arg(ptr, screen);
245 trace_dump_arg(format, format);
246 trace_dump_arg_enum(pipe_texture_target, target);
247 trace_dump_arg(uint, sample_count);
248 trace_dump_arg(uint, storage_sample_count);
249 trace_dump_arg(uint, tex_usage);
250
251 result = screen->is_format_supported(screen, format, target, sample_count,
252 storage_sample_count, tex_usage);
253
254 trace_dump_ret(bool, result);
255
256 trace_dump_call_end();
257
258 return result;
259 }
260
261 static bool
trace_screen_is_video_format_supported(struct pipe_screen * _screen,enum pipe_format format,enum pipe_video_profile profile,enum pipe_video_entrypoint entrypoint)262 trace_screen_is_video_format_supported(struct pipe_screen *_screen,
263 enum pipe_format format,
264 enum pipe_video_profile profile,
265 enum pipe_video_entrypoint entrypoint)
266 {
267 struct trace_screen *tr_scr = trace_screen(_screen);
268 struct pipe_screen *screen = tr_scr->screen;
269 bool result;
270
271 trace_dump_call_begin("pipe_screen", "is_video_format_supported");
272
273 trace_dump_arg(ptr, screen);
274 trace_dump_arg(format, format);
275 trace_dump_arg_enum(pipe_video_profile, profile);
276 trace_dump_arg_enum(pipe_video_entrypoint, entrypoint);
277
278 result = screen->is_video_format_supported(screen, format, profile, entrypoint);
279
280 trace_dump_ret(bool, result);
281
282 trace_dump_call_end();
283
284 return result;
285 }
286
287 static void
trace_screen_driver_thread_add_job(struct pipe_screen * _screen,void * data,struct util_queue_fence * fence,pipe_driver_thread_func execute,pipe_driver_thread_func cleanup,const size_t job_size)288 trace_screen_driver_thread_add_job(struct pipe_screen *_screen,
289 void *data, struct util_queue_fence *fence,
290 pipe_driver_thread_func execute,
291 pipe_driver_thread_func cleanup,
292 const size_t job_size)
293 {
294 struct trace_screen *tr_scr = trace_screen(_screen);
295 struct pipe_screen *screen = tr_scr->screen;
296
297 trace_dump_call_begin("pipe_screen", "driver_thread_add_job");
298
299 trace_dump_arg(ptr, screen);
300 trace_dump_arg(ptr, data);
301 trace_dump_arg(ptr, fence);
302
303 screen->driver_thread_add_job(screen, data, fence, execute, cleanup, job_size);
304
305 trace_dump_call_end();
306 }
307
308 static void
trace_context_replace_buffer_storage(struct pipe_context * _pipe,struct pipe_resource * dst,struct pipe_resource * src,unsigned num_rebinds,uint32_t rebind_mask,unsigned delete_buffer_id)309 trace_context_replace_buffer_storage(struct pipe_context *_pipe,
310 struct pipe_resource *dst,
311 struct pipe_resource *src,
312 unsigned num_rebinds,
313 uint32_t rebind_mask,
314 unsigned delete_buffer_id)
315 {
316 struct trace_context *tr_ctx = trace_context(_pipe);
317 struct pipe_context *pipe = tr_ctx->pipe;
318
319 trace_dump_call_begin("pipe_context", "replace_buffer_storage");
320
321 trace_dump_arg(ptr, pipe);
322 trace_dump_arg(ptr, dst);
323 trace_dump_arg(ptr, src);
324 trace_dump_arg(uint, num_rebinds);
325 trace_dump_arg(uint, rebind_mask);
326 trace_dump_arg(uint, delete_buffer_id);
327 trace_dump_call_end();
328
329 tr_ctx->replace_buffer_storage(pipe, dst, src, num_rebinds, rebind_mask, delete_buffer_id);
330 }
331
332 static struct pipe_fence_handle *
trace_context_create_fence(struct pipe_context * _pipe,struct tc_unflushed_batch_token * token)333 trace_context_create_fence(struct pipe_context *_pipe, struct tc_unflushed_batch_token *token)
334 {
335 struct trace_context *tr_ctx = trace_context(_pipe);
336 struct pipe_context *pipe = tr_ctx->pipe;
337
338 trace_dump_call_begin("pipe_context", "create_fence");
339
340 trace_dump_arg(ptr, pipe);
341 trace_dump_arg(ptr, token);
342
343 struct pipe_fence_handle *ret = tr_ctx->create_fence(pipe, token);
344 trace_dump_ret(ptr, ret);
345 trace_dump_call_end();
346
347 return ret;
348 }
349
350 static bool
trace_context_is_resource_busy(struct pipe_screen * _screen,struct pipe_resource * resource,unsigned usage)351 trace_context_is_resource_busy(struct pipe_screen *_screen,
352 struct pipe_resource *resource,
353 unsigned usage)
354 {
355 struct trace_screen *tr_scr = trace_screen(_screen);
356 struct pipe_screen *screen = tr_scr->screen;
357 bool result;
358
359 trace_dump_call_begin("pipe_screen", "is_resource_busy");
360
361 trace_dump_arg(ptr, screen);
362 trace_dump_arg(ptr, resource);
363 trace_dump_arg(uint, usage);
364
365 result = tr_scr->is_resource_busy(screen, resource, usage);
366
367 trace_dump_ret(bool, result);
368
369 trace_dump_call_end();
370
371 return result;
372 }
373
374 struct pipe_context *
trace_context_create_threaded(struct pipe_screen * screen,struct pipe_context * pipe,tc_replace_buffer_storage_func * replace_buffer,struct threaded_context_options * options)375 trace_context_create_threaded(struct pipe_screen *screen, struct pipe_context *pipe,
376 tc_replace_buffer_storage_func *replace_buffer,
377 struct threaded_context_options *options)
378 {
379 if (!trace_screens)
380 return pipe;
381
382 struct hash_entry *he = _mesa_hash_table_search(trace_screens, screen);
383 if (!he)
384 return pipe;
385 struct trace_screen *tr_scr = trace_screen(he->data);
386
387 if (tr_scr->trace_tc)
388 return pipe;
389
390 struct pipe_context *ctx = trace_context_create(tr_scr, pipe);
391 if (!ctx)
392 return pipe;
393
394 struct trace_context *tr_ctx = trace_context(ctx);
395 tr_ctx->replace_buffer_storage = *replace_buffer;
396 tr_ctx->create_fence = options->create_fence;
397 tr_scr->is_resource_busy = options->is_resource_busy;
398 tr_ctx->threaded = true;
399 *replace_buffer = trace_context_replace_buffer_storage;
400 if (options->create_fence)
401 options->create_fence = trace_context_create_fence;
402 if (options->is_resource_busy)
403 options->is_resource_busy = trace_context_is_resource_busy;
404 return ctx;
405 }
406
407 static struct pipe_context *
trace_screen_context_create(struct pipe_screen * _screen,void * priv,unsigned flags)408 trace_screen_context_create(struct pipe_screen *_screen, void *priv,
409 unsigned flags)
410 {
411 struct trace_screen *tr_scr = trace_screen(_screen);
412 struct pipe_screen *screen = tr_scr->screen;
413 struct pipe_context *result;
414
415 result = screen->context_create(screen, priv, flags);
416
417 trace_dump_call_begin("pipe_screen", "context_create");
418
419 trace_dump_arg(ptr, screen);
420 trace_dump_arg(ptr, priv);
421 trace_dump_arg(uint, flags);
422
423 trace_dump_ret(ptr, result);
424
425 trace_dump_call_end();
426
427 if (result && (tr_scr->trace_tc || result->draw_vbo != tc_draw_vbo))
428 result = trace_context_create(tr_scr, result);
429
430 return result;
431 }
432
433
434 static void
trace_screen_flush_frontbuffer(struct pipe_screen * _screen,struct pipe_context * _pipe,struct pipe_resource * resource,unsigned level,unsigned layer,void * context_private,unsigned nboxes,struct pipe_box * sub_box)435 trace_screen_flush_frontbuffer(struct pipe_screen *_screen,
436 struct pipe_context *_pipe,
437 struct pipe_resource *resource,
438 unsigned level, unsigned layer,
439 void *context_private,
440 unsigned nboxes,
441 struct pipe_box *sub_box)
442 {
443 struct trace_screen *tr_scr = trace_screen(_screen);
444 struct pipe_screen *screen = tr_scr->screen;
445 struct pipe_context *pipe = _pipe ? trace_get_possibly_threaded_context(_pipe) : NULL;
446
447 trace_dump_call_begin("pipe_screen", "flush_frontbuffer");
448
449 trace_dump_arg(ptr, screen);
450 trace_dump_arg(ptr, resource);
451 trace_dump_arg(uint, level);
452 trace_dump_arg(uint, layer);
453 /* XXX: hide, as there is nothing we can do with this
454 trace_dump_arg(ptr, context_private);
455 */
456
457 trace_dump_call_end();
458
459 screen->flush_frontbuffer(screen, pipe, resource, level, layer, context_private, nboxes, sub_box);
460 }
461
462
463 static void
trace_screen_get_driver_uuid(struct pipe_screen * _screen,char * uuid)464 trace_screen_get_driver_uuid(struct pipe_screen *_screen, char *uuid)
465 {
466 struct pipe_screen *screen = trace_screen(_screen)->screen;
467
468 trace_dump_call_begin("pipe_screen", "get_driver_uuid");
469 trace_dump_arg(ptr, screen);
470
471 screen->get_driver_uuid(screen, uuid);
472
473 trace_dump_ret(string, uuid);
474 trace_dump_call_end();
475 }
476
477 static void
trace_screen_get_device_uuid(struct pipe_screen * _screen,char * uuid)478 trace_screen_get_device_uuid(struct pipe_screen *_screen, char *uuid)
479 {
480 struct pipe_screen *screen = trace_screen(_screen)->screen;
481
482 trace_dump_call_begin("pipe_screen", "get_device_uuid");
483 trace_dump_arg(ptr, screen);
484
485 screen->get_device_uuid(screen, uuid);
486
487 trace_dump_ret(string, uuid);
488 trace_dump_call_end();
489 }
490
491 static void
trace_screen_get_device_luid(struct pipe_screen * _screen,char * luid)492 trace_screen_get_device_luid(struct pipe_screen *_screen, char *luid)
493 {
494 struct pipe_screen *screen = trace_screen(_screen)->screen;
495
496 trace_dump_call_begin("pipe_screen", "get_device_luid");
497 trace_dump_arg(ptr, screen);
498
499 screen->get_device_luid(screen, luid);
500
501 trace_dump_ret(string, luid);
502 trace_dump_call_end();
503 }
504
505 static uint32_t
trace_screen_get_device_node_mask(struct pipe_screen * _screen)506 trace_screen_get_device_node_mask(struct pipe_screen *_screen)
507 {
508 struct pipe_screen *screen = trace_screen(_screen)->screen;
509 uint32_t result;
510
511 trace_dump_call_begin("pipe_screen", "get_device_node_mask");
512 trace_dump_arg(ptr, screen);
513
514 result = screen->get_device_node_mask(screen);
515
516 trace_dump_ret(uint, result);
517 trace_dump_call_end();
518
519 return result;
520 }
521
522
523 /********************************************************************
524 * texture
525 */
526
527 static void *
trace_screen_map_memory(struct pipe_screen * _screen,struct pipe_memory_allocation * pmem)528 trace_screen_map_memory(struct pipe_screen *_screen,
529 struct pipe_memory_allocation *pmem)
530 {
531 struct trace_screen *tr_scr = trace_screen(_screen);
532 struct pipe_screen *screen = tr_scr->screen;
533 void *result;
534
535 trace_dump_call_begin("pipe_screen", "map_memory");
536
537 trace_dump_arg(ptr, screen);
538 trace_dump_arg(ptr, pmem);
539
540 result = screen->map_memory(screen, pmem);
541
542 trace_dump_ret(ptr, result);
543
544 trace_dump_call_end();
545
546 return result;
547 }
548
549 static void
trace_screen_unmap_memory(struct pipe_screen * _screen,struct pipe_memory_allocation * pmem)550 trace_screen_unmap_memory(struct pipe_screen *_screen,
551 struct pipe_memory_allocation *pmem)
552 {
553 struct trace_screen *tr_scr = trace_screen(_screen);
554 struct pipe_screen *screen = tr_scr->screen;
555
556 trace_dump_call_begin("pipe_screen", "unmap_memory");
557
558 trace_dump_arg(ptr, screen);
559 trace_dump_arg(ptr, pmem);
560
561 screen->unmap_memory(screen, pmem);
562
563
564 trace_dump_call_end();
565 }
566
567 static struct pipe_memory_allocation *
trace_screen_allocate_memory(struct pipe_screen * _screen,uint64_t size)568 trace_screen_allocate_memory(struct pipe_screen *_screen,
569 uint64_t size)
570 {
571 struct trace_screen *tr_scr = trace_screen(_screen);
572 struct pipe_screen *screen = tr_scr->screen;
573 struct pipe_memory_allocation *result;
574
575 trace_dump_call_begin("pipe_screen", "allocate_memory");
576
577 trace_dump_arg(ptr, screen);
578 trace_dump_arg(uint, size);
579
580 result = screen->allocate_memory(screen, size);
581
582 trace_dump_ret(ptr, result);
583
584 trace_dump_call_end();
585
586 return result;
587 }
588
589 static struct pipe_memory_allocation *
trace_screen_allocate_memory_fd(struct pipe_screen * _screen,uint64_t size,int * fd,bool dmabuf)590 trace_screen_allocate_memory_fd(struct pipe_screen *_screen,
591 uint64_t size,
592 int *fd,
593 bool dmabuf)
594 {
595 struct trace_screen *tr_scr = trace_screen(_screen);
596 struct pipe_screen *screen = tr_scr->screen;
597 struct pipe_memory_allocation *result;
598
599 trace_dump_call_begin("pipe_screen", "allocate_memory_fd");
600
601 trace_dump_arg(ptr, screen);
602 trace_dump_arg(uint, size);
603 trace_dump_arg(ptr, fd);
604 trace_dump_arg(bool, dmabuf);
605
606 result = screen->allocate_memory_fd(screen, size, fd, dmabuf);
607
608 trace_dump_ret(ptr, result);
609
610 trace_dump_call_end();
611
612 return result;
613 }
614
615 static void
trace_screen_free_memory(struct pipe_screen * _screen,struct pipe_memory_allocation * pmem)616 trace_screen_free_memory(struct pipe_screen *_screen,
617 struct pipe_memory_allocation *pmem)
618 {
619 struct trace_screen *tr_scr = trace_screen(_screen);
620 struct pipe_screen *screen = tr_scr->screen;
621
622 trace_dump_call_begin("pipe_screen", "free_memory");
623
624 trace_dump_arg(ptr, screen);
625 trace_dump_arg(ptr, pmem);
626
627 screen->free_memory(screen, pmem);
628
629
630 trace_dump_call_end();
631 }
632
633 static void
trace_screen_free_memory_fd(struct pipe_screen * _screen,struct pipe_memory_allocation * pmem)634 trace_screen_free_memory_fd(struct pipe_screen *_screen,
635 struct pipe_memory_allocation *pmem)
636 {
637 struct trace_screen *tr_scr = trace_screen(_screen);
638 struct pipe_screen *screen = tr_scr->screen;
639
640 trace_dump_call_begin("pipe_screen", "free_memory_fd");
641
642 trace_dump_arg(ptr, screen);
643 trace_dump_arg(ptr, pmem);
644
645 screen->free_memory_fd(screen, pmem);
646
647
648 trace_dump_call_end();
649 }
650
651 static bool
trace_screen_resource_bind_backing(struct pipe_screen * _screen,struct pipe_resource * resource,struct pipe_memory_allocation * pmem,uint64_t fd_offset,uint64_t size,uint64_t offset)652 trace_screen_resource_bind_backing(struct pipe_screen *_screen,
653 struct pipe_resource *resource,
654 struct pipe_memory_allocation *pmem,
655 uint64_t fd_offset,
656 uint64_t size,
657 uint64_t offset)
658 {
659 struct trace_screen *tr_scr = trace_screen(_screen);
660 struct pipe_screen *screen = tr_scr->screen;
661 bool result;
662
663 trace_dump_call_begin("pipe_screen", "resource_bind_backing");
664
665 trace_dump_arg(ptr, screen);
666 trace_dump_arg(ptr, resource);
667 trace_dump_arg(ptr, pmem);
668 trace_dump_arg(uint, fd_offset);
669 trace_dump_arg(uint, size);
670 trace_dump_arg(uint, offset);
671
672 result = screen->resource_bind_backing(screen, resource, pmem, fd_offset, size, offset);
673
674 trace_dump_ret(bool, result);
675
676 trace_dump_call_end();
677
678 return result;
679 }
680
681 static struct pipe_resource *
trace_screen_resource_create_unbacked(struct pipe_screen * _screen,const struct pipe_resource * templat,uint64_t * size_required)682 trace_screen_resource_create_unbacked(struct pipe_screen *_screen,
683 const struct pipe_resource *templat,
684 uint64_t *size_required)
685 {
686 struct trace_screen *tr_scr = trace_screen(_screen);
687 struct pipe_screen *screen = tr_scr->screen;
688 struct pipe_resource *result;
689
690 trace_dump_call_begin("pipe_screen", "resource_create_unbacked");
691
692 trace_dump_arg(ptr, screen);
693 trace_dump_arg(resource_template, templat);
694
695 result = screen->resource_create_unbacked(screen, templat, size_required);
696
697 trace_dump_ret_begin();
698 trace_dump_uint(*size_required);
699 trace_dump_ret_end();
700 trace_dump_ret(ptr, result);
701
702 trace_dump_call_end();
703
704 if (result)
705 result->screen = _screen;
706 return result;
707 }
708
709 static struct pipe_resource *
trace_screen_resource_create(struct pipe_screen * _screen,const struct pipe_resource * templat)710 trace_screen_resource_create(struct pipe_screen *_screen,
711 const struct pipe_resource *templat)
712 {
713 struct trace_screen *tr_scr = trace_screen(_screen);
714 struct pipe_screen *screen = tr_scr->screen;
715 struct pipe_resource *result;
716
717 trace_dump_call_begin("pipe_screen", "resource_create");
718
719 trace_dump_arg(ptr, screen);
720 trace_dump_arg(resource_template, templat);
721
722 result = screen->resource_create(screen, templat);
723
724 trace_dump_ret(ptr, result);
725
726 trace_dump_call_end();
727
728 if (result)
729 result->screen = _screen;
730 return result;
731 }
732
733 static struct pipe_resource *
trace_screen_resource_create_drawable(struct pipe_screen * _screen,const struct pipe_resource * templat,const void * loader_data)734 trace_screen_resource_create_drawable(struct pipe_screen *_screen,
735 const struct pipe_resource *templat,
736 const void *loader_data)
737 {
738 struct trace_screen *tr_scr = trace_screen(_screen);
739 struct pipe_screen *screen = tr_scr->screen;
740 struct pipe_resource *result;
741
742 trace_dump_call_begin("pipe_screen", "resource_create_drawable");
743
744 trace_dump_arg(ptr, screen);
745 trace_dump_arg(resource_template, templat);
746 trace_dump_arg(ptr, loader_data);
747
748 result = screen->resource_create_drawable(screen, templat, loader_data);
749
750 trace_dump_ret(ptr, result);
751
752 trace_dump_call_end();
753
754 if (result)
755 result->screen = _screen;
756 return result;
757 }
758
759 static struct pipe_resource *
trace_screen_resource_create_with_modifiers(struct pipe_screen * _screen,const struct pipe_resource * templat,const uint64_t * modifiers,int modifiers_count)760 trace_screen_resource_create_with_modifiers(struct pipe_screen *_screen, const struct pipe_resource *templat,
761 const uint64_t *modifiers, int modifiers_count)
762 {
763 struct trace_screen *tr_scr = trace_screen(_screen);
764 struct pipe_screen *screen = tr_scr->screen;
765 struct pipe_resource *result;
766
767 trace_dump_call_begin("pipe_screen", "resource_create_with_modifiers");
768
769 trace_dump_arg(ptr, screen);
770 trace_dump_arg(resource_template, templat);
771 trace_dump_arg_array(uint, modifiers, modifiers_count);
772
773 result = screen->resource_create_with_modifiers(screen, templat, modifiers, modifiers_count);
774
775 trace_dump_ret(ptr, result);
776
777 trace_dump_call_end();
778
779 if (result)
780 result->screen = _screen;
781 return result;
782 }
783
784 static struct pipe_resource *
trace_screen_resource_from_handle(struct pipe_screen * _screen,const struct pipe_resource * templ,struct winsys_handle * handle,unsigned usage)785 trace_screen_resource_from_handle(struct pipe_screen *_screen,
786 const struct pipe_resource *templ,
787 struct winsys_handle *handle,
788 unsigned usage)
789 {
790 struct trace_screen *tr_screen = trace_screen(_screen);
791 struct pipe_screen *screen = tr_screen->screen;
792 struct pipe_resource *result;
793
794 trace_dump_call_begin("pipe_screen", "resource_from_handle");
795
796 trace_dump_arg(ptr, screen);
797 trace_dump_arg(resource_template, templ);
798 trace_dump_arg(winsys_handle, handle);
799 trace_dump_arg(uint, usage);
800
801 result = screen->resource_from_handle(screen, templ, handle, usage);
802
803 trace_dump_ret(ptr, result);
804
805 trace_dump_call_end();
806
807 if (result)
808 result->screen = _screen;
809 return result;
810 }
811
812 static bool
trace_screen_check_resource_capability(struct pipe_screen * _screen,struct pipe_resource * resource,unsigned bind)813 trace_screen_check_resource_capability(struct pipe_screen *_screen,
814 struct pipe_resource *resource,
815 unsigned bind)
816 {
817 struct pipe_screen *screen = trace_screen(_screen)->screen;
818
819 return screen->check_resource_capability(screen, resource, bind);
820 }
821
822 static bool
trace_screen_resource_get_handle(struct pipe_screen * _screen,struct pipe_context * _pipe,struct pipe_resource * resource,struct winsys_handle * handle,unsigned usage)823 trace_screen_resource_get_handle(struct pipe_screen *_screen,
824 struct pipe_context *_pipe,
825 struct pipe_resource *resource,
826 struct winsys_handle *handle,
827 unsigned usage)
828 {
829 struct trace_screen *tr_screen = trace_screen(_screen);
830 struct pipe_context *pipe = _pipe ? trace_get_possibly_threaded_context(_pipe) : NULL;
831 struct pipe_screen *screen = tr_screen->screen;
832 bool result;
833
834 trace_dump_call_begin("pipe_screen", "resource_get_handle");
835
836 trace_dump_arg(ptr, screen);
837 trace_dump_arg(ptr, resource);
838 trace_dump_arg(uint, usage);
839
840 result = screen->resource_get_handle(screen, pipe, resource, handle, usage);
841
842 trace_dump_arg(winsys_handle, handle);
843 trace_dump_ret(bool, result);
844
845 trace_dump_call_end();
846
847 return result;
848 }
849
850 static bool
trace_screen_resource_get_param(struct pipe_screen * _screen,struct pipe_context * _pipe,struct pipe_resource * resource,unsigned plane,unsigned layer,unsigned level,enum pipe_resource_param param,unsigned handle_usage,uint64_t * value)851 trace_screen_resource_get_param(struct pipe_screen *_screen,
852 struct pipe_context *_pipe,
853 struct pipe_resource *resource,
854 unsigned plane,
855 unsigned layer,
856 unsigned level,
857 enum pipe_resource_param param,
858 unsigned handle_usage,
859 uint64_t *value)
860 {
861 struct trace_screen *tr_screen = trace_screen(_screen);
862 struct pipe_context *pipe = _pipe ? trace_get_possibly_threaded_context(_pipe) : NULL;
863 struct pipe_screen *screen = tr_screen->screen;
864 bool result;
865
866 trace_dump_call_begin("pipe_screen", "resource_get_param");
867
868 trace_dump_arg(ptr, screen);
869 trace_dump_arg(ptr, resource);
870 trace_dump_arg(uint, plane);
871 trace_dump_arg(uint, layer);
872 trace_dump_arg(uint, level);
873 trace_dump_arg_enum(pipe_resource_param, param);
874 trace_dump_arg(uint, handle_usage);
875
876 result = screen->resource_get_param(screen, pipe,
877 resource, plane, layer, level, param,
878 handle_usage, value);
879
880 trace_dump_arg(uint, *value);
881 trace_dump_ret(bool, result);
882
883 trace_dump_call_end();
884
885 return result;
886 }
887
888 static void
trace_screen_resource_get_info(struct pipe_screen * _screen,struct pipe_resource * resource,unsigned * stride,unsigned * offset)889 trace_screen_resource_get_info(struct pipe_screen *_screen,
890 struct pipe_resource *resource,
891 unsigned *stride,
892 unsigned *offset)
893 {
894 struct trace_screen *tr_screen = trace_screen(_screen);
895 struct pipe_screen *screen = tr_screen->screen;
896
897 trace_dump_call_begin("pipe_screen", "resource_get_info");
898 trace_dump_arg(ptr, screen);
899 trace_dump_arg(ptr, resource);
900
901 screen->resource_get_info(screen, resource, stride, offset);
902
903 trace_dump_arg(uint, *stride);
904 trace_dump_arg(uint, *offset);
905
906 trace_dump_call_end();
907 }
908
909 static struct pipe_resource *
trace_screen_resource_from_memobj(struct pipe_screen * _screen,const struct pipe_resource * templ,struct pipe_memory_object * memobj,uint64_t offset)910 trace_screen_resource_from_memobj(struct pipe_screen *_screen,
911 const struct pipe_resource *templ,
912 struct pipe_memory_object *memobj,
913 uint64_t offset)
914 {
915 struct pipe_screen *screen = trace_screen(_screen)->screen;
916
917 trace_dump_call_begin("pipe_screen", "resource_from_memobj");
918 trace_dump_arg(ptr, screen);
919 trace_dump_arg(resource_template, templ);
920 trace_dump_arg(ptr, memobj);
921 trace_dump_arg(uint, offset);
922
923 struct pipe_resource *res =
924 screen->resource_from_memobj(screen, templ, memobj, offset);
925
926 if (!res)
927 return NULL;
928 res->screen = _screen;
929
930 trace_dump_ret(ptr, res);
931 trace_dump_call_end();
932 return res;
933 }
934
935 static void
trace_screen_resource_changed(struct pipe_screen * _screen,struct pipe_resource * resource)936 trace_screen_resource_changed(struct pipe_screen *_screen,
937 struct pipe_resource *resource)
938 {
939 struct trace_screen *tr_scr = trace_screen(_screen);
940 struct pipe_screen *screen = tr_scr->screen;
941
942 trace_dump_call_begin("pipe_screen", "resource_changed");
943
944 trace_dump_arg(ptr, screen);
945 trace_dump_arg(ptr, resource);
946
947 if (screen->resource_changed)
948 screen->resource_changed(screen, resource);
949
950 trace_dump_call_end();
951 }
952
953 static void
trace_screen_resource_destroy(struct pipe_screen * _screen,struct pipe_resource * resource)954 trace_screen_resource_destroy(struct pipe_screen *_screen,
955 struct pipe_resource *resource)
956 {
957 struct trace_screen *tr_scr = trace_screen(_screen);
958 struct pipe_screen *screen = tr_scr->screen;
959
960 /* Don't trace this, because due to the lack of pipe_resource wrapping,
961 * we can get this call from inside of driver calls, which would try
962 * to lock an already-locked mutex.
963 */
964 screen->resource_destroy(screen, resource);
965 }
966
967
968 /********************************************************************
969 * fence
970 */
971
972
973 static void
trace_screen_fence_reference(struct pipe_screen * _screen,struct pipe_fence_handle ** pdst,struct pipe_fence_handle * src)974 trace_screen_fence_reference(struct pipe_screen *_screen,
975 struct pipe_fence_handle **pdst,
976 struct pipe_fence_handle *src)
977 {
978 struct trace_screen *tr_scr = trace_screen(_screen);
979 struct pipe_screen *screen = tr_scr->screen;
980 struct pipe_fence_handle *dst;
981
982 assert(pdst);
983 dst = *pdst;
984
985 trace_dump_call_begin("pipe_screen", "fence_reference");
986
987 trace_dump_arg(ptr, screen);
988 trace_dump_arg(ptr, dst);
989 trace_dump_arg(ptr, src);
990
991 screen->fence_reference(screen, pdst, src);
992
993 trace_dump_call_end();
994 }
995
996
997 static int
trace_screen_fence_get_fd(struct pipe_screen * _screen,struct pipe_fence_handle * fence)998 trace_screen_fence_get_fd(struct pipe_screen *_screen,
999 struct pipe_fence_handle *fence)
1000 {
1001 struct trace_screen *tr_scr = trace_screen(_screen);
1002 struct pipe_screen *screen = tr_scr->screen;
1003 int result;
1004
1005 trace_dump_call_begin("pipe_screen", "fence_get_fd");
1006
1007 trace_dump_arg(ptr, screen);
1008 trace_dump_arg(ptr, fence);
1009
1010 result = screen->fence_get_fd(screen, fence);
1011
1012 trace_dump_ret(int, result);
1013
1014 trace_dump_call_end();
1015
1016 return result;
1017 }
1018
1019 static void
trace_screen_create_fence_win32(struct pipe_screen * _screen,struct pipe_fence_handle ** fence,void * handle,const void * name,enum pipe_fd_type type)1020 trace_screen_create_fence_win32(struct pipe_screen *_screen,
1021 struct pipe_fence_handle **fence,
1022 void *handle,
1023 const void *name,
1024 enum pipe_fd_type type)
1025 {
1026 struct trace_screen *tr_scr = trace_screen(_screen);
1027 struct pipe_screen *screen = tr_scr->screen;
1028
1029 trace_dump_call_begin("pipe_screen", "create_fence_win32");
1030
1031 trace_dump_arg(ptr, screen);
1032 if (fence)
1033 trace_dump_arg(ptr, *fence);
1034 trace_dump_arg(ptr, handle);
1035 trace_dump_arg(ptr, name);
1036 trace_dump_arg_enum(pipe_fd_type, type);
1037
1038 trace_dump_call_end();
1039
1040 screen->create_fence_win32(screen, fence, handle, name, type);
1041 }
1042
1043
1044 static bool
trace_screen_fence_finish(struct pipe_screen * _screen,struct pipe_context * _ctx,struct pipe_fence_handle * fence,uint64_t timeout)1045 trace_screen_fence_finish(struct pipe_screen *_screen,
1046 struct pipe_context *_ctx,
1047 struct pipe_fence_handle *fence,
1048 uint64_t timeout)
1049 {
1050 struct trace_screen *tr_scr = trace_screen(_screen);
1051 struct pipe_screen *screen = tr_scr->screen;
1052 struct pipe_context *ctx = _ctx ? trace_get_possibly_threaded_context(_ctx) : NULL;
1053 int result;
1054
1055 result = screen->fence_finish(screen, ctx, fence, timeout);
1056
1057
1058 trace_dump_call_begin("pipe_screen", "fence_finish");
1059
1060 trace_dump_arg(ptr, screen);
1061 trace_dump_arg(ptr, ctx);
1062 trace_dump_arg(ptr, fence);
1063 trace_dump_arg(uint, timeout);
1064
1065 trace_dump_ret(bool, result);
1066
1067 trace_dump_call_end();
1068
1069 return result;
1070 }
1071
1072
1073 /********************************************************************
1074 * memobj
1075 */
1076
1077 static struct pipe_memory_object *
trace_screen_memobj_create_from_handle(struct pipe_screen * _screen,struct winsys_handle * handle,bool dedicated)1078 trace_screen_memobj_create_from_handle(struct pipe_screen *_screen,
1079 struct winsys_handle *handle,
1080 bool dedicated)
1081 {
1082 struct pipe_screen *screen = trace_screen(_screen)->screen;
1083
1084 trace_dump_call_begin("pipe_screen", "memobj_create_from_handle");
1085 trace_dump_arg(ptr, screen);
1086 trace_dump_arg(ptr, handle);
1087 trace_dump_arg(bool, dedicated);
1088
1089 struct pipe_memory_object *res =
1090 screen->memobj_create_from_handle(screen, handle, dedicated);
1091
1092 trace_dump_ret(ptr, res);
1093 trace_dump_call_end();
1094
1095 return res;
1096 }
1097
1098 static void
trace_screen_memobj_destroy(struct pipe_screen * _screen,struct pipe_memory_object * memobj)1099 trace_screen_memobj_destroy(struct pipe_screen *_screen,
1100 struct pipe_memory_object *memobj)
1101 {
1102 struct pipe_screen *screen = trace_screen(_screen)->screen;
1103
1104 trace_dump_call_begin("pipe_screen", "memobj_destroy");
1105 trace_dump_arg(ptr, screen);
1106 trace_dump_arg(ptr, memobj);
1107 trace_dump_call_end();
1108
1109 screen->memobj_destroy(screen, memobj);
1110 }
1111
1112
1113 /********************************************************************
1114 * screen
1115 */
1116
1117 static uint64_t
trace_screen_get_timestamp(struct pipe_screen * _screen)1118 trace_screen_get_timestamp(struct pipe_screen *_screen)
1119 {
1120 struct trace_screen *tr_scr = trace_screen(_screen);
1121 struct pipe_screen *screen = tr_scr->screen;
1122 uint64_t result;
1123
1124 trace_dump_call_begin("pipe_screen", "get_timestamp");
1125 trace_dump_arg(ptr, screen);
1126
1127 result = screen->get_timestamp(screen);
1128
1129 trace_dump_ret(uint, result);
1130 trace_dump_call_end();
1131
1132 return result;
1133 }
1134
1135 static char *
trace_screen_finalize_nir(struct pipe_screen * _screen,struct nir_shader * nir)1136 trace_screen_finalize_nir(struct pipe_screen *_screen, struct nir_shader *nir)
1137 {
1138 struct pipe_screen *screen = trace_screen(_screen)->screen;
1139
1140 return screen->finalize_nir(screen, nir);
1141 }
1142
1143 static void
trace_screen_destroy(struct pipe_screen * _screen)1144 trace_screen_destroy(struct pipe_screen *_screen)
1145 {
1146 struct trace_screen *tr_scr = trace_screen(_screen);
1147 struct pipe_screen *screen = tr_scr->screen;
1148
1149 trace_dump_call_begin("pipe_screen", "destroy");
1150 trace_dump_arg(ptr, screen);
1151 trace_dump_call_end();
1152
1153 if (trace_screens) {
1154 struct hash_entry *he = _mesa_hash_table_search(trace_screens, screen);
1155 if (he) {
1156 _mesa_hash_table_remove(trace_screens, he);
1157 if (!_mesa_hash_table_num_entries(trace_screens)) {
1158 _mesa_hash_table_destroy(trace_screens, NULL);
1159 trace_screens = NULL;
1160 }
1161 }
1162 }
1163
1164 screen->destroy(screen);
1165
1166 FREE(tr_scr);
1167 }
1168
1169 static void
trace_screen_query_memory_info(struct pipe_screen * _screen,struct pipe_memory_info * info)1170 trace_screen_query_memory_info(struct pipe_screen *_screen, struct pipe_memory_info *info)
1171 {
1172 struct trace_screen *tr_scr = trace_screen(_screen);
1173 struct pipe_screen *screen = tr_scr->screen;
1174
1175 trace_dump_call_begin("pipe_screen", "query_memory_info");
1176
1177 trace_dump_arg(ptr, screen);
1178
1179 screen->query_memory_info(screen, info);
1180
1181 trace_dump_ret(memory_info, info);
1182
1183 trace_dump_call_end();
1184 }
1185
1186 static void
trace_screen_query_dmabuf_modifiers(struct pipe_screen * _screen,enum pipe_format format,int max,uint64_t * modifiers,unsigned int * external_only,int * count)1187 trace_screen_query_dmabuf_modifiers(struct pipe_screen *_screen, enum pipe_format format, int max, uint64_t *modifiers, unsigned int *external_only, int *count)
1188 {
1189 struct trace_screen *tr_scr = trace_screen(_screen);
1190 struct pipe_screen *screen = tr_scr->screen;
1191
1192 trace_dump_call_begin("pipe_screen", "query_dmabuf_modifiers");
1193
1194 trace_dump_arg(ptr, screen);
1195 trace_dump_arg(format, format);
1196 trace_dump_arg(int, max);
1197
1198 screen->query_dmabuf_modifiers(screen, format, max, modifiers, external_only, count);
1199
1200 if (max)
1201 trace_dump_arg_array(uint, modifiers, *count);
1202 else
1203 trace_dump_arg_array(uint, modifiers, max);
1204 trace_dump_arg_array(uint, external_only, max);
1205 trace_dump_ret_begin();
1206 trace_dump_uint(*count);
1207 trace_dump_ret_end();
1208
1209 trace_dump_call_end();
1210 }
1211
1212 static bool
trace_screen_is_compute_copy_faster(struct pipe_screen * _screen,enum pipe_format src_format,enum pipe_format dst_format,unsigned width,unsigned height,unsigned depth,bool cpu)1213 trace_screen_is_compute_copy_faster(struct pipe_screen *_screen, enum pipe_format src_format,
1214 enum pipe_format dst_format, unsigned width, unsigned height,
1215 unsigned depth, bool cpu)
1216 {
1217 struct trace_screen *tr_scr = trace_screen(_screen);
1218 struct pipe_screen *screen = tr_scr->screen;
1219
1220 trace_dump_call_begin("pipe_screen", "is_compute_copy_faster");
1221
1222 trace_dump_arg(ptr, screen);
1223 trace_dump_arg(format, src_format);
1224 trace_dump_arg(format, dst_format);
1225 trace_dump_arg(uint, width);
1226 trace_dump_arg(uint, height);
1227 trace_dump_arg(uint, depth);
1228 trace_dump_arg(bool, cpu);
1229
1230 bool ret = screen->is_compute_copy_faster(screen, src_format, dst_format, width, height, depth, cpu);
1231
1232 trace_dump_ret(bool, ret);
1233
1234 trace_dump_call_end();
1235 return ret;
1236 }
1237
1238 static bool
trace_screen_is_dmabuf_modifier_supported(struct pipe_screen * _screen,uint64_t modifier,enum pipe_format format,bool * external_only)1239 trace_screen_is_dmabuf_modifier_supported(struct pipe_screen *_screen, uint64_t modifier, enum pipe_format format, bool *external_only)
1240 {
1241 struct trace_screen *tr_scr = trace_screen(_screen);
1242 struct pipe_screen *screen = tr_scr->screen;
1243
1244 trace_dump_call_begin("pipe_screen", "is_dmabuf_modifier_supported");
1245
1246 trace_dump_arg(ptr, screen);
1247 trace_dump_arg(uint, modifier);
1248 trace_dump_arg(format, format);
1249
1250 bool ret = screen->is_dmabuf_modifier_supported(screen, modifier, format, external_only);
1251
1252 trace_dump_arg_begin("external_only");
1253 trace_dump_bool(external_only ? *external_only : false);
1254 trace_dump_arg_end();
1255
1256 trace_dump_ret(bool, ret);
1257
1258 trace_dump_call_end();
1259 return ret;
1260 }
1261
1262 static unsigned int
trace_screen_get_dmabuf_modifier_planes(struct pipe_screen * _screen,uint64_t modifier,enum pipe_format format)1263 trace_screen_get_dmabuf_modifier_planes(struct pipe_screen *_screen, uint64_t modifier, enum pipe_format format)
1264 {
1265 struct trace_screen *tr_scr = trace_screen(_screen);
1266 struct pipe_screen *screen = tr_scr->screen;
1267
1268 trace_dump_call_begin("pipe_screen", "get_dmabuf_modifier_planes");
1269
1270 trace_dump_arg(ptr, screen);
1271 trace_dump_arg(uint, modifier);
1272 trace_dump_arg(format, format);
1273
1274 unsigned ret = screen->get_dmabuf_modifier_planes(screen, modifier, format);
1275
1276 trace_dump_ret(uint, ret);
1277
1278 trace_dump_call_end();
1279 return ret;
1280 }
1281
1282 static int
trace_screen_get_sparse_texture_virtual_page_size(struct pipe_screen * _screen,enum pipe_texture_target target,bool multi_sample,enum pipe_format format,unsigned offset,unsigned size,int * x,int * y,int * z)1283 trace_screen_get_sparse_texture_virtual_page_size(struct pipe_screen *_screen,
1284 enum pipe_texture_target target,
1285 bool multi_sample,
1286 enum pipe_format format,
1287 unsigned offset, unsigned size,
1288 int *x, int *y, int *z)
1289 {
1290 struct trace_screen *tr_scr = trace_screen(_screen);
1291 struct pipe_screen *screen = tr_scr->screen;
1292
1293 trace_dump_call_begin("pipe_screen", "get_sparse_texture_virtual_page_size");
1294
1295 trace_dump_arg(ptr, screen);
1296 trace_dump_arg_enum(pipe_texture_target, target);
1297 trace_dump_arg(format, format);
1298 trace_dump_arg(uint, offset);
1299 trace_dump_arg(uint, size);
1300
1301 int ret = screen->get_sparse_texture_virtual_page_size(screen, target, multi_sample,
1302 format, offset, size, x, y, z);
1303
1304 if (x)
1305 trace_dump_arg(uint, *x);
1306 else
1307 trace_dump_arg(ptr, x);
1308 if (y)
1309 trace_dump_arg(uint, *y);
1310 else
1311 trace_dump_arg(ptr, y);
1312 if (z)
1313 trace_dump_arg(uint, *z);
1314 else
1315 trace_dump_arg(ptr, z);
1316
1317 trace_dump_ret(int, ret);
1318
1319 trace_dump_call_end();
1320 return ret;
1321 }
1322
1323 static struct pipe_vertex_state *
trace_screen_create_vertex_state(struct pipe_screen * _screen,struct pipe_vertex_buffer * buffer,const struct pipe_vertex_element * elements,unsigned num_elements,struct pipe_resource * indexbuf,uint32_t full_velem_mask)1324 trace_screen_create_vertex_state(struct pipe_screen *_screen,
1325 struct pipe_vertex_buffer *buffer,
1326 const struct pipe_vertex_element *elements,
1327 unsigned num_elements,
1328 struct pipe_resource *indexbuf,
1329 uint32_t full_velem_mask)
1330 {
1331 struct trace_screen *tr_scr = trace_screen(_screen);
1332 struct pipe_screen *screen = tr_scr->screen;
1333
1334 trace_dump_call_begin("pipe_screen", "create_vertex_state");
1335
1336 trace_dump_arg(ptr, screen);
1337 trace_dump_arg(ptr, buffer->buffer.resource);
1338 trace_dump_arg(vertex_buffer, buffer);
1339 trace_dump_arg_begin("elements");
1340 trace_dump_struct_array(vertex_element, elements, num_elements);
1341 trace_dump_arg_end();
1342 trace_dump_arg(uint, num_elements);
1343 trace_dump_arg(ptr, indexbuf);
1344 trace_dump_arg(uint, full_velem_mask);
1345
1346 struct pipe_vertex_state *vstate =
1347 screen->create_vertex_state(screen, buffer, elements, num_elements,
1348 indexbuf, full_velem_mask);
1349 trace_dump_ret(ptr, vstate);
1350 trace_dump_call_end();
1351 return vstate;
1352 }
1353
trace_screen_vertex_state_destroy(struct pipe_screen * _screen,struct pipe_vertex_state * state)1354 static void trace_screen_vertex_state_destroy(struct pipe_screen *_screen,
1355 struct pipe_vertex_state *state)
1356 {
1357 struct trace_screen *tr_scr = trace_screen(_screen);
1358 struct pipe_screen *screen = tr_scr->screen;
1359
1360 trace_dump_call_begin("pipe_screen", "vertex_state_destroy");
1361 trace_dump_arg(ptr, screen);
1362 trace_dump_arg(ptr, state);
1363 trace_dump_call_end();
1364
1365 screen->vertex_state_destroy(screen, state);
1366 }
1367
trace_screen_set_fence_timeline_value(struct pipe_screen * _screen,struct pipe_fence_handle * fence,uint64_t value)1368 static void trace_screen_set_fence_timeline_value(struct pipe_screen *_screen,
1369 struct pipe_fence_handle *fence,
1370 uint64_t value)
1371 {
1372 struct trace_screen *tr_scr = trace_screen(_screen);
1373 struct pipe_screen *screen = tr_scr->screen;
1374
1375 trace_dump_call_begin("pipe_screen", "set_fence_timeline_value");
1376 trace_dump_arg(ptr, screen);
1377 trace_dump_arg(ptr, fence);
1378 trace_dump_arg(uint, value);
1379 trace_dump_call_end();
1380
1381 screen->set_fence_timeline_value(screen, fence, value);
1382 }
1383
trace_screen_query_compression_rates(struct pipe_screen * _screen,enum pipe_format format,int max,uint32_t * rates,int * count)1384 static void trace_screen_query_compression_rates(struct pipe_screen *_screen,
1385 enum pipe_format format,
1386 int max, uint32_t *rates,
1387 int *count)
1388 {
1389 struct trace_screen *tr_scr = trace_screen(_screen);
1390 struct pipe_screen *screen = tr_scr->screen;
1391
1392 trace_dump_call_begin("pipe_screen", "query_compression_rates");
1393 trace_dump_arg(ptr, screen);
1394 trace_dump_arg(format, format);
1395 trace_dump_arg(int, max);
1396
1397 screen->query_compression_rates(screen, format, max, rates, count);
1398
1399 if (max)
1400 trace_dump_arg_array(uint, rates, *count);
1401 else
1402 trace_dump_arg_array(uint, rates, max);
1403 trace_dump_ret_begin();
1404 trace_dump_uint(*count);
1405 trace_dump_ret_end();
1406
1407 trace_dump_call_end();
1408 }
1409
trace_screen_query_compression_modifiers(struct pipe_screen * _screen,enum pipe_format format,uint32_t rate,int max,uint64_t * modifiers,int * count)1410 static void trace_screen_query_compression_modifiers(struct pipe_screen *_screen,
1411 enum pipe_format format,
1412 uint32_t rate, int max,
1413 uint64_t *modifiers,
1414 int *count)
1415 {
1416 struct trace_screen *tr_scr = trace_screen(_screen);
1417 struct pipe_screen *screen = tr_scr->screen;
1418
1419 trace_dump_call_begin("pipe_screen", "query_compression_rates");
1420 trace_dump_arg(ptr, screen);
1421 trace_dump_arg(format, format);
1422 trace_dump_arg(uint, rate);
1423 trace_dump_arg(int, max);
1424
1425 screen->query_compression_modifiers(screen, format, rate, max, modifiers, count);
1426
1427 if (max)
1428 trace_dump_arg_array(uint, modifiers, *count);
1429 else
1430 trace_dump_arg_array(uint, modifiers, max);
1431 trace_dump_ret_begin();
1432 trace_dump_uint(*count);
1433 trace_dump_ret_end();
1434
1435 trace_dump_call_end();
1436 }
1437
1438 bool
trace_enabled(void)1439 trace_enabled(void)
1440 {
1441 static bool firstrun = true;
1442
1443 if (!firstrun)
1444 return trace;
1445 firstrun = false;
1446
1447 if(trace_dump_trace_begin()) {
1448 trace_dumping_start();
1449 trace = true;
1450 }
1451
1452 return trace;
1453 }
1454
tr_get_driver_pipe_screen(struct pipe_screen * _screen)1455 static struct pipe_screen * tr_get_driver_pipe_screen(struct pipe_screen *_screen)
1456 {
1457 struct pipe_screen *screen = trace_screen(_screen)->screen;
1458
1459 if (screen->get_driver_pipe_screen)
1460 return screen->get_driver_pipe_screen(screen);
1461 return screen;
1462 }
1463
1464 struct pipe_screen *
trace_screen_create(struct pipe_screen * screen)1465 trace_screen_create(struct pipe_screen *screen)
1466 {
1467 struct trace_screen *tr_scr;
1468
1469 /* if zink+lavapipe is enabled, ensure that only one driver is traced */
1470 const char *driver = debug_get_option("MESA_LOADER_DRIVER_OVERRIDE", NULL);
1471 if (driver && !strcmp(driver, "zink")) {
1472 /* the user wants zink: check whether they want to trace zink or lavapipe */
1473 bool trace_lavapipe = debug_get_bool_option("ZINK_TRACE_LAVAPIPE", false);
1474 if (!strncmp(screen->get_name(screen), "zink", 4)) {
1475 /* this is the zink screen: only trace if lavapipe tracing is disabled */
1476 if (trace_lavapipe)
1477 return screen;
1478 } else {
1479 /* this is the llvmpipe screen: only trace if lavapipe tracing is enabled */
1480 if (!trace_lavapipe)
1481 return screen;
1482 }
1483 }
1484
1485 if (!trace_enabled())
1486 goto error1;
1487
1488 trace_dump_call_begin("", "pipe_screen_create");
1489
1490 tr_scr = CALLOC_STRUCT(trace_screen);
1491 if (!tr_scr)
1492 goto error2;
1493
1494 #define SCR_INIT(_member) \
1495 tr_scr->base._member = screen->_member ? trace_screen_##_member : NULL
1496
1497 tr_scr->base.destroy = trace_screen_destroy;
1498 tr_scr->base.get_name = trace_screen_get_name;
1499 tr_scr->base.get_vendor = trace_screen_get_vendor;
1500 tr_scr->base.get_device_vendor = trace_screen_get_device_vendor;
1501 SCR_INIT(get_compiler_options);
1502 SCR_INIT(get_disk_shader_cache);
1503 tr_scr->base.get_shader_param = trace_screen_get_shader_param;
1504 tr_scr->base.get_compute_param = trace_screen_get_compute_param;
1505 SCR_INIT(get_video_param);
1506 tr_scr->base.is_format_supported = trace_screen_is_format_supported;
1507 SCR_INIT(is_video_format_supported);
1508 assert(screen->context_create);
1509 tr_scr->base.context_create = trace_screen_context_create;
1510 tr_scr->base.resource_create = trace_screen_resource_create;
1511 SCR_INIT(resource_create_with_modifiers);
1512 tr_scr->base.resource_create_unbacked = trace_screen_resource_create_unbacked;
1513 SCR_INIT(resource_create_drawable);
1514 tr_scr->base.resource_bind_backing = trace_screen_resource_bind_backing;
1515 tr_scr->base.resource_from_handle = trace_screen_resource_from_handle;
1516 tr_scr->base.allocate_memory = trace_screen_allocate_memory;
1517 SCR_INIT(allocate_memory_fd);
1518 tr_scr->base.free_memory = trace_screen_free_memory;
1519 SCR_INIT(free_memory_fd);
1520 tr_scr->base.map_memory = trace_screen_map_memory;
1521 tr_scr->base.unmap_memory = trace_screen_unmap_memory;
1522 SCR_INIT(query_memory_info);
1523 SCR_INIT(query_dmabuf_modifiers);
1524 SCR_INIT(is_compute_copy_faster);
1525 SCR_INIT(is_dmabuf_modifier_supported);
1526 SCR_INIT(get_dmabuf_modifier_planes);
1527 SCR_INIT(check_resource_capability);
1528 tr_scr->base.resource_get_handle = trace_screen_resource_get_handle;
1529 SCR_INIT(resource_get_param);
1530 SCR_INIT(resource_get_info);
1531 SCR_INIT(resource_from_memobj);
1532 SCR_INIT(resource_changed);
1533 tr_scr->base.resource_destroy = trace_screen_resource_destroy;
1534 tr_scr->base.fence_reference = trace_screen_fence_reference;
1535 SCR_INIT(fence_get_fd);
1536 SCR_INIT(create_fence_win32);
1537 tr_scr->base.fence_finish = trace_screen_fence_finish;
1538 SCR_INIT(memobj_create_from_handle);
1539 SCR_INIT(memobj_destroy);
1540 tr_scr->base.flush_frontbuffer = trace_screen_flush_frontbuffer;
1541 tr_scr->base.get_timestamp = trace_screen_get_timestamp;
1542 SCR_INIT(get_driver_uuid);
1543 SCR_INIT(get_device_uuid);
1544 SCR_INIT(get_device_luid);
1545 SCR_INIT(get_device_node_mask);
1546 SCR_INIT(finalize_nir);
1547 SCR_INIT(create_vertex_state);
1548 SCR_INIT(vertex_state_destroy);
1549 tr_scr->base.transfer_helper = screen->transfer_helper;
1550 SCR_INIT(get_sparse_texture_virtual_page_size);
1551 SCR_INIT(set_fence_timeline_value);
1552 SCR_INIT(driver_thread_add_job);
1553 SCR_INIT(query_compression_rates);
1554 SCR_INIT(query_compression_modifiers);
1555 tr_scr->base.get_driver_pipe_screen = tr_get_driver_pipe_screen;
1556
1557 tr_scr->screen = screen;
1558
1559 trace_dump_ret(ptr, screen);
1560 trace_dump_call_end();
1561
1562 if (!trace_screens)
1563 trace_screens = _mesa_hash_table_create(NULL, _mesa_hash_pointer, _mesa_key_pointer_equal);
1564 _mesa_hash_table_insert(trace_screens, screen, tr_scr);
1565
1566 tr_scr->trace_tc = debug_get_bool_option("GALLIUM_TRACE_TC", false);
1567
1568 /* copy all caps */
1569 *(struct pipe_caps *)&tr_scr->base.caps = screen->caps;
1570
1571 return &tr_scr->base;
1572
1573 error2:
1574 trace_dump_ret(ptr, screen);
1575 trace_dump_call_end();
1576 error1:
1577 return screen;
1578 }
1579
1580
1581 struct trace_screen *
trace_screen(struct pipe_screen * screen)1582 trace_screen(struct pipe_screen *screen)
1583 {
1584 assert(screen);
1585 assert(screen->destroy == trace_screen_destroy);
1586 return (struct trace_screen *)screen;
1587 }
1588