u_blitter.h revision 36d66f8d4ad1e2b18bb28d0b08e98f968ad6137e
19e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/**************************************************************************
204351a92ecc8429c999acbfc5dfe5aa8bee1d19dElliott Hughes *
39e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Copyright 2009 Marek Olšák <maraeo@gmail.com>
49e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *
59e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Permission is hereby granted, free of charge, to any person obtaining a
69e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * copy of this software and associated documentation files (the
79e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * "Software"), to deal in the Software without restriction, including
89e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * without limitation the rights to use, copy, modify, merge, publish,
99e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * distribute, sub license, and/or sell copies of the Software, and to
109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * permit persons to whom the Software is furnished to do so, subject to
119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * the following conditions:
1204351a92ecc8429c999acbfc5dfe5aa8bee1d19dElliott Hughes *
139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * The above copyright notice and this permission notice (including the
149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * next paragraph) shall be included in all copies or substantial portions
159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * of the Software.
169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *
179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *
259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project **************************************************************************/
269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef U_BLITTER_H
289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define U_BLITTER_H
299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include "util/u_framebuffer.h"
319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include "util/u_inlines.h"
329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include "util/u_memory.h"
339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include "pipe/p_state.h"
359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef __cplusplus
389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectextern "C" {
399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectstruct pipe_context;
429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectenum blitter_attrib_type {
449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   UTIL_BLITTER_ATTRIB_NONE,
459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   UTIL_BLITTER_ATTRIB_COLOR,
469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   UTIL_BLITTER_ATTRIB_TEXCOORD
479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project};
489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectstruct blitter_context
509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   /**
529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    * Draw a rectangle.
539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *
549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    * \param x1      An X coordinate of the top-left corner.
559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    * \param y1      A Y coordinate of the top-left corner.
569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    * \param x2      An X coordinate of the bottom-right corner.
579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    * \param y2      A Y coordinate of the bottom-right corner.
589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    * \param depth   A depth which the rectangle is rendered at.
599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *
609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    * \param type   Semantics of the attributes "attrib".
619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *               If type is UTIL_BLITTER_ATTRIB_NONE, ignore them.
629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *               If type is UTIL_BLITTER_ATTRIB_COLOR, the attributes
639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *               make up a constant RGBA color, and should go
649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *               to the GENERIC0 varying slot of a fragment shader.
659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *               If type is UTIL_BLITTER_ATTRIB_TEXCOORD, {a1, a2} and
669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *               {a3, a4} specify top-left and bottom-right texture
6704351a92ecc8429c999acbfc5dfe5aa8bee1d19dElliott Hughes    *               coordinates of the rectangle, respectively, and should go
689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *               to the GENERIC0 varying slot of a fragment shader.
699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *
709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    * \param attrib See type.
719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *
729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    * \note A driver may optionally override this callback to implement
739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *       a specialized hardware path for drawing a rectangle, e.g. using
749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *       a rectangular point sprite.
759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    */
769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   void (*draw_rectangle)(struct blitter_context *blitter,
779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                          unsigned x1, unsigned y1, unsigned x2, unsigned y2,
789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                          float depth,
799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                          enum blitter_attrib_type type,
809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                          const union pipe_color_union *color);
819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   /* Whether the blitter is running. */
839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   boolean running;
849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   /* Private members, really. */
869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   struct pipe_context *pipe; /**< pipe context */
879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   void *saved_blend_state;   /**< blend state */
899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   void *saved_dsa_state;     /**< depth stencil alpha state */
909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   void *saved_velem_state;   /**< vertex elements state */
919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   void *saved_rs_state;      /**< rasterizer state */
929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   void *saved_fs, *saved_vs, *saved_gs; /**< shaders */
939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   struct pipe_framebuffer_state saved_fb_state;  /**< framebuffer state */
959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   struct pipe_stencil_ref saved_stencil_ref;     /**< stencil ref */
969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   struct pipe_viewport_state saved_viewport;
979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   struct pipe_clip_state saved_clip;
989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   int saved_num_sampler_states;
1009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   void *saved_sampler_states[PIPE_MAX_SAMPLERS];
1019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   int saved_num_sampler_views;
1039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   struct pipe_sampler_view *saved_sampler_views[PIPE_MAX_SAMPLERS];
1049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   int saved_num_vertex_buffers;
1069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   struct pipe_vertex_buffer saved_vertex_buffers[PIPE_MAX_ATTRIBS];
1079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   int saved_num_so_targets;
1099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   struct pipe_stream_output_target *saved_so_targets[PIPE_MAX_SO_BUFFERS];
1109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project};
1119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/**
1139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Create a blitter context.
1149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
1159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectstruct blitter_context *util_blitter_create(struct pipe_context *pipe);
1169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/**
1189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Destroy a blitter context.
1199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
1209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid util_blitter_destroy(struct blitter_context *blitter);
1219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/**
1239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Return the pipe context associated with a blitter context.
1249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
1259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectstatic INLINE
1269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectstruct pipe_context *util_blitter_get_pipe(struct blitter_context *blitter)
1279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
1289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   return blitter->pipe;
1299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
1309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
1329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * These states must be saved before any of the following functions are called:
1339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * - vertex buffers
1349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * - vertex elements
1359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * - vertex shader
1369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * - geometry shader (if supported)
1379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * - stream output targets (if supported)
1389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * - rasterizer state
1399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
1409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/**
1429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Clear a specified set of currently bound buffers to specified values.
1439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *
1449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * These states must be saved in the blitter in addition to the state objects
1459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * already required to be saved:
1469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * - fragment shader
1479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * - depth stencil alpha state
1489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * - blend state
1499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
1509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid util_blitter_clear(struct blitter_context *blitter,
1519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                        unsigned width, unsigned height,
1529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                        unsigned num_cbufs,
1539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                        unsigned clear_buffers,
1549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                        enum pipe_format cbuf_format,
1559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                        const union pipe_color_union *color,
1569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                        double depth, unsigned stencil);
1579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid util_blitter_clear_depth_custom(struct blitter_context *blitter,
1599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                     unsigned width, unsigned height,
1609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                     double depth, void *custom_dsa);
1619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/**
163381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes * Copy a block of pixels from one surface to another.
164381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes *
165381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes * You can copy from any color format to any other color format provided
166381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes * the former can be sampled from and the latter can be rendered to. Otherwise,
1679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * a software fallback path is taken and both surfaces must be of the same
1689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * format.
1699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *
1709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * The same holds for depth-stencil formats with the exception that stencil
1719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * cannot be copied unless you set ignore_stencil to FALSE. In that case,
1729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * a software fallback path is taken and both surfaces must be of the same
1739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * format.
1749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * XXX implement hw-accel stencil copy using shader stencil export.
1759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *
1769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Use pipe_screen->is_format_supported to know your options.
1779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *
1789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * These states must be saved in the blitter in addition to the state objects
1799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * already required to be saved:
1809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * - fragment shader
1819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * - depth stencil alpha state
1829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * - blend state
1839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * - fragment sampler states
1849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * - fragment sampler textures
1859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * - framebuffer state
1869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
1879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid util_blitter_copy_texture(struct blitter_context *blitter,
1889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                               struct pipe_resource *dst,
1899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                               unsigned dstlevel,
1909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                               unsigned dstx, unsigned dsty, unsigned dstz,
1919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                               struct pipe_resource *src,
1929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                               unsigned srclevel,
1939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                               const struct pipe_box *srcbox,
1949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                               boolean ignore_stencil);
1959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/**
1979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Same as util_blitter_copy_texture, but dst and src are pipe_surface and
1989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * pipe_sampler_view, respectively. The mipmap level and dstz are part of
1999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * the views.
2009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *
2019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Drivers can use this to change resource properties (like format, width,
2029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * height) by changing how the views interpret them, instead of changing
2039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * pipe_resource directly. This is usually needed to accelerate copying of
2049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * compressed formats.
205381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes *
206381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes * src_width0 and src_height0 are sampler_view-private properties that
2079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * override pipe_resource. The blitter uses them for computation of texture
2089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * coordinates. The dst dimensions are supplied through pipe_surface::width
2099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * and height.
2109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *
2119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * NOTE: There are no checks whether the blit is actually supported.
2129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
2139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid util_blitter_copy_texture_view(struct blitter_context *blitter,
2149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                    struct pipe_surface *dst,
2159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                    unsigned dstx, unsigned dsty,
2169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                    struct pipe_sampler_view *src,
2179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                    const struct pipe_box *srcbox,
2189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                    unsigned src_width0, unsigned src_height0);
2199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/**
2219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Copy data from one buffer to another using the Stream Output functionality.
2229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Some alignment is required, otherwise software fallback is used.
2239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
2249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid util_blitter_copy_buffer(struct blitter_context *blitter,
2259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                              struct pipe_resource *dst,
2269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                              unsigned dstx,
2279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                              struct pipe_resource *src,
2289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                              unsigned srcx,
2299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                              unsigned size);
2309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/**
2329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Clear a region of a (color) surface to a constant value.
2339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *
2349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * These states must be saved in the blitter in addition to the state objects
2359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * already required to be saved:
2369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * - fragment shader
2379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * - depth stencil alpha state
2389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * - blend state
2399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * - framebuffer state
2409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
2419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid util_blitter_clear_render_target(struct blitter_context *blitter,
2429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                      struct pipe_surface *dst,
2439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                      const union pipe_color_union *color,
2449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                      unsigned dstx, unsigned dsty,
2459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                      unsigned width, unsigned height);
2469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/**
2489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Clear a region of a depth-stencil surface, both stencil and depth
2499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * or only one of them if this is a combined depth-stencil surface.
2509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *
2519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * These states must be saved in the blitter in addition to the state objects
2529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * already required to be saved:
2539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * - fragment shader
2549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * - depth stencil alpha state
2559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * - blend state
2569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * - framebuffer state
2579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
2589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid util_blitter_clear_depth_stencil(struct blitter_context *blitter,
2599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                      struct pipe_surface *dst,
2609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                      unsigned clear_flags,
2619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                      double depth,
2629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                      unsigned stencil,
2639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                      unsigned dstx, unsigned dsty,
2649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                      unsigned width, unsigned height);
2659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid util_blitter_custom_depth_stencil(struct blitter_context *blitter,
2679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project				       struct pipe_surface *zsurf,
2689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project				       struct pipe_surface *cbsurf,
2699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project				       void *dsa_stage, float depth);
2709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* The functions below should be used to save currently bound constant state
2729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * objects inside a driver. The objects are automatically restored at the end
273381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes * of the util_blitter_{clear, copy_region, fill_region} functions and then
274381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes * forgotten.
2759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *
2769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * States not listed here are not affected by util_blitter. */
2779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectstatic INLINE
2799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid util_blitter_save_blend(struct blitter_context *blitter,
2809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                             void *state)
2819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
2829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   blitter->saved_blend_state = state;
2839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
2849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectstatic INLINE
2869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid util_blitter_save_depth_stencil_alpha(struct blitter_context *blitter,
2879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                           void *state)
2889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
2899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   blitter->saved_dsa_state = state;
2909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
2919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectstatic INLINE
2939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid util_blitter_save_vertex_elements(struct blitter_context *blitter,
2949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                       void *state)
2959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
2969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   blitter->saved_velem_state = state;
2979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
2989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectstatic INLINE
3009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid util_blitter_save_stencil_ref(struct blitter_context *blitter,
3019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                   const struct pipe_stencil_ref *state)
3029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
3039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   blitter->saved_stencil_ref = *state;
3049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
3059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectstatic INLINE
3079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid util_blitter_save_rasterizer(struct blitter_context *blitter,
3089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                  void *state)
3099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
3109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   blitter->saved_rs_state = state;
3119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
3129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectstatic INLINE
3149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid util_blitter_save_fragment_shader(struct blitter_context *blitter,
3159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                       void *fs)
3169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
3179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   blitter->saved_fs = fs;
3189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
3199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectstatic INLINE
3219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid util_blitter_save_vertex_shader(struct blitter_context *blitter,
3229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                     void *vs)
3239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
3249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   blitter->saved_vs = vs;
325}
326
327static INLINE
328void util_blitter_save_geometry_shader(struct blitter_context *blitter,
329                                       void *gs)
330{
331   blitter->saved_gs = gs;
332}
333
334static INLINE
335void util_blitter_save_framebuffer(struct blitter_context *blitter,
336                                   const struct pipe_framebuffer_state *state)
337{
338   blitter->saved_fb_state.nr_cbufs = 0; /* It's ~0 now, meaning it's unsaved. */
339   util_copy_framebuffer_state(&blitter->saved_fb_state, state);
340}
341
342static INLINE
343void util_blitter_save_viewport(struct blitter_context *blitter,
344                                struct pipe_viewport_state *state)
345{
346   blitter->saved_viewport = *state;
347}
348
349static INLINE
350void util_blitter_save_clip(struct blitter_context *blitter,
351                            struct pipe_clip_state *state)
352{
353   blitter->saved_clip = *state;
354}
355
356static INLINE
357void util_blitter_save_fragment_sampler_states(
358                  struct blitter_context *blitter,
359                  int num_sampler_states,
360                  void **sampler_states)
361{
362   assert(num_sampler_states <= Elements(blitter->saved_sampler_states));
363
364   blitter->saved_num_sampler_states = num_sampler_states;
365   memcpy(blitter->saved_sampler_states, sampler_states,
366          num_sampler_states * sizeof(void *));
367}
368
369static INLINE void
370util_blitter_save_fragment_sampler_views(struct blitter_context *blitter,
371                                         int num_views,
372                                         struct pipe_sampler_view **views)
373{
374   unsigned i;
375   assert(num_views <= Elements(blitter->saved_sampler_views));
376
377   blitter->saved_num_sampler_views = num_views;
378   for (i = 0; i < num_views; i++)
379      pipe_sampler_view_reference(&blitter->saved_sampler_views[i],
380                                  views[i]);
381}
382
383static INLINE void
384util_blitter_save_vertex_buffers(struct blitter_context *blitter,
385                                 int num_vertex_buffers,
386                                 struct pipe_vertex_buffer *vertex_buffers)
387{
388   assert(num_vertex_buffers <= Elements(blitter->saved_vertex_buffers));
389
390   blitter->saved_num_vertex_buffers = 0;
391   util_copy_vertex_buffers(blitter->saved_vertex_buffers,
392                            (unsigned*)&blitter->saved_num_vertex_buffers,
393                            vertex_buffers,
394                            num_vertex_buffers);
395}
396
397static INLINE void
398util_blitter_save_so_targets(struct blitter_context *blitter,
399                             int num_targets,
400                             struct pipe_stream_output_target **targets)
401{
402   unsigned i;
403   assert(num_targets <= Elements(blitter->saved_so_targets));
404
405   blitter->saved_num_so_targets = num_targets;
406   for (i = 0; i < num_targets; i++)
407      pipe_so_target_reference(&blitter->saved_so_targets[i],
408                               targets[i]);
409}
410
411#ifdef __cplusplus
412}
413#endif
414
415#endif
416