fc44a4bd1b930bca32f64f82a7a26a78271a9439
[mesa.git] / src / gallium / drivers / ddebug / dd_context.c
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 boolean
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 boolean
128 dd_context_get_query_result(struct pipe_context *_pipe,
129 struct pipe_query *query, boolean 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, boolean 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, boolean 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 const struct pipe_constant_buffer *constant_buffer)
364 {
365 struct dd_context *dctx = dd_context(_pipe);
366 struct pipe_context *pipe = dctx->pipe;
367
368 safe_memcpy(&dctx->draw_state.constant_buffers[shader][index],
369 constant_buffer, sizeof(*constant_buffer));
370 pipe->set_constant_buffer(pipe, shader, index, constant_buffer);
371 }
372
373 static void
374 dd_context_set_scissor_states(struct pipe_context *_pipe,
375 unsigned start_slot, unsigned num_scissors,
376 const struct pipe_scissor_state *states)
377 {
378 struct dd_context *dctx = dd_context(_pipe);
379 struct pipe_context *pipe = dctx->pipe;
380
381 safe_memcpy(&dctx->draw_state.scissors[start_slot], states,
382 sizeof(*states) * num_scissors);
383 pipe->set_scissor_states(pipe, start_slot, num_scissors, states);
384 }
385
386 static void
387 dd_context_set_viewport_states(struct pipe_context *_pipe,
388 unsigned start_slot, unsigned num_viewports,
389 const struct pipe_viewport_state *states)
390 {
391 struct dd_context *dctx = dd_context(_pipe);
392 struct pipe_context *pipe = dctx->pipe;
393
394 safe_memcpy(&dctx->draw_state.viewports[start_slot], states,
395 sizeof(*states) * num_viewports);
396 pipe->set_viewport_states(pipe, start_slot, num_viewports, states);
397 }
398
399 static void dd_context_set_tess_state(struct pipe_context *_pipe,
400 const float default_outer_level[4],
401 const float default_inner_level[2])
402 {
403 struct dd_context *dctx = dd_context(_pipe);
404 struct pipe_context *pipe = dctx->pipe;
405
406 memcpy(dctx->draw_state.tess_default_levels, default_outer_level,
407 sizeof(float) * 4);
408 memcpy(dctx->draw_state.tess_default_levels+4, default_inner_level,
409 sizeof(float) * 2);
410 pipe->set_tess_state(pipe, default_outer_level, default_inner_level);
411 }
412
413
414 /********************************************************************
415 * views
416 */
417
418 static struct pipe_surface *
419 dd_context_create_surface(struct pipe_context *_pipe,
420 struct pipe_resource *resource,
421 const struct pipe_surface *surf_tmpl)
422 {
423 struct pipe_context *pipe = dd_context(_pipe)->pipe;
424 struct pipe_surface *view =
425 pipe->create_surface(pipe, resource, surf_tmpl);
426
427 if (!view)
428 return NULL;
429 view->context = _pipe;
430 return view;
431 }
432
433 static void
434 dd_context_surface_destroy(struct pipe_context *_pipe,
435 struct pipe_surface *surf)
436 {
437 struct pipe_context *pipe = dd_context(_pipe)->pipe;
438
439 pipe->surface_destroy(pipe, surf);
440 }
441
442 static struct pipe_sampler_view *
443 dd_context_create_sampler_view(struct pipe_context *_pipe,
444 struct pipe_resource *resource,
445 const struct pipe_sampler_view *templ)
446 {
447 struct pipe_context *pipe = dd_context(_pipe)->pipe;
448 struct pipe_sampler_view *view =
449 pipe->create_sampler_view(pipe, resource, templ);
450
451 if (!view)
452 return NULL;
453 view->context = _pipe;
454 return view;
455 }
456
457 static void
458 dd_context_sampler_view_destroy(struct pipe_context *_pipe,
459 struct pipe_sampler_view *view)
460 {
461 struct pipe_context *pipe = dd_context(_pipe)->pipe;
462
463 pipe->sampler_view_destroy(pipe, view);
464 }
465
466 static struct pipe_stream_output_target *
467 dd_context_create_stream_output_target(struct pipe_context *_pipe,
468 struct pipe_resource *res,
469 unsigned buffer_offset,
470 unsigned buffer_size)
471 {
472 struct pipe_context *pipe = dd_context(_pipe)->pipe;
473 struct pipe_stream_output_target *view =
474 pipe->create_stream_output_target(pipe, res, buffer_offset,
475 buffer_size);
476
477 if (!view)
478 return NULL;
479 view->context = _pipe;
480 return view;
481 }
482
483 static void
484 dd_context_stream_output_target_destroy(struct pipe_context *_pipe,
485 struct pipe_stream_output_target *target)
486 {
487 struct pipe_context *pipe = dd_context(_pipe)->pipe;
488
489 pipe->stream_output_target_destroy(pipe, target);
490 }
491
492
493 /********************************************************************
494 * set states
495 */
496
497 static void
498 dd_context_set_sampler_views(struct pipe_context *_pipe,
499 enum pipe_shader_type shader,
500 unsigned start, unsigned num,
501 struct pipe_sampler_view **views)
502 {
503 struct dd_context *dctx = dd_context(_pipe);
504 struct pipe_context *pipe = dctx->pipe;
505
506 safe_memcpy(&dctx->draw_state.sampler_views[shader][start], views,
507 sizeof(views[0]) * num);
508 pipe->set_sampler_views(pipe, shader, start, num, views);
509 }
510
511 static void
512 dd_context_set_shader_images(struct pipe_context *_pipe,
513 enum pipe_shader_type shader,
514 unsigned start, unsigned num,
515 const struct pipe_image_view *views)
516 {
517 struct dd_context *dctx = dd_context(_pipe);
518 struct pipe_context *pipe = dctx->pipe;
519
520 safe_memcpy(&dctx->draw_state.shader_images[shader][start], views,
521 sizeof(views[0]) * num);
522 pipe->set_shader_images(pipe, shader, start, num, views);
523 }
524
525 static void
526 dd_context_set_shader_buffers(struct pipe_context *_pipe, unsigned shader,
527 unsigned start, unsigned num_buffers,
528 const struct pipe_shader_buffer *buffers)
529 {
530 struct dd_context *dctx = dd_context(_pipe);
531 struct pipe_context *pipe = dctx->pipe;
532
533 safe_memcpy(&dctx->draw_state.shader_buffers[shader][start], buffers,
534 sizeof(buffers[0]) * num_buffers);
535 pipe->set_shader_buffers(pipe, shader, start, num_buffers, buffers);
536 }
537
538 static void
539 dd_context_set_vertex_buffers(struct pipe_context *_pipe,
540 unsigned start, unsigned num_buffers,
541 const struct pipe_vertex_buffer *buffers)
542 {
543 struct dd_context *dctx = dd_context(_pipe);
544 struct pipe_context *pipe = dctx->pipe;
545
546 safe_memcpy(&dctx->draw_state.vertex_buffers[start], buffers,
547 sizeof(buffers[0]) * num_buffers);
548 pipe->set_vertex_buffers(pipe, start, num_buffers, buffers);
549 }
550
551 static void
552 dd_context_set_stream_output_targets(struct pipe_context *_pipe,
553 unsigned num_targets,
554 struct pipe_stream_output_target **tgs,
555 const unsigned *offsets)
556 {
557 struct dd_context *dctx = dd_context(_pipe);
558 struct pipe_context *pipe = dctx->pipe;
559 struct dd_draw_state *dstate = &dctx->draw_state;
560
561 dstate->num_so_targets = num_targets;
562 safe_memcpy(dstate->so_targets, tgs, sizeof(*tgs) * num_targets);
563 safe_memcpy(dstate->so_offsets, offsets, sizeof(*offsets) * num_targets);
564 pipe->set_stream_output_targets(pipe, num_targets, tgs, offsets);
565 }
566
567 static void
568 dd_context_destroy(struct pipe_context *_pipe)
569 {
570 struct dd_context *dctx = dd_context(_pipe);
571 struct pipe_context *pipe = dctx->pipe;
572
573 if (dctx->thread) {
574 mtx_lock(&dctx->mutex);
575 dctx->kill_thread = 1;
576 mtx_unlock(&dctx->mutex);
577 thrd_join(dctx->thread, NULL);
578 mtx_destroy(&dctx->mutex);
579 assert(!dctx->records);
580 }
581
582 if (dctx->fence) {
583 pipe->transfer_unmap(pipe, dctx->fence_transfer);
584 pipe_resource_reference(&dctx->fence, NULL);
585 }
586
587 if (pipe->set_log_context)
588 pipe->set_log_context(pipe, NULL);
589 u_log_context_destroy(&dctx->log);
590
591 pipe->destroy(pipe);
592 FREE(dctx);
593 }
594
595
596 /********************************************************************
597 * transfer
598 */
599
600 static void *
601 dd_context_transfer_map(struct pipe_context *_pipe,
602 struct pipe_resource *resource, unsigned level,
603 unsigned usage, const struct pipe_box *box,
604 struct pipe_transfer **transfer)
605 {
606 struct pipe_context *pipe = dd_context(_pipe)->pipe;
607
608 return pipe->transfer_map(pipe, resource, level, usage, box, transfer);
609 }
610
611 static void
612 dd_context_transfer_flush_region(struct pipe_context *_pipe,
613 struct pipe_transfer *transfer,
614 const struct pipe_box *box)
615 {
616 struct pipe_context *pipe = dd_context(_pipe)->pipe;
617
618 pipe->transfer_flush_region(pipe, transfer, box);
619 }
620
621 static void
622 dd_context_transfer_unmap(struct pipe_context *_pipe,
623 struct pipe_transfer *transfer)
624 {
625 struct pipe_context *pipe = dd_context(_pipe)->pipe;
626
627 pipe->transfer_unmap(pipe, transfer);
628 }
629
630 static void
631 dd_context_buffer_subdata(struct pipe_context *_pipe,
632 struct pipe_resource *resource,
633 unsigned usage, unsigned offset,
634 unsigned size, const void *data)
635 {
636 struct pipe_context *pipe = dd_context(_pipe)->pipe;
637
638 pipe->buffer_subdata(pipe, resource, usage, offset, size, data);
639 }
640
641 static void
642 dd_context_texture_subdata(struct pipe_context *_pipe,
643 struct pipe_resource *resource,
644 unsigned level, unsigned usage,
645 const struct pipe_box *box,
646 const void *data, unsigned stride,
647 unsigned layer_stride)
648 {
649 struct pipe_context *pipe = dd_context(_pipe)->pipe;
650
651 pipe->texture_subdata(pipe, resource, level, usage, box, data,
652 stride, layer_stride);
653 }
654
655
656 /********************************************************************
657 * miscellaneous
658 */
659
660 static void
661 dd_context_texture_barrier(struct pipe_context *_pipe, unsigned flags)
662 {
663 struct pipe_context *pipe = dd_context(_pipe)->pipe;
664
665 pipe->texture_barrier(pipe, flags);
666 }
667
668 static void
669 dd_context_memory_barrier(struct pipe_context *_pipe, unsigned flags)
670 {
671 struct pipe_context *pipe = dd_context(_pipe)->pipe;
672
673 pipe->memory_barrier(pipe, flags);
674 }
675
676 static bool
677 dd_context_resource_commit(struct pipe_context *_pipe,
678 struct pipe_resource *resource,
679 unsigned level, struct pipe_box *box, bool commit)
680 {
681 struct pipe_context *pipe = dd_context(_pipe)->pipe;
682
683 return pipe->resource_commit(pipe, resource, level, box, commit);
684 }
685
686 static void
687 dd_context_get_sample_position(struct pipe_context *_pipe,
688 unsigned sample_count, unsigned sample_index,
689 float *out_value)
690 {
691 struct pipe_context *pipe = dd_context(_pipe)->pipe;
692
693 return pipe->get_sample_position(pipe, sample_count, sample_index,
694 out_value);
695 }
696
697 static void
698 dd_context_invalidate_resource(struct pipe_context *_pipe,
699 struct pipe_resource *resource)
700 {
701 struct pipe_context *pipe = dd_context(_pipe)->pipe;
702
703 pipe->invalidate_resource(pipe, resource);
704 }
705
706 static enum pipe_reset_status
707 dd_context_get_device_reset_status(struct pipe_context *_pipe)
708 {
709 struct pipe_context *pipe = dd_context(_pipe)->pipe;
710
711 return pipe->get_device_reset_status(pipe);
712 }
713
714 static void
715 dd_context_set_device_reset_callback(struct pipe_context *_pipe,
716 const struct pipe_device_reset_callback *cb)
717 {
718 struct pipe_context *pipe = dd_context(_pipe)->pipe;
719
720 return pipe->set_device_reset_callback(pipe, cb);
721 }
722
723 static void
724 dd_context_emit_string_marker(struct pipe_context *_pipe,
725 const char *string, int len)
726 {
727 struct dd_context *dctx = dd_context(_pipe);
728 struct pipe_context *pipe = dctx->pipe;
729
730 pipe->emit_string_marker(pipe, string, len);
731 dd_parse_apitrace_marker(string, len, &dctx->draw_state.apitrace_call_number);
732 }
733
734 static void
735 dd_context_dump_debug_state(struct pipe_context *_pipe, FILE *stream,
736 unsigned flags)
737 {
738 struct pipe_context *pipe = dd_context(_pipe)->pipe;
739
740 return pipe->dump_debug_state(pipe, stream, flags);
741 }
742
743 static uint64_t
744 dd_context_create_texture_handle(struct pipe_context *_pipe,
745 struct pipe_sampler_view *view,
746 const struct pipe_sampler_state *state)
747 {
748 struct pipe_context *pipe = dd_context(_pipe)->pipe;
749
750 return pipe->create_texture_handle(pipe, view, state);
751 }
752
753 static void
754 dd_context_delete_texture_handle(struct pipe_context *_pipe, uint64_t handle)
755 {
756 struct pipe_context *pipe = dd_context(_pipe)->pipe;
757
758 pipe->delete_texture_handle(pipe, handle);
759 }
760
761 static void
762 dd_context_make_texture_handle_resident(struct pipe_context *_pipe,
763 uint64_t handle, bool resident)
764 {
765 struct pipe_context *pipe = dd_context(_pipe)->pipe;
766
767 pipe->make_texture_handle_resident(pipe, handle, resident);
768 }
769
770 static uint64_t
771 dd_context_create_image_handle(struct pipe_context *_pipe,
772 const struct pipe_image_view *image)
773 {
774 struct pipe_context *pipe = dd_context(_pipe)->pipe;
775
776 return pipe->create_image_handle(pipe, image);
777 }
778
779 static void
780 dd_context_delete_image_handle(struct pipe_context *_pipe, uint64_t handle)
781 {
782 struct pipe_context *pipe = dd_context(_pipe)->pipe;
783
784 pipe->delete_image_handle(pipe, handle);
785 }
786
787 static void
788 dd_context_make_image_handle_resident(struct pipe_context *_pipe,
789 uint64_t handle, unsigned access,
790 bool resident)
791 {
792 struct pipe_context *pipe = dd_context(_pipe)->pipe;
793
794 pipe->make_image_handle_resident(pipe, handle, access, resident);
795 }
796
797 struct pipe_context *
798 dd_context_create(struct dd_screen *dscreen, struct pipe_context *pipe)
799 {
800 struct dd_context *dctx;
801
802 if (!pipe)
803 return NULL;
804
805 dctx = CALLOC_STRUCT(dd_context);
806 if (!dctx)
807 goto fail;
808
809 dctx->pipe = pipe;
810 dctx->base.priv = pipe->priv; /* expose wrapped priv data */
811 dctx->base.screen = &dscreen->base;
812 dctx->base.stream_uploader = pipe->stream_uploader;
813 dctx->base.const_uploader = pipe->const_uploader;
814
815 dctx->base.destroy = dd_context_destroy;
816
817 CTX_INIT(render_condition);
818 CTX_INIT(create_query);
819 CTX_INIT(create_batch_query);
820 CTX_INIT(destroy_query);
821 CTX_INIT(begin_query);
822 CTX_INIT(end_query);
823 CTX_INIT(get_query_result);
824 CTX_INIT(set_active_query_state);
825 CTX_INIT(create_blend_state);
826 CTX_INIT(bind_blend_state);
827 CTX_INIT(delete_blend_state);
828 CTX_INIT(create_sampler_state);
829 CTX_INIT(bind_sampler_states);
830 CTX_INIT(delete_sampler_state);
831 CTX_INIT(create_rasterizer_state);
832 CTX_INIT(bind_rasterizer_state);
833 CTX_INIT(delete_rasterizer_state);
834 CTX_INIT(create_depth_stencil_alpha_state);
835 CTX_INIT(bind_depth_stencil_alpha_state);
836 CTX_INIT(delete_depth_stencil_alpha_state);
837 CTX_INIT(create_fs_state);
838 CTX_INIT(bind_fs_state);
839 CTX_INIT(delete_fs_state);
840 CTX_INIT(create_vs_state);
841 CTX_INIT(bind_vs_state);
842 CTX_INIT(delete_vs_state);
843 CTX_INIT(create_gs_state);
844 CTX_INIT(bind_gs_state);
845 CTX_INIT(delete_gs_state);
846 CTX_INIT(create_tcs_state);
847 CTX_INIT(bind_tcs_state);
848 CTX_INIT(delete_tcs_state);
849 CTX_INIT(create_tes_state);
850 CTX_INIT(bind_tes_state);
851 CTX_INIT(delete_tes_state);
852 CTX_INIT(create_compute_state);
853 CTX_INIT(bind_compute_state);
854 CTX_INIT(delete_compute_state);
855 CTX_INIT(create_vertex_elements_state);
856 CTX_INIT(bind_vertex_elements_state);
857 CTX_INIT(delete_vertex_elements_state);
858 CTX_INIT(set_blend_color);
859 CTX_INIT(set_stencil_ref);
860 CTX_INIT(set_sample_mask);
861 CTX_INIT(set_min_samples);
862 CTX_INIT(set_clip_state);
863 CTX_INIT(set_constant_buffer);
864 CTX_INIT(set_framebuffer_state);
865 CTX_INIT(set_polygon_stipple);
866 CTX_INIT(set_scissor_states);
867 CTX_INIT(set_viewport_states);
868 CTX_INIT(set_sampler_views);
869 CTX_INIT(set_tess_state);
870 CTX_INIT(set_shader_buffers);
871 CTX_INIT(set_shader_images);
872 CTX_INIT(set_vertex_buffers);
873 CTX_INIT(create_stream_output_target);
874 CTX_INIT(stream_output_target_destroy);
875 CTX_INIT(set_stream_output_targets);
876 CTX_INIT(create_sampler_view);
877 CTX_INIT(sampler_view_destroy);
878 CTX_INIT(create_surface);
879 CTX_INIT(surface_destroy);
880 CTX_INIT(transfer_map);
881 CTX_INIT(transfer_flush_region);
882 CTX_INIT(transfer_unmap);
883 CTX_INIT(buffer_subdata);
884 CTX_INIT(texture_subdata);
885 CTX_INIT(texture_barrier);
886 CTX_INIT(memory_barrier);
887 CTX_INIT(resource_commit);
888 /* create_video_codec */
889 /* create_video_buffer */
890 /* set_compute_resources */
891 /* set_global_binding */
892 CTX_INIT(get_sample_position);
893 CTX_INIT(invalidate_resource);
894 CTX_INIT(get_device_reset_status);
895 CTX_INIT(set_device_reset_callback);
896 CTX_INIT(dump_debug_state);
897 CTX_INIT(emit_string_marker);
898 CTX_INIT(create_texture_handle);
899 CTX_INIT(delete_texture_handle);
900 CTX_INIT(make_texture_handle_resident);
901 CTX_INIT(create_image_handle);
902 CTX_INIT(delete_image_handle);
903 CTX_INIT(make_image_handle_resident);
904
905 dd_init_draw_functions(dctx);
906
907 u_log_context_init(&dctx->log);
908 if (pipe->set_log_context)
909 pipe->set_log_context(pipe, &dctx->log);
910
911 dctx->draw_state.sample_mask = ~0;
912
913 if (dscreen->mode == DD_DETECT_HANGS_PIPELINED) {
914 dctx->fence = pipe_buffer_create(dscreen->screen, PIPE_BIND_CUSTOM,
915 PIPE_USAGE_STAGING, 4);
916 if (!dctx->fence)
917 goto fail;
918
919 dctx->mapped_fence = pipe_buffer_map(pipe, dctx->fence,
920 PIPE_TRANSFER_READ_WRITE |
921 PIPE_TRANSFER_PERSISTENT |
922 PIPE_TRANSFER_COHERENT,
923 &dctx->fence_transfer);
924 if (!dctx->mapped_fence)
925 goto fail;
926
927 *dctx->mapped_fence = 0;
928
929 (void) mtx_init(&dctx->mutex, mtx_plain);
930 dctx->thread = u_thread_create(dd_thread_pipelined_hang_detect, dctx);
931 if (!dctx->thread) {
932 mtx_destroy(&dctx->mutex);
933 goto fail;
934 }
935 }
936
937 return &dctx->base;
938
939 fail:
940 if (dctx) {
941 if (dctx->mapped_fence)
942 pipe_transfer_unmap(pipe, dctx->fence_transfer);
943 pipe_resource_reference(&dctx->fence, NULL);
944 FREE(dctx);
945 }
946 pipe->destroy(pipe);
947 return NULL;
948 }