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 pipe_query
*
49 dd_context_create_query(struct pipe_context
*_pipe
, unsigned query_type
,
52 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
53 struct pipe_query
*query
;
55 query
= pipe
->create_query(pipe
, query_type
, index
);
57 /* Wrap query object. */
59 struct dd_query
*dd_query
= CALLOC_STRUCT(dd_query
);
61 dd_query
->type
= query_type
;
62 dd_query
->query
= query
;
63 query
= (struct pipe_query
*)dd_query
;
65 pipe
->destroy_query(pipe
, query
);
73 static struct pipe_query
*
74 dd_context_create_batch_query(struct pipe_context
*_pipe
, unsigned num_queries
,
75 unsigned *query_types
)
77 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
78 struct pipe_query
*query
;
80 query
= pipe
->create_batch_query(pipe
, num_queries
, query_types
);
82 /* Wrap query object. */
84 struct dd_query
*dd_query
= CALLOC_STRUCT(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
;
91 pipe
->destroy_query(pipe
, query
);
100 dd_context_destroy_query(struct pipe_context
*_pipe
,
101 struct pipe_query
*query
)
103 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
105 pipe
->destroy_query(pipe
, dd_query_unwrap(query
));
110 dd_context_begin_query(struct pipe_context
*_pipe
, struct pipe_query
*query
)
112 struct dd_context
*dctx
= dd_context(_pipe
);
113 struct pipe_context
*pipe
= dctx
->pipe
;
115 return pipe
->begin_query(pipe
, dd_query_unwrap(query
));
119 dd_context_end_query(struct pipe_context
*_pipe
, struct pipe_query
*query
)
121 struct dd_context
*dctx
= dd_context(_pipe
);
122 struct pipe_context
*pipe
= dctx
->pipe
;
124 return pipe
->end_query(pipe
, dd_query_unwrap(query
));
128 dd_context_get_query_result(struct pipe_context
*_pipe
,
129 struct pipe_query
*query
, boolean wait
,
130 union pipe_query_result
*result
)
132 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
134 return pipe
->get_query_result(pipe
, dd_query_unwrap(query
), wait
, result
);
138 dd_context_set_active_query_state(struct pipe_context
*_pipe
, boolean enable
)
140 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
142 pipe
->set_active_query_state(pipe
, enable
);
146 dd_context_render_condition(struct pipe_context
*_pipe
,
147 struct pipe_query
*query
, boolean condition
,
148 enum pipe_render_cond_flag mode
)
150 struct dd_context
*dctx
= dd_context(_pipe
);
151 struct pipe_context
*pipe
= dctx
->pipe
;
152 struct dd_draw_state
*dstate
= &dctx
->draw_state
;
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
;
161 /********************************************************************
162 * constant (immutable) non-shader states
165 #define DD_CSO_CREATE(name, shortname) \
167 dd_context_create_##name##_state(struct pipe_context *_pipe, \
168 const struct pipe_##name##_state *state) \
170 struct pipe_context *pipe = dd_context(_pipe)->pipe; \
171 struct dd_state *hstate = CALLOC_STRUCT(dd_state); \
175 hstate->cso = pipe->create_##name##_state(pipe, state); \
176 hstate->state.shortname = *state; \
180 #define DD_CSO_BIND(name, shortname) \
182 dd_context_bind_##name##_state(struct pipe_context *_pipe, void *state) \
184 struct dd_context *dctx = dd_context(_pipe); \
185 struct pipe_context *pipe = dctx->pipe; \
186 struct dd_state *hstate = state; \
188 dctx->draw_state.shortname = hstate; \
189 pipe->bind_##name##_state(pipe, hstate ? hstate->cso : NULL); \
192 #define DD_CSO_DELETE(name) \
194 dd_context_delete_##name##_state(struct pipe_context *_pipe, void *state) \
196 struct dd_context *dctx = dd_context(_pipe); \
197 struct pipe_context *pipe = dctx->pipe; \
198 struct dd_state *hstate = state; \
200 pipe->delete_##name##_state(pipe, hstate->cso); \
204 #define DD_CSO_WHOLE(name, shortname) \
205 DD_CSO_CREATE(name, shortname) \
206 DD_CSO_BIND(name, shortname) \
209 DD_CSO_WHOLE(blend
, blend
)
210 DD_CSO_WHOLE(rasterizer
, rs
)
211 DD_CSO_WHOLE(depth_stencil_alpha
, dsa
)
213 DD_CSO_CREATE(sampler
, sampler
)
214 DD_CSO_DELETE(sampler
)
217 dd_context_bind_sampler_states(struct pipe_context
*_pipe
,
218 enum pipe_shader_type shader
,
219 unsigned start
, unsigned count
, void **states
)
221 struct dd_context
*dctx
= dd_context(_pipe
);
222 struct pipe_context
*pipe
= dctx
->pipe
;
224 memcpy(&dctx
->draw_state
.sampler_states
[shader
][start
], states
,
225 sizeof(void*) * count
);
228 void *samp
[PIPE_MAX_SAMPLERS
];
231 for (i
= 0; i
< count
; i
++) {
232 struct dd_state
*s
= states
[i
];
233 samp
[i
] = s
? s
->cso
: NULL
;
236 pipe
->bind_sampler_states(pipe
, shader
, start
, count
, samp
);
239 pipe
->bind_sampler_states(pipe
, shader
, start
, count
, NULL
);
243 dd_context_create_vertex_elements_state(struct pipe_context
*_pipe
,
245 const struct pipe_vertex_element
*elems
)
247 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
248 struct dd_state
*hstate
= CALLOC_STRUCT(dd_state
);
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
;
258 DD_CSO_BIND(vertex_elements
, velems
)
259 DD_CSO_DELETE(vertex_elements
)
262 /********************************************************************
266 #define DD_SHADER_NOCREATE(NAME, name) \
268 dd_context_bind_##name##_state(struct pipe_context *_pipe, void *state) \
270 struct dd_context *dctx = dd_context(_pipe); \
271 struct pipe_context *pipe = dctx->pipe; \
272 struct dd_state *hstate = state; \
274 dctx->draw_state.shaders[PIPE_SHADER_##NAME] = hstate; \
275 pipe->bind_##name##_state(pipe, hstate ? hstate->cso : NULL); \
279 dd_context_delete_##name##_state(struct pipe_context *_pipe, void *state) \
281 struct dd_context *dctx = dd_context(_pipe); \
282 struct pipe_context *pipe = dctx->pipe; \
283 struct dd_state *hstate = state; \
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); \
291 #define DD_SHADER(NAME, name) \
293 dd_context_create_##name##_state(struct pipe_context *_pipe, \
294 const struct pipe_shader_state *state) \
296 struct pipe_context *pipe = dd_context(_pipe)->pipe; \
297 struct dd_state *hstate = CALLOC_STRUCT(dd_state); \
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); \
308 DD_SHADER_NOCREATE(NAME, name)
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
)
317 dd_context_create_compute_state(struct pipe_context
*_pipe
,
318 const struct pipe_compute_state
*state
)
320 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
321 struct dd_state
*hstate
= CALLOC_STRUCT(dd_state
);
325 hstate
->cso
= pipe
->create_compute_state(pipe
, state
);
327 hstate
->state
.shader
.type
= state
->ir_type
;
329 if (state
->ir_type
== PIPE_SHADER_IR_TGSI
)
330 hstate
->state
.shader
.tokens
= tgsi_dup_tokens(state
->prog
);
335 DD_SHADER_NOCREATE(COMPUTE
, compute
)
337 /********************************************************************
341 #define DD_IMM_STATE(name, type, deref, ref) \
343 dd_context_set_##name(struct pipe_context *_pipe, type deref) \
345 struct dd_context *dctx = dd_context(_pipe); \
346 struct pipe_context *pipe = dctx->pipe; \
348 dctx->draw_state.name = deref; \
349 pipe->set_##name(pipe, ref); \
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
)
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
)
365 struct dd_context
*dctx
= dd_context(_pipe
);
366 struct pipe_context
*pipe
= dctx
->pipe
;
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
);
374 dd_context_set_scissor_states(struct pipe_context
*_pipe
,
375 unsigned start_slot
, unsigned num_scissors
,
376 const struct pipe_scissor_state
*states
)
378 struct dd_context
*dctx
= dd_context(_pipe
);
379 struct pipe_context
*pipe
= dctx
->pipe
;
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
);
387 dd_context_set_viewport_states(struct pipe_context
*_pipe
,
388 unsigned start_slot
, unsigned num_viewports
,
389 const struct pipe_viewport_state
*states
)
391 struct dd_context
*dctx
= dd_context(_pipe
);
392 struct pipe_context
*pipe
= dctx
->pipe
;
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
);
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])
403 struct dd_context
*dctx
= dd_context(_pipe
);
404 struct pipe_context
*pipe
= dctx
->pipe
;
406 memcpy(dctx
->draw_state
.tess_default_levels
, default_outer_level
,
408 memcpy(dctx
->draw_state
.tess_default_levels
+4, default_inner_level
,
410 pipe
->set_tess_state(pipe
, default_outer_level
, default_inner_level
);
413 static void dd_context_set_window_rectangles(struct pipe_context
*_pipe
,
415 unsigned num_rectangles
,
416 const struct pipe_scissor_state
*rects
)
418 struct dd_context
*dctx
= dd_context(_pipe
);
419 struct pipe_context
*pipe
= dctx
->pipe
;
421 pipe
->set_window_rectangles(pipe
, include
, num_rectangles
, rects
);
425 /********************************************************************
429 static struct pipe_surface
*
430 dd_context_create_surface(struct pipe_context
*_pipe
,
431 struct pipe_resource
*resource
,
432 const struct pipe_surface
*surf_tmpl
)
434 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
435 struct pipe_surface
*view
=
436 pipe
->create_surface(pipe
, resource
, surf_tmpl
);
440 view
->context
= _pipe
;
445 dd_context_surface_destroy(struct pipe_context
*_pipe
,
446 struct pipe_surface
*surf
)
448 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
450 pipe
->surface_destroy(pipe
, surf
);
453 static struct pipe_sampler_view
*
454 dd_context_create_sampler_view(struct pipe_context
*_pipe
,
455 struct pipe_resource
*resource
,
456 const struct pipe_sampler_view
*templ
)
458 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
459 struct pipe_sampler_view
*view
=
460 pipe
->create_sampler_view(pipe
, resource
, templ
);
464 view
->context
= _pipe
;
469 dd_context_sampler_view_destroy(struct pipe_context
*_pipe
,
470 struct pipe_sampler_view
*view
)
472 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
474 pipe
->sampler_view_destroy(pipe
, view
);
477 static struct pipe_stream_output_target
*
478 dd_context_create_stream_output_target(struct pipe_context
*_pipe
,
479 struct pipe_resource
*res
,
480 unsigned buffer_offset
,
481 unsigned buffer_size
)
483 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
484 struct pipe_stream_output_target
*view
=
485 pipe
->create_stream_output_target(pipe
, res
, buffer_offset
,
490 view
->context
= _pipe
;
495 dd_context_stream_output_target_destroy(struct pipe_context
*_pipe
,
496 struct pipe_stream_output_target
*target
)
498 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
500 pipe
->stream_output_target_destroy(pipe
, target
);
504 /********************************************************************
509 dd_context_set_sampler_views(struct pipe_context
*_pipe
,
510 enum pipe_shader_type shader
,
511 unsigned start
, unsigned num
,
512 struct pipe_sampler_view
**views
)
514 struct dd_context
*dctx
= dd_context(_pipe
);
515 struct pipe_context
*pipe
= dctx
->pipe
;
517 safe_memcpy(&dctx
->draw_state
.sampler_views
[shader
][start
], views
,
518 sizeof(views
[0]) * num
);
519 pipe
->set_sampler_views(pipe
, shader
, start
, num
, views
);
523 dd_context_set_shader_images(struct pipe_context
*_pipe
,
524 enum pipe_shader_type shader
,
525 unsigned start
, unsigned num
,
526 const struct pipe_image_view
*views
)
528 struct dd_context
*dctx
= dd_context(_pipe
);
529 struct pipe_context
*pipe
= dctx
->pipe
;
531 safe_memcpy(&dctx
->draw_state
.shader_images
[shader
][start
], views
,
532 sizeof(views
[0]) * num
);
533 pipe
->set_shader_images(pipe
, shader
, start
, num
, views
);
537 dd_context_set_shader_buffers(struct pipe_context
*_pipe
, unsigned shader
,
538 unsigned start
, unsigned num_buffers
,
539 const struct pipe_shader_buffer
*buffers
)
541 struct dd_context
*dctx
= dd_context(_pipe
);
542 struct pipe_context
*pipe
= dctx
->pipe
;
544 safe_memcpy(&dctx
->draw_state
.shader_buffers
[shader
][start
], buffers
,
545 sizeof(buffers
[0]) * num_buffers
);
546 pipe
->set_shader_buffers(pipe
, shader
, start
, num_buffers
, buffers
);
550 dd_context_set_vertex_buffers(struct pipe_context
*_pipe
,
551 unsigned start
, unsigned num_buffers
,
552 const struct pipe_vertex_buffer
*buffers
)
554 struct dd_context
*dctx
= dd_context(_pipe
);
555 struct pipe_context
*pipe
= dctx
->pipe
;
557 safe_memcpy(&dctx
->draw_state
.vertex_buffers
[start
], buffers
,
558 sizeof(buffers
[0]) * num_buffers
);
559 pipe
->set_vertex_buffers(pipe
, start
, num_buffers
, buffers
);
563 dd_context_set_stream_output_targets(struct pipe_context
*_pipe
,
564 unsigned num_targets
,
565 struct pipe_stream_output_target
**tgs
,
566 const unsigned *offsets
)
568 struct dd_context
*dctx
= dd_context(_pipe
);
569 struct pipe_context
*pipe
= dctx
->pipe
;
570 struct dd_draw_state
*dstate
= &dctx
->draw_state
;
572 dstate
->num_so_targets
= num_targets
;
573 safe_memcpy(dstate
->so_targets
, tgs
, sizeof(*tgs
) * num_targets
);
574 safe_memcpy(dstate
->so_offsets
, offsets
, sizeof(*offsets
) * num_targets
);
575 pipe
->set_stream_output_targets(pipe
, num_targets
, tgs
, offsets
);
580 dd_context_fence_server_sync(struct pipe_context
*_pipe
,
581 struct pipe_fence_handle
*fence
)
583 struct dd_context
*dctx
= dd_context(_pipe
);
584 struct pipe_context
*pipe
= dctx
->pipe
;
586 pipe
->fence_server_sync(pipe
, fence
);
591 dd_context_create_fence_fd(struct pipe_context
*_pipe
,
592 struct pipe_fence_handle
**fence
,
594 enum pipe_fd_type type
)
596 struct dd_context
*dctx
= dd_context(_pipe
);
597 struct pipe_context
*pipe
= dctx
->pipe
;
599 pipe
->create_fence_fd(pipe
, fence
, fd
, type
);
604 dd_thread_join(struct dd_context
*dctx
)
606 mtx_lock(&dctx
->mutex
);
607 dctx
->kill_thread
= true;
608 cnd_signal(&dctx
->cond
);
609 mtx_unlock(&dctx
->mutex
);
610 thrd_join(dctx
->thread
, NULL
);
614 dd_context_destroy(struct pipe_context
*_pipe
)
616 struct dd_context
*dctx
= dd_context(_pipe
);
617 struct pipe_context
*pipe
= dctx
->pipe
;
619 dd_thread_join(dctx
);
620 mtx_destroy(&dctx
->mutex
);
621 cnd_destroy(&dctx
->cond
);
623 assert(list_empty(&dctx
->records
));
625 if (pipe
->set_log_context
) {
626 pipe
->set_log_context(pipe
, NULL
);
628 if (dd_screen(dctx
->base
.screen
)->dump_mode
== DD_DUMP_ALL_CALLS
) {
629 FILE *f
= dd_get_file_stream(dd_screen(dctx
->base
.screen
), 0);
631 fprintf(f
, "Remainder of driver log:\n\n");
634 u_log_new_page_print(&dctx
->log
, f
);
638 u_log_context_destroy(&dctx
->log
);
645 /********************************************************************
650 dd_context_texture_barrier(struct pipe_context
*_pipe
, unsigned flags
)
652 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
654 pipe
->texture_barrier(pipe
, flags
);
658 dd_context_memory_barrier(struct pipe_context
*_pipe
, unsigned flags
)
660 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
662 pipe
->memory_barrier(pipe
, flags
);
666 dd_context_resource_commit(struct pipe_context
*_pipe
,
667 struct pipe_resource
*resource
,
668 unsigned level
, struct pipe_box
*box
, bool commit
)
670 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
672 return pipe
->resource_commit(pipe
, resource
, level
, box
, commit
);
676 dd_context_get_sample_position(struct pipe_context
*_pipe
,
677 unsigned sample_count
, unsigned sample_index
,
680 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
682 return pipe
->get_sample_position(pipe
, sample_count
, sample_index
,
687 dd_context_invalidate_resource(struct pipe_context
*_pipe
,
688 struct pipe_resource
*resource
)
690 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
692 pipe
->invalidate_resource(pipe
, resource
);
695 static enum pipe_reset_status
696 dd_context_get_device_reset_status(struct pipe_context
*_pipe
)
698 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
700 return pipe
->get_device_reset_status(pipe
);
704 dd_context_set_device_reset_callback(struct pipe_context
*_pipe
,
705 const struct pipe_device_reset_callback
*cb
)
707 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
709 return pipe
->set_device_reset_callback(pipe
, cb
);
713 dd_context_emit_string_marker(struct pipe_context
*_pipe
,
714 const char *string
, int len
)
716 struct dd_context
*dctx
= dd_context(_pipe
);
717 struct pipe_context
*pipe
= dctx
->pipe
;
719 pipe
->emit_string_marker(pipe
, string
, len
);
720 dd_parse_apitrace_marker(string
, len
, &dctx
->draw_state
.apitrace_call_number
);
724 dd_context_dump_debug_state(struct pipe_context
*_pipe
, FILE *stream
,
727 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
729 return pipe
->dump_debug_state(pipe
, stream
, flags
);
733 dd_context_create_texture_handle(struct pipe_context
*_pipe
,
734 struct pipe_sampler_view
*view
,
735 const struct pipe_sampler_state
*state
)
737 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
739 return pipe
->create_texture_handle(pipe
, view
, state
);
743 dd_context_delete_texture_handle(struct pipe_context
*_pipe
, uint64_t handle
)
745 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
747 pipe
->delete_texture_handle(pipe
, handle
);
751 dd_context_make_texture_handle_resident(struct pipe_context
*_pipe
,
752 uint64_t handle
, bool resident
)
754 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
756 pipe
->make_texture_handle_resident(pipe
, handle
, resident
);
760 dd_context_create_image_handle(struct pipe_context
*_pipe
,
761 const struct pipe_image_view
*image
)
763 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
765 return pipe
->create_image_handle(pipe
, image
);
769 dd_context_delete_image_handle(struct pipe_context
*_pipe
, uint64_t handle
)
771 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
773 pipe
->delete_image_handle(pipe
, handle
);
777 dd_context_make_image_handle_resident(struct pipe_context
*_pipe
,
778 uint64_t handle
, unsigned access
,
781 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
783 pipe
->make_image_handle_resident(pipe
, handle
, access
, resident
);
787 dd_context_set_context_param(struct pipe_context
*_pipe
,
788 enum pipe_context_param param
,
791 struct pipe_context
*pipe
= dd_context(_pipe
)->pipe
;
793 pipe
->set_context_param(pipe
, param
, value
);
796 struct pipe_context
*
797 dd_context_create(struct dd_screen
*dscreen
, struct pipe_context
*pipe
)
799 struct dd_context
*dctx
;
804 dctx
= CALLOC_STRUCT(dd_context
);
809 dctx
->base
.priv
= pipe
->priv
; /* expose wrapped priv data */
810 dctx
->base
.screen
= &dscreen
->base
;
811 dctx
->base
.stream_uploader
= pipe
->stream_uploader
;
812 dctx
->base
.const_uploader
= pipe
->const_uploader
;
814 dctx
->base
.destroy
= dd_context_destroy
;
816 CTX_INIT(render_condition
);
817 CTX_INIT(create_query
);
818 CTX_INIT(create_batch_query
);
819 CTX_INIT(destroy_query
);
820 CTX_INIT(begin_query
);
822 CTX_INIT(get_query_result
);
823 CTX_INIT(set_active_query_state
);
824 CTX_INIT(create_blend_state
);
825 CTX_INIT(bind_blend_state
);
826 CTX_INIT(delete_blend_state
);
827 CTX_INIT(create_sampler_state
);
828 CTX_INIT(bind_sampler_states
);
829 CTX_INIT(delete_sampler_state
);
830 CTX_INIT(create_rasterizer_state
);
831 CTX_INIT(bind_rasterizer_state
);
832 CTX_INIT(delete_rasterizer_state
);
833 CTX_INIT(create_depth_stencil_alpha_state
);
834 CTX_INIT(bind_depth_stencil_alpha_state
);
835 CTX_INIT(delete_depth_stencil_alpha_state
);
836 CTX_INIT(create_fs_state
);
837 CTX_INIT(bind_fs_state
);
838 CTX_INIT(delete_fs_state
);
839 CTX_INIT(create_vs_state
);
840 CTX_INIT(bind_vs_state
);
841 CTX_INIT(delete_vs_state
);
842 CTX_INIT(create_gs_state
);
843 CTX_INIT(bind_gs_state
);
844 CTX_INIT(delete_gs_state
);
845 CTX_INIT(create_tcs_state
);
846 CTX_INIT(bind_tcs_state
);
847 CTX_INIT(delete_tcs_state
);
848 CTX_INIT(create_tes_state
);
849 CTX_INIT(bind_tes_state
);
850 CTX_INIT(delete_tes_state
);
851 CTX_INIT(create_compute_state
);
852 CTX_INIT(bind_compute_state
);
853 CTX_INIT(delete_compute_state
);
854 CTX_INIT(create_vertex_elements_state
);
855 CTX_INIT(bind_vertex_elements_state
);
856 CTX_INIT(delete_vertex_elements_state
);
857 CTX_INIT(set_blend_color
);
858 CTX_INIT(set_stencil_ref
);
859 CTX_INIT(set_sample_mask
);
860 CTX_INIT(set_min_samples
);
861 CTX_INIT(set_clip_state
);
862 CTX_INIT(set_constant_buffer
);
863 CTX_INIT(set_framebuffer_state
);
864 CTX_INIT(set_polygon_stipple
);
865 CTX_INIT(set_scissor_states
);
866 CTX_INIT(set_viewport_states
);
867 CTX_INIT(set_sampler_views
);
868 CTX_INIT(set_tess_state
);
869 CTX_INIT(set_shader_buffers
);
870 CTX_INIT(set_shader_images
);
871 CTX_INIT(set_vertex_buffers
);
872 CTX_INIT(set_window_rectangles
);
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_fence_fd
);
877 CTX_INIT(fence_server_sync
);
878 CTX_INIT(create_sampler_view
);
879 CTX_INIT(sampler_view_destroy
);
880 CTX_INIT(create_surface
);
881 CTX_INIT(surface_destroy
);
882 CTX_INIT(texture_barrier
);
883 CTX_INIT(memory_barrier
);
884 CTX_INIT(resource_commit
);
885 /* create_video_codec */
886 /* create_video_buffer */
887 /* set_compute_resources */
888 /* set_global_binding */
889 CTX_INIT(get_sample_position
);
890 CTX_INIT(invalidate_resource
);
891 CTX_INIT(get_device_reset_status
);
892 CTX_INIT(set_device_reset_callback
);
893 CTX_INIT(dump_debug_state
);
894 CTX_INIT(emit_string_marker
);
895 CTX_INIT(create_texture_handle
);
896 CTX_INIT(delete_texture_handle
);
897 CTX_INIT(make_texture_handle_resident
);
898 CTX_INIT(create_image_handle
);
899 CTX_INIT(delete_image_handle
);
900 CTX_INIT(make_image_handle_resident
);
901 CTX_INIT(set_context_param
);
903 dd_init_draw_functions(dctx
);
905 u_log_context_init(&dctx
->log
);
906 if (pipe
->set_log_context
)
907 pipe
->set_log_context(pipe
, &dctx
->log
);
909 dctx
->draw_state
.sample_mask
= ~0;
911 list_inithead(&dctx
->records
);
912 (void) mtx_init(&dctx
->mutex
, mtx_plain
);
913 (void) cnd_init(&dctx
->cond
);
914 dctx
->thread
= u_thread_create(dd_thread_main
, dctx
);
916 mtx_destroy(&dctx
->mutex
);