Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/gallium/auxiliary/driver_trace/tr_screen.c
4565 views
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
#include "util/simple_list.h"
32
33
#include "tr_dump.h"
34
#include "tr_dump_defines.h"
35
#include "tr_dump_state.h"
36
#include "tr_texture.h"
37
#include "tr_context.h"
38
#include "tr_screen.h"
39
#include "tr_public.h"
40
41
42
static bool trace = false;
43
static struct hash_table *trace_screens;
44
45
static const char *
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 *
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 *
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 *
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
116
return screen->get_compiler_options(screen, ir, shader);
117
}
118
119
120
static struct disk_cache *
121
trace_screen_get_disk_shader_cache(struct pipe_screen *_screen)
122
{
123
struct trace_screen *tr_scr = trace_screen(_screen);
124
struct pipe_screen *screen = tr_scr->screen;
125
126
trace_dump_call_begin("pipe_screen", "get_disk_shader_cache");
127
128
trace_dump_arg(ptr, screen);
129
130
struct disk_cache *result = screen->get_disk_shader_cache(screen);
131
132
trace_dump_ret(ptr, result);
133
134
trace_dump_call_end();
135
136
return result;
137
}
138
139
140
static int
141
trace_screen_get_param(struct pipe_screen *_screen,
142
enum pipe_cap param)
143
{
144
struct trace_screen *tr_scr = trace_screen(_screen);
145
struct pipe_screen *screen = tr_scr->screen;
146
int result;
147
148
trace_dump_call_begin("pipe_screen", "get_param");
149
150
trace_dump_arg(ptr, screen);
151
trace_dump_arg(int, param);
152
153
result = screen->get_param(screen, param);
154
155
trace_dump_ret(int, result);
156
157
trace_dump_call_end();
158
159
return result;
160
}
161
162
163
static int
164
trace_screen_get_shader_param(struct pipe_screen *_screen,
165
enum pipe_shader_type shader,
166
enum pipe_shader_cap param)
167
{
168
struct trace_screen *tr_scr = trace_screen(_screen);
169
struct pipe_screen *screen = tr_scr->screen;
170
int result;
171
172
trace_dump_call_begin("pipe_screen", "get_shader_param");
173
174
trace_dump_arg(ptr, screen);
175
trace_dump_arg(uint, shader);
176
trace_dump_arg(int, param);
177
178
result = screen->get_shader_param(screen, shader, param);
179
180
trace_dump_ret(int, result);
181
182
trace_dump_call_end();
183
184
return result;
185
}
186
187
188
static float
189
trace_screen_get_paramf(struct pipe_screen *_screen,
190
enum pipe_capf param)
191
{
192
struct trace_screen *tr_scr = trace_screen(_screen);
193
struct pipe_screen *screen = tr_scr->screen;
194
float result;
195
196
trace_dump_call_begin("pipe_screen", "get_paramf");
197
198
trace_dump_arg(ptr, screen);
199
trace_dump_arg(int, param);
200
201
result = screen->get_paramf(screen, param);
202
203
trace_dump_ret(float, result);
204
205
trace_dump_call_end();
206
207
return result;
208
}
209
210
211
static int
212
trace_screen_get_compute_param(struct pipe_screen *_screen,
213
enum pipe_shader_ir ir_type,
214
enum pipe_compute_cap param, void *data)
215
{
216
struct trace_screen *tr_scr = trace_screen(_screen);
217
struct pipe_screen *screen = tr_scr->screen;
218
int result;
219
220
trace_dump_call_begin("pipe_screen", "get_compute_param");
221
222
trace_dump_arg(ptr, screen);
223
trace_dump_arg(int, ir_type);
224
trace_dump_arg(int, param);
225
trace_dump_arg(ptr, data);
226
227
result = screen->get_compute_param(screen, ir_type, param, data);
228
229
trace_dump_ret(int, result);
230
231
trace_dump_call_end();
232
233
return result;
234
}
235
236
237
static bool
238
trace_screen_is_format_supported(struct pipe_screen *_screen,
239
enum pipe_format format,
240
enum pipe_texture_target target,
241
unsigned sample_count,
242
unsigned storage_sample_count,
243
unsigned tex_usage)
244
{
245
struct trace_screen *tr_scr = trace_screen(_screen);
246
struct pipe_screen *screen = tr_scr->screen;
247
bool result;
248
249
trace_dump_call_begin("pipe_screen", "is_format_supported");
250
251
trace_dump_arg(ptr, screen);
252
trace_dump_arg(format, format);
253
trace_dump_arg(int, target);
254
trace_dump_arg(uint, sample_count);
255
trace_dump_arg(uint, tex_usage);
256
257
result = screen->is_format_supported(screen, format, target, sample_count,
258
storage_sample_count, tex_usage);
259
260
trace_dump_ret(bool, result);
261
262
trace_dump_call_end();
263
264
return result;
265
}
266
267
static void
268
trace_context_replace_buffer_storage(struct pipe_context *_pipe,
269
struct pipe_resource *dst,
270
struct pipe_resource *src,
271
unsigned num_rebinds,
272
uint32_t rebind_mask,
273
unsigned delete_buffer_id)
274
{
275
struct trace_context *tr_ctx = trace_context(_pipe);
276
struct pipe_context *pipe = tr_ctx->pipe;
277
278
trace_dump_call_begin("pipe_context", "replace_buffer_storage");
279
280
trace_dump_arg(ptr, pipe);
281
trace_dump_arg(ptr, dst);
282
trace_dump_arg(ptr, src);
283
trace_dump_arg(uint, num_rebinds);
284
trace_dump_arg(uint, rebind_mask);
285
trace_dump_arg(uint, delete_buffer_id);
286
trace_dump_call_end();
287
288
tr_ctx->replace_buffer_storage(pipe, dst, src, num_rebinds, rebind_mask, delete_buffer_id);
289
}
290
291
static struct pipe_fence_handle *
292
trace_context_create_fence(struct pipe_context *_pipe, struct tc_unflushed_batch_token *token)
293
{
294
struct trace_context *tr_ctx = trace_context(_pipe);
295
struct pipe_context *pipe = tr_ctx->pipe;
296
297
trace_dump_call_begin("pipe_context", "create_fence");
298
299
trace_dump_arg(ptr, pipe);
300
trace_dump_arg(ptr, token);
301
302
struct pipe_fence_handle *ret = tr_ctx->create_fence(pipe, token);
303
trace_dump_ret(ptr, ret);
304
trace_dump_call_end();
305
306
return ret;
307
}
308
309
static bool
310
trace_context_is_resource_busy(struct pipe_screen *_screen,
311
struct pipe_resource *resource,
312
unsigned usage)
313
{
314
struct trace_screen *tr_scr = trace_screen(_screen);
315
struct pipe_screen *screen = tr_scr->screen;
316
bool result;
317
318
trace_dump_call_begin("pipe_screen", "is_resource_busy");
319
320
trace_dump_arg(ptr, screen);
321
trace_dump_arg(ptr, resource);
322
trace_dump_arg(uint, usage);
323
324
result = tr_scr->is_resource_busy(screen, resource, usage);
325
326
trace_dump_ret(bool, result);
327
328
trace_dump_call_end();
329
330
return result;
331
}
332
333
struct pipe_context *
334
trace_context_create_threaded(struct pipe_screen *screen, struct pipe_context *pipe,
335
tc_replace_buffer_storage_func *replace_buffer,
336
tc_create_fence_func *create_fence,
337
tc_is_resource_busy *is_resource_busy)
338
{
339
if (!trace_screens)
340
return pipe;
341
342
struct hash_entry *he = _mesa_hash_table_search(trace_screens, screen);
343
if (!he)
344
return pipe;
345
struct trace_screen *tr_scr = trace_screen(he->data);
346
347
if (tr_scr->trace_tc)
348
return pipe;
349
350
struct pipe_context *ctx = trace_context_create(tr_scr, pipe);
351
if (!ctx)
352
return pipe;
353
354
struct trace_context *tr_ctx = trace_context(ctx);
355
tr_ctx->replace_buffer_storage = *replace_buffer;
356
tr_ctx->create_fence = *create_fence;
357
tr_scr->is_resource_busy = *is_resource_busy;
358
tr_ctx->threaded = true;
359
*replace_buffer = trace_context_replace_buffer_storage;
360
if (*create_fence)
361
*create_fence = trace_context_create_fence;
362
if (*is_resource_busy)
363
*is_resource_busy = trace_context_is_resource_busy;
364
return ctx;
365
}
366
367
static struct pipe_context *
368
trace_screen_context_create(struct pipe_screen *_screen, void *priv,
369
unsigned flags)
370
{
371
struct trace_screen *tr_scr = trace_screen(_screen);
372
struct pipe_screen *screen = tr_scr->screen;
373
struct pipe_context *result;
374
375
result = screen->context_create(screen, priv, flags);
376
377
trace_dump_call_begin("pipe_screen", "context_create");
378
379
trace_dump_arg(ptr, screen);
380
trace_dump_arg(ptr, priv);
381
trace_dump_arg(uint, flags);
382
383
trace_dump_ret(ptr, result);
384
385
trace_dump_call_end();
386
387
if (result && (tr_scr->trace_tc || result->draw_vbo != tc_draw_vbo))
388
result = trace_context_create(tr_scr, result);
389
390
return result;
391
}
392
393
394
static void
395
trace_screen_flush_frontbuffer(struct pipe_screen *_screen,
396
struct pipe_context *_pipe,
397
struct pipe_resource *resource,
398
unsigned level, unsigned layer,
399
void *context_private,
400
struct pipe_box *sub_box)
401
{
402
struct trace_screen *tr_scr = trace_screen(_screen);
403
struct pipe_screen *screen = tr_scr->screen;
404
struct pipe_context *pipe = _pipe ? trace_get_possibly_threaded_context(_pipe) : NULL;
405
406
trace_dump_call_begin("pipe_screen", "flush_frontbuffer");
407
408
trace_dump_arg(ptr, screen);
409
trace_dump_arg(ptr, resource);
410
trace_dump_arg(uint, level);
411
trace_dump_arg(uint, layer);
412
/* XXX: hide, as there is nothing we can do with this
413
trace_dump_arg(ptr, context_private);
414
*/
415
416
trace_dump_call_end();
417
418
screen->flush_frontbuffer(screen, pipe, resource, level, layer, context_private, sub_box);
419
}
420
421
422
static void
423
trace_screen_get_driver_uuid(struct pipe_screen *_screen, char *uuid)
424
{
425
struct pipe_screen *screen = trace_screen(_screen)->screen;
426
427
trace_dump_call_begin("pipe_screen", "get_driver_uuid");
428
trace_dump_arg(ptr, screen);
429
430
screen->get_driver_uuid(screen, uuid);
431
432
trace_dump_ret(string, uuid);
433
trace_dump_call_end();
434
}
435
436
static void
437
trace_screen_get_device_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_device_uuid");
442
trace_dump_arg(ptr, screen);
443
444
screen->get_device_uuid(screen, uuid);
445
446
trace_dump_ret(string, uuid);
447
trace_dump_call_end();
448
}
449
450
451
/********************************************************************
452
* texture
453
*/
454
455
static void *
456
trace_screen_map_memory(struct pipe_screen *_screen,
457
struct pipe_memory_allocation *pmem)
458
{
459
struct trace_screen *tr_scr = trace_screen(_screen);
460
struct pipe_screen *screen = tr_scr->screen;
461
void *result;
462
463
trace_dump_call_begin("pipe_screen", "map_memory");
464
465
trace_dump_arg(ptr, screen);
466
trace_dump_arg(ptr, pmem);
467
468
result = screen->map_memory(screen, pmem);
469
470
trace_dump_ret(ptr, result);
471
472
trace_dump_call_end();
473
474
return result;
475
}
476
477
static void
478
trace_screen_unmap_memory(struct pipe_screen *_screen,
479
struct pipe_memory_allocation *pmem)
480
{
481
struct trace_screen *tr_scr = trace_screen(_screen);
482
struct pipe_screen *screen = tr_scr->screen;
483
484
trace_dump_call_begin("pipe_screen", "unmap_memory");
485
486
trace_dump_arg(ptr, screen);
487
trace_dump_arg(ptr, pmem);
488
489
screen->unmap_memory(screen, pmem);
490
491
492
trace_dump_call_end();
493
}
494
495
static struct pipe_memory_allocation *
496
trace_screen_allocate_memory(struct pipe_screen *_screen,
497
uint64_t size)
498
{
499
struct trace_screen *tr_scr = trace_screen(_screen);
500
struct pipe_screen *screen = tr_scr->screen;
501
struct pipe_memory_allocation *result;
502
503
trace_dump_call_begin("pipe_screen", "allocate_memory");
504
505
trace_dump_arg(ptr, screen);
506
trace_dump_arg(uint, size);
507
508
result = screen->allocate_memory(screen, size);
509
510
trace_dump_ret(ptr, result);
511
512
trace_dump_call_end();
513
514
return result;
515
}
516
517
static void
518
trace_screen_free_memory(struct pipe_screen *_screen,
519
struct pipe_memory_allocation *pmem)
520
{
521
struct trace_screen *tr_scr = trace_screen(_screen);
522
struct pipe_screen *screen = tr_scr->screen;
523
524
trace_dump_call_begin("pipe_screen", "free_memory");
525
526
trace_dump_arg(ptr, screen);
527
trace_dump_arg(ptr, pmem);
528
529
screen->free_memory(screen, pmem);
530
531
532
trace_dump_call_end();
533
}
534
535
static bool
536
trace_screen_resource_bind_backing(struct pipe_screen *_screen,
537
struct pipe_resource *resource,
538
struct pipe_memory_allocation *pmem,
539
uint64_t offset)
540
{
541
struct trace_screen *tr_scr = trace_screen(_screen);
542
struct pipe_screen *screen = tr_scr->screen;
543
bool result;
544
545
trace_dump_call_begin("pipe_screen", "resource_bind_backing");
546
547
trace_dump_arg(ptr, screen);
548
trace_dump_arg(ptr, resource);
549
trace_dump_arg(ptr, pmem);
550
trace_dump_arg(uint, offset);
551
552
result = screen->resource_bind_backing(screen, resource, pmem, offset);
553
554
trace_dump_ret(bool, result);
555
556
trace_dump_call_end();
557
558
return result;
559
}
560
561
static struct pipe_resource *
562
trace_screen_resource_create_unbacked(struct pipe_screen *_screen,
563
const struct pipe_resource *templat,
564
uint64_t *size_required)
565
{
566
struct trace_screen *tr_scr = trace_screen(_screen);
567
struct pipe_screen *screen = tr_scr->screen;
568
struct pipe_resource *result;
569
570
trace_dump_call_begin("pipe_screen", "resource_create_unbacked");
571
572
trace_dump_arg(ptr, screen);
573
trace_dump_arg(resource_template, templat);
574
575
result = screen->resource_create_unbacked(screen, templat, size_required);
576
577
trace_dump_ret_begin();
578
trace_dump_uint(*size_required);
579
trace_dump_ret_end();
580
trace_dump_ret(ptr, result);
581
582
trace_dump_call_end();
583
584
if (result)
585
result->screen = _screen;
586
return result;
587
}
588
589
static struct pipe_resource *
590
trace_screen_resource_create(struct pipe_screen *_screen,
591
const struct pipe_resource *templat)
592
{
593
struct trace_screen *tr_scr = trace_screen(_screen);
594
struct pipe_screen *screen = tr_scr->screen;
595
struct pipe_resource *result;
596
597
trace_dump_call_begin("pipe_screen", "resource_create");
598
599
trace_dump_arg(ptr, screen);
600
trace_dump_arg(resource_template, templat);
601
602
result = screen->resource_create(screen, templat);
603
604
trace_dump_ret(ptr, result);
605
606
trace_dump_call_end();
607
608
if (result)
609
result->screen = _screen;
610
return result;
611
}
612
613
static struct pipe_resource *
614
trace_screen_resource_create_with_modifiers(struct pipe_screen *_screen, const struct pipe_resource *templat,
615
const uint64_t *modifiers, int modifiers_count)
616
{
617
struct trace_screen *tr_scr = trace_screen(_screen);
618
struct pipe_screen *screen = tr_scr->screen;
619
struct pipe_resource *result;
620
621
trace_dump_call_begin("pipe_screen", "resource_create_with_modifiers");
622
623
trace_dump_arg(ptr, screen);
624
trace_dump_arg(resource_template, templat);
625
trace_dump_arg_array(uint, modifiers, modifiers_count);
626
627
result = screen->resource_create_with_modifiers(screen, templat, modifiers, modifiers_count);
628
629
trace_dump_ret(ptr, result);
630
631
trace_dump_call_end();
632
633
if (result)
634
result->screen = _screen;
635
return result;
636
}
637
638
static struct pipe_resource *
639
trace_screen_resource_from_handle(struct pipe_screen *_screen,
640
const struct pipe_resource *templ,
641
struct winsys_handle *handle,
642
unsigned usage)
643
{
644
struct trace_screen *tr_screen = trace_screen(_screen);
645
struct pipe_screen *screen = tr_screen->screen;
646
struct pipe_resource *result;
647
648
/* TODO trace call */
649
650
result = screen->resource_from_handle(screen, templ, handle, usage);
651
652
if (result)
653
result->screen = _screen;
654
return result;
655
}
656
657
static bool
658
trace_screen_check_resource_capability(struct pipe_screen *_screen,
659
struct pipe_resource *resource,
660
unsigned bind)
661
{
662
struct pipe_screen *screen = trace_screen(_screen)->screen;
663
664
return screen->check_resource_capability(screen, resource, bind);
665
}
666
667
static bool
668
trace_screen_resource_get_handle(struct pipe_screen *_screen,
669
struct pipe_context *_pipe,
670
struct pipe_resource *resource,
671
struct winsys_handle *handle,
672
unsigned usage)
673
{
674
struct trace_screen *tr_screen = trace_screen(_screen);
675
struct pipe_context *pipe = _pipe ? trace_get_possibly_threaded_context(_pipe) : NULL;
676
struct pipe_screen *screen = tr_screen->screen;
677
678
/* TODO trace call */
679
680
return screen->resource_get_handle(screen, pipe,
681
resource, handle, usage);
682
}
683
684
static bool
685
trace_screen_resource_get_param(struct pipe_screen *_screen,
686
struct pipe_context *_pipe,
687
struct pipe_resource *resource,
688
unsigned plane,
689
unsigned layer,
690
unsigned level,
691
enum pipe_resource_param param,
692
unsigned handle_usage,
693
uint64_t *value)
694
{
695
struct trace_screen *tr_screen = trace_screen(_screen);
696
struct pipe_context *pipe = _pipe ? trace_get_possibly_threaded_context(_pipe) : NULL;
697
struct pipe_screen *screen = tr_screen->screen;
698
699
/* TODO trace call */
700
701
return screen->resource_get_param(screen, pipe,
702
resource, plane, layer, level, param,
703
handle_usage, value);
704
}
705
706
static void
707
trace_screen_resource_get_info(struct pipe_screen *_screen,
708
struct pipe_resource *resource,
709
unsigned *stride,
710
unsigned *offset)
711
{
712
struct trace_screen *tr_screen = trace_screen(_screen);
713
struct pipe_screen *screen = tr_screen->screen;
714
715
/* TODO trace call */
716
717
screen->resource_get_info(screen, resource, stride, offset);
718
}
719
720
static struct pipe_resource *
721
trace_screen_resource_from_memobj(struct pipe_screen *_screen,
722
const struct pipe_resource *templ,
723
struct pipe_memory_object *memobj,
724
uint64_t offset)
725
{
726
struct pipe_screen *screen = trace_screen(_screen)->screen;
727
728
trace_dump_call_begin("pipe_screen", "resource_from_memobj");
729
trace_dump_arg(ptr, screen);
730
trace_dump_arg(resource_template, templ);
731
trace_dump_arg(ptr, memobj);
732
trace_dump_arg(uint, offset);
733
734
struct pipe_resource *res =
735
screen->resource_from_memobj(screen, templ, memobj, offset);
736
737
if (!res)
738
return NULL;
739
res->screen = _screen;
740
741
trace_dump_ret(ptr, res);
742
trace_dump_call_end();
743
return res;
744
}
745
746
static void
747
trace_screen_resource_changed(struct pipe_screen *_screen,
748
struct pipe_resource *resource)
749
{
750
struct trace_screen *tr_scr = trace_screen(_screen);
751
struct pipe_screen *screen = tr_scr->screen;
752
753
trace_dump_call_begin("pipe_screen", "resource_changed");
754
755
trace_dump_arg(ptr, screen);
756
trace_dump_arg(ptr, resource);
757
758
if (screen->resource_changed)
759
screen->resource_changed(screen, resource);
760
761
trace_dump_call_end();
762
}
763
764
static void
765
trace_screen_resource_destroy(struct pipe_screen *_screen,
766
struct pipe_resource *resource)
767
{
768
struct trace_screen *tr_scr = trace_screen(_screen);
769
struct pipe_screen *screen = tr_scr->screen;
770
771
/* Don't trace this, because due to the lack of pipe_resource wrapping,
772
* we can get this call from inside of driver calls, which would try
773
* to lock an already-locked mutex.
774
*/
775
screen->resource_destroy(screen, resource);
776
}
777
778
779
/********************************************************************
780
* fence
781
*/
782
783
784
static void
785
trace_screen_fence_reference(struct pipe_screen *_screen,
786
struct pipe_fence_handle **pdst,
787
struct pipe_fence_handle *src)
788
{
789
struct trace_screen *tr_scr = trace_screen(_screen);
790
struct pipe_screen *screen = tr_scr->screen;
791
struct pipe_fence_handle *dst;
792
793
assert(pdst);
794
dst = *pdst;
795
796
trace_dump_call_begin("pipe_screen", "fence_reference");
797
798
trace_dump_arg(ptr, screen);
799
trace_dump_arg(ptr, dst);
800
trace_dump_arg(ptr, src);
801
802
screen->fence_reference(screen, pdst, src);
803
804
trace_dump_call_end();
805
}
806
807
808
static int
809
trace_screen_fence_get_fd(struct pipe_screen *_screen,
810
struct pipe_fence_handle *fence)
811
{
812
struct trace_screen *tr_scr = trace_screen(_screen);
813
struct pipe_screen *screen = tr_scr->screen;
814
int result;
815
816
trace_dump_call_begin("pipe_screen", "fence_get_fd");
817
818
trace_dump_arg(ptr, screen);
819
trace_dump_arg(ptr, fence);
820
821
result = screen->fence_get_fd(screen, fence);
822
823
trace_dump_ret(int, result);
824
825
trace_dump_call_end();
826
827
return result;
828
}
829
830
831
static bool
832
trace_screen_fence_finish(struct pipe_screen *_screen,
833
struct pipe_context *_ctx,
834
struct pipe_fence_handle *fence,
835
uint64_t timeout)
836
{
837
struct trace_screen *tr_scr = trace_screen(_screen);
838
struct pipe_screen *screen = tr_scr->screen;
839
struct pipe_context *ctx = _ctx ? trace_get_possibly_threaded_context(_ctx) : NULL;
840
int result;
841
842
result = screen->fence_finish(screen, ctx, fence, timeout);
843
844
845
trace_dump_call_begin("pipe_screen", "fence_finish");
846
847
trace_dump_arg(ptr, screen);
848
trace_dump_arg(ptr, ctx);
849
trace_dump_arg(ptr, fence);
850
trace_dump_arg(uint, timeout);
851
852
trace_dump_ret(bool, result);
853
854
trace_dump_call_end();
855
856
return result;
857
}
858
859
860
/********************************************************************
861
* memobj
862
*/
863
864
static struct pipe_memory_object *
865
trace_screen_memobj_create_from_handle(struct pipe_screen *_screen,
866
struct winsys_handle *handle,
867
bool dedicated)
868
{
869
struct pipe_screen *screen = trace_screen(_screen)->screen;
870
871
trace_dump_call_begin("pipe_screen", "memobj_create_from_handle");
872
trace_dump_arg(ptr, screen);
873
trace_dump_arg(ptr, handle);
874
trace_dump_arg(bool, dedicated);
875
876
struct pipe_memory_object *res =
877
screen->memobj_create_from_handle(screen, handle, dedicated);
878
879
trace_dump_ret(ptr, res);
880
trace_dump_call_end();
881
882
return res;
883
}
884
885
static void
886
trace_screen_memobj_destroy(struct pipe_screen *_screen,
887
struct pipe_memory_object *memobj)
888
{
889
struct pipe_screen *screen = trace_screen(_screen)->screen;
890
891
trace_dump_call_begin("pipe_screen", "memobj_destroy");
892
trace_dump_arg(ptr, screen);
893
trace_dump_arg(ptr, memobj);
894
trace_dump_call_end();
895
896
screen->memobj_destroy(screen, memobj);
897
}
898
899
900
/********************************************************************
901
* screen
902
*/
903
904
static uint64_t
905
trace_screen_get_timestamp(struct pipe_screen *_screen)
906
{
907
struct trace_screen *tr_scr = trace_screen(_screen);
908
struct pipe_screen *screen = tr_scr->screen;
909
uint64_t result;
910
911
trace_dump_call_begin("pipe_screen", "get_timestamp");
912
trace_dump_arg(ptr, screen);
913
914
result = screen->get_timestamp(screen);
915
916
trace_dump_ret(uint, result);
917
trace_dump_call_end();
918
919
return result;
920
}
921
922
static void
923
trace_screen_finalize_nir(struct pipe_screen *_screen, void *nir, bool optimize)
924
{
925
struct pipe_screen *screen = trace_screen(_screen)->screen;
926
927
screen->finalize_nir(screen, nir, optimize);
928
}
929
930
static void
931
trace_screen_destroy(struct pipe_screen *_screen)
932
{
933
struct trace_screen *tr_scr = trace_screen(_screen);
934
struct pipe_screen *screen = tr_scr->screen;
935
936
trace_dump_call_begin("pipe_screen", "destroy");
937
trace_dump_arg(ptr, screen);
938
trace_dump_call_end();
939
940
if (trace_screens) {
941
struct hash_entry *he = _mesa_hash_table_search(trace_screens, screen);
942
if (he) {
943
_mesa_hash_table_remove(trace_screens, he);
944
if (!_mesa_hash_table_num_entries(trace_screens)) {
945
_mesa_hash_table_destroy(trace_screens, NULL);
946
trace_screens = NULL;
947
}
948
}
949
}
950
951
screen->destroy(screen);
952
953
FREE(tr_scr);
954
}
955
956
static void
957
trace_screen_query_memory_info(struct pipe_screen *_screen, struct pipe_memory_info *info)
958
{
959
struct trace_screen *tr_scr = trace_screen(_screen);
960
struct pipe_screen *screen = tr_scr->screen;
961
962
trace_dump_call_begin("pipe_screen", "query_memory_info");
963
964
trace_dump_arg(ptr, screen);
965
966
screen->query_memory_info(screen, info);
967
968
trace_dump_ret(memory_info, info);
969
970
trace_dump_call_end();
971
}
972
973
static void
974
trace_screen_query_dmabuf_modifiers(struct pipe_screen *_screen, enum pipe_format format, int max, uint64_t *modifiers, unsigned int *external_only, int *count)
975
{
976
struct trace_screen *tr_scr = trace_screen(_screen);
977
struct pipe_screen *screen = tr_scr->screen;
978
979
trace_dump_call_begin("pipe_screen", "query_dmabuf_modifiers");
980
981
trace_dump_arg(ptr, screen);
982
trace_dump_arg(format, format);
983
trace_dump_arg(int, max);
984
985
screen->query_dmabuf_modifiers(screen, format, max, modifiers, external_only, count);
986
987
if (max)
988
trace_dump_arg_array(uint, modifiers, *count);
989
else
990
trace_dump_arg_array(uint, modifiers, max);
991
trace_dump_arg_array(uint, external_only, max);
992
trace_dump_ret_begin();
993
trace_dump_uint(*count);
994
trace_dump_ret_end();
995
996
trace_dump_call_end();
997
}
998
999
static bool
1000
trace_screen_is_dmabuf_modifier_supported(struct pipe_screen *_screen, uint64_t modifier, enum pipe_format format, bool *external_only)
1001
{
1002
struct trace_screen *tr_scr = trace_screen(_screen);
1003
struct pipe_screen *screen = tr_scr->screen;
1004
1005
trace_dump_call_begin("pipe_screen", "is_dmabuf_modifier_supported");
1006
1007
trace_dump_arg(ptr, screen);
1008
trace_dump_arg(uint, modifier);
1009
trace_dump_arg(format, format);
1010
1011
bool ret = screen->is_dmabuf_modifier_supported(screen, modifier, format, external_only);
1012
1013
trace_dump_arg_begin("external_only");
1014
trace_dump_bool(external_only ? *external_only : false);
1015
trace_dump_arg_end();
1016
1017
trace_dump_ret(bool, ret);
1018
1019
trace_dump_call_end();
1020
return ret;
1021
}
1022
1023
static unsigned int
1024
trace_screen_get_dmabuf_modifier_planes(struct pipe_screen *_screen, uint64_t modifier, enum pipe_format format)
1025
{
1026
struct trace_screen *tr_scr = trace_screen(_screen);
1027
struct pipe_screen *screen = tr_scr->screen;
1028
1029
trace_dump_call_begin("pipe_screen", "get_dmabuf_modifier_planes");
1030
1031
trace_dump_arg(ptr, screen);
1032
trace_dump_arg(uint, modifier);
1033
trace_dump_arg(format, format);
1034
1035
unsigned ret = screen->get_dmabuf_modifier_planes(screen, modifier, format);
1036
1037
trace_dump_ret(uint, ret);
1038
1039
trace_dump_call_end();
1040
return ret;
1041
}
1042
1043
bool
1044
trace_enabled(void)
1045
{
1046
static bool firstrun = true;
1047
1048
if (!firstrun)
1049
return trace;
1050
firstrun = false;
1051
1052
if(trace_dump_trace_begin()) {
1053
trace_dumping_start();
1054
trace = true;
1055
}
1056
1057
return trace;
1058
}
1059
1060
struct pipe_screen *
1061
trace_screen_create(struct pipe_screen *screen)
1062
{
1063
struct trace_screen *tr_scr;
1064
1065
#ifdef ZINK_WITH_SWRAST_VK
1066
/* if zink+lavapipe is enabled, ensure that only one driver is traced */
1067
const char *driver = debug_get_option("MESA_LOADER_DRIVER_OVERRIDE", NULL);
1068
if (driver && !strcmp(driver, "zink")) {
1069
/* the user wants zink: check whether they want to trace zink or lavapipe */
1070
bool trace_lavapipe = debug_get_bool_option("ZINK_TRACE_LAVAPIPE", false);
1071
if (!strncmp(screen->get_name(screen), "zink", 4)) {
1072
/* this is the zink screen: only trace if lavapipe tracing is disabled */
1073
if (trace_lavapipe)
1074
return screen;
1075
} else {
1076
/* this is the llvmpipe screen: only trace if lavapipe tracing is enabled */
1077
if (!trace_lavapipe)
1078
return screen;
1079
}
1080
}
1081
#endif
1082
if (!trace_enabled())
1083
goto error1;
1084
1085
trace_dump_call_begin("", "pipe_screen_create");
1086
1087
tr_scr = CALLOC_STRUCT(trace_screen);
1088
if (!tr_scr)
1089
goto error2;
1090
1091
#define SCR_INIT(_member) \
1092
tr_scr->base._member = screen->_member ? trace_screen_##_member : NULL
1093
1094
tr_scr->base.destroy = trace_screen_destroy;
1095
tr_scr->base.get_name = trace_screen_get_name;
1096
tr_scr->base.get_vendor = trace_screen_get_vendor;
1097
tr_scr->base.get_device_vendor = trace_screen_get_device_vendor;
1098
SCR_INIT(get_compiler_options);
1099
SCR_INIT(get_disk_shader_cache);
1100
tr_scr->base.get_param = trace_screen_get_param;
1101
tr_scr->base.get_shader_param = trace_screen_get_shader_param;
1102
tr_scr->base.get_paramf = trace_screen_get_paramf;
1103
tr_scr->base.get_compute_param = trace_screen_get_compute_param;
1104
tr_scr->base.is_format_supported = trace_screen_is_format_supported;
1105
assert(screen->context_create);
1106
tr_scr->base.context_create = trace_screen_context_create;
1107
tr_scr->base.resource_create = trace_screen_resource_create;
1108
SCR_INIT(resource_create_with_modifiers);
1109
tr_scr->base.resource_create_unbacked = trace_screen_resource_create_unbacked;
1110
tr_scr->base.resource_bind_backing = trace_screen_resource_bind_backing;
1111
tr_scr->base.resource_from_handle = trace_screen_resource_from_handle;
1112
tr_scr->base.allocate_memory = trace_screen_allocate_memory;
1113
tr_scr->base.free_memory = trace_screen_free_memory;
1114
tr_scr->base.map_memory = trace_screen_map_memory;
1115
tr_scr->base.unmap_memory = trace_screen_unmap_memory;
1116
SCR_INIT(query_memory_info);
1117
SCR_INIT(query_dmabuf_modifiers);
1118
SCR_INIT(is_dmabuf_modifier_supported);
1119
SCR_INIT(get_dmabuf_modifier_planes);
1120
SCR_INIT(check_resource_capability);
1121
tr_scr->base.resource_get_handle = trace_screen_resource_get_handle;
1122
SCR_INIT(resource_get_param);
1123
SCR_INIT(resource_get_info);
1124
SCR_INIT(resource_from_memobj);
1125
SCR_INIT(resource_changed);
1126
tr_scr->base.resource_destroy = trace_screen_resource_destroy;
1127
tr_scr->base.fence_reference = trace_screen_fence_reference;
1128
SCR_INIT(fence_get_fd);
1129
tr_scr->base.fence_finish = trace_screen_fence_finish;
1130
SCR_INIT(memobj_create_from_handle);
1131
SCR_INIT(memobj_destroy);
1132
tr_scr->base.flush_frontbuffer = trace_screen_flush_frontbuffer;
1133
tr_scr->base.get_timestamp = trace_screen_get_timestamp;
1134
SCR_INIT(get_driver_uuid);
1135
SCR_INIT(get_device_uuid);
1136
SCR_INIT(finalize_nir);
1137
tr_scr->base.transfer_helper = screen->transfer_helper;
1138
1139
tr_scr->screen = screen;
1140
1141
trace_dump_ret(ptr, screen);
1142
trace_dump_call_end();
1143
1144
if (!trace_screens)
1145
trace_screens = _mesa_hash_table_create(NULL, _mesa_hash_pointer, _mesa_key_pointer_equal);
1146
_mesa_hash_table_insert(trace_screens, screen, tr_scr);
1147
1148
tr_scr->trace_tc = debug_get_bool_option("GALLIUM_TRACE_TC", false);
1149
1150
return &tr_scr->base;
1151
1152
error2:
1153
trace_dump_ret(ptr, screen);
1154
trace_dump_call_end();
1155
error1:
1156
return screen;
1157
}
1158
1159
1160
struct trace_screen *
1161
trace_screen(struct pipe_screen *screen)
1162
{
1163
assert(screen);
1164
assert(screen->destroy == trace_screen_destroy);
1165
return (struct trace_screen *)screen;
1166
}
1167
1168