05a9dfab774ee24c16dc8914e8581d3973434737
[profile/ivi/mesa.git] / src / gallium / drivers / identity / id_context.c
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
32 #include "id_context.h"
33 #include "id_objects.h"
34
35
36 static void
37 identity_destroy(struct pipe_context *_pipe)
38 {
39    struct identity_context *id_pipe = identity_context(_pipe);
40    struct pipe_context *pipe = id_pipe->pipe;
41
42    pipe->destroy(pipe);
43
44    free(id_pipe);
45 }
46
47 static void
48 identity_draw_arrays(struct pipe_context *_pipe,
49                      unsigned prim,
50                      unsigned start,
51                      unsigned count)
52 {
53    struct identity_context *id_pipe = identity_context(_pipe);
54    struct pipe_context *pipe = id_pipe->pipe;
55
56    pipe->draw_arrays(pipe,
57                      prim,
58                      start,
59                      count);
60 }
61
62 static void
63 identity_draw_elements(struct pipe_context *_pipe,
64                        struct pipe_buffer *_indexBuffer,
65                        unsigned indexSize,
66                        unsigned prim,
67                        unsigned start,
68                        unsigned count)
69 {
70    struct identity_context *id_pipe = identity_context(_pipe);
71    struct identity_buffer *id_buffer = identity_buffer(_indexBuffer);
72    struct pipe_context *pipe = id_pipe->pipe;
73    struct pipe_buffer *indexBuffer = id_buffer->buffer;
74
75    pipe->draw_elements(pipe,
76                        indexBuffer,
77                        indexSize,
78                        prim,
79                        start,
80                        count);
81 }
82
83 static void
84 identity_draw_range_elements(struct pipe_context *_pipe,
85                              struct pipe_buffer *_indexBuffer,
86                              unsigned indexSize,
87                              unsigned minIndex,
88                              unsigned maxIndex,
89                              unsigned mode,
90                              unsigned start,
91                              unsigned count)
92 {
93    struct identity_context *id_pipe = identity_context(_pipe);
94    struct identity_buffer *id_buffer = identity_buffer(_indexBuffer);
95    struct pipe_context *pipe = id_pipe->pipe;
96    struct pipe_buffer *indexBuffer = id_buffer->buffer;
97
98    pipe->draw_range_elements(pipe,
99                              indexBuffer,
100                              indexSize,
101                              minIndex,
102                              maxIndex,
103                              mode,
104                              start,
105                              count);
106 }
107
108 static struct pipe_query *
109 identity_create_query(struct pipe_context *_pipe,
110                       unsigned query_type)
111 {
112    struct identity_context *id_pipe = identity_context(_pipe);
113    struct pipe_context *pipe = id_pipe->pipe;
114
115    return pipe->create_query(pipe,
116                              query_type);
117 }
118
119 static void
120 identity_destroy_query(struct pipe_context *_pipe,
121                        struct pipe_query *query)
122 {
123    struct identity_context *id_pipe = identity_context(_pipe);
124    struct pipe_context *pipe = id_pipe->pipe;
125
126    pipe->destroy_query(pipe,
127                        query);
128 }
129
130 static void
131 identity_begin_query(struct pipe_context *_pipe,
132                      struct pipe_query *query)
133 {
134    struct identity_context *id_pipe = identity_context(_pipe);
135    struct pipe_context *pipe = id_pipe->pipe;
136
137    pipe->begin_query(pipe,
138                      query);
139 }
140
141 static void
142 identity_end_query(struct pipe_context *_pipe,
143                    struct pipe_query *query)
144 {
145    struct identity_context *id_pipe = identity_context(_pipe);
146    struct pipe_context *pipe = id_pipe->pipe;
147
148    pipe->end_query(pipe,
149                    query);
150 }
151
152 static boolean
153 identity_get_query_result(struct pipe_context *_pipe,
154                           struct pipe_query *query,
155                           boolean wait,
156                           uint64_t *result)
157 {
158    struct identity_context *id_pipe = identity_context(_pipe);
159    struct pipe_context *pipe = id_pipe->pipe;
160
161    return pipe->get_query_result(pipe,
162                                  query,
163                                  wait,
164                                  result);
165 }
166
167 static void *
168 identity_create_blend_state(struct pipe_context *_pipe,
169                             const struct pipe_blend_state *blend)
170 {
171    struct identity_context *id_pipe = identity_context(_pipe);
172    struct pipe_context *pipe = id_pipe->pipe;
173
174    return pipe->create_blend_state(pipe,
175                                    blend);
176 }
177
178 static void
179 identity_bind_blend_state(struct pipe_context *_pipe,
180                           void *blend)
181 {
182    struct identity_context *id_pipe = identity_context(_pipe);
183    struct pipe_context *pipe = id_pipe->pipe;
184
185    pipe->bind_blend_state(pipe,
186                               blend);
187 }
188
189 static void
190 identity_delete_blend_state(struct pipe_context *_pipe,
191                             void *blend)
192 {
193    struct identity_context *id_pipe = identity_context(_pipe);
194    struct pipe_context *pipe = id_pipe->pipe;
195
196    pipe->delete_blend_state(pipe,
197                             blend);
198 }
199
200 static void *
201 identity_create_sampler_state(struct pipe_context *_pipe,
202                               const struct pipe_sampler_state *sampler)
203 {
204    struct identity_context *id_pipe = identity_context(_pipe);
205    struct pipe_context *pipe = id_pipe->pipe;
206
207    return pipe->create_sampler_state(pipe,
208                                      sampler);
209 }
210
211 static void
212 identity_bind_fragment_sampler_states(struct pipe_context *_pipe,
213                                       unsigned num_samplers,
214                                       void **samplers)
215 {
216    struct identity_context *id_pipe = identity_context(_pipe);
217    struct pipe_context *pipe = id_pipe->pipe;
218
219    pipe->bind_fragment_sampler_states(pipe,
220                                       num_samplers,
221                                       samplers);
222 }
223
224 static void
225 identity_bind_vertex_sampler_states(struct pipe_context *_pipe,
226                                     unsigned num_samplers,
227                                     void **samplers)
228 {
229    struct identity_context *id_pipe = identity_context(_pipe);
230    struct pipe_context *pipe = id_pipe->pipe;
231
232    pipe->bind_vertex_sampler_states(pipe,
233                                     num_samplers,
234                                     samplers);
235 }
236
237 static void
238 identity_delete_sampler_state(struct pipe_context *_pipe,
239                               void *sampler)
240 {
241    struct identity_context *id_pipe = identity_context(_pipe);
242    struct pipe_context *pipe = id_pipe->pipe;
243
244    pipe->delete_sampler_state(pipe,
245                               sampler);
246 }
247
248 static void *
249 identity_create_rasterizer_state(struct pipe_context *_pipe,
250                                  const struct pipe_rasterizer_state *rasterizer)
251 {
252    struct identity_context *id_pipe = identity_context(_pipe);
253    struct pipe_context *pipe = id_pipe->pipe;
254
255    return pipe->create_rasterizer_state(pipe,
256                                         rasterizer);
257 }
258
259 static void
260 identity_bind_rasterizer_state(struct pipe_context *_pipe,
261                                void *rasterizer)
262 {
263    struct identity_context *id_pipe = identity_context(_pipe);
264    struct pipe_context *pipe = id_pipe->pipe;
265
266    pipe->bind_rasterizer_state(pipe,
267                                rasterizer);
268 }
269
270 static void
271 identity_delete_rasterizer_state(struct pipe_context *_pipe,
272                                  void *rasterizer)
273 {
274    struct identity_context *id_pipe = identity_context(_pipe);
275    struct pipe_context *pipe = id_pipe->pipe;
276
277    pipe->delete_rasterizer_state(pipe,
278                                  rasterizer);
279 }
280
281 static void *
282 identity_create_depth_stencil_alpha_state(struct pipe_context *_pipe,
283                                           const struct pipe_depth_stencil_alpha_state *depth_stencil_alpha)
284 {
285    struct identity_context *id_pipe = identity_context(_pipe);
286    struct pipe_context *pipe = id_pipe->pipe;
287
288    return pipe->create_depth_stencil_alpha_state(pipe,
289                                                  depth_stencil_alpha);
290 }
291
292 static void
293 identity_bind_depth_stencil_alpha_state(struct pipe_context *_pipe,
294                                         void *depth_stencil_alpha)
295 {
296    struct identity_context *id_pipe = identity_context(_pipe);
297    struct pipe_context *pipe = id_pipe->pipe;
298
299    pipe->bind_depth_stencil_alpha_state(pipe,
300                                         depth_stencil_alpha);
301 }
302
303 static void
304 identity_delete_depth_stencil_alpha_state(struct pipe_context *_pipe,
305                                           void *depth_stencil_alpha)
306 {
307    struct identity_context *id_pipe = identity_context(_pipe);
308    struct pipe_context *pipe = id_pipe->pipe;
309
310    pipe->delete_depth_stencil_alpha_state(pipe,
311                                           depth_stencil_alpha);
312 }
313
314 static void *
315 identity_create_fs_state(struct pipe_context *_pipe,
316                          const struct pipe_shader_state *fs)
317 {
318    struct identity_context *id_pipe = identity_context(_pipe);
319    struct pipe_context *pipe = id_pipe->pipe;
320
321    return pipe->create_fs_state(pipe,
322                                 fs);
323 }
324
325 static void
326 identity_bind_fs_state(struct pipe_context *_pipe,
327                        void *fs)
328 {
329    struct identity_context *id_pipe = identity_context(_pipe);
330    struct pipe_context *pipe = id_pipe->pipe;
331
332    pipe->bind_fs_state(pipe,
333                        fs);
334 }
335
336 static void
337 identity_delete_fs_state(struct pipe_context *_pipe,
338                          void *fs)
339 {
340    struct identity_context *id_pipe = identity_context(_pipe);
341    struct pipe_context *pipe = id_pipe->pipe;
342
343    pipe->delete_fs_state(pipe,
344                          fs);
345 }
346
347 static void *
348 identity_create_vs_state(struct pipe_context *_pipe,
349                          const struct pipe_shader_state *vs)
350 {
351    struct identity_context *id_pipe = identity_context(_pipe);
352    struct pipe_context *pipe = id_pipe->pipe;
353
354    return pipe->create_vs_state(pipe,
355                                 vs);
356 }
357
358 static void
359 identity_bind_vs_state(struct pipe_context *_pipe,
360                        void *vs)
361 {
362    struct identity_context *id_pipe = identity_context(_pipe);
363    struct pipe_context *pipe = id_pipe->pipe;
364
365    pipe->bind_vs_state(pipe,
366                        vs);
367 }
368
369 static void
370 identity_delete_vs_state(struct pipe_context *_pipe,
371                          void *vs)
372 {
373    struct identity_context *id_pipe = identity_context(_pipe);
374    struct pipe_context *pipe = id_pipe->pipe;
375
376    pipe->delete_vs_state(pipe,
377                          vs);
378 }
379
380
381 static void
382 identity_create_vertex_elements_state(struct pipe_context *_pipe,
383                                       unsigned num_elements,
384                                       const struct pipe_vertex_element *vertex_elements)
385 {
386    struct identity_context *id_pipe = identity_context(_pipe);
387    struct pipe_context *pipe = id_pipe->pipe;
388
389    pipe->create_vertex_elements_state(pipe,
390                                       num_elements,
391                                       vertex_elements);
392 }
393
394 static void
395 identity_bind_vertex_elements_state(struct pipe_context *_pipe,
396                                     void *velems)
397 {
398    struct identity_context *id_pipe = identity_context(_pipe);
399    struct pipe_context *pipe = id_pipe->pipe;
400
401    pipe->bind_vertex_elements_state(pipe,
402                                     velems);
403 }
404
405 static void
406 identity_delete_vertex_elements_state(struct pipe_context *_pipe,
407                                       void *velems)
408 {
409    struct identity_context *id_pipe = identity_context(_pipe);
410    struct pipe_context *pipe = id_pipe->pipe;
411
412    pipe->delete_vertex_elements_state(pipe,
413                                       velems);
414 }
415
416 static void
417 identity_set_blend_color(struct pipe_context *_pipe,
418                          const struct pipe_blend_color *blend_color)
419 {
420    struct identity_context *id_pipe = identity_context(_pipe);
421    struct pipe_context *pipe = id_pipe->pipe;
422
423    pipe->set_blend_color(pipe,
424                          blend_color);
425 }
426
427 static void
428 identity_set_stencil_ref(struct pipe_context *_pipe,
429                          const struct pipe_stencil_ref *stencil_ref)
430 {
431    struct identity_context *id_pipe = identity_context(_pipe);
432    struct pipe_context *pipe = id_pipe->pipe;
433
434    pipe->set_stencil_ref(pipe,
435                          stencil_ref);
436 }
437
438 static void
439 identity_set_clip_state(struct pipe_context *_pipe,
440                         const struct pipe_clip_state *clip)
441 {
442    struct identity_context *id_pipe = identity_context(_pipe);
443    struct pipe_context *pipe = id_pipe->pipe;
444
445    pipe->set_clip_state(pipe,
446                         clip);
447 }
448
449 static void
450 identity_set_constant_buffer(struct pipe_context *_pipe,
451                              uint shader,
452                              uint index,
453                              struct pipe_buffer *_buffer)
454 {
455    struct identity_context *id_pipe = identity_context(_pipe);
456    struct pipe_context *pipe = id_pipe->pipe;
457    struct pipe_buffer *unwrapped_buffer;
458    struct pipe_buffer *buffer = NULL;
459
460    /* XXX hmm? unwrap the input state */
461    if (_buffer) {
462       unwrapped_buffer = identity_buffer_unwrap(_buffer);
463       buffer = unwrapped_buffer;
464    }
465
466    pipe->set_constant_buffer(pipe,
467                              shader,
468                              index,
469                              buffer);
470 }
471
472 static void
473 identity_set_framebuffer_state(struct pipe_context *_pipe,
474                                const struct pipe_framebuffer_state *_state)
475 {
476    struct identity_context *id_pipe = identity_context(_pipe);
477    struct pipe_context *pipe = id_pipe->pipe;
478    struct pipe_framebuffer_state unwrapped_state;
479    struct pipe_framebuffer_state *state = NULL;
480    unsigned i;
481
482    /* unwrap the input state */
483    if (_state) {
484       memcpy(&unwrapped_state, _state, sizeof(unwrapped_state));
485       for(i = 0; i < _state->nr_cbufs; i++)
486          unwrapped_state.cbufs[i] = identity_surface_unwrap(_state->cbufs[i]);
487       for (; i < PIPE_MAX_COLOR_BUFS; i++)
488          unwrapped_state.cbufs[i] = NULL;
489       unwrapped_state.zsbuf = identity_surface_unwrap(_state->zsbuf);
490       state = &unwrapped_state;
491    }
492
493    pipe->set_framebuffer_state(pipe,
494                                state);
495 }
496
497 static void
498 identity_set_polygon_stipple(struct pipe_context *_pipe,
499                              const struct pipe_poly_stipple *poly_stipple)
500 {
501    struct identity_context *id_pipe = identity_context(_pipe);
502    struct pipe_context *pipe = id_pipe->pipe;
503
504    pipe->set_polygon_stipple(pipe,
505                              poly_stipple);
506 }
507
508 static void
509 identity_set_scissor_state(struct pipe_context *_pipe,
510                            const struct pipe_scissor_state *scissor)
511 {
512    struct identity_context *id_pipe = identity_context(_pipe);
513    struct pipe_context *pipe = id_pipe->pipe;
514
515    pipe->set_scissor_state(pipe,
516                            scissor);
517 }
518
519 static void
520 identity_set_viewport_state(struct pipe_context *_pipe,
521                             const struct pipe_viewport_state *viewport)
522 {
523    struct identity_context *id_pipe = identity_context(_pipe);
524    struct pipe_context *pipe = id_pipe->pipe;
525
526    pipe->set_viewport_state(pipe,
527                             viewport);
528 }
529
530 static void
531 identity_set_fragment_sampler_textures(struct pipe_context *_pipe,
532                                        unsigned num_textures,
533                                        struct pipe_texture **_textures)
534 {
535    struct identity_context *id_pipe = identity_context(_pipe);
536    struct pipe_context *pipe = id_pipe->pipe;
537    struct pipe_texture *unwrapped_textures[PIPE_MAX_SAMPLERS];
538    struct pipe_texture **textures = NULL;
539    unsigned i;
540
541    if (_textures) {
542       for (i = 0; i < num_textures; i++)
543          unwrapped_textures[i] = identity_texture_unwrap(_textures[i]);
544       for (; i < PIPE_MAX_SAMPLERS; i++)
545          unwrapped_textures[i] = NULL;
546
547       textures = unwrapped_textures;
548    }
549
550    pipe->set_fragment_sampler_textures(pipe,
551                                        num_textures,
552                                        textures);
553 }
554
555 static void
556 identity_set_vertex_sampler_textures(struct pipe_context *_pipe,
557                                      unsigned num_textures,
558                                      struct pipe_texture **_textures)
559 {
560    struct identity_context *id_pipe = identity_context(_pipe);
561    struct pipe_context *pipe = id_pipe->pipe;
562    struct pipe_texture *unwrapped_textures[PIPE_MAX_VERTEX_SAMPLERS];
563    struct pipe_texture **textures = NULL;
564    unsigned i;
565
566    if (_textures) {
567       for (i = 0; i < num_textures; i++)
568          unwrapped_textures[i] = identity_texture_unwrap(_textures[i]);
569       for (; i < PIPE_MAX_VERTEX_SAMPLERS; i++)
570          unwrapped_textures[i] = NULL;
571
572       textures = unwrapped_textures;
573    }
574
575    pipe->set_vertex_sampler_textures(pipe,
576                                      num_textures,
577                                      textures);
578 }
579
580 static void
581 identity_set_vertex_buffers(struct pipe_context *_pipe,
582                             unsigned num_buffers,
583                             const struct pipe_vertex_buffer *_buffers)
584 {
585    struct identity_context *id_pipe = identity_context(_pipe);
586    struct pipe_context *pipe = id_pipe->pipe;
587    struct pipe_vertex_buffer unwrapped_buffers[PIPE_MAX_SHADER_INPUTS];
588    struct pipe_vertex_buffer *buffers = NULL;
589    unsigned i;
590
591    if (num_buffers) {
592       memcpy(unwrapped_buffers, _buffers, num_buffers * sizeof(*_buffers));
593       for (i = 0; i < num_buffers; i++)
594          unwrapped_buffers[i].buffer = identity_buffer_unwrap(_buffers[i].buffer);
595       buffers = unwrapped_buffers;
596    }
597
598    pipe->set_vertex_buffers(pipe,
599                             num_buffers,
600                             buffers);
601 }
602 static void
603 identity_surface_copy(struct pipe_context *_pipe,
604                       struct pipe_surface *_dst,
605                       unsigned dstx,
606                       unsigned dsty,
607                       struct pipe_surface *_src,
608                       unsigned srcx,
609                       unsigned srcy,
610                       unsigned width,
611                       unsigned height)
612 {
613    struct identity_context *id_pipe = identity_context(_pipe);
614    struct identity_surface *id_surface_dst = identity_surface(_dst);
615    struct identity_surface *id_surface_src = identity_surface(_src);
616    struct pipe_context *pipe = id_pipe->pipe;
617    struct pipe_surface *dst = id_surface_dst->surface;
618    struct pipe_surface *src = id_surface_src->surface;
619
620    pipe->surface_copy(pipe,
621                       dst,
622                       dstx,
623                       dsty,
624                       src,
625                       srcx,
626                       srcy,
627                       width,
628                       height);
629 }
630
631 static void
632 identity_surface_fill(struct pipe_context *_pipe,
633                       struct pipe_surface *_dst,
634                       unsigned dstx,
635                       unsigned dsty,
636                       unsigned width,
637                       unsigned height,
638                       unsigned value)
639 {
640    struct identity_context *id_pipe = identity_context(_pipe);
641    struct identity_surface *id_surface_dst = identity_surface(_dst);
642    struct pipe_context *pipe = id_pipe->pipe;
643    struct pipe_surface *dst = id_surface_dst->surface;
644
645    pipe->surface_fill(pipe,
646                       dst,
647                       dstx,
648                       dsty,
649                       width,
650                       height,
651                       value);
652 }
653
654 static void
655 identity_clear(struct pipe_context *_pipe,
656                unsigned buffers,
657                const float *rgba,
658                double depth,
659                unsigned stencil)
660 {
661    struct identity_context *id_pipe = identity_context(_pipe);
662    struct pipe_context *pipe = id_pipe->pipe;
663
664    pipe->clear(pipe,
665                buffers,
666                rgba,
667                depth,
668                stencil);
669 }
670
671 static void
672 identity_flush(struct pipe_context *_pipe,
673                unsigned flags,
674                struct pipe_fence_handle **fence)
675 {
676    struct identity_context *id_pipe = identity_context(_pipe);
677    struct pipe_context *pipe = id_pipe->pipe;
678
679    pipe->flush(pipe,
680                flags,
681                fence);
682 }
683
684 static unsigned int
685 identity_is_texture_referenced(struct pipe_context *_pipe,
686                                struct pipe_texture *_texture,
687                                unsigned face,
688                                unsigned level)
689 {
690    struct identity_context *id_pipe = identity_context(_pipe);
691    struct identity_texture *id_texture = identity_texture(_texture);
692    struct pipe_context *pipe = id_pipe->pipe;
693    struct pipe_texture *texture = id_texture->texture;
694
695    return pipe->is_texture_referenced(pipe,
696                                       texture,
697                                       face,
698                                       level);
699 }
700
701 static unsigned int
702 identity_is_buffer_referenced(struct pipe_context *_pipe,
703                               struct pipe_buffer *_buffer)
704 {
705    struct identity_context *id_pipe = identity_context(_pipe);
706    struct identity_buffer *id_buffer = identity_buffer(_buffer);
707    struct pipe_context *pipe = id_pipe->pipe;
708    struct pipe_buffer *buffer = id_buffer->buffer;
709
710    return pipe->is_buffer_referenced(pipe,
711                                      buffer);
712 }
713
714 struct pipe_context *
715 identity_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
716 {
717    struct identity_context *id_pipe;
718    (void)identity_screen(_screen);
719
720    id_pipe = CALLOC_STRUCT(identity_context);
721    if (!id_pipe) {
722       return NULL;
723    }
724
725    id_pipe->base.winsys = NULL;
726    id_pipe->base.screen = _screen;
727    id_pipe->base.priv = pipe->priv; /* expose wrapped data */
728    id_pipe->base.draw = NULL;
729
730    id_pipe->base.destroy = identity_destroy;
731    id_pipe->base.draw_arrays = identity_draw_arrays;
732    id_pipe->base.draw_elements = identity_draw_elements;
733    id_pipe->base.draw_range_elements = identity_draw_range_elements;
734    id_pipe->base.create_query = identity_create_query;
735    id_pipe->base.destroy_query = identity_destroy_query;
736    id_pipe->base.begin_query = identity_begin_query;
737    id_pipe->base.end_query = identity_end_query;
738    id_pipe->base.get_query_result = identity_get_query_result;
739    id_pipe->base.create_blend_state = identity_create_blend_state;
740    id_pipe->base.bind_blend_state = identity_bind_blend_state;
741    id_pipe->base.delete_blend_state = identity_delete_blend_state;
742    id_pipe->base.create_sampler_state = identity_create_sampler_state;
743    id_pipe->base.bind_fragment_sampler_states = identity_bind_fragment_sampler_states;
744    id_pipe->base.bind_vertex_sampler_states = identity_bind_vertex_sampler_states;
745    id_pipe->base.delete_sampler_state = identity_delete_sampler_state;
746    id_pipe->base.create_rasterizer_state = identity_create_rasterizer_state;
747    id_pipe->base.bind_rasterizer_state = identity_bind_rasterizer_state;
748    id_pipe->base.delete_rasterizer_state = identity_delete_rasterizer_state;
749    id_pipe->base.create_depth_stencil_alpha_state = identity_create_depth_stencil_alpha_state;
750    id_pipe->base.bind_depth_stencil_alpha_state = identity_bind_depth_stencil_alpha_state;
751    id_pipe->base.delete_depth_stencil_alpha_state = identity_delete_depth_stencil_alpha_state;
752    id_pipe->base.create_fs_state = identity_create_fs_state;
753    id_pipe->base.bind_fs_state = identity_bind_fs_state;
754    id_pipe->base.delete_fs_state = identity_delete_fs_state;
755    id_pipe->base.create_vs_state = identity_create_vs_state;
756    id_pipe->base.bind_vs_state = identity_bind_vs_state;
757    id_pipe->base.delete_vs_state = identity_delete_vs_state;
758    id_pipe->base.create_vertex_elements_state = identity_create_vertex_elements_state;
759    id_pipe->base.bind_vertex_elements_state = identity_bind_vertex_elements_state;
760    id_pipe->base.delete_vertex_elements_state = identity_delete_vertex_elements_state;
761    id_pipe->base.set_blend_color = identity_set_blend_color;
762    id_pipe->base.set_stencil_ref = identity_set_stencil_ref;
763    id_pipe->base.set_clip_state = identity_set_clip_state;
764    id_pipe->base.set_constant_buffer = identity_set_constant_buffer;
765    id_pipe->base.set_framebuffer_state = identity_set_framebuffer_state;
766    id_pipe->base.set_polygon_stipple = identity_set_polygon_stipple;
767    id_pipe->base.set_scissor_state = identity_set_scissor_state;
768    id_pipe->base.set_viewport_state = identity_set_viewport_state;
769    id_pipe->base.set_fragment_sampler_textures = identity_set_fragment_sampler_textures;
770    id_pipe->base.set_vertex_sampler_textures = identity_set_vertex_sampler_textures;
771    id_pipe->base.set_vertex_buffers = identity_set_vertex_buffers;
772    id_pipe->base.surface_copy = identity_surface_copy;
773    id_pipe->base.surface_fill = identity_surface_fill;
774    id_pipe->base.clear = identity_clear;
775    id_pipe->base.flush = identity_flush;
776    id_pipe->base.is_texture_referenced = identity_is_texture_referenced;
777    id_pipe->base.is_buffer_referenced = identity_is_buffer_referenced;
778
779    id_pipe->pipe = pipe;
780
781    return &id_pipe->base;
782 }