1/**************************************************************************
2 *
3 * Copyright 2009 VMware, Inc.
4 * All Rights Reserved.
5 *
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:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
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.
25 *
26 **************************************************************************/
27
28
29#include "pipe/p_context.h"
30#include "util/u_memory.h"
31#include "util/u_inlines.h"
32
33#include "id_context.h"
34#include "id_objects.h"
35
36
37static void
38identity_destroy(struct pipe_context *_pipe)
39{
40   struct identity_context *id_pipe = identity_context(_pipe);
41   struct pipe_context *pipe = id_pipe->pipe;
42
43   pipe->destroy(pipe);
44
45   FREE(id_pipe);
46}
47
48static void
49identity_draw_vbo(struct pipe_context *_pipe,
50                  const struct pipe_draw_info *info)
51{
52   struct identity_context *id_pipe = identity_context(_pipe);
53   struct pipe_context *pipe = id_pipe->pipe;
54
55   pipe->draw_vbo(pipe, info);
56}
57
58static struct pipe_query *
59identity_create_query(struct pipe_context *_pipe,
60                      unsigned query_type)
61{
62   struct identity_context *id_pipe = identity_context(_pipe);
63   struct pipe_context *pipe = id_pipe->pipe;
64
65   return pipe->create_query(pipe,
66                             query_type);
67}
68
69static void
70identity_destroy_query(struct pipe_context *_pipe,
71                       struct pipe_query *query)
72{
73   struct identity_context *id_pipe = identity_context(_pipe);
74   struct pipe_context *pipe = id_pipe->pipe;
75
76   pipe->destroy_query(pipe,
77                       query);
78}
79
80static void
81identity_begin_query(struct pipe_context *_pipe,
82                     struct pipe_query *query)
83{
84   struct identity_context *id_pipe = identity_context(_pipe);
85   struct pipe_context *pipe = id_pipe->pipe;
86
87   pipe->begin_query(pipe,
88                     query);
89}
90
91static void
92identity_end_query(struct pipe_context *_pipe,
93                   struct pipe_query *query)
94{
95   struct identity_context *id_pipe = identity_context(_pipe);
96   struct pipe_context *pipe = id_pipe->pipe;
97
98   pipe->end_query(pipe,
99                   query);
100}
101
102static boolean
103identity_get_query_result(struct pipe_context *_pipe,
104                          struct pipe_query *query,
105                          boolean wait,
106                          union pipe_query_result *result)
107{
108   struct identity_context *id_pipe = identity_context(_pipe);
109   struct pipe_context *pipe = id_pipe->pipe;
110
111   return pipe->get_query_result(pipe,
112                                 query,
113                                 wait,
114                                 result);
115}
116
117static void *
118identity_create_blend_state(struct pipe_context *_pipe,
119                            const struct pipe_blend_state *blend)
120{
121   struct identity_context *id_pipe = identity_context(_pipe);
122   struct pipe_context *pipe = id_pipe->pipe;
123
124   return pipe->create_blend_state(pipe,
125                                   blend);
126}
127
128static void
129identity_bind_blend_state(struct pipe_context *_pipe,
130                          void *blend)
131{
132   struct identity_context *id_pipe = identity_context(_pipe);
133   struct pipe_context *pipe = id_pipe->pipe;
134
135   pipe->bind_blend_state(pipe,
136                              blend);
137}
138
139static void
140identity_delete_blend_state(struct pipe_context *_pipe,
141                            void *blend)
142{
143   struct identity_context *id_pipe = identity_context(_pipe);
144   struct pipe_context *pipe = id_pipe->pipe;
145
146   pipe->delete_blend_state(pipe,
147                            blend);
148}
149
150static void *
151identity_create_sampler_state(struct pipe_context *_pipe,
152                              const struct pipe_sampler_state *sampler)
153{
154   struct identity_context *id_pipe = identity_context(_pipe);
155   struct pipe_context *pipe = id_pipe->pipe;
156
157   return pipe->create_sampler_state(pipe,
158                                     sampler);
159}
160
161static void
162identity_bind_sampler_states(struct pipe_context *_pipe,
163                             unsigned shader,
164                             unsigned start,
165                             unsigned num_samplers,
166                             void **samplers)
167{
168   struct identity_context *id_pipe = identity_context(_pipe);
169   struct pipe_context *pipe = id_pipe->pipe;
170
171   /* remove this when we have pipe->bind_sampler_states(..., start, ...) */
172   assert(start == 0);
173
174   switch (shader) {
175   case PIPE_SHADER_VERTEX:
176      pipe->bind_vertex_sampler_states(pipe, num_samplers, samplers);
177      break;
178   case PIPE_SHADER_GEOMETRY:
179      pipe->bind_geometry_sampler_states(pipe, num_samplers, samplers);
180      break;
181   case PIPE_SHADER_FRAGMENT:
182      pipe->bind_fragment_sampler_states(pipe, num_samplers, samplers);
183      break;
184   default:
185      debug_error("Unexpected shader in identity_bind_sampler_states()");
186   }
187}
188
189static void
190identity_bind_fragment_sampler_states(struct pipe_context *_pipe,
191                                      unsigned num_samplers,
192                                      void **samplers)
193{
194   identity_bind_sampler_states(_pipe, PIPE_SHADER_FRAGMENT,
195                                0, num_samplers, samplers);
196}
197
198static void
199identity_bind_vertex_sampler_states(struct pipe_context *_pipe,
200                                    unsigned num_samplers,
201                                    void **samplers)
202{
203   identity_bind_sampler_states(_pipe, PIPE_SHADER_VERTEX,
204                                0, num_samplers, samplers);
205}
206
207static void
208identity_delete_sampler_state(struct pipe_context *_pipe,
209                              void *sampler)
210{
211   struct identity_context *id_pipe = identity_context(_pipe);
212   struct pipe_context *pipe = id_pipe->pipe;
213
214   pipe->delete_sampler_state(pipe,
215                              sampler);
216}
217
218static void *
219identity_create_rasterizer_state(struct pipe_context *_pipe,
220                                 const struct pipe_rasterizer_state *rasterizer)
221{
222   struct identity_context *id_pipe = identity_context(_pipe);
223   struct pipe_context *pipe = id_pipe->pipe;
224
225   return pipe->create_rasterizer_state(pipe,
226                                        rasterizer);
227}
228
229static void
230identity_bind_rasterizer_state(struct pipe_context *_pipe,
231                               void *rasterizer)
232{
233   struct identity_context *id_pipe = identity_context(_pipe);
234   struct pipe_context *pipe = id_pipe->pipe;
235
236   pipe->bind_rasterizer_state(pipe,
237                               rasterizer);
238}
239
240static void
241identity_delete_rasterizer_state(struct pipe_context *_pipe,
242                                 void *rasterizer)
243{
244   struct identity_context *id_pipe = identity_context(_pipe);
245   struct pipe_context *pipe = id_pipe->pipe;
246
247   pipe->delete_rasterizer_state(pipe,
248                                 rasterizer);
249}
250
251static void *
252identity_create_depth_stencil_alpha_state(struct pipe_context *_pipe,
253                                          const struct pipe_depth_stencil_alpha_state *depth_stencil_alpha)
254{
255   struct identity_context *id_pipe = identity_context(_pipe);
256   struct pipe_context *pipe = id_pipe->pipe;
257
258   return pipe->create_depth_stencil_alpha_state(pipe,
259                                                 depth_stencil_alpha);
260}
261
262static void
263identity_bind_depth_stencil_alpha_state(struct pipe_context *_pipe,
264                                        void *depth_stencil_alpha)
265{
266   struct identity_context *id_pipe = identity_context(_pipe);
267   struct pipe_context *pipe = id_pipe->pipe;
268
269   pipe->bind_depth_stencil_alpha_state(pipe,
270                                        depth_stencil_alpha);
271}
272
273static void
274identity_delete_depth_stencil_alpha_state(struct pipe_context *_pipe,
275                                          void *depth_stencil_alpha)
276{
277   struct identity_context *id_pipe = identity_context(_pipe);
278   struct pipe_context *pipe = id_pipe->pipe;
279
280   pipe->delete_depth_stencil_alpha_state(pipe,
281                                          depth_stencil_alpha);
282}
283
284static void *
285identity_create_fs_state(struct pipe_context *_pipe,
286                         const struct pipe_shader_state *fs)
287{
288   struct identity_context *id_pipe = identity_context(_pipe);
289   struct pipe_context *pipe = id_pipe->pipe;
290
291   return pipe->create_fs_state(pipe,
292                                fs);
293}
294
295static void
296identity_bind_fs_state(struct pipe_context *_pipe,
297                       void *fs)
298{
299   struct identity_context *id_pipe = identity_context(_pipe);
300   struct pipe_context *pipe = id_pipe->pipe;
301
302   pipe->bind_fs_state(pipe,
303                       fs);
304}
305
306static void
307identity_delete_fs_state(struct pipe_context *_pipe,
308                         void *fs)
309{
310   struct identity_context *id_pipe = identity_context(_pipe);
311   struct pipe_context *pipe = id_pipe->pipe;
312
313   pipe->delete_fs_state(pipe,
314                         fs);
315}
316
317static void *
318identity_create_vs_state(struct pipe_context *_pipe,
319                         const struct pipe_shader_state *vs)
320{
321   struct identity_context *id_pipe = identity_context(_pipe);
322   struct pipe_context *pipe = id_pipe->pipe;
323
324   return pipe->create_vs_state(pipe,
325                                vs);
326}
327
328static void
329identity_bind_vs_state(struct pipe_context *_pipe,
330                       void *vs)
331{
332   struct identity_context *id_pipe = identity_context(_pipe);
333   struct pipe_context *pipe = id_pipe->pipe;
334
335   pipe->bind_vs_state(pipe,
336                       vs);
337}
338
339static void
340identity_delete_vs_state(struct pipe_context *_pipe,
341                         void *vs)
342{
343   struct identity_context *id_pipe = identity_context(_pipe);
344   struct pipe_context *pipe = id_pipe->pipe;
345
346   pipe->delete_vs_state(pipe,
347                         vs);
348}
349
350
351static void *
352identity_create_vertex_elements_state(struct pipe_context *_pipe,
353                                      unsigned num_elements,
354                                      const struct pipe_vertex_element *vertex_elements)
355{
356   struct identity_context *id_pipe = identity_context(_pipe);
357   struct pipe_context *pipe = id_pipe->pipe;
358
359   return pipe->create_vertex_elements_state(pipe,
360                                             num_elements,
361                                             vertex_elements);
362}
363
364static void
365identity_bind_vertex_elements_state(struct pipe_context *_pipe,
366                                    void *velems)
367{
368   struct identity_context *id_pipe = identity_context(_pipe);
369   struct pipe_context *pipe = id_pipe->pipe;
370
371   pipe->bind_vertex_elements_state(pipe,
372                                    velems);
373}
374
375static void
376identity_delete_vertex_elements_state(struct pipe_context *_pipe,
377                                      void *velems)
378{
379   struct identity_context *id_pipe = identity_context(_pipe);
380   struct pipe_context *pipe = id_pipe->pipe;
381
382   pipe->delete_vertex_elements_state(pipe,
383                                      velems);
384}
385
386static void
387identity_set_blend_color(struct pipe_context *_pipe,
388                         const struct pipe_blend_color *blend_color)
389{
390   struct identity_context *id_pipe = identity_context(_pipe);
391   struct pipe_context *pipe = id_pipe->pipe;
392
393   pipe->set_blend_color(pipe,
394                         blend_color);
395}
396
397static void
398identity_set_stencil_ref(struct pipe_context *_pipe,
399                         const struct pipe_stencil_ref *stencil_ref)
400{
401   struct identity_context *id_pipe = identity_context(_pipe);
402   struct pipe_context *pipe = id_pipe->pipe;
403
404   pipe->set_stencil_ref(pipe,
405                         stencil_ref);
406}
407
408static void
409identity_set_clip_state(struct pipe_context *_pipe,
410                        const struct pipe_clip_state *clip)
411{
412   struct identity_context *id_pipe = identity_context(_pipe);
413   struct pipe_context *pipe = id_pipe->pipe;
414
415   pipe->set_clip_state(pipe,
416                        clip);
417}
418
419static void
420identity_set_sample_mask(struct pipe_context *_pipe,
421                         unsigned sample_mask)
422{
423   struct identity_context *id_pipe = identity_context(_pipe);
424   struct pipe_context *pipe = id_pipe->pipe;
425
426   pipe->set_sample_mask(pipe,
427                         sample_mask);
428}
429
430static void
431identity_set_constant_buffer(struct pipe_context *_pipe,
432                             uint shader,
433                             uint index,
434                             struct pipe_constant_buffer *_cb)
435{
436   struct identity_context *id_pipe = identity_context(_pipe);
437   struct pipe_context *pipe = id_pipe->pipe;
438   struct pipe_constant_buffer cb;
439
440   /* XXX hmm? unwrap the input state */
441   if (_cb) {
442      cb = *_cb;
443      cb.buffer = identity_resource_unwrap(_cb->buffer);
444   }
445
446   pipe->set_constant_buffer(pipe,
447                             shader,
448                             index,
449                             _cb ? &cb : NULL);
450}
451
452static void
453identity_set_framebuffer_state(struct pipe_context *_pipe,
454                               const struct pipe_framebuffer_state *_state)
455{
456   struct identity_context *id_pipe = identity_context(_pipe);
457   struct pipe_context *pipe = id_pipe->pipe;
458   struct pipe_framebuffer_state unwrapped_state;
459   struct pipe_framebuffer_state *state = NULL;
460   unsigned i;
461
462   /* unwrap the input state */
463   if (_state) {
464      memcpy(&unwrapped_state, _state, sizeof(unwrapped_state));
465      for(i = 0; i < _state->nr_cbufs; i++)
466         unwrapped_state.cbufs[i] = identity_surface_unwrap(_state->cbufs[i]);
467      for (; i < PIPE_MAX_COLOR_BUFS; i++)
468         unwrapped_state.cbufs[i] = NULL;
469      unwrapped_state.zsbuf = identity_surface_unwrap(_state->zsbuf);
470      state = &unwrapped_state;
471   }
472
473   pipe->set_framebuffer_state(pipe,
474                               state);
475}
476
477static void
478identity_set_polygon_stipple(struct pipe_context *_pipe,
479                             const struct pipe_poly_stipple *poly_stipple)
480{
481   struct identity_context *id_pipe = identity_context(_pipe);
482   struct pipe_context *pipe = id_pipe->pipe;
483
484   pipe->set_polygon_stipple(pipe,
485                             poly_stipple);
486}
487
488static void
489identity_set_scissor_state(struct pipe_context *_pipe,
490                           const struct pipe_scissor_state *scissor)
491{
492   struct identity_context *id_pipe = identity_context(_pipe);
493   struct pipe_context *pipe = id_pipe->pipe;
494
495   pipe->set_scissor_state(pipe,
496                           scissor);
497}
498
499static void
500identity_set_viewport_state(struct pipe_context *_pipe,
501                            const struct pipe_viewport_state *viewport)
502{
503   struct identity_context *id_pipe = identity_context(_pipe);
504   struct pipe_context *pipe = id_pipe->pipe;
505
506   pipe->set_viewport_state(pipe,
507                            viewport);
508}
509
510static void
511identity_set_sampler_views(struct pipe_context *_pipe,
512                           unsigned shader,
513                           unsigned start,
514                           unsigned num,
515                           struct pipe_sampler_view **_views)
516{
517   struct identity_context *id_pipe = identity_context(_pipe);
518   struct pipe_context *pipe = id_pipe->pipe;
519   struct pipe_sampler_view *unwrapped_views[PIPE_MAX_SAMPLERS];
520   struct pipe_sampler_view **views = NULL;
521   unsigned i;
522
523   /* remove this when we have pipe->set_sampler_views(..., start, ...) */
524   assert(start == 0);
525
526   if (_views) {
527      for (i = 0; i < num; i++)
528         unwrapped_views[i] = identity_sampler_view_unwrap(_views[i]);
529      for (; i < PIPE_MAX_SAMPLERS; i++)
530         unwrapped_views[i] = NULL;
531
532      views = unwrapped_views;
533   }
534
535   switch (shader) {
536   case PIPE_SHADER_VERTEX:
537      pipe->set_vertex_sampler_views(pipe, num, views);
538      break;
539   case PIPE_SHADER_GEOMETRY:
540      pipe->set_geometry_sampler_views(pipe, num, views);
541      break;
542   case PIPE_SHADER_FRAGMENT:
543      pipe->set_fragment_sampler_views(pipe, num, views);
544      break;
545   default:
546      debug_error("Unexpected shader in identity_set_sampler_views()");
547   }
548}
549
550static void
551identity_set_fragment_sampler_views(struct pipe_context *_pipe,
552                                    unsigned num,
553                                    struct pipe_sampler_view **_views)
554{
555   identity_set_sampler_views(_pipe, PIPE_SHADER_FRAGMENT, 0, num, _views);
556}
557
558static void
559identity_set_vertex_sampler_views(struct pipe_context *_pipe,
560                                  unsigned num,
561                                  struct pipe_sampler_view **_views)
562{
563   identity_set_sampler_views(_pipe, PIPE_SHADER_VERTEX, 0, num, _views);
564}
565
566static void
567identity_set_vertex_buffers(struct pipe_context *_pipe,
568                            unsigned num_buffers,
569                            const struct pipe_vertex_buffer *_buffers)
570{
571   struct identity_context *id_pipe = identity_context(_pipe);
572   struct pipe_context *pipe = id_pipe->pipe;
573   struct pipe_vertex_buffer unwrapped_buffers[PIPE_MAX_SHADER_INPUTS];
574   struct pipe_vertex_buffer *buffers = NULL;
575   unsigned i;
576
577   if (num_buffers) {
578      memcpy(unwrapped_buffers, _buffers, num_buffers * sizeof(*_buffers));
579      for (i = 0; i < num_buffers; i++)
580         unwrapped_buffers[i].buffer = identity_resource_unwrap(_buffers[i].buffer);
581      buffers = unwrapped_buffers;
582   }
583
584   pipe->set_vertex_buffers(pipe,
585                            num_buffers,
586                            buffers);
587}
588
589static void
590identity_set_index_buffer(struct pipe_context *_pipe,
591                          const struct pipe_index_buffer *_ib)
592{
593   struct identity_context *id_pipe = identity_context(_pipe);
594   struct pipe_context *pipe = id_pipe->pipe;
595   struct pipe_index_buffer unwrapped_ib, *ib = NULL;
596
597   if (_ib) {
598      unwrapped_ib = *_ib;
599      unwrapped_ib.buffer = identity_resource_unwrap(_ib->buffer);
600      ib = &unwrapped_ib;
601   }
602
603   pipe->set_index_buffer(pipe, ib);
604}
605
606static void
607identity_resource_copy_region(struct pipe_context *_pipe,
608                              struct pipe_resource *_dst,
609                              unsigned dst_level,
610                              unsigned dstx,
611                              unsigned dsty,
612                              unsigned dstz,
613                              struct pipe_resource *_src,
614                              unsigned src_level,
615                              const struct pipe_box *src_box)
616{
617   struct identity_context *id_pipe = identity_context(_pipe);
618   struct identity_resource *id_resource_dst = identity_resource(_dst);
619   struct identity_resource *id_resource_src = identity_resource(_src);
620   struct pipe_context *pipe = id_pipe->pipe;
621   struct pipe_resource *dst = id_resource_dst->resource;
622   struct pipe_resource *src = id_resource_src->resource;
623
624   pipe->resource_copy_region(pipe,
625                              dst,
626                              dst_level,
627                              dstx,
628                              dsty,
629                              dstz,
630                              src,
631                              src_level,
632                              src_box);
633}
634
635static void
636identity_clear(struct pipe_context *_pipe,
637               unsigned buffers,
638               const union pipe_color_union *color,
639               double depth,
640               unsigned stencil)
641{
642   struct identity_context *id_pipe = identity_context(_pipe);
643   struct pipe_context *pipe = id_pipe->pipe;
644
645   pipe->clear(pipe,
646               buffers,
647               color,
648               depth,
649               stencil);
650}
651
652static void
653identity_clear_render_target(struct pipe_context *_pipe,
654                             struct pipe_surface *_dst,
655                             const union pipe_color_union *color,
656                             unsigned dstx, unsigned dsty,
657                             unsigned width, unsigned height)
658{
659   struct identity_context *id_pipe = identity_context(_pipe);
660   struct identity_surface *id_surface_dst = identity_surface(_dst);
661   struct pipe_context *pipe = id_pipe->pipe;
662   struct pipe_surface *dst = id_surface_dst->surface;
663
664   pipe->clear_render_target(pipe,
665                             dst,
666                             color,
667                             dstx,
668                             dsty,
669                             width,
670                             height);
671}
672static void
673identity_clear_depth_stencil(struct pipe_context *_pipe,
674                             struct pipe_surface *_dst,
675                             unsigned clear_flags,
676                             double depth,
677                             unsigned stencil,
678                             unsigned dstx, unsigned dsty,
679                             unsigned width, unsigned height)
680{
681   struct identity_context *id_pipe = identity_context(_pipe);
682   struct identity_surface *id_surface_dst = identity_surface(_dst);
683   struct pipe_context *pipe = id_pipe->pipe;
684   struct pipe_surface *dst = id_surface_dst->surface;
685
686   pipe->clear_depth_stencil(pipe,
687                             dst,
688                             clear_flags,
689                             depth,
690                             stencil,
691                             dstx,
692                             dsty,
693                             width,
694                             height);
695
696}
697
698static void
699identity_flush(struct pipe_context *_pipe,
700               struct pipe_fence_handle **fence)
701{
702   struct identity_context *id_pipe = identity_context(_pipe);
703   struct pipe_context *pipe = id_pipe->pipe;
704
705   pipe->flush(pipe,
706               fence);
707}
708
709static struct pipe_sampler_view *
710identity_context_create_sampler_view(struct pipe_context *_pipe,
711                                     struct pipe_resource *_resource,
712                                     const struct pipe_sampler_view *templ)
713{
714   struct identity_context *id_context = identity_context(_pipe);
715   struct identity_resource *id_resource = identity_resource(_resource);
716   struct pipe_context *pipe = id_context->pipe;
717   struct pipe_resource *resource = id_resource->resource;
718   struct pipe_sampler_view *result;
719
720   result = pipe->create_sampler_view(pipe,
721                                      resource,
722                                      templ);
723
724   if (result)
725      return identity_sampler_view_create(id_context, id_resource, result);
726   return NULL;
727}
728
729static void
730identity_context_sampler_view_destroy(struct pipe_context *_pipe,
731                                      struct pipe_sampler_view *_view)
732{
733   identity_sampler_view_destroy(identity_context(_pipe),
734                                 identity_sampler_view(_view));
735}
736
737static struct pipe_surface *
738identity_context_create_surface(struct pipe_context *_pipe,
739                                struct pipe_resource *_resource,
740                                const struct pipe_surface *templ)
741{
742   struct identity_context *id_context = identity_context(_pipe);
743   struct identity_resource *id_resource = identity_resource(_resource);
744   struct pipe_context *pipe = id_context->pipe;
745   struct pipe_resource *resource = id_resource->resource;
746   struct pipe_surface *result;
747
748   result = pipe->create_surface(pipe,
749                                 resource,
750                                 templ);
751
752   if (result)
753      return identity_surface_create(id_context, id_resource, result);
754   return NULL;
755}
756
757static void
758identity_context_surface_destroy(struct pipe_context *_pipe,
759                                 struct pipe_surface *_surf)
760{
761   identity_surface_destroy(identity_context(_pipe),
762                            identity_surface(_surf));
763}
764
765static struct pipe_transfer *
766identity_context_get_transfer(struct pipe_context *_context,
767                              struct pipe_resource *_resource,
768                              unsigned level,
769                              unsigned usage,
770                              const struct pipe_box *box)
771{
772   struct identity_context *id_context = identity_context(_context);
773   struct identity_resource *id_resource = identity_resource(_resource);
774   struct pipe_context *context = id_context->pipe;
775   struct pipe_resource *resource = id_resource->resource;
776   struct pipe_transfer *result;
777
778   result = context->get_transfer(context,
779                                  resource,
780                                  level,
781                                  usage,
782                                  box);
783
784   if (result)
785      return identity_transfer_create(id_context, id_resource, result);
786   return NULL;
787}
788
789static void
790identity_context_transfer_destroy(struct pipe_context *_pipe,
791                                  struct pipe_transfer *_transfer)
792{
793   identity_transfer_destroy(identity_context(_pipe),
794                             identity_transfer(_transfer));
795}
796
797static void *
798identity_context_transfer_map(struct pipe_context *_context,
799                              struct pipe_transfer *_transfer)
800{
801   struct identity_context *id_context = identity_context(_context);
802   struct identity_transfer *id_transfer = identity_transfer(_transfer);
803   struct pipe_context *context = id_context->pipe;
804   struct pipe_transfer *transfer = id_transfer->transfer;
805
806   return context->transfer_map(context,
807                                transfer);
808}
809
810
811
812static void
813identity_context_transfer_flush_region(struct pipe_context *_context,
814                                       struct pipe_transfer *_transfer,
815                                       const struct pipe_box *box)
816{
817   struct identity_context *id_context = identity_context(_context);
818   struct identity_transfer *id_transfer = identity_transfer(_transfer);
819   struct pipe_context *context = id_context->pipe;
820   struct pipe_transfer *transfer = id_transfer->transfer;
821
822   context->transfer_flush_region(context,
823                                  transfer,
824                                  box);
825}
826
827
828static void
829identity_context_transfer_unmap(struct pipe_context *_context,
830                                struct pipe_transfer *_transfer)
831{
832   struct identity_context *id_context = identity_context(_context);
833   struct identity_transfer *id_transfer = identity_transfer(_transfer);
834   struct pipe_context *context = id_context->pipe;
835   struct pipe_transfer *transfer = id_transfer->transfer;
836
837   context->transfer_unmap(context,
838                           transfer);
839}
840
841
842static void
843identity_context_transfer_inline_write(struct pipe_context *_context,
844                                       struct pipe_resource *_resource,
845                                       unsigned level,
846                                       unsigned usage,
847                                       const struct pipe_box *box,
848                                       const void *data,
849                                       unsigned stride,
850                                       unsigned layer_stride)
851{
852   struct identity_context *id_context = identity_context(_context);
853   struct identity_resource *id_resource = identity_resource(_resource);
854   struct pipe_context *context = id_context->pipe;
855   struct pipe_resource *resource = id_resource->resource;
856
857   context->transfer_inline_write(context,
858                                  resource,
859                                  level,
860                                  usage,
861                                  box,
862                                  data,
863                                  stride,
864                                  layer_stride);
865}
866
867
868struct pipe_context *
869identity_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
870{
871   struct identity_context *id_pipe;
872   (void)identity_screen(_screen);
873
874   id_pipe = CALLOC_STRUCT(identity_context);
875   if (!id_pipe) {
876      return NULL;
877   }
878
879   id_pipe->base.screen = _screen;
880   id_pipe->base.priv = pipe->priv; /* expose wrapped data */
881   id_pipe->base.draw = NULL;
882
883   id_pipe->base.destroy = identity_destroy;
884   id_pipe->base.draw_vbo = identity_draw_vbo;
885   id_pipe->base.create_query = identity_create_query;
886   id_pipe->base.destroy_query = identity_destroy_query;
887   id_pipe->base.begin_query = identity_begin_query;
888   id_pipe->base.end_query = identity_end_query;
889   id_pipe->base.get_query_result = identity_get_query_result;
890   id_pipe->base.create_blend_state = identity_create_blend_state;
891   id_pipe->base.bind_blend_state = identity_bind_blend_state;
892   id_pipe->base.delete_blend_state = identity_delete_blend_state;
893   id_pipe->base.create_sampler_state = identity_create_sampler_state;
894   id_pipe->base.bind_fragment_sampler_states = identity_bind_fragment_sampler_states;
895   id_pipe->base.bind_vertex_sampler_states = identity_bind_vertex_sampler_states;
896   id_pipe->base.delete_sampler_state = identity_delete_sampler_state;
897   id_pipe->base.create_rasterizer_state = identity_create_rasterizer_state;
898   id_pipe->base.bind_rasterizer_state = identity_bind_rasterizer_state;
899   id_pipe->base.delete_rasterizer_state = identity_delete_rasterizer_state;
900   id_pipe->base.create_depth_stencil_alpha_state = identity_create_depth_stencil_alpha_state;
901   id_pipe->base.bind_depth_stencil_alpha_state = identity_bind_depth_stencil_alpha_state;
902   id_pipe->base.delete_depth_stencil_alpha_state = identity_delete_depth_stencil_alpha_state;
903   id_pipe->base.create_fs_state = identity_create_fs_state;
904   id_pipe->base.bind_fs_state = identity_bind_fs_state;
905   id_pipe->base.delete_fs_state = identity_delete_fs_state;
906   id_pipe->base.create_vs_state = identity_create_vs_state;
907   id_pipe->base.bind_vs_state = identity_bind_vs_state;
908   id_pipe->base.delete_vs_state = identity_delete_vs_state;
909   id_pipe->base.create_vertex_elements_state = identity_create_vertex_elements_state;
910   id_pipe->base.bind_vertex_elements_state = identity_bind_vertex_elements_state;
911   id_pipe->base.delete_vertex_elements_state = identity_delete_vertex_elements_state;
912   id_pipe->base.set_blend_color = identity_set_blend_color;
913   id_pipe->base.set_stencil_ref = identity_set_stencil_ref;
914   id_pipe->base.set_clip_state = identity_set_clip_state;
915   id_pipe->base.set_sample_mask = identity_set_sample_mask;
916   id_pipe->base.set_constant_buffer = identity_set_constant_buffer;
917   id_pipe->base.set_framebuffer_state = identity_set_framebuffer_state;
918   id_pipe->base.set_polygon_stipple = identity_set_polygon_stipple;
919   id_pipe->base.set_scissor_state = identity_set_scissor_state;
920   id_pipe->base.set_viewport_state = identity_set_viewport_state;
921   id_pipe->base.set_fragment_sampler_views = identity_set_fragment_sampler_views;
922   id_pipe->base.set_vertex_sampler_views = identity_set_vertex_sampler_views;
923   id_pipe->base.set_vertex_buffers = identity_set_vertex_buffers;
924   id_pipe->base.set_index_buffer = identity_set_index_buffer;
925   id_pipe->base.resource_copy_region = identity_resource_copy_region;
926   id_pipe->base.clear = identity_clear;
927   id_pipe->base.clear_render_target = identity_clear_render_target;
928   id_pipe->base.clear_depth_stencil = identity_clear_depth_stencil;
929   id_pipe->base.flush = identity_flush;
930   id_pipe->base.create_surface = identity_context_create_surface;
931   id_pipe->base.surface_destroy = identity_context_surface_destroy;
932   id_pipe->base.create_sampler_view = identity_context_create_sampler_view;
933   id_pipe->base.sampler_view_destroy = identity_context_sampler_view_destroy;
934   id_pipe->base.get_transfer = identity_context_get_transfer;
935   id_pipe->base.transfer_destroy = identity_context_transfer_destroy;
936   id_pipe->base.transfer_map = identity_context_transfer_map;
937   id_pipe->base.transfer_unmap = identity_context_transfer_unmap;
938   id_pipe->base.transfer_flush_region = identity_context_transfer_flush_region;
939   id_pipe->base.transfer_inline_write = identity_context_transfer_inline_write;
940
941   id_pipe->pipe = pipe;
942
943   return &id_pipe->base;
944}
945