1 /**************************************************************************
3 * Copyright 2015 Advanced Micro Devices, Inc.
4 * Copyright 2008 VMware, Inc.
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:
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
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.
26 **************************************************************************/
29 #include "tgsi/tgsi_parse.h"
30 #include "util/u_inlines.h"
31 #include "util/u_memory.h"
35 safe_memcpy(void *dst
, const void *src
, size_t size
)
38 memcpy(dst
, src
, size
);
44 /********************************************************************
48 static struct dd_query
*
49 dd_query(struct pipe_query
*query
)
51 return (struct dd_query
*)query
;
54 static struct pipe_query
*
55 dd_query_unwrap(struct pipe_query
*query
)
58 return dd_query(query
)->query
;
64 static struct pipe_query
*
65 dd_context_create_query(struct pipe_context
*_pipe
, unsigned query_type
,
68 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
69 struct pipe_query
*query
;
71 query
= pipe
->create_query(pipe
, query_type
, index
);
73 /* Wrap query object. */
75 struct dd_query
*dd_query
= CALLOC_STRUCT(dd_query
);
77 dd_query
->type
= query_type
;
78 dd_query
->query
= query
;
79 query
= (struct pipe_query
*)dd_query
;
81 pipe
->destroy_query(pipe
, query
);
89 static struct pipe_query
*
90 dd_context_create_batch_query(struct pipe_context
*_pipe
, unsigned num_queries
,
91 unsigned *query_types
)
93 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
94 struct pipe_query
*query
;
96 query
= pipe
->create_batch_query(pipe
, num_queries
, query_types
);
98 /* Wrap query object. */
100 struct dd_query
*dd_query
= CALLOC_STRUCT(dd_query
);
102 /* no special handling for batch queries yet */
103 dd_query
->type
= query_types
[0];
104 dd_query
->query
= query
;
105 query
= (struct pipe_query
*)dd_query
;
107 pipe
->destroy_query(pipe
, query
);
116 dd_context_destroy_query(struct pipe_context
*_pipe
,
117 struct pipe_query
*query
)
119 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
121 pipe
->destroy_query(pipe
, dd_query_unwrap(query
));
126 dd_context_begin_query(struct pipe_context
*_pipe
, struct pipe_query
*query
)
128 struct dd_context
*dctx
= dd_context(_pipe
);
129 struct pipe_context
*pipe
= dctx
->pipe
;
131 return pipe
->begin_query(pipe
, dd_query_unwrap(query
));
135 dd_context_end_query(struct pipe_context
*_pipe
, struct pipe_query
*query
)
137 struct dd_context
*dctx
= dd_context(_pipe
);
138 struct pipe_context
*pipe
= dctx
->pipe
;
140 return pipe
->end_query(pipe
, dd_query_unwrap(query
));
144 dd_context_get_query_result(struct pipe_context
*_pipe
,
145 struct pipe_query
*query
, boolean wait
,
146 union pipe_query_result
*result
)
148 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
150 return pipe
->get_query_result(pipe
, dd_query_unwrap(query
), wait
, result
);
154 dd_context_get_query_result_resource(struct pipe_context
*_pipe
,
155 struct pipe_query
*query
,
157 enum pipe_query_value_type result_type
,
159 struct pipe_resource
*resource
,
162 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
164 pipe
->get_query_result_resource(pipe
, dd_query_unwrap(query
), wait
,
165 result_type
, index
, resource
, offset
);
169 dd_context_set_active_query_state(struct pipe_context
*_pipe
, boolean enable
)
171 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
173 pipe
->set_active_query_state(pipe
, enable
);
177 dd_context_render_condition(struct pipe_context
*_pipe
,
178 struct pipe_query
*query
, boolean condition
,
179 enum pipe_render_cond_flag mode
)
181 struct dd_context
*dctx
= dd_context(_pipe
);
182 struct pipe_context
*pipe
= dctx
->pipe
;
183 struct dd_draw_state
*dstate
= &dctx
->draw_state
;
185 pipe
->render_condition(pipe
, dd_query_unwrap(query
), condition
, mode
);
186 dstate
->render_cond
.query
= dd_query(query
);
187 dstate
->render_cond
.condition
= condition
;
188 dstate
->render_cond
.mode
= mode
;
192 /********************************************************************
193 * constant (immutable) non-shader states
196 #define DD_CSO_CREATE(name, shortname) \
198 dd_context_create_##name##_state(struct pipe_context *_pipe, \
199 const struct pipe_##name##_state *state) \
201 struct pipe_context *pipe = dd_context(_pipe)->pipe; \
202 struct dd_state *hstate = CALLOC_STRUCT(dd_state); \
206 hstate->cso = pipe->create_##name##_state(pipe, state); \
207 hstate->state.shortname = *state; \
211 #define DD_CSO_BIND(name, shortname) \
213 dd_context_bind_##name##_state(struct pipe_context *_pipe, void *state) \
215 struct dd_context *dctx = dd_context(_pipe); \
216 struct pipe_context *pipe = dctx->pipe; \
217 struct dd_state *hstate = state; \
219 dctx->draw_state.shortname = hstate; \
220 pipe->bind_##name##_state(pipe, hstate ? hstate->cso : NULL); \
223 #define DD_CSO_DELETE(name) \
225 dd_context_delete_##name##_state(struct pipe_context *_pipe, void *state) \
227 struct dd_context *dctx = dd_context(_pipe); \
228 struct pipe_context *pipe = dctx->pipe; \
229 struct dd_state *hstate = state; \
231 pipe->delete_##name##_state(pipe, hstate->cso); \
235 #define DD_CSO_WHOLE(name, shortname) \
236 DD_CSO_CREATE(name, shortname) \
237 DD_CSO_BIND(name, shortname) \
240 DD_CSO_WHOLE(blend
, blend
)
241 DD_CSO_WHOLE(rasterizer
, rs
)
242 DD_CSO_WHOLE(depth_stencil_alpha
, dsa
)
244 DD_CSO_CREATE(sampler
, sampler
)
245 DD_CSO_DELETE(sampler
)
248 dd_context_bind_sampler_states(struct pipe_context
*_pipe
,
249 enum pipe_shader_type shader
,
250 unsigned start
, unsigned count
, void **states
)
252 struct dd_context
*dctx
= dd_context(_pipe
);
253 struct pipe_context
*pipe
= dctx
->pipe
;
255 memcpy(&dctx
->draw_state
.sampler_states
[shader
][start
], states
,
256 sizeof(void*) * count
);
259 void *samp
[PIPE_MAX_SAMPLERS
];
262 for (i
= 0; i
< count
; i
++) {
263 struct dd_state
*s
= states
[i
];
264 samp
[i
] = s
? s
->cso
: NULL
;
267 pipe
->bind_sampler_states(pipe
, shader
, start
, count
, samp
);
270 pipe
->bind_sampler_states(pipe
, shader
, start
, count
, NULL
);
274 dd_context_create_vertex_elements_state(struct pipe_context
*_pipe
,
276 const struct pipe_vertex_element
*elems
)
278 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
279 struct dd_state
*hstate
= CALLOC_STRUCT(dd_state
);
283 hstate
->cso
= pipe
->create_vertex_elements_state(pipe
, num_elems
, elems
);
284 memcpy(hstate
->state
.velems
.velems
, elems
, sizeof(elems
[0]) * num_elems
);
285 hstate
->state
.velems
.count
= num_elems
;
289 DD_CSO_BIND(vertex_elements
, velems
)
290 DD_CSO_DELETE(vertex_elements
)
293 /********************************************************************
297 #define DD_SHADER_NOCREATE(NAME, name) \
299 dd_context_bind_##name##_state(struct pipe_context *_pipe, void *state) \
301 struct dd_context *dctx = dd_context(_pipe); \
302 struct pipe_context *pipe = dctx->pipe; \
303 struct dd_state *hstate = state; \
305 dctx->draw_state.shaders[PIPE_SHADER_##NAME] = hstate; \
306 pipe->bind_##name##_state(pipe, hstate ? hstate->cso : NULL); \
310 dd_context_delete_##name##_state(struct pipe_context *_pipe, void *state) \
312 struct dd_context *dctx = dd_context(_pipe); \
313 struct pipe_context *pipe = dctx->pipe; \
314 struct dd_state *hstate = state; \
316 pipe->delete_##name##_state(pipe, hstate->cso); \
317 if (hstate->state.shader.type == PIPE_SHADER_IR_TGSI) \
318 tgsi_free_tokens(hstate->state.shader.tokens); \
322 #define DD_SHADER(NAME, name) \
324 dd_context_create_##name##_state(struct pipe_context *_pipe, \
325 const struct pipe_shader_state *state) \
327 struct pipe_context *pipe = dd_context(_pipe)->pipe; \
328 struct dd_state *hstate = CALLOC_STRUCT(dd_state); \
332 hstate->cso = pipe->create_##name##_state(pipe, state); \
333 hstate->state.shader = *state; \
334 if (hstate->state.shader.type == PIPE_SHADER_IR_TGSI) \
335 hstate->state.shader.tokens = tgsi_dup_tokens(state->tokens); \
339 DD_SHADER_NOCREATE(NAME, name)
341 DD_SHADER(FRAGMENT
, fs
)
342 DD_SHADER(VERTEX
, vs
)
343 DD_SHADER(GEOMETRY
, gs
)
344 DD_SHADER(TESS_CTRL
, tcs
)
345 DD_SHADER(TESS_EVAL
, tes
)
348 dd_context_create_compute_state(struct pipe_context
*_pipe
,
349 const struct pipe_compute_state
*state
)
351 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
352 struct dd_state
*hstate
= CALLOC_STRUCT(dd_state
);
356 hstate
->cso
= pipe
->create_compute_state(pipe
, state
);
358 hstate
->state
.shader
.type
= state
->ir_type
;
360 if (state
->ir_type
== PIPE_SHADER_IR_TGSI
)
361 hstate
->state
.shader
.tokens
= tgsi_dup_tokens(state
->prog
);
366 DD_SHADER_NOCREATE(COMPUTE
, compute
)
368 /********************************************************************
372 #define DD_IMM_STATE(name, type, deref, ref) \
374 dd_context_set_##name(struct pipe_context *_pipe, type deref) \
376 struct dd_context *dctx = dd_context(_pipe); \
377 struct pipe_context *pipe = dctx->pipe; \
379 dctx->draw_state.name = deref; \
380 pipe->set_##name(pipe, ref); \
383 DD_IMM_STATE(blend_color
, const struct pipe_blend_color
, *state
, state
)
384 DD_IMM_STATE(stencil_ref
, const struct pipe_stencil_ref
, *state
, state
)
385 DD_IMM_STATE(clip_state
, const struct pipe_clip_state
, *state
, state
)
386 DD_IMM_STATE(sample_mask
, unsigned, sample_mask
, sample_mask
)
387 DD_IMM_STATE(min_samples
, unsigned, min_samples
, min_samples
)
388 DD_IMM_STATE(framebuffer_state
, const struct pipe_framebuffer_state
, *state
, state
)
389 DD_IMM_STATE(polygon_stipple
, const struct pipe_poly_stipple
, *state
, state
)
392 dd_context_set_constant_buffer(struct pipe_context
*_pipe
,
393 enum pipe_shader_type shader
, uint index
,
394 const struct pipe_constant_buffer
*constant_buffer
)
396 struct dd_context
*dctx
= dd_context(_pipe
);
397 struct pipe_context
*pipe
= dctx
->pipe
;
399 safe_memcpy(&dctx
->draw_state
.constant_buffers
[shader
][index
],
400 constant_buffer
, sizeof(*constant_buffer
));
401 pipe
->set_constant_buffer(pipe
, shader
, index
, constant_buffer
);
405 dd_context_set_scissor_states(struct pipe_context
*_pipe
,
406 unsigned start_slot
, unsigned num_scissors
,
407 const struct pipe_scissor_state
*states
)
409 struct dd_context
*dctx
= dd_context(_pipe
);
410 struct pipe_context
*pipe
= dctx
->pipe
;
412 safe_memcpy(&dctx
->draw_state
.scissors
[start_slot
], states
,
413 sizeof(*states
) * num_scissors
);
414 pipe
->set_scissor_states(pipe
, start_slot
, num_scissors
, states
);
418 dd_context_set_viewport_states(struct pipe_context
*_pipe
,
419 unsigned start_slot
, unsigned num_viewports
,
420 const struct pipe_viewport_state
*states
)
422 struct dd_context
*dctx
= dd_context(_pipe
);
423 struct pipe_context
*pipe
= dctx
->pipe
;
425 safe_memcpy(&dctx
->draw_state
.viewports
[start_slot
], states
,
426 sizeof(*states
) * num_viewports
);
427 pipe
->set_viewport_states(pipe
, start_slot
, num_viewports
, states
);
430 static void dd_context_set_tess_state(struct pipe_context
*_pipe
,
431 const float default_outer_level
[4],
432 const float default_inner_level
[2])
434 struct dd_context
*dctx
= dd_context(_pipe
);
435 struct pipe_context
*pipe
= dctx
->pipe
;
437 memcpy(dctx
->draw_state
.tess_default_levels
, default_outer_level
,
439 memcpy(dctx
->draw_state
.tess_default_levels
+4, default_inner_level
,
441 pipe
->set_tess_state(pipe
, default_outer_level
, default_inner_level
);
445 /********************************************************************
449 static struct pipe_surface
*
450 dd_context_create_surface(struct pipe_context
*_pipe
,
451 struct pipe_resource
*resource
,
452 const struct pipe_surface
*surf_tmpl
)
454 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
455 struct pipe_surface
*view
=
456 pipe
->create_surface(pipe
, resource
, surf_tmpl
);
460 view
->context
= _pipe
;
465 dd_context_surface_destroy(struct pipe_context
*_pipe
,
466 struct pipe_surface
*surf
)
468 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
470 pipe
->surface_destroy(pipe
, surf
);
473 static struct pipe_sampler_view
*
474 dd_context_create_sampler_view(struct pipe_context
*_pipe
,
475 struct pipe_resource
*resource
,
476 const struct pipe_sampler_view
*templ
)
478 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
479 struct pipe_sampler_view
*view
=
480 pipe
->create_sampler_view(pipe
, resource
, templ
);
484 view
->context
= _pipe
;
489 dd_context_sampler_view_destroy(struct pipe_context
*_pipe
,
490 struct pipe_sampler_view
*view
)
492 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
494 pipe
->sampler_view_destroy(pipe
, view
);
497 static struct pipe_stream_output_target
*
498 dd_context_create_stream_output_target(struct pipe_context
*_pipe
,
499 struct pipe_resource
*res
,
500 unsigned buffer_offset
,
501 unsigned buffer_size
)
503 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
504 struct pipe_stream_output_target
*view
=
505 pipe
->create_stream_output_target(pipe
, res
, buffer_offset
,
510 view
->context
= _pipe
;
515 dd_context_stream_output_target_destroy(struct pipe_context
*_pipe
,
516 struct pipe_stream_output_target
*target
)
518 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
520 pipe
->stream_output_target_destroy(pipe
, target
);
524 /********************************************************************
529 dd_context_set_sampler_views(struct pipe_context
*_pipe
,
530 enum pipe_shader_type shader
,
531 unsigned start
, unsigned num
,
532 struct pipe_sampler_view
**views
)
534 struct dd_context
*dctx
= dd_context(_pipe
);
535 struct pipe_context
*pipe
= dctx
->pipe
;
537 safe_memcpy(&dctx
->draw_state
.sampler_views
[shader
][start
], views
,
538 sizeof(views
[0]) * num
);
539 pipe
->set_sampler_views(pipe
, shader
, start
, num
, views
);
543 dd_context_set_shader_images(struct pipe_context
*_pipe
,
544 enum pipe_shader_type shader
,
545 unsigned start
, unsigned num
,
546 const struct pipe_image_view
*views
)
548 struct dd_context
*dctx
= dd_context(_pipe
);
549 struct pipe_context
*pipe
= dctx
->pipe
;
551 safe_memcpy(&dctx
->draw_state
.shader_images
[shader
][start
], views
,
552 sizeof(views
[0]) * num
);
553 pipe
->set_shader_images(pipe
, shader
, start
, num
, views
);
557 dd_context_set_shader_buffers(struct pipe_context
*_pipe
, unsigned shader
,
558 unsigned start
, unsigned num_buffers
,
559 const struct pipe_shader_buffer
*buffers
)
561 struct dd_context
*dctx
= dd_context(_pipe
);
562 struct pipe_context
*pipe
= dctx
->pipe
;
564 safe_memcpy(&dctx
->draw_state
.shader_buffers
[shader
][start
], buffers
,
565 sizeof(buffers
[0]) * num_buffers
);
566 pipe
->set_shader_buffers(pipe
, shader
, start
, num_buffers
, buffers
);
570 dd_context_set_vertex_buffers(struct pipe_context
*_pipe
,
571 unsigned start
, unsigned num_buffers
,
572 const struct pipe_vertex_buffer
*buffers
)
574 struct dd_context
*dctx
= dd_context(_pipe
);
575 struct pipe_context
*pipe
= dctx
->pipe
;
577 safe_memcpy(&dctx
->draw_state
.vertex_buffers
[start
], buffers
,
578 sizeof(buffers
[0]) * num_buffers
);
579 pipe
->set_vertex_buffers(pipe
, start
, num_buffers
, buffers
);
583 dd_context_set_stream_output_targets(struct pipe_context
*_pipe
,
584 unsigned num_targets
,
585 struct pipe_stream_output_target
**tgs
,
586 const unsigned *offsets
)
588 struct dd_context
*dctx
= dd_context(_pipe
);
589 struct pipe_context
*pipe
= dctx
->pipe
;
590 struct dd_draw_state
*dstate
= &dctx
->draw_state
;
592 dstate
->num_so_targets
= num_targets
;
593 safe_memcpy(dstate
->so_targets
, tgs
, sizeof(*tgs
) * num_targets
);
594 safe_memcpy(dstate
->so_offsets
, offsets
, sizeof(*offsets
) * num_targets
);
595 pipe
->set_stream_output_targets(pipe
, num_targets
, tgs
, offsets
);
599 dd_context_destroy(struct pipe_context
*_pipe
)
601 struct dd_context
*dctx
= dd_context(_pipe
);
602 struct pipe_context
*pipe
= dctx
->pipe
;
605 mtx_lock(&dctx
->mutex
);
606 dctx
->kill_thread
= 1;
607 mtx_unlock(&dctx
->mutex
);
608 thrd_join(dctx
->thread
, NULL
);
609 mtx_destroy(&dctx
->mutex
);
610 assert(!dctx
->records
);
614 pipe
->transfer_unmap(pipe
, dctx
->fence_transfer
);
615 pipe_resource_reference(&dctx
->fence
, NULL
);
622 /********************************************************************
627 dd_context_transfer_map(struct pipe_context
*_pipe
,
628 struct pipe_resource
*resource
, unsigned level
,
629 unsigned usage
, const struct pipe_box
*box
,
630 struct pipe_transfer
**transfer
)
632 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
634 return pipe
->transfer_map(pipe
, resource
, level
, usage
, box
, transfer
);
638 dd_context_transfer_flush_region(struct pipe_context
*_pipe
,
639 struct pipe_transfer
*transfer
,
640 const struct pipe_box
*box
)
642 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
644 pipe
->transfer_flush_region(pipe
, transfer
, box
);
648 dd_context_transfer_unmap(struct pipe_context
*_pipe
,
649 struct pipe_transfer
*transfer
)
651 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
653 pipe
->transfer_unmap(pipe
, transfer
);
657 dd_context_buffer_subdata(struct pipe_context
*_pipe
,
658 struct pipe_resource
*resource
,
659 unsigned usage
, unsigned offset
,
660 unsigned size
, const void *data
)
662 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
664 pipe
->buffer_subdata(pipe
, resource
, usage
, offset
, size
, data
);
668 dd_context_texture_subdata(struct pipe_context
*_pipe
,
669 struct pipe_resource
*resource
,
670 unsigned level
, unsigned usage
,
671 const struct pipe_box
*box
,
672 const void *data
, unsigned stride
,
673 unsigned layer_stride
)
675 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
677 pipe
->texture_subdata(pipe
, resource
, level
, usage
, box
, data
,
678 stride
, layer_stride
);
682 /********************************************************************
687 dd_context_texture_barrier(struct pipe_context
*_pipe
, unsigned flags
)
689 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
691 pipe
->texture_barrier(pipe
, flags
);
695 dd_context_memory_barrier(struct pipe_context
*_pipe
, unsigned flags
)
697 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
699 pipe
->memory_barrier(pipe
, flags
);
703 dd_context_resource_commit(struct pipe_context
*_pipe
,
704 struct pipe_resource
*resource
,
705 unsigned level
, struct pipe_box
*box
, bool commit
)
707 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
709 return pipe
->resource_commit(pipe
, resource
, level
, box
, commit
);
713 dd_context_get_sample_position(struct pipe_context
*_pipe
,
714 unsigned sample_count
, unsigned sample_index
,
717 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
719 return pipe
->get_sample_position(pipe
, sample_count
, sample_index
,
724 dd_context_invalidate_resource(struct pipe_context
*_pipe
,
725 struct pipe_resource
*resource
)
727 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
729 pipe
->invalidate_resource(pipe
, resource
);
732 static enum pipe_reset_status
733 dd_context_get_device_reset_status(struct pipe_context
*_pipe
)
735 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
737 return pipe
->get_device_reset_status(pipe
);
741 dd_context_set_device_reset_callback(struct pipe_context
*_pipe
,
742 const struct pipe_device_reset_callback
*cb
)
744 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
746 return pipe
->set_device_reset_callback(pipe
, cb
);
750 dd_context_emit_string_marker(struct pipe_context
*_pipe
,
751 const char *string
, int len
)
753 struct dd_context
*dctx
= dd_context(_pipe
);
754 struct pipe_context
*pipe
= dctx
->pipe
;
756 pipe
->emit_string_marker(pipe
, string
, len
);
757 dd_parse_apitrace_marker(string
, len
, &dctx
->draw_state
.apitrace_call_number
);
761 dd_context_dump_debug_state(struct pipe_context
*_pipe
, FILE *stream
,
764 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
766 return pipe
->dump_debug_state(pipe
, stream
, flags
);
770 dd_context_create_texture_handle(struct pipe_context
*_pipe
,
771 struct pipe_sampler_view
*view
,
772 const struct pipe_sampler_state
*state
)
774 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
776 return pipe
->create_texture_handle(pipe
, view
, state
);
780 dd_context_delete_texture_handle(struct pipe_context
*_pipe
, uint64_t handle
)
782 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
784 pipe
->delete_texture_handle(pipe
, handle
);
788 dd_context_make_texture_handle_resident(struct pipe_context
*_pipe
,
789 uint64_t handle
, bool resident
)
791 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
793 pipe
->make_texture_handle_resident(pipe
, handle
, resident
);
797 dd_context_create_image_handle(struct pipe_context
*_pipe
,
798 const struct pipe_image_view
*image
)
800 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
802 return pipe
->create_image_handle(pipe
, image
);
806 dd_context_delete_image_handle(struct pipe_context
*_pipe
, uint64_t handle
)
808 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
810 pipe
->delete_image_handle(pipe
, handle
);
814 dd_context_make_image_handle_resident(struct pipe_context
*_pipe
,
815 uint64_t handle
, unsigned access
,
818 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
820 pipe
->make_image_handle_resident(pipe
, handle
, access
, resident
);
823 struct pipe_context
*
824 dd_context_create(struct dd_screen
*dscreen
, struct pipe_context
*pipe
)
826 struct dd_context
*dctx
;
831 dctx
= CALLOC_STRUCT(dd_context
);
836 dctx
->base
.priv
= pipe
->priv
; /* expose wrapped priv data */
837 dctx
->base
.screen
= &dscreen
->base
;
838 dctx
->base
.stream_uploader
= pipe
->stream_uploader
;
839 dctx
->base
.const_uploader
= pipe
->const_uploader
;
841 dctx
->base
.destroy
= dd_context_destroy
;
843 CTX_INIT(render_condition
);
844 CTX_INIT(create_query
);
845 CTX_INIT(create_batch_query
);
846 CTX_INIT(destroy_query
);
847 CTX_INIT(begin_query
);
849 CTX_INIT(get_query_result
);
850 CTX_INIT(get_query_result_resource
);
851 CTX_INIT(set_active_query_state
);
852 CTX_INIT(create_blend_state
);
853 CTX_INIT(bind_blend_state
);
854 CTX_INIT(delete_blend_state
);
855 CTX_INIT(create_sampler_state
);
856 CTX_INIT(bind_sampler_states
);
857 CTX_INIT(delete_sampler_state
);
858 CTX_INIT(create_rasterizer_state
);
859 CTX_INIT(bind_rasterizer_state
);
860 CTX_INIT(delete_rasterizer_state
);
861 CTX_INIT(create_depth_stencil_alpha_state
);
862 CTX_INIT(bind_depth_stencil_alpha_state
);
863 CTX_INIT(delete_depth_stencil_alpha_state
);
864 CTX_INIT(create_fs_state
);
865 CTX_INIT(bind_fs_state
);
866 CTX_INIT(delete_fs_state
);
867 CTX_INIT(create_vs_state
);
868 CTX_INIT(bind_vs_state
);
869 CTX_INIT(delete_vs_state
);
870 CTX_INIT(create_gs_state
);
871 CTX_INIT(bind_gs_state
);
872 CTX_INIT(delete_gs_state
);
873 CTX_INIT(create_tcs_state
);
874 CTX_INIT(bind_tcs_state
);
875 CTX_INIT(delete_tcs_state
);
876 CTX_INIT(create_tes_state
);
877 CTX_INIT(bind_tes_state
);
878 CTX_INIT(delete_tes_state
);
879 CTX_INIT(create_compute_state
);
880 CTX_INIT(bind_compute_state
);
881 CTX_INIT(delete_compute_state
);
882 CTX_INIT(create_vertex_elements_state
);
883 CTX_INIT(bind_vertex_elements_state
);
884 CTX_INIT(delete_vertex_elements_state
);
885 CTX_INIT(set_blend_color
);
886 CTX_INIT(set_stencil_ref
);
887 CTX_INIT(set_sample_mask
);
888 CTX_INIT(set_min_samples
);
889 CTX_INIT(set_clip_state
);
890 CTX_INIT(set_constant_buffer
);
891 CTX_INIT(set_framebuffer_state
);
892 CTX_INIT(set_polygon_stipple
);
893 CTX_INIT(set_scissor_states
);
894 CTX_INIT(set_viewport_states
);
895 CTX_INIT(set_sampler_views
);
896 CTX_INIT(set_tess_state
);
897 CTX_INIT(set_shader_buffers
);
898 CTX_INIT(set_shader_images
);
899 CTX_INIT(set_vertex_buffers
);
900 CTX_INIT(create_stream_output_target
);
901 CTX_INIT(stream_output_target_destroy
);
902 CTX_INIT(set_stream_output_targets
);
903 CTX_INIT(create_sampler_view
);
904 CTX_INIT(sampler_view_destroy
);
905 CTX_INIT(create_surface
);
906 CTX_INIT(surface_destroy
);
907 CTX_INIT(transfer_map
);
908 CTX_INIT(transfer_flush_region
);
909 CTX_INIT(transfer_unmap
);
910 CTX_INIT(buffer_subdata
);
911 CTX_INIT(texture_subdata
);
912 CTX_INIT(texture_barrier
);
913 CTX_INIT(memory_barrier
);
914 CTX_INIT(resource_commit
);
915 /* create_video_codec */
916 /* create_video_buffer */
917 /* set_compute_resources */
918 /* set_global_binding */
919 CTX_INIT(get_sample_position
);
920 CTX_INIT(invalidate_resource
);
921 CTX_INIT(get_device_reset_status
);
922 CTX_INIT(set_device_reset_callback
);
923 CTX_INIT(dump_debug_state
);
924 CTX_INIT(emit_string_marker
);
925 CTX_INIT(create_texture_handle
);
926 CTX_INIT(delete_texture_handle
);
927 CTX_INIT(make_texture_handle_resident
);
928 CTX_INIT(create_image_handle
);
929 CTX_INIT(delete_image_handle
);
930 CTX_INIT(make_image_handle_resident
);
932 dd_init_draw_functions(dctx
);
934 dctx
->draw_state
.sample_mask
= ~0;
936 if (dscreen
->mode
== DD_DETECT_HANGS_PIPELINED
) {
937 dctx
->fence
= pipe_buffer_create(dscreen
->screen
, PIPE_BIND_CUSTOM
,
938 PIPE_USAGE_STAGING
, 4);
942 dctx
->mapped_fence
= pipe_buffer_map(pipe
, dctx
->fence
,
943 PIPE_TRANSFER_READ_WRITE
|
944 PIPE_TRANSFER_PERSISTENT
|
945 PIPE_TRANSFER_COHERENT
,
946 &dctx
->fence_transfer
);
947 if (!dctx
->mapped_fence
)
950 *dctx
->mapped_fence
= 0;
952 (void) mtx_init(&dctx
->mutex
, mtx_plain
);
953 dctx
->thread
= u_thread_create(dd_thread_pipelined_hang_detect
, dctx
);
955 mtx_destroy(&dctx
->mutex
);
964 if (dctx
->mapped_fence
)
965 pipe_transfer_unmap(pipe
, dctx
->fence_transfer
);
966 pipe_resource_reference(&dctx
->fence
, NULL
);