u_blitter.c revision 7864933acd81892be0692555ae6d37d4293adb2a
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/**
2855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * @file
29363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák * Blitter utility to facilitate acceleration of the clear, clear_render_target,
30363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák * clear_depth_stencil, and resource_copy_region functions.
3155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák *
3255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * @author Marek Olšák
3355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák */
3455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "pipe/p_context.h"
3655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "pipe/p_defines.h"
3728486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h"
3855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "pipe/p_shader_tokens.h"
3955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "pipe/p_state.h"
4055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
41f874da422b1811c4cb5f700f424180793ea66d6fCorbin Simpson#include "util/u_format.h"
4255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_memory.h"
4355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_math.h"
4455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_blitter.h"
4555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_draw_quad.h"
46f6106566081978f663cf08e54bb8908cb58a5316Michal Krol#include "util/u_sampler.h"
4755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_simple_shaders.h"
488b0c217f2bc123bffd25cc4977d6abb1b3fa8186Brian Paul#include "util/u_surface.h"
4955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_texture.h"
50900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák#include "util/u_upload_mgr.h"
5155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
52a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák#define INVALID_PTR ((void*)~0)
53a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák
5455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context_priv
5555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
569b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct blitter_context base;
5755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
58900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák   struct u_upload_mgr *upload;
5955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
6055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   float vertices[4][2][4];   /**< {pos, color} or {pos, texcoord} */
6155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
6285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Templates for various state objects. */
6385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
6455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* Constant state objects. */
6555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* Vertex shaders. */
665d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   void *vs; /**< Vertex shader which passes {pos, generic} to the output.*/
6736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   void *vs_pos_only; /**< Vertex shader which passes pos to the output.*/
6855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
6955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* Fragment shaders. */
70677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   /* The shader at index i outputs color to color buffers 0,1,...,i-1. */
71677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   void *fs_col[PIPE_MAX_COLOR_BUFS+1];
724e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie   void *fs_col_int[PIPE_MAX_COLOR_BUFS+1];
73ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
74ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   /* FS which outputs a color from a texture,
75ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák      where the index is PIPE_TEXTURE_* to be sampled. */
76ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   void *fs_texfetch_col[PIPE_MAX_TEXTURE_TYPES];
77ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
78ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   /* FS which outputs a depth from a texture,
79ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák      where the index is PIPE_TEXTURE_* to be sampled. */
80ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   void *fs_texfetch_depth[PIPE_MAX_TEXTURE_TYPES];
8155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
8255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* Blend state. */
8355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *blend_write_color;   /**< blend state with writemask of RGBA */
8455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *blend_keep_color;    /**< blend state with writemask of 0 */
8555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
8655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* Depth stencil alpha state. */
871a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   void *dsa_write_depth_stencil;
8855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *dsa_write_depth_keep_stencil;
8955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *dsa_keep_depth_stencil;
90a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   void *dsa_keep_depth_write_stencil;
9155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
9236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   /* Vertex elements states. */
93ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   void *velem_state;
944e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie   void *velem_uint_state;
954e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie   void *velem_sint_state;
9636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   void *velem_state_readbuf;
97ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger
9837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   /* Sampler state. */
9937b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   void *sampler_state;
100ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
101ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   /* Rasterizer state. */
102ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   void *rs_state;
10336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   void *rs_discard_state;
104f6106566081978f663cf08e54bb8908cb58a5316Michal Krol
105932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   /* Viewport state. */
106932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   struct pipe_viewport_state viewport;
107932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
1083bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   /* Destination surface dimensions. */
1093bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   unsigned dst_width;
1103bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   unsigned dst_height;
1114c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák
1124c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák   boolean has_geometry_shader;
113dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie   boolean vertex_has_integers;
114b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák   boolean has_stream_out;
11555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák};
11655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
1179be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter,
1189be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   unsigned x, unsigned y,
1199be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   unsigned width, unsigned height,
1209be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   float depth,
1219be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   enum blitter_attrib_type type,
1226dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                                   const union pipe_color_union *attrib);
1239be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
1249be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
12555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context *util_blitter_create(struct pipe_context *pipe)
12655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
12755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx;
1280c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   struct pipe_blend_state blend;
1290c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   struct pipe_depth_stencil_alpha_state dsa;
1300c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   struct pipe_rasterizer_state rs_state;
13137b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   struct pipe_sampler_state sampler_state;
132ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   struct pipe_vertex_element velem[2];
13385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   unsigned i;
13455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
13555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx = CALLOC_STRUCT(blitter_context_priv);
13655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   if (!ctx)
13755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      return NULL;
13855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
1399b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.pipe = pipe;
1409be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   ctx->base.draw_rectangle = blitter_draw_rectangle;
14155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
14255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* init state objects for them to be considered invalid */
1439b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_blend_state = INVALID_PTR;
1449b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_dsa_state = INVALID_PTR;
1459b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_rs_state = INVALID_PTR;
1469b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_fs = INVALID_PTR;
1479b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_vs = INVALID_PTR;
1484c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák   ctx->base.saved_gs = INVALID_PTR;
1499b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_velem_state = INVALID_PTR;
1509b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_fb_state.nr_cbufs = ~0;
1519b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_num_sampler_views = ~0;
1529b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_num_sampler_states = ~0;
1539b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_num_vertex_buffers = ~0;
154b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák   ctx->base.saved_num_so_targets = ~0;
15555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
1564c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák   ctx->has_geometry_shader =
1574c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák      pipe->screen->get_shader_param(pipe->screen, PIPE_SHADER_GEOMETRY,
1584c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák                                     PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0;
159dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie   ctx->vertex_has_integers =
1600f55f133f1e5b72e463441d2d388a1ec4deac1daMarek Olšák      pipe->screen->get_shader_param(pipe->screen, PIPE_SHADER_VERTEX,
161dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie                                     PIPE_SHADER_CAP_INTEGERS);
162b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák   ctx->has_stream_out =
163b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák      pipe->screen->get_param(pipe->screen,
164b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák                              PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS) != 0;
1654c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák
16655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* blend state objects */
1670c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   memset(&blend, 0, sizeof(blend));
16855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->blend_keep_color = pipe->create_blend_state(pipe, &blend);
16955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
170eba1e2a44718bea398e49d496a78ee002c9922b8Roland Scheidegger   blend.rt[0].colormask = PIPE_MASK_RGBA;
17155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->blend_write_color = pipe->create_blend_state(pipe, &blend);
17255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
17355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* depth stencil alpha state objects */
1740c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   memset(&dsa, 0, sizeof(dsa));
17555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->dsa_keep_depth_stencil =
1761a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
17755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
178f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   dsa.depth.enabled = 1;
179f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   dsa.depth.writemask = 1;
180f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   dsa.depth.func = PIPE_FUNC_ALWAYS;
18155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->dsa_write_depth_keep_stencil =
1821a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
1831a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger
1841a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].enabled = 1;
1851a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].func = PIPE_FUNC_ALWAYS;
1861a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE;
1871a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE;
1881a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE;
1891a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].valuemask = 0xff;
1901a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].writemask = 0xff;
1911a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   ctx->dsa_write_depth_stencil =
1921a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
193a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
194a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   dsa.depth.enabled = 0;
195a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   dsa.depth.writemask = 0;
196a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   ctx->dsa_keep_depth_write_stencil =
197a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
19855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
19955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* sampler state */
20037b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   memset(&sampler_state, 0, sizeof(sampler_state));
20137b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   sampler_state.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
20237b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   sampler_state.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
20337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   sampler_state.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
20437b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   sampler_state.normalized_coords = 1;
20537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   ctx->sampler_state = pipe->create_sampler_state(pipe, &sampler_state);
20655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
20755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* rasterizer state */
20855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   memset(&rs_state, 0, sizeof(rs_state));
2090bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell   rs_state.cull_face = PIPE_FACE_NONE;
21055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   rs_state.gl_rasterization_rules = 1;
2111c75edf3e8ccc97f5f91f42f99c1f8db30b25fc4Corbin Simpson   rs_state.flatshade = 1;
212dc4c821f0817a3db716f965692fb701079f66340Marek Olšák   rs_state.depth_clip = 1;
21355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->rs_state = pipe->create_rasterizer_state(pipe, &rs_state);
21455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
21536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   if (ctx->has_stream_out) {
21636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák      rs_state.rasterizer_discard = 1;
21736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák      ctx->rs_discard_state = pipe->create_rasterizer_state(pipe, &rs_state);
21836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   }
21936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák
22036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   /* vertex elements states */
221ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   memset(&velem[0], 0, sizeof(velem[0]) * 2);
222ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   for (i = 0; i < 2; i++) {
223ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].src_offset = i * 4 * sizeof(float);
224ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
225ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   }
226ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   ctx->velem_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]);
227ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger
228dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie   if (ctx->vertex_has_integers) {
229dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie      memset(&velem[0], 0, sizeof(velem[0]) * 2);
2309e66b25880febecb529582c6ead920637d73f51eDave Airlie      velem[0].src_offset = 0;
2319e66b25880febecb529582c6ead920637d73f51eDave Airlie      velem[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
2329e66b25880febecb529582c6ead920637d73f51eDave Airlie      velem[1].src_offset = 4 * sizeof(float);
2339e66b25880febecb529582c6ead920637d73f51eDave Airlie      velem[1].src_format = PIPE_FORMAT_R32G32B32A32_SINT;
234dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie      ctx->velem_sint_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]);
235dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie
236dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie      memset(&velem[0], 0, sizeof(velem[0]) * 2);
2379e66b25880febecb529582c6ead920637d73f51eDave Airlie      velem[0].src_offset = 0;
2389e66b25880febecb529582c6ead920637d73f51eDave Airlie      velem[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
2399e66b25880febecb529582c6ead920637d73f51eDave Airlie      velem[1].src_offset = 4 * sizeof(float);
2409e66b25880febecb529582c6ead920637d73f51eDave Airlie      velem[1].src_format = PIPE_FORMAT_R32G32B32A32_UINT;
241dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie      ctx->velem_uint_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]);
2424e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie   }
243dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie
24436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   if (ctx->has_stream_out) {
245a0a9e56cfed1ab81c1068cffbfd9299f77c7e187Marek Olšák      velem[0].src_format = PIPE_FORMAT_R32_UINT;
24636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák      ctx->velem_state_readbuf = pipe->create_vertex_elements_state(pipe, 1, &velem[0]);
24736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   }
24836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák
24985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* fragment shaders are created on-demand */
25085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
25136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   /* vertex shaders */
25255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   {
25355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      const uint semantic_names[] = { TGSI_SEMANTIC_POSITION,
25455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                      TGSI_SEMANTIC_GENERIC };
25555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      const uint semantic_indices[] = { 0, 0 };
2565d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák      ctx->vs =
25755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         util_make_vertex_passthrough_shader(pipe, 2, semantic_names,
25855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                             semantic_indices);
25955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
26036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   if (ctx->has_stream_out) {
26136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák      struct pipe_stream_output_info so;
26236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák      const uint semantic_names[] = { TGSI_SEMANTIC_POSITION };
26336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák      const uint semantic_indices[] = { 0 };
26436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák
26536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák      memset(&so, 0, sizeof(so));
26636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák      so.num_outputs = 1;
267a0a9e56cfed1ab81c1068cffbfd9299f77c7e187Marek Olšák      so.output[0].num_components = 1;
268a0a9e56cfed1ab81c1068cffbfd9299f77c7e187Marek Olšák      so.stride[0] = 1;
26936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák
27036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák      ctx->vs_pos_only =
27136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák         util_make_vertex_passthrough_shader_with_so(pipe, 1, semantic_names,
27236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák                                                     semantic_indices, &so);
27336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   }
27455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
27555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* set invariant vertex coordinates */
27655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
27755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][0][3] = 1; /*v.w*/
27855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
2797864933acd81892be0692555ae6d37d4293adb2aMarek Olšák   ctx->upload = u_upload_create(pipe, 65536, 4, PIPE_BIND_VERTEX_BUFFER);
28055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
2819b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   return &ctx->base;
28255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
28355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
28455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_destroy(struct blitter_context *blitter)
28555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
28655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
2879b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = blitter->pipe;
28855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
28955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
29055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_blend_state(pipe, ctx->blend_write_color);
29155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_blend_state(pipe, ctx->blend_keep_color);
29255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
29355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_depth_stencil_alpha_state(pipe,
29455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                          ctx->dsa_write_depth_keep_stencil);
2951a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil);
296a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil);
2976a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson
29855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_rasterizer_state(pipe, ctx->rs_state);
29936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   if (ctx->rs_discard_state)
30036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák      pipe->delete_rasterizer_state(pipe, ctx->rs_discard_state);
3015d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->delete_vs_state(pipe, ctx->vs);
30236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   if (ctx->vs_pos_only)
30336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák      pipe->delete_vs_state(pipe, ctx->vs_pos_only);
304ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->delete_vertex_elements_state(pipe, ctx->velem_state);
305dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie   if (ctx->vertex_has_integers) {
306dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie      pipe->delete_vertex_elements_state(pipe, ctx->velem_sint_state);
307dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie      pipe->delete_vertex_elements_state(pipe, ctx->velem_uint_state);
308dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie   }
30936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   if (ctx->velem_state_readbuf)
31036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák      pipe->delete_vertex_elements_state(pipe, ctx->velem_state_readbuf);
31155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
312ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   for (i = 0; i < PIPE_MAX_TEXTURE_TYPES; i++) {
31385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->fs_texfetch_col[i])
31485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_fs_state(pipe, ctx->fs_texfetch_col[i]);
31585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->fs_texfetch_depth[i])
31685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_fs_state(pipe, ctx->fs_texfetch_depth[i]);
31755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
318ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
3194e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie   for (i = 0; i <= PIPE_MAX_COLOR_BUFS; i++) {
32085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->fs_col[i])
32185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_fs_state(pipe, ctx->fs_col[i]);
3224e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie      if (ctx->fs_col_int[i])
3234e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie         pipe->delete_fs_state(pipe, ctx->fs_col_int[i]);
3244e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie   }
32555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
32637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   pipe->delete_sampler_state(pipe, ctx->sampler_state);
327900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák   u_upload_destroy(ctx->upload);
32855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   FREE(ctx);
32955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
33055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
331c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_set_running_flag(struct blitter_context_priv *ctx)
33255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
333ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák   if (ctx->base.running) {
334c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák      _debug_printf("u_blitter:%i: Caught recursion. This is a driver bug.\n",
335c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák                    __LINE__);
3369a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák   }
337ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák   ctx->base.running = TRUE;
338c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák}
3399a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák
340c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_unset_running_flag(struct blitter_context_priv *ctx)
341c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{
342c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   if (!ctx->base.running) {
343c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák      _debug_printf("u_blitter:%i: Caught recursion. This is a driver bug.\n",
344c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák                    __LINE__);
345c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   }
346c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   ctx->base.running = FALSE;
347c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák}
348c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
349c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_check_saved_vertex_states(struct blitter_context_priv *ctx)
350c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{
3519e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul   assert(ctx->base.saved_num_vertex_buffers != ~0);
3529e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul   assert(ctx->base.saved_velem_state != INVALID_PTR);
3539e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul   assert(ctx->base.saved_vs != INVALID_PTR);
3549e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul   assert(!ctx->has_geometry_shader || ctx->base.saved_gs != INVALID_PTR);
3559e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul   assert(!ctx->has_stream_out || ctx->base.saved_num_so_targets != ~0);
3569e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul   assert(ctx->base.saved_rs_state != INVALID_PTR);
35755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
35855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
359c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_restore_vertex_states(struct blitter_context_priv *ctx)
36055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
3619b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
3628f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák   unsigned i;
36355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
364c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* Vertex buffers. */
365c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   pipe->set_vertex_buffers(pipe,
366c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák                            ctx->base.saved_num_vertex_buffers,
367c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák                            ctx->base.saved_vertex_buffers);
368c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
369c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   for (i = 0; i < ctx->base.saved_num_vertex_buffers; i++) {
370c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák      if (ctx->base.saved_vertex_buffers[i].buffer) {
371c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák         pipe_resource_reference(&ctx->base.saved_vertex_buffers[i].buffer,
372c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák                                 NULL);
373c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák      }
374c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   }
375c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   ctx->base.saved_num_vertex_buffers = ~0;
376c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
377c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* Vertex elements. */
3789b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->bind_vertex_elements_state(pipe, ctx->base.saved_velem_state);
379c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   ctx->base.saved_velem_state = INVALID_PTR;
38055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
381c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* Vertex shader. */
382c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   pipe->bind_vs_state(pipe, ctx->base.saved_vs);
3839b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_vs = INVALID_PTR;
38455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3854c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák   /* Geometry shader. */
3864c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák   if (ctx->has_geometry_shader) {
3874c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák      pipe->bind_gs_state(pipe, ctx->base.saved_gs);
3884c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák      ctx->base.saved_gs = INVALID_PTR;
3894c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák   }
390363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák
391b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák   /* Stream outputs. */
392b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák   if (ctx->has_stream_out) {
393b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák      pipe->set_stream_output_targets(pipe,
394b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák                                      ctx->base.saved_num_so_targets,
395b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák                                      ctx->base.saved_so_targets, ~0);
396b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák
397b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák      for (i = 0; i < ctx->base.saved_num_so_targets; i++)
398b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák         pipe_so_target_reference(&ctx->base.saved_so_targets[i], NULL);
399b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák
400b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák      ctx->base.saved_num_so_targets = ~0;
401b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák   }
402b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák
403c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* Rasterizer. */
404c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   pipe->bind_rasterizer_state(pipe, ctx->base.saved_rs_state);
405c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   ctx->base.saved_rs_state = INVALID_PTR;
406c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák}
407c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
408c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_check_saved_fragment_states(struct blitter_context_priv *ctx)
409c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{
4109e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul   assert(ctx->base.saved_fs != INVALID_PTR);
4119e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul   assert(ctx->base.saved_dsa_state != INVALID_PTR);
4129e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul   assert(ctx->base.saved_blend_state != INVALID_PTR);
413c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák}
414c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
415c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_restore_fragment_states(struct blitter_context_priv *ctx)
416c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{
417c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
418c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
419c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* Fragment shader. */
420c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   pipe->bind_fs_state(pipe, ctx->base.saved_fs);
421c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   ctx->base.saved_fs = INVALID_PTR;
422c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
423c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* Depth, stencil, alpha. */
424c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   pipe->bind_depth_stencil_alpha_state(pipe, ctx->base.saved_dsa_state);
425c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   ctx->base.saved_dsa_state = INVALID_PTR;
426c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
427c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* Blend state. */
428c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   pipe->bind_blend_state(pipe, ctx->base.saved_blend_state);
429c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   ctx->base.saved_blend_state = INVALID_PTR;
430c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
431c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* Miscellaneous states. */
432c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* XXX check whether these are saved and whether they need to be restored
433c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák    * (depending on the operation) */
4349b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->set_stencil_ref(pipe, &ctx->base.saved_stencil_ref);
4359b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->set_viewport_state(pipe, &ctx->base.saved_viewport);
436c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák}
437932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
438c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_check_saved_fb_state(struct blitter_context_priv *ctx)
439c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{
440c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   assert(ctx->base.saved_fb_state.nr_cbufs != ~0);
441c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák}
44255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
443c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_restore_fb_state(struct blitter_context_priv *ctx)
444c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{
445c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
446c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
447c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   pipe->set_framebuffer_state(pipe, &ctx->base.saved_fb_state);
448c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   util_unreference_framebuffer_state(&ctx->base.saved_fb_state);
449c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák}
45055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
451c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_check_saved_textures(struct blitter_context_priv *ctx)
452c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{
4539e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul   assert(ctx->base.saved_num_sampler_states != ~0);
4549e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul   assert(ctx->base.saved_num_sampler_views != ~0);
455c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák}
4560b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák
457c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_restore_textures(struct blitter_context_priv *ctx)
458c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{
459c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
460c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   unsigned i;
4610b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák
462c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* Fragment sampler states. */
463c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   pipe->bind_fragment_sampler_states(pipe,
464c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák                                      ctx->base.saved_num_sampler_states,
465c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák                                      ctx->base.saved_sampler_states);
466c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   ctx->base.saved_num_sampler_states = ~0;
46764aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri
468c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* Fragment sampler views. */
469c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   pipe->set_fragment_sampler_views(pipe,
470c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák                                    ctx->base.saved_num_sampler_views,
471c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák                                    ctx->base.saved_sampler_views);
4728f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák
473c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   for (i = 0; i < ctx->base.saved_num_sampler_views; i++)
474c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák      pipe_sampler_view_reference(&ctx->base.saved_sampler_views[i], NULL);
4759a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák
476c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   ctx->base.saved_num_sampler_views = ~0;
47755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
47855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
47955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_rectangle(struct blitter_context_priv *ctx,
48055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  unsigned x1, unsigned y1,
48155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  unsigned x2, unsigned y2,
48255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  float depth)
48355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
48455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
48555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
48655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* set vertex positions */
4873bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[0][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v0.x*/
4883bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[0][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v0.y*/
48955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
4903bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[1][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v1.x*/
4913bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[1][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v1.y*/
49255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
4933bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[2][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v2.x*/
4943bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[2][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v2.y*/
49555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
4963bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[3][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v3.x*/
4973bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[3][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v3.y*/
49855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
49955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
50055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][0][2] = depth; /*z*/
501932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
502932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   /* viewport */
5033bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->viewport.scale[0] = 0.5f * ctx->dst_width;
5043bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->viewport.scale[1] = 0.5f * ctx->dst_height;
505ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák   ctx->viewport.scale[2] = 1.0f;
506932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->viewport.scale[3] = 1.0f;
5073bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->viewport.translate[0] = 0.5f * ctx->dst_width;
5083bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->viewport.translate[1] = 0.5f * ctx->dst_height;
509ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák   ctx->viewport.translate[2] = 0.0f;
510932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->viewport.translate[3] = 0.0f;
5119b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.pipe->set_viewport_state(ctx->base.pipe, &ctx->viewport);
51255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
51355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
51455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_clear_color(struct blitter_context_priv *ctx,
5156dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                                    const union pipe_color_union *color)
51655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
51755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
51855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
5196dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie   if (color) {
52016d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      for (i = 0; i < 4; i++) {
5214e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie         uint32_t *uiverts = (uint32_t *)ctx->vertices[i][1];
5224e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie         uiverts[0] = color->ui[0];
5234e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie         uiverts[1] = color->ui[1];
5244e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie         uiverts[2] = color->ui[2];
5254e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie         uiverts[3] = color->ui[3];
52616d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      }
527fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák   } else {
52816d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      for (i = 0; i < 4; i++) {
52916d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][0] = 0;
53016d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][1] = 0;
53116d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][2] = 0;
53216d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][3] = 0;
53316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      }
53455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
53555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
53655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
53737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšákstatic void get_texcoords(struct pipe_sampler_view *src,
53889ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák                          unsigned src_width0, unsigned src_height0,
5394c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          unsigned x1, unsigned y1,
5404c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          unsigned x2, unsigned y2,
54137b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák                          float out[4])
542749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{
54337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   struct pipe_resource *tex = src->texture;
54437b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   unsigned level = src->u.tex.first_level;
54537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   boolean normalized = tex->target != PIPE_TEXTURE_RECT;
54637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák
54737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   if (normalized) {
54889ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák      out[0] = x1 / (float)u_minify(src_width0,  level);
54989ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák      out[1] = y1 / (float)u_minify(src_height0, level);
55089ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák      out[2] = x2 / (float)u_minify(src_width0,  level);
55189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák      out[3] = y2 / (float)u_minify(src_height0, level);
55237b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   } else {
553d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      out[0] = x1;
554d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      out[1] = y1;
555d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      out[2] = x2;
556d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      out[3] = y2;
557d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   }
558749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák}
559749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák
560749e24521a31178d2b647aa2954c3eecd597b799Marek Olšákstatic void set_texcoords_in_vertices(const float coord[4],
561749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák                                      float *out, unsigned stride)
562749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{
563749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = coord[0]; /*t0.s*/
564749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = coord[1]; /*t0.t*/
565749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out += stride;
566749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = coord[2]; /*t1.s*/
567749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = coord[1]; /*t1.t*/
568749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out += stride;
569749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = coord[2]; /*t2.s*/
570749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = coord[3]; /*t2.t*/
571749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out += stride;
572749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = coord[0]; /*t3.s*/
573749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = coord[3]; /*t3.t*/
574749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák}
575749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák
57689ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšákstatic void blitter_set_texcoords(struct blitter_context_priv *ctx,
57789ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák                                  struct pipe_sampler_view *src,
57889ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák                                  unsigned src_width0, unsigned src_height0,
57989ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák                                  unsigned layer,
58089ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák                                  unsigned x1, unsigned y1,
58189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák                                  unsigned x2, unsigned y2)
58255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
583749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   unsigned i;
584749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   float coord[4];
58589ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák   float face_coord[4][2];
58655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
58789ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák   get_texcoords(src, src_width0, src_height0, x1, y1, x2, y2, coord);
58855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
58989ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák   if (src->texture->target == PIPE_TEXTURE_CUBE) {
59089ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák      set_texcoords_in_vertices(coord, &face_coord[0][0], 2);
59189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák      util_map_texcoords2d_onto_cubemap(layer,
59289ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák                                        /* pointer, stride in floats */
59389ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák                                        &face_coord[0][0], 2,
59489ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák                                        &ctx->vertices[0][1][0], 8);
59589ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák   } else {
59689ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák      set_texcoords_in_vertices(coord, &ctx->vertices[0][1][0], 8);
59755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
598274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák
59989ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák   /* Set the layer. */
60089ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák   switch (src->texture->target) {
60189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák   case PIPE_TEXTURE_3D:
60289ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák      {
60389ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák         float r = layer / (float)u_minify(src->texture->depth0,
60489ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák                                           src->u.tex.first_level);
60589ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák         for (i = 0; i < 4; i++)
60689ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák            ctx->vertices[i][1][2] = r; /*r*/
60789ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák      }
60889ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák      break;
609d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul
61089ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák   case PIPE_TEXTURE_1D_ARRAY:
61189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák      for (i = 0; i < 4; i++)
61289ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák         ctx->vertices[i][1][1] = layer; /*t*/
61389ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák      break;
61455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
61589ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák   case PIPE_TEXTURE_2D_ARRAY:
61689ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák      for (i = 0; i < 4; i++)
61789ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák         ctx->vertices[i][1][2] = layer; /*r*/
61889ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák      break;
61955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
62089ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák   default:;
62189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák   }
62255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
62355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
6243bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákstatic void blitter_set_dst_dimensions(struct blitter_context_priv *ctx,
6253bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák                                       unsigned width, unsigned height)
6263bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák{
6273bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->dst_width = width;
6283bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->dst_height = height;
6293bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák}
6303bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák
63185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
6324e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlievoid *blitter_get_fs_col(struct blitter_context_priv *ctx, unsigned num_cbufs,
6334e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie                         boolean int_format)
63485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
6359b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
63685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
63785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(num_cbufs <= PIPE_MAX_COLOR_BUFS);
63885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
6394e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie   if (int_format) {
6404e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie      if (!ctx->fs_col_int[num_cbufs])
6414e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie         ctx->fs_col_int[num_cbufs] =
6424e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie            util_make_fragment_cloneinput_shader(pipe, num_cbufs,
6434e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie                                                 TGSI_SEMANTIC_GENERIC,
6444e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie                                                 TGSI_INTERPOLATE_CONSTANT);
6454e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie      return ctx->fs_col_int[num_cbufs];
6464e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie   } else {
6474e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie      if (!ctx->fs_col[num_cbufs])
6484e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie         ctx->fs_col[num_cbufs] =
6494e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie            util_make_fragment_cloneinput_shader(pipe, num_cbufs,
6504e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie                                                 TGSI_SEMANTIC_GENERIC,
6514e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie                                                 TGSI_INTERPOLATE_LINEAR);
6524e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie      return ctx->fs_col[num_cbufs];
6534e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie   }
65485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
65585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
656d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul/** Convert PIPE_TEXTURE_x to TGSI_TEXTURE_x */
657d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paulstatic unsigned
6583bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákpipe_tex_to_tgsi_tex(enum pipe_texture_target pipe_tex_target)
659d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul{
660d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   switch (pipe_tex_target) {
661d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_1D:
662d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_1D;
663d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_2D:
664d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_2D;
665ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri   case PIPE_TEXTURE_RECT:
666cbe367227959a32ff20e146106162a81d2be02c3Luca Barbieri      return TGSI_TEXTURE_RECT;
667d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_3D:
668d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_3D;
669d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_CUBE:
670d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_CUBE;
671274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák   case PIPE_TEXTURE_1D_ARRAY:
672274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák      return TGSI_TEXTURE_1D_ARRAY;
673274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák   case PIPE_TEXTURE_2D_ARRAY:
674274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák      return TGSI_TEXTURE_2D_ARRAY;
675d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   default:
676d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      assert(0 && "unexpected texture target");
677d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_UNKNOWN;
678d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   }
679d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul}
680d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
681d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
68285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
68385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_col(struct blitter_context_priv *ctx,
68485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                  unsigned tex_target)
68585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
6869b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
68785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
68885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(tex_target < PIPE_MAX_TEXTURE_TYPES);
68985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
69085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Create the fragment shader on-demand. */
69185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   if (!ctx->fs_texfetch_col[tex_target]) {
692d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target);
693d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
694d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      ctx->fs_texfetch_col[tex_target] =
695d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul        util_make_fragment_tex_shader(pipe, tgsi_tex, TGSI_INTERPOLATE_LINEAR);
69685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   }
69785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
69885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   return ctx->fs_texfetch_col[tex_target];
69985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
70085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
70185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
70285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_depth(struct blitter_context_priv *ctx,
70385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                    unsigned tex_target)
70485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
7059b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
70685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
70785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(tex_target < PIPE_MAX_TEXTURE_TYPES);
70885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
70985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Create the fragment shader on-demand. */
71085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   if (!ctx->fs_texfetch_depth[tex_target]) {
711d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target);
712d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
713d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      ctx->fs_texfetch_depth[tex_target] =
714d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul         util_make_fragment_tex_shader_writedepth(pipe, tgsi_tex,
715d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul                                                  TGSI_INTERPOLATE_LINEAR);
71685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   }
71785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
71885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   return ctx->fs_texfetch_depth[tex_target];
71985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
72085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
721900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšákstatic void blitter_draw(struct blitter_context_priv *ctx,
722900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák                         unsigned x1, unsigned y1,
723900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák                         unsigned x2, unsigned y2,
724900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák                         float depth)
725900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák{
726900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák   struct pipe_resource *buf = NULL;
727900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák   unsigned offset = 0;
728900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák
729900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák   blitter_set_rectangle(ctx, x1, y1, x2, y2, depth);
730900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák
731900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák   u_upload_data(ctx->upload, 0, sizeof(ctx->vertices), ctx->vertices,
732900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák                 &offset, &buf);
733900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák   u_upload_unmap(ctx->upload);
734900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák   util_draw_vertex_buffer(ctx->base.pipe, NULL, buf, offset,
735900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák                           PIPE_PRIM_TRIANGLE_FAN, 4, 2);
736900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák}
737900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák
7389be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter,
7399be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   unsigned x1, unsigned y1,
7409be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   unsigned x2, unsigned y2,
7419be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   float depth,
7429be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   enum blitter_attrib_type type,
7436dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                                   const union pipe_color_union *attrib)
7449be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák{
7459be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
7469be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
7479be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   switch (type) {
7489be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      case UTIL_BLITTER_ATTRIB_COLOR:
7499be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         blitter_set_clear_color(ctx, attrib);
7509be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         break;
7519be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
7529be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      case UTIL_BLITTER_ATTRIB_TEXCOORD:
7536dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie         set_texcoords_in_vertices(attrib->f, &ctx->vertices[0][1][0], 8);
7549be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         break;
7559be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
7569be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      default:;
7579be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   }
7589be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
759900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák   blitter_draw(ctx, x1, y1, x2, y2, depth);
7609be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák}
7619be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
762db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákstatic void util_blitter_clear_custom(struct blitter_context *blitter,
763db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      unsigned width, unsigned height,
764db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      unsigned num_cbufs,
765db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      unsigned clear_buffers,
7664e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie                                      enum pipe_format cbuf_format,
7676dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                                      const union pipe_color_union *color,
768db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      double depth, unsigned stencil,
769db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      void *custom_blend, void *custom_dsa)
77055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
77155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
7729b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
7736a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson   struct pipe_stencil_ref sr = { { 0 } };
7744e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie   boolean int_format = util_format_is_pure_integer(cbuf_format);
775ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   assert(num_cbufs <= PIPE_MAX_COLOR_BUFS);
77655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
777c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_set_running_flag(ctx);
778c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_vertex_states(ctx);
779c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_fragment_states(ctx);
78055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
781c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* bind states */
782db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   if (custom_blend) {
783db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák      pipe->bind_blend_state(pipe, custom_blend);
784db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else if (clear_buffers & PIPE_CLEAR_COLOR) {
78555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_write_color);
786db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else {
78755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_keep_color);
788db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   }
78955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
790db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   if (custom_dsa) {
791db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe, custom_dsa);
792db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else if ((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) {
7931a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil);
794db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else if (clear_buffers & PIPE_CLEAR_DEPTH) {
795a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil);
796db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else if (clear_buffers & PIPE_CLEAR_STENCIL) {
797a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil);
798db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else {
79955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
800db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   }
801db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák
802db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   sr.ref_value[0] = stencil & 0xff;
803db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   pipe->set_stencil_ref(pipe, &sr);
80455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
80555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
8064e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie   if (util_format_is_pure_sint(cbuf_format)) {
8074e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie      pipe->bind_vertex_elements_state(pipe, ctx->velem_sint_state);
8084e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie   } else if (util_format_is_pure_uint(cbuf_format)) {
8094e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie      pipe->bind_vertex_elements_state(pipe, ctx->velem_uint_state);
8104e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie   } else {
8114e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie      pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
8124e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie   }
8134e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, num_cbufs, int_format));
8145d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
8154c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák   if (ctx->has_geometry_shader)
8164c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák      pipe->bind_gs_state(pipe, NULL);
81755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
8183bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   blitter_set_dst_dimensions(ctx, width, height);
8199be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter->draw_rectangle(blitter, 0, 0, width, height, depth,
8206dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                           UTIL_BLITTER_ATTRIB_COLOR, color);
821c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
822c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_vertex_states(ctx);
823c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_fragment_states(ctx);
824c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_unset_running_flag(ctx);
82555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
82655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
827db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid util_blitter_clear(struct blitter_context *blitter,
828db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                        unsigned width, unsigned height,
829db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                        unsigned num_cbufs,
830db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                        unsigned clear_buffers,
8314e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie                        enum pipe_format cbuf_format,
8326dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                        const union pipe_color_union *color,
833db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                        double depth, unsigned stencil)
834db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák{
835db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   util_blitter_clear_custom(blitter, width, height, num_cbufs,
8364e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie                             clear_buffers, cbuf_format, color, depth, stencil,
837db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                             NULL, NULL);
838db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák}
839db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák
840db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid util_blitter_clear_depth_custom(struct blitter_context *blitter,
841db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                     unsigned width, unsigned height,
842db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                     double depth, void *custom_dsa)
843db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák{
8446dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie    static const union pipe_color_union color;
845db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák    util_blitter_clear_custom(blitter, width, height, 0,
8464e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie                              0, PIPE_FORMAT_NONE, &color, depth, 0, NULL, custom_dsa);
847db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák}
848db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák
849876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákstatic
850876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákboolean is_overlap(unsigned sx1, unsigned sx2, unsigned sy1, unsigned sy2,
851876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                   unsigned dx1, unsigned dx2, unsigned dy1, unsigned dy2)
852deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie{
853876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   return sx1 < dx2 && sx2 > dx1 && sy1 < dy2 && sy2 > dy1;
854deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie}
855deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie
856ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšákvoid util_blitter_default_dst_texture(struct pipe_surface *dst_templ,
857ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák                                      struct pipe_resource *dst,
858ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák                                      unsigned dstlevel,
859ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák                                      unsigned dstz,
860ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák                                      const struct pipe_box *srcbox)
861ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák{
862ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák    memset(dst_templ, 0, sizeof(*dst_templ));
863ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák    dst_templ->format = dst->format;
864ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák    if (util_format_is_depth_or_stencil(dst->format)) {
865ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák	dst_templ->usage = PIPE_BIND_DEPTH_STENCIL;
866ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák    } else {
867ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák	dst_templ->usage = PIPE_BIND_RENDER_TARGET;
868ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák    }
869ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák    dst_templ->format = util_format_linear(dst->format);
870ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák    dst_templ->u.tex.level = dstlevel;
871ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák    dst_templ->u.tex.first_layer = dstz;
872ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák    dst_templ->u.tex.last_layer = dstz + srcbox->depth - 1;
873ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák}
874ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák
875ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšákvoid util_blitter_default_src_texture(struct pipe_sampler_view *src_templ,
876ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák                                      struct pipe_resource *src,
877ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák                                      unsigned srclevel)
878ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák{
879ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák    memset(src_templ, 0, sizeof(*src_templ));
880ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák    src_templ->format = util_format_linear(src->format);
881ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák    src_templ->u.tex.first_level = srclevel;
882ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák    src_templ->u.tex.last_level = srclevel;
883ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák    src_templ->u.tex.first_layer = 0;
884ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák    src_templ->u.tex.last_layer =
885ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák        src->target == PIPE_TEXTURE_3D ? src->depth0 - 1
886ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák                                       : src->array_size - 1;
887ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák    src_templ->swizzle_r = PIPE_SWIZZLE_RED;
888ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák    src_templ->swizzle_g = PIPE_SWIZZLE_GREEN;
889ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák    src_templ->swizzle_b = PIPE_SWIZZLE_BLUE;
890ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák    src_templ->swizzle_a = PIPE_SWIZZLE_ALPHA;
891ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák}
892ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák
893233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšákvoid util_blitter_copy_texture(struct blitter_context *blitter,
894233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák                               struct pipe_resource *dst,
895233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák                               unsigned dstlevel,
896233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák                               unsigned dstx, unsigned dsty, unsigned dstz,
897233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák                               struct pipe_resource *src,
898233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák                               unsigned srclevel,
899233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák                               const struct pipe_box *srcbox,
900233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák                               boolean ignore_stencil)
90155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
90255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
9039b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
904876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   struct pipe_screen *screen = pipe->screen;
905ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák   struct pipe_surface *dst_view, dst_templ;
906ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák   struct pipe_sampler_view src_templ, *src_view;
907876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   unsigned bind;
908876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   boolean is_stencil, is_depth;
909876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
910876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Give up if textures are not set. */
911876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   assert(dst && src);
912876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   if (!dst || !src)
913876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      return;
914876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
915876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   assert(src->target < PIPE_MAX_TEXTURE_TYPES);
916876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
917876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Is this a ZS format? */
918876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   is_depth = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 0) != 0;
919876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   is_stencil = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 1) != 0;
920876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
921876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   if (is_depth || is_stencil)
922876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      bind = PIPE_BIND_DEPTH_STENCIL;
923876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   else
924876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      bind = PIPE_BIND_RENDER_TARGET;
925876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
926876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Check if we can sample from and render to the surfaces. */
927876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* (assuming copying a stencil buffer is not possible) */
928cec2082ae515bc91e6b29084ba4b8deac28ef923Stéphane Marchesin   if ((!ignore_stencil && is_stencil) ||
929876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák       !screen->is_format_supported(screen, dst->format, dst->target,
930e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák                                    dst->nr_samples, bind) ||
931876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák       !screen->is_format_supported(screen, src->format, src->target,
932e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák                                    src->nr_samples, PIPE_BIND_SAMPLER_VIEW)) {
93337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák      blitter_set_running_flag(ctx);
9344c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      util_resource_copy_region(pipe, dst, dstlevel, dstx, dsty, dstz,
9354c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                src, srclevel, srcbox);
93637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák      blitter_unset_running_flag(ctx);
937876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      return;
938876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   }
939876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
94037b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   /* Initialize the surface. */
941ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák   util_blitter_default_dst_texture(&dst_templ, dst, dstlevel, dstz, srcbox);
942ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák   dst_view = pipe->create_surface(pipe, dst, &dst_templ);
94355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
94437b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   /* Initialize the sampler view. */
945ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák   util_blitter_default_src_texture(&src_templ, src, srclevel);
946ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák   src_view = pipe->create_sampler_view(pipe, src, &src_templ);
94737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák
94837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   /* Copy. */
949ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák   util_blitter_copy_texture_view(blitter, dst_view, dstx, dsty, src_view,
950ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák                                  srcbox, src->width0, src->height0);
95137b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák
952ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák   pipe_surface_reference(&dst_view, NULL);
953ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák   pipe_sampler_view_reference(&src_view, NULL);
95437b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák}
95537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák
95637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšákvoid util_blitter_copy_texture_view(struct blitter_context *blitter,
95737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák                                    struct pipe_surface *dst,
95837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák                                    unsigned dstx, unsigned dsty,
95937b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák                                    struct pipe_sampler_view *src,
96089ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák                                    const struct pipe_box *srcbox,
96189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák                                    unsigned src_width0, unsigned src_height0)
96237b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák{
96337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
96437b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
96537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   struct pipe_framebuffer_state fb_state;
96637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   enum pipe_texture_target src_target = src->texture->target;
96737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   unsigned width = srcbox->width;
96837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   unsigned height = srcbox->height;
96937b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák
97037b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   /* Sanity checks. */
97137b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   if (dst->texture == src->texture &&
97237b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák       dst->u.tex.level == src->u.tex.first_level) {
97337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák      assert(!is_overlap(srcbox->x, srcbox->x + width, srcbox->y, srcbox->y + height,
97437b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák                         dstx, dstx + width, dsty, dsty + height));
97537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   }
97637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   /* XXX should handle 3d regions */
97737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   assert(srcbox->depth == 1);
97837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák
979876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Check whether the states are properly saved. */
980c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_set_running_flag(ctx);
981c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_vertex_states(ctx);
982c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_fragment_states(ctx);
983c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_textures(ctx);
984c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_fb_state(ctx);
98555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
986876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Initialize framebuffer state. */
98737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   fb_state.width = dst->width;
98837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   fb_state.height = dst->height;
98955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
99037b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   if (util_format_is_depth_or_stencil(dst->format)) {
99155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_keep_color);
99255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe,
99355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                           ctx->dsa_write_depth_keep_stencil);
99485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      pipe->bind_fs_state(pipe,
99537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák            blitter_get_fs_texfetch_depth(ctx, src_target));
99655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
99755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      fb_state.nr_cbufs = 0;
99837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák      fb_state.zsbuf = dst;
99955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   } else {
100055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_write_color);
100155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
100285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      pipe->bind_fs_state(pipe,
100337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák            blitter_get_fs_texfetch_col(ctx, src_target));
100455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
100555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      fb_state.nr_cbufs = 1;
100637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák      fb_state.cbufs[0] = dst;
100755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      fb_state.zsbuf = 0;
100855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
100985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
1010876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Set rasterizer state, shaders, and textures. */
101155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
10125d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
10134c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák   if (ctx->has_geometry_shader)
10144c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák      pipe->bind_gs_state(pipe, NULL);
101537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   pipe->bind_fragment_sampler_states(pipe, 1, &ctx->sampler_state);
1016ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
101737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   pipe->set_fragment_sampler_views(pipe, 1, &src);
101855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->set_framebuffer_state(pipe, &fb_state);
101955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
102037b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   blitter_set_dst_dimensions(ctx, dst->width, dst->height);
10219be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
102237b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák   switch (src_target) {
10239be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      /* Draw the quad with the draw_rectangle callback. */
102455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_1D:
102555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_2D:
1026ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri      case PIPE_TEXTURE_RECT:
10279be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         {
10286dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie            /* Set texture coordinates. - use a pipe color union
102937b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák             * for interface purposes.
103037b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák             * XXX pipe_color_union is a wrong name since we use that to set
103137b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák             * texture coordinates too.
10326dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie             */
10336dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie            union pipe_color_union coord;
103489ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák            get_texcoords(src, src_width0, src_height0, srcbox->x, srcbox->y,
103537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák                          srcbox->x+width, srcbox->y+height, coord.f);
10369be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
10379be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák            /* Draw. */
10389be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák            blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0,
10396dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                                    UTIL_BLITTER_ATTRIB_TEXCOORD, &coord);
10409be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         }
104155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         break;
10429be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
10439be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      /* Draw the quad with the generic codepath. */
1044274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák      default:
10459be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         /* Set texture coordinates. */
104637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák         switch (src_target) {
1047274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák         case PIPE_TEXTURE_1D_ARRAY:
1048274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák         case PIPE_TEXTURE_2D_ARRAY:
1049274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák         case PIPE_TEXTURE_3D:
1050274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák         case PIPE_TEXTURE_CUBE:
105189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák            blitter_set_texcoords(ctx, src, src_width0, src_height0, srcbox->z,
105289ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák                                  srcbox->y, srcbox->x,
105389ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák                                  srcbox->x + width, srcbox->y + height);
1054274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák            break;
1055274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák
1056274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák         default:
1057274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák            assert(0);
1058274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák         }
10599be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
1060900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák         blitter_draw(ctx, dstx, dsty, dstx+width, dsty+height, 0);
106155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         break;
106255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
106355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
1064c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_vertex_states(ctx);
1065c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_fragment_states(ctx);
1066c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_textures(ctx);
1067c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_fb_state(ctx);
1068c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_unset_running_flag(ctx);
106955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
107055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
1071a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a color surface to a constant value. */
1072a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_render_target(struct blitter_context *blitter,
1073a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      struct pipe_surface *dstsurf,
10746dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                                      const union pipe_color_union *color,
1075a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned dstx, unsigned dsty,
1076a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned width, unsigned height)
107755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
107855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
10799b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
108055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_framebuffer_state fb_state;
108155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
1082a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   assert(dstsurf->texture);
1083a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if (!dstsurf->texture)
108455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      return;
108555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
108655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* check the saved state */
1087c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_set_running_flag(ctx);
1088c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_vertex_states(ctx);
1089c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_fragment_states(ctx);
1090c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_fb_state(ctx);
109155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
1092c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* bind states */
109355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_blend_state(pipe, ctx->blend_write_color);
109455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
109555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
10964e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1, FALSE));
10975d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
10984c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák   if (ctx->has_geometry_shader)
10994c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák      pipe->bind_gs_state(pipe, NULL);
1100ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
110155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
110255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* set a framebuffer state */
110359e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   fb_state.width = dstsurf->width;
110459e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   fb_state.height = dstsurf->height;
110555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   fb_state.nr_cbufs = 1;
110659e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   fb_state.cbufs[0] = dstsurf;
110755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   fb_state.zsbuf = 0;
110855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->set_framebuffer_state(pipe, &fb_state);
110955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
11103bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height);
11119be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0,
11126dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                           UTIL_BLITTER_ATTRIB_COLOR, color);
1113c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
1114c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_vertex_states(ctx);
1115c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_fragment_states(ctx);
1116c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_fb_state(ctx);
1117c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_unset_running_flag(ctx);
1118a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger}
111959e51d9640c242a7c919472d935a91889c7840c9Marek Olšák
1120a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a depth stencil surface. */
1121a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_depth_stencil(struct blitter_context *blitter,
1122a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      struct pipe_surface *dstsurf,
1123a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned clear_flags,
1124a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      double depth,
1125a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned stencil,
1126a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned dstx, unsigned dsty,
1127a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned width, unsigned height)
1128a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger{
1129a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
11309b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
1131a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct pipe_framebuffer_state fb_state;
1132a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct pipe_stencil_ref sr = { { 0 } };
1133a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
1134a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   assert(dstsurf->texture);
1135a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if (!dstsurf->texture)
1136a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      return;
1137a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
1138a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   /* check the saved state */
1139c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_set_running_flag(ctx);
1140c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_vertex_states(ctx);
1141c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_fragment_states(ctx);
1142c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_fb_state(ctx);
1143a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
1144c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* bind states */
1145a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_blend_state(pipe, ctx->blend_keep_color);
1146a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if ((clear_flags & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) {
1147a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      sr.ref_value[0] = stencil & 0xff;
1148a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil);
1149a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->set_stencil_ref(pipe, &sr);
1150a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
1151a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else if (clear_flags & PIPE_CLEAR_DEPTH) {
1152a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil);
1153a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
1154a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else if (clear_flags & PIPE_CLEAR_STENCIL) {
1155a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      sr.ref_value[0] = stencil & 0xff;
1156a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil);
1157a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->set_stencil_ref(pipe, &sr);
1158a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
1159a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else
1160a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      /* hmm that should be illegal probably, or make it a no-op somewhere */
1161a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
1162a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
1163a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
11644e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0, FALSE));
11655d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
11664c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák   if (ctx->has_geometry_shader)
11674c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák      pipe->bind_gs_state(pipe, NULL);
1168a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
1169a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
1170a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   /* set a framebuffer state */
1171a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.width = dstsurf->width;
1172a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.height = dstsurf->height;
1173a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.nr_cbufs = 0;
1174a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.cbufs[0] = 0;
1175a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.zsbuf = dstsurf;
1176a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->set_framebuffer_state(pipe, &fb_state);
1177a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
11783bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height);
11799be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, depth,
11809be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                           UTIL_BLITTER_ATTRIB_NONE, NULL);
1181c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
1182c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_vertex_states(ctx);
1183c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_fragment_states(ctx);
1184c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_fb_state(ctx);
1185c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_unset_running_flag(ctx);
118655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
1187f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1188c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie/* draw a rectangle across a region using a custom dsa stage - for r600g */
1189c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlievoid util_blitter_custom_depth_stencil(struct blitter_context *blitter,
1190c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie				       struct pipe_surface *zsurf,
1191c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie				       struct pipe_surface *cbsurf,
1192c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie				       void *dsa_stage, float depth)
1193f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák{
1194f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
1195f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   struct pipe_context *pipe = ctx->base.pipe;
1196f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   struct pipe_framebuffer_state fb_state;
1197f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1198c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   assert(zsurf->texture);
1199c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   if (!zsurf->texture)
1200f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák      return;
1201f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1202f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   /* check the saved state */
1203c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_set_running_flag(ctx);
1204c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_vertex_states(ctx);
1205c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_fragment_states(ctx);
1206c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_fb_state(ctx);
1207f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1208c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* bind states */
1209c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   pipe->bind_blend_state(pipe, ctx->blend_write_color);
1210c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   pipe->bind_depth_stencil_alpha_state(pipe, dsa_stage);
1211f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1212f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
12134e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0, FALSE));
12145d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
12154c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák   if (ctx->has_geometry_shader)
12164c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák      pipe->bind_gs_state(pipe, NULL);
1217f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
1218f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1219f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   /* set a framebuffer state */
1220c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   fb_state.width = zsurf->width;
1221c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   fb_state.height = zsurf->height;
1222c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   fb_state.nr_cbufs = 1;
1223c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   if (cbsurf) {
1224c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie	   fb_state.cbufs[0] = cbsurf;
1225c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie	   fb_state.nr_cbufs = 1;
1226c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   } else {
1227c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie	   fb_state.cbufs[0] = NULL;
1228c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie	   fb_state.nr_cbufs = 0;
1229c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   }
1230c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   fb_state.zsbuf = zsurf;
1231f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   pipe->set_framebuffer_state(pipe, &fb_state);
1232f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1233c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   blitter_set_dst_dimensions(ctx, zsurf->width, zsurf->height);
1234c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   blitter->draw_rectangle(blitter, 0, 0, zsurf->width, zsurf->height, depth,
1235f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák                           UTIL_BLITTER_ATTRIB_NONE, NULL);
1236c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
1237c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_vertex_states(ctx);
1238c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_fragment_states(ctx);
1239c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_fb_state(ctx);
1240c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_unset_running_flag(ctx);
1241f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák}
124236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák
124336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšákvoid util_blitter_copy_buffer(struct blitter_context *blitter,
124436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák                              struct pipe_resource *dst,
124536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák                              unsigned dstx,
124636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák                              struct pipe_resource *src,
124736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák                              unsigned srcx,
124836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák                              unsigned size)
124936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák{
125036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
125136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   struct pipe_context *pipe = ctx->base.pipe;
125236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   struct pipe_vertex_buffer vb;
125336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   struct pipe_stream_output_target *so_target;
125436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák
125559fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák   if (srcx >= src->width0 ||
125659fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák       dstx >= dst->width0) {
125759fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák      return;
125859fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák   }
125959fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák   if (srcx + size > src->width0) {
126059fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák      size = src->width0 - srcx;
126159fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák   }
126259fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák   if (dstx + size > dst->width0) {
126359fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák      size = dst->width0 - dstx;
126459fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák   }
126559fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák
126636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   /* Drivers not capable of Stream Out should not call this function
126736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák    * in the first place. */
126836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   assert(ctx->has_stream_out);
126936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák
127036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   /* Some alignment is required. */
1271a0a9e56cfed1ab81c1068cffbfd9299f77c7e187Marek Olšák   if (srcx % 4 != 0 || dstx % 4 != 0 || size % 4 != 0 ||
127236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák       !ctx->has_stream_out) {
127336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák      struct pipe_box box;
127436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák      u_box_1d(srcx, size, &box);
127536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák      util_resource_copy_region(pipe, dst, 0, dstx, 0, 0, src, 0, &box);
127636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák      return;
127736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   }
127836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák
127936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   blitter_set_running_flag(ctx);
128036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   blitter_check_saved_vertex_states(ctx);
128136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák
128236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   vb.buffer = src;
128336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   vb.buffer_offset = srcx;
128436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   vb.stride = 4;
128536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák
128636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   pipe->set_vertex_buffers(pipe, 1, &vb);
128736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   pipe->bind_vertex_elements_state(pipe, ctx->velem_state_readbuf);
128836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   pipe->bind_vs_state(pipe, ctx->vs_pos_only);
128936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   if (ctx->has_geometry_shader)
129036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák      pipe->bind_gs_state(pipe, NULL);
129136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_discard_state);
129236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák
129336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   so_target = pipe->create_stream_output_target(pipe, dst, dstx, size);
129436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   pipe->set_stream_output_targets(pipe, 1, &so_target, 0);
129536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák
1296a0a9e56cfed1ab81c1068cffbfd9299f77c7e187Marek Olšák   util_draw_arrays(pipe, PIPE_PRIM_POINTS, 0, size / 4);
129736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák
129836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   blitter_restore_vertex_states(ctx);
129936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   blitter_unset_running_flag(ctx);
130036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák   pipe_so_target_reference(&so_target, NULL);
130136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák}
1302