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_context.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/ralloc.h"
29
#include "util/u_inlines.h"
30
#include "util/u_memory.h"
31
#include "util/simple_list.h"
32
#include "util/u_framebuffer.h"
33
34
#include "pipe/p_format.h"
35
#include "pipe/p_screen.h"
36
37
#include "tr_dump.h"
38
#include "tr_dump_defines.h"
39
#include "tr_dump_state.h"
40
#include "tr_public.h"
41
#include "tr_screen.h"
42
#include "tr_texture.h"
43
#include "tr_context.h"
44
45
46
struct trace_query
47
{
48
struct threaded_query base;
49
unsigned type;
50
51
struct pipe_query *query;
52
};
53
54
55
static inline struct trace_query *
56
trace_query(struct pipe_query *query)
57
{
58
return (struct trace_query *)query;
59
}
60
61
62
static inline struct pipe_query *
63
trace_query_unwrap(struct pipe_query *query)
64
{
65
if (query) {
66
return trace_query(query)->query;
67
} else {
68
return NULL;
69
}
70
}
71
72
73
static inline struct pipe_surface *
74
trace_surface_unwrap(struct trace_context *tr_ctx,
75
struct pipe_surface *surface)
76
{
77
struct trace_surface *tr_surf;
78
79
if (!surface)
80
return NULL;
81
82
assert(surface->texture);
83
if (!surface->texture)
84
return surface;
85
86
tr_surf = trace_surface(surface);
87
88
assert(tr_surf->surface);
89
return tr_surf->surface;
90
}
91
92
static void
93
dump_fb_state(struct trace_context *tr_ctx,
94
const char *method,
95
bool deep)
96
{
97
struct pipe_context *pipe = tr_ctx->pipe;
98
99
trace_dump_call_begin("pipe_context", method);
100
101
trace_dump_arg(ptr, pipe);
102
if (deep)
103
trace_dump_arg(framebuffer_state_deep, &tr_ctx->unwrapped_state);
104
else
105
trace_dump_arg(framebuffer_state, &tr_ctx->unwrapped_state);
106
trace_dump_call_end();
107
108
tr_ctx->seen_fb_state = true;
109
}
110
111
static void
112
trace_context_draw_vbo(struct pipe_context *_pipe,
113
const struct pipe_draw_info *info,
114
unsigned drawid_offset,
115
const struct pipe_draw_indirect_info *indirect,
116
const struct pipe_draw_start_count_bias *draws,
117
unsigned num_draws)
118
{
119
struct trace_context *tr_ctx = trace_context(_pipe);
120
struct pipe_context *pipe = tr_ctx->pipe;
121
122
if (!tr_ctx->seen_fb_state && trace_dump_is_triggered())
123
dump_fb_state(tr_ctx, "current_framebuffer_state", true);
124
125
trace_dump_call_begin("pipe_context", "draw_vbo");
126
127
trace_dump_arg(ptr, pipe);
128
trace_dump_arg(draw_info, info);
129
trace_dump_arg(int, drawid_offset);
130
trace_dump_arg(draw_indirect_info, indirect);
131
trace_dump_arg_begin("draws");
132
trace_dump_struct_array(draw_start_count, draws, num_draws);
133
trace_dump_arg_end();
134
trace_dump_arg(uint, num_draws);
135
136
trace_dump_trace_flush();
137
138
pipe->draw_vbo(pipe, info, drawid_offset, indirect, draws, num_draws);
139
140
trace_dump_call_end();
141
}
142
143
144
static struct pipe_query *
145
trace_context_create_query(struct pipe_context *_pipe,
146
unsigned query_type,
147
unsigned index)
148
{
149
struct trace_context *tr_ctx = trace_context(_pipe);
150
struct pipe_context *pipe = tr_ctx->pipe;
151
struct pipe_query *query;
152
153
trace_dump_call_begin("pipe_context", "create_query");
154
155
trace_dump_arg(ptr, pipe);
156
trace_dump_arg(query_type, query_type);
157
trace_dump_arg(int, index);
158
159
query = pipe->create_query(pipe, query_type, index);
160
161
trace_dump_ret(ptr, query);
162
163
trace_dump_call_end();
164
165
/* Wrap query object. */
166
if (query) {
167
struct trace_query *tr_query = CALLOC_STRUCT(trace_query);
168
if (tr_query) {
169
tr_query->type = query_type;
170
tr_query->query = query;
171
query = (struct pipe_query *)tr_query;
172
} else {
173
pipe->destroy_query(pipe, query);
174
query = NULL;
175
}
176
}
177
178
return query;
179
}
180
181
182
static void
183
trace_context_destroy_query(struct pipe_context *_pipe,
184
struct pipe_query *_query)
185
{
186
struct trace_context *tr_ctx = trace_context(_pipe);
187
struct pipe_context *pipe = tr_ctx->pipe;
188
struct trace_query *tr_query = trace_query(_query);
189
struct pipe_query *query = tr_query->query;
190
191
FREE(tr_query);
192
193
trace_dump_call_begin("pipe_context", "destroy_query");
194
195
trace_dump_arg(ptr, pipe);
196
trace_dump_arg(ptr, query);
197
198
pipe->destroy_query(pipe, query);
199
200
trace_dump_call_end();
201
}
202
203
204
static bool
205
trace_context_begin_query(struct pipe_context *_pipe,
206
struct pipe_query *query)
207
{
208
struct trace_context *tr_ctx = trace_context(_pipe);
209
struct pipe_context *pipe = tr_ctx->pipe;
210
bool ret;
211
212
query = trace_query_unwrap(query);
213
214
trace_dump_call_begin("pipe_context", "begin_query");
215
216
trace_dump_arg(ptr, pipe);
217
trace_dump_arg(ptr, query);
218
219
ret = pipe->begin_query(pipe, query);
220
221
trace_dump_call_end();
222
return ret;
223
}
224
225
226
static bool
227
trace_context_end_query(struct pipe_context *_pipe,
228
struct pipe_query *_query)
229
{
230
struct trace_context *tr_ctx = trace_context(_pipe);
231
struct pipe_context *pipe = tr_ctx->pipe;
232
bool ret;
233
234
struct pipe_query *query = trace_query_unwrap(_query);
235
236
trace_dump_call_begin("pipe_context", "end_query");
237
238
trace_dump_arg(ptr, pipe);
239
trace_dump_arg(ptr, query);
240
241
if (tr_ctx->threaded)
242
threaded_query(query)->flushed = trace_query(_query)->base.flushed;
243
ret = pipe->end_query(pipe, query);
244
245
trace_dump_call_end();
246
return ret;
247
}
248
249
250
static bool
251
trace_context_get_query_result(struct pipe_context *_pipe,
252
struct pipe_query *_query,
253
bool wait,
254
union pipe_query_result *result)
255
{
256
struct trace_context *tr_ctx = trace_context(_pipe);
257
struct pipe_context *pipe = tr_ctx->pipe;
258
struct trace_query *tr_query = trace_query(_query);
259
struct pipe_query *query = tr_query->query;
260
bool ret;
261
262
trace_dump_call_begin("pipe_context", "get_query_result");
263
264
trace_dump_arg(ptr, pipe);
265
trace_dump_arg(ptr, query);
266
trace_dump_arg(bool, wait);
267
268
if (tr_ctx->threaded)
269
threaded_query(query)->flushed = trace_query(_query)->base.flushed;
270
271
ret = pipe->get_query_result(pipe, query, wait, result);
272
273
trace_dump_arg_begin("result");
274
if (ret) {
275
trace_dump_query_result(tr_query->type, result);
276
} else {
277
trace_dump_null();
278
}
279
trace_dump_arg_end();
280
281
trace_dump_ret(bool, ret);
282
283
trace_dump_call_end();
284
285
return ret;
286
}
287
288
289
static void
290
trace_context_set_active_query_state(struct pipe_context *_pipe,
291
bool enable)
292
{
293
struct trace_context *tr_ctx = trace_context(_pipe);
294
struct pipe_context *pipe = tr_ctx->pipe;
295
296
trace_dump_call_begin("pipe_context", "set_active_query_state");
297
298
trace_dump_arg(ptr, pipe);
299
trace_dump_arg(bool, enable);
300
301
pipe->set_active_query_state(pipe, enable);
302
303
trace_dump_call_end();
304
}
305
306
307
static void *
308
trace_context_create_blend_state(struct pipe_context *_pipe,
309
const struct pipe_blend_state *state)
310
{
311
struct trace_context *tr_ctx = trace_context(_pipe);
312
struct pipe_context *pipe = tr_ctx->pipe;
313
void * result;
314
315
trace_dump_call_begin("pipe_context", "create_blend_state");
316
317
trace_dump_arg(ptr, pipe);
318
trace_dump_arg(blend_state, state);
319
320
result = pipe->create_blend_state(pipe, state);
321
322
trace_dump_ret(ptr, result);
323
324
trace_dump_call_end();
325
326
struct pipe_blend_state *blend = ralloc(tr_ctx, struct pipe_blend_state);
327
if (blend) {
328
memcpy(blend, state, sizeof(struct pipe_blend_state));
329
_mesa_hash_table_insert(&tr_ctx->blend_states, result, blend);
330
}
331
332
return result;
333
}
334
335
336
static void
337
trace_context_bind_blend_state(struct pipe_context *_pipe,
338
void *state)
339
{
340
struct trace_context *tr_ctx = trace_context(_pipe);
341
struct pipe_context *pipe = tr_ctx->pipe;
342
343
trace_dump_call_begin("pipe_context", "bind_blend_state");
344
345
trace_dump_arg(ptr, pipe);
346
if (state && trace_dump_is_triggered()) {
347
struct hash_entry *he = _mesa_hash_table_search(&tr_ctx->blend_states, state);
348
if (he)
349
trace_dump_arg(blend_state, he->data);
350
else
351
trace_dump_arg(blend_state, NULL);
352
} else
353
trace_dump_arg(ptr, state);
354
355
pipe->bind_blend_state(pipe, state);
356
357
trace_dump_call_end();
358
}
359
360
361
static void
362
trace_context_delete_blend_state(struct pipe_context *_pipe,
363
void *state)
364
{
365
struct trace_context *tr_ctx = trace_context(_pipe);
366
struct pipe_context *pipe = tr_ctx->pipe;
367
368
trace_dump_call_begin("pipe_context", "delete_blend_state");
369
370
trace_dump_arg(ptr, pipe);
371
trace_dump_arg(ptr, state);
372
373
pipe->delete_blend_state(pipe, state);
374
375
if (state) {
376
struct hash_entry *he = _mesa_hash_table_search(&tr_ctx->blend_states, state);
377
if (he) {
378
ralloc_free(he->data);
379
_mesa_hash_table_remove(&tr_ctx->blend_states, he);
380
}
381
}
382
383
trace_dump_call_end();
384
}
385
386
387
static void *
388
trace_context_create_sampler_state(struct pipe_context *_pipe,
389
const struct pipe_sampler_state *state)
390
{
391
struct trace_context *tr_ctx = trace_context(_pipe);
392
struct pipe_context *pipe = tr_ctx->pipe;
393
void * result;
394
395
trace_dump_call_begin("pipe_context", "create_sampler_state");
396
397
trace_dump_arg(ptr, pipe);
398
trace_dump_arg(sampler_state, state);
399
400
result = pipe->create_sampler_state(pipe, state);
401
402
trace_dump_ret(ptr, result);
403
404
trace_dump_call_end();
405
406
return result;
407
}
408
409
410
static void
411
trace_context_bind_sampler_states(struct pipe_context *_pipe,
412
enum pipe_shader_type shader,
413
unsigned start,
414
unsigned num_states,
415
void **states)
416
{
417
struct trace_context *tr_ctx = trace_context(_pipe);
418
struct pipe_context *pipe = tr_ctx->pipe;
419
420
/* remove this when we have pipe->bind_sampler_states(..., start, ...) */
421
assert(start == 0);
422
423
trace_dump_call_begin("pipe_context", "bind_sampler_states");
424
425
trace_dump_arg(ptr, pipe);
426
trace_dump_arg(uint, shader);
427
trace_dump_arg(uint, start);
428
trace_dump_arg(uint, num_states);
429
trace_dump_arg_array(ptr, states, num_states);
430
431
pipe->bind_sampler_states(pipe, shader, start, num_states, states);
432
433
trace_dump_call_end();
434
}
435
436
437
static void
438
trace_context_delete_sampler_state(struct pipe_context *_pipe,
439
void *state)
440
{
441
struct trace_context *tr_ctx = trace_context(_pipe);
442
struct pipe_context *pipe = tr_ctx->pipe;
443
444
trace_dump_call_begin("pipe_context", "delete_sampler_state");
445
446
trace_dump_arg(ptr, pipe);
447
trace_dump_arg(ptr, state);
448
449
pipe->delete_sampler_state(pipe, state);
450
451
trace_dump_call_end();
452
}
453
454
455
static void *
456
trace_context_create_rasterizer_state(struct pipe_context *_pipe,
457
const struct pipe_rasterizer_state *state)
458
{
459
struct trace_context *tr_ctx = trace_context(_pipe);
460
struct pipe_context *pipe = tr_ctx->pipe;
461
void * result;
462
463
trace_dump_call_begin("pipe_context", "create_rasterizer_state");
464
465
trace_dump_arg(ptr, pipe);
466
trace_dump_arg(rasterizer_state, state);
467
468
result = pipe->create_rasterizer_state(pipe, state);
469
470
trace_dump_ret(ptr, result);
471
472
trace_dump_call_end();
473
474
struct pipe_rasterizer_state *rasterizer = ralloc(tr_ctx, struct pipe_rasterizer_state);
475
if (rasterizer) {
476
memcpy(rasterizer, state, sizeof(struct pipe_rasterizer_state));
477
_mesa_hash_table_insert(&tr_ctx->rasterizer_states, result, rasterizer);
478
}
479
480
return result;
481
}
482
483
484
static void
485
trace_context_bind_rasterizer_state(struct pipe_context *_pipe,
486
void *state)
487
{
488
struct trace_context *tr_ctx = trace_context(_pipe);
489
struct pipe_context *pipe = tr_ctx->pipe;
490
491
trace_dump_call_begin("pipe_context", "bind_rasterizer_state");
492
493
trace_dump_arg(ptr, pipe);
494
if (state && trace_dump_is_triggered()) {
495
struct hash_entry *he = _mesa_hash_table_search(&tr_ctx->rasterizer_states, state);
496
if (he)
497
trace_dump_arg(rasterizer_state, he->data);
498
else
499
trace_dump_arg(rasterizer_state, NULL);
500
} else
501
trace_dump_arg(ptr, state);
502
503
pipe->bind_rasterizer_state(pipe, state);
504
505
trace_dump_call_end();
506
}
507
508
509
static void
510
trace_context_delete_rasterizer_state(struct pipe_context *_pipe,
511
void *state)
512
{
513
struct trace_context *tr_ctx = trace_context(_pipe);
514
struct pipe_context *pipe = tr_ctx->pipe;
515
516
trace_dump_call_begin("pipe_context", "delete_rasterizer_state");
517
518
trace_dump_arg(ptr, pipe);
519
trace_dump_arg(ptr, state);
520
521
pipe->delete_rasterizer_state(pipe, state);
522
523
trace_dump_call_end();
524
525
if (state) {
526
struct hash_entry *he = _mesa_hash_table_search(&tr_ctx->rasterizer_states, state);
527
if (he) {
528
ralloc_free(he->data);
529
_mesa_hash_table_remove(&tr_ctx->rasterizer_states, he);
530
}
531
}
532
}
533
534
535
static void *
536
trace_context_create_depth_stencil_alpha_state(struct pipe_context *_pipe,
537
const struct pipe_depth_stencil_alpha_state *state)
538
{
539
struct trace_context *tr_ctx = trace_context(_pipe);
540
struct pipe_context *pipe = tr_ctx->pipe;
541
void * result;
542
543
trace_dump_call_begin("pipe_context", "create_depth_stencil_alpha_state");
544
545
result = pipe->create_depth_stencil_alpha_state(pipe, state);
546
547
trace_dump_arg(ptr, pipe);
548
trace_dump_arg(depth_stencil_alpha_state, state);
549
550
trace_dump_ret(ptr, result);
551
552
trace_dump_call_end();
553
554
struct pipe_depth_stencil_alpha_state *depth_stencil_alpha = ralloc(tr_ctx, struct pipe_depth_stencil_alpha_state);
555
if (depth_stencil_alpha) {
556
memcpy(depth_stencil_alpha, state, sizeof(struct pipe_depth_stencil_alpha_state));
557
_mesa_hash_table_insert(&tr_ctx->depth_stencil_alpha_states, result, depth_stencil_alpha);
558
}
559
560
return result;
561
}
562
563
564
static void
565
trace_context_bind_depth_stencil_alpha_state(struct pipe_context *_pipe,
566
void *state)
567
{
568
struct trace_context *tr_ctx = trace_context(_pipe);
569
struct pipe_context *pipe = tr_ctx->pipe;
570
571
trace_dump_call_begin("pipe_context", "bind_depth_stencil_alpha_state");
572
573
trace_dump_arg(ptr, pipe);
574
if (state && trace_dump_is_triggered()) {
575
struct hash_entry *he = _mesa_hash_table_search(&tr_ctx->depth_stencil_alpha_states, state);
576
if (he)
577
trace_dump_arg(depth_stencil_alpha_state, he->data);
578
else
579
trace_dump_arg(depth_stencil_alpha_state, NULL);
580
} else
581
trace_dump_arg(ptr, state);
582
583
pipe->bind_depth_stencil_alpha_state(pipe, state);
584
585
trace_dump_call_end();
586
}
587
588
589
static void
590
trace_context_delete_depth_stencil_alpha_state(struct pipe_context *_pipe,
591
void *state)
592
{
593
struct trace_context *tr_ctx = trace_context(_pipe);
594
struct pipe_context *pipe = tr_ctx->pipe;
595
596
trace_dump_call_begin("pipe_context", "delete_depth_stencil_alpha_state");
597
598
trace_dump_arg(ptr, pipe);
599
trace_dump_arg(ptr, state);
600
601
pipe->delete_depth_stencil_alpha_state(pipe, state);
602
603
trace_dump_call_end();
604
605
if (state) {
606
struct hash_entry *he = _mesa_hash_table_search(&tr_ctx->depth_stencil_alpha_states, state);
607
if (he) {
608
ralloc_free(he->data);
609
_mesa_hash_table_remove(&tr_ctx->depth_stencil_alpha_states, he);
610
}
611
}
612
}
613
614
615
#define TRACE_SHADER_STATE(shader_type) \
616
static void * \
617
trace_context_create_##shader_type##_state(struct pipe_context *_pipe, \
618
const struct pipe_shader_state *state) \
619
{ \
620
struct trace_context *tr_ctx = trace_context(_pipe); \
621
struct pipe_context *pipe = tr_ctx->pipe; \
622
void * result; \
623
trace_dump_call_begin("pipe_context", "create_" #shader_type "_state"); \
624
trace_dump_arg(ptr, pipe); \
625
trace_dump_arg(shader_state, state); \
626
result = pipe->create_##shader_type##_state(pipe, state); \
627
trace_dump_ret(ptr, result); \
628
trace_dump_call_end(); \
629
return result; \
630
} \
631
\
632
static void \
633
trace_context_bind_##shader_type##_state(struct pipe_context *_pipe, \
634
void *state) \
635
{ \
636
struct trace_context *tr_ctx = trace_context(_pipe); \
637
struct pipe_context *pipe = tr_ctx->pipe; \
638
trace_dump_call_begin("pipe_context", "bind_" #shader_type "_state"); \
639
trace_dump_arg(ptr, pipe); \
640
trace_dump_arg(ptr, state); \
641
pipe->bind_##shader_type##_state(pipe, state); \
642
trace_dump_call_end(); \
643
} \
644
\
645
static void \
646
trace_context_delete_##shader_type##_state(struct pipe_context *_pipe, \
647
void *state) \
648
{ \
649
struct trace_context *tr_ctx = trace_context(_pipe); \
650
struct pipe_context *pipe = tr_ctx->pipe; \
651
trace_dump_call_begin("pipe_context", "delete_" #shader_type "_state"); \
652
trace_dump_arg(ptr, pipe); \
653
trace_dump_arg(ptr, state); \
654
pipe->delete_##shader_type##_state(pipe, state); \
655
trace_dump_call_end(); \
656
}
657
658
TRACE_SHADER_STATE(fs)
659
TRACE_SHADER_STATE(vs)
660
TRACE_SHADER_STATE(gs)
661
TRACE_SHADER_STATE(tcs)
662
TRACE_SHADER_STATE(tes)
663
664
#undef TRACE_SHADER_STATE
665
666
667
static inline void *
668
trace_context_create_compute_state(struct pipe_context *_pipe,
669
const struct pipe_compute_state *state)
670
{
671
struct trace_context *tr_ctx = trace_context(_pipe);
672
struct pipe_context *pipe = tr_ctx->pipe;
673
void * result;
674
675
trace_dump_call_begin("pipe_context", "create_compute_state");
676
trace_dump_arg(ptr, pipe);
677
trace_dump_arg(compute_state, state);
678
result = pipe->create_compute_state(pipe, state);
679
trace_dump_ret(ptr, result);
680
trace_dump_call_end();
681
return result;
682
}
683
684
static inline void
685
trace_context_bind_compute_state(struct pipe_context *_pipe,
686
void *state)
687
{
688
struct trace_context *tr_ctx = trace_context(_pipe);
689
struct pipe_context *pipe = tr_ctx->pipe;
690
691
trace_dump_call_begin("pipe_context", "bind_compute_state");
692
trace_dump_arg(ptr, pipe);
693
trace_dump_arg(ptr, state);
694
pipe->bind_compute_state(pipe, state);
695
trace_dump_call_end();
696
}
697
698
static inline void
699
trace_context_delete_compute_state(struct pipe_context *_pipe,
700
void *state)
701
{
702
struct trace_context *tr_ctx = trace_context(_pipe);
703
struct pipe_context *pipe = tr_ctx->pipe;
704
705
trace_dump_call_begin("pipe_context", "delete_compute_state");
706
trace_dump_arg(ptr, pipe);
707
trace_dump_arg(ptr, state);
708
pipe->delete_compute_state(pipe, state);
709
trace_dump_call_end();
710
}
711
712
static void *
713
trace_context_create_vertex_elements_state(struct pipe_context *_pipe,
714
unsigned num_elements,
715
const struct pipe_vertex_element *elements)
716
{
717
struct trace_context *tr_ctx = trace_context(_pipe);
718
struct pipe_context *pipe = tr_ctx->pipe;
719
void * result;
720
721
trace_dump_call_begin("pipe_context", "create_vertex_elements_state");
722
723
trace_dump_arg(ptr, pipe);
724
trace_dump_arg(uint, num_elements);
725
726
trace_dump_arg_begin("elements");
727
trace_dump_struct_array(vertex_element, elements, num_elements);
728
trace_dump_arg_end();
729
730
result = pipe->create_vertex_elements_state(pipe, num_elements, elements);
731
732
trace_dump_ret(ptr, result);
733
734
trace_dump_call_end();
735
736
return result;
737
}
738
739
740
static void
741
trace_context_bind_vertex_elements_state(struct pipe_context *_pipe,
742
void *state)
743
{
744
struct trace_context *tr_ctx = trace_context(_pipe);
745
struct pipe_context *pipe = tr_ctx->pipe;
746
747
trace_dump_call_begin("pipe_context", "bind_vertex_elements_state");
748
749
trace_dump_arg(ptr, pipe);
750
trace_dump_arg(ptr, state);
751
752
pipe->bind_vertex_elements_state(pipe, state);
753
754
trace_dump_call_end();
755
}
756
757
758
static void
759
trace_context_delete_vertex_elements_state(struct pipe_context *_pipe,
760
void *state)
761
{
762
struct trace_context *tr_ctx = trace_context(_pipe);
763
struct pipe_context *pipe = tr_ctx->pipe;
764
765
trace_dump_call_begin("pipe_context", "delete_vertex_elements_state");
766
767
trace_dump_arg(ptr, pipe);
768
trace_dump_arg(ptr, state);
769
770
pipe->delete_vertex_elements_state(pipe, state);
771
772
trace_dump_call_end();
773
}
774
775
776
static void
777
trace_context_set_blend_color(struct pipe_context *_pipe,
778
const struct pipe_blend_color *state)
779
{
780
struct trace_context *tr_ctx = trace_context(_pipe);
781
struct pipe_context *pipe = tr_ctx->pipe;
782
783
trace_dump_call_begin("pipe_context", "set_blend_color");
784
785
trace_dump_arg(ptr, pipe);
786
trace_dump_arg(blend_color, state);
787
788
pipe->set_blend_color(pipe, state);
789
790
trace_dump_call_end();
791
}
792
793
794
static void
795
trace_context_set_stencil_ref(struct pipe_context *_pipe,
796
const struct pipe_stencil_ref state)
797
{
798
struct trace_context *tr_ctx = trace_context(_pipe);
799
struct pipe_context *pipe = tr_ctx->pipe;
800
801
trace_dump_call_begin("pipe_context", "set_stencil_ref");
802
803
trace_dump_arg(ptr, pipe);
804
trace_dump_arg(stencil_ref, &state);
805
806
pipe->set_stencil_ref(pipe, state);
807
808
trace_dump_call_end();
809
}
810
811
812
static void
813
trace_context_set_clip_state(struct pipe_context *_pipe,
814
const struct pipe_clip_state *state)
815
{
816
struct trace_context *tr_ctx = trace_context(_pipe);
817
struct pipe_context *pipe = tr_ctx->pipe;
818
819
trace_dump_call_begin("pipe_context", "set_clip_state");
820
821
trace_dump_arg(ptr, pipe);
822
trace_dump_arg(clip_state, state);
823
824
pipe->set_clip_state(pipe, state);
825
826
trace_dump_call_end();
827
}
828
829
static void
830
trace_context_set_sample_mask(struct pipe_context *_pipe,
831
unsigned sample_mask)
832
{
833
struct trace_context *tr_ctx = trace_context(_pipe);
834
struct pipe_context *pipe = tr_ctx->pipe;
835
836
trace_dump_call_begin("pipe_context", "set_sample_mask");
837
838
trace_dump_arg(ptr, pipe);
839
trace_dump_arg(uint, sample_mask);
840
841
pipe->set_sample_mask(pipe, sample_mask);
842
843
trace_dump_call_end();
844
}
845
846
static void
847
trace_context_set_constant_buffer(struct pipe_context *_pipe,
848
enum pipe_shader_type shader, uint index,
849
bool take_ownership,
850
const struct pipe_constant_buffer *constant_buffer)
851
{
852
struct trace_context *tr_ctx = trace_context(_pipe);
853
struct pipe_context *pipe = tr_ctx->pipe;
854
855
trace_dump_call_begin("pipe_context", "set_constant_buffer");
856
857
trace_dump_arg(ptr, pipe);
858
trace_dump_arg(uint, shader);
859
trace_dump_arg(uint, index);
860
trace_dump_arg(bool, take_ownership);
861
trace_dump_arg(constant_buffer, constant_buffer);
862
863
pipe->set_constant_buffer(pipe, shader, index, take_ownership, constant_buffer);
864
865
trace_dump_call_end();
866
}
867
868
869
static void
870
trace_context_set_framebuffer_state(struct pipe_context *_pipe,
871
const struct pipe_framebuffer_state *state)
872
{
873
struct trace_context *tr_ctx = trace_context(_pipe);
874
struct pipe_context *pipe = tr_ctx->pipe;
875
unsigned i;
876
877
/* Unwrap the input state */
878
memcpy(&tr_ctx->unwrapped_state, state, sizeof(tr_ctx->unwrapped_state));
879
for (i = 0; i < state->nr_cbufs; ++i)
880
tr_ctx->unwrapped_state.cbufs[i] = trace_surface_unwrap(tr_ctx, state->cbufs[i]);
881
for (i = state->nr_cbufs; i < PIPE_MAX_COLOR_BUFS; ++i)
882
tr_ctx->unwrapped_state.cbufs[i] = NULL;
883
tr_ctx->unwrapped_state.zsbuf = trace_surface_unwrap(tr_ctx, state->zsbuf);
884
state = &tr_ctx->unwrapped_state;
885
886
dump_fb_state(tr_ctx, "set_framebuffer_state", trace_dump_is_triggered());
887
888
pipe->set_framebuffer_state(pipe, state);
889
}
890
891
static void
892
trace_context_set_inlinable_constants(struct pipe_context *_pipe, enum pipe_shader_type shader,
893
uint num_values, uint32_t *values)
894
{
895
struct trace_context *tr_ctx = trace_context(_pipe);
896
struct pipe_context *pipe = tr_ctx->pipe;
897
898
trace_dump_call_begin("pipe_context", "set_inlinable_constants");
899
900
trace_dump_arg(ptr, pipe);
901
trace_dump_arg(uint, shader);
902
trace_dump_arg(uint, num_values);
903
trace_dump_arg_array(uint, values, num_values);
904
905
pipe->set_inlinable_constants(pipe, shader, num_values, values);
906
907
trace_dump_call_end();
908
}
909
910
911
static void
912
trace_context_set_polygon_stipple(struct pipe_context *_pipe,
913
const struct pipe_poly_stipple *state)
914
{
915
struct trace_context *tr_ctx = trace_context(_pipe);
916
struct pipe_context *pipe = tr_ctx->pipe;
917
918
trace_dump_call_begin("pipe_context", "set_polygon_stipple");
919
920
trace_dump_arg(ptr, pipe);
921
trace_dump_arg(poly_stipple, state);
922
923
pipe->set_polygon_stipple(pipe, state);
924
925
trace_dump_call_end();
926
}
927
928
static void
929
trace_context_set_min_samples(struct pipe_context *_pipe,
930
unsigned min_samples)
931
{
932
struct trace_context *tr_ctx = trace_context(_pipe);
933
struct pipe_context *pipe = tr_ctx->pipe;
934
935
trace_dump_call_begin("pipe_context", "set_min_samples");
936
937
trace_dump_arg(ptr, pipe);
938
trace_dump_arg(uint, min_samples);
939
940
pipe->set_min_samples(pipe, min_samples);
941
942
trace_dump_call_end();
943
}
944
945
946
static void
947
trace_context_set_scissor_states(struct pipe_context *_pipe,
948
unsigned start_slot,
949
unsigned num_scissors,
950
const struct pipe_scissor_state *states)
951
{
952
struct trace_context *tr_ctx = trace_context(_pipe);
953
struct pipe_context *pipe = tr_ctx->pipe;
954
955
trace_dump_call_begin("pipe_context", "set_scissor_states");
956
957
trace_dump_arg(ptr, pipe);
958
trace_dump_arg(uint, start_slot);
959
trace_dump_arg(uint, num_scissors);
960
trace_dump_arg(scissor_state, states);
961
962
pipe->set_scissor_states(pipe, start_slot, num_scissors, states);
963
964
trace_dump_call_end();
965
}
966
967
968
static void
969
trace_context_set_viewport_states(struct pipe_context *_pipe,
970
unsigned start_slot,
971
unsigned num_viewports,
972
const struct pipe_viewport_state *states)
973
{
974
struct trace_context *tr_ctx = trace_context(_pipe);
975
struct pipe_context *pipe = tr_ctx->pipe;
976
977
trace_dump_call_begin("pipe_context", "set_viewport_states");
978
979
trace_dump_arg(ptr, pipe);
980
trace_dump_arg(uint, start_slot);
981
trace_dump_arg(uint, num_viewports);
982
trace_dump_arg(viewport_state, states);
983
984
pipe->set_viewport_states(pipe, start_slot, num_viewports, states);
985
986
trace_dump_call_end();
987
}
988
989
990
static struct pipe_sampler_view *
991
trace_context_create_sampler_view(struct pipe_context *_pipe,
992
struct pipe_resource *resource,
993
const struct pipe_sampler_view *templ)
994
{
995
struct trace_context *tr_ctx = trace_context(_pipe);
996
struct pipe_context *pipe = tr_ctx->pipe;
997
struct pipe_sampler_view *result;
998
struct trace_sampler_view *tr_view;
999
1000
trace_dump_call_begin("pipe_context", "create_sampler_view");
1001
1002
trace_dump_arg(ptr, pipe);
1003
trace_dump_arg(ptr, resource);
1004
1005
trace_dump_arg_begin("templ");
1006
trace_dump_sampler_view_template(templ, resource->target);
1007
trace_dump_arg_end();
1008
1009
result = pipe->create_sampler_view(pipe, resource, templ);
1010
1011
trace_dump_ret(ptr, result);
1012
1013
trace_dump_call_end();
1014
1015
/*
1016
* Wrap pipe_sampler_view
1017
*/
1018
tr_view = CALLOC_STRUCT(trace_sampler_view);
1019
tr_view->base = *templ;
1020
tr_view->base.reference.count = 1;
1021
tr_view->base.texture = NULL;
1022
pipe_resource_reference(&tr_view->base.texture, resource);
1023
tr_view->base.context = _pipe;
1024
tr_view->sampler_view = result;
1025
result = &tr_view->base;
1026
1027
return result;
1028
}
1029
1030
1031
static void
1032
trace_context_sampler_view_destroy(struct pipe_context *_pipe,
1033
struct pipe_sampler_view *_view)
1034
{
1035
struct trace_context *tr_ctx = trace_context(_pipe);
1036
struct trace_sampler_view *tr_view = trace_sampler_view(_view);
1037
struct pipe_context *pipe = tr_ctx->pipe;
1038
struct pipe_sampler_view *view = tr_view->sampler_view;
1039
1040
trace_dump_call_begin("pipe_context", "sampler_view_destroy");
1041
1042
trace_dump_arg(ptr, pipe);
1043
trace_dump_arg(ptr, view);
1044
1045
pipe_sampler_view_reference(&tr_view->sampler_view, NULL);
1046
1047
trace_dump_call_end();
1048
1049
pipe_resource_reference(&_view->texture, NULL);
1050
FREE(_view);
1051
}
1052
1053
/********************************************************************
1054
* surface
1055
*/
1056
1057
1058
static struct pipe_surface *
1059
trace_context_create_surface(struct pipe_context *_pipe,
1060
struct pipe_resource *resource,
1061
const struct pipe_surface *surf_tmpl)
1062
{
1063
struct trace_context *tr_ctx = trace_context(_pipe);
1064
struct pipe_context *pipe = tr_ctx->pipe;
1065
struct pipe_surface *result = NULL;
1066
1067
trace_dump_call_begin("pipe_context", "create_surface");
1068
1069
trace_dump_arg(ptr, pipe);
1070
trace_dump_arg(ptr, resource);
1071
1072
trace_dump_arg_begin("surf_tmpl");
1073
trace_dump_surface_template(surf_tmpl, resource->target);
1074
trace_dump_arg_end();
1075
1076
1077
result = pipe->create_surface(pipe, resource, surf_tmpl);
1078
1079
trace_dump_ret(ptr, result);
1080
1081
trace_dump_call_end();
1082
1083
result = trace_surf_create(tr_ctx, resource, result);
1084
1085
return result;
1086
}
1087
1088
1089
static void
1090
trace_context_surface_destroy(struct pipe_context *_pipe,
1091
struct pipe_surface *_surface)
1092
{
1093
struct trace_context *tr_ctx = trace_context(_pipe);
1094
struct pipe_context *pipe = tr_ctx->pipe;
1095
struct trace_surface *tr_surf = trace_surface(_surface);
1096
struct pipe_surface *surface = tr_surf->surface;
1097
1098
trace_dump_call_begin("pipe_context", "surface_destroy");
1099
1100
trace_dump_arg(ptr, pipe);
1101
trace_dump_arg(ptr, surface);
1102
1103
trace_dump_call_end();
1104
1105
trace_surf_destroy(tr_surf);
1106
}
1107
1108
1109
static void
1110
trace_context_set_sampler_views(struct pipe_context *_pipe,
1111
enum pipe_shader_type shader,
1112
unsigned start,
1113
unsigned num,
1114
unsigned unbind_num_trailing_slots,
1115
struct pipe_sampler_view **views)
1116
{
1117
struct trace_context *tr_ctx = trace_context(_pipe);
1118
struct trace_sampler_view *tr_view;
1119
struct pipe_context *pipe = tr_ctx->pipe;
1120
struct pipe_sampler_view *unwrapped_views[PIPE_MAX_SHADER_SAMPLER_VIEWS];
1121
unsigned i;
1122
1123
/* remove this when we have pipe->set_sampler_views(..., start, ...) */
1124
assert(start == 0);
1125
1126
for (i = 0; i < num; ++i) {
1127
tr_view = trace_sampler_view(views[i]);
1128
unwrapped_views[i] = tr_view ? tr_view->sampler_view : NULL;
1129
}
1130
views = unwrapped_views;
1131
1132
trace_dump_call_begin("pipe_context", "set_sampler_views");
1133
1134
trace_dump_arg(ptr, pipe);
1135
trace_dump_arg(uint, shader);
1136
trace_dump_arg(uint, start);
1137
trace_dump_arg(uint, num);
1138
trace_dump_arg(uint, unbind_num_trailing_slots);
1139
trace_dump_arg_array(ptr, views, num);
1140
1141
pipe->set_sampler_views(pipe, shader, start, num,
1142
unbind_num_trailing_slots, views);
1143
1144
trace_dump_call_end();
1145
}
1146
1147
1148
static void
1149
trace_context_set_vertex_buffers(struct pipe_context *_pipe,
1150
unsigned start_slot, unsigned num_buffers,
1151
unsigned unbind_num_trailing_slots,
1152
bool take_ownership,
1153
const struct pipe_vertex_buffer *buffers)
1154
{
1155
struct trace_context *tr_ctx = trace_context(_pipe);
1156
struct pipe_context *pipe = tr_ctx->pipe;
1157
1158
trace_dump_call_begin("pipe_context", "set_vertex_buffers");
1159
1160
trace_dump_arg(ptr, pipe);
1161
trace_dump_arg(uint, start_slot);
1162
trace_dump_arg(uint, num_buffers);
1163
trace_dump_arg(uint, unbind_num_trailing_slots);
1164
trace_dump_arg(bool, take_ownership);
1165
1166
trace_dump_arg_begin("buffers");
1167
trace_dump_struct_array(vertex_buffer, buffers, num_buffers);
1168
trace_dump_arg_end();
1169
1170
pipe->set_vertex_buffers(pipe, start_slot, num_buffers,
1171
unbind_num_trailing_slots, take_ownership,
1172
buffers);
1173
1174
trace_dump_call_end();
1175
}
1176
1177
1178
static struct pipe_stream_output_target *
1179
trace_context_create_stream_output_target(struct pipe_context *_pipe,
1180
struct pipe_resource *res,
1181
unsigned buffer_offset,
1182
unsigned buffer_size)
1183
{
1184
struct trace_context *tr_ctx = trace_context(_pipe);
1185
struct pipe_context *pipe = tr_ctx->pipe;
1186
struct pipe_stream_output_target *result;
1187
1188
trace_dump_call_begin("pipe_context", "create_stream_output_target");
1189
1190
trace_dump_arg(ptr, pipe);
1191
trace_dump_arg(ptr, res);
1192
trace_dump_arg(uint, buffer_offset);
1193
trace_dump_arg(uint, buffer_size);
1194
1195
result = pipe->create_stream_output_target(pipe,
1196
res, buffer_offset, buffer_size);
1197
1198
trace_dump_ret(ptr, result);
1199
1200
trace_dump_call_end();
1201
1202
return result;
1203
}
1204
1205
1206
static void
1207
trace_context_stream_output_target_destroy(
1208
struct pipe_context *_pipe,
1209
struct pipe_stream_output_target *target)
1210
{
1211
struct trace_context *tr_ctx = trace_context(_pipe);
1212
struct pipe_context *pipe = tr_ctx->pipe;
1213
1214
trace_dump_call_begin("pipe_context", "stream_output_target_destroy");
1215
1216
trace_dump_arg(ptr, pipe);
1217
trace_dump_arg(ptr, target);
1218
1219
pipe->stream_output_target_destroy(pipe, target);
1220
1221
trace_dump_call_end();
1222
}
1223
1224
1225
static void
1226
trace_context_set_stream_output_targets(struct pipe_context *_pipe,
1227
unsigned num_targets,
1228
struct pipe_stream_output_target **tgs,
1229
const unsigned *offsets)
1230
{
1231
struct trace_context *tr_ctx = trace_context(_pipe);
1232
struct pipe_context *pipe = tr_ctx->pipe;
1233
1234
trace_dump_call_begin("pipe_context", "set_stream_output_targets");
1235
1236
trace_dump_arg(ptr, pipe);
1237
trace_dump_arg(uint, num_targets);
1238
trace_dump_arg_array(ptr, tgs, num_targets);
1239
trace_dump_arg_array(uint, offsets, num_targets);
1240
1241
pipe->set_stream_output_targets(pipe, num_targets, tgs, offsets);
1242
1243
trace_dump_call_end();
1244
}
1245
1246
1247
static void
1248
trace_context_resource_copy_region(struct pipe_context *_pipe,
1249
struct pipe_resource *dst,
1250
unsigned dst_level,
1251
unsigned dstx, unsigned dsty, unsigned dstz,
1252
struct pipe_resource *src,
1253
unsigned src_level,
1254
const struct pipe_box *src_box)
1255
{
1256
struct trace_context *tr_ctx = trace_context(_pipe);
1257
struct pipe_context *pipe = tr_ctx->pipe;
1258
1259
trace_dump_call_begin("pipe_context", "resource_copy_region");
1260
1261
trace_dump_arg(ptr, pipe);
1262
trace_dump_arg(ptr, dst);
1263
trace_dump_arg(uint, dst_level);
1264
trace_dump_arg(uint, dstx);
1265
trace_dump_arg(uint, dsty);
1266
trace_dump_arg(uint, dstz);
1267
trace_dump_arg(ptr, src);
1268
trace_dump_arg(uint, src_level);
1269
trace_dump_arg(box, src_box);
1270
1271
pipe->resource_copy_region(pipe,
1272
dst, dst_level, dstx, dsty, dstz,
1273
src, src_level, src_box);
1274
1275
trace_dump_call_end();
1276
}
1277
1278
1279
static void
1280
trace_context_blit(struct pipe_context *_pipe,
1281
const struct pipe_blit_info *_info)
1282
{
1283
struct trace_context *tr_ctx = trace_context(_pipe);
1284
struct pipe_context *pipe = tr_ctx->pipe;
1285
struct pipe_blit_info info = *_info;
1286
1287
trace_dump_call_begin("pipe_context", "blit");
1288
1289
trace_dump_arg(ptr, pipe);
1290
trace_dump_arg(blit_info, _info);
1291
1292
pipe->blit(pipe, &info);
1293
1294
trace_dump_call_end();
1295
}
1296
1297
1298
static void
1299
trace_context_flush_resource(struct pipe_context *_pipe,
1300
struct pipe_resource *resource)
1301
{
1302
struct trace_context *tr_ctx = trace_context(_pipe);
1303
struct pipe_context *pipe = tr_ctx->pipe;
1304
1305
trace_dump_call_begin("pipe_context", "flush_resource");
1306
1307
trace_dump_arg(ptr, pipe);
1308
trace_dump_arg(ptr, resource);
1309
1310
pipe->flush_resource(pipe, resource);
1311
1312
trace_dump_call_end();
1313
}
1314
1315
1316
static void
1317
trace_context_clear(struct pipe_context *_pipe,
1318
unsigned buffers,
1319
const struct pipe_scissor_state *scissor_state,
1320
const union pipe_color_union *color,
1321
double depth,
1322
unsigned stencil)
1323
{
1324
struct trace_context *tr_ctx = trace_context(_pipe);
1325
struct pipe_context *pipe = tr_ctx->pipe;
1326
1327
trace_dump_call_begin("pipe_context", "clear");
1328
1329
trace_dump_arg(ptr, pipe);
1330
trace_dump_arg(uint, buffers);
1331
trace_dump_arg_begin("scissor_state");
1332
trace_dump_scissor_state(scissor_state);
1333
trace_dump_arg_end();
1334
trace_dump_arg_begin("color");
1335
if (color)
1336
trace_dump_array(float, color->f, 4);
1337
else
1338
trace_dump_null();
1339
trace_dump_arg_end();
1340
trace_dump_arg(float, depth);
1341
trace_dump_arg(uint, stencil);
1342
1343
pipe->clear(pipe, buffers, scissor_state, color, depth, stencil);
1344
1345
trace_dump_call_end();
1346
}
1347
1348
1349
static void
1350
trace_context_clear_render_target(struct pipe_context *_pipe,
1351
struct pipe_surface *dst,
1352
const union pipe_color_union *color,
1353
unsigned dstx, unsigned dsty,
1354
unsigned width, unsigned height,
1355
bool render_condition_enabled)
1356
{
1357
struct trace_context *tr_ctx = trace_context(_pipe);
1358
struct pipe_context *pipe = tr_ctx->pipe;
1359
1360
dst = trace_surface_unwrap(tr_ctx, dst);
1361
1362
trace_dump_call_begin("pipe_context", "clear_render_target");
1363
1364
trace_dump_arg(ptr, pipe);
1365
trace_dump_arg(ptr, dst);
1366
trace_dump_arg_array(float, color->f, 4);
1367
trace_dump_arg(uint, dstx);
1368
trace_dump_arg(uint, dsty);
1369
trace_dump_arg(uint, width);
1370
trace_dump_arg(uint, height);
1371
trace_dump_arg(bool, render_condition_enabled);
1372
1373
pipe->clear_render_target(pipe, dst, color, dstx, dsty, width, height,
1374
render_condition_enabled);
1375
1376
trace_dump_call_end();
1377
}
1378
1379
static void
1380
trace_context_clear_depth_stencil(struct pipe_context *_pipe,
1381
struct pipe_surface *dst,
1382
unsigned clear_flags,
1383
double depth,
1384
unsigned stencil,
1385
unsigned dstx, unsigned dsty,
1386
unsigned width, unsigned height,
1387
bool render_condition_enabled)
1388
{
1389
struct trace_context *tr_ctx = trace_context(_pipe);
1390
struct pipe_context *pipe = tr_ctx->pipe;
1391
1392
dst = trace_surface_unwrap(tr_ctx, dst);
1393
1394
trace_dump_call_begin("pipe_context", "clear_depth_stencil");
1395
1396
trace_dump_arg(ptr, pipe);
1397
trace_dump_arg(ptr, dst);
1398
trace_dump_arg(uint, clear_flags);
1399
trace_dump_arg(float, depth);
1400
trace_dump_arg(uint, stencil);
1401
trace_dump_arg(uint, dstx);
1402
trace_dump_arg(uint, dsty);
1403
trace_dump_arg(uint, width);
1404
trace_dump_arg(uint, height);
1405
trace_dump_arg(bool, render_condition_enabled);
1406
1407
pipe->clear_depth_stencil(pipe, dst, clear_flags, depth, stencil,
1408
dstx, dsty, width, height,
1409
render_condition_enabled);
1410
1411
trace_dump_call_end();
1412
}
1413
1414
static inline void
1415
trace_context_clear_buffer(struct pipe_context *_pipe,
1416
struct pipe_resource *res,
1417
unsigned offset,
1418
unsigned size,
1419
const void *clear_value,
1420
int clear_value_size)
1421
{
1422
struct trace_context *tr_ctx = trace_context(_pipe);
1423
struct pipe_context *pipe = tr_ctx->pipe;
1424
1425
1426
trace_dump_call_begin("pipe_context", "clear_buffer");
1427
1428
trace_dump_arg(ptr, pipe);
1429
trace_dump_arg(ptr, res);
1430
trace_dump_arg(uint, offset);
1431
trace_dump_arg(uint, size);
1432
trace_dump_arg(ptr, clear_value);
1433
trace_dump_arg(int, clear_value_size);
1434
1435
pipe->clear_buffer(pipe, res, offset, size, clear_value, clear_value_size);
1436
1437
trace_dump_call_end();
1438
}
1439
1440
static inline void
1441
trace_context_clear_texture(struct pipe_context *_pipe,
1442
struct pipe_resource *res,
1443
unsigned level,
1444
const struct pipe_box *box,
1445
const void *data)
1446
{
1447
struct trace_context *tr_ctx = trace_context(_pipe);
1448
struct pipe_context *pipe = tr_ctx->pipe;
1449
1450
1451
trace_dump_call_begin("pipe_context", "clear_texture");
1452
1453
trace_dump_arg(ptr, pipe);
1454
trace_dump_arg(ptr, res);
1455
trace_dump_arg(uint, level);
1456
trace_dump_arg_begin("box");
1457
trace_dump_box(box);
1458
trace_dump_arg_end();
1459
trace_dump_arg(ptr, data);
1460
1461
pipe->clear_texture(pipe, res, level, box, data);
1462
1463
trace_dump_call_end();
1464
}
1465
1466
static void
1467
trace_context_flush(struct pipe_context *_pipe,
1468
struct pipe_fence_handle **fence,
1469
unsigned flags)
1470
{
1471
struct trace_context *tr_ctx = trace_context(_pipe);
1472
struct pipe_context *pipe = tr_ctx->pipe;
1473
1474
trace_dump_call_begin("pipe_context", "flush");
1475
1476
trace_dump_arg(ptr, pipe);
1477
trace_dump_arg(uint, flags);
1478
1479
pipe->flush(pipe, fence, flags);
1480
1481
if (fence)
1482
trace_dump_ret(ptr, *fence);
1483
1484
trace_dump_call_end();
1485
1486
if (flags & PIPE_FLUSH_END_OF_FRAME) {
1487
trace_dump_check_trigger();
1488
tr_ctx->seen_fb_state = false;
1489
}
1490
}
1491
1492
1493
static void
1494
trace_context_create_fence_fd(struct pipe_context *_pipe,
1495
struct pipe_fence_handle **fence,
1496
int fd,
1497
enum pipe_fd_type type)
1498
{
1499
struct trace_context *tr_ctx = trace_context(_pipe);
1500
struct pipe_context *pipe = tr_ctx->pipe;
1501
1502
trace_dump_call_begin("pipe_context", "create_fence_fd");
1503
1504
trace_dump_arg(ptr, pipe);
1505
trace_dump_arg(int, fd);
1506
trace_dump_arg(uint, type);
1507
1508
pipe->create_fence_fd(pipe, fence, fd, type);
1509
1510
if (fence)
1511
trace_dump_ret(ptr, *fence);
1512
1513
trace_dump_call_end();
1514
}
1515
1516
1517
static void
1518
trace_context_fence_server_sync(struct pipe_context *_pipe,
1519
struct pipe_fence_handle *fence)
1520
{
1521
struct trace_context *tr_ctx = trace_context(_pipe);
1522
struct pipe_context *pipe = tr_ctx->pipe;
1523
1524
trace_dump_call_begin("pipe_context", "fence_server_sync");
1525
1526
trace_dump_arg(ptr, pipe);
1527
trace_dump_arg(ptr, fence);
1528
1529
pipe->fence_server_sync(pipe, fence);
1530
1531
trace_dump_call_end();
1532
}
1533
1534
1535
static inline bool
1536
trace_context_generate_mipmap(struct pipe_context *_pipe,
1537
struct pipe_resource *res,
1538
enum pipe_format format,
1539
unsigned base_level,
1540
unsigned last_level,
1541
unsigned first_layer,
1542
unsigned last_layer)
1543
{
1544
struct trace_context *tr_ctx = trace_context(_pipe);
1545
struct pipe_context *pipe = tr_ctx->pipe;
1546
bool ret;
1547
1548
trace_dump_call_begin("pipe_context", "generate_mipmap");
1549
1550
trace_dump_arg(ptr, pipe);
1551
trace_dump_arg(ptr, res);
1552
1553
trace_dump_arg(format, format);
1554
trace_dump_arg(uint, base_level);
1555
trace_dump_arg(uint, last_level);
1556
trace_dump_arg(uint, first_layer);
1557
trace_dump_arg(uint, last_layer);
1558
1559
ret = pipe->generate_mipmap(pipe, res, format, base_level, last_level,
1560
first_layer, last_layer);
1561
1562
trace_dump_ret(bool, ret);
1563
trace_dump_call_end();
1564
1565
return ret;
1566
}
1567
1568
1569
static void
1570
trace_context_destroy(struct pipe_context *_pipe)
1571
{
1572
struct trace_context *tr_ctx = trace_context(_pipe);
1573
struct pipe_context *pipe = tr_ctx->pipe;
1574
1575
trace_dump_call_begin("pipe_context", "destroy");
1576
trace_dump_arg(ptr, pipe);
1577
trace_dump_call_end();
1578
1579
pipe->destroy(pipe);
1580
1581
ralloc_free(tr_ctx);
1582
}
1583
1584
1585
/********************************************************************
1586
* transfer
1587
*/
1588
1589
1590
static void *
1591
trace_context_transfer_map(struct pipe_context *_context,
1592
struct pipe_resource *resource,
1593
unsigned level,
1594
unsigned usage,
1595
const struct pipe_box *box,
1596
struct pipe_transfer **transfer)
1597
{
1598
struct trace_context *tr_context = trace_context(_context);
1599
struct pipe_context *pipe = tr_context->pipe;
1600
struct pipe_transfer *xfer = NULL;
1601
void *map;
1602
1603
if (resource->target == PIPE_BUFFER)
1604
map = pipe->buffer_map(pipe, resource, level, usage, box, &xfer);
1605
else
1606
map = pipe->texture_map(pipe, resource, level, usage, box, &xfer);
1607
if (!map)
1608
return NULL;
1609
*transfer = trace_transfer_create(tr_context, resource, xfer);
1610
trace_dump_call_begin("pipe_context", resource->target == PIPE_BUFFER ? "buffer_map" : "texture_map");
1611
1612
trace_dump_arg(ptr, pipe);
1613
trace_dump_arg(ptr, resource);
1614
trace_dump_arg(uint, level);
1615
trace_dump_arg(uint, usage);
1616
trace_dump_arg(box, box);
1617
1618
trace_dump_arg(ptr, xfer);
1619
trace_dump_ret(ptr, map);
1620
1621
trace_dump_call_end();
1622
1623
if (map) {
1624
if (usage & PIPE_MAP_WRITE) {
1625
trace_transfer(*transfer)->map = map;
1626
}
1627
}
1628
1629
return *transfer ? map : NULL;
1630
}
1631
1632
static void
1633
trace_context_transfer_flush_region( struct pipe_context *_context,
1634
struct pipe_transfer *_transfer,
1635
const struct pipe_box *box)
1636
{
1637
struct trace_context *tr_context = trace_context(_context);
1638
struct trace_transfer *tr_transfer = trace_transfer(_transfer);
1639
struct pipe_context *pipe = tr_context->pipe;
1640
struct pipe_transfer *transfer = tr_transfer->transfer;
1641
1642
trace_dump_call_begin("pipe_context", "transfer_flush_region");
1643
1644
trace_dump_arg(ptr, pipe);
1645
trace_dump_arg(ptr, transfer);
1646
trace_dump_arg(box, box);
1647
1648
trace_dump_call_end();
1649
1650
pipe->transfer_flush_region(pipe, transfer, box);
1651
}
1652
1653
static void
1654
trace_context_transfer_unmap(struct pipe_context *_context,
1655
struct pipe_transfer *_transfer)
1656
{
1657
struct trace_context *tr_ctx = trace_context(_context);
1658
struct trace_transfer *tr_trans = trace_transfer(_transfer);
1659
struct pipe_context *context = tr_ctx->pipe;
1660
struct pipe_transfer *transfer = tr_trans->transfer;
1661
1662
1663
trace_dump_call_begin("pipe_context", "transfer_unmap");
1664
1665
trace_dump_arg(ptr, context);
1666
trace_dump_arg(ptr, transfer);
1667
1668
trace_dump_call_end();
1669
1670
if (tr_trans->map && !tr_ctx->threaded) {
1671
/*
1672
* Fake a texture/buffer_subdata
1673
*/
1674
1675
struct pipe_resource *resource = transfer->resource;
1676
unsigned usage = transfer->usage;
1677
const struct pipe_box *box = &transfer->box;
1678
unsigned stride = transfer->stride;
1679
unsigned layer_stride = transfer->layer_stride;
1680
1681
if (resource->target == PIPE_BUFFER) {
1682
unsigned offset = box->x;
1683
unsigned size = box->width;
1684
1685
trace_dump_call_begin("pipe_context", "buffer_subdata");
1686
1687
trace_dump_arg(ptr, context);
1688
trace_dump_arg(ptr, resource);
1689
trace_dump_arg(uint, usage);
1690
trace_dump_arg(uint, offset);
1691
trace_dump_arg(uint, size);
1692
1693
trace_dump_arg_begin("data");
1694
trace_dump_box_bytes(tr_trans->map,
1695
resource,
1696
box,
1697
stride,
1698
layer_stride);
1699
trace_dump_arg_end();
1700
1701
trace_dump_arg(uint, stride);
1702
trace_dump_arg(uint, layer_stride);
1703
1704
trace_dump_call_end();
1705
} else {
1706
unsigned level = transfer->level;
1707
1708
trace_dump_call_begin("pipe_context", "texture_subdata");
1709
1710
trace_dump_arg(ptr, context);
1711
trace_dump_arg(ptr, resource);
1712
trace_dump_arg(uint, level);
1713
trace_dump_arg(uint, usage);
1714
trace_dump_arg(box, box);
1715
1716
trace_dump_arg_begin("data");
1717
trace_dump_box_bytes(tr_trans->map,
1718
resource,
1719
box,
1720
stride,
1721
layer_stride);
1722
trace_dump_arg_end();
1723
1724
trace_dump_arg(uint, stride);
1725
trace_dump_arg(uint, layer_stride);
1726
1727
trace_dump_call_end();
1728
}
1729
1730
tr_trans->map = NULL;
1731
}
1732
1733
if (transfer->resource->target == PIPE_BUFFER)
1734
context->buffer_unmap(context, transfer);
1735
else
1736
context->texture_unmap(context, transfer);
1737
trace_transfer_destroy(tr_ctx, tr_trans);
1738
}
1739
1740
1741
static void
1742
trace_context_buffer_subdata(struct pipe_context *_context,
1743
struct pipe_resource *resource,
1744
unsigned usage, unsigned offset,
1745
unsigned size, const void *data)
1746
{
1747
struct trace_context *tr_context = trace_context(_context);
1748
struct pipe_context *context = tr_context->pipe;
1749
struct pipe_box box;
1750
1751
trace_dump_call_begin("pipe_context", "buffer_subdata");
1752
1753
trace_dump_arg(ptr, context);
1754
trace_dump_arg(ptr, resource);
1755
trace_dump_arg(uint, usage);
1756
trace_dump_arg(uint, offset);
1757
trace_dump_arg(uint, size);
1758
1759
trace_dump_arg_begin("data");
1760
u_box_1d(offset, size, &box);
1761
trace_dump_box_bytes(data, resource, &box, 0, 0);
1762
trace_dump_arg_end();
1763
1764
trace_dump_call_end();
1765
1766
context->buffer_subdata(context, resource, usage, offset, size, data);
1767
}
1768
1769
1770
static void
1771
trace_context_texture_subdata(struct pipe_context *_context,
1772
struct pipe_resource *resource,
1773
unsigned level,
1774
unsigned usage,
1775
const struct pipe_box *box,
1776
const void *data,
1777
unsigned stride,
1778
unsigned layer_stride)
1779
{
1780
struct trace_context *tr_context = trace_context(_context);
1781
struct pipe_context *context = tr_context->pipe;
1782
1783
trace_dump_call_begin("pipe_context", "texture_subdata");
1784
1785
trace_dump_arg(ptr, context);
1786
trace_dump_arg(ptr, resource);
1787
trace_dump_arg(uint, level);
1788
trace_dump_arg(uint, usage);
1789
trace_dump_arg(box, box);
1790
1791
trace_dump_arg_begin("data");
1792
trace_dump_box_bytes(data,
1793
resource,
1794
box,
1795
stride,
1796
layer_stride);
1797
trace_dump_arg_end();
1798
1799
trace_dump_arg(uint, stride);
1800
trace_dump_arg(uint, layer_stride);
1801
1802
trace_dump_call_end();
1803
1804
context->texture_subdata(context, resource, level, usage, box,
1805
data, stride, layer_stride);
1806
}
1807
1808
static void
1809
trace_context_invalidate_resource(struct pipe_context *_context,
1810
struct pipe_resource *resource)
1811
{
1812
struct trace_context *tr_context = trace_context(_context);
1813
struct pipe_context *context = tr_context->pipe;
1814
1815
trace_dump_call_begin("pipe_context", "invalidate_resource");
1816
1817
trace_dump_arg(ptr, context);
1818
trace_dump_arg(ptr, resource);
1819
1820
trace_dump_call_end();
1821
1822
context->invalidate_resource(context, resource);
1823
}
1824
1825
static void
1826
trace_context_set_context_param(struct pipe_context *_context,
1827
enum pipe_context_param param,
1828
unsigned value)
1829
{
1830
struct trace_context *tr_context = trace_context(_context);
1831
struct pipe_context *context = tr_context->pipe;
1832
1833
trace_dump_call_begin("pipe_context", "set_context_param");
1834
1835
trace_dump_arg(ptr, context);
1836
trace_dump_arg(uint, param);
1837
trace_dump_arg(uint, value);
1838
1839
trace_dump_call_end();
1840
1841
context->set_context_param(context, param, value);
1842
}
1843
1844
static void
1845
trace_context_set_debug_callback(struct pipe_context *_context, const struct pipe_debug_callback *cb)
1846
{
1847
struct trace_context *tr_context = trace_context(_context);
1848
struct pipe_context *context = tr_context->pipe;
1849
1850
trace_dump_call_begin("pipe_context", "set_debug_callback");
1851
1852
trace_dump_arg(ptr, context);
1853
1854
trace_dump_call_end();
1855
1856
context->set_debug_callback(context, cb);
1857
}
1858
1859
static void
1860
trace_context_render_condition(struct pipe_context *_context,
1861
struct pipe_query *query,
1862
bool condition,
1863
enum pipe_render_cond_flag mode)
1864
{
1865
struct trace_context *tr_context = trace_context(_context);
1866
struct pipe_context *context = tr_context->pipe;
1867
1868
query = trace_query_unwrap(query);
1869
1870
trace_dump_call_begin("pipe_context", "render_condition");
1871
1872
trace_dump_arg(ptr, context);
1873
trace_dump_arg(ptr, query);
1874
trace_dump_arg(bool, condition);
1875
trace_dump_arg(uint, mode);
1876
1877
trace_dump_call_end();
1878
1879
context->render_condition(context, query, condition, mode);
1880
}
1881
1882
1883
static void
1884
trace_context_texture_barrier(struct pipe_context *_context, unsigned flags)
1885
{
1886
struct trace_context *tr_context = trace_context(_context);
1887
struct pipe_context *context = tr_context->pipe;
1888
1889
trace_dump_call_begin("pipe_context", "texture_barrier");
1890
1891
trace_dump_arg(ptr, context);
1892
trace_dump_arg(uint, flags);
1893
1894
trace_dump_call_end();
1895
1896
context->texture_barrier(context, flags);
1897
}
1898
1899
1900
static void
1901
trace_context_memory_barrier(struct pipe_context *_context,
1902
unsigned flags)
1903
{
1904
struct trace_context *tr_context = trace_context(_context);
1905
struct pipe_context *context = tr_context->pipe;
1906
1907
trace_dump_call_begin("pipe_context", "memory_barrier");
1908
trace_dump_arg(ptr, context);
1909
trace_dump_arg(uint, flags);
1910
trace_dump_call_end();
1911
1912
context->memory_barrier(context, flags);
1913
}
1914
1915
1916
static bool
1917
trace_context_resource_commit(struct pipe_context *_context,
1918
struct pipe_resource *resource,
1919
unsigned level, struct pipe_box *box, bool commit)
1920
{
1921
struct trace_context *tr_context = trace_context(_context);
1922
struct pipe_context *context = tr_context->pipe;
1923
1924
trace_dump_call_begin("pipe_context", "resource_commit");
1925
trace_dump_arg(ptr, context);
1926
trace_dump_arg(ptr, resource);
1927
trace_dump_arg(uint, level);
1928
trace_dump_arg(box, box);
1929
trace_dump_arg(bool, commit);
1930
trace_dump_call_end();
1931
1932
return context->resource_commit(context, resource, level, box, commit);
1933
}
1934
1935
static void
1936
trace_context_set_tess_state(struct pipe_context *_context,
1937
const float default_outer_level[4],
1938
const float default_inner_level[2])
1939
{
1940
struct trace_context *tr_context = trace_context(_context);
1941
struct pipe_context *context = tr_context->pipe;
1942
1943
trace_dump_call_begin("pipe_context", "set_tess_state");
1944
trace_dump_arg(ptr, context);
1945
trace_dump_arg_array(float, default_outer_level, 4);
1946
trace_dump_arg_array(float, default_inner_level, 2);
1947
trace_dump_call_end();
1948
1949
context->set_tess_state(context, default_outer_level, default_inner_level);
1950
}
1951
1952
1953
static void trace_context_set_shader_buffers(struct pipe_context *_context,
1954
enum pipe_shader_type shader,
1955
unsigned start, unsigned nr,
1956
const struct pipe_shader_buffer *buffers,
1957
unsigned writable_bitmask)
1958
{
1959
struct trace_context *tr_context = trace_context(_context);
1960
struct pipe_context *context = tr_context->pipe;
1961
1962
trace_dump_call_begin("pipe_context", "set_shader_buffers");
1963
trace_dump_arg(ptr, context);
1964
trace_dump_arg(uint, shader);
1965
trace_dump_arg(uint, start);
1966
trace_dump_arg_begin("buffers");
1967
trace_dump_struct_array(shader_buffer, buffers, nr);
1968
trace_dump_arg_end();
1969
trace_dump_arg(uint, writable_bitmask);
1970
trace_dump_call_end();
1971
1972
context->set_shader_buffers(context, shader, start, nr, buffers,
1973
writable_bitmask);
1974
}
1975
1976
static void trace_context_set_shader_images(struct pipe_context *_context,
1977
enum pipe_shader_type shader,
1978
unsigned start, unsigned nr,
1979
unsigned unbind_num_trailing_slots,
1980
const struct pipe_image_view *images)
1981
{
1982
struct trace_context *tr_context = trace_context(_context);
1983
struct pipe_context *context = tr_context->pipe;
1984
1985
trace_dump_call_begin("pipe_context", "set_shader_images");
1986
trace_dump_arg(ptr, context);
1987
trace_dump_arg(uint, shader);
1988
trace_dump_arg(uint, start);
1989
trace_dump_arg_begin("images");
1990
trace_dump_struct_array(image_view, images, nr);
1991
trace_dump_arg_end();
1992
trace_dump_arg(uint, unbind_num_trailing_slots);
1993
trace_dump_call_end();
1994
1995
context->set_shader_images(context, shader, start, nr,
1996
unbind_num_trailing_slots, images);
1997
}
1998
1999
static void trace_context_launch_grid(struct pipe_context *_pipe,
2000
const struct pipe_grid_info *info)
2001
{
2002
struct trace_context *tr_ctx = trace_context(_pipe);
2003
struct pipe_context *pipe = tr_ctx->pipe;
2004
2005
trace_dump_call_begin("pipe_context", "launch_grid");
2006
2007
trace_dump_arg(ptr, pipe);
2008
trace_dump_arg(grid_info, info);
2009
2010
trace_dump_trace_flush();
2011
2012
pipe->launch_grid(pipe, info);
2013
2014
trace_dump_call_end();
2015
}
2016
2017
static uint64_t trace_context_create_texture_handle(struct pipe_context *_pipe,
2018
struct pipe_sampler_view *view,
2019
const struct pipe_sampler_state *state)
2020
{
2021
struct trace_context *tr_ctx = trace_context(_pipe);
2022
struct pipe_context *pipe = tr_ctx->pipe;
2023
uint64_t handle;
2024
2025
trace_dump_call_begin("pipe_context", "create_texture_handle");
2026
trace_dump_arg(ptr, pipe);
2027
trace_dump_arg(ptr, view);
2028
trace_dump_arg_begin("state");
2029
trace_dump_arg(sampler_state, state);
2030
trace_dump_arg_end();
2031
2032
handle = pipe->create_texture_handle(pipe, view, state);
2033
2034
trace_dump_ret(uint, handle);
2035
trace_dump_call_end();
2036
2037
return handle;
2038
}
2039
2040
static void trace_context_delete_texture_handle(struct pipe_context *_pipe,
2041
uint64_t handle)
2042
{
2043
struct trace_context *tr_ctx = trace_context(_pipe);
2044
struct pipe_context *pipe = tr_ctx->pipe;
2045
2046
trace_dump_call_begin("pipe_context", "delete_texture_handle");
2047
trace_dump_arg(ptr, pipe);
2048
trace_dump_arg(uint, handle);
2049
trace_dump_call_end();
2050
2051
pipe->delete_texture_handle(pipe, handle);
2052
}
2053
2054
static void trace_context_make_texture_handle_resident(struct pipe_context *_pipe,
2055
uint64_t handle,
2056
bool resident)
2057
{
2058
struct trace_context *tr_ctx = trace_context(_pipe);
2059
struct pipe_context *pipe = tr_ctx->pipe;
2060
2061
trace_dump_call_begin("pipe_context", "make_texture_handle_resident");
2062
trace_dump_arg(ptr, pipe);
2063
trace_dump_arg(uint, handle);
2064
trace_dump_arg(bool, resident);
2065
trace_dump_call_end();
2066
2067
pipe->make_texture_handle_resident(pipe, handle, resident);
2068
}
2069
2070
static uint64_t trace_context_create_image_handle(struct pipe_context *_pipe,
2071
const struct pipe_image_view *image)
2072
{
2073
struct trace_context *tr_ctx = trace_context(_pipe);
2074
struct pipe_context *pipe = tr_ctx->pipe;
2075
uint64_t handle;
2076
2077
trace_dump_call_begin("pipe_context", "create_image_handle");
2078
trace_dump_arg(ptr, pipe);
2079
trace_dump_arg_begin("image");
2080
trace_dump_image_view(image);
2081
trace_dump_arg_end();
2082
2083
handle = pipe->create_image_handle(pipe, image);
2084
2085
trace_dump_ret(uint, handle);
2086
trace_dump_call_end();
2087
2088
return handle;
2089
}
2090
2091
static void trace_context_delete_image_handle(struct pipe_context *_pipe,
2092
uint64_t handle)
2093
{
2094
struct trace_context *tr_ctx = trace_context(_pipe);
2095
struct pipe_context *pipe = tr_ctx->pipe;
2096
2097
trace_dump_call_begin("pipe_context", "delete_image_handle");
2098
trace_dump_arg(ptr, pipe);
2099
trace_dump_arg(uint, handle);
2100
trace_dump_call_end();
2101
2102
pipe->delete_image_handle(pipe, handle);
2103
}
2104
2105
static void trace_context_make_image_handle_resident(struct pipe_context *_pipe,
2106
uint64_t handle,
2107
unsigned access,
2108
bool resident)
2109
{
2110
struct trace_context *tr_ctx = trace_context(_pipe);
2111
struct pipe_context *pipe = tr_ctx->pipe;
2112
2113
trace_dump_call_begin("pipe_context", "make_image_handle_resident");
2114
trace_dump_arg(ptr, pipe);
2115
trace_dump_arg(uint, handle);
2116
trace_dump_arg(uint, access);
2117
trace_dump_arg(bool, resident);
2118
trace_dump_call_end();
2119
2120
pipe->make_image_handle_resident(pipe, handle, access, resident);
2121
}
2122
2123
struct pipe_context *
2124
trace_context_create(struct trace_screen *tr_scr,
2125
struct pipe_context *pipe)
2126
{
2127
struct trace_context *tr_ctx;
2128
2129
if (!pipe)
2130
goto error1;
2131
2132
if (!trace_enabled())
2133
goto error1;
2134
2135
tr_ctx = ralloc(NULL, struct trace_context);
2136
if (!tr_ctx)
2137
goto error1;
2138
2139
_mesa_hash_table_init(&tr_ctx->blend_states, tr_ctx, _mesa_hash_pointer, _mesa_key_pointer_equal);
2140
_mesa_hash_table_init(&tr_ctx->rasterizer_states, tr_ctx, _mesa_hash_pointer, _mesa_key_pointer_equal);
2141
_mesa_hash_table_init(&tr_ctx->depth_stencil_alpha_states, tr_ctx, _mesa_hash_pointer, _mesa_key_pointer_equal);
2142
2143
tr_ctx->base.priv = pipe->priv; /* expose wrapped priv data */
2144
tr_ctx->base.screen = &tr_scr->base;
2145
tr_ctx->base.stream_uploader = pipe->stream_uploader;
2146
tr_ctx->base.const_uploader = pipe->const_uploader;
2147
2148
tr_ctx->base.destroy = trace_context_destroy;
2149
2150
#define TR_CTX_INIT(_member) \
2151
tr_ctx->base . _member = pipe -> _member ? trace_context_ ## _member : NULL
2152
2153
TR_CTX_INIT(draw_vbo);
2154
TR_CTX_INIT(render_condition);
2155
TR_CTX_INIT(create_query);
2156
TR_CTX_INIT(destroy_query);
2157
TR_CTX_INIT(begin_query);
2158
TR_CTX_INIT(end_query);
2159
TR_CTX_INIT(get_query_result);
2160
TR_CTX_INIT(set_active_query_state);
2161
TR_CTX_INIT(create_blend_state);
2162
TR_CTX_INIT(bind_blend_state);
2163
TR_CTX_INIT(delete_blend_state);
2164
TR_CTX_INIT(create_sampler_state);
2165
TR_CTX_INIT(bind_sampler_states);
2166
TR_CTX_INIT(delete_sampler_state);
2167
TR_CTX_INIT(create_rasterizer_state);
2168
TR_CTX_INIT(bind_rasterizer_state);
2169
TR_CTX_INIT(delete_rasterizer_state);
2170
TR_CTX_INIT(create_depth_stencil_alpha_state);
2171
TR_CTX_INIT(bind_depth_stencil_alpha_state);
2172
TR_CTX_INIT(delete_depth_stencil_alpha_state);
2173
TR_CTX_INIT(create_fs_state);
2174
TR_CTX_INIT(bind_fs_state);
2175
TR_CTX_INIT(delete_fs_state);
2176
TR_CTX_INIT(create_vs_state);
2177
TR_CTX_INIT(bind_vs_state);
2178
TR_CTX_INIT(delete_vs_state);
2179
TR_CTX_INIT(create_gs_state);
2180
TR_CTX_INIT(bind_gs_state);
2181
TR_CTX_INIT(delete_gs_state);
2182
TR_CTX_INIT(create_tcs_state);
2183
TR_CTX_INIT(bind_tcs_state);
2184
TR_CTX_INIT(delete_tcs_state);
2185
TR_CTX_INIT(create_tes_state);
2186
TR_CTX_INIT(bind_tes_state);
2187
TR_CTX_INIT(delete_tes_state);
2188
TR_CTX_INIT(create_compute_state);
2189
TR_CTX_INIT(bind_compute_state);
2190
TR_CTX_INIT(delete_compute_state);
2191
TR_CTX_INIT(create_vertex_elements_state);
2192
TR_CTX_INIT(bind_vertex_elements_state);
2193
TR_CTX_INIT(delete_vertex_elements_state);
2194
TR_CTX_INIT(set_blend_color);
2195
TR_CTX_INIT(set_stencil_ref);
2196
TR_CTX_INIT(set_clip_state);
2197
TR_CTX_INIT(set_sample_mask);
2198
TR_CTX_INIT(set_constant_buffer);
2199
TR_CTX_INIT(set_framebuffer_state);
2200
TR_CTX_INIT(set_inlinable_constants);
2201
TR_CTX_INIT(set_polygon_stipple);
2202
TR_CTX_INIT(set_min_samples);
2203
TR_CTX_INIT(set_scissor_states);
2204
TR_CTX_INIT(set_viewport_states);
2205
TR_CTX_INIT(set_sampler_views);
2206
TR_CTX_INIT(create_sampler_view);
2207
TR_CTX_INIT(sampler_view_destroy);
2208
TR_CTX_INIT(create_surface);
2209
TR_CTX_INIT(surface_destroy);
2210
TR_CTX_INIT(set_vertex_buffers);
2211
TR_CTX_INIT(create_stream_output_target);
2212
TR_CTX_INIT(stream_output_target_destroy);
2213
TR_CTX_INIT(set_stream_output_targets);
2214
TR_CTX_INIT(resource_copy_region);
2215
TR_CTX_INIT(blit);
2216
TR_CTX_INIT(flush_resource);
2217
TR_CTX_INIT(clear);
2218
TR_CTX_INIT(clear_render_target);
2219
TR_CTX_INIT(clear_depth_stencil);
2220
TR_CTX_INIT(clear_texture);
2221
TR_CTX_INIT(clear_buffer);
2222
TR_CTX_INIT(flush);
2223
TR_CTX_INIT(create_fence_fd);
2224
TR_CTX_INIT(fence_server_sync);
2225
TR_CTX_INIT(generate_mipmap);
2226
TR_CTX_INIT(texture_barrier);
2227
TR_CTX_INIT(memory_barrier);
2228
TR_CTX_INIT(resource_commit);
2229
TR_CTX_INIT(set_tess_state);
2230
TR_CTX_INIT(set_shader_buffers);
2231
TR_CTX_INIT(launch_grid);
2232
TR_CTX_INIT(set_shader_images);
2233
TR_CTX_INIT(create_texture_handle);
2234
TR_CTX_INIT(delete_texture_handle);
2235
TR_CTX_INIT(make_texture_handle_resident);
2236
TR_CTX_INIT(create_image_handle);
2237
TR_CTX_INIT(delete_image_handle);
2238
TR_CTX_INIT(make_image_handle_resident);
2239
2240
tr_ctx->base.buffer_map = tr_ctx->base.texture_map = trace_context_transfer_map;
2241
tr_ctx->base.buffer_unmap = tr_ctx->base.texture_unmap = trace_context_transfer_unmap;
2242
TR_CTX_INIT(transfer_flush_region);
2243
TR_CTX_INIT(buffer_subdata);
2244
TR_CTX_INIT(texture_subdata);
2245
TR_CTX_INIT(invalidate_resource);
2246
TR_CTX_INIT(set_context_param);
2247
TR_CTX_INIT(set_debug_callback);
2248
2249
#undef TR_CTX_INIT
2250
2251
tr_ctx->pipe = pipe;
2252
2253
return &tr_ctx->base;
2254
2255
error1:
2256
return pipe;
2257
}
2258
2259
2260
/**
2261
* Sanity checker: check that the given context really is a
2262
* trace context (and not the wrapped driver's context).
2263
*/
2264
void
2265
trace_context_check(const struct pipe_context *pipe)
2266
{
2267
ASSERTED struct trace_context *tr_ctx = (struct trace_context *) pipe;
2268
assert(tr_ctx->base.destroy == trace_context_destroy);
2269
}
2270
2271
/**
2272
* Threaded context is not wrapped, and so it may call fence functions directly
2273
*/
2274
struct pipe_context *
2275
trace_get_possibly_threaded_context(struct pipe_context *pipe)
2276
{
2277
return pipe->destroy == trace_context_destroy ? ((struct trace_context*)pipe)->pipe : pipe;
2278
}
2279
2280