Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/gallium/auxiliary/driver_ddebug/dd_context.c
4561 views
1
/**************************************************************************
2
*
3
* Copyright 2015 Advanced Micro Devices, Inc.
4
* Copyright 2008 VMware, Inc.
5
* All Rights Reserved.
6
*
7
* Permission is hereby granted, free of charge, to any person obtaining a
8
* copy of this software and associated documentation files (the "Software"),
9
* to deal in the Software without restriction, including without limitation
10
* on the rights to use, copy, modify, merge, publish, distribute, sub
11
* license, and/or sell copies of the Software, and to permit persons to whom
12
* the Software is furnished to do so, subject to the following conditions:
13
*
14
* The above copyright notice and this permission notice (including the next
15
* paragraph) shall be included in all copies or substantial portions of the
16
* Software.
17
*
18
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21
* THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
22
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24
* USE OR OTHER DEALINGS IN THE SOFTWARE.
25
*
26
**************************************************************************/
27
28
#include "dd_pipe.h"
29
#include "tgsi/tgsi_parse.h"
30
#include "util/u_inlines.h"
31
#include "util/u_memory.h"
32
33
34
static void
35
safe_memcpy(void *dst, const void *src, size_t size)
36
{
37
if (src)
38
memcpy(dst, src, size);
39
else
40
memset(dst, 0, size);
41
}
42
43
44
/********************************************************************
45
* queries
46
*/
47
48
static struct pipe_query *
49
dd_context_create_query(struct pipe_context *_pipe, unsigned query_type,
50
unsigned index)
51
{
52
struct pipe_context *pipe = dd_context(_pipe)->pipe;
53
struct pipe_query *query;
54
55
query = pipe->create_query(pipe, query_type, index);
56
57
/* Wrap query object. */
58
if (query) {
59
struct dd_query *dd_query = CALLOC_STRUCT(dd_query);
60
if (dd_query) {
61
dd_query->type = query_type;
62
dd_query->query = query;
63
query = (struct pipe_query *)dd_query;
64
} else {
65
pipe->destroy_query(pipe, query);
66
query = NULL;
67
}
68
}
69
70
return query;
71
}
72
73
static struct pipe_query *
74
dd_context_create_batch_query(struct pipe_context *_pipe, unsigned num_queries,
75
unsigned *query_types)
76
{
77
struct pipe_context *pipe = dd_context(_pipe)->pipe;
78
struct pipe_query *query;
79
80
query = pipe->create_batch_query(pipe, num_queries, query_types);
81
82
/* Wrap query object. */
83
if (query) {
84
struct dd_query *dd_query = CALLOC_STRUCT(dd_query);
85
if (dd_query) {
86
/* no special handling for batch queries yet */
87
dd_query->type = query_types[0];
88
dd_query->query = query;
89
query = (struct pipe_query *)dd_query;
90
} else {
91
pipe->destroy_query(pipe, query);
92
query = NULL;
93
}
94
}
95
96
return query;
97
}
98
99
static void
100
dd_context_destroy_query(struct pipe_context *_pipe,
101
struct pipe_query *query)
102
{
103
struct pipe_context *pipe = dd_context(_pipe)->pipe;
104
105
pipe->destroy_query(pipe, dd_query_unwrap(query));
106
FREE(query);
107
}
108
109
static bool
110
dd_context_begin_query(struct pipe_context *_pipe, struct pipe_query *query)
111
{
112
struct dd_context *dctx = dd_context(_pipe);
113
struct pipe_context *pipe = dctx->pipe;
114
115
return pipe->begin_query(pipe, dd_query_unwrap(query));
116
}
117
118
static bool
119
dd_context_end_query(struct pipe_context *_pipe, struct pipe_query *query)
120
{
121
struct dd_context *dctx = dd_context(_pipe);
122
struct pipe_context *pipe = dctx->pipe;
123
124
return pipe->end_query(pipe, dd_query_unwrap(query));
125
}
126
127
static bool
128
dd_context_get_query_result(struct pipe_context *_pipe,
129
struct pipe_query *query, bool wait,
130
union pipe_query_result *result)
131
{
132
struct pipe_context *pipe = dd_context(_pipe)->pipe;
133
134
return pipe->get_query_result(pipe, dd_query_unwrap(query), wait, result);
135
}
136
137
static void
138
dd_context_set_active_query_state(struct pipe_context *_pipe, bool enable)
139
{
140
struct pipe_context *pipe = dd_context(_pipe)->pipe;
141
142
pipe->set_active_query_state(pipe, enable);
143
}
144
145
static void
146
dd_context_render_condition(struct pipe_context *_pipe,
147
struct pipe_query *query, bool condition,
148
enum pipe_render_cond_flag mode)
149
{
150
struct dd_context *dctx = dd_context(_pipe);
151
struct pipe_context *pipe = dctx->pipe;
152
struct dd_draw_state *dstate = &dctx->draw_state;
153
154
pipe->render_condition(pipe, dd_query_unwrap(query), condition, mode);
155
dstate->render_cond.query = dd_query(query);
156
dstate->render_cond.condition = condition;
157
dstate->render_cond.mode = mode;
158
}
159
160
161
/********************************************************************
162
* constant (immutable) non-shader states
163
*/
164
165
#define DD_CSO_CREATE(name, shortname) \
166
static void * \
167
dd_context_create_##name##_state(struct pipe_context *_pipe, \
168
const struct pipe_##name##_state *state) \
169
{ \
170
struct pipe_context *pipe = dd_context(_pipe)->pipe; \
171
struct dd_state *hstate = CALLOC_STRUCT(dd_state); \
172
\
173
if (!hstate) \
174
return NULL; \
175
hstate->cso = pipe->create_##name##_state(pipe, state); \
176
hstate->state.shortname = *state; \
177
return hstate; \
178
}
179
180
#define DD_CSO_BIND(name, shortname) \
181
static void \
182
dd_context_bind_##name##_state(struct pipe_context *_pipe, void *state) \
183
{ \
184
struct dd_context *dctx = dd_context(_pipe); \
185
struct pipe_context *pipe = dctx->pipe; \
186
struct dd_state *hstate = state; \
187
\
188
dctx->draw_state.shortname = hstate; \
189
pipe->bind_##name##_state(pipe, hstate ? hstate->cso : NULL); \
190
}
191
192
#define DD_CSO_DELETE(name) \
193
static void \
194
dd_context_delete_##name##_state(struct pipe_context *_pipe, void *state) \
195
{ \
196
struct dd_context *dctx = dd_context(_pipe); \
197
struct pipe_context *pipe = dctx->pipe; \
198
struct dd_state *hstate = state; \
199
\
200
pipe->delete_##name##_state(pipe, hstate->cso); \
201
FREE(hstate); \
202
}
203
204
#define DD_CSO_WHOLE(name, shortname) \
205
DD_CSO_CREATE(name, shortname) \
206
DD_CSO_BIND(name, shortname) \
207
DD_CSO_DELETE(name)
208
209
DD_CSO_WHOLE(blend, blend)
210
DD_CSO_WHOLE(rasterizer, rs)
211
DD_CSO_WHOLE(depth_stencil_alpha, dsa)
212
213
DD_CSO_CREATE(sampler, sampler)
214
DD_CSO_DELETE(sampler)
215
216
static void
217
dd_context_bind_sampler_states(struct pipe_context *_pipe,
218
enum pipe_shader_type shader,
219
unsigned start, unsigned count, void **states)
220
{
221
struct dd_context *dctx = dd_context(_pipe);
222
struct pipe_context *pipe = dctx->pipe;
223
224
memcpy(&dctx->draw_state.sampler_states[shader][start], states,
225
sizeof(void*) * count);
226
227
if (states) {
228
void *samp[PIPE_MAX_SAMPLERS];
229
int i;
230
231
for (i = 0; i < count; i++) {
232
struct dd_state *s = states[i];
233
samp[i] = s ? s->cso : NULL;
234
}
235
236
pipe->bind_sampler_states(pipe, shader, start, count, samp);
237
}
238
else
239
pipe->bind_sampler_states(pipe, shader, start, count, NULL);
240
}
241
242
static void *
243
dd_context_create_vertex_elements_state(struct pipe_context *_pipe,
244
unsigned num_elems,
245
const struct pipe_vertex_element *elems)
246
{
247
struct pipe_context *pipe = dd_context(_pipe)->pipe;
248
struct dd_state *hstate = CALLOC_STRUCT(dd_state);
249
250
if (!hstate)
251
return NULL;
252
hstate->cso = pipe->create_vertex_elements_state(pipe, num_elems, elems);
253
memcpy(hstate->state.velems.velems, elems, sizeof(elems[0]) * num_elems);
254
hstate->state.velems.count = num_elems;
255
return hstate;
256
}
257
258
DD_CSO_BIND(vertex_elements, velems)
259
DD_CSO_DELETE(vertex_elements)
260
261
262
/********************************************************************
263
* shaders
264
*/
265
266
#define DD_SHADER_NOCREATE(NAME, name) \
267
static void \
268
dd_context_bind_##name##_state(struct pipe_context *_pipe, void *state) \
269
{ \
270
struct dd_context *dctx = dd_context(_pipe); \
271
struct pipe_context *pipe = dctx->pipe; \
272
struct dd_state *hstate = state; \
273
\
274
dctx->draw_state.shaders[PIPE_SHADER_##NAME] = hstate; \
275
pipe->bind_##name##_state(pipe, hstate ? hstate->cso : NULL); \
276
} \
277
\
278
static void \
279
dd_context_delete_##name##_state(struct pipe_context *_pipe, void *state) \
280
{ \
281
struct dd_context *dctx = dd_context(_pipe); \
282
struct pipe_context *pipe = dctx->pipe; \
283
struct dd_state *hstate = state; \
284
\
285
pipe->delete_##name##_state(pipe, hstate->cso); \
286
if (hstate->state.shader.type == PIPE_SHADER_IR_TGSI) \
287
tgsi_free_tokens(hstate->state.shader.tokens); \
288
FREE(hstate); \
289
}
290
291
#define DD_SHADER(NAME, name) \
292
static void * \
293
dd_context_create_##name##_state(struct pipe_context *_pipe, \
294
const struct pipe_shader_state *state) \
295
{ \
296
struct pipe_context *pipe = dd_context(_pipe)->pipe; \
297
struct dd_state *hstate = CALLOC_STRUCT(dd_state); \
298
\
299
if (!hstate) \
300
return NULL; \
301
hstate->cso = pipe->create_##name##_state(pipe, state); \
302
hstate->state.shader = *state; \
303
if (hstate->state.shader.type == PIPE_SHADER_IR_TGSI) \
304
hstate->state.shader.tokens = tgsi_dup_tokens(state->tokens); \
305
return hstate; \
306
} \
307
\
308
DD_SHADER_NOCREATE(NAME, name)
309
310
DD_SHADER(FRAGMENT, fs)
311
DD_SHADER(VERTEX, vs)
312
DD_SHADER(GEOMETRY, gs)
313
DD_SHADER(TESS_CTRL, tcs)
314
DD_SHADER(TESS_EVAL, tes)
315
316
static void * \
317
dd_context_create_compute_state(struct pipe_context *_pipe,
318
const struct pipe_compute_state *state)
319
{
320
struct pipe_context *pipe = dd_context(_pipe)->pipe;
321
struct dd_state *hstate = CALLOC_STRUCT(dd_state);
322
323
if (!hstate)
324
return NULL;
325
hstate->cso = pipe->create_compute_state(pipe, state);
326
327
hstate->state.shader.type = state->ir_type;
328
329
if (state->ir_type == PIPE_SHADER_IR_TGSI)
330
hstate->state.shader.tokens = tgsi_dup_tokens(state->prog);
331
332
return hstate;
333
}
334
335
DD_SHADER_NOCREATE(COMPUTE, compute)
336
337
/********************************************************************
338
* immediate states
339
*/
340
341
#define DD_IMM_STATE(name, type, deref, ref) \
342
static void \
343
dd_context_set_##name(struct pipe_context *_pipe, type deref) \
344
{ \
345
struct dd_context *dctx = dd_context(_pipe); \
346
struct pipe_context *pipe = dctx->pipe; \
347
\
348
dctx->draw_state.name = deref; \
349
pipe->set_##name(pipe, ref); \
350
}
351
352
DD_IMM_STATE(blend_color, const struct pipe_blend_color, *state, state)
353
DD_IMM_STATE(stencil_ref, const struct pipe_stencil_ref, state, state)
354
DD_IMM_STATE(clip_state, const struct pipe_clip_state, *state, state)
355
DD_IMM_STATE(sample_mask, unsigned, sample_mask, sample_mask)
356
DD_IMM_STATE(min_samples, unsigned, min_samples, min_samples)
357
DD_IMM_STATE(framebuffer_state, const struct pipe_framebuffer_state, *state, state)
358
DD_IMM_STATE(polygon_stipple, const struct pipe_poly_stipple, *state, state)
359
360
static void
361
dd_context_set_constant_buffer(struct pipe_context *_pipe,
362
enum pipe_shader_type shader, uint index,
363
bool take_ownership,
364
const struct pipe_constant_buffer *constant_buffer)
365
{
366
struct dd_context *dctx = dd_context(_pipe);
367
struct pipe_context *pipe = dctx->pipe;
368
369
safe_memcpy(&dctx->draw_state.constant_buffers[shader][index],
370
constant_buffer, sizeof(*constant_buffer));
371
pipe->set_constant_buffer(pipe, shader, index, take_ownership, constant_buffer);
372
}
373
374
static void
375
dd_context_set_scissor_states(struct pipe_context *_pipe,
376
unsigned start_slot, unsigned num_scissors,
377
const struct pipe_scissor_state *states)
378
{
379
struct dd_context *dctx = dd_context(_pipe);
380
struct pipe_context *pipe = dctx->pipe;
381
382
safe_memcpy(&dctx->draw_state.scissors[start_slot], states,
383
sizeof(*states) * num_scissors);
384
pipe->set_scissor_states(pipe, start_slot, num_scissors, states);
385
}
386
387
static void
388
dd_context_set_viewport_states(struct pipe_context *_pipe,
389
unsigned start_slot, unsigned num_viewports,
390
const struct pipe_viewport_state *states)
391
{
392
struct dd_context *dctx = dd_context(_pipe);
393
struct pipe_context *pipe = dctx->pipe;
394
395
safe_memcpy(&dctx->draw_state.viewports[start_slot], states,
396
sizeof(*states) * num_viewports);
397
pipe->set_viewport_states(pipe, start_slot, num_viewports, states);
398
}
399
400
static void dd_context_set_tess_state(struct pipe_context *_pipe,
401
const float default_outer_level[4],
402
const float default_inner_level[2])
403
{
404
struct dd_context *dctx = dd_context(_pipe);
405
struct pipe_context *pipe = dctx->pipe;
406
407
memcpy(dctx->draw_state.tess_default_levels, default_outer_level,
408
sizeof(float) * 4);
409
memcpy(dctx->draw_state.tess_default_levels+4, default_inner_level,
410
sizeof(float) * 2);
411
pipe->set_tess_state(pipe, default_outer_level, default_inner_level);
412
}
413
414
static void dd_context_set_window_rectangles(struct pipe_context *_pipe,
415
bool include,
416
unsigned num_rectangles,
417
const struct pipe_scissor_state *rects)
418
{
419
struct dd_context *dctx = dd_context(_pipe);
420
struct pipe_context *pipe = dctx->pipe;
421
422
pipe->set_window_rectangles(pipe, include, num_rectangles, rects);
423
}
424
425
426
/********************************************************************
427
* views
428
*/
429
430
static struct pipe_surface *
431
dd_context_create_surface(struct pipe_context *_pipe,
432
struct pipe_resource *resource,
433
const struct pipe_surface *surf_tmpl)
434
{
435
struct pipe_context *pipe = dd_context(_pipe)->pipe;
436
struct pipe_surface *view =
437
pipe->create_surface(pipe, resource, surf_tmpl);
438
439
if (!view)
440
return NULL;
441
view->context = _pipe;
442
return view;
443
}
444
445
static void
446
dd_context_surface_destroy(struct pipe_context *_pipe,
447
struct pipe_surface *surf)
448
{
449
struct pipe_context *pipe = dd_context(_pipe)->pipe;
450
451
pipe->surface_destroy(pipe, surf);
452
}
453
454
static struct pipe_sampler_view *
455
dd_context_create_sampler_view(struct pipe_context *_pipe,
456
struct pipe_resource *resource,
457
const struct pipe_sampler_view *templ)
458
{
459
struct pipe_context *pipe = dd_context(_pipe)->pipe;
460
struct pipe_sampler_view *view =
461
pipe->create_sampler_view(pipe, resource, templ);
462
463
if (!view)
464
return NULL;
465
view->context = _pipe;
466
return view;
467
}
468
469
static void
470
dd_context_sampler_view_destroy(struct pipe_context *_pipe,
471
struct pipe_sampler_view *view)
472
{
473
struct pipe_context *pipe = dd_context(_pipe)->pipe;
474
475
pipe->sampler_view_destroy(pipe, view);
476
}
477
478
static struct pipe_stream_output_target *
479
dd_context_create_stream_output_target(struct pipe_context *_pipe,
480
struct pipe_resource *res,
481
unsigned buffer_offset,
482
unsigned buffer_size)
483
{
484
struct pipe_context *pipe = dd_context(_pipe)->pipe;
485
struct pipe_stream_output_target *view =
486
pipe->create_stream_output_target(pipe, res, buffer_offset,
487
buffer_size);
488
489
if (!view)
490
return NULL;
491
view->context = _pipe;
492
return view;
493
}
494
495
static void
496
dd_context_stream_output_target_destroy(struct pipe_context *_pipe,
497
struct pipe_stream_output_target *target)
498
{
499
struct pipe_context *pipe = dd_context(_pipe)->pipe;
500
501
pipe->stream_output_target_destroy(pipe, target);
502
}
503
504
505
/********************************************************************
506
* set states
507
*/
508
509
static void
510
dd_context_set_sampler_views(struct pipe_context *_pipe,
511
enum pipe_shader_type shader,
512
unsigned start, unsigned num,
513
unsigned unbind_num_trailing_slots,
514
struct pipe_sampler_view **views)
515
{
516
struct dd_context *dctx = dd_context(_pipe);
517
struct pipe_context *pipe = dctx->pipe;
518
519
safe_memcpy(&dctx->draw_state.sampler_views[shader][start], views,
520
sizeof(views[0]) * num);
521
safe_memcpy(&dctx->draw_state.sampler_views[shader][start + num], views,
522
sizeof(views[0]) * unbind_num_trailing_slots);
523
pipe->set_sampler_views(pipe, shader, start, num,
524
unbind_num_trailing_slots, views);
525
}
526
527
static void
528
dd_context_set_shader_images(struct pipe_context *_pipe,
529
enum pipe_shader_type shader,
530
unsigned start, unsigned num,
531
unsigned unbind_num_trailing_slots,
532
const struct pipe_image_view *views)
533
{
534
struct dd_context *dctx = dd_context(_pipe);
535
struct pipe_context *pipe = dctx->pipe;
536
537
safe_memcpy(&dctx->draw_state.shader_images[shader][start], views,
538
sizeof(views[0]) * num);
539
safe_memcpy(&dctx->draw_state.shader_images[shader][start + num], NULL,
540
sizeof(views[0]) * unbind_num_trailing_slots);
541
pipe->set_shader_images(pipe, shader, start, num,
542
unbind_num_trailing_slots, views);
543
}
544
545
static void
546
dd_context_set_shader_buffers(struct pipe_context *_pipe,
547
enum pipe_shader_type shader,
548
unsigned start, unsigned num_buffers,
549
const struct pipe_shader_buffer *buffers,
550
unsigned writable_bitmask)
551
{
552
struct dd_context *dctx = dd_context(_pipe);
553
struct pipe_context *pipe = dctx->pipe;
554
555
safe_memcpy(&dctx->draw_state.shader_buffers[shader][start], buffers,
556
sizeof(buffers[0]) * num_buffers);
557
pipe->set_shader_buffers(pipe, shader, start, num_buffers, buffers,
558
writable_bitmask);
559
}
560
561
static void
562
dd_context_set_vertex_buffers(struct pipe_context *_pipe,
563
unsigned start, unsigned num_buffers,
564
unsigned unbind_num_trailing_slots,
565
bool take_ownership,
566
const struct pipe_vertex_buffer *buffers)
567
{
568
struct dd_context *dctx = dd_context(_pipe);
569
struct pipe_context *pipe = dctx->pipe;
570
571
safe_memcpy(&dctx->draw_state.vertex_buffers[start], buffers,
572
sizeof(buffers[0]) * num_buffers);
573
safe_memcpy(&dctx->draw_state.vertex_buffers[start + num_buffers], NULL,
574
sizeof(buffers[0]) * unbind_num_trailing_slots);
575
pipe->set_vertex_buffers(pipe, start, num_buffers,
576
unbind_num_trailing_slots, take_ownership,
577
buffers);
578
}
579
580
static void
581
dd_context_set_stream_output_targets(struct pipe_context *_pipe,
582
unsigned num_targets,
583
struct pipe_stream_output_target **tgs,
584
const unsigned *offsets)
585
{
586
struct dd_context *dctx = dd_context(_pipe);
587
struct pipe_context *pipe = dctx->pipe;
588
struct dd_draw_state *dstate = &dctx->draw_state;
589
590
dstate->num_so_targets = num_targets;
591
safe_memcpy(dstate->so_targets, tgs, sizeof(*tgs) * num_targets);
592
safe_memcpy(dstate->so_offsets, offsets, sizeof(*offsets) * num_targets);
593
pipe->set_stream_output_targets(pipe, num_targets, tgs, offsets);
594
}
595
596
597
static void
598
dd_context_fence_server_sync(struct pipe_context *_pipe,
599
struct pipe_fence_handle *fence)
600
{
601
struct dd_context *dctx = dd_context(_pipe);
602
struct pipe_context *pipe = dctx->pipe;
603
604
pipe->fence_server_sync(pipe, fence);
605
}
606
607
608
static void
609
dd_context_create_fence_fd(struct pipe_context *_pipe,
610
struct pipe_fence_handle **fence,
611
int fd,
612
enum pipe_fd_type type)
613
{
614
struct dd_context *dctx = dd_context(_pipe);
615
struct pipe_context *pipe = dctx->pipe;
616
617
pipe->create_fence_fd(pipe, fence, fd, type);
618
}
619
620
621
void
622
dd_thread_join(struct dd_context *dctx)
623
{
624
mtx_lock(&dctx->mutex);
625
dctx->kill_thread = true;
626
cnd_signal(&dctx->cond);
627
mtx_unlock(&dctx->mutex);
628
thrd_join(dctx->thread, NULL);
629
}
630
631
static void
632
dd_context_destroy(struct pipe_context *_pipe)
633
{
634
struct dd_context *dctx = dd_context(_pipe);
635
struct pipe_context *pipe = dctx->pipe;
636
637
dd_thread_join(dctx);
638
mtx_destroy(&dctx->mutex);
639
cnd_destroy(&dctx->cond);
640
641
assert(list_is_empty(&dctx->records));
642
643
if (pipe->set_log_context) {
644
pipe->set_log_context(pipe, NULL);
645
646
if (dd_screen(dctx->base.screen)->dump_mode == DD_DUMP_ALL_CALLS) {
647
FILE *f = dd_get_file_stream(dd_screen(dctx->base.screen), 0);
648
if (f) {
649
fprintf(f, "Remainder of driver log:\n\n");
650
}
651
652
u_log_new_page_print(&dctx->log, f);
653
fclose(f);
654
}
655
}
656
u_log_context_destroy(&dctx->log);
657
658
pipe->destroy(pipe);
659
FREE(dctx);
660
}
661
662
663
/********************************************************************
664
* miscellaneous
665
*/
666
667
static void
668
dd_context_texture_barrier(struct pipe_context *_pipe, unsigned flags)
669
{
670
struct pipe_context *pipe = dd_context(_pipe)->pipe;
671
672
pipe->texture_barrier(pipe, flags);
673
}
674
675
static void
676
dd_context_memory_barrier(struct pipe_context *_pipe, unsigned flags)
677
{
678
struct pipe_context *pipe = dd_context(_pipe)->pipe;
679
680
pipe->memory_barrier(pipe, flags);
681
}
682
683
static bool
684
dd_context_resource_commit(struct pipe_context *_pipe,
685
struct pipe_resource *resource,
686
unsigned level, struct pipe_box *box, bool commit)
687
{
688
struct pipe_context *pipe = dd_context(_pipe)->pipe;
689
690
return pipe->resource_commit(pipe, resource, level, box, commit);
691
}
692
693
static void
694
dd_context_set_compute_resources(struct pipe_context *_pipe,
695
unsigned start, unsigned count,
696
struct pipe_surface **resources)
697
{
698
struct pipe_context *pipe = dd_context(_pipe)->pipe;
699
pipe->set_compute_resources(pipe, start, count, resources);
700
}
701
702
static void
703
dd_context_set_global_binding(struct pipe_context *_pipe,
704
unsigned first, unsigned count,
705
struct pipe_resource **resources,
706
uint32_t **handles)
707
{
708
struct pipe_context *pipe = dd_context(_pipe)->pipe;
709
pipe->set_global_binding(pipe, first, count, resources, handles);
710
}
711
712
static void
713
dd_context_get_sample_position(struct pipe_context *_pipe,
714
unsigned sample_count, unsigned sample_index,
715
float *out_value)
716
{
717
struct pipe_context *pipe = dd_context(_pipe)->pipe;
718
719
pipe->get_sample_position(pipe, sample_count, sample_index,
720
out_value);
721
}
722
723
static void
724
dd_context_invalidate_resource(struct pipe_context *_pipe,
725
struct pipe_resource *resource)
726
{
727
struct pipe_context *pipe = dd_context(_pipe)->pipe;
728
729
pipe->invalidate_resource(pipe, resource);
730
}
731
732
static enum pipe_reset_status
733
dd_context_get_device_reset_status(struct pipe_context *_pipe)
734
{
735
struct pipe_context *pipe = dd_context(_pipe)->pipe;
736
737
return pipe->get_device_reset_status(pipe);
738
}
739
740
static void
741
dd_context_set_device_reset_callback(struct pipe_context *_pipe,
742
const struct pipe_device_reset_callback *cb)
743
{
744
struct pipe_context *pipe = dd_context(_pipe)->pipe;
745
746
pipe->set_device_reset_callback(pipe, cb);
747
}
748
749
static void
750
dd_context_emit_string_marker(struct pipe_context *_pipe,
751
const char *string, int len)
752
{
753
struct dd_context *dctx = dd_context(_pipe);
754
struct pipe_context *pipe = dctx->pipe;
755
756
pipe->emit_string_marker(pipe, string, len);
757
dd_parse_apitrace_marker(string, len, &dctx->draw_state.apitrace_call_number);
758
}
759
760
static void
761
dd_context_dump_debug_state(struct pipe_context *_pipe, FILE *stream,
762
unsigned flags)
763
{
764
struct pipe_context *pipe = dd_context(_pipe)->pipe;
765
766
pipe->dump_debug_state(pipe, stream, flags);
767
}
768
769
static uint64_t
770
dd_context_create_texture_handle(struct pipe_context *_pipe,
771
struct pipe_sampler_view *view,
772
const struct pipe_sampler_state *state)
773
{
774
struct pipe_context *pipe = dd_context(_pipe)->pipe;
775
776
return pipe->create_texture_handle(pipe, view, state);
777
}
778
779
static void
780
dd_context_delete_texture_handle(struct pipe_context *_pipe, uint64_t handle)
781
{
782
struct pipe_context *pipe = dd_context(_pipe)->pipe;
783
784
pipe->delete_texture_handle(pipe, handle);
785
}
786
787
static void
788
dd_context_make_texture_handle_resident(struct pipe_context *_pipe,
789
uint64_t handle, bool resident)
790
{
791
struct pipe_context *pipe = dd_context(_pipe)->pipe;
792
793
pipe->make_texture_handle_resident(pipe, handle, resident);
794
}
795
796
static uint64_t
797
dd_context_create_image_handle(struct pipe_context *_pipe,
798
const struct pipe_image_view *image)
799
{
800
struct pipe_context *pipe = dd_context(_pipe)->pipe;
801
802
return pipe->create_image_handle(pipe, image);
803
}
804
805
static void
806
dd_context_delete_image_handle(struct pipe_context *_pipe, uint64_t handle)
807
{
808
struct pipe_context *pipe = dd_context(_pipe)->pipe;
809
810
pipe->delete_image_handle(pipe, handle);
811
}
812
813
static void
814
dd_context_make_image_handle_resident(struct pipe_context *_pipe,
815
uint64_t handle, unsigned access,
816
bool resident)
817
{
818
struct pipe_context *pipe = dd_context(_pipe)->pipe;
819
820
pipe->make_image_handle_resident(pipe, handle, access, resident);
821
}
822
823
static void
824
dd_context_set_context_param(struct pipe_context *_pipe,
825
enum pipe_context_param param,
826
unsigned value)
827
{
828
struct pipe_context *pipe = dd_context(_pipe)->pipe;
829
830
pipe->set_context_param(pipe, param, value);
831
}
832
833
struct pipe_context *
834
dd_context_create(struct dd_screen *dscreen, struct pipe_context *pipe)
835
{
836
struct dd_context *dctx;
837
838
if (!pipe)
839
return NULL;
840
841
dctx = CALLOC_STRUCT(dd_context);
842
if (!dctx)
843
goto fail;
844
845
dctx->pipe = pipe;
846
dctx->base.priv = pipe->priv; /* expose wrapped priv data */
847
dctx->base.screen = &dscreen->base;
848
dctx->base.stream_uploader = pipe->stream_uploader;
849
dctx->base.const_uploader = pipe->const_uploader;
850
851
dctx->base.destroy = dd_context_destroy;
852
853
CTX_INIT(render_condition);
854
CTX_INIT(create_query);
855
CTX_INIT(create_batch_query);
856
CTX_INIT(destroy_query);
857
CTX_INIT(begin_query);
858
CTX_INIT(end_query);
859
CTX_INIT(get_query_result);
860
CTX_INIT(set_active_query_state);
861
CTX_INIT(create_blend_state);
862
CTX_INIT(bind_blend_state);
863
CTX_INIT(delete_blend_state);
864
CTX_INIT(create_sampler_state);
865
CTX_INIT(bind_sampler_states);
866
CTX_INIT(delete_sampler_state);
867
CTX_INIT(create_rasterizer_state);
868
CTX_INIT(bind_rasterizer_state);
869
CTX_INIT(delete_rasterizer_state);
870
CTX_INIT(create_depth_stencil_alpha_state);
871
CTX_INIT(bind_depth_stencil_alpha_state);
872
CTX_INIT(delete_depth_stencil_alpha_state);
873
CTX_INIT(create_fs_state);
874
CTX_INIT(bind_fs_state);
875
CTX_INIT(delete_fs_state);
876
CTX_INIT(create_vs_state);
877
CTX_INIT(bind_vs_state);
878
CTX_INIT(delete_vs_state);
879
CTX_INIT(create_gs_state);
880
CTX_INIT(bind_gs_state);
881
CTX_INIT(delete_gs_state);
882
CTX_INIT(create_tcs_state);
883
CTX_INIT(bind_tcs_state);
884
CTX_INIT(delete_tcs_state);
885
CTX_INIT(create_tes_state);
886
CTX_INIT(bind_tes_state);
887
CTX_INIT(delete_tes_state);
888
CTX_INIT(create_compute_state);
889
CTX_INIT(bind_compute_state);
890
CTX_INIT(delete_compute_state);
891
CTX_INIT(create_vertex_elements_state);
892
CTX_INIT(bind_vertex_elements_state);
893
CTX_INIT(delete_vertex_elements_state);
894
CTX_INIT(set_blend_color);
895
CTX_INIT(set_stencil_ref);
896
CTX_INIT(set_sample_mask);
897
CTX_INIT(set_min_samples);
898
CTX_INIT(set_clip_state);
899
CTX_INIT(set_constant_buffer);
900
CTX_INIT(set_framebuffer_state);
901
CTX_INIT(set_polygon_stipple);
902
CTX_INIT(set_scissor_states);
903
CTX_INIT(set_viewport_states);
904
CTX_INIT(set_sampler_views);
905
CTX_INIT(set_tess_state);
906
CTX_INIT(set_shader_buffers);
907
CTX_INIT(set_shader_images);
908
CTX_INIT(set_vertex_buffers);
909
CTX_INIT(set_window_rectangles);
910
CTX_INIT(create_stream_output_target);
911
CTX_INIT(stream_output_target_destroy);
912
CTX_INIT(set_stream_output_targets);
913
CTX_INIT(create_fence_fd);
914
CTX_INIT(fence_server_sync);
915
CTX_INIT(create_sampler_view);
916
CTX_INIT(sampler_view_destroy);
917
CTX_INIT(create_surface);
918
CTX_INIT(surface_destroy);
919
CTX_INIT(texture_barrier);
920
CTX_INIT(memory_barrier);
921
CTX_INIT(resource_commit);
922
CTX_INIT(set_compute_resources);
923
CTX_INIT(set_global_binding);
924
/* create_video_codec */
925
/* create_video_buffer */
926
CTX_INIT(get_sample_position);
927
CTX_INIT(invalidate_resource);
928
CTX_INIT(get_device_reset_status);
929
CTX_INIT(set_device_reset_callback);
930
CTX_INIT(dump_debug_state);
931
CTX_INIT(emit_string_marker);
932
CTX_INIT(create_texture_handle);
933
CTX_INIT(delete_texture_handle);
934
CTX_INIT(make_texture_handle_resident);
935
CTX_INIT(create_image_handle);
936
CTX_INIT(delete_image_handle);
937
CTX_INIT(make_image_handle_resident);
938
CTX_INIT(set_context_param);
939
940
dd_init_draw_functions(dctx);
941
942
u_log_context_init(&dctx->log);
943
if (pipe->set_log_context)
944
pipe->set_log_context(pipe, &dctx->log);
945
946
dctx->draw_state.sample_mask = ~0;
947
948
list_inithead(&dctx->records);
949
(void) mtx_init(&dctx->mutex, mtx_plain);
950
(void) cnd_init(&dctx->cond);
951
dctx->thread = u_thread_create(dd_thread_main, dctx);
952
if (!dctx->thread) {
953
mtx_destroy(&dctx->mutex);
954
goto fail;
955
}
956
957
return &dctx->base;
958
959
fail:
960
FREE(dctx);
961
pipe->destroy(pipe);
962
return NULL;
963
}
964
965