rbug_context.c revision 96d882939d612fcc8332f107befec470ed4359de
1/**************************************************************************
2 *
3 * Copyright 2010 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#include "util/u_simple_list.h"
33
34#include "rbug/rbug_context.h"
35
36#include "rbug_context.h"
37#include "rbug_objects.h"
38
39
40static void
41rbug_destroy(struct pipe_context *_pipe)
42{
43   struct rbug_context *rb_pipe = rbug_context(_pipe);
44   struct pipe_context *pipe = rb_pipe->pipe;
45
46   remove_from_list(&rb_pipe->list);
47   pipe_mutex_lock(rb_pipe->call_mutex);
48   pipe->destroy(pipe);
49   rb_pipe->pipe = NULL;
50   pipe_mutex_unlock(rb_pipe->call_mutex);
51
52   FREE(rb_pipe);
53}
54
55static void
56rbug_draw_block_locked(struct rbug_context *rb_pipe, int flag)
57{
58
59   if (rb_pipe->draw_blocker & flag) {
60      rb_pipe->draw_blocked |= flag;
61   } else if ((rb_pipe->draw_rule.blocker & flag) &&
62              (rb_pipe->draw_blocker & RBUG_BLOCK_RULE)) {
63      int k;
64      boolean block = FALSE;
65      debug_printf("%s (%p %p) (%p %p) (%p %u) (%p %u)\n", __FUNCTION__,
66                   (void *) rb_pipe->draw_rule.fs, (void *) rb_pipe->curr.fs,
67                   (void *) rb_pipe->draw_rule.vs, (void *) rb_pipe->curr.vs,
68                   (void *) rb_pipe->draw_rule.surf, 0,
69                   (void *) rb_pipe->draw_rule.texture, 0);
70      if (rb_pipe->draw_rule.fs &&
71          rb_pipe->draw_rule.fs == rb_pipe->curr.fs)
72         block = TRUE;
73      if (rb_pipe->draw_rule.vs &&
74          rb_pipe->draw_rule.vs == rb_pipe->curr.vs)
75         block = TRUE;
76      if (rb_pipe->draw_rule.surf &&
77          rb_pipe->draw_rule.surf == rb_pipe->curr.zsbuf)
78            block = TRUE;
79      if (rb_pipe->draw_rule.surf)
80         for (k = 0; k < rb_pipe->curr.nr_cbufs; k++)
81            if (rb_pipe->draw_rule.surf == rb_pipe->curr.cbufs[k])
82               block = TRUE;
83      if (rb_pipe->draw_rule.texture) {
84         for (k = 0; k < rb_pipe->curr.num_fs_views; k++)
85            if (rb_pipe->draw_rule.texture == rb_pipe->curr.fs_texs[k])
86               block = TRUE;
87         for (k = 0; k < rb_pipe->curr.num_vs_views; k++) {
88            if (rb_pipe->draw_rule.texture == rb_pipe->curr.vs_texs[k]) {
89               block = TRUE;
90            }
91         }
92      }
93
94      if (block)
95         rb_pipe->draw_blocked |= (flag | RBUG_BLOCK_RULE);
96   }
97
98   if (rb_pipe->draw_blocked)
99      rbug_notify_draw_blocked(rb_pipe);
100
101   /* wait for rbug to clear the blocked flag */
102   while (rb_pipe->draw_blocked & flag) {
103      rb_pipe->draw_blocked |= flag;
104      pipe_condvar_wait(rb_pipe->draw_cond, rb_pipe->draw_mutex);
105   }
106
107}
108
109static void
110rbug_draw_vbo(struct pipe_context *_pipe, const struct pipe_draw_info *info)
111{
112   struct rbug_context *rb_pipe = rbug_context(_pipe);
113   struct pipe_context *pipe = rb_pipe->pipe;
114
115   pipe_mutex_lock(rb_pipe->draw_mutex);
116   rbug_draw_block_locked(rb_pipe, RBUG_BLOCK_BEFORE);
117
118   pipe_mutex_lock(rb_pipe->call_mutex);
119   if (!(rb_pipe->curr.fs && rb_pipe->curr.fs->disabled) &&
120       !(rb_pipe->curr.gs && rb_pipe->curr.gs->disabled) &&
121       !(rb_pipe->curr.vs && rb_pipe->curr.vs->disabled))
122      pipe->draw_vbo(pipe, info);
123   pipe_mutex_unlock(rb_pipe->call_mutex);
124
125   rbug_draw_block_locked(rb_pipe, RBUG_BLOCK_AFTER);
126   pipe_mutex_unlock(rb_pipe->draw_mutex);
127}
128
129static struct pipe_query *
130rbug_create_query(struct pipe_context *_pipe,
131                  unsigned query_type)
132{
133   struct rbug_context *rb_pipe = rbug_context(_pipe);
134   struct pipe_context *pipe = rb_pipe->pipe;
135
136   pipe_mutex_lock(rb_pipe->call_mutex);
137   return pipe->create_query(pipe,
138                             query_type);
139   pipe_mutex_unlock(rb_pipe->call_mutex);
140}
141
142static void
143rbug_destroy_query(struct pipe_context *_pipe,
144                   struct pipe_query *query)
145{
146   struct rbug_context *rb_pipe = rbug_context(_pipe);
147   struct pipe_context *pipe = rb_pipe->pipe;
148
149   pipe_mutex_lock(rb_pipe->call_mutex);
150   pipe->destroy_query(pipe,
151                       query);
152   pipe_mutex_unlock(rb_pipe->call_mutex);
153}
154
155static void
156rbug_begin_query(struct pipe_context *_pipe,
157                 struct pipe_query *query)
158{
159   struct rbug_context *rb_pipe = rbug_context(_pipe);
160   struct pipe_context *pipe = rb_pipe->pipe;
161
162   pipe_mutex_lock(rb_pipe->call_mutex);
163   pipe->begin_query(pipe,
164                     query);
165   pipe_mutex_unlock(rb_pipe->call_mutex);
166}
167
168static void
169rbug_end_query(struct pipe_context *_pipe,
170               struct pipe_query *query)
171{
172   struct rbug_context *rb_pipe = rbug_context(_pipe);
173   struct pipe_context *pipe = rb_pipe->pipe;
174
175   pipe_mutex_lock(rb_pipe->call_mutex);
176   pipe->end_query(pipe,
177                   query);
178   pipe_mutex_unlock(rb_pipe->call_mutex);
179}
180
181static boolean
182rbug_get_query_result(struct pipe_context *_pipe,
183                      struct pipe_query *query,
184                      boolean wait,
185                      void *result)
186{
187   struct rbug_context *rb_pipe = rbug_context(_pipe);
188   struct pipe_context *pipe = rb_pipe->pipe;
189   boolean ret;
190
191   pipe_mutex_lock(rb_pipe->call_mutex);
192   ret = pipe->get_query_result(pipe,
193                                query,
194                                wait,
195                                result);
196   pipe_mutex_unlock(rb_pipe->call_mutex);
197
198   return ret;
199}
200
201static void *
202rbug_create_blend_state(struct pipe_context *_pipe,
203                        const struct pipe_blend_state *blend)
204{
205   struct rbug_context *rb_pipe = rbug_context(_pipe);
206   struct pipe_context *pipe = rb_pipe->pipe;
207   void *ret;
208
209   pipe_mutex_lock(rb_pipe->call_mutex);
210   ret = pipe->create_blend_state(pipe,
211                                  blend);
212   pipe_mutex_unlock(rb_pipe->call_mutex);
213
214   return ret;
215}
216
217static void
218rbug_bind_blend_state(struct pipe_context *_pipe,
219                      void *blend)
220{
221   struct rbug_context *rb_pipe = rbug_context(_pipe);
222   struct pipe_context *pipe = rb_pipe->pipe;
223
224   pipe_mutex_lock(rb_pipe->call_mutex);
225   pipe->bind_blend_state(pipe,
226                          blend);
227   pipe_mutex_unlock(rb_pipe->call_mutex);
228}
229
230static void
231rbug_delete_blend_state(struct pipe_context *_pipe,
232                        void *blend)
233{
234   struct rbug_context *rb_pipe = rbug_context(_pipe);
235   struct pipe_context *pipe = rb_pipe->pipe;
236
237   pipe_mutex_lock(rb_pipe->call_mutex);
238   pipe->delete_blend_state(pipe,
239                            blend);
240   pipe_mutex_unlock(rb_pipe->call_mutex);
241}
242
243static void *
244rbug_create_sampler_state(struct pipe_context *_pipe,
245                          const struct pipe_sampler_state *sampler)
246{
247   struct rbug_context *rb_pipe = rbug_context(_pipe);
248   struct pipe_context *pipe = rb_pipe->pipe;
249   void *ret;
250
251   pipe_mutex_lock(rb_pipe->call_mutex);
252   ret = pipe->create_sampler_state(pipe,
253                                    sampler);
254   pipe_mutex_unlock(rb_pipe->call_mutex);
255
256   return ret;
257}
258
259static void
260rbug_bind_fragment_sampler_states(struct pipe_context *_pipe,
261                                  unsigned num_samplers,
262                                  void **samplers)
263{
264   struct rbug_context *rb_pipe = rbug_context(_pipe);
265   struct pipe_context *pipe = rb_pipe->pipe;
266
267   pipe_mutex_lock(rb_pipe->call_mutex);
268   pipe->bind_fragment_sampler_states(pipe,
269                                      num_samplers,
270                                      samplers);
271   pipe_mutex_unlock(rb_pipe->call_mutex);
272}
273
274static void
275rbug_bind_vertex_sampler_states(struct pipe_context *_pipe,
276                                unsigned num_samplers,
277                                void **samplers)
278{
279   struct rbug_context *rb_pipe = rbug_context(_pipe);
280   struct pipe_context *pipe = rb_pipe->pipe;
281
282   pipe_mutex_lock(rb_pipe->call_mutex);
283   pipe->bind_vertex_sampler_states(pipe,
284                                    num_samplers,
285                                    samplers);
286   pipe_mutex_unlock(rb_pipe->call_mutex);
287}
288
289static void
290rbug_delete_sampler_state(struct pipe_context *_pipe,
291                          void *sampler)
292{
293   struct rbug_context *rb_pipe = rbug_context(_pipe);
294   struct pipe_context *pipe = rb_pipe->pipe;
295
296   pipe_mutex_lock(rb_pipe->call_mutex);
297   pipe->delete_sampler_state(pipe,
298                              sampler);
299   pipe_mutex_unlock(rb_pipe->call_mutex);
300}
301
302static void *
303rbug_create_rasterizer_state(struct pipe_context *_pipe,
304                             const struct pipe_rasterizer_state *rasterizer)
305{
306   struct rbug_context *rb_pipe = rbug_context(_pipe);
307   struct pipe_context *pipe = rb_pipe->pipe;
308   void *ret;
309
310   pipe_mutex_lock(rb_pipe->call_mutex);
311   ret = pipe->create_rasterizer_state(pipe,
312                                       rasterizer);
313   pipe_mutex_unlock(rb_pipe->call_mutex);
314
315   return ret;
316}
317
318static void
319rbug_bind_rasterizer_state(struct pipe_context *_pipe,
320                           void *rasterizer)
321{
322   struct rbug_context *rb_pipe = rbug_context(_pipe);
323   struct pipe_context *pipe = rb_pipe->pipe;
324
325   pipe_mutex_lock(rb_pipe->call_mutex);
326   pipe->bind_rasterizer_state(pipe,
327                               rasterizer);
328   pipe_mutex_unlock(rb_pipe->call_mutex);
329}
330
331static void
332rbug_delete_rasterizer_state(struct pipe_context *_pipe,
333                             void *rasterizer)
334{
335   struct rbug_context *rb_pipe = rbug_context(_pipe);
336   struct pipe_context *pipe = rb_pipe->pipe;
337
338   pipe_mutex_lock(rb_pipe->call_mutex);
339   pipe->delete_rasterizer_state(pipe,
340                                 rasterizer);
341   pipe_mutex_unlock(rb_pipe->call_mutex);
342}
343
344static void *
345rbug_create_depth_stencil_alpha_state(struct pipe_context *_pipe,
346                                      const struct pipe_depth_stencil_alpha_state *depth_stencil_alpha)
347{
348   struct rbug_context *rb_pipe = rbug_context(_pipe);
349   struct pipe_context *pipe = rb_pipe->pipe;
350   void *ret;
351
352   pipe_mutex_lock(rb_pipe->call_mutex);
353   ret = pipe->create_depth_stencil_alpha_state(pipe,
354                                                depth_stencil_alpha);
355   pipe_mutex_unlock(rb_pipe->call_mutex);
356
357   return ret;
358}
359
360static void
361rbug_bind_depth_stencil_alpha_state(struct pipe_context *_pipe,
362                                    void *depth_stencil_alpha)
363{
364   struct rbug_context *rb_pipe = rbug_context(_pipe);
365   struct pipe_context *pipe = rb_pipe->pipe;
366
367   pipe_mutex_lock(rb_pipe->call_mutex);
368   pipe->bind_depth_stencil_alpha_state(pipe,
369                                        depth_stencil_alpha);
370   pipe_mutex_unlock(rb_pipe->call_mutex);
371}
372
373static void
374rbug_delete_depth_stencil_alpha_state(struct pipe_context *_pipe,
375                                      void *depth_stencil_alpha)
376{
377   struct rbug_context *rb_pipe = rbug_context(_pipe);
378   struct pipe_context *pipe = rb_pipe->pipe;
379
380   pipe_mutex_lock(rb_pipe->call_mutex);
381   pipe->delete_depth_stencil_alpha_state(pipe,
382                                          depth_stencil_alpha);
383   pipe_mutex_unlock(rb_pipe->call_mutex);
384}
385
386static void *
387rbug_create_fs_state(struct pipe_context *_pipe,
388                     const struct pipe_shader_state *state)
389{
390   struct rbug_context *rb_pipe = rbug_context(_pipe);
391   struct pipe_context *pipe = rb_pipe->pipe;
392   void *result;
393
394   pipe_mutex_lock(rb_pipe->call_mutex);
395   result = pipe->create_fs_state(pipe, state);
396   pipe_mutex_unlock(rb_pipe->call_mutex);
397
398   if (!result)
399      return NULL;
400
401   return rbug_shader_create(rb_pipe, state, result, RBUG_SHADER_FRAGMENT);
402}
403
404static void
405rbug_bind_fs_state(struct pipe_context *_pipe,
406                   void *_fs)
407{
408   struct rbug_context *rb_pipe = rbug_context(_pipe);
409   struct pipe_context *pipe = rb_pipe->pipe;
410   void *fs;
411
412   pipe_mutex_lock(rb_pipe->call_mutex);
413
414   fs = rbug_shader_unwrap(_fs);
415   rb_pipe->curr.fs = rbug_shader(_fs);
416   pipe->bind_fs_state(pipe,
417                       fs);
418
419   pipe_mutex_unlock(rb_pipe->call_mutex);
420}
421
422static void
423rbug_delete_fs_state(struct pipe_context *_pipe,
424                     void *_fs)
425{
426   struct rbug_context *rb_pipe = rbug_context(_pipe);
427   struct rbug_shader *rb_shader = rbug_shader(_fs);
428
429   pipe_mutex_lock(rb_pipe->call_mutex);
430   rbug_shader_destroy(rb_pipe, rb_shader);
431   pipe_mutex_unlock(rb_pipe->call_mutex);
432}
433
434static void *
435rbug_create_vs_state(struct pipe_context *_pipe,
436                     const struct pipe_shader_state *state)
437{
438   struct rbug_context *rb_pipe = rbug_context(_pipe);
439   struct pipe_context *pipe = rb_pipe->pipe;
440   void *result;
441
442   pipe_mutex_lock(rb_pipe->call_mutex);
443   result = pipe->create_vs_state(pipe, state);
444   pipe_mutex_unlock(rb_pipe->call_mutex);
445
446   if (!result)
447      return NULL;
448
449   return rbug_shader_create(rb_pipe, state, result, RBUG_SHADER_VERTEX);
450}
451
452static void
453rbug_bind_vs_state(struct pipe_context *_pipe,
454                   void *_vs)
455{
456   struct rbug_context *rb_pipe = rbug_context(_pipe);
457   struct pipe_context *pipe = rb_pipe->pipe;
458   void *vs;
459
460   pipe_mutex_lock(rb_pipe->call_mutex);
461
462   vs = rbug_shader_unwrap(_vs);
463   rb_pipe->curr.vs = rbug_shader(_vs);
464   pipe->bind_vs_state(pipe,
465                       vs);
466
467   pipe_mutex_unlock(rb_pipe->call_mutex);
468}
469
470static void
471rbug_delete_vs_state(struct pipe_context *_pipe,
472                     void *_vs)
473{
474   struct rbug_context *rb_pipe = rbug_context(_pipe);
475   struct rbug_shader *rb_shader = rbug_shader(_vs);
476
477   pipe_mutex_unlock(rb_pipe->call_mutex);
478   rbug_shader_destroy(rb_pipe, rb_shader);
479   pipe_mutex_unlock(rb_pipe->call_mutex);
480}
481
482static void *
483rbug_create_gs_state(struct pipe_context *_pipe,
484                     const struct pipe_shader_state *state)
485{
486   struct rbug_context *rb_pipe = rbug_context(_pipe);
487   struct pipe_context *pipe = rb_pipe->pipe;
488   void *result;
489
490   pipe_mutex_lock(rb_pipe->call_mutex);
491   result = pipe->create_gs_state(pipe, state);
492   pipe_mutex_unlock(rb_pipe->call_mutex);
493
494   if (!result)
495      return NULL;
496
497   return rbug_shader_create(rb_pipe, state, result, RBUG_SHADER_GEOM);
498}
499
500static void
501rbug_bind_gs_state(struct pipe_context *_pipe,
502                   void *_gs)
503{
504   struct rbug_context *rb_pipe = rbug_context(_pipe);
505   struct pipe_context *pipe = rb_pipe->pipe;
506   void *gs;
507
508   pipe_mutex_lock(rb_pipe->call_mutex);
509
510   gs = rbug_shader_unwrap(_gs);
511   rb_pipe->curr.gs = rbug_shader(_gs);
512   pipe->bind_gs_state(pipe,
513                       gs);
514
515   pipe_mutex_unlock(rb_pipe->call_mutex);
516}
517
518static void
519rbug_delete_gs_state(struct pipe_context *_pipe,
520                     void *_gs)
521{
522   struct rbug_context *rb_pipe = rbug_context(_pipe);
523   struct rbug_shader *rb_shader = rbug_shader(_gs);
524
525   pipe_mutex_lock(rb_pipe->call_mutex);
526   rbug_shader_destroy(rb_pipe, rb_shader);
527   pipe_mutex_unlock(rb_pipe->call_mutex);
528}
529
530static void *
531rbug_create_vertex_elements_state(struct pipe_context *_pipe,
532                                  unsigned num_elements,
533                                  const struct pipe_vertex_element *vertex_elements)
534{
535   struct rbug_context *rb_pipe = rbug_context(_pipe);
536   struct pipe_context *pipe = rb_pipe->pipe;
537   void *ret;
538
539   pipe_mutex_lock(rb_pipe->call_mutex);
540   ret = pipe->create_vertex_elements_state(pipe,
541                                             num_elements,
542                                             vertex_elements);
543   pipe_mutex_unlock(rb_pipe->call_mutex);
544
545   return ret;
546}
547
548static void
549rbug_bind_vertex_elements_state(struct pipe_context *_pipe,
550                                void *velems)
551{
552   struct rbug_context *rb_pipe = rbug_context(_pipe);
553   struct pipe_context *pipe = rb_pipe->pipe;
554
555   pipe_mutex_lock(rb_pipe->call_mutex);
556   pipe->bind_vertex_elements_state(pipe,
557                                    velems);
558   pipe_mutex_unlock(rb_pipe->call_mutex);
559}
560
561static void
562rbug_delete_vertex_elements_state(struct pipe_context *_pipe,
563                                  void *velems)
564{
565   struct rbug_context *rb_pipe = rbug_context(_pipe);
566   struct pipe_context *pipe = rb_pipe->pipe;
567
568   pipe_mutex_lock(rb_pipe->call_mutex);
569   pipe->delete_vertex_elements_state(pipe,
570                                      velems);
571   pipe_mutex_unlock(rb_pipe->call_mutex);
572}
573
574static void
575rbug_set_blend_color(struct pipe_context *_pipe,
576                     const struct pipe_blend_color *blend_color)
577{
578   struct rbug_context *rb_pipe = rbug_context(_pipe);
579   struct pipe_context *pipe = rb_pipe->pipe;
580
581   pipe_mutex_lock(rb_pipe->call_mutex);
582   pipe->set_blend_color(pipe,
583                         blend_color);
584   pipe_mutex_unlock(rb_pipe->call_mutex);
585}
586
587static void
588rbug_set_stencil_ref(struct pipe_context *_pipe,
589                     const struct pipe_stencil_ref *stencil_ref)
590{
591   struct rbug_context *rb_pipe = rbug_context(_pipe);
592   struct pipe_context *pipe = rb_pipe->pipe;
593
594   pipe_mutex_lock(rb_pipe->call_mutex);
595   pipe->set_stencil_ref(pipe,
596                         stencil_ref);
597   pipe_mutex_unlock(rb_pipe->call_mutex);
598}
599
600static void
601rbug_set_clip_state(struct pipe_context *_pipe,
602                    const struct pipe_clip_state *clip)
603{
604   struct rbug_context *rb_pipe = rbug_context(_pipe);
605   struct pipe_context *pipe = rb_pipe->pipe;
606
607   pipe_mutex_lock(rb_pipe->call_mutex);
608   pipe->set_clip_state(pipe,
609                        clip);
610   pipe_mutex_unlock(rb_pipe->call_mutex);
611}
612
613static void
614rbug_set_constant_buffer(struct pipe_context *_pipe,
615                         uint shader,
616                         uint index,
617                         struct pipe_resource *_resource)
618{
619   struct rbug_context *rb_pipe = rbug_context(_pipe);
620   struct pipe_context *pipe = rb_pipe->pipe;
621   struct pipe_resource *unwrapped_resource;
622   struct pipe_resource *resource = NULL;
623
624   /* XXX hmm? unwrap the input state */
625   if (_resource) {
626      unwrapped_resource = rbug_resource_unwrap(_resource);
627      resource = unwrapped_resource;
628   }
629
630   pipe_mutex_lock(rb_pipe->call_mutex);
631   pipe->set_constant_buffer(pipe,
632                             shader,
633                             index,
634                             resource);
635   pipe_mutex_unlock(rb_pipe->call_mutex);
636}
637
638static void
639rbug_set_framebuffer_state(struct pipe_context *_pipe,
640                           const struct pipe_framebuffer_state *_state)
641{
642   struct rbug_context *rb_pipe = rbug_context(_pipe);
643   struct pipe_context *pipe = rb_pipe->pipe;
644   struct pipe_framebuffer_state unwrapped_state;
645   struct pipe_framebuffer_state *state = NULL;
646   unsigned i;
647
648   /* must protect curr status */
649   pipe_mutex_lock(rb_pipe->call_mutex);
650
651   rb_pipe->curr.nr_cbufs = 0;
652   memset(rb_pipe->curr.cbufs, 0, sizeof(rb_pipe->curr.cbufs));
653   rb_pipe->curr.zsbuf = NULL;
654
655   /* unwrap the input state */
656   if (_state) {
657      memcpy(&unwrapped_state, _state, sizeof(unwrapped_state));
658
659      rb_pipe->curr.nr_cbufs = _state->nr_cbufs;
660      for(i = 0; i < _state->nr_cbufs; i++) {
661         unwrapped_state.cbufs[i] = rbug_surface_unwrap(_state->cbufs[i]);
662         if (_state->cbufs[i])
663            rb_pipe->curr.cbufs[i] = rbug_resource(_state->cbufs[i]->texture);
664      }
665      unwrapped_state.zsbuf = rbug_surface_unwrap(_state->zsbuf);
666      if (_state->zsbuf)
667         rb_pipe->curr.zsbuf = rbug_resource(_state->zsbuf->texture);
668      state = &unwrapped_state;
669   }
670
671   pipe->set_framebuffer_state(pipe,
672                               state);
673
674   pipe_mutex_unlock(rb_pipe->call_mutex);
675}
676
677static void
678rbug_set_polygon_stipple(struct pipe_context *_pipe,
679                         const struct pipe_poly_stipple *poly_stipple)
680{
681   struct rbug_context *rb_pipe = rbug_context(_pipe);
682   struct pipe_context *pipe = rb_pipe->pipe;
683
684   pipe_mutex_lock(rb_pipe->call_mutex);
685   pipe->set_polygon_stipple(pipe,
686                             poly_stipple);
687   pipe_mutex_unlock(rb_pipe->call_mutex);
688}
689
690static void
691rbug_set_scissor_state(struct pipe_context *_pipe,
692                       const struct pipe_scissor_state *scissor)
693{
694   struct rbug_context *rb_pipe = rbug_context(_pipe);
695   struct pipe_context *pipe = rb_pipe->pipe;
696
697   pipe_mutex_lock(rb_pipe->call_mutex);
698   pipe->set_scissor_state(pipe,
699                           scissor);
700   pipe_mutex_unlock(rb_pipe->call_mutex);
701}
702
703static void
704rbug_set_viewport_state(struct pipe_context *_pipe,
705                        const struct pipe_viewport_state *viewport)
706{
707   struct rbug_context *rb_pipe = rbug_context(_pipe);
708   struct pipe_context *pipe = rb_pipe->pipe;
709
710   pipe_mutex_lock(rb_pipe->call_mutex);
711   pipe->set_viewport_state(pipe,
712                            viewport);
713   pipe_mutex_unlock(rb_pipe->call_mutex);
714}
715
716static void
717rbug_set_fragment_sampler_views(struct pipe_context *_pipe,
718                                unsigned num,
719                                struct pipe_sampler_view **_views)
720{
721   struct rbug_context *rb_pipe = rbug_context(_pipe);
722   struct pipe_context *pipe = rb_pipe->pipe;
723   struct pipe_sampler_view *unwrapped_views[PIPE_MAX_SAMPLERS];
724   struct pipe_sampler_view **views = NULL;
725   unsigned i;
726
727   /* must protect curr status */
728   pipe_mutex_lock(rb_pipe->call_mutex);
729
730   rb_pipe->curr.num_fs_views = 0;
731   memset(rb_pipe->curr.fs_views, 0, sizeof(rb_pipe->curr.fs_views));
732   memset(rb_pipe->curr.fs_texs, 0, sizeof(rb_pipe->curr.fs_texs));
733   memset(unwrapped_views, 0, sizeof(unwrapped_views));
734
735   if (_views) {
736      rb_pipe->curr.num_fs_views = num;
737      for (i = 0; i < num; i++) {
738         rb_pipe->curr.fs_views[i] = rbug_sampler_view(_views[i]);
739         rb_pipe->curr.fs_texs[i] = rbug_resource(_views[i] ? _views[i]->texture : NULL);
740         unwrapped_views[i] = rbug_sampler_view_unwrap(_views[i]);
741      }
742      views = unwrapped_views;
743   }
744
745   pipe->set_fragment_sampler_views(pipe, num, views);
746
747   pipe_mutex_unlock(rb_pipe->call_mutex);
748}
749
750static void
751rbug_set_vertex_sampler_views(struct pipe_context *_pipe,
752                              unsigned num,
753                              struct pipe_sampler_view **_views)
754{
755   struct rbug_context *rb_pipe = rbug_context(_pipe);
756   struct pipe_context *pipe = rb_pipe->pipe;
757   struct pipe_sampler_view *unwrapped_views[PIPE_MAX_VERTEX_SAMPLERS];
758   struct pipe_sampler_view **views = NULL;
759   unsigned i;
760
761   /* must protect curr status */
762   pipe_mutex_lock(rb_pipe->call_mutex);
763
764   rb_pipe->curr.num_vs_views = 0;
765   memset(rb_pipe->curr.vs_views, 0, sizeof(rb_pipe->curr.vs_views));
766   memset(rb_pipe->curr.vs_texs, 0, sizeof(rb_pipe->curr.vs_texs));
767   memset(unwrapped_views, 0, sizeof(unwrapped_views));
768
769   if (_views) {
770      rb_pipe->curr.num_vs_views = num;
771      for (i = 0; i < num; i++) {
772         rb_pipe->curr.vs_views[i] = rbug_sampler_view(_views[i]);
773         rb_pipe->curr.vs_texs[i] = rbug_resource(_views[i]->texture);
774         unwrapped_views[i] = rbug_sampler_view_unwrap(_views[i]);
775      }
776      views = unwrapped_views;
777   }
778
779   pipe->set_vertex_sampler_views(pipe, num, views);
780
781   pipe_mutex_unlock(rb_pipe->call_mutex);
782}
783
784static void
785rbug_set_vertex_buffers(struct pipe_context *_pipe,
786                        unsigned num_buffers,
787                        const struct pipe_vertex_buffer *_buffers)
788{
789   struct rbug_context *rb_pipe = rbug_context(_pipe);
790   struct pipe_context *pipe = rb_pipe->pipe;
791   struct pipe_vertex_buffer unwrapped_buffers[PIPE_MAX_SHADER_INPUTS];
792   struct pipe_vertex_buffer *buffers = NULL;
793   unsigned i;
794
795   pipe_mutex_lock(rb_pipe->call_mutex);
796
797   if (num_buffers) {
798      memcpy(unwrapped_buffers, _buffers, num_buffers * sizeof(*_buffers));
799      for (i = 0; i < num_buffers; i++)
800         unwrapped_buffers[i].buffer = rbug_resource_unwrap(_buffers[i].buffer);
801      buffers = unwrapped_buffers;
802   }
803
804   pipe->set_vertex_buffers(pipe,
805                            num_buffers,
806                            buffers);
807
808   pipe_mutex_unlock(rb_pipe->call_mutex);
809}
810
811static void
812rbug_set_index_buffer(struct pipe_context *_pipe,
813                      const struct pipe_index_buffer *_ib)
814{
815   struct rbug_context *rb_pipe = rbug_context(_pipe);
816   struct pipe_context *pipe = rb_pipe->pipe;
817   struct pipe_index_buffer unwrapped_ib, *ib = NULL;
818
819   if (_ib) {
820      unwrapped_ib = *_ib;
821      unwrapped_ib.buffer = rbug_resource_unwrap(_ib->buffer);
822      ib = &unwrapped_ib;
823   }
824
825   pipe_mutex_lock(rb_pipe->call_mutex);
826   pipe->set_index_buffer(pipe, ib);
827   pipe_mutex_unlock(rb_pipe->call_mutex);
828}
829
830static void
831rbug_set_sample_mask(struct pipe_context *_pipe,
832                     unsigned sample_mask)
833{
834   struct rbug_context *rb_pipe = rbug_context(_pipe);
835   struct pipe_context *pipe = rb_pipe->pipe;
836
837   pipe_mutex_lock(rb_pipe->call_mutex);
838   pipe->set_sample_mask(pipe, sample_mask);
839   pipe_mutex_unlock(rb_pipe->call_mutex);
840}
841
842static void
843rbug_resource_copy_region(struct pipe_context *_pipe,
844                          struct pipe_resource *_dst,
845                          unsigned dst_level,
846                          unsigned dstx,
847                          unsigned dsty,
848                          unsigned dstz,
849                          struct pipe_resource *_src,
850                          unsigned src_level,
851                          const struct pipe_box *src_box)
852{
853   struct rbug_context *rb_pipe = rbug_context(_pipe);
854   struct rbug_resource *rb_resource_dst = rbug_resource(_dst);
855   struct rbug_resource *rb_resource_src = rbug_resource(_src);
856   struct pipe_context *pipe = rb_pipe->pipe;
857   struct pipe_resource *dst = rb_resource_dst->resource;
858   struct pipe_resource *src = rb_resource_src->resource;
859
860   pipe_mutex_lock(rb_pipe->call_mutex);
861   pipe->resource_copy_region(pipe,
862                              dst,
863                              dst_level,
864                              dstx,
865                              dsty,
866                              dstz,
867                              src,
868                              src_level,
869                              src_box);
870   pipe_mutex_unlock(rb_pipe->call_mutex);
871}
872
873static void
874rbug_clear(struct pipe_context *_pipe,
875           unsigned buffers,
876           const union pipe_color_union *color,
877           double depth,
878           unsigned stencil)
879{
880   struct rbug_context *rb_pipe = rbug_context(_pipe);
881   struct pipe_context *pipe = rb_pipe->pipe;
882
883   pipe_mutex_lock(rb_pipe->call_mutex);
884   pipe->clear(pipe,
885               buffers,
886               color,
887               depth,
888               stencil);
889   pipe_mutex_unlock(rb_pipe->call_mutex);
890}
891
892static void
893rbug_clear_render_target(struct pipe_context *_pipe,
894                         struct pipe_surface *_dst,
895                         const union pipe_color_union *color,
896                         unsigned dstx, unsigned dsty,
897                         unsigned width, unsigned height)
898{
899   struct rbug_context *rb_pipe = rbug_context(_pipe);
900   struct rbug_surface *rb_surface_dst = rbug_surface(_dst);
901   struct pipe_context *pipe = rb_pipe->pipe;
902   struct pipe_surface *dst = rb_surface_dst->surface;
903
904   pipe_mutex_lock(rb_pipe->call_mutex);
905   pipe->clear_render_target(pipe,
906                             dst,
907                             color,
908                             dstx,
909                             dsty,
910                             width,
911                             height);
912   pipe_mutex_unlock(rb_pipe->call_mutex);
913}
914
915static void
916rbug_clear_depth_stencil(struct pipe_context *_pipe,
917                         struct pipe_surface *_dst,
918                         unsigned clear_flags,
919                         double depth,
920                         unsigned stencil,
921                         unsigned dstx, unsigned dsty,
922                         unsigned width, unsigned height)
923{
924   struct rbug_context *rb_pipe = rbug_context(_pipe);
925   struct rbug_surface *rb_surface_dst = rbug_surface(_dst);
926   struct pipe_context *pipe = rb_pipe->pipe;
927   struct pipe_surface *dst = rb_surface_dst->surface;
928
929   pipe_mutex_lock(rb_pipe->call_mutex);
930   pipe->clear_depth_stencil(pipe,
931                             dst,
932                             clear_flags,
933                             depth,
934                             stencil,
935                             dstx,
936                             dsty,
937                             width,
938                             height);
939   pipe_mutex_unlock(rb_pipe->call_mutex);
940}
941
942static void
943rbug_flush(struct pipe_context *_pipe,
944           struct pipe_fence_handle **fence)
945{
946   struct rbug_context *rb_pipe = rbug_context(_pipe);
947   struct pipe_context *pipe = rb_pipe->pipe;
948
949   pipe_mutex_lock(rb_pipe->call_mutex);
950   pipe->flush(pipe,
951               fence);
952   pipe_mutex_unlock(rb_pipe->call_mutex);
953}
954
955static struct pipe_sampler_view *
956rbug_context_create_sampler_view(struct pipe_context *_pipe,
957                                 struct pipe_resource *_resource,
958                                 const struct pipe_sampler_view *templ)
959{
960   struct rbug_context *rb_pipe = rbug_context(_pipe);
961   struct rbug_resource *rb_resource = rbug_resource(_resource);
962   struct pipe_context *pipe = rb_pipe->pipe;
963   struct pipe_resource *resource = rb_resource->resource;
964   struct pipe_sampler_view *result;
965
966   pipe_mutex_lock(rb_pipe->call_mutex);
967   result = pipe->create_sampler_view(pipe,
968                                      resource,
969                                      templ);
970   pipe_mutex_unlock(rb_pipe->call_mutex);
971
972   if (result)
973      return rbug_sampler_view_create(rb_pipe, rb_resource, result);
974   return NULL;
975}
976
977static void
978rbug_context_sampler_view_destroy(struct pipe_context *_pipe,
979                                  struct pipe_sampler_view *_view)
980{
981   rbug_sampler_view_destroy(rbug_context(_pipe),
982                             rbug_sampler_view(_view));
983}
984
985static struct pipe_surface *
986rbug_context_create_surface(struct pipe_context *_pipe,
987                            struct pipe_resource *_resource,
988                            const struct pipe_surface *surf_tmpl)
989{
990   struct rbug_context *rb_pipe = rbug_context(_pipe);
991   struct rbug_resource *rb_resource = rbug_resource(_resource);
992   struct pipe_context *pipe = rb_pipe->pipe;
993   struct pipe_resource *resource = rb_resource->resource;
994   struct pipe_surface *result;
995
996   pipe_mutex_lock(rb_pipe->call_mutex);
997   result = pipe->create_surface(pipe,
998                                 resource,
999                                 surf_tmpl);
1000   pipe_mutex_unlock(rb_pipe->call_mutex);
1001
1002   if (result)
1003      return rbug_surface_create(rb_pipe, rb_resource, result);
1004   return NULL;
1005}
1006
1007static void
1008rbug_context_surface_destroy(struct pipe_context *_pipe,
1009                             struct pipe_surface *_surface)
1010{
1011   struct rbug_context *rb_pipe = rbug_context(_pipe);
1012   struct rbug_surface *rb_surface = rbug_surface(_surface);
1013
1014   pipe_mutex_lock(rb_pipe->call_mutex);
1015   rbug_surface_destroy(rb_pipe,
1016                        rb_surface);
1017   pipe_mutex_unlock(rb_pipe->call_mutex);
1018}
1019
1020
1021
1022static struct pipe_transfer *
1023rbug_context_get_transfer(struct pipe_context *_context,
1024                          struct pipe_resource *_resource,
1025                          unsigned level,
1026                          unsigned usage,
1027                          const struct pipe_box *box)
1028{
1029   struct rbug_context *rb_pipe = rbug_context(_context);
1030   struct rbug_resource *rb_resource = rbug_resource(_resource);
1031   struct pipe_context *context = rb_pipe->pipe;
1032   struct pipe_resource *resource = rb_resource->resource;
1033   struct pipe_transfer *result;
1034
1035   pipe_mutex_lock(rb_pipe->call_mutex);
1036   result = context->get_transfer(context,
1037                                  resource,
1038                                  level,
1039                                  usage,
1040                                  box);
1041   pipe_mutex_unlock(rb_pipe->call_mutex);
1042
1043   if (result)
1044      return rbug_transfer_create(rb_pipe, rb_resource, result);
1045   return NULL;
1046}
1047
1048static void
1049rbug_context_transfer_destroy(struct pipe_context *_pipe,
1050                              struct pipe_transfer *_transfer)
1051{
1052   struct rbug_context *rb_pipe = rbug_context(_pipe);
1053   struct rbug_transfer *rb_transfer =rbug_transfer(_transfer);
1054
1055   pipe_mutex_lock(rb_pipe->call_mutex);
1056   rbug_transfer_destroy(rb_pipe,
1057                         rb_transfer);
1058   pipe_mutex_unlock(rb_pipe->call_mutex);
1059}
1060
1061static void *
1062rbug_context_transfer_map(struct pipe_context *_context,
1063                          struct pipe_transfer *_transfer)
1064{
1065   struct rbug_context *rb_pipe = rbug_context(_context);
1066   struct rbug_transfer *rb_transfer = rbug_transfer(_transfer);
1067   struct pipe_context *context = rb_pipe->pipe;
1068   struct pipe_transfer *transfer = rb_transfer->transfer;
1069   void *ret;
1070
1071   pipe_mutex_lock(rb_pipe->call_mutex);
1072   ret = context->transfer_map(context,
1073                                transfer);
1074   pipe_mutex_unlock(rb_pipe->call_mutex);
1075
1076   return ret;
1077}
1078
1079
1080
1081static void
1082rbug_context_transfer_flush_region(struct pipe_context *_context,
1083                                   struct pipe_transfer *_transfer,
1084                                   const struct pipe_box *box)
1085{
1086   struct rbug_context *rb_pipe = rbug_context(_context);
1087   struct rbug_transfer *rb_transfer = rbug_transfer(_transfer);
1088   struct pipe_context *context = rb_pipe->pipe;
1089   struct pipe_transfer *transfer = rb_transfer->transfer;
1090
1091   pipe_mutex_lock(rb_pipe->call_mutex);
1092   context->transfer_flush_region(context,
1093                                  transfer,
1094                                  box);
1095   pipe_mutex_unlock(rb_pipe->call_mutex);
1096}
1097
1098
1099static void
1100rbug_context_transfer_unmap(struct pipe_context *_context,
1101                            struct pipe_transfer *_transfer)
1102{
1103   struct rbug_context *rb_pipe = rbug_context(_context);
1104   struct rbug_transfer *rb_transfer = rbug_transfer(_transfer);
1105   struct pipe_context *context = rb_pipe->pipe;
1106   struct pipe_transfer *transfer = rb_transfer->transfer;
1107
1108   pipe_mutex_lock(rb_pipe->call_mutex);
1109   context->transfer_unmap(context,
1110                           transfer);
1111   pipe_mutex_unlock(rb_pipe->call_mutex);
1112}
1113
1114
1115static void
1116rbug_context_transfer_inline_write(struct pipe_context *_context,
1117                                   struct pipe_resource *_resource,
1118                                   unsigned level,
1119                                   unsigned usage,
1120                                   const struct pipe_box *box,
1121                                   const void *data,
1122                                   unsigned stride,
1123                                   unsigned layer_stride)
1124{
1125   struct rbug_context *rb_pipe = rbug_context(_context);
1126   struct rbug_resource *rb_resource = rbug_resource(_resource);
1127   struct pipe_context *context = rb_pipe->pipe;
1128   struct pipe_resource *resource = rb_resource->resource;
1129
1130   pipe_mutex_lock(rb_pipe->call_mutex);
1131   context->transfer_inline_write(context,
1132                                  resource,
1133                                  level,
1134                                  usage,
1135                                  box,
1136                                  data,
1137                                  stride,
1138                                  layer_stride);
1139   pipe_mutex_unlock(rb_pipe->call_mutex);
1140}
1141
1142
1143static void rbug_redefine_user_buffer(struct pipe_context *_context,
1144                                      struct pipe_resource *_resource,
1145                                      unsigned offset, unsigned size)
1146{
1147   struct rbug_context *rb_pipe = rbug_context(_context);
1148   struct rbug_resource *rb_resource = rbug_resource(_resource);
1149   struct pipe_context *context = rb_pipe->pipe;
1150   struct pipe_resource *resource = rb_resource->resource;
1151
1152   pipe_mutex_lock(rb_pipe->call_mutex);
1153   context->redefine_user_buffer(context, resource, offset, size);
1154   pipe_mutex_unlock(rb_pipe->call_mutex);
1155}
1156
1157
1158struct pipe_context *
1159rbug_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
1160{
1161   struct rbug_context *rb_pipe;
1162   struct rbug_screen *rb_screen = rbug_screen(_screen);
1163
1164   if (!rb_screen)
1165      return NULL;
1166
1167   rb_pipe = CALLOC_STRUCT(rbug_context);
1168   if (!rb_pipe)
1169      return NULL;
1170
1171   pipe_mutex_init(rb_pipe->draw_mutex);
1172   pipe_condvar_init(rb_pipe->draw_cond);
1173   pipe_mutex_init(rb_pipe->call_mutex);
1174   pipe_mutex_init(rb_pipe->list_mutex);
1175   make_empty_list(&rb_pipe->shaders);
1176
1177   rb_pipe->base.screen = _screen;
1178   rb_pipe->base.priv = pipe->priv; /* expose wrapped data */
1179   rb_pipe->base.draw = NULL;
1180
1181   rb_pipe->base.destroy = rbug_destroy;
1182   rb_pipe->base.draw_vbo = rbug_draw_vbo;
1183   rb_pipe->base.create_query = rbug_create_query;
1184   rb_pipe->base.destroy_query = rbug_destroy_query;
1185   rb_pipe->base.begin_query = rbug_begin_query;
1186   rb_pipe->base.end_query = rbug_end_query;
1187   rb_pipe->base.get_query_result = rbug_get_query_result;
1188   rb_pipe->base.create_blend_state = rbug_create_blend_state;
1189   rb_pipe->base.bind_blend_state = rbug_bind_blend_state;
1190   rb_pipe->base.delete_blend_state = rbug_delete_blend_state;
1191   rb_pipe->base.create_sampler_state = rbug_create_sampler_state;
1192   rb_pipe->base.bind_fragment_sampler_states = rbug_bind_fragment_sampler_states;
1193   rb_pipe->base.bind_vertex_sampler_states = rbug_bind_vertex_sampler_states;
1194   rb_pipe->base.delete_sampler_state = rbug_delete_sampler_state;
1195   rb_pipe->base.create_rasterizer_state = rbug_create_rasterizer_state;
1196   rb_pipe->base.bind_rasterizer_state = rbug_bind_rasterizer_state;
1197   rb_pipe->base.delete_rasterizer_state = rbug_delete_rasterizer_state;
1198   rb_pipe->base.create_depth_stencil_alpha_state = rbug_create_depth_stencil_alpha_state;
1199   rb_pipe->base.bind_depth_stencil_alpha_state = rbug_bind_depth_stencil_alpha_state;
1200   rb_pipe->base.delete_depth_stencil_alpha_state = rbug_delete_depth_stencil_alpha_state;
1201   rb_pipe->base.create_fs_state = rbug_create_fs_state;
1202   rb_pipe->base.bind_fs_state = rbug_bind_fs_state;
1203   rb_pipe->base.delete_fs_state = rbug_delete_fs_state;
1204   rb_pipe->base.create_vs_state = rbug_create_vs_state;
1205   rb_pipe->base.bind_vs_state = rbug_bind_vs_state;
1206   rb_pipe->base.delete_vs_state = rbug_delete_vs_state;
1207   rb_pipe->base.create_gs_state = rbug_create_gs_state;
1208   rb_pipe->base.bind_gs_state = rbug_bind_gs_state;
1209   rb_pipe->base.delete_gs_state = rbug_delete_gs_state;
1210   rb_pipe->base.create_vertex_elements_state = rbug_create_vertex_elements_state;
1211   rb_pipe->base.bind_vertex_elements_state = rbug_bind_vertex_elements_state;
1212   rb_pipe->base.delete_vertex_elements_state = rbug_delete_vertex_elements_state;
1213   rb_pipe->base.set_blend_color = rbug_set_blend_color;
1214   rb_pipe->base.set_stencil_ref = rbug_set_stencil_ref;
1215   rb_pipe->base.set_clip_state = rbug_set_clip_state;
1216   rb_pipe->base.set_constant_buffer = rbug_set_constant_buffer;
1217   rb_pipe->base.set_framebuffer_state = rbug_set_framebuffer_state;
1218   rb_pipe->base.set_polygon_stipple = rbug_set_polygon_stipple;
1219   rb_pipe->base.set_scissor_state = rbug_set_scissor_state;
1220   rb_pipe->base.set_viewport_state = rbug_set_viewport_state;
1221   rb_pipe->base.set_fragment_sampler_views = rbug_set_fragment_sampler_views;
1222   rb_pipe->base.set_vertex_sampler_views = rbug_set_vertex_sampler_views;
1223   rb_pipe->base.set_vertex_buffers = rbug_set_vertex_buffers;
1224   rb_pipe->base.set_index_buffer = rbug_set_index_buffer;
1225   rb_pipe->base.set_sample_mask = rbug_set_sample_mask;
1226   rb_pipe->base.resource_copy_region = rbug_resource_copy_region;
1227   rb_pipe->base.clear = rbug_clear;
1228   rb_pipe->base.clear_render_target = rbug_clear_render_target;
1229   rb_pipe->base.clear_depth_stencil = rbug_clear_depth_stencil;
1230   rb_pipe->base.flush = rbug_flush;
1231   rb_pipe->base.create_sampler_view = rbug_context_create_sampler_view;
1232   rb_pipe->base.sampler_view_destroy = rbug_context_sampler_view_destroy;
1233   rb_pipe->base.create_surface = rbug_context_create_surface;
1234   rb_pipe->base.surface_destroy = rbug_context_surface_destroy;
1235   rb_pipe->base.get_transfer = rbug_context_get_transfer;
1236   rb_pipe->base.transfer_destroy = rbug_context_transfer_destroy;
1237   rb_pipe->base.transfer_map = rbug_context_transfer_map;
1238   rb_pipe->base.transfer_unmap = rbug_context_transfer_unmap;
1239   rb_pipe->base.transfer_flush_region = rbug_context_transfer_flush_region;
1240   rb_pipe->base.transfer_inline_write = rbug_context_transfer_inline_write;
1241   rb_pipe->base.redefine_user_buffer = rbug_redefine_user_buffer;
1242
1243   rb_pipe->pipe = pipe;
1244
1245   rbug_screen_add_to_list(rb_screen, contexts, rb_pipe);
1246
1247   if (debug_get_bool_option("GALLIUM_RBUG_START_BLOCKED", FALSE)) {
1248      rb_pipe->draw_blocked = RBUG_BLOCK_BEFORE;
1249   }
1250
1251   return &rb_pipe->base;
1252}
1253