155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák/**************************************************************************
255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák *
355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * Copyright 2009 Marek Olšák <maraeo@gmail.com>
455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák *
555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * Permission is hereby granted, free of charge, to any person obtaining a
655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * copy of this software and associated documentation files (the
755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * "Software"), to deal in the Software without restriction, including
855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * without limitation the rights to use, copy, modify, merge, publish,
955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * distribute, sub license, and/or sell copies of the Software, and to
1055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * permit persons to whom the Software is furnished to do so, subject to
1155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * the following conditions:
1255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák *
1355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * The above copyright notice and this permission notice (including the
1455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * next paragraph) shall be included in all copies or substantial portions
1555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * of the Software.
1655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák *
1755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
2155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák *
2555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák **************************************************************************/
2655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
2755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#ifndef U_BLITTER_H
2855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#define U_BLITTER_H
2955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
30a922725118333e016a357008f37105c23c6f54bcMarek Olšák#include "util/u_framebuffer.h"
318f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák#include "util/u_inlines.h"
3255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_memory.h"
3355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "pipe/p_state.h"
3555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#ifdef __cplusplus
3855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákextern "C" {
3955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#endif
4055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
4155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct pipe_context;
4255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
439be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákenum blitter_attrib_type {
449be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   UTIL_BLITTER_ATTRIB_NONE,
459be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   UTIL_BLITTER_ATTRIB_COLOR,
469be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   UTIL_BLITTER_ATTRIB_TEXCOORD
479be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák};
489be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
4955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context
5055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
519be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   /**
529be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák    * Draw a rectangle.
539be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák    *
549be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák    * \param x1      An X coordinate of the top-left corner.
559be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák    * \param y1      A Y coordinate of the top-left corner.
569be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák    * \param x2      An X coordinate of the bottom-right corner.
579be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák    * \param y2      A Y coordinate of the bottom-right corner.
58db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák    * \param depth   A depth which the rectangle is rendered at.
599be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák    *
609be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák    * \param type   Semantics of the attributes "attrib".
619be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák    *               If type is UTIL_BLITTER_ATTRIB_NONE, ignore them.
629be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák    *               If type is UTIL_BLITTER_ATTRIB_COLOR, the attributes
63db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák    *               make up a constant RGBA color, and should go
64db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák    *               to the GENERIC0 varying slot of a fragment shader.
659be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák    *               If type is UTIL_BLITTER_ATTRIB_TEXCOORD, {a1, a2} and
669be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák    *               {a3, a4} specify top-left and bottom-right texture
679be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák    *               coordinates of the rectangle, respectively, and should go
689be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák    *               to the GENERIC0 varying slot of a fragment shader.
699be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák    *
709be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák    * \param attrib See type.
719be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák    *
729be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák    * \note A driver may optionally override this callback to implement
739be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák    *       a specialized hardware path for drawing a rectangle, e.g. using
749be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák    *       a rectangular point sprite.
759be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák    */
769be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   void (*draw_rectangle)(struct blitter_context *blitter,
779be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                          unsigned x1, unsigned y1, unsigned x2, unsigned y2,
789be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                          float depth,
799be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                          enum blitter_attrib_type type,
806dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                          const union pipe_color_union *color);
819be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
82ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák   /* Whether the blitter is running. */
83ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák   boolean running;
84ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák
8555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* Private members, really. */
869b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe; /**< pipe context */
879b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák
8855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *saved_blend_state;   /**< blend state */
8955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *saved_dsa_state;     /**< depth stencil alpha state */
90ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   void *saved_velem_state;   /**< vertex elements state */
9155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *saved_rs_state;      /**< rasterizer state */
924c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák   void *saved_fs, *saved_vs, *saved_gs; /**< shaders */
9355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
9455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_framebuffer_state saved_fb_state;  /**< framebuffer state */
95ed0f3b08b65679452132a9caeef1509a8dac23b9Roland Scheidegger   struct pipe_stencil_ref saved_stencil_ref;     /**< stencil ref */
96932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   struct pipe_viewport_state saved_viewport;
976c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák   boolean is_sample_mask_saved;
986c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák   unsigned saved_sample_mask;
9955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
10055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int saved_num_sampler_states;
101f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   void *saved_sampler_states[PIPE_MAX_SAMPLERS];
10255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
103f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   int saved_num_sampler_views;
104f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   struct pipe_sampler_view *saved_sampler_views[PIPE_MAX_SAMPLERS];
10564aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri
10664aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri   int saved_num_vertex_buffers;
10764aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri   struct pipe_vertex_buffer saved_vertex_buffers[PIPE_MAX_ATTRIBS];
108b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák
109b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák   int saved_num_so_targets;
110b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák   struct pipe_stream_output_target *saved_so_targets[PIPE_MAX_SO_BUFFERS];
11155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák};
11255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
11355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák/**
11455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * Create a blitter context.
11555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák */
11655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context *util_blitter_create(struct pipe_context *pipe);
11755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
11855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák/**
11955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * Destroy a blitter context.
12055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák */
12155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_destroy(struct blitter_context *blitter);
12255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
1239b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák/**
1249b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák * Return the pipe context associated with a blitter context.
1259b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák */
1269b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšákstatic INLINE
1279b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšákstruct pipe_context *util_blitter_get_pipe(struct blitter_context *blitter)
1289b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák{
1299b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   return blitter->pipe;
1309b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák}
1319b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák
132187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák/* The default function to draw a rectangle. This can only be used
133187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák * inside of the draw_rectangle callback if the driver overrides it. */
134187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšákvoid util_blitter_draw_rectangle(struct blitter_context *blitter,
135187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák                                 unsigned x1, unsigned y1,
136187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák                                 unsigned x2, unsigned y2,
137187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák                                 float depth,
138187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák                                 enum blitter_attrib_type type,
139187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák                                 const union pipe_color_union *attrib);
140187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák
14155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák/*
142c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * These states must be saved before any of the following functions are called:
143233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák * - vertex buffers
144233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák * - vertex elements
145c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - vertex shader
1464c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák * - geometry shader (if supported)
147b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák * - stream output targets (if supported)
148c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - rasterizer state
14955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák */
15055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
15155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák/**
15255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * Clear a specified set of currently bound buffers to specified values.
153c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák *
154c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * These states must be saved in the blitter in addition to the state objects
155c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * already required to be saved:
156c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - fragment shader
157c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - depth stencil alpha state
158c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - blend state
15955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák */
16055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_clear(struct blitter_context *blitter,
16155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                        unsigned width, unsigned height,
16255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                        unsigned num_cbufs,
16355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                        unsigned clear_buffers,
1644e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie                        enum pipe_format cbuf_format,
1656dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                        const union pipe_color_union *color,
16655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                        double depth, unsigned stencil);
16755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
16855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák/**
16984645fa61390475e6efb080685e0dec059622a39Marek Olšák * Check if the blitter (with the help of the driver) can blit between
17084645fa61390475e6efb080685e0dec059622a39Marek Olšák * the two resources.
17184645fa61390475e6efb080685e0dec059622a39Marek Olšák * The mask is a combination of the PIPE_MASK_* flags.
17284645fa61390475e6efb080685e0dec059622a39Marek Olšák * Set to PIPE_MASK_RGBAZS if unsure.
17384645fa61390475e6efb080685e0dec059622a39Marek Olšák */
17484645fa61390475e6efb080685e0dec059622a39Marek Olšákboolean util_blitter_is_copy_supported(struct blitter_context *blitter,
17584645fa61390475e6efb080685e0dec059622a39Marek Olšák                                       const struct pipe_resource *dst,
17684645fa61390475e6efb080685e0dec059622a39Marek Olšák                                       const struct pipe_resource *src,
17784645fa61390475e6efb080685e0dec059622a39Marek Olšák                                       unsigned mask);
17884645fa61390475e6efb080685e0dec059622a39Marek Olšák/**
17955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * Copy a block of pixels from one surface to another.
18055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák *
18155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * You can copy from any color format to any other color format provided
182c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * the former can be sampled from and the latter can be rendered to. Otherwise,
18355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * a software fallback path is taken and both surfaces must be of the same
18455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * format.
18555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák *
186825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * Only one sample of a multisample texture can be copied and is specified by
187825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * src_sample. If the destination is a multisample resource, dst_sample_mask
188825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * specifies the sample mask. For single-sample resources, set dst_sample_mask
189825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * to ~0.
19055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák *
19155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * These states must be saved in the blitter in addition to the state objects
19255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * already required to be saved:
193c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - fragment shader
194c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - depth stencil alpha state
195c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - blend state
19655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * - fragment sampler states
19755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * - fragment sampler textures
198c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - framebuffer state
19955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák */
200233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšákvoid util_blitter_copy_texture(struct blitter_context *blitter,
201233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák                               struct pipe_resource *dst,
202825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák                               unsigned dst_level, unsigned dst_sample_mask,
203233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák                               unsigned dstx, unsigned dsty, unsigned dstz,
204233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák                               struct pipe_resource *src,
205825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák                               unsigned src_level, unsigned src_sample,
206c8ff737a18672c86f4ec01b25b4893550667b17cMarek Olšák                               const struct pipe_box *srcbox);
20755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
20855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák/**
20937b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák * Same as util_blitter_copy_texture, but dst and src are pipe_surface and
21037b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák * pipe_sampler_view, respectively. The mipmap level and dstz are part of
21137b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák * the views.
21237b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák *
21337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák * Drivers can use this to change resource properties (like format, width,
21489ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák * height) by changing how the views interpret them, instead of changing
21537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák * pipe_resource directly. This is usually needed to accelerate copying of
21637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák * compressed formats.
21737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák *
21889ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák * src_width0 and src_height0 are sampler_view-private properties that
21989ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák * override pipe_resource. The blitter uses them for computation of texture
22089ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák * coordinates. The dst dimensions are supplied through pipe_surface::width
22189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák * and height.
22289ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák *
22384645fa61390475e6efb080685e0dec059622a39Marek Olšák * The mask is a combination of the PIPE_MASK_* flags.
22484645fa61390475e6efb080685e0dec059622a39Marek Olšák * Set to PIPE_MASK_RGBAZS if unsure.
22584645fa61390475e6efb080685e0dec059622a39Marek Olšák *
22637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák * NOTE: There are no checks whether the blit is actually supported.
22737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák */
22837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšákvoid util_blitter_copy_texture_view(struct blitter_context *blitter,
22937b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák                                    struct pipe_surface *dst,
230825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák                                    unsigned dst_sample_mask,
23137b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák                                    unsigned dstx, unsigned dsty,
23237b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák                                    struct pipe_sampler_view *src,
233825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák                                    unsigned src_sample,
23489ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák                                    const struct pipe_box *srcbox,
235ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák                                    unsigned src_width0, unsigned src_height0,
236ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák                                    unsigned mask);
23737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák
23837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák/**
239ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák * Helper function to initialize a view for copy_texture_view.
240ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák * The parameters must match copy_texture_view.
241ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák */
242ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšákvoid util_blitter_default_dst_texture(struct pipe_surface *dst_templ,
243ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák                                      struct pipe_resource *dst,
244ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák                                      unsigned dstlevel,
245ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák                                      unsigned dstz,
246ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák                                      const struct pipe_box *srcbox);
247ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák
248ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák/**
249ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák * Helper function to initialize a view for copy_texture_view.
250ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák * The parameters must match copy_texture_view.
251ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák */
252ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšákvoid util_blitter_default_src_texture(struct pipe_sampler_view *src_templ,
253ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák                                      struct pipe_resource *src,
254ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák                                      unsigned srclevel);
255ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák
256ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák/**
25736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák * Copy data from one buffer to another using the Stream Output functionality.
25836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák * Some alignment is required, otherwise software fallback is used.
25936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák */
26036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšákvoid util_blitter_copy_buffer(struct blitter_context *blitter,
26136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák                              struct pipe_resource *dst,
26236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák                              unsigned dstx,
26336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák                              struct pipe_resource *src,
26436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák                              unsigned srcx,
26536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák                              unsigned size);
26636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák
26736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák/**
268a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger * Clear a region of a (color) surface to a constant value.
26955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák *
27055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * These states must be saved in the blitter in addition to the state objects
27155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * already required to be saved:
272c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - fragment shader
273c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - depth stencil alpha state
274c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - blend state
27555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * - framebuffer state
27655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák */
277a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_render_target(struct blitter_context *blitter,
278a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      struct pipe_surface *dst,
2796dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                                      const union pipe_color_union *color,
280a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned dstx, unsigned dsty,
281a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned width, unsigned height);
28255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
283a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/**
284a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger * Clear a region of a depth-stencil surface, both stencil and depth
285a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger * or only one of them if this is a combined depth-stencil surface.
286a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger *
287a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger * These states must be saved in the blitter in addition to the state objects
288a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger * already required to be saved:
289c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - fragment shader
290c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - depth stencil alpha state
291c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - blend state
292a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger * - framebuffer state
293a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger */
294a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_depth_stencil(struct blitter_context *blitter,
295a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      struct pipe_surface *dst,
296a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned clear_flags,
297a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      double depth,
298a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned stencil,
299a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned dstx, unsigned dsty,
300a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned width, unsigned height);
30155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
302e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák/* The following functions are customized variants of the clear functions.
303e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák * Some drivers use them internally to do things like MSAA resolve
304e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák * and resource decompression. It usually consists of rendering a full-screen
305e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák * quad with a special blend or DSA state.
306e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák */
307e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák
308e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák/* Used by r300g for depth decompression. */
309e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšákvoid util_blitter_custom_clear_depth(struct blitter_context *blitter,
310e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák                                     unsigned width, unsigned height,
311e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák                                     double depth, void *custom_dsa);
312e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák
313e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák/* Used by r600g for depth decompression. */
314c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlievoid util_blitter_custom_depth_stencil(struct blitter_context *blitter,
315c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie				       struct pipe_surface *zsurf,
316c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie				       struct pipe_surface *cbsurf,
31794b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák				       unsigned sample_mask,
318c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie				       void *dsa_stage, float depth);
319c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie
320a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák/* Used by r600g for color decompression. */
321a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšákvoid util_blitter_custom_color(struct blitter_context *blitter,
322a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák                               struct pipe_surface *dstsurf,
323a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák                               void *custom_blend);
324a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák
325e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák/* Used by r600g for MSAA color resolve. */
326e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšákvoid util_blitter_custom_resolve_color(struct blitter_context *blitter,
3270f86915c5322b096b7154b6c84e21288074b775dMarek Olšák                                       struct pipe_resource *dst,
3280f86915c5322b096b7154b6c84e21288074b775dMarek Olšák                                       unsigned dst_level,
3290f86915c5322b096b7154b6c84e21288074b775dMarek Olšák                                       unsigned dst_layer,
3300f86915c5322b096b7154b6c84e21288074b775dMarek Olšák                                       struct pipe_resource *src,
3310f86915c5322b096b7154b6c84e21288074b775dMarek Olšák                                       unsigned src_layer,
33264db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák				       unsigned sampled_mask,
3330f86915c5322b096b7154b6c84e21288074b775dMarek Olšák                                       void *custom_blend);
3340f86915c5322b096b7154b6c84e21288074b775dMarek Olšák
33555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák/* The functions below should be used to save currently bound constant state
33655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * objects inside a driver. The objects are automatically restored at the end
3374d70a25964a7f815f15217985f0aa670157d31e8Marek Olšák * of the util_blitter_{clear, copy_region, fill_region} functions and then
33855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * forgotten.
33955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák *
340c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * States not listed here are not affected by util_blitter. */
34155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
34255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic INLINE
34355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_save_blend(struct blitter_context *blitter,
34455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                             void *state)
34555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
34655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter->saved_blend_state = state;
34755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
34855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
34955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic INLINE
35055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_save_depth_stencil_alpha(struct blitter_context *blitter,
35155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                           void *state)
35255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
35355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter->saved_dsa_state = state;
35455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
35555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
35655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic INLINE
357ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheideggervoid util_blitter_save_vertex_elements(struct blitter_context *blitter,
358ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger                                       void *state)
359ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger{
360ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   blitter->saved_velem_state = state;
361ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger}
362ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger
363ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheideggerstatic INLINE
364ed0f3b08b65679452132a9caeef1509a8dac23b9Roland Scheideggervoid util_blitter_save_stencil_ref(struct blitter_context *blitter,
365ed0f3b08b65679452132a9caeef1509a8dac23b9Roland Scheidegger                                   const struct pipe_stencil_ref *state)
366ed0f3b08b65679452132a9caeef1509a8dac23b9Roland Scheidegger{
367ed0f3b08b65679452132a9caeef1509a8dac23b9Roland Scheidegger   blitter->saved_stencil_ref = *state;
368ed0f3b08b65679452132a9caeef1509a8dac23b9Roland Scheidegger}
369ed0f3b08b65679452132a9caeef1509a8dac23b9Roland Scheidegger
370ed0f3b08b65679452132a9caeef1509a8dac23b9Roland Scheideggerstatic INLINE
37155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_save_rasterizer(struct blitter_context *blitter,
37255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  void *state)
37355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
37455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter->saved_rs_state = state;
37555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
37655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
37755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic INLINE
37855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_save_fragment_shader(struct blitter_context *blitter,
37955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                       void *fs)
38055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
38155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter->saved_fs = fs;
38255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
38355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
38455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic INLINE
38555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_save_vertex_shader(struct blitter_context *blitter,
38655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     void *vs)
38755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
38855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter->saved_vs = vs;
38955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
39055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
39155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic INLINE
3924c417697b6fa1503ac35b34e79f23716d813a208Marek Olšákvoid util_blitter_save_geometry_shader(struct blitter_context *blitter,
3934c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák                                       void *gs)
3944c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák{
3954c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák   blitter->saved_gs = gs;
3964c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák}
3974c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák
3984c417697b6fa1503ac35b34e79f23716d813a208Marek Olšákstatic INLINE
39955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_save_framebuffer(struct blitter_context *blitter,
4000b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák                                   const struct pipe_framebuffer_state *state)
40155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
4020b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák   blitter->saved_fb_state.nr_cbufs = 0; /* It's ~0 now, meaning it's unsaved. */
403a922725118333e016a357008f37105c23c6f54bcMarek Olšák   util_copy_framebuffer_state(&blitter->saved_fb_state, state);
40455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
40555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
40655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic INLINE
407932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krolvoid util_blitter_save_viewport(struct blitter_context *blitter,
408932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol                                struct pipe_viewport_state *state)
409932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol{
410932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   blitter->saved_viewport = *state;
411932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol}
412932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
413932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krolstatic INLINE
41455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_save_fragment_sampler_states(
41555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                  struct blitter_context *blitter,
41655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                  int num_sampler_states,
41755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                  void **sampler_states)
41855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
41955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   assert(num_sampler_states <= Elements(blitter->saved_sampler_states));
42055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
42155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter->saved_num_sampler_states = num_sampler_states;
42255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   memcpy(blitter->saved_sampler_states, sampler_states,
42355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák          num_sampler_states * sizeof(void *));
42455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
42555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
426f6106566081978f663cf08e54bb8908cb58a5316Michal Krolstatic INLINE void
427f6106566081978f663cf08e54bb8908cb58a5316Michal Krolutil_blitter_save_fragment_sampler_views(struct blitter_context *blitter,
428f6106566081978f663cf08e54bb8908cb58a5316Michal Krol                                         int num_views,
429f6106566081978f663cf08e54bb8908cb58a5316Michal Krol                                         struct pipe_sampler_view **views)
43055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
4310b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák   unsigned i;
432f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   assert(num_views <= Elements(blitter->saved_sampler_views));
43355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
434f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   blitter->saved_num_sampler_views = num_views;
4350b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák   for (i = 0; i < num_views; i++)
4360b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák      pipe_sampler_view_reference(&blitter->saved_sampler_views[i],
4370b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák                                  views[i]);
43855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
43955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
44064aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieristatic INLINE void
44164aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieriutil_blitter_save_vertex_buffers(struct blitter_context *blitter,
442c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák                                 int num_vertex_buffers,
443c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák                                 struct pipe_vertex_buffer *vertex_buffers)
44464aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri{
44564aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri   assert(num_vertex_buffers <= Elements(blitter->saved_vertex_buffers));
44664aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri
4473c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák   blitter->saved_num_vertex_buffers = 0;
4483c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák   util_copy_vertex_buffers(blitter->saved_vertex_buffers,
4493c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák                            (unsigned*)&blitter->saved_num_vertex_buffers,
4503c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák                            vertex_buffers,
4513c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák                            num_vertex_buffers);
45264aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri}
45364aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri
454b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšákstatic INLINE void
455b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšákutil_blitter_save_so_targets(struct blitter_context *blitter,
456b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák                             int num_targets,
457b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák                             struct pipe_stream_output_target **targets)
458b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák{
459b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák   unsigned i;
460b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák   assert(num_targets <= Elements(blitter->saved_so_targets));
461b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák
462b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák   blitter->saved_num_so_targets = num_targets;
463b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák   for (i = 0; i < num_targets; i++)
464b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák      pipe_so_target_reference(&blitter->saved_so_targets[i],
465b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák                               targets[i]);
466b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák}
467b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák
4686c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšákstatic INLINE void
4696c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšákutil_blitter_save_sample_mask(struct blitter_context *blitter,
4706c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák                              unsigned sample_mask)
4716c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák{
4726c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák   blitter->is_sample_mask_saved = TRUE;
4736c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák   blitter->saved_sample_mask = sample_mask;
4746c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák}
4756c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák
47655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#ifdef __cplusplus
47755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
47855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#endif
47955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
48055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#endif
481