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