1 /**************************************************************************
3 * Copyright 2009 VMware, Inc.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 **************************************************************************/
29 #include "pipe/p_context.h"
31 #include "util/u_format.h"
32 #include "util/u_memory.h"
33 #include "util/u_inlines.h"
35 #include "glhd_context.h"
36 #include "glhd_objects.h"
40 galahad_destroy(struct pipe_context *_pipe)
42 struct galahad_context *glhd_pipe = galahad_context(_pipe);
43 struct pipe_context *pipe = glhd_pipe->pipe;
51 galahad_draw_vbo(struct pipe_context *_pipe,
52 const struct pipe_draw_info *info)
54 struct galahad_context *glhd_pipe = galahad_context(_pipe);
55 struct pipe_context *pipe = glhd_pipe->pipe;
57 /* XXX we should check that all bound resources are unmapped
61 pipe->draw_vbo(pipe, info);
64 static struct pipe_query *
65 galahad_create_query(struct pipe_context *_pipe,
68 struct galahad_context *glhd_pipe = galahad_context(_pipe);
69 struct pipe_context *pipe = glhd_pipe->pipe;
71 if (query_type == PIPE_QUERY_OCCLUSION_COUNTER &&
72 !pipe->screen->get_param(pipe->screen, PIPE_CAP_OCCLUSION_QUERY)) {
73 glhd_error("Occlusion query requested but not supported");
76 if (query_type == PIPE_QUERY_TIME_ELAPSED &&
77 !pipe->screen->get_param(pipe->screen, PIPE_CAP_TIMER_QUERY)) {
78 glhd_error("Timer query requested but not supported");
81 return pipe->create_query(pipe,
86 galahad_destroy_query(struct pipe_context *_pipe,
87 struct pipe_query *query)
89 struct galahad_context *glhd_pipe = galahad_context(_pipe);
90 struct pipe_context *pipe = glhd_pipe->pipe;
92 pipe->destroy_query(pipe,
97 galahad_begin_query(struct pipe_context *_pipe,
98 struct pipe_query *query)
100 struct galahad_context *glhd_pipe = galahad_context(_pipe);
101 struct pipe_context *pipe = glhd_pipe->pipe;
103 pipe->begin_query(pipe,
108 galahad_end_query(struct pipe_context *_pipe,
109 struct pipe_query *query)
111 struct galahad_context *glhd_pipe = galahad_context(_pipe);
112 struct pipe_context *pipe = glhd_pipe->pipe;
114 pipe->end_query(pipe,
119 galahad_get_query_result(struct pipe_context *_pipe,
120 struct pipe_query *query,
124 struct galahad_context *glhd_pipe = galahad_context(_pipe);
125 struct pipe_context *pipe = glhd_pipe->pipe;
127 return pipe->get_query_result(pipe,
134 galahad_create_blend_state(struct pipe_context *_pipe,
135 const struct pipe_blend_state *blend)
137 struct galahad_context *glhd_pipe = galahad_context(_pipe);
138 struct pipe_context *pipe = glhd_pipe->pipe;
140 if (blend->logicop_enable) {
141 if (blend->rt[0].blend_enable) {
142 glhd_warn("Blending enabled for render target 0, but logicops "
147 return pipe->create_blend_state(pipe,
152 galahad_bind_blend_state(struct pipe_context *_pipe,
155 struct galahad_context *glhd_pipe = galahad_context(_pipe);
156 struct pipe_context *pipe = glhd_pipe->pipe;
158 pipe->bind_blend_state(pipe,
163 galahad_delete_blend_state(struct pipe_context *_pipe,
166 struct galahad_context *glhd_pipe = galahad_context(_pipe);
167 struct pipe_context *pipe = glhd_pipe->pipe;
169 pipe->delete_blend_state(pipe,
174 galahad_create_sampler_state(struct pipe_context *_pipe,
175 const struct pipe_sampler_state *sampler)
177 struct galahad_context *glhd_pipe = galahad_context(_pipe);
178 struct pipe_context *pipe = glhd_pipe->pipe;
180 return pipe->create_sampler_state(pipe,
185 galahad_bind_fragment_sampler_states(struct pipe_context *_pipe,
186 unsigned num_samplers,
189 struct galahad_context *glhd_pipe = galahad_context(_pipe);
190 struct pipe_context *pipe = glhd_pipe->pipe;
192 if (num_samplers > PIPE_MAX_SAMPLERS) {
193 glhd_error("%u fragment samplers requested, "
194 "but only %u are permitted by API",
195 num_samplers, PIPE_MAX_SAMPLERS);
198 pipe->bind_fragment_sampler_states(pipe,
204 galahad_bind_vertex_sampler_states(struct pipe_context *_pipe,
205 unsigned num_samplers,
208 struct galahad_context *glhd_pipe = galahad_context(_pipe);
209 struct pipe_context *pipe = glhd_pipe->pipe;
211 if (num_samplers > PIPE_MAX_VERTEX_SAMPLERS) {
212 glhd_error("%u vertex samplers requested, "
213 "but only %u are permitted by API",
214 num_samplers, PIPE_MAX_VERTEX_SAMPLERS);
217 pipe->bind_vertex_sampler_states(pipe,
223 galahad_delete_sampler_state(struct pipe_context *_pipe,
226 struct galahad_context *glhd_pipe = galahad_context(_pipe);
227 struct pipe_context *pipe = glhd_pipe->pipe;
229 pipe->delete_sampler_state(pipe,
234 galahad_create_rasterizer_state(struct pipe_context *_pipe,
235 const struct pipe_rasterizer_state *rasterizer)
237 struct galahad_context *glhd_pipe = galahad_context(_pipe);
238 struct pipe_context *pipe = glhd_pipe->pipe;
240 if (rasterizer->point_quad_rasterization) {
241 if (rasterizer->point_smooth) {
242 glhd_warn("Point smoothing requested but ignored");
245 if (rasterizer->sprite_coord_enable) {
246 glhd_warn("Point sprites requested but ignored");
250 return pipe->create_rasterizer_state(pipe,
255 galahad_bind_rasterizer_state(struct pipe_context *_pipe,
258 struct galahad_context *glhd_pipe = galahad_context(_pipe);
259 struct pipe_context *pipe = glhd_pipe->pipe;
261 pipe->bind_rasterizer_state(pipe,
266 galahad_delete_rasterizer_state(struct pipe_context *_pipe,
269 struct galahad_context *glhd_pipe = galahad_context(_pipe);
270 struct pipe_context *pipe = glhd_pipe->pipe;
272 pipe->delete_rasterizer_state(pipe,
277 galahad_create_depth_stencil_alpha_state(struct pipe_context *_pipe,
278 const struct pipe_depth_stencil_alpha_state *depth_stencil_alpha)
280 struct galahad_context *glhd_pipe = galahad_context(_pipe);
281 struct pipe_context *pipe = glhd_pipe->pipe;
283 return pipe->create_depth_stencil_alpha_state(pipe,
284 depth_stencil_alpha);
288 galahad_bind_depth_stencil_alpha_state(struct pipe_context *_pipe,
289 void *depth_stencil_alpha)
291 struct galahad_context *glhd_pipe = galahad_context(_pipe);
292 struct pipe_context *pipe = glhd_pipe->pipe;
294 pipe->bind_depth_stencil_alpha_state(pipe,
295 depth_stencil_alpha);
299 galahad_delete_depth_stencil_alpha_state(struct pipe_context *_pipe,
300 void *depth_stencil_alpha)
302 struct galahad_context *glhd_pipe = galahad_context(_pipe);
303 struct pipe_context *pipe = glhd_pipe->pipe;
305 pipe->delete_depth_stencil_alpha_state(pipe,
306 depth_stencil_alpha);
310 galahad_create_fs_state(struct pipe_context *_pipe,
311 const struct pipe_shader_state *fs)
313 struct galahad_context *glhd_pipe = galahad_context(_pipe);
314 struct pipe_context *pipe = glhd_pipe->pipe;
316 return pipe->create_fs_state(pipe,
321 galahad_bind_fs_state(struct pipe_context *_pipe,
324 struct galahad_context *glhd_pipe = galahad_context(_pipe);
325 struct pipe_context *pipe = glhd_pipe->pipe;
327 pipe->bind_fs_state(pipe,
332 galahad_delete_fs_state(struct pipe_context *_pipe,
335 struct galahad_context *glhd_pipe = galahad_context(_pipe);
336 struct pipe_context *pipe = glhd_pipe->pipe;
338 pipe->delete_fs_state(pipe,
343 galahad_create_vs_state(struct pipe_context *_pipe,
344 const struct pipe_shader_state *vs)
346 struct galahad_context *glhd_pipe = galahad_context(_pipe);
347 struct pipe_context *pipe = glhd_pipe->pipe;
349 return pipe->create_vs_state(pipe,
354 galahad_bind_vs_state(struct pipe_context *_pipe,
357 struct galahad_context *glhd_pipe = galahad_context(_pipe);
358 struct pipe_context *pipe = glhd_pipe->pipe;
360 pipe->bind_vs_state(pipe,
365 galahad_delete_vs_state(struct pipe_context *_pipe,
368 struct galahad_context *glhd_pipe = galahad_context(_pipe);
369 struct pipe_context *pipe = glhd_pipe->pipe;
371 pipe->delete_vs_state(pipe,
377 galahad_create_vertex_elements_state(struct pipe_context *_pipe,
378 unsigned num_elements,
379 const struct pipe_vertex_element *vertex_elements)
381 struct galahad_context *glhd_pipe = galahad_context(_pipe);
382 struct pipe_context *pipe = glhd_pipe->pipe;
384 /* XXX check if stride lines up with element size, at least for floats */
386 return pipe->create_vertex_elements_state(pipe,
392 galahad_bind_vertex_elements_state(struct pipe_context *_pipe,
395 struct galahad_context *glhd_pipe = galahad_context(_pipe);
396 struct pipe_context *pipe = glhd_pipe->pipe;
398 pipe->bind_vertex_elements_state(pipe,
403 galahad_delete_vertex_elements_state(struct pipe_context *_pipe,
406 struct galahad_context *glhd_pipe = galahad_context(_pipe);
407 struct pipe_context *pipe = glhd_pipe->pipe;
409 pipe->delete_vertex_elements_state(pipe,
414 galahad_set_blend_color(struct pipe_context *_pipe,
415 const struct pipe_blend_color *blend_color)
417 struct galahad_context *glhd_pipe = galahad_context(_pipe);
418 struct pipe_context *pipe = glhd_pipe->pipe;
420 pipe->set_blend_color(pipe,
425 galahad_set_stencil_ref(struct pipe_context *_pipe,
426 const struct pipe_stencil_ref *stencil_ref)
428 struct galahad_context *glhd_pipe = galahad_context(_pipe);
429 struct pipe_context *pipe = glhd_pipe->pipe;
431 pipe->set_stencil_ref(pipe,
436 galahad_set_clip_state(struct pipe_context *_pipe,
437 const struct pipe_clip_state *clip)
439 struct galahad_context *glhd_pipe = galahad_context(_pipe);
440 struct pipe_context *pipe = glhd_pipe->pipe;
442 pipe->set_clip_state(pipe,
447 galahad_set_sample_mask(struct pipe_context *_pipe,
448 unsigned sample_mask)
450 struct galahad_context *glhd_pipe = galahad_context(_pipe);
451 struct pipe_context *pipe = glhd_pipe->pipe;
453 pipe->set_sample_mask(pipe,
458 galahad_set_constant_buffer(struct pipe_context *_pipe,
461 struct pipe_resource *_resource)
463 struct galahad_context *glhd_pipe = galahad_context(_pipe);
464 struct pipe_context *pipe = glhd_pipe->pipe;
465 struct pipe_resource *unwrapped_resource;
466 struct pipe_resource *resource = NULL;
468 if (shader >= PIPE_SHADER_TYPES) {
469 glhd_error("Unknown shader type %u", shader);
474 pipe->screen->get_shader_param(pipe->screen, shader, PIPE_SHADER_CAP_MAX_CONST_BUFFERS)) {
475 glhd_error("Access to constant buffer %u requested, "
476 "but only %d are supported",
478 pipe->screen->get_shader_param(pipe->screen, shader, PIPE_SHADER_CAP_MAX_CONST_BUFFERS));
481 /* XXX hmm? unwrap the input state */
483 unwrapped_resource = galahad_resource_unwrap(_resource);
484 resource = unwrapped_resource;
487 pipe->set_constant_buffer(pipe,
494 galahad_set_framebuffer_state(struct pipe_context *_pipe,
495 const struct pipe_framebuffer_state *_state)
497 struct galahad_context *glhd_pipe = galahad_context(_pipe);
498 struct pipe_context *pipe = glhd_pipe->pipe;
499 struct pipe_framebuffer_state unwrapped_state;
500 struct pipe_framebuffer_state *state = NULL;
503 if (_state->nr_cbufs > PIPE_MAX_COLOR_BUFS) {
504 glhd_error("%d render targets bound, but only %d are permitted by API",
505 _state->nr_cbufs, PIPE_MAX_COLOR_BUFS);
506 } else if (_state->nr_cbufs >
507 pipe->screen->get_param(pipe->screen, PIPE_CAP_MAX_RENDER_TARGETS)) {
508 glhd_warn("%d render targets bound, but only %d are supported",
510 pipe->screen->get_param(pipe->screen, PIPE_CAP_MAX_RENDER_TARGETS));
513 /* unwrap the input state */
515 memcpy(&unwrapped_state, _state, sizeof(unwrapped_state));
516 for(i = 0; i < _state->nr_cbufs; i++)
517 unwrapped_state.cbufs[i] = galahad_surface_unwrap(_state->cbufs[i]);
518 for (; i < PIPE_MAX_COLOR_BUFS; i++)
519 unwrapped_state.cbufs[i] = NULL;
520 unwrapped_state.zsbuf = galahad_surface_unwrap(_state->zsbuf);
521 state = &unwrapped_state;
524 pipe->set_framebuffer_state(pipe,
529 galahad_set_polygon_stipple(struct pipe_context *_pipe,
530 const struct pipe_poly_stipple *poly_stipple)
532 struct galahad_context *glhd_pipe = galahad_context(_pipe);
533 struct pipe_context *pipe = glhd_pipe->pipe;
535 pipe->set_polygon_stipple(pipe,
540 galahad_set_scissor_state(struct pipe_context *_pipe,
541 const struct pipe_scissor_state *scissor)
543 struct galahad_context *glhd_pipe = galahad_context(_pipe);
544 struct pipe_context *pipe = glhd_pipe->pipe;
546 pipe->set_scissor_state(pipe,
551 galahad_set_viewport_state(struct pipe_context *_pipe,
552 const struct pipe_viewport_state *viewport)
554 struct galahad_context *glhd_pipe = galahad_context(_pipe);
555 struct pipe_context *pipe = glhd_pipe->pipe;
557 pipe->set_viewport_state(pipe,
562 galahad_set_fragment_sampler_views(struct pipe_context *_pipe,
564 struct pipe_sampler_view **_views)
566 struct galahad_context *glhd_pipe = galahad_context(_pipe);
567 struct pipe_context *pipe = glhd_pipe->pipe;
568 struct pipe_sampler_view *unwrapped_views[PIPE_MAX_SAMPLERS];
569 struct pipe_sampler_view **views = NULL;
573 for (i = 0; i < num; i++)
574 unwrapped_views[i] = galahad_sampler_view_unwrap(_views[i]);
575 for (; i < PIPE_MAX_SAMPLERS; i++)
576 unwrapped_views[i] = NULL;
578 views = unwrapped_views;
581 pipe->set_fragment_sampler_views(pipe, num, views);
585 galahad_set_vertex_sampler_views(struct pipe_context *_pipe,
587 struct pipe_sampler_view **_views)
589 struct galahad_context *glhd_pipe = galahad_context(_pipe);
590 struct pipe_context *pipe = glhd_pipe->pipe;
591 struct pipe_sampler_view *unwrapped_views[PIPE_MAX_VERTEX_SAMPLERS];
592 struct pipe_sampler_view **views = NULL;
596 for (i = 0; i < num; i++)
597 unwrapped_views[i] = galahad_sampler_view_unwrap(_views[i]);
598 for (; i < PIPE_MAX_VERTEX_SAMPLERS; i++)
599 unwrapped_views[i] = NULL;
601 views = unwrapped_views;
604 pipe->set_vertex_sampler_views(pipe, num, views);
608 galahad_set_vertex_buffers(struct pipe_context *_pipe,
609 unsigned num_buffers,
610 const struct pipe_vertex_buffer *_buffers)
612 struct galahad_context *glhd_pipe = galahad_context(_pipe);
613 struct pipe_context *pipe = glhd_pipe->pipe;
614 struct pipe_vertex_buffer unwrapped_buffers[PIPE_MAX_SHADER_INPUTS];
615 struct pipe_vertex_buffer *buffers = NULL;
619 memcpy(unwrapped_buffers, _buffers, num_buffers * sizeof(*_buffers));
620 for (i = 0; i < num_buffers; i++)
621 unwrapped_buffers[i].buffer = galahad_resource_unwrap(_buffers[i].buffer);
622 buffers = unwrapped_buffers;
625 pipe->set_vertex_buffers(pipe,
631 galahad_set_index_buffer(struct pipe_context *_pipe,
632 const struct pipe_index_buffer *_ib)
634 struct galahad_context *glhd_pipe = galahad_context(_pipe);
635 struct pipe_context *pipe = glhd_pipe->pipe;
636 struct pipe_index_buffer unwrapped_ib, *ib = NULL;
639 switch (_ib->index_size) {
645 glhd_warn("index buffer %p has unrecognized index size %d",
646 (void *) _ib->buffer, _ib->index_size);
650 else if (_ib->offset || _ib->index_size) {
651 glhd_warn("non-indexed state with index offset %d and index size %d",
652 _ib->offset, _ib->index_size);
657 unwrapped_ib.buffer = galahad_resource_unwrap(_ib->buffer);
661 pipe->set_index_buffer(pipe, ib);
665 galahad_resource_copy_region(struct pipe_context *_pipe,
666 struct pipe_resource *_dst,
671 struct pipe_resource *_src,
673 const struct pipe_box *src_box)
675 struct galahad_context *glhd_pipe = galahad_context(_pipe);
676 struct galahad_resource *glhd_resource_dst = galahad_resource(_dst);
677 struct galahad_resource *glhd_resource_src = galahad_resource(_src);
678 struct pipe_context *pipe = glhd_pipe->pipe;
679 struct pipe_resource *dst = glhd_resource_dst->resource;
680 struct pipe_resource *src = glhd_resource_src->resource;
682 if (_dst->format != _src->format) {
683 glhd_warn("Format mismatch: Source is %s, destination is %s",
684 util_format_short_name(_src->format),
685 util_format_short_name(_dst->format));
688 if ((_src->target == PIPE_BUFFER && _dst->target != PIPE_BUFFER) ||
689 (_src->target != PIPE_BUFFER && _dst->target == PIPE_BUFFER)) {
690 glhd_warn("Resource target mismatch: Source is %i, destination is %i",
691 _src->target, _dst->target);
694 pipe->resource_copy_region(pipe,
706 galahad_clear(struct pipe_context *_pipe,
712 struct galahad_context *glhd_pipe = galahad_context(_pipe);
713 struct pipe_context *pipe = glhd_pipe->pipe;
723 galahad_clear_render_target(struct pipe_context *_pipe,
724 struct pipe_surface *_dst,
726 unsigned dstx, unsigned dsty,
727 unsigned width, unsigned height)
729 struct galahad_context *glhd_pipe = galahad_context(_pipe);
730 struct galahad_surface *glhd_surface_dst = galahad_surface(_dst);
731 struct pipe_context *pipe = glhd_pipe->pipe;
732 struct pipe_surface *dst = glhd_surface_dst->surface;
734 pipe->clear_render_target(pipe,
743 galahad_clear_depth_stencil(struct pipe_context *_pipe,
744 struct pipe_surface *_dst,
745 unsigned clear_flags,
748 unsigned dstx, unsigned dsty,
749 unsigned width, unsigned height)
751 struct galahad_context *glhd_pipe = galahad_context(_pipe);
752 struct galahad_surface *glhd_surface_dst = galahad_surface(_dst);
753 struct pipe_context *pipe = glhd_pipe->pipe;
754 struct pipe_surface *dst = glhd_surface_dst->surface;
756 pipe->clear_depth_stencil(pipe,
769 galahad_flush(struct pipe_context *_pipe,
770 struct pipe_fence_handle **fence)
772 struct galahad_context *glhd_pipe = galahad_context(_pipe);
773 struct pipe_context *pipe = glhd_pipe->pipe;
779 static struct pipe_sampler_view *
780 galahad_context_create_sampler_view(struct pipe_context *_pipe,
781 struct pipe_resource *_resource,
782 const struct pipe_sampler_view *templ)
784 struct galahad_context *glhd_context = galahad_context(_pipe);
785 struct galahad_resource *glhd_resource = galahad_resource(_resource);
786 struct pipe_context *pipe = glhd_context->pipe;
787 struct pipe_resource *resource = glhd_resource->resource;
788 struct pipe_sampler_view *result;
790 result = pipe->create_sampler_view(pipe,
795 return galahad_sampler_view_create(glhd_context, glhd_resource, result);
800 galahad_context_sampler_view_destroy(struct pipe_context *_pipe,
801 struct pipe_sampler_view *_view)
803 galahad_sampler_view_destroy(galahad_context(_pipe),
804 galahad_sampler_view(_view));
807 static struct pipe_surface *
808 galahad_context_create_surface(struct pipe_context *_pipe,
809 struct pipe_resource *_resource,
810 const struct pipe_surface *templ)
812 struct galahad_context *glhd_context = galahad_context(_pipe);
813 struct galahad_resource *glhd_resource = galahad_resource(_resource);
814 struct pipe_context *pipe = glhd_context->pipe;
815 struct pipe_resource *resource = glhd_resource->resource;
816 struct pipe_surface *result;
818 result = pipe->create_surface(pipe,
823 return galahad_surface_create(glhd_context, glhd_resource, result);
828 galahad_context_surface_destroy(struct pipe_context *_pipe,
829 struct pipe_surface *_surface)
831 galahad_surface_destroy(galahad_context(_pipe),
832 galahad_surface(_surface));
837 static struct pipe_transfer *
838 galahad_context_get_transfer(struct pipe_context *_context,
839 struct pipe_resource *_resource,
842 const struct pipe_box *box)
844 struct galahad_context *glhd_context = galahad_context(_context);
845 struct galahad_resource *glhd_resource = galahad_resource(_resource);
846 struct pipe_context *context = glhd_context->pipe;
847 struct pipe_resource *resource = glhd_resource->resource;
848 struct pipe_transfer *result;
850 result = context->get_transfer(context,
857 return galahad_transfer_create(glhd_context, glhd_resource, result);
862 galahad_context_transfer_destroy(struct pipe_context *_pipe,
863 struct pipe_transfer *_transfer)
865 galahad_transfer_destroy(galahad_context(_pipe),
866 galahad_transfer(_transfer));
870 galahad_context_transfer_map(struct pipe_context *_context,
871 struct pipe_transfer *_transfer)
873 struct galahad_context *glhd_context = galahad_context(_context);
874 struct galahad_transfer *glhd_transfer = galahad_transfer(_transfer);
875 struct pipe_context *context = glhd_context->pipe;
876 struct pipe_transfer *transfer = glhd_transfer->transfer;
878 struct galahad_resource *glhd_resource = galahad_resource(_transfer->resource);
880 glhd_resource->map_count++;
882 return context->transfer_map(context,
889 galahad_context_transfer_flush_region(struct pipe_context *_context,
890 struct pipe_transfer *_transfer,
891 const struct pipe_box *box)
893 struct galahad_context *glhd_context = galahad_context(_context);
894 struct galahad_transfer *glhd_transfer = galahad_transfer(_transfer);
895 struct pipe_context *context = glhd_context->pipe;
896 struct pipe_transfer *transfer = glhd_transfer->transfer;
898 context->transfer_flush_region(context,
905 galahad_context_transfer_unmap(struct pipe_context *_context,
906 struct pipe_transfer *_transfer)
908 struct galahad_context *glhd_context = galahad_context(_context);
909 struct galahad_transfer *glhd_transfer = galahad_transfer(_transfer);
910 struct pipe_context *context = glhd_context->pipe;
911 struct pipe_transfer *transfer = glhd_transfer->transfer;
912 struct galahad_resource *glhd_resource = galahad_resource(_transfer->resource);
914 if (glhd_resource->map_count < 1) {
915 glhd_warn("context::transfer_unmap() called too many times"
916 " (count = %d)\n", glhd_resource->map_count);
919 glhd_resource->map_count--;
921 context->transfer_unmap(context,
927 galahad_context_transfer_inline_write(struct pipe_context *_context,
928 struct pipe_resource *_resource,
931 const struct pipe_box *box,
934 unsigned slice_stride)
936 struct galahad_context *glhd_context = galahad_context(_context);
937 struct galahad_resource *glhd_resource = galahad_resource(_resource);
938 struct pipe_context *context = glhd_context->pipe;
939 struct pipe_resource *resource = glhd_resource->resource;
941 context->transfer_inline_write(context,
952 static void galahad_redefine_user_buffer(struct pipe_context *_context,
953 struct pipe_resource *_resource,
954 unsigned offset, unsigned size)
956 struct galahad_context *glhd_context = galahad_context(_context);
957 struct galahad_resource *glhd_resource = galahad_resource(_resource);
958 struct pipe_context *context = glhd_context->pipe;
959 struct pipe_resource *resource = glhd_resource->resource;
961 context->redefine_user_buffer(context, resource, offset, size);
965 struct pipe_context *
966 galahad_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
968 struct galahad_context *glhd_pipe;
969 (void)galahad_screen(_screen);
971 glhd_pipe = CALLOC_STRUCT(galahad_context);
976 glhd_pipe->base.winsys = NULL;
977 glhd_pipe->base.screen = _screen;
978 glhd_pipe->base.priv = pipe->priv; /* expose wrapped data */
979 glhd_pipe->base.draw = NULL;
981 glhd_pipe->base.destroy = galahad_destroy;
982 glhd_pipe->base.draw_vbo = galahad_draw_vbo;
983 glhd_pipe->base.create_query = galahad_create_query;
984 glhd_pipe->base.destroy_query = galahad_destroy_query;
985 glhd_pipe->base.begin_query = galahad_begin_query;
986 glhd_pipe->base.end_query = galahad_end_query;
987 glhd_pipe->base.get_query_result = galahad_get_query_result;
988 glhd_pipe->base.create_blend_state = galahad_create_blend_state;
989 glhd_pipe->base.bind_blend_state = galahad_bind_blend_state;
990 glhd_pipe->base.delete_blend_state = galahad_delete_blend_state;
991 glhd_pipe->base.create_sampler_state = galahad_create_sampler_state;
992 glhd_pipe->base.bind_fragment_sampler_states = galahad_bind_fragment_sampler_states;
993 glhd_pipe->base.bind_vertex_sampler_states = galahad_bind_vertex_sampler_states;
994 glhd_pipe->base.delete_sampler_state = galahad_delete_sampler_state;
995 glhd_pipe->base.create_rasterizer_state = galahad_create_rasterizer_state;
996 glhd_pipe->base.bind_rasterizer_state = galahad_bind_rasterizer_state;
997 glhd_pipe->base.delete_rasterizer_state = galahad_delete_rasterizer_state;
998 glhd_pipe->base.create_depth_stencil_alpha_state = galahad_create_depth_stencil_alpha_state;
999 glhd_pipe->base.bind_depth_stencil_alpha_state = galahad_bind_depth_stencil_alpha_state;
1000 glhd_pipe->base.delete_depth_stencil_alpha_state = galahad_delete_depth_stencil_alpha_state;
1001 glhd_pipe->base.create_fs_state = galahad_create_fs_state;
1002 glhd_pipe->base.bind_fs_state = galahad_bind_fs_state;
1003 glhd_pipe->base.delete_fs_state = galahad_delete_fs_state;
1004 glhd_pipe->base.create_vs_state = galahad_create_vs_state;
1005 glhd_pipe->base.bind_vs_state = galahad_bind_vs_state;
1006 glhd_pipe->base.delete_vs_state = galahad_delete_vs_state;
1007 glhd_pipe->base.create_vertex_elements_state = galahad_create_vertex_elements_state;
1008 glhd_pipe->base.bind_vertex_elements_state = galahad_bind_vertex_elements_state;
1009 glhd_pipe->base.delete_vertex_elements_state = galahad_delete_vertex_elements_state;
1010 glhd_pipe->base.set_blend_color = galahad_set_blend_color;
1011 glhd_pipe->base.set_stencil_ref = galahad_set_stencil_ref;
1012 glhd_pipe->base.set_clip_state = galahad_set_clip_state;
1013 glhd_pipe->base.set_sample_mask = galahad_set_sample_mask;
1014 glhd_pipe->base.set_constant_buffer = galahad_set_constant_buffer;
1015 glhd_pipe->base.set_framebuffer_state = galahad_set_framebuffer_state;
1016 glhd_pipe->base.set_polygon_stipple = galahad_set_polygon_stipple;
1017 glhd_pipe->base.set_scissor_state = galahad_set_scissor_state;
1018 glhd_pipe->base.set_viewport_state = galahad_set_viewport_state;
1019 glhd_pipe->base.set_fragment_sampler_views = galahad_set_fragment_sampler_views;
1020 glhd_pipe->base.set_vertex_sampler_views = galahad_set_vertex_sampler_views;
1021 glhd_pipe->base.set_vertex_buffers = galahad_set_vertex_buffers;
1022 glhd_pipe->base.set_index_buffer = galahad_set_index_buffer;
1023 glhd_pipe->base.resource_copy_region = galahad_resource_copy_region;
1024 glhd_pipe->base.clear = galahad_clear;
1025 glhd_pipe->base.clear_render_target = galahad_clear_render_target;
1026 glhd_pipe->base.clear_depth_stencil = galahad_clear_depth_stencil;
1027 glhd_pipe->base.flush = galahad_flush;
1028 glhd_pipe->base.create_sampler_view = galahad_context_create_sampler_view;
1029 glhd_pipe->base.sampler_view_destroy = galahad_context_sampler_view_destroy;
1030 glhd_pipe->base.create_surface = galahad_context_create_surface;
1031 glhd_pipe->base.surface_destroy = galahad_context_surface_destroy;
1032 glhd_pipe->base.get_transfer = galahad_context_get_transfer;
1033 glhd_pipe->base.transfer_destroy = galahad_context_transfer_destroy;
1034 glhd_pipe->base.transfer_map = galahad_context_transfer_map;
1035 glhd_pipe->base.transfer_unmap = galahad_context_transfer_unmap;
1036 glhd_pipe->base.transfer_flush_region = galahad_context_transfer_flush_region;
1037 glhd_pipe->base.transfer_inline_write = galahad_context_transfer_inline_write;
1038 glhd_pipe->base.redefine_user_buffer = galahad_redefine_user_buffer;
1040 glhd_pipe->pipe = pipe;
1042 glhd_warn("Created context %p", (void *) glhd_pipe);
1044 return &glhd_pipe->base;