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