u_blitter.c revision 4c417697b6fa1503ac35b34e79f23716d813a208
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"
5055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
51a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák#define INVALID_PTR ((void*)~0)
52a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák
5355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context_priv
5455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
559b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct blitter_context base;
5655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
57287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource *vbuf;  /**< quad */
5855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
5955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   float vertices[4][2][4];   /**< {pos, color} or {pos, texcoord} */
6055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
6185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Templates for various state objects. */
6285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_sampler_state template_sampler_state;
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.*/
6755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
6855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* Fragment shaders. */
69677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   /* The shader at index i outputs color to color buffers 0,1,...,i-1. */
70677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   void *fs_col[PIPE_MAX_COLOR_BUFS+1];
71ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
72ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   /* FS which outputs a color from a texture,
73ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák      where the index is PIPE_TEXTURE_* to be sampled. */
74ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   void *fs_texfetch_col[PIPE_MAX_TEXTURE_TYPES];
75ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
76ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   /* FS which outputs a depth from a texture,
77ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák      where the index is PIPE_TEXTURE_* to be sampled. */
78ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   void *fs_texfetch_depth[PIPE_MAX_TEXTURE_TYPES];
7955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
8055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* Blend state. */
8155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *blend_write_color;   /**< blend state with writemask of RGBA */
8255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *blend_keep_color;    /**< blend state with writemask of 0 */
8355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
8455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* Depth stencil alpha state. */
851a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   void *dsa_write_depth_stencil;
8655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *dsa_write_depth_keep_stencil;
8755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *dsa_keep_depth_stencil;
88a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   void *dsa_keep_depth_write_stencil;
8955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
90ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   void *velem_state;
91ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger
92ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   /* Sampler state for clamping to a miplevel. */
93d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   void *sampler_state[PIPE_MAX_TEXTURE_LEVELS * 2];
94ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
95ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   /* Rasterizer state. */
96ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   void *rs_state;
97f6106566081978f663cf08e54bb8908cb58a5316Michal Krol
98932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   /* Viewport state. */
99932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   struct pipe_viewport_state viewport;
100932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
101932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   /* Clip state. */
102932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   struct pipe_clip_state clip;
1033bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák
1043bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   /* Destination surface dimensions. */
1053bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   unsigned dst_width;
1063bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   unsigned dst_height;
1074c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák
1084c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák   boolean has_geometry_shader;
10955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák};
11055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
1119be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter,
1129be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   unsigned x, unsigned y,
1139be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   unsigned width, unsigned height,
1149be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   float depth,
1159be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   enum blitter_attrib_type type,
1166dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                                   const union pipe_color_union *attrib);
1179be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
1189be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
11955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context *util_blitter_create(struct pipe_context *pipe)
12055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
12155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx;
1220c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   struct pipe_blend_state blend;
1230c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   struct pipe_depth_stencil_alpha_state dsa;
1240c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   struct pipe_rasterizer_state rs_state;
12585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_sampler_state *sampler_state;
126ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   struct pipe_vertex_element velem[2];
12785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   unsigned i;
12855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
12955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx = CALLOC_STRUCT(blitter_context_priv);
13055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   if (!ctx)
13155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      return NULL;
13255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
1339b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.pipe = pipe;
1349be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   ctx->base.draw_rectangle = blitter_draw_rectangle;
13555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
13655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* init state objects for them to be considered invalid */
1379b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_blend_state = INVALID_PTR;
1389b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_dsa_state = INVALID_PTR;
1399b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_rs_state = INVALID_PTR;
1409b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_fs = INVALID_PTR;
1419b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_vs = INVALID_PTR;
1424c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák   ctx->base.saved_gs = INVALID_PTR;
1439b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_velem_state = INVALID_PTR;
1449b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_fb_state.nr_cbufs = ~0;
1459b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_num_sampler_views = ~0;
1469b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_num_sampler_states = ~0;
1479b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_num_vertex_buffers = ~0;
14855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
1494c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák   ctx->has_geometry_shader =
1504c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák      pipe->screen->get_shader_param(pipe->screen, PIPE_SHADER_GEOMETRY,
1514c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák                                     PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0;
1524c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák
15355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* blend state objects */
1540c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   memset(&blend, 0, sizeof(blend));
15555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->blend_keep_color = pipe->create_blend_state(pipe, &blend);
15655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
157eba1e2a44718bea398e49d496a78ee002c9922b8Roland Scheidegger   blend.rt[0].colormask = PIPE_MASK_RGBA;
15855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->blend_write_color = pipe->create_blend_state(pipe, &blend);
15955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
16055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* depth stencil alpha state objects */
1610c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   memset(&dsa, 0, sizeof(dsa));
16255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->dsa_keep_depth_stencil =
1631a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
16455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
165f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   dsa.depth.enabled = 1;
166f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   dsa.depth.writemask = 1;
167f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   dsa.depth.func = PIPE_FUNC_ALWAYS;
16855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->dsa_write_depth_keep_stencil =
1691a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
1701a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger
1711a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].enabled = 1;
1721a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].func = PIPE_FUNC_ALWAYS;
1731a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE;
1741a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE;
1751a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE;
1761a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].valuemask = 0xff;
1771a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].writemask = 0xff;
1781a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   ctx->dsa_write_depth_stencil =
1791a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
180a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
181a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
182a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   dsa.depth.enabled = 0;
183a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   dsa.depth.writemask = 0;
184a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   ctx->dsa_keep_depth_write_stencil =
185a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
18655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
18755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* sampler state */
18885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state = &ctx->template_sampler_state;
18985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state->wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
19085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state->wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
19185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state->wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
1922ee0d19ccf768c4c12c3c3476c1cd7eff508629aCorbin Simpson   sampler_state->normalized_coords = TRUE;
19385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* The sampler state objects which sample from a specified mipmap level
19485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák    * are created on-demand. */
19555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
19655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* rasterizer state */
19755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   memset(&rs_state, 0, sizeof(rs_state));
1980bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell   rs_state.cull_face = PIPE_FACE_NONE;
19955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   rs_state.gl_rasterization_rules = 1;
2001c75edf3e8ccc97f5f91f42f99c1f8db30b25fc4Corbin Simpson   rs_state.flatshade = 1;
20155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->rs_state = pipe->create_rasterizer_state(pipe, &rs_state);
20255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
203ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   /* vertex elements state */
204ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   memset(&velem[0], 0, sizeof(velem[0]) * 2);
205ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   for (i = 0; i < 2; i++) {
206ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].src_offset = i * 4 * sizeof(float);
207ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
208ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   }
209ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   ctx->velem_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]);
210ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger
21185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* fragment shaders are created on-demand */
21285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
2135d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   /* vertex shader */
21455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   {
21555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      const uint semantic_names[] = { TGSI_SEMANTIC_POSITION,
21655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                      TGSI_SEMANTIC_GENERIC };
21755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      const uint semantic_indices[] = { 0, 0 };
2185d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák      ctx->vs =
21955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         util_make_vertex_passthrough_shader(pipe, 2, semantic_names,
22055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                             semantic_indices);
22155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
22255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
22355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* set invariant vertex coordinates */
22455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
22555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][0][3] = 1; /*v.w*/
22655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
22755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* create the vertex buffer */
2282a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák   ctx->vbuf = pipe_user_buffer_create(ctx->base.pipe->screen,
2292a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák                                       ctx->vertices,
2302a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák                                       sizeof(ctx->vertices),
2312a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák                                       PIPE_BIND_VERTEX_BUFFER);
23255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
2339b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   return &ctx->base;
23455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
23555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
23655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_destroy(struct blitter_context *blitter)
23755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
23855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
2399b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = blitter->pipe;
24055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
24155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
24255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_blend_state(pipe, ctx->blend_write_color);
24355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_blend_state(pipe, ctx->blend_keep_color);
24455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
24555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_depth_stencil_alpha_state(pipe,
24655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                          ctx->dsa_write_depth_keep_stencil);
2471a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil);
248a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil);
2496a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson
25055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_rasterizer_state(pipe, ctx->rs_state);
2515d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->delete_vs_state(pipe, ctx->vs);
252ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->delete_vertex_elements_state(pipe, ctx->velem_state);
25355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
254ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   for (i = 0; i < PIPE_MAX_TEXTURE_TYPES; i++) {
25585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->fs_texfetch_col[i])
25685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_fs_state(pipe, ctx->fs_texfetch_col[i]);
25785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->fs_texfetch_depth[i])
25885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_fs_state(pipe, ctx->fs_texfetch_depth[i]);
25955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
260ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
261b51f6e7c2350f637337fc3935436e2f99f669dfdJoakim Sindholt   for (i = 0; i <= PIPE_MAX_COLOR_BUFS; i++)
26285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->fs_col[i])
26385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_fs_state(pipe, ctx->fs_col[i]);
26455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
265d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   for (i = 0; i < PIPE_MAX_TEXTURE_LEVELS * 2; i++)
26685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->sampler_state[i])
26785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_sampler_state(pipe, ctx->sampler_state[i]);
268ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
269287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   pipe_resource_reference(&ctx->vbuf, NULL);
27055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   FREE(ctx);
27155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
27255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
273c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_set_running_flag(struct blitter_context_priv *ctx)
27455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
275ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák   if (ctx->base.running) {
276c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák      _debug_printf("u_blitter:%i: Caught recursion. This is a driver bug.\n",
277c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák                    __LINE__);
2789a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák   }
279ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák   ctx->base.running = TRUE;
280c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák}
2819a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák
282c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_unset_running_flag(struct blitter_context_priv *ctx)
283c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{
284c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   if (!ctx->base.running) {
285c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák      _debug_printf("u_blitter:%i: Caught recursion. This is a driver bug.\n",
286c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák                    __LINE__);
287c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   }
288c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   ctx->base.running = FALSE;
289c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák}
290c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
291c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_check_saved_vertex_states(struct blitter_context_priv *ctx)
292c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{
293c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   assert(ctx->base.saved_num_vertex_buffers != ~0 &&
294c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák          ctx->base.saved_velem_state != INVALID_PTR &&
2959b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák          ctx->base.saved_vs != INVALID_PTR &&
2964c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák          (!ctx->has_geometry_shader || ctx->base.saved_gs != INVALID_PTR) &&
297c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák          ctx->base.saved_rs_state != INVALID_PTR);
29855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
29955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
300c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_restore_vertex_states(struct blitter_context_priv *ctx)
30155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
3029b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
3038f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák   unsigned i;
30455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
305c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* Vertex buffers. */
306c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   pipe->set_vertex_buffers(pipe,
307c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák                            ctx->base.saved_num_vertex_buffers,
308c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák                            ctx->base.saved_vertex_buffers);
309c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
310c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   for (i = 0; i < ctx->base.saved_num_vertex_buffers; i++) {
311c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák      if (ctx->base.saved_vertex_buffers[i].buffer) {
312c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák         pipe_resource_reference(&ctx->base.saved_vertex_buffers[i].buffer,
313c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák                                 NULL);
314c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák      }
315c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   }
316c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   ctx->base.saved_num_vertex_buffers = ~0;
317c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
318c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* Vertex elements. */
3199b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->bind_vertex_elements_state(pipe, ctx->base.saved_velem_state);
320c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   ctx->base.saved_velem_state = INVALID_PTR;
32155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
322c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* Vertex shader. */
323c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   pipe->bind_vs_state(pipe, ctx->base.saved_vs);
3249b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_vs = INVALID_PTR;
32555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3264c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák   /* Geometry shader. */
3274c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák   if (ctx->has_geometry_shader) {
3284c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák      pipe->bind_gs_state(pipe, ctx->base.saved_gs);
3294c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák      ctx->base.saved_gs = INVALID_PTR;
3304c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák   }
331363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák
332c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* Rasterizer. */
333c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   pipe->bind_rasterizer_state(pipe, ctx->base.saved_rs_state);
334c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   ctx->base.saved_rs_state = INVALID_PTR;
335c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák}
336c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
337c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_check_saved_fragment_states(struct blitter_context_priv *ctx)
338c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{
339c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   assert(ctx->base.saved_fs != INVALID_PTR &&
340c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák          ctx->base.saved_dsa_state != INVALID_PTR &&
341c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák          ctx->base.saved_blend_state != INVALID_PTR);
342c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák}
343c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
344c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_restore_fragment_states(struct blitter_context_priv *ctx)
345c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{
346c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
347c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
348c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* Fragment shader. */
349c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   pipe->bind_fs_state(pipe, ctx->base.saved_fs);
350c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   ctx->base.saved_fs = INVALID_PTR;
351c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
352c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* Depth, stencil, alpha. */
353c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   pipe->bind_depth_stencil_alpha_state(pipe, ctx->base.saved_dsa_state);
354c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   ctx->base.saved_dsa_state = INVALID_PTR;
355c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
356c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* Blend state. */
357c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   pipe->bind_blend_state(pipe, ctx->base.saved_blend_state);
358c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   ctx->base.saved_blend_state = INVALID_PTR;
359c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
360c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* Miscellaneous states. */
361c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* XXX check whether these are saved and whether they need to be restored
362c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák    * (depending on the operation) */
3639b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->set_stencil_ref(pipe, &ctx->base.saved_stencil_ref);
3649b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->set_viewport_state(pipe, &ctx->base.saved_viewport);
3659b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->set_clip_state(pipe, &ctx->base.saved_clip);
366c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák}
367932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
368c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_check_saved_fb_state(struct blitter_context_priv *ctx)
369c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{
370c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   assert(ctx->base.saved_fb_state.nr_cbufs != ~0);
371c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák}
37255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
373c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_restore_fb_state(struct blitter_context_priv *ctx)
374c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{
375c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
376c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
377c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   pipe->set_framebuffer_state(pipe, &ctx->base.saved_fb_state);
378c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   util_unreference_framebuffer_state(&ctx->base.saved_fb_state);
379c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák}
38055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
381c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_check_saved_textures(struct blitter_context_priv *ctx)
382c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{
383c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   assert(ctx->base.saved_num_sampler_states != ~0 &&
384c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák          ctx->base.saved_num_sampler_views != ~0);
385c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák}
3860b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák
387c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_restore_textures(struct blitter_context_priv *ctx)
388c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{
389c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
390c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   unsigned i;
3910b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák
392c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* Fragment sampler states. */
393c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   pipe->bind_fragment_sampler_states(pipe,
394c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák                                      ctx->base.saved_num_sampler_states,
395c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák                                      ctx->base.saved_sampler_states);
396c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   ctx->base.saved_num_sampler_states = ~0;
39764aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri
398c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* Fragment sampler views. */
399c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   pipe->set_fragment_sampler_views(pipe,
400c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák                                    ctx->base.saved_num_sampler_views,
401c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák                                    ctx->base.saved_sampler_views);
4028f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák
403c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   for (i = 0; i < ctx->base.saved_num_sampler_views; i++)
404c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák      pipe_sampler_view_reference(&ctx->base.saved_sampler_views[i], NULL);
4059a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák
406c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   ctx->base.saved_num_sampler_views = ~0;
40755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
40855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
40955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_rectangle(struct blitter_context_priv *ctx,
41055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  unsigned x1, unsigned y1,
41155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  unsigned x2, unsigned y2,
41255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  float depth)
41355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
41455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
41555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
41655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* set vertex positions */
4173bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[0][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v0.x*/
4183bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[0][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v0.y*/
41955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
4203bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[1][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v1.x*/
4213bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[1][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v1.y*/
42255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
4233bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[2][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v2.x*/
4243bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[2][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v2.y*/
42555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
4263bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[3][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v3.x*/
4273bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[3][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v3.y*/
42855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
42955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
43055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][0][2] = depth; /*z*/
431932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
432932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   /* viewport */
4333bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->viewport.scale[0] = 0.5f * ctx->dst_width;
4343bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->viewport.scale[1] = 0.5f * ctx->dst_height;
435ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák   ctx->viewport.scale[2] = 1.0f;
436932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->viewport.scale[3] = 1.0f;
4373bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->viewport.translate[0] = 0.5f * ctx->dst_width;
4383bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->viewport.translate[1] = 0.5f * ctx->dst_height;
439ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák   ctx->viewport.translate[2] = 0.0f;
440932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->viewport.translate[3] = 0.0f;
4419b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.pipe->set_viewport_state(ctx->base.pipe, &ctx->viewport);
442932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
443932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   /* clip */
4449b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.pipe->set_clip_state(ctx->base.pipe, &ctx->clip);
44555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
44655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
44755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_clear_color(struct blitter_context_priv *ctx,
4486dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                                    const union pipe_color_union *color)
44955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
45055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
45155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
4526dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie   if (color) {
45316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      for (i = 0; i < 4; i++) {
4546dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie         ctx->vertices[i][1][0] = color->f[0];
4556dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie         ctx->vertices[i][1][1] = color->f[1];
4566dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie         ctx->vertices[i][1][2] = color->f[2];
4576dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie         ctx->vertices[i][1][3] = color->f[3];
45816d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      }
459fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák   } else {
46016d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      for (i = 0; i < 4; i++) {
46116d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][0] = 0;
46216d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][1] = 0;
46316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][2] = 0;
46416d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][3] = 0;
46516d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      }
46655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
46755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
46855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
469d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieristatic void get_texcoords(struct pipe_resource *src,
4704c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          unsigned level,
4714c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          unsigned x1, unsigned y1,
4724c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          unsigned x2, unsigned y2,
4734c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          boolean normalized, float out[4])
474749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{
475d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   if(normalized)
476d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   {
4774c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      out[0] = x1 / (float)u_minify(src->width0,  level);
4784c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      out[1] = y1 / (float)u_minify(src->height0, level);
4794c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      out[2] = x2 / (float)u_minify(src->width0,  level);
4804c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      out[3] = y2 / (float)u_minify(src->height0, level);
481d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   }
482d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   else
483d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   {
484d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      out[0] = x1;
485d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      out[1] = y1;
486d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      out[2] = x2;
487d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      out[3] = y2;
488d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   }
489749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák}
490749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák
491749e24521a31178d2b647aa2954c3eecd597b799Marek Olšákstatic void set_texcoords_in_vertices(const float coord[4],
492749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák                                      float *out, unsigned stride)
493749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{
494749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = coord[0]; /*t0.s*/
495749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = coord[1]; /*t0.t*/
496749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out += stride;
497749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = coord[2]; /*t1.s*/
498749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = coord[1]; /*t1.t*/
499749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out += stride;
500749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = coord[2]; /*t2.s*/
501749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = coord[3]; /*t2.t*/
502749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out += stride;
503749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = coord[0]; /*t3.s*/
504749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = coord[3]; /*t3.t*/
505749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák}
506749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák
50755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_2d(struct blitter_context_priv *ctx,
508876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     struct pipe_resource *src,
5094c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                     unsigned level,
51055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x1, unsigned y1,
51155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x2, unsigned y2)
51255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
513749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   unsigned i;
514749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   float coord[4];
51555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
5164c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   get_texcoords(src, level, x1, y1, x2, y2, TRUE, coord);
517749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   set_texcoords_in_vertices(coord, &ctx->vertices[0][1][0], 8);
51855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
51955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++) {
52055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][2] = 0; /*r*/
52155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][3] = 1; /*q*/
52255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
52355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
52455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
52555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_3d(struct blitter_context_priv *ctx,
526876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     struct pipe_resource *src,
5274c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                     unsigned level,
528876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     unsigned zslice,
52955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x1, unsigned y1,
530274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák                                     unsigned x2, unsigned y2,
531274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák				     boolean normalized)
53255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
53355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
534274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák   float r = normalized ? zslice / (float)u_minify(src->depth0, level) : zslice;
53555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
5364c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   blitter_set_texcoords_2d(ctx, src, level, x1, y1, x2, y2);
53755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
53855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
53955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][2] = r; /*r*/
54055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
54155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
542274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšákstatic void blitter_set_texcoords_1d_array(struct blitter_context_priv *ctx,
543274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák                                           struct pipe_resource *src,
544274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák                                           unsigned level,
545274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák                                           unsigned zslice,
546274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák                                           unsigned x1, unsigned x2)
547274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák{
548274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák   int i;
549274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák   float r = zslice;
550274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák
551274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák   blitter_set_texcoords_2d(ctx, src, level, x1, 0, x2, 0);
552274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák
553274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák   for (i = 0; i < 4; i++)
554274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák      ctx->vertices[i][1][1] = r; /*r*/
555274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák}
556274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák
55755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_cube(struct blitter_context_priv *ctx,
558876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                       struct pipe_resource *src,
5594c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                       unsigned level, unsigned face,
56055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                       unsigned x1, unsigned y1,
56155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                       unsigned x2, unsigned y2)
56255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
56355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
564749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   float coord[4];
565d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul   float st[4][2];
566d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul
5674c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   get_texcoords(src, level, x1, y1, x2, y2, TRUE, coord);
568749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   set_texcoords_in_vertices(coord, &st[0][0], 2);
56955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
5704c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   util_map_texcoords2d_onto_cubemap(face,
57155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     /* pointer, stride in floats */
57255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     &st[0][0], 2,
57355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     &ctx->vertices[0][1][0], 8);
57455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
57555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
57655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][3] = 1; /*q*/
57755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
57855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
5793bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákstatic void blitter_set_dst_dimensions(struct blitter_context_priv *ctx,
5803bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák                                       unsigned width, unsigned height)
5813bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák{
5823bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->dst_width = width;
5833bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->dst_height = height;
5843bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák}
5853bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák
58685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
58785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid **blitter_get_sampler_state(struct blitter_context_priv *ctx,
588d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri                                 int miplevel, boolean normalized)
58985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
5909b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
59185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_sampler_state *sampler_state = &ctx->template_sampler_state;
59285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
59385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(miplevel < PIPE_MAX_TEXTURE_LEVELS);
59485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
59585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Create the sampler state on-demand. */
596d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   if (!ctx->sampler_state[miplevel * 2 + normalized]) {
59785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      sampler_state->lod_bias = miplevel;
59885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      sampler_state->min_lod = miplevel;
59985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      sampler_state->max_lod = miplevel;
600d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      sampler_state->normalized_coords = normalized;
60185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
602d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      ctx->sampler_state[miplevel * 2 + normalized] = pipe->create_sampler_state(pipe,
60385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                                                sampler_state);
60485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   }
60585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
60685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Return void** so that it can be passed to bind_fragment_sampler_states
60785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák    * directly. */
608d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   return &ctx->sampler_state[miplevel * 2 + normalized];
60985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
61085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
61185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
61285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_col(struct blitter_context_priv *ctx, unsigned num_cbufs)
61385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
6149b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
61585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
61685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(num_cbufs <= PIPE_MAX_COLOR_BUFS);
61785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
618677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   if (!ctx->fs_col[num_cbufs])
619677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas      ctx->fs_col[num_cbufs] =
6205d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák         util_make_fragment_cloneinput_shader(pipe, num_cbufs,
6215d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák                                              TGSI_SEMANTIC_GENERIC,
6225d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák                                              TGSI_INTERPOLATE_LINEAR);
62385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
624677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   return ctx->fs_col[num_cbufs];
62585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
62685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
627d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul/** Convert PIPE_TEXTURE_x to TGSI_TEXTURE_x */
628d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paulstatic unsigned
6293bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákpipe_tex_to_tgsi_tex(enum pipe_texture_target pipe_tex_target)
630d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul{
631d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   switch (pipe_tex_target) {
632d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_1D:
633d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_1D;
634d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_2D:
635d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_2D;
636ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri   case PIPE_TEXTURE_RECT:
637cbe367227959a32ff20e146106162a81d2be02c3Luca Barbieri      return TGSI_TEXTURE_RECT;
638d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_3D:
639d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_3D;
640d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_CUBE:
641d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_CUBE;
642274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák   case PIPE_TEXTURE_1D_ARRAY:
643274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák      return TGSI_TEXTURE_1D_ARRAY;
644274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák   case PIPE_TEXTURE_2D_ARRAY:
645274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák      return TGSI_TEXTURE_2D_ARRAY;
646d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   default:
647d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      assert(0 && "unexpected texture target");
648d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_UNKNOWN;
649d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   }
650d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul}
651d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
652d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
65385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
65485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_col(struct blitter_context_priv *ctx,
65585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                  unsigned tex_target)
65685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
6579b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
65885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
65985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(tex_target < PIPE_MAX_TEXTURE_TYPES);
66085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
66185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Create the fragment shader on-demand. */
66285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   if (!ctx->fs_texfetch_col[tex_target]) {
663d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target);
664d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
665d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      ctx->fs_texfetch_col[tex_target] =
666d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul        util_make_fragment_tex_shader(pipe, tgsi_tex, TGSI_INTERPOLATE_LINEAR);
66785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   }
66885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
66985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   return ctx->fs_texfetch_col[tex_target];
67085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
67185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
67285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
67385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_depth(struct blitter_context_priv *ctx,
67485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                    unsigned tex_target)
67585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
6769b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
67785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
67885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(tex_target < PIPE_MAX_TEXTURE_TYPES);
67985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
68085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Create the fragment shader on-demand. */
68185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   if (!ctx->fs_texfetch_depth[tex_target]) {
682d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target);
683d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
684d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      ctx->fs_texfetch_depth[tex_target] =
685d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul         util_make_fragment_tex_shader_writedepth(pipe, tgsi_tex,
686d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul                                                  TGSI_INTERPOLATE_LINEAR);
68785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   }
68885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
68985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   return ctx->fs_texfetch_depth[tex_target];
69085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
69185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
6929be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter,
6939be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   unsigned x1, unsigned y1,
6949be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   unsigned x2, unsigned y2,
6959be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   float depth,
6969be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   enum blitter_attrib_type type,
6976dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                                   const union pipe_color_union *attrib)
6989be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák{
6999be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
7009be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
7019be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   switch (type) {
7029be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      case UTIL_BLITTER_ATTRIB_COLOR:
7039be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         blitter_set_clear_color(ctx, attrib);
7049be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         break;
7059be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
7069be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      case UTIL_BLITTER_ATTRIB_TEXCOORD:
7076dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie         set_texcoords_in_vertices(attrib->f, &ctx->vertices[0][1][0], 8);
7089be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         break;
7099be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
7109be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      default:;
7119be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   }
7129be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
7139be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter_set_rectangle(ctx, x1, y1, x2, y2, depth);
714588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák   ctx->base.pipe->redefine_user_buffer(ctx->base.pipe, ctx->vbuf,
715588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák                                        0, ctx->vbuf->width0);
716d5062fb3a315c46d77d5c954a3e3c14be1907d33Marek Olšák   util_draw_vertex_buffer(ctx->base.pipe, NULL, ctx->vbuf, 0,
7172a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák                           PIPE_PRIM_TRIANGLE_FAN, 4, 2);
7189be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák}
7199be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
720db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákstatic void util_blitter_clear_custom(struct blitter_context *blitter,
721db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      unsigned width, unsigned height,
722db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      unsigned num_cbufs,
723db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      unsigned clear_buffers,
7246dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                                      const union pipe_color_union *color,
725db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      double depth, unsigned stencil,
726db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      void *custom_blend, void *custom_dsa)
72755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
72855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
7299b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
7306a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson   struct pipe_stencil_ref sr = { { 0 } };
73155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
732ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   assert(num_cbufs <= PIPE_MAX_COLOR_BUFS);
73355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
734c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_set_running_flag(ctx);
735c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_vertex_states(ctx);
736c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_fragment_states(ctx);
73755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
738c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* bind states */
739db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   if (custom_blend) {
740db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák      pipe->bind_blend_state(pipe, custom_blend);
741db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else if (clear_buffers & PIPE_CLEAR_COLOR) {
74255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_write_color);
743db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else {
74455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_keep_color);
745db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   }
74655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
747db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   if (custom_dsa) {
748db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe, custom_dsa);
749db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else if ((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) {
7501a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil);
751db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else if (clear_buffers & PIPE_CLEAR_DEPTH) {
752a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil);
753db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else if (clear_buffers & PIPE_CLEAR_STENCIL) {
754a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil);
755db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else {
75655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
757db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   }
758db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák
759db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   sr.ref_value[0] = stencil & 0xff;
760db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   pipe->set_stencil_ref(pipe, &sr);
76155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
76255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
763ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
76485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, num_cbufs));
7655d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
7664c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák   if (ctx->has_geometry_shader)
7674c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák      pipe->bind_gs_state(pipe, NULL);
76855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
7693bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   blitter_set_dst_dimensions(ctx, width, height);
7709be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter->draw_rectangle(blitter, 0, 0, width, height, depth,
7716dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                           UTIL_BLITTER_ATTRIB_COLOR, color);
772c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
773c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_vertex_states(ctx);
774c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_fragment_states(ctx);
775c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_unset_running_flag(ctx);
77655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
77755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
778db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid util_blitter_clear(struct blitter_context *blitter,
779db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                        unsigned width, unsigned height,
780db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                        unsigned num_cbufs,
781db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                        unsigned clear_buffers,
7826dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                        const union pipe_color_union *color,
783db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                        double depth, unsigned stencil)
784db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák{
785db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   util_blitter_clear_custom(blitter, width, height, num_cbufs,
7866dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                             clear_buffers, color, depth, stencil,
787db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                             NULL, NULL);
788db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák}
789db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák
790db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid util_blitter_clear_depth_custom(struct blitter_context *blitter,
791db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                     unsigned width, unsigned height,
792db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                     double depth, void *custom_dsa)
793db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák{
7946dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie    static const union pipe_color_union color;
795db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák    util_blitter_clear_custom(blitter, width, height, 0,
7966dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                              0, &color, depth, 0, NULL, custom_dsa);
797db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák}
798db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák
799876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákstatic
800876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákboolean is_overlap(unsigned sx1, unsigned sx2, unsigned sy1, unsigned sy2,
801876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                   unsigned dx1, unsigned dx2, unsigned dy1, unsigned dy2)
802deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie{
803876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   return sx1 < dx2 && sx2 > dx1 && sy1 < dy2 && sy2 > dy1;
804deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie}
805deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie
806233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšákvoid util_blitter_copy_texture(struct blitter_context *blitter,
807233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák                               struct pipe_resource *dst,
808233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák                               unsigned dstlevel,
809233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák                               unsigned dstx, unsigned dsty, unsigned dstz,
810233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák                               struct pipe_resource *src,
811233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák                               unsigned srclevel,
812233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák                               const struct pipe_box *srcbox,
813233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák                               boolean ignore_stencil)
81455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
81555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
8169b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
817876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   struct pipe_screen *screen = pipe->screen;
8184c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   struct pipe_surface *dstsurf, surf_templ;
81955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_framebuffer_state fb_state;
820f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   struct pipe_sampler_view viewTempl, *view;
821876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   unsigned bind;
8224c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   unsigned width = srcbox->width;
8234c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   unsigned height = srcbox->height;
824876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   boolean is_stencil, is_depth;
825d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   boolean normalized;
826876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
827876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Give up if textures are not set. */
828876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   assert(dst && src);
829876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   if (!dst || !src)
830876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      return;
831876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
832876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Sanity checks. */
833876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   if (dst == src) {
8344c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      assert(!is_overlap(srcbox->x, srcbox->x + width, srcbox->y, srcbox->y + height,
835876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                         dstx, dstx + width, dsty, dsty + height));
836876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   }
837876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   assert(src->target < PIPE_MAX_TEXTURE_TYPES);
8384c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   /* XXX should handle 3d regions */
8394c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   assert(srcbox->depth == 1);
840876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
841876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Is this a ZS format? */
842876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   is_depth = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 0) != 0;
843876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   is_stencil = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 1) != 0;
844876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
845876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   if (is_depth || is_stencil)
846876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      bind = PIPE_BIND_DEPTH_STENCIL;
847876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   else
848876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      bind = PIPE_BIND_RENDER_TARGET;
849876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
850876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Check if we can sample from and render to the surfaces. */
851876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* (assuming copying a stencil buffer is not possible) */
852cec2082ae515bc91e6b29084ba4b8deac28ef923Stéphane Marchesin   if ((!ignore_stencil && is_stencil) ||
853876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák       !screen->is_format_supported(screen, dst->format, dst->target,
854e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák                                    dst->nr_samples, bind) ||
855876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák       !screen->is_format_supported(screen, src->format, src->target,
856e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák                                    src->nr_samples, PIPE_BIND_SAMPLER_VIEW)) {
857ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák      ctx->base.running = TRUE;
8584c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      util_resource_copy_region(pipe, dst, dstlevel, dstx, dsty, dstz,
8594c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                src, srclevel, srcbox);
860ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák      ctx->base.running = FALSE;
861876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      return;
862876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   }
863876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
8644c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   /* Get surface. */
8654c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   memset(&surf_templ, 0, sizeof(surf_templ));
8664c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   u_surface_default_template(&surf_templ, dst, bind);
867ab21147c899ba1506df38438b6750d3dc5eaabdfHenri Verbeet   surf_templ.format = util_format_linear(dst->format);
8684c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   surf_templ.u.tex.level = dstlevel;
8694c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   surf_templ.u.tex.first_layer = dstz;
8704c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   surf_templ.u.tex.last_layer = dstz;
8714c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   dstsurf = pipe->create_surface(pipe, dst, &surf_templ);
87255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
873876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Check whether the states are properly saved. */
874c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_set_running_flag(ctx);
875c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_vertex_states(ctx);
876c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_fragment_states(ctx);
877c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_textures(ctx);
878c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_fb_state(ctx);
87955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
880876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Initialize framebuffer state. */
881876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   fb_state.width = dstsurf->width;
882876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   fb_state.height = dstsurf->height;
88355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
88455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   if (is_depth) {
88555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_keep_color);
88655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe,
88755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                           ctx->dsa_write_depth_keep_stencil);
88885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      pipe->bind_fs_state(pipe,
889876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                          blitter_get_fs_texfetch_depth(ctx, src->target));
89055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
89155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      fb_state.nr_cbufs = 0;
892876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      fb_state.zsbuf = dstsurf;
89355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   } else {
89455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_write_color);
89555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
89685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      pipe->bind_fs_state(pipe,
897876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                          blitter_get_fs_texfetch_col(ctx, src->target));
89855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
89955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      fb_state.nr_cbufs = 1;
900876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      fb_state.cbufs[0] = dstsurf;
90155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      fb_state.zsbuf = 0;
90255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
90385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
904d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   normalized = src->target != PIPE_TEXTURE_RECT;
905d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri
906876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Initialize sampler view. */
907ab21147c899ba1506df38438b6750d3dc5eaabdfHenri Verbeet   u_sampler_view_default_template(&viewTempl, src, util_format_linear(src->format));
908876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   view = pipe->create_sampler_view(pipe, src, &viewTempl);
909f6106566081978f663cf08e54bb8908cb58a5316Michal Krol
910876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Set rasterizer state, shaders, and textures. */
91155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
9125d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
9134c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák   if (ctx->has_geometry_shader)
9144c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák      pipe->bind_gs_state(pipe, NULL);
91585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   pipe->bind_fragment_sampler_states(pipe, 1,
9164c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                      blitter_get_sampler_state(ctx, srclevel, normalized));
917ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
918f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   pipe->set_fragment_sampler_views(pipe, 1, &view);
91955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->set_framebuffer_state(pipe, &fb_state);
92055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
9219be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height);
9229be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
923876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   switch (src->target) {
9249be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      /* Draw the quad with the draw_rectangle callback. */
92555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_1D:
92655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_2D:
927ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri      case PIPE_TEXTURE_RECT:
9289be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         {
9296dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie            /* Set texture coordinates. - use a pipe color union
9306dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie             * for interface purposes
9316dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie             */
9326dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie            union pipe_color_union coord;
9334c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            get_texcoords(src, srclevel, srcbox->x, srcbox->y,
9346dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                          srcbox->x+width, srcbox->y+height, normalized, coord.f);
9359be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
9369be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák            /* Draw. */
9379be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák            blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0,
9386dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                                    UTIL_BLITTER_ATTRIB_TEXCOORD, &coord);
9399be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         }
94055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         break;
9419be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
9429be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      /* Draw the quad with the generic codepath. */
943274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák      default:
9449be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         /* Set texture coordinates. */
945274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák         switch (src->target) {
946274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák         case PIPE_TEXTURE_1D_ARRAY:
947274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák            blitter_set_texcoords_1d_array(ctx, src, srclevel, srcbox->y,
948274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák                                           srcbox->x, srcbox->x + width);
949274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák            break;
950274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák
951274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák         case PIPE_TEXTURE_2D_ARRAY:
952274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák         case PIPE_TEXTURE_3D:
9534c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            blitter_set_texcoords_3d(ctx, src, srclevel, srcbox->z,
9544c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                     srcbox->x, srcbox->y,
955274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák                                     srcbox->x + width, srcbox->y + height,
956274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák                                     src->target == PIPE_TEXTURE_3D);
957274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák            break;
958274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák
959274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák         case PIPE_TEXTURE_CUBE:
9604c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            blitter_set_texcoords_cube(ctx, src, srclevel, srcbox->z,
9614c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                       srcbox->x, srcbox->y,
9624c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                       srcbox->x + width, srcbox->y + height);
963274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák            break;
964274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák
965274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák         default:
966274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák            assert(0);
967274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák         }
9689be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
9699be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         /* Draw. */
9709be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         blitter_set_rectangle(ctx, dstx, dsty, dstx+width, dsty+height, 0);
971588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák         ctx->base.pipe->redefine_user_buffer(ctx->base.pipe, ctx->vbuf,
972588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák                                              0, ctx->vbuf->width0);
973d5062fb3a315c46d77d5c954a3e3c14be1907d33Marek Olšák         util_draw_vertex_buffer(ctx->base.pipe, NULL, ctx->vbuf, 0,
9742a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák                                 PIPE_PRIM_TRIANGLE_FAN, 4, 2);
97555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         break;
97655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
97755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
978c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_vertex_states(ctx);
979c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_fragment_states(ctx);
980c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_textures(ctx);
981c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_fb_state(ctx);
982c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_unset_running_flag(ctx);
983876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
984876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   pipe_surface_reference(&dstsurf, NULL);
98557c3f70018bc7cd44eafd55d8147691a3c109b91Marek Olšák   pipe_sampler_view_reference(&view, NULL);
98655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
98755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
988a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a color surface to a constant value. */
989a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_render_target(struct blitter_context *blitter,
990a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      struct pipe_surface *dstsurf,
9916dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                                      const union pipe_color_union *color,
992a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned dstx, unsigned dsty,
993a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned width, unsigned height)
99455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
99555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
9969b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
99755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_framebuffer_state fb_state;
99855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
999a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   assert(dstsurf->texture);
1000a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if (!dstsurf->texture)
100155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      return;
100255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
100355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* check the saved state */
1004c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_set_running_flag(ctx);
1005c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_vertex_states(ctx);
1006c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_fragment_states(ctx);
1007c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_fb_state(ctx);
100855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
1009c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* bind states */
101055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_blend_state(pipe, ctx->blend_write_color);
101155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
101255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
101385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1));
10145d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
10154c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák   if (ctx->has_geometry_shader)
10164c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák      pipe->bind_gs_state(pipe, NULL);
1017ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
101855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
101955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* set a framebuffer state */
102059e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   fb_state.width = dstsurf->width;
102159e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   fb_state.height = dstsurf->height;
102255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   fb_state.nr_cbufs = 1;
102359e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   fb_state.cbufs[0] = dstsurf;
102455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   fb_state.zsbuf = 0;
102555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->set_framebuffer_state(pipe, &fb_state);
102655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
10273bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height);
10289be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0,
10296dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                           UTIL_BLITTER_ATTRIB_COLOR, color);
1030c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
1031c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_vertex_states(ctx);
1032c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_fragment_states(ctx);
1033c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_fb_state(ctx);
1034c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_unset_running_flag(ctx);
1035a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger}
103659e51d9640c242a7c919472d935a91889c7840c9Marek Olšák
1037a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a depth stencil surface. */
1038a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_depth_stencil(struct blitter_context *blitter,
1039a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      struct pipe_surface *dstsurf,
1040a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned clear_flags,
1041a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      double depth,
1042a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned stencil,
1043a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned dstx, unsigned dsty,
1044a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned width, unsigned height)
1045a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger{
1046a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
10479b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
1048a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct pipe_framebuffer_state fb_state;
1049a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct pipe_stencil_ref sr = { { 0 } };
1050a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
1051a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   assert(dstsurf->texture);
1052a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if (!dstsurf->texture)
1053a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      return;
1054a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
1055a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   /* check the saved state */
1056c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_set_running_flag(ctx);
1057c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_vertex_states(ctx);
1058c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_fragment_states(ctx);
1059c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_fb_state(ctx);
1060a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
1061c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* bind states */
1062a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_blend_state(pipe, ctx->blend_keep_color);
1063a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if ((clear_flags & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) {
1064a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      sr.ref_value[0] = stencil & 0xff;
1065a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil);
1066a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->set_stencil_ref(pipe, &sr);
1067a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
1068a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else if (clear_flags & PIPE_CLEAR_DEPTH) {
1069a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil);
1070a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
1071a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else if (clear_flags & PIPE_CLEAR_STENCIL) {
1072a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      sr.ref_value[0] = stencil & 0xff;
1073a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil);
1074a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->set_stencil_ref(pipe, &sr);
1075a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
1076a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else
1077a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      /* hmm that should be illegal probably, or make it a no-op somewhere */
1078a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
1079a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
1080a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
1081a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0));
10825d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
10834c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák   if (ctx->has_geometry_shader)
10844c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák      pipe->bind_gs_state(pipe, NULL);
1085a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
1086a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
1087a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   /* set a framebuffer state */
1088a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.width = dstsurf->width;
1089a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.height = dstsurf->height;
1090a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.nr_cbufs = 0;
1091a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.cbufs[0] = 0;
1092a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.zsbuf = dstsurf;
1093a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->set_framebuffer_state(pipe, &fb_state);
1094a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
10953bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height);
10969be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, depth,
10979be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                           UTIL_BLITTER_ATTRIB_NONE, NULL);
1098c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
1099c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_vertex_states(ctx);
1100c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_fragment_states(ctx);
1101c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_fb_state(ctx);
1102c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_unset_running_flag(ctx);
110355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
1104f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1105c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie/* draw a rectangle across a region using a custom dsa stage - for r600g */
1106c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlievoid util_blitter_custom_depth_stencil(struct blitter_context *blitter,
1107c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie				       struct pipe_surface *zsurf,
1108c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie				       struct pipe_surface *cbsurf,
1109c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie				       void *dsa_stage, float depth)
1110f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák{
1111f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
1112f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   struct pipe_context *pipe = ctx->base.pipe;
1113f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   struct pipe_framebuffer_state fb_state;
1114f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1115c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   assert(zsurf->texture);
1116c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   if (!zsurf->texture)
1117f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák      return;
1118f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1119f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   /* check the saved state */
1120c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_set_running_flag(ctx);
1121c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_vertex_states(ctx);
1122c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_fragment_states(ctx);
1123c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_check_saved_fb_state(ctx);
1124f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1125c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   /* bind states */
1126c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   pipe->bind_blend_state(pipe, ctx->blend_write_color);
1127c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   pipe->bind_depth_stencil_alpha_state(pipe, dsa_stage);
1128f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1129f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
1130f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0));
11315d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
11324c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák   if (ctx->has_geometry_shader)
11334c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák      pipe->bind_gs_state(pipe, NULL);
1134f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
1135f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1136f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   /* set a framebuffer state */
1137c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   fb_state.width = zsurf->width;
1138c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   fb_state.height = zsurf->height;
1139c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   fb_state.nr_cbufs = 1;
1140c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   if (cbsurf) {
1141c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie	   fb_state.cbufs[0] = cbsurf;
1142c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie	   fb_state.nr_cbufs = 1;
1143c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   } else {
1144c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie	   fb_state.cbufs[0] = NULL;
1145c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie	   fb_state.nr_cbufs = 0;
1146c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   }
1147c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   fb_state.zsbuf = zsurf;
1148f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   pipe->set_framebuffer_state(pipe, &fb_state);
1149f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1150c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   blitter_set_dst_dimensions(ctx, zsurf->width, zsurf->height);
1151c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   blitter->draw_rectangle(blitter, 0, 0, zsurf->width, zsurf->height, depth,
1152f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák                           UTIL_BLITTER_ATTRIB_NONE, NULL);
1153c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák
1154c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_vertex_states(ctx);
1155c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_fragment_states(ctx);
1156c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_restore_fb_state(ctx);
1157c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák   blitter_unset_running_flag(ctx);
1158f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák}
1159