• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /**************************************************************************
2   *
3   * Copyright 2009 Marek Olšák <maraeo@gmail.com>
4   *
5   * Permission is hereby granted, free of charge, to any person obtaining a
6   * copy of this software and associated documentation files (the
7   * "Software"), to deal in the Software without restriction, including
8   * without limitation the rights to use, copy, modify, merge, publish,
9   * distribute, sub license, and/or sell copies of the Software, and to
10   * permit persons to whom the Software is furnished to do so, subject to
11   * the following conditions:
12   *
13   * The above copyright notice and this permission notice (including the
14   * next paragraph) shall be included in all copies or substantial portions
15   * of the Software.
16   *
17   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18   * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20   * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
21   * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22   * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23   * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24   *
25   **************************************************************************/
26  
27  #ifndef U_BLITTER_H
28  #define U_BLITTER_H
29  
30  #include "util/u_framebuffer.h"
31  #include "util/u_inlines.h"
32  
33  #include "pipe/p_state.h"
34  
35  #ifdef __cplusplus
36  extern "C" {
37  #endif
38  
39  struct pipe_context;
40  
41  enum blitter_attrib_type {
42     UTIL_BLITTER_ATTRIB_NONE,
43     UTIL_BLITTER_ATTRIB_COLOR,
44     UTIL_BLITTER_ATTRIB_TEXCOORD_XY,
45     UTIL_BLITTER_ATTRIB_TEXCOORD_XYZW,
46  };
47  
48  union blitter_attrib {
49     float color[4];
50  
51     struct {
52        float x1, y1, x2, y2, z, w;
53     } texcoord;
54  };
55  
56  struct blitter_context;
57  
58  typedef void *(*blitter_get_vs_func)(struct blitter_context *blitter);
59  
60  struct blitter_context
61  {
62     /**
63      * Draw a rectangle.
64      *
65      * \param get_vs  Callback for obtaining the vertex shader for the draw call.
66      *                It might invoke the shader compiler. The driver is
67      *                responsible for setting the vertex shader, and the callback
68      *                allows the driver to query the vertex shader CSO if it
69      *                wants to use the default one.
70      * \param x1      An X coordinate of the top-left corner.
71      * \param y1      A Y coordinate of the top-left corner.
72      * \param x2      An X coordinate of the bottom-right corner.
73      * \param y2      A Y coordinate of the bottom-right corner.
74      * \param depth   A depth which the rectangle is rendered at.
75      *
76      * \param type   Semantics of the attributes "attrib".
77      *               If type is UTIL_BLITTER_ATTRIB_NONE, ignore them.
78      *               If type is UTIL_BLITTER_ATTRIB_COLOR, the attributes
79      *               make up a constant RGBA color, and should go
80      *               to the GENERIC0 varying slot of a fragment shader.
81      *               If type is UTIL_BLITTER_ATTRIB_TEXCOORD, {a1, a2} and
82      *               {a3, a4} specify top-left and bottom-right texture
83      *               coordinates of the rectangle, respectively, and should go
84      *               to the GENERIC0 varying slot of a fragment shader.
85      *
86      * \param attrib See type.
87      *
88      * \note A driver may optionally override this callback to implement
89      *       a specialized hardware path for drawing a rectangle, e.g. using
90      *       a rectangular point sprite.
91      */
92     void (*draw_rectangle)(struct blitter_context *blitter,
93                            void *vertex_elements_cso,
94                            blitter_get_vs_func get_vs,
95                            int x1, int y1, int x2, int y2,
96                            float depth, unsigned num_instances,
97                            enum blitter_attrib_type type,
98                            const union blitter_attrib *attrib);
99  
100     /* Whether the blitter is running. */
101     bool running;
102  
103     bool use_index_buffer;
104  
105     /* Private members, really. */
106     struct pipe_context *pipe; /**< pipe context */
107  
108     void *saved_blend_state;   /**< blend state */
109     void *saved_dsa_state;     /**< depth stencil alpha state */
110     void *saved_velem_state;   /**< vertex elements state */
111     void *saved_rs_state;      /**< rasterizer state */
112     void *saved_fs, *saved_vs, *saved_gs, *saved_tcs, *saved_tes; /**< shaders */
113  
114     struct pipe_framebuffer_state saved_fb_state;  /**< framebuffer state */
115     struct pipe_stencil_ref saved_stencil_ref;     /**< stencil ref */
116     struct pipe_viewport_state saved_viewport;
117     struct pipe_scissor_state saved_scissor;
118     bool skip_viewport_restore;
119     bool is_sample_mask_saved;
120     unsigned saved_sample_mask;
121  
122     unsigned saved_num_sampler_states;
123     void *saved_sampler_states[PIPE_MAX_SAMPLERS];
124  
125     unsigned saved_num_sampler_views;
126     struct pipe_sampler_view *saved_sampler_views[PIPE_MAX_SAMPLERS];
127  
128     unsigned cb_slot;
129     struct pipe_constant_buffer saved_fs_constant_buffer;
130  
131     unsigned vb_slot;
132     struct pipe_vertex_buffer saved_vertex_buffer;
133  
134     unsigned saved_num_so_targets;
135     struct pipe_stream_output_target *saved_so_targets[PIPE_MAX_SO_BUFFERS];
136  
137     struct pipe_query *saved_render_cond_query;
138     uint saved_render_cond_mode;
139     bool saved_render_cond_cond;
140  
141     boolean saved_window_rectangles_include;
142     unsigned saved_num_window_rectangles;
143     struct pipe_scissor_state saved_window_rectangles[PIPE_MAX_WINDOW_RECTANGLES];
144  };
145  
146  /**
147   * Create a blitter context.
148   */
149  struct blitter_context *util_blitter_create(struct pipe_context *pipe);
150  
151  /**
152   * Destroy a blitter context.
153   */
154  void util_blitter_destroy(struct blitter_context *blitter);
155  
156  void util_blitter_cache_all_shaders(struct blitter_context *blitter);
157  void *util_blitter_get_noop_blend_state(struct blitter_context *blitter);
158  void *util_blitter_get_noop_dsa_state(struct blitter_context *blitter);
159  void *util_blitter_get_discard_rasterizer_state(struct blitter_context *blitter);
160  
161  
162  /**
163   * Return the pipe context associated with a blitter context.
164   */
165  static inline
util_blitter_get_pipe(struct blitter_context * blitter)166  struct pipe_context *util_blitter_get_pipe(struct blitter_context *blitter)
167  {
168     return blitter->pipe;
169  }
170  
171  /**
172   * Override PIPE_CAP_TEXTURE_MULTISAMPLE as reported by the driver.
173   */
174  void util_blitter_set_texture_multisample(struct blitter_context *blitter,
175                                            bool supported);
176  
177  /* The default function to draw a rectangle. This can only be used
178   * inside of the draw_rectangle callback if the driver overrides it. */
179  void util_blitter_draw_rectangle(struct blitter_context *blitter,
180                                   void *vertex_elements_cso,
181                                   blitter_get_vs_func get_vs,
182                                   int x1, int y1, int x2, int y2,
183                                   float depth, unsigned num_instances,
184                                   enum blitter_attrib_type type,
185                                   const union blitter_attrib *attrib);
186  
187  
188  /*
189   * These states must be saved before any of the following functions are called:
190   * - vertex buffers
191   * - vertex elements
192   * - vertex shader
193   * - geometry shader (if supported)
194   * - stream output targets (if supported)
195   * - rasterizer state
196   */
197  
198  /**
199   * Clear a specified set of currently bound buffers to specified values.
200   *
201   * These states must be saved in the blitter in addition to the state objects
202   * already required to be saved:
203   * - fragment shader
204   * - depth stencil alpha state
205   * - blend state
206   */
207  void util_blitter_clear(struct blitter_context *blitter,
208                          unsigned width, unsigned height, unsigned num_layers,
209                          unsigned clear_buffers,
210                          const union pipe_color_union *color,
211                          double depth, unsigned stencil,
212                          bool msaa);
213  
214  /**
215   * Check if the blitter (with the help of the driver) can blit between
216   * the two resources.
217   */
218  bool util_blitter_is_copy_supported(struct blitter_context *blitter,
219                                      const struct pipe_resource *dst,
220                                      const struct pipe_resource *src);
221  
222  bool util_blitter_is_blit_supported(struct blitter_context *blitter,
223  				    const struct pipe_blit_info *info);
224  
225  /**
226   * Copy a block of pixels from one surface to another.
227   *
228   * These states must be saved in the blitter in addition to the state objects
229   * already required to be saved:
230   * - fragment shader
231   * - depth stencil alpha state
232   * - blend state
233   * - fragment sampler states
234   * - fragment sampler textures
235   * - framebuffer state
236   * - sample mask
237   */
238  void util_blitter_copy_texture(struct blitter_context *blitter,
239                                 struct pipe_resource *dst,
240                                 unsigned dst_level,
241                                 unsigned dstx, unsigned dsty, unsigned dstz,
242                                 struct pipe_resource *src,
243                                 unsigned src_level,
244                                 const struct pipe_box *srcbox);
245  
246  /**
247   * This is a generic implementation of pipe->blit, which accepts
248   * sampler/surface views instead of resources.
249   *
250   * The layer and mipmap level are specified by the views.
251   *
252   * Drivers can use this to change resource properties (like format, width,
253   * height) by changing how the views interpret them, instead of changing
254   * pipe_resource directly. This is used to blit resources of formats which
255   * are not renderable.
256   *
257   * src_width0 and src_height0 are sampler_view-private properties that
258   * override pipe_resource. The blitter uses them for computation of texture
259   * coordinates. The dst dimensions are supplied through pipe_surface::width
260   * and height.
261   *
262   * The mask is a combination of the PIPE_MASK_* flags.
263   * Set to PIPE_MASK_RGBAZS if unsure.
264   */
265  void util_blitter_blit_generic(struct blitter_context *blitter,
266                                 struct pipe_surface *dst,
267                                 const struct pipe_box *dstbox,
268                                 struct pipe_sampler_view *src,
269                                 const struct pipe_box *srcbox,
270                                 unsigned src_width0, unsigned src_height0,
271                                 unsigned mask, unsigned filter,
272                                 const struct pipe_scissor_state *scissor,
273                                 bool alpha_blend);
274  
275  void util_blitter_blit(struct blitter_context *blitter,
276  		       const struct pipe_blit_info *info);
277  
278  void util_blitter_generate_mipmap(struct blitter_context *blitter,
279                                    struct pipe_resource *tex,
280                                    enum pipe_format format,
281                                    unsigned base_level, unsigned last_level,
282                                    unsigned first_layer, unsigned last_layer);
283  
284  /**
285   * Helper function to initialize a view for copy_texture_view.
286   * The parameters must match copy_texture_view.
287   */
288  void util_blitter_default_dst_texture(struct pipe_surface *dst_templ,
289                                        struct pipe_resource *dst,
290                                        unsigned dstlevel,
291                                        unsigned dstz);
292  
293  /**
294   * Helper function to initialize a view for copy_texture_view.
295   * The parameters must match copy_texture_view.
296   */
297  void util_blitter_default_src_texture(struct blitter_context *blitter,
298                                        struct pipe_sampler_view *src_templ,
299                                        struct pipe_resource *src,
300                                        unsigned srclevel);
301  
302  /**
303   * Copy data from one buffer to another using the Stream Output functionality.
304   * 4-byte alignment is required, otherwise software fallback is used.
305   */
306  void util_blitter_copy_buffer(struct blitter_context *blitter,
307                                struct pipe_resource *dst,
308                                unsigned dstx,
309                                struct pipe_resource *src,
310                                unsigned srcx,
311                                unsigned size);
312  
313  /**
314   * Clear the contents of a buffer using the Stream Output functionality.
315   * 4-byte alignment is required.
316   *
317   * "num_channels" can be 1, 2, 3, or 4, and specifies if the clear value is
318   * R, RG, RGB, or RGBA.
319   *
320   * For each element, only "num_channels" components of "clear_value" are
321   * copied to the buffer, then the offset is incremented by num_channels*4.
322   */
323  void util_blitter_clear_buffer(struct blitter_context *blitter,
324                                 struct pipe_resource *dst,
325                                 unsigned offset, unsigned size,
326                                 unsigned num_channels,
327                                 const union pipe_color_union *clear_value);
328  
329  /**
330   * Clear a region of a (color) surface to a constant value.
331   *
332   * These states must be saved in the blitter in addition to the state objects
333   * already required to be saved:
334   * - fragment shader
335   * - depth stencil alpha state
336   * - blend state
337   * - framebuffer state
338   */
339  void util_blitter_clear_render_target(struct blitter_context *blitter,
340                                        struct pipe_surface *dst,
341                                        const union pipe_color_union *color,
342                                        unsigned dstx, unsigned dsty,
343                                        unsigned width, unsigned height);
344  
345  /**
346   * Clear a region of a depth-stencil surface, both stencil and depth
347   * or only one of them if this is a combined depth-stencil surface.
348   *
349   * These states must be saved in the blitter in addition to the state objects
350   * already required to be saved:
351   * - fragment shader
352   * - depth stencil alpha state
353   * - blend state
354   * - framebuffer state
355   */
356  void util_blitter_clear_depth_stencil(struct blitter_context *blitter,
357                                        struct pipe_surface *dst,
358                                        unsigned clear_flags,
359                                        double depth,
360                                        unsigned stencil,
361                                        unsigned dstx, unsigned dsty,
362                                        unsigned width, unsigned height);
363  
364  /* The following functions are customized variants of the clear functions.
365   * Some drivers use them internally to do things like MSAA resolve
366   * and resource decompression. It usually consists of rendering a full-screen
367   * quad with a special blend or DSA state.
368   */
369  
370  /* Used by r300g for depth decompression. */
371  void util_blitter_custom_clear_depth(struct blitter_context *blitter,
372                                       unsigned width, unsigned height,
373                                       double depth, void *custom_dsa);
374  
375  /* Used by r600g for depth decompression. */
376  void util_blitter_custom_depth_stencil(struct blitter_context *blitter,
377  				       struct pipe_surface *zsurf,
378  				       struct pipe_surface *cbsurf,
379  				       unsigned sample_mask,
380  				       void *dsa_stage, float depth);
381  
382  /* Used by r600g for color decompression. */
383  void util_blitter_custom_color(struct blitter_context *blitter,
384                                 struct pipe_surface *dstsurf,
385                                 void *custom_blend);
386  
387  /* Used by r600g for MSAA color resolve. */
388  void util_blitter_custom_resolve_color(struct blitter_context *blitter,
389                                         struct pipe_resource *dst,
390                                         unsigned dst_level,
391                                         unsigned dst_layer,
392                                         struct pipe_resource *src,
393                                         unsigned src_layer,
394  				       unsigned sampled_mask,
395                                         void *custom_blend,
396                                         enum pipe_format format);
397  
398  /* Used by vc4 for 8/16-bit linear-to-tiled blits */
399  void util_blitter_custom_shader(struct blitter_context *blitter,
400                                  struct pipe_surface *dstsurf,
401                                  void *custom_vs, void *custom_fs);
402  
403  /* Used by D3D12 for non-MSAA -> MSAA stencil blits */
404  void util_blitter_stencil_fallback(struct blitter_context *blitter,
405                                     struct pipe_resource *dst,
406                                     unsigned dst_level,
407                                     const struct pipe_box *dstbox,
408                                     struct pipe_resource *src,
409                                     unsigned src_level,
410                                     const struct pipe_box *srcbox,
411                                     const struct pipe_scissor_state *scissor);
412  
413  /* The functions below should be used to save currently bound constant state
414   * objects inside a driver. The objects are automatically restored at the end
415   * of the util_blitter_{clear, copy_region, fill_region} functions and then
416   * forgotten.
417   *
418   * States not listed here are not affected by util_blitter. */
419  
420  static inline void
util_blitter_save_blend(struct blitter_context * blitter,void * state)421  util_blitter_save_blend(struct blitter_context *blitter, void *state)
422  {
423     blitter->saved_blend_state = state;
424  }
425  
426  static inline void
util_blitter_save_depth_stencil_alpha(struct blitter_context * blitter,void * state)427  util_blitter_save_depth_stencil_alpha(struct blitter_context *blitter,
428                                        void *state)
429  {
430     blitter->saved_dsa_state = state;
431  }
432  
433  static inline void
util_blitter_save_vertex_elements(struct blitter_context * blitter,void * state)434  util_blitter_save_vertex_elements(struct blitter_context *blitter, void *state)
435  {
436     blitter->saved_velem_state = state;
437  }
438  
439  static inline void
util_blitter_save_stencil_ref(struct blitter_context * blitter,const struct pipe_stencil_ref * state)440  util_blitter_save_stencil_ref(struct blitter_context *blitter,
441                                const struct pipe_stencil_ref *state)
442  {
443     blitter->saved_stencil_ref = *state;
444  }
445  
446  static inline void
util_blitter_save_rasterizer(struct blitter_context * blitter,void * state)447  util_blitter_save_rasterizer(struct blitter_context *blitter, void *state)
448  {
449     blitter->saved_rs_state = state;
450  }
451  
452  static inline void
util_blitter_save_fragment_shader(struct blitter_context * blitter,void * fs)453  util_blitter_save_fragment_shader(struct blitter_context *blitter, void *fs)
454  {
455     blitter->saved_fs = fs;
456  }
457  
458  static inline void
util_blitter_save_vertex_shader(struct blitter_context * blitter,void * vs)459  util_blitter_save_vertex_shader(struct blitter_context *blitter, void *vs)
460  {
461     blitter->saved_vs = vs;
462  }
463  
464  static inline void
util_blitter_save_geometry_shader(struct blitter_context * blitter,void * gs)465  util_blitter_save_geometry_shader(struct blitter_context *blitter, void *gs)
466  {
467     blitter->saved_gs = gs;
468  }
469  
470  static inline void
util_blitter_save_tessctrl_shader(struct blitter_context * blitter,void * sh)471  util_blitter_save_tessctrl_shader(struct blitter_context *blitter,
472                                    void *sh)
473  {
474     blitter->saved_tcs = sh;
475  }
476  
477  static inline void
util_blitter_save_tesseval_shader(struct blitter_context * blitter,void * sh)478  util_blitter_save_tesseval_shader(struct blitter_context *blitter,
479                                    void *sh)
480  {
481     blitter->saved_tes = sh;
482  }
483  
484  static inline void
util_blitter_save_framebuffer(struct blitter_context * blitter,const struct pipe_framebuffer_state * state)485  util_blitter_save_framebuffer(struct blitter_context *blitter,
486                                const struct pipe_framebuffer_state *state)
487  {
488     blitter->saved_fb_state.nr_cbufs = 0; /* It's ~0 now, meaning it's unsaved. */
489     util_copy_framebuffer_state(&blitter->saved_fb_state, state);
490  }
491  
492  static inline void
util_blitter_save_viewport(struct blitter_context * blitter,struct pipe_viewport_state * state)493  util_blitter_save_viewport(struct blitter_context *blitter,
494                             struct pipe_viewport_state *state)
495  {
496     blitter->saved_viewport = *state;
497  }
498  
499  static inline void
util_blitter_save_scissor(struct blitter_context * blitter,struct pipe_scissor_state * state)500  util_blitter_save_scissor(struct blitter_context *blitter,
501                            struct pipe_scissor_state *state)
502  {
503     blitter->saved_scissor = *state;
504  }
505  
506  static inline void
util_blitter_save_fragment_sampler_states(struct blitter_context * blitter,unsigned num_sampler_states,void ** sampler_states)507  util_blitter_save_fragment_sampler_states(
508                    struct blitter_context *blitter,
509                    unsigned num_sampler_states,
510                    void **sampler_states)
511  {
512     assert(num_sampler_states <= ARRAY_SIZE(blitter->saved_sampler_states));
513  
514     blitter->saved_num_sampler_states = num_sampler_states;
515     memcpy(blitter->saved_sampler_states, sampler_states,
516            num_sampler_states * sizeof(void *));
517  }
518  
519  static inline void
util_blitter_save_fragment_sampler_views(struct blitter_context * blitter,unsigned num_views,struct pipe_sampler_view ** views)520  util_blitter_save_fragment_sampler_views(struct blitter_context *blitter,
521                                           unsigned num_views,
522                                           struct pipe_sampler_view **views)
523  {
524     unsigned i;
525     assert(num_views <= ARRAY_SIZE(blitter->saved_sampler_views));
526  
527     blitter->saved_num_sampler_views = num_views;
528     for (i = 0; i < num_views; i++)
529        pipe_sampler_view_reference(&blitter->saved_sampler_views[i],
530                                    views[i]);
531  }
532  
533  static inline void
util_blitter_save_fragment_constant_buffer_slot(struct blitter_context * blitter,struct pipe_constant_buffer * constant_buffers)534  util_blitter_save_fragment_constant_buffer_slot(
535                    struct blitter_context *blitter,
536                    struct pipe_constant_buffer *constant_buffers)
537  {
538     pipe_resource_reference(&blitter->saved_fs_constant_buffer.buffer,
539                             constant_buffers[blitter->cb_slot].buffer);
540     memcpy(&blitter->saved_fs_constant_buffer, &constant_buffers[blitter->cb_slot],
541            sizeof(struct pipe_constant_buffer));
542  }
543  
544  static inline void
util_blitter_save_vertex_buffer_slot(struct blitter_context * blitter,struct pipe_vertex_buffer * vertex_buffers)545  util_blitter_save_vertex_buffer_slot(struct blitter_context *blitter,
546                                       struct pipe_vertex_buffer *vertex_buffers)
547  {
548     pipe_vertex_buffer_reference(&blitter->saved_vertex_buffer,
549                                  &vertex_buffers[blitter->vb_slot]);
550  }
551  
552  static inline void
util_blitter_save_so_targets(struct blitter_context * blitter,unsigned num_targets,struct pipe_stream_output_target ** targets)553  util_blitter_save_so_targets(struct blitter_context *blitter,
554                               unsigned num_targets,
555                               struct pipe_stream_output_target **targets)
556  {
557     unsigned i;
558     assert(num_targets <= ARRAY_SIZE(blitter->saved_so_targets));
559  
560     blitter->saved_num_so_targets = num_targets;
561     for (i = 0; i < num_targets; i++)
562        pipe_so_target_reference(&blitter->saved_so_targets[i],
563                                 targets[i]);
564  }
565  
566  static inline void
util_blitter_save_sample_mask(struct blitter_context * blitter,unsigned sample_mask)567  util_blitter_save_sample_mask(struct blitter_context *blitter,
568                                unsigned sample_mask)
569  {
570     blitter->is_sample_mask_saved = true;
571     blitter->saved_sample_mask = sample_mask;
572  }
573  
574  static inline void
util_blitter_save_render_condition(struct blitter_context * blitter,struct pipe_query * query,bool condition,enum pipe_render_cond_flag mode)575  util_blitter_save_render_condition(struct blitter_context *blitter,
576                                     struct pipe_query *query,
577                                     bool condition,
578                                     enum pipe_render_cond_flag mode)
579  {
580     blitter->saved_render_cond_query = query;
581     blitter->saved_render_cond_mode = mode;
582     blitter->saved_render_cond_cond = condition;
583  }
584  
585  static inline void
util_blitter_save_window_rectangles(struct blitter_context * blitter,boolean include,unsigned num_rectangles,const struct pipe_scissor_state * rects)586  util_blitter_save_window_rectangles(struct blitter_context *blitter,
587                                      boolean include,
588                                      unsigned num_rectangles,
589                                      const struct pipe_scissor_state *rects)
590  {
591     blitter->saved_window_rectangles_include = include;
592     blitter->saved_num_window_rectangles = num_rectangles;
593     if (num_rectangles > 0) {
594        assert(num_rectangles < ARRAY_SIZE(blitter->saved_window_rectangles));
595        memcpy(blitter->saved_window_rectangles, rects,
596               sizeof(*rects) * num_rectangles);
597     }
598  }
599  
600  void util_blitter_common_clear_setup(struct blitter_context *blitter,
601                                       unsigned width, unsigned height,
602                                       unsigned clear_buffers,
603                                       void *custom_blend, void *custom_dsa);
604  
605  void util_blitter_set_running_flag(struct blitter_context *blitter);
606  void util_blitter_unset_running_flag(struct blitter_context *blitter);
607  
608  void util_blitter_restore_vertex_states(struct blitter_context *blitter);
609  void util_blitter_restore_fragment_states(struct blitter_context *blitter);
610  void util_blitter_restore_render_cond(struct blitter_context *blitter);
611  void util_blitter_restore_fb_state(struct blitter_context *blitter);
612  void util_blitter_restore_textures(struct blitter_context *blitter);
613  void util_blitter_restore_constant_buffer_state(struct blitter_context *blitter);
614  
615  /* These are supported combinations of blits from ZS to color and vice versa.
616   * The blitter will do the packing/unpacking of depth and stencil
617   * in the fragment shader.
618   */
619  static inline enum pipe_format
util_blitter_get_color_format_for_zs(enum pipe_format format)620  util_blitter_get_color_format_for_zs(enum pipe_format format)
621  {
622     switch (format) {
623     case PIPE_FORMAT_Z16_UNORM:
624        return PIPE_FORMAT_R16_UNORM;
625  
626     case PIPE_FORMAT_Z32_FLOAT:
627        return PIPE_FORMAT_R32_FLOAT;
628  
629     case PIPE_FORMAT_Z24_UNORM_S8_UINT:
630     case PIPE_FORMAT_Z24X8_UNORM:
631     case PIPE_FORMAT_S8_UINT_Z24_UNORM:
632     case PIPE_FORMAT_X8Z24_UNORM:
633        return PIPE_FORMAT_R32_UINT;
634  
635     case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
636        return PIPE_FORMAT_R32G32_UINT;
637  
638     case PIPE_FORMAT_Z32_UNORM:
639     default:
640        assert(0);
641     }
642     return PIPE_FORMAT_NONE;
643  }
644  
645  #ifdef __cplusplus
646  }
647  #endif
648  
649  #endif
650