• 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    unsigned saved_min_samples;
122 
123    unsigned saved_num_sampler_states;
124    void *saved_sampler_states[PIPE_MAX_SAMPLERS];
125 
126    unsigned saved_num_sampler_views;
127    struct pipe_sampler_view *saved_sampler_views[PIPE_MAX_SAMPLERS];
128 
129    unsigned cb_slot;
130    struct pipe_constant_buffer saved_fs_constant_buffer;
131 
132    unsigned saved_num_vb;
133    struct pipe_vertex_buffer saved_vertex_buffers[PIPE_MAX_ATTRIBS];
134 
135    unsigned saved_num_so_targets;
136    enum mesa_prim saved_so_output_prim;
137    struct pipe_stream_output_target *saved_so_targets[PIPE_MAX_SO_BUFFERS];
138 
139    struct pipe_query *saved_render_cond_query;
140    enum pipe_render_cond_flag saved_render_cond_mode;
141    bool saved_render_cond_cond;
142 
143    bool saved_window_rectangles_include;
144    unsigned saved_num_window_rectangles;
145    struct pipe_scissor_state saved_window_rectangles[PIPE_MAX_WINDOW_RECTANGLES];
146 };
147 
148 /**
149  * Create a blitter context.
150  */
151 struct blitter_context *util_blitter_create(struct pipe_context *pipe);
152 
153 /**
154  * Destroy a blitter context.
155  */
156 void util_blitter_destroy(struct blitter_context *blitter);
157 
158 void util_blitter_cache_all_shaders(struct blitter_context *blitter);
159 void *util_blitter_get_noop_blend_state(struct blitter_context *blitter);
160 void *util_blitter_get_noop_dsa_state(struct blitter_context *blitter);
161 void *util_blitter_get_discard_rasterizer_state(struct blitter_context *blitter);
162 
163 
164 /**
165  * Return the pipe context associated with a blitter context.
166  */
167 static inline
util_blitter_get_pipe(struct blitter_context * blitter)168 struct pipe_context *util_blitter_get_pipe(struct blitter_context *blitter)
169 {
170    return blitter->pipe;
171 }
172 
173 /**
174  * Override pipe_caps.texture_multisample as reported by the driver.
175  */
176 void util_blitter_set_texture_multisample(struct blitter_context *blitter,
177                                           bool supported);
178 
179 /* The default function to draw a rectangle. This can only be used
180  * inside of the draw_rectangle callback if the driver overrides it. */
181 void util_blitter_draw_rectangle(struct blitter_context *blitter,
182                                  void *vertex_elements_cso,
183                                  blitter_get_vs_func get_vs,
184                                  int x1, int y1, int x2, int y2,
185                                  float depth, unsigned num_instances,
186                                  enum blitter_attrib_type type,
187                                  const union blitter_attrib *attrib);
188 
189 
190 /*
191  * These states must be saved before any of the following functions are called:
192  * - vertex buffers
193  * - vertex elements
194  * - vertex shader
195  * - geometry shader (if supported)
196  * - stream output targets (if supported)
197  * - rasterizer state
198  */
199 
200 /**
201  * Clear a specified set of currently bound buffers to specified values.
202  *
203  * These states must be saved in the blitter in addition to the state objects
204  * already required to be saved:
205  * - fragment shader
206  * - depth stencil alpha state
207  * - blend state
208  */
209 void util_blitter_clear(struct blitter_context *blitter,
210                         unsigned width, unsigned height, unsigned num_layers,
211                         unsigned clear_buffers,
212                         const union pipe_color_union *color,
213                         double depth, unsigned stencil,
214                         bool msaa);
215 
216 /**
217  * Check if the blitter (with the help of the driver) can blit between
218  * the two resources.
219  */
220 bool util_blitter_is_copy_supported(struct blitter_context *blitter,
221                                     const struct pipe_resource *dst,
222                                     const struct pipe_resource *src);
223 
224 bool util_blitter_is_blit_supported(struct blitter_context *blitter,
225 				    const struct pipe_blit_info *info);
226 
227 /**
228  * Copy a block of pixels from one surface to another.
229  *
230  * These states must be saved in the blitter in addition to the state objects
231  * already required to be saved:
232  * - fragment shader
233  * - depth stencil alpha state
234  * - blend state
235  * - fragment sampler states
236  * - fragment sampler textures
237  * - framebuffer state
238  * - sample mask
239  */
240 void util_blitter_copy_texture(struct blitter_context *blitter,
241                                struct pipe_resource *dst,
242                                unsigned dst_level,
243                                unsigned dstx, unsigned dsty, unsigned dstz,
244                                struct pipe_resource *src,
245                                unsigned src_level,
246                                const struct pipe_box *srcbox);
247 
248 /**
249  * This is a generic implementation of pipe->blit, which accepts
250  * sampler/surface views instead of resources.
251  *
252  * The layer and mipmap level are specified by the views.
253  *
254  * Drivers can use this to change resource properties (like format, width,
255  * height) by changing how the views interpret them, instead of changing
256  * pipe_resource directly. This is used to blit resources of formats which
257  * are not renderable.
258  *
259  * src_width0 and src_height0 are sampler_view-private properties that
260  * override pipe_resource. The blitter uses them for computation of texture
261  * coordinates. The dst dimensions are supplied through pipe_surface::width
262  * and height.
263  *
264  * The mask is a combination of the PIPE_MASK_* flags.
265  * Set to PIPE_MASK_RGBAZS if unsure.
266  */
267 void util_blitter_blit_generic(struct blitter_context *blitter,
268                                struct pipe_surface *dst,
269                                const struct pipe_box *dstbox,
270                                struct pipe_sampler_view *src,
271                                const struct pipe_box *srcbox,
272                                unsigned src_width0, unsigned src_height0,
273                                unsigned mask, unsigned filter,
274                                const struct pipe_scissor_state *scissor,
275                                bool alpha_blend, bool sample0_only,
276                                unsigned dst_sample,
277                                void *fs_override);
278 
279 void util_blitter_blit(struct blitter_context *blitter,
280 		       const struct pipe_blit_info *info,
281                        void *fs_override);
282 
283 void util_blitter_generate_mipmap(struct blitter_context *blitter,
284                                   struct pipe_resource *tex,
285                                   enum pipe_format format,
286                                   unsigned base_level, unsigned last_level,
287                                   unsigned first_layer, unsigned last_layer);
288 
289 /**
290  * Helper function to initialize a view for copy_texture_view.
291  * The parameters must match copy_texture_view.
292  */
293 void util_blitter_default_dst_texture(struct pipe_surface *dst_templ,
294                                       struct pipe_resource *dst,
295                                       unsigned dstlevel,
296                                       unsigned dstz);
297 
298 /**
299  * Helper function to initialize a view for copy_texture_view.
300  * The parameters must match copy_texture_view.
301  */
302 void util_blitter_default_src_texture(struct blitter_context *blitter,
303                                       struct pipe_sampler_view *src_templ,
304                                       struct pipe_resource *src,
305                                       unsigned srclevel);
306 
307 /**
308  * Clear the contents of a buffer using the Stream Output functionality.
309  * 4-byte alignment is required.
310  *
311  * "num_channels" can be 1, 2, 3, or 4, and specifies if the clear value is
312  * R, RG, RGB, or RGBA.
313  *
314  * For each element, only "num_channels" components of "clear_value" are
315  * copied to the buffer, then the offset is incremented by num_channels*4.
316  */
317 void util_blitter_clear_buffer(struct blitter_context *blitter,
318                                struct pipe_resource *dst,
319                                unsigned offset, unsigned size,
320                                unsigned num_channels,
321                                const union pipe_color_union *clear_value);
322 
323 /**
324  * Clear a region of a (color) surface to a constant value.
325  *
326  * These states must be saved in the blitter in addition to the state objects
327  * already required to be saved:
328  * - fragment shader
329  * - depth stencil alpha state
330  * - blend state
331  * - framebuffer state
332  */
333 void util_blitter_clear_render_target(struct blitter_context *blitter,
334                                       struct pipe_surface *dst,
335                                       const union pipe_color_union *color,
336                                       unsigned dstx, unsigned dsty,
337                                       unsigned width, unsigned height);
338 
339 /**
340  * Clear a region of a depth-stencil surface, both stencil and depth
341  * or only one of them if this is a combined depth-stencil surface.
342  *
343  * These states must be saved in the blitter in addition to the state objects
344  * already required to be saved:
345  * - fragment shader
346  * - depth stencil alpha state
347  * - blend state
348  * - framebuffer state
349  */
350 void util_blitter_clear_depth_stencil(struct blitter_context *blitter,
351                                       struct pipe_surface *dst,
352                                       unsigned clear_flags,
353                                       double depth,
354                                       unsigned stencil,
355                                       unsigned dstx, unsigned dsty,
356                                       unsigned width, unsigned height);
357 
358 /* The following functions are customized variants of the clear functions.
359  * Some drivers use them internally to do things like MSAA resolve
360  * and resource decompression. It usually consists of rendering a full-screen
361  * quad with a special blend or DSA state.
362  */
363 
364 /* Used by r300g for depth decompression. */
365 void util_blitter_custom_clear_depth(struct blitter_context *blitter,
366                                      unsigned width, unsigned height,
367                                      double depth, void *custom_dsa);
368 
369 /* Used by r600g for depth decompression. */
370 void util_blitter_custom_depth_stencil(struct blitter_context *blitter,
371 				       struct pipe_surface *zsurf,
372 				       struct pipe_surface *cbsurf,
373 				       unsigned sample_mask,
374 				       void *dsa_stage, float depth);
375 
376 /* Used by r600g for color decompression. */
377 void util_blitter_custom_color(struct blitter_context *blitter,
378                                struct pipe_surface *dstsurf,
379                                void *custom_blend);
380 
381 /* Used by r600g for MSAA color resolve. */
382 void util_blitter_custom_resolve_color(struct blitter_context *blitter,
383                                        struct pipe_resource *dst,
384                                        unsigned dst_level,
385                                        unsigned dst_layer,
386                                        struct pipe_resource *src,
387                                        unsigned src_layer,
388 				       unsigned sampled_mask,
389                                        void *custom_blend,
390                                        enum pipe_format format);
391 
392 /* Used by vc4 for 8/16-bit linear-to-tiled blits */
393 void util_blitter_custom_shader(struct blitter_context *blitter,
394                                 struct pipe_surface *dstsurf,
395                                 void *custom_vs, void *custom_fs);
396 
397 /* Used by D3D12 for non-MSAA -> MSAA stencil blits */
398 void util_blitter_stencil_fallback(struct blitter_context *blitter,
399                                    struct pipe_resource *dst,
400                                    unsigned dst_level,
401                                    const struct pipe_box *dstbox,
402                                    struct pipe_resource *src,
403                                    unsigned src_level,
404                                    const struct pipe_box *srcbox,
405                                    const struct pipe_scissor_state *scissor);
406 
407 /* The functions below should be used to save currently bound constant state
408  * objects inside a driver. The objects are automatically restored at the end
409  * of the util_blitter_{clear, copy_region, fill_region} functions and then
410  * forgotten.
411  *
412  * States not listed here are not affected by util_blitter. */
413 
414 static inline void
util_blitter_save_blend(struct blitter_context * blitter,void * state)415 util_blitter_save_blend(struct blitter_context *blitter, void *state)
416 {
417    blitter->saved_blend_state = state;
418 }
419 
420 static inline void
util_blitter_save_depth_stencil_alpha(struct blitter_context * blitter,void * state)421 util_blitter_save_depth_stencil_alpha(struct blitter_context *blitter,
422                                       void *state)
423 {
424    blitter->saved_dsa_state = state;
425 }
426 
427 static inline void
util_blitter_save_vertex_elements(struct blitter_context * blitter,void * state)428 util_blitter_save_vertex_elements(struct blitter_context *blitter, void *state)
429 {
430    blitter->saved_velem_state = state;
431 }
432 
433 static inline void
util_blitter_save_stencil_ref(struct blitter_context * blitter,const struct pipe_stencil_ref * state)434 util_blitter_save_stencil_ref(struct blitter_context *blitter,
435                               const struct pipe_stencil_ref *state)
436 {
437    blitter->saved_stencil_ref = *state;
438 }
439 
440 static inline void
util_blitter_save_rasterizer(struct blitter_context * blitter,void * state)441 util_blitter_save_rasterizer(struct blitter_context *blitter, void *state)
442 {
443    blitter->saved_rs_state = state;
444 }
445 
446 static inline void
util_blitter_save_fragment_shader(struct blitter_context * blitter,void * fs)447 util_blitter_save_fragment_shader(struct blitter_context *blitter, void *fs)
448 {
449    blitter->saved_fs = fs;
450 }
451 
452 static inline void
util_blitter_save_vertex_shader(struct blitter_context * blitter,void * vs)453 util_blitter_save_vertex_shader(struct blitter_context *blitter, void *vs)
454 {
455    blitter->saved_vs = vs;
456 }
457 
458 static inline void
util_blitter_save_geometry_shader(struct blitter_context * blitter,void * gs)459 util_blitter_save_geometry_shader(struct blitter_context *blitter, void *gs)
460 {
461    blitter->saved_gs = gs;
462 }
463 
464 static inline void
util_blitter_save_tessctrl_shader(struct blitter_context * blitter,void * sh)465 util_blitter_save_tessctrl_shader(struct blitter_context *blitter,
466                                   void *sh)
467 {
468    blitter->saved_tcs = sh;
469 }
470 
471 static inline void
util_blitter_save_tesseval_shader(struct blitter_context * blitter,void * sh)472 util_blitter_save_tesseval_shader(struct blitter_context *blitter,
473                                   void *sh)
474 {
475    blitter->saved_tes = sh;
476 }
477 
478 static inline void
util_blitter_save_framebuffer(struct blitter_context * blitter,const struct pipe_framebuffer_state * state)479 util_blitter_save_framebuffer(struct blitter_context *blitter,
480                               const struct pipe_framebuffer_state *state)
481 {
482    blitter->saved_fb_state.nr_cbufs = 0; /* It's ~0 now, meaning it's unsaved. */
483    util_copy_framebuffer_state(&blitter->saved_fb_state, state);
484 }
485 
486 static inline void
util_blitter_save_viewport(struct blitter_context * blitter,struct pipe_viewport_state * state)487 util_blitter_save_viewport(struct blitter_context *blitter,
488                            struct pipe_viewport_state *state)
489 {
490    blitter->saved_viewport = *state;
491 }
492 
493 static inline void
util_blitter_save_scissor(struct blitter_context * blitter,struct pipe_scissor_state * state)494 util_blitter_save_scissor(struct blitter_context *blitter,
495                           struct pipe_scissor_state *state)
496 {
497    blitter->saved_scissor = *state;
498 }
499 
500 static inline void
util_blitter_save_fragment_sampler_states(struct blitter_context * blitter,unsigned num_sampler_states,void ** sampler_states)501 util_blitter_save_fragment_sampler_states(
502                   struct blitter_context *blitter,
503                   unsigned num_sampler_states,
504                   void **sampler_states)
505 {
506    assert(num_sampler_states <= ARRAY_SIZE(blitter->saved_sampler_states));
507 
508    blitter->saved_num_sampler_states = num_sampler_states;
509    memcpy(blitter->saved_sampler_states, sampler_states,
510           num_sampler_states * sizeof(void *));
511 }
512 
513 static inline void
util_blitter_save_fragment_sampler_views(struct blitter_context * blitter,unsigned num_views,struct pipe_sampler_view ** views)514 util_blitter_save_fragment_sampler_views(struct blitter_context *blitter,
515                                          unsigned num_views,
516                                          struct pipe_sampler_view **views)
517 {
518    unsigned i;
519    assert(num_views <= ARRAY_SIZE(blitter->saved_sampler_views));
520 
521    blitter->saved_num_sampler_views = num_views;
522    for (i = 0; i < num_views; i++)
523       pipe_sampler_view_reference(&blitter->saved_sampler_views[i],
524                                   views[i]);
525 }
526 
527 static inline void
util_blitter_save_fragment_constant_buffer_slot(struct blitter_context * blitter,struct pipe_constant_buffer * constant_buffers)528 util_blitter_save_fragment_constant_buffer_slot(
529                   struct blitter_context *blitter,
530                   struct pipe_constant_buffer *constant_buffers)
531 {
532    pipe_resource_reference(&blitter->saved_fs_constant_buffer.buffer,
533                            constant_buffers[blitter->cb_slot].buffer);
534    memcpy(&blitter->saved_fs_constant_buffer, &constant_buffers[blitter->cb_slot],
535           sizeof(struct pipe_constant_buffer));
536 }
537 
538 static inline void
util_blitter_save_vertex_buffers(struct blitter_context * blitter,struct pipe_vertex_buffer * vertex_buffers,unsigned count)539 util_blitter_save_vertex_buffers(struct blitter_context *blitter,
540                                  struct pipe_vertex_buffer *vertex_buffers,
541                                  unsigned count)
542 {
543    for (unsigned i = 0; i < count; i++) {
544       pipe_vertex_buffer_reference(&blitter->saved_vertex_buffers[i],
545                                    &vertex_buffers[i]);
546    }
547    blitter->saved_num_vb = count;
548 }
549 
550 static inline void
util_blitter_save_so_targets(struct blitter_context * blitter,unsigned num_targets,struct pipe_stream_output_target ** targets,enum mesa_prim output_prim)551 util_blitter_save_so_targets(struct blitter_context *blitter,
552                              unsigned num_targets,
553                              struct pipe_stream_output_target **targets,
554                              enum mesa_prim output_prim)
555 {
556    unsigned i;
557    assert(num_targets <= ARRAY_SIZE(blitter->saved_so_targets));
558 
559    blitter->saved_num_so_targets = num_targets;
560    blitter->saved_so_output_prim = output_prim;
561 
562    for (i = 0; i < num_targets; i++)
563       pipe_so_target_reference(&blitter->saved_so_targets[i],
564                                targets[i]);
565 }
566 
567 static inline void
util_blitter_save_sample_mask(struct blitter_context * blitter,unsigned sample_mask,unsigned min_samples)568 util_blitter_save_sample_mask(struct blitter_context *blitter,
569                               unsigned sample_mask, unsigned min_samples)
570 {
571    blitter->is_sample_mask_saved = true;
572    blitter->saved_sample_mask = sample_mask;
573    blitter->saved_min_samples = min_samples;
574 }
575 
576 static inline void
util_blitter_save_render_condition(struct blitter_context * blitter,struct pipe_query * query,bool condition,enum pipe_render_cond_flag mode)577 util_blitter_save_render_condition(struct blitter_context *blitter,
578                                    struct pipe_query *query,
579                                    bool condition,
580                                    enum pipe_render_cond_flag mode)
581 {
582    blitter->saved_render_cond_query = query;
583    blitter->saved_render_cond_mode = mode;
584    blitter->saved_render_cond_cond = condition;
585 }
586 
587 static inline void
util_blitter_save_window_rectangles(struct blitter_context * blitter,bool include,unsigned num_rectangles,const struct pipe_scissor_state * rects)588 util_blitter_save_window_rectangles(struct blitter_context *blitter,
589                                     bool include,
590                                     unsigned num_rectangles,
591                                     const struct pipe_scissor_state *rects)
592 {
593    blitter->saved_window_rectangles_include = include;
594    blitter->saved_num_window_rectangles = num_rectangles;
595    if (num_rectangles > 0) {
596       assert(num_rectangles < ARRAY_SIZE(blitter->saved_window_rectangles));
597       memcpy(blitter->saved_window_rectangles, rects,
598              sizeof(*rects) * num_rectangles);
599    }
600 }
601 
602 void util_blitter_common_clear_setup(struct blitter_context *blitter,
603                                      unsigned width, unsigned height,
604                                      unsigned clear_buffers,
605                                      void *custom_blend, void *custom_dsa);
606 
607 void util_blitter_set_running_flag(struct blitter_context *blitter);
608 void util_blitter_unset_running_flag(struct blitter_context *blitter);
609 
610 void util_blitter_restore_vertex_states(struct blitter_context *blitter);
611 void util_blitter_restore_fragment_states(struct blitter_context *blitter);
612 void util_blitter_restore_render_cond(struct blitter_context *blitter);
613 void util_blitter_restore_fb_state(struct blitter_context *blitter);
614 void util_blitter_restore_textures(struct blitter_context *blitter);
615 void util_blitter_restore_constant_buffer_state(struct blitter_context *blitter);
616 
617 /* These are supported combinations of blits from ZS to color and vice versa.
618  * The blitter will do the packing/unpacking of depth and stencil
619  * in the fragment shader.
620  */
621 static inline enum pipe_format
util_blitter_get_color_format_for_zs(enum pipe_format format)622 util_blitter_get_color_format_for_zs(enum pipe_format format)
623 {
624    switch (format) {
625    case PIPE_FORMAT_Z16_UNORM:
626       return PIPE_FORMAT_R16_UNORM;
627 
628    case PIPE_FORMAT_Z32_FLOAT:
629       return PIPE_FORMAT_R32_FLOAT;
630 
631    case PIPE_FORMAT_Z24_UNORM_S8_UINT:
632    case PIPE_FORMAT_Z24X8_UNORM:
633    case PIPE_FORMAT_S8_UINT_Z24_UNORM:
634    case PIPE_FORMAT_X8Z24_UNORM:
635       return PIPE_FORMAT_R32_UINT;
636 
637    case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
638       return PIPE_FORMAT_R32G32_UINT;
639 
640    case PIPE_FORMAT_Z32_UNORM:
641    default:
642       assert(0);
643    }
644    return PIPE_FORMAT_NONE;
645 }
646 
647 #ifdef __cplusplus
648 }
649 #endif
650 
651 #endif
652