u_blitter.c revision 6dd284f7c8fac22f64c13fdf9909094f5ec59086
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;
10755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák};
10855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
1099be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter,
1109be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   unsigned x, unsigned y,
1119be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   unsigned width, unsigned height,
1129be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   float depth,
1139be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   enum blitter_attrib_type type,
1146dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                                   const union pipe_color_union *attrib);
1159be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
1169be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
11755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context *util_blitter_create(struct pipe_context *pipe)
11855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
11955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx;
1200c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   struct pipe_blend_state blend;
1210c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   struct pipe_depth_stencil_alpha_state dsa;
1220c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   struct pipe_rasterizer_state rs_state;
12385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_sampler_state *sampler_state;
124ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   struct pipe_vertex_element velem[2];
12585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   unsigned i;
12655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
12755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx = CALLOC_STRUCT(blitter_context_priv);
12855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   if (!ctx)
12955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      return NULL;
13055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
1319b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.pipe = pipe;
1329be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   ctx->base.draw_rectangle = blitter_draw_rectangle;
13355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
13455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* init state objects for them to be considered invalid */
1359b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_blend_state = INVALID_PTR;
1369b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_dsa_state = INVALID_PTR;
1379b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_rs_state = INVALID_PTR;
1389b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_fs = INVALID_PTR;
1399b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_vs = INVALID_PTR;
1409b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_velem_state = INVALID_PTR;
1419b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_fb_state.nr_cbufs = ~0;
1429b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_num_sampler_views = ~0;
1439b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_num_sampler_states = ~0;
1449b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_num_vertex_buffers = ~0;
14555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
14655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* blend state objects */
1470c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   memset(&blend, 0, sizeof(blend));
14855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->blend_keep_color = pipe->create_blend_state(pipe, &blend);
14955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
150eba1e2a44718bea398e49d496a78ee002c9922b8Roland Scheidegger   blend.rt[0].colormask = PIPE_MASK_RGBA;
15155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->blend_write_color = pipe->create_blend_state(pipe, &blend);
15255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
15355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* depth stencil alpha state objects */
1540c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   memset(&dsa, 0, sizeof(dsa));
15555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->dsa_keep_depth_stencil =
1561a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
15755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
158f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   dsa.depth.enabled = 1;
159f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   dsa.depth.writemask = 1;
160f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   dsa.depth.func = PIPE_FUNC_ALWAYS;
16155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->dsa_write_depth_keep_stencil =
1621a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
1631a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger
1641a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].enabled = 1;
1651a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].func = PIPE_FUNC_ALWAYS;
1661a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE;
1671a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE;
1681a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE;
1691a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].valuemask = 0xff;
1701a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].writemask = 0xff;
1711a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   ctx->dsa_write_depth_stencil =
1721a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
173a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
174a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
175a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   dsa.depth.enabled = 0;
176a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   dsa.depth.writemask = 0;
177a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   ctx->dsa_keep_depth_write_stencil =
178a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
17955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
18055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* sampler state */
18185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state = &ctx->template_sampler_state;
18285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state->wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
18385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state->wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
18485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state->wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
1852ee0d19ccf768c4c12c3c3476c1cd7eff508629aCorbin Simpson   sampler_state->normalized_coords = TRUE;
18685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* The sampler state objects which sample from a specified mipmap level
18785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák    * are created on-demand. */
18855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
18955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* rasterizer state */
19055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   memset(&rs_state, 0, sizeof(rs_state));
1910bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell   rs_state.cull_face = PIPE_FACE_NONE;
19255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   rs_state.gl_rasterization_rules = 1;
1931c75edf3e8ccc97f5f91f42f99c1f8db30b25fc4Corbin Simpson   rs_state.flatshade = 1;
19455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->rs_state = pipe->create_rasterizer_state(pipe, &rs_state);
19555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
196ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   /* vertex elements state */
197ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   memset(&velem[0], 0, sizeof(velem[0]) * 2);
198ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   for (i = 0; i < 2; i++) {
199ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].src_offset = i * 4 * sizeof(float);
200ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
201ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   }
202ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   ctx->velem_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]);
203ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger
20485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* fragment shaders are created on-demand */
20585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
2065d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   /* vertex shader */
20755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   {
20855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      const uint semantic_names[] = { TGSI_SEMANTIC_POSITION,
20955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                      TGSI_SEMANTIC_GENERIC };
21055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      const uint semantic_indices[] = { 0, 0 };
2115d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák      ctx->vs =
21255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         util_make_vertex_passthrough_shader(pipe, 2, semantic_names,
21355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                             semantic_indices);
21455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
21555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
21655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* set invariant vertex coordinates */
21755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
21855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][0][3] = 1; /*v.w*/
21955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
22055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* create the vertex buffer */
2212a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák   ctx->vbuf = pipe_user_buffer_create(ctx->base.pipe->screen,
2222a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák                                       ctx->vertices,
2232a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák                                       sizeof(ctx->vertices),
2242a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák                                       PIPE_BIND_VERTEX_BUFFER);
22555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
2269b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   return &ctx->base;
22755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
22855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
22955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_destroy(struct blitter_context *blitter)
23055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
23155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
2329b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = blitter->pipe;
23355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
23455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
23555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_blend_state(pipe, ctx->blend_write_color);
23655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_blend_state(pipe, ctx->blend_keep_color);
23755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
23855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_depth_stencil_alpha_state(pipe,
23955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                          ctx->dsa_write_depth_keep_stencil);
2401a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil);
241a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil);
2426a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson
24355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_rasterizer_state(pipe, ctx->rs_state);
2445d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->delete_vs_state(pipe, ctx->vs);
245ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->delete_vertex_elements_state(pipe, ctx->velem_state);
24655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
247ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   for (i = 0; i < PIPE_MAX_TEXTURE_TYPES; i++) {
24885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->fs_texfetch_col[i])
24985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_fs_state(pipe, ctx->fs_texfetch_col[i]);
25085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->fs_texfetch_depth[i])
25185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_fs_state(pipe, ctx->fs_texfetch_depth[i]);
25255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
253ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
254b51f6e7c2350f637337fc3935436e2f99f669dfdJoakim Sindholt   for (i = 0; i <= PIPE_MAX_COLOR_BUFS; i++)
25585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->fs_col[i])
25685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_fs_state(pipe, ctx->fs_col[i]);
25755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
258d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   for (i = 0; i < PIPE_MAX_TEXTURE_LEVELS * 2; i++)
25985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->sampler_state[i])
26085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_sampler_state(pipe, ctx->sampler_state[i]);
261ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
262287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   pipe_resource_reference(&ctx->vbuf, NULL);
26355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   FREE(ctx);
26455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
26555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
26655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_check_saved_CSOs(struct blitter_context_priv *ctx)
26755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
268ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák   if (ctx->base.running) {
2699a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák      _debug_printf("u_blitter: Caught recursion on save. "
2709a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák                    "This is a driver bug.\n");
2719a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák   }
272ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák   ctx->base.running = TRUE;
2739a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák
27455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* make sure these CSOs have been saved */
2759b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   assert(ctx->base.saved_blend_state != INVALID_PTR &&
2769b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák          ctx->base.saved_dsa_state != INVALID_PTR &&
2779b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák          ctx->base.saved_rs_state != INVALID_PTR &&
2789b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák          ctx->base.saved_fs != INVALID_PTR &&
2799b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák          ctx->base.saved_vs != INVALID_PTR &&
2809b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák          ctx->base.saved_velem_state != INVALID_PTR);
28155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
28255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
28355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_restore_CSOs(struct blitter_context_priv *ctx)
28455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
2859b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
2868f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák   unsigned i;
28755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
28855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* restore the state objects which are always required to be saved */
2899b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->bind_rasterizer_state(pipe, ctx->base.saved_rs_state);
2909b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->bind_vs_state(pipe, ctx->base.saved_vs);
2919b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->bind_vertex_elements_state(pipe, ctx->base.saved_velem_state);
29255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
2939b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_rs_state = INVALID_PTR;
2949b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_vs = INVALID_PTR;
2959b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_velem_state = INVALID_PTR;
29655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
297363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák   /* restore the state objects which are required to be saved for clear/copy
298363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák    */
299363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák   if (ctx->base.saved_blend_state != INVALID_PTR) {
300363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák      pipe->bind_blend_state(pipe, ctx->base.saved_blend_state);
301363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák      ctx->base.saved_blend_state = INVALID_PTR;
302363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák   }
303363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák   if (ctx->base.saved_dsa_state != INVALID_PTR) {
304363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák      pipe->bind_depth_stencil_alpha_state(pipe, ctx->base.saved_dsa_state);
305363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák      ctx->base.saved_dsa_state = INVALID_PTR;
306363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák   }
307363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák   if (ctx->base.saved_fs != INVALID_PTR) {
308363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák      pipe->bind_fs_state(pipe, ctx->base.saved_fs);
309363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák      ctx->base.saved_fs = INVALID_PTR;
310363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák   }
311363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák
3129b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->set_stencil_ref(pipe, &ctx->base.saved_stencil_ref);
3139b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->set_viewport_state(pipe, &ctx->base.saved_viewport);
3149b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->set_clip_state(pipe, &ctx->base.saved_clip);
315932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
3169b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   if (ctx->base.saved_fb_state.nr_cbufs != ~0) {
3179b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      pipe->set_framebuffer_state(pipe, &ctx->base.saved_fb_state);
318a922725118333e016a357008f37105c23c6f54bcMarek Olšák      util_unreference_framebuffer_state(&ctx->base.saved_fb_state);
3199b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      ctx->base.saved_fb_state.nr_cbufs = ~0;
32055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
32155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3229b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   if (ctx->base.saved_num_sampler_states != ~0) {
32355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_fragment_sampler_states(pipe,
3249b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák                                         ctx->base.saved_num_sampler_states,
3259b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák                                         ctx->base.saved_sampler_states);
3269b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      ctx->base.saved_num_sampler_states = ~0;
32755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
32855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3299b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   if (ctx->base.saved_num_sampler_views != ~0) {
330f6106566081978f663cf08e54bb8908cb58a5316Michal Krol      pipe->set_fragment_sampler_views(pipe,
3319b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák                                       ctx->base.saved_num_sampler_views,
3329b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák                                       ctx->base.saved_sampler_views);
3330b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák
3349b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      for (i = 0; i < ctx->base.saved_num_sampler_views; i++)
3359b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák         pipe_sampler_view_reference(&ctx->base.saved_sampler_views[i],
3360b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák                                     NULL);
3370b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák
3389b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      ctx->base.saved_num_sampler_views = ~0;
33955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
34064aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri
3419b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   if (ctx->base.saved_num_vertex_buffers != ~0) {
34264aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri      pipe->set_vertex_buffers(pipe,
3439b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák                               ctx->base.saved_num_vertex_buffers,
3449b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák                               ctx->base.saved_vertex_buffers);
3458f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák
3469b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      for (i = 0; i < ctx->base.saved_num_vertex_buffers; i++) {
3479b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák         if (ctx->base.saved_vertex_buffers[i].buffer) {
3489b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák            pipe_resource_reference(&ctx->base.saved_vertex_buffers[i].buffer,
3498f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák                                    NULL);
3508f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák         }
3518f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák      }
3529b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      ctx->base.saved_num_vertex_buffers = ~0;
35364aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri   }
3549a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák
355ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák   if (!ctx->base.running) {
3569a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák      _debug_printf("u_blitter: Caught recursion on restore. "
3579a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák                    "This is a driver bug.\n");
3589a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák   }
359ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák   ctx->base.running = FALSE;
36055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
36155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
36255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_rectangle(struct blitter_context_priv *ctx,
36355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  unsigned x1, unsigned y1,
36455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  unsigned x2, unsigned y2,
36555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  float depth)
36655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
36755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
36855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
36955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* set vertex positions */
3703bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[0][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v0.x*/
3713bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[0][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v0.y*/
37255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3733bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[1][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v1.x*/
3743bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[1][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v1.y*/
37555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3763bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[2][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v2.x*/
3773bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[2][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v2.y*/
37855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3793bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[3][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v3.x*/
3803bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[3][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v3.y*/
38155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
38255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
38355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][0][2] = depth; /*z*/
384932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
385932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   /* viewport */
3863bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->viewport.scale[0] = 0.5f * ctx->dst_width;
3873bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->viewport.scale[1] = 0.5f * ctx->dst_height;
388ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák   ctx->viewport.scale[2] = 1.0f;
389932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->viewport.scale[3] = 1.0f;
3903bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->viewport.translate[0] = 0.5f * ctx->dst_width;
3913bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->viewport.translate[1] = 0.5f * ctx->dst_height;
392ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák   ctx->viewport.translate[2] = 0.0f;
393932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->viewport.translate[3] = 0.0f;
3949b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.pipe->set_viewport_state(ctx->base.pipe, &ctx->viewport);
395932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
396932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   /* clip */
3979b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.pipe->set_clip_state(ctx->base.pipe, &ctx->clip);
39855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
39955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
40055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_clear_color(struct blitter_context_priv *ctx,
4016dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                                    const union pipe_color_union *color)
40255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
40355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
40455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
4056dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie   if (color) {
40616d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      for (i = 0; i < 4; i++) {
4076dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie         ctx->vertices[i][1][0] = color->f[0];
4086dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie         ctx->vertices[i][1][1] = color->f[1];
4096dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie         ctx->vertices[i][1][2] = color->f[2];
4106dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie         ctx->vertices[i][1][3] = color->f[3];
41116d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      }
412fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák   } else {
41316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      for (i = 0; i < 4; i++) {
41416d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][0] = 0;
41516d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][1] = 0;
41616d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][2] = 0;
41716d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][3] = 0;
41816d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      }
41955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
42055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
42155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
422d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieristatic void get_texcoords(struct pipe_resource *src,
4234c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          unsigned level,
4244c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          unsigned x1, unsigned y1,
4254c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          unsigned x2, unsigned y2,
4264c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          boolean normalized, float out[4])
427749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{
428d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   if(normalized)
429d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   {
4304c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      out[0] = x1 / (float)u_minify(src->width0,  level);
4314c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      out[1] = y1 / (float)u_minify(src->height0, level);
4324c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      out[2] = x2 / (float)u_minify(src->width0,  level);
4334c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      out[3] = y2 / (float)u_minify(src->height0, level);
434d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   }
435d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   else
436d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   {
437d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      out[0] = x1;
438d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      out[1] = y1;
439d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      out[2] = x2;
440d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      out[3] = y2;
441d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   }
442749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák}
443749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák
444749e24521a31178d2b647aa2954c3eecd597b799Marek Olšákstatic void set_texcoords_in_vertices(const float coord[4],
445749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák                                      float *out, unsigned stride)
446749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{
447749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = coord[0]; /*t0.s*/
448749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = coord[1]; /*t0.t*/
449749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out += stride;
450749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = coord[2]; /*t1.s*/
451749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = coord[1]; /*t1.t*/
452749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out += stride;
453749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = coord[2]; /*t2.s*/
454749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = coord[3]; /*t2.t*/
455749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out += stride;
456749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = coord[0]; /*t3.s*/
457749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = coord[3]; /*t3.t*/
458749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák}
459749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák
46055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_2d(struct blitter_context_priv *ctx,
461876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     struct pipe_resource *src,
4624c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                     unsigned level,
46355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x1, unsigned y1,
46455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x2, unsigned y2)
46555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
466749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   unsigned i;
467749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   float coord[4];
46855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
4694c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   get_texcoords(src, level, x1, y1, x2, y2, TRUE, coord);
470749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   set_texcoords_in_vertices(coord, &ctx->vertices[0][1][0], 8);
47155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
47255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++) {
47355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][2] = 0; /*r*/
47455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][3] = 1; /*q*/
47555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
47655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
47755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
47855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_3d(struct blitter_context_priv *ctx,
479876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     struct pipe_resource *src,
4804c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                     unsigned level,
481876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     unsigned zslice,
48255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x1, unsigned y1,
483274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák                                     unsigned x2, unsigned y2,
484274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák				     boolean normalized)
48555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
48655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
487274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák   float r = normalized ? zslice / (float)u_minify(src->depth0, level) : zslice;
48855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
4894c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   blitter_set_texcoords_2d(ctx, src, level, x1, y1, x2, y2);
49055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
49155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
49255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][2] = r; /*r*/
49355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
49455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
495274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšákstatic void blitter_set_texcoords_1d_array(struct blitter_context_priv *ctx,
496274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák                                           struct pipe_resource *src,
497274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák                                           unsigned level,
498274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák                                           unsigned zslice,
499274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák                                           unsigned x1, unsigned x2)
500274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák{
501274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák   int i;
502274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák   float r = zslice;
503274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák
504274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák   blitter_set_texcoords_2d(ctx, src, level, x1, 0, x2, 0);
505274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák
506274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák   for (i = 0; i < 4; i++)
507274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák      ctx->vertices[i][1][1] = r; /*r*/
508274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák}
509274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák
51055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_cube(struct blitter_context_priv *ctx,
511876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                       struct pipe_resource *src,
5124c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                       unsigned level, unsigned face,
51355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                       unsigned x1, unsigned y1,
51455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                       unsigned x2, unsigned y2)
51555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
51655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
517749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   float coord[4];
518d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul   float st[4][2];
519d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul
5204c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   get_texcoords(src, level, x1, y1, x2, y2, TRUE, coord);
521749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   set_texcoords_in_vertices(coord, &st[0][0], 2);
52255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
5234c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   util_map_texcoords2d_onto_cubemap(face,
52455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     /* pointer, stride in floats */
52555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     &st[0][0], 2,
52655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     &ctx->vertices[0][1][0], 8);
52755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
52855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
52955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][3] = 1; /*q*/
53055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
53155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
5323bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákstatic void blitter_set_dst_dimensions(struct blitter_context_priv *ctx,
5333bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák                                       unsigned width, unsigned height)
5343bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák{
5353bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->dst_width = width;
5363bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->dst_height = height;
5373bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák}
5383bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák
53985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
54085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid **blitter_get_sampler_state(struct blitter_context_priv *ctx,
541d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri                                 int miplevel, boolean normalized)
54285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
5439b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
54485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_sampler_state *sampler_state = &ctx->template_sampler_state;
54585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
54685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(miplevel < PIPE_MAX_TEXTURE_LEVELS);
54785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
54885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Create the sampler state on-demand. */
549d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   if (!ctx->sampler_state[miplevel * 2 + normalized]) {
55085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      sampler_state->lod_bias = miplevel;
55185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      sampler_state->min_lod = miplevel;
55285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      sampler_state->max_lod = miplevel;
553d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      sampler_state->normalized_coords = normalized;
55485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
555d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      ctx->sampler_state[miplevel * 2 + normalized] = pipe->create_sampler_state(pipe,
55685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                                                sampler_state);
55785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   }
55885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
55985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Return void** so that it can be passed to bind_fragment_sampler_states
56085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák    * directly. */
561d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   return &ctx->sampler_state[miplevel * 2 + normalized];
56285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
56385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
56485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
56585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_col(struct blitter_context_priv *ctx, unsigned num_cbufs)
56685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
5679b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
56885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
56985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(num_cbufs <= PIPE_MAX_COLOR_BUFS);
57085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
571677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   if (!ctx->fs_col[num_cbufs])
572677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas      ctx->fs_col[num_cbufs] =
5735d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák         util_make_fragment_cloneinput_shader(pipe, num_cbufs,
5745d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák                                              TGSI_SEMANTIC_GENERIC,
5755d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák                                              TGSI_INTERPOLATE_LINEAR);
57685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
577677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   return ctx->fs_col[num_cbufs];
57885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
57985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
580d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul/** Convert PIPE_TEXTURE_x to TGSI_TEXTURE_x */
581d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paulstatic unsigned
5823bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákpipe_tex_to_tgsi_tex(enum pipe_texture_target pipe_tex_target)
583d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul{
584d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   switch (pipe_tex_target) {
585d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_1D:
586d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_1D;
587d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_2D:
588d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_2D;
589ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri   case PIPE_TEXTURE_RECT:
590cbe367227959a32ff20e146106162a81d2be02c3Luca Barbieri      return TGSI_TEXTURE_RECT;
591d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_3D:
592d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_3D;
593d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_CUBE:
594d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_CUBE;
595274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák   case PIPE_TEXTURE_1D_ARRAY:
596274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák      return TGSI_TEXTURE_1D_ARRAY;
597274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák   case PIPE_TEXTURE_2D_ARRAY:
598274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák      return TGSI_TEXTURE_2D_ARRAY;
599d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   default:
600d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      assert(0 && "unexpected texture target");
601d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_UNKNOWN;
602d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   }
603d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul}
604d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
605d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
60685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
60785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_col(struct blitter_context_priv *ctx,
60885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                  unsigned tex_target)
60985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
6109b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
61185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
61285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(tex_target < PIPE_MAX_TEXTURE_TYPES);
61385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
61485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Create the fragment shader on-demand. */
61585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   if (!ctx->fs_texfetch_col[tex_target]) {
616d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target);
617d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
618d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      ctx->fs_texfetch_col[tex_target] =
619d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul        util_make_fragment_tex_shader(pipe, tgsi_tex, TGSI_INTERPOLATE_LINEAR);
62085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   }
62185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
62285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   return ctx->fs_texfetch_col[tex_target];
62385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
62485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
62585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
62685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_depth(struct blitter_context_priv *ctx,
62785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                    unsigned tex_target)
62885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
6299b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
63085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
63185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(tex_target < PIPE_MAX_TEXTURE_TYPES);
63285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
63385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Create the fragment shader on-demand. */
63485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   if (!ctx->fs_texfetch_depth[tex_target]) {
635d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target);
636d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
637d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      ctx->fs_texfetch_depth[tex_target] =
638d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul         util_make_fragment_tex_shader_writedepth(pipe, tgsi_tex,
639d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul                                                  TGSI_INTERPOLATE_LINEAR);
64085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   }
64185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
64285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   return ctx->fs_texfetch_depth[tex_target];
64385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
64485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
6459be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter,
6469be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   unsigned x1, unsigned y1,
6479be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   unsigned x2, unsigned y2,
6489be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   float depth,
6499be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   enum blitter_attrib_type type,
6506dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                                   const union pipe_color_union *attrib)
6519be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák{
6529be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
6539be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
6549be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   switch (type) {
6559be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      case UTIL_BLITTER_ATTRIB_COLOR:
6569be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         blitter_set_clear_color(ctx, attrib);
6579be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         break;
6589be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
6599be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      case UTIL_BLITTER_ATTRIB_TEXCOORD:
6606dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie         set_texcoords_in_vertices(attrib->f, &ctx->vertices[0][1][0], 8);
6619be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         break;
6629be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
6639be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      default:;
6649be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   }
6659be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
6669be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter_set_rectangle(ctx, x1, y1, x2, y2, depth);
667588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák   ctx->base.pipe->redefine_user_buffer(ctx->base.pipe, ctx->vbuf,
668588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák                                        0, ctx->vbuf->width0);
669d5062fb3a315c46d77d5c954a3e3c14be1907d33Marek Olšák   util_draw_vertex_buffer(ctx->base.pipe, NULL, ctx->vbuf, 0,
6702a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák                           PIPE_PRIM_TRIANGLE_FAN, 4, 2);
6719be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák}
6729be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
673db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákstatic void util_blitter_clear_custom(struct blitter_context *blitter,
674db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      unsigned width, unsigned height,
675db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      unsigned num_cbufs,
676db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      unsigned clear_buffers,
6776dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                                      const union pipe_color_union *color,
678db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      double depth, unsigned stencil,
679db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      void *custom_blend, void *custom_dsa)
68055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
68155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
6829b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
6836a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson   struct pipe_stencil_ref sr = { { 0 } };
68455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
685ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   assert(num_cbufs <= PIPE_MAX_COLOR_BUFS);
68655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
68755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_check_saved_CSOs(ctx);
68855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
68955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* bind CSOs */
690db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   if (custom_blend) {
691db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák      pipe->bind_blend_state(pipe, custom_blend);
692db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else if (clear_buffers & PIPE_CLEAR_COLOR) {
69355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_write_color);
694db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else {
69555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_keep_color);
696db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   }
69755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
698db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   if (custom_dsa) {
699db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe, custom_dsa);
700db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else if ((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) {
7011a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil);
702db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else if (clear_buffers & PIPE_CLEAR_DEPTH) {
703a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil);
704db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else if (clear_buffers & PIPE_CLEAR_STENCIL) {
705a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil);
706db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else {
70755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
708db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   }
709db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák
710db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   sr.ref_value[0] = stencil & 0xff;
711db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   pipe->set_stencil_ref(pipe, &sr);
71255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
71355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
714ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
71585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, num_cbufs));
7165d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
71755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
7183bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   blitter_set_dst_dimensions(ctx, width, height);
7199be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter->draw_rectangle(blitter, 0, 0, width, height, depth,
7206dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                           UTIL_BLITTER_ATTRIB_COLOR, color);
72155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_restore_CSOs(ctx);
72255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
72355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
724db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid util_blitter_clear(struct blitter_context *blitter,
725db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                        unsigned width, unsigned height,
726db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                        unsigned num_cbufs,
727db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                        unsigned clear_buffers,
7286dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                        const union pipe_color_union *color,
729db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                        double depth, unsigned stencil)
730db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák{
731db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   util_blitter_clear_custom(blitter, width, height, num_cbufs,
7326dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                             clear_buffers, color, depth, stencil,
733db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                             NULL, NULL);
734db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák}
735db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák
736db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid util_blitter_clear_depth_custom(struct blitter_context *blitter,
737db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                     unsigned width, unsigned height,
738db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                     double depth, void *custom_dsa)
739db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák{
7406dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie    static const union pipe_color_union color;
741db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák    util_blitter_clear_custom(blitter, width, height, 0,
7426dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                              0, &color, depth, 0, NULL, custom_dsa);
743db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák}
744db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák
745876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákstatic
746876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákboolean is_overlap(unsigned sx1, unsigned sx2, unsigned sy1, unsigned sy2,
747876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                   unsigned dx1, unsigned dx2, unsigned dy1, unsigned dy2)
748deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie{
749876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   return sx1 < dx2 && sx2 > dx1 && sy1 < dy2 && sy2 > dy1;
750deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie}
751deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie
752233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšákvoid util_blitter_copy_texture(struct blitter_context *blitter,
753233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák                               struct pipe_resource *dst,
754233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák                               unsigned dstlevel,
755233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák                               unsigned dstx, unsigned dsty, unsigned dstz,
756233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák                               struct pipe_resource *src,
757233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák                               unsigned srclevel,
758233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák                               const struct pipe_box *srcbox,
759233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák                               boolean ignore_stencil)
76055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
76155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
7629b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
763876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   struct pipe_screen *screen = pipe->screen;
7644c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   struct pipe_surface *dstsurf, surf_templ;
76555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_framebuffer_state fb_state;
766f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   struct pipe_sampler_view viewTempl, *view;
767876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   unsigned bind;
7684c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   unsigned width = srcbox->width;
7694c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   unsigned height = srcbox->height;
770876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   boolean is_stencil, is_depth;
771d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   boolean normalized;
772876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
773876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Give up if textures are not set. */
774876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   assert(dst && src);
775876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   if (!dst || !src)
776876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      return;
777876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
778876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Sanity checks. */
779876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   if (dst == src) {
7804c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      assert(!is_overlap(srcbox->x, srcbox->x + width, srcbox->y, srcbox->y + height,
781876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                         dstx, dstx + width, dsty, dsty + height));
782876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   }
783876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   assert(src->target < PIPE_MAX_TEXTURE_TYPES);
7844c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   /* XXX should handle 3d regions */
7854c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   assert(srcbox->depth == 1);
786876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
787876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Is this a ZS format? */
788876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   is_depth = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 0) != 0;
789876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   is_stencil = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 1) != 0;
790876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
791876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   if (is_depth || is_stencil)
792876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      bind = PIPE_BIND_DEPTH_STENCIL;
793876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   else
794876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      bind = PIPE_BIND_RENDER_TARGET;
795876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
796876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Check if we can sample from and render to the surfaces. */
797876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* (assuming copying a stencil buffer is not possible) */
798cec2082ae515bc91e6b29084ba4b8deac28ef923Stéphane Marchesin   if ((!ignore_stencil && is_stencil) ||
799876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák       !screen->is_format_supported(screen, dst->format, dst->target,
800e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák                                    dst->nr_samples, bind) ||
801876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák       !screen->is_format_supported(screen, src->format, src->target,
802e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák                                    src->nr_samples, PIPE_BIND_SAMPLER_VIEW)) {
803ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák      ctx->base.running = TRUE;
8044c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      util_resource_copy_region(pipe, dst, dstlevel, dstx, dsty, dstz,
8054c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                src, srclevel, srcbox);
806ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák      ctx->base.running = FALSE;
807876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      return;
808876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   }
809876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
8104c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   /* Get surface. */
8114c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   memset(&surf_templ, 0, sizeof(surf_templ));
8124c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   u_surface_default_template(&surf_templ, dst, bind);
813ab21147c899ba1506df38438b6750d3dc5eaabdfHenri Verbeet   surf_templ.format = util_format_linear(dst->format);
8144c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   surf_templ.u.tex.level = dstlevel;
8154c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   surf_templ.u.tex.first_layer = dstz;
8164c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   surf_templ.u.tex.last_layer = dstz;
8174c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   dstsurf = pipe->create_surface(pipe, dst, &surf_templ);
81855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
819876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Check whether the states are properly saved. */
820876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   blitter_check_saved_CSOs(ctx);
82155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   assert(blitter->saved_fb_state.nr_cbufs != ~0);
822f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   assert(blitter->saved_num_sampler_views != ~0);
82355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   assert(blitter->saved_num_sampler_states != ~0);
82455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
825876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Initialize framebuffer state. */
826876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   fb_state.width = dstsurf->width;
827876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   fb_state.height = dstsurf->height;
82855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
82955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   if (is_depth) {
83055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_keep_color);
83155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe,
83255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                           ctx->dsa_write_depth_keep_stencil);
83385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      pipe->bind_fs_state(pipe,
834876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                          blitter_get_fs_texfetch_depth(ctx, src->target));
83555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
83655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      fb_state.nr_cbufs = 0;
837876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      fb_state.zsbuf = dstsurf;
83855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   } else {
83955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_write_color);
84055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
84185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      pipe->bind_fs_state(pipe,
842876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                          blitter_get_fs_texfetch_col(ctx, src->target));
84355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
84455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      fb_state.nr_cbufs = 1;
845876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      fb_state.cbufs[0] = dstsurf;
84655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      fb_state.zsbuf = 0;
84755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
84885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
849d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   normalized = src->target != PIPE_TEXTURE_RECT;
850d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri
851876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Initialize sampler view. */
852ab21147c899ba1506df38438b6750d3dc5eaabdfHenri Verbeet   u_sampler_view_default_template(&viewTempl, src, util_format_linear(src->format));
853876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   view = pipe->create_sampler_view(pipe, src, &viewTempl);
854f6106566081978f663cf08e54bb8908cb58a5316Michal Krol
855876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Set rasterizer state, shaders, and textures. */
85655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
8575d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
85885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   pipe->bind_fragment_sampler_states(pipe, 1,
8594c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                      blitter_get_sampler_state(ctx, srclevel, normalized));
860ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
861f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   pipe->set_fragment_sampler_views(pipe, 1, &view);
86255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->set_framebuffer_state(pipe, &fb_state);
86355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
8649be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height);
8659be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
866876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   switch (src->target) {
8679be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      /* Draw the quad with the draw_rectangle callback. */
86855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_1D:
86955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_2D:
870ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri      case PIPE_TEXTURE_RECT:
8719be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         {
8726dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie            /* Set texture coordinates. - use a pipe color union
8736dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie             * for interface purposes
8746dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie             */
8756dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie            union pipe_color_union coord;
8764c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            get_texcoords(src, srclevel, srcbox->x, srcbox->y,
8776dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                          srcbox->x+width, srcbox->y+height, normalized, coord.f);
8789be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
8799be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák            /* Draw. */
8809be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák            blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0,
8816dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                                    UTIL_BLITTER_ATTRIB_TEXCOORD, &coord);
8829be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         }
88355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         break;
8849be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
8859be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      /* Draw the quad with the generic codepath. */
886274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák      default:
8879be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         /* Set texture coordinates. */
888274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák         switch (src->target) {
889274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák         case PIPE_TEXTURE_1D_ARRAY:
890274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák            blitter_set_texcoords_1d_array(ctx, src, srclevel, srcbox->y,
891274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák                                           srcbox->x, srcbox->x + width);
892274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák            break;
893274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák
894274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák         case PIPE_TEXTURE_2D_ARRAY:
895274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák         case PIPE_TEXTURE_3D:
8964c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            blitter_set_texcoords_3d(ctx, src, srclevel, srcbox->z,
8974c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                     srcbox->x, srcbox->y,
898274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák                                     srcbox->x + width, srcbox->y + height,
899274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák                                     src->target == PIPE_TEXTURE_3D);
900274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák            break;
901274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák
902274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák         case PIPE_TEXTURE_CUBE:
9034c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            blitter_set_texcoords_cube(ctx, src, srclevel, srcbox->z,
9044c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                       srcbox->x, srcbox->y,
9054c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                       srcbox->x + width, srcbox->y + height);
906274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák            break;
907274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák
908274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák         default:
909274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák            assert(0);
910274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák         }
9119be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
9129be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         /* Draw. */
9139be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         blitter_set_rectangle(ctx, dstx, dsty, dstx+width, dsty+height, 0);
914588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák         ctx->base.pipe->redefine_user_buffer(ctx->base.pipe, ctx->vbuf,
915588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák                                              0, ctx->vbuf->width0);
916d5062fb3a315c46d77d5c954a3e3c14be1907d33Marek Olšák         util_draw_vertex_buffer(ctx->base.pipe, NULL, ctx->vbuf, 0,
9172a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák                                 PIPE_PRIM_TRIANGLE_FAN, 4, 2);
91855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         break;
91955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
92055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
92155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_restore_CSOs(ctx);
922876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
923876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   pipe_surface_reference(&dstsurf, NULL);
92457c3f70018bc7cd44eafd55d8147691a3c109b91Marek Olšák   pipe_sampler_view_reference(&view, NULL);
92555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
92655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
927a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a color surface to a constant value. */
928a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_render_target(struct blitter_context *blitter,
929a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      struct pipe_surface *dstsurf,
9306dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                                      const union pipe_color_union *color,
931a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned dstx, unsigned dsty,
932a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned width, unsigned height)
93355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
93455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
9359b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
93655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_framebuffer_state fb_state;
93755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
938a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   assert(dstsurf->texture);
939a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if (!dstsurf->texture)
94055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      return;
94155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
94255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* check the saved state */
94355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_check_saved_CSOs(ctx);
94455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   assert(blitter->saved_fb_state.nr_cbufs != ~0);
94555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
94655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* bind CSOs */
94755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_blend_state(pipe, ctx->blend_write_color);
94855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
94955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
95085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1));
9515d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
952ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
95355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
95455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* set a framebuffer state */
95559e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   fb_state.width = dstsurf->width;
95659e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   fb_state.height = dstsurf->height;
95755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   fb_state.nr_cbufs = 1;
95859e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   fb_state.cbufs[0] = dstsurf;
95955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   fb_state.zsbuf = 0;
96055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->set_framebuffer_state(pipe, &fb_state);
96155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
9623bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height);
9639be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0,
9646dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                           UTIL_BLITTER_ATTRIB_COLOR, color);
96555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_restore_CSOs(ctx);
966a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger}
96759e51d9640c242a7c919472d935a91889c7840c9Marek Olšák
968a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a depth stencil surface. */
969a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_depth_stencil(struct blitter_context *blitter,
970a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      struct pipe_surface *dstsurf,
971a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned clear_flags,
972a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      double depth,
973a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned stencil,
974a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned dstx, unsigned dsty,
975a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned width, unsigned height)
976a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger{
977a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
9789b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
979a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct pipe_framebuffer_state fb_state;
980a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct pipe_stencil_ref sr = { { 0 } };
981a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
982a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   assert(dstsurf->texture);
983a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if (!dstsurf->texture)
984a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      return;
985a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
986a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   /* check the saved state */
987a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   blitter_check_saved_CSOs(ctx);
988a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   assert(blitter->saved_fb_state.nr_cbufs != ~0);
989a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
990a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   /* bind CSOs */
991a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_blend_state(pipe, ctx->blend_keep_color);
992a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if ((clear_flags & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) {
993a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      sr.ref_value[0] = stencil & 0xff;
994a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil);
995a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->set_stencil_ref(pipe, &sr);
996a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
997a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else if (clear_flags & PIPE_CLEAR_DEPTH) {
998a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil);
999a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
1000a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else if (clear_flags & PIPE_CLEAR_STENCIL) {
1001a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      sr.ref_value[0] = stencil & 0xff;
1002a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil);
1003a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->set_stencil_ref(pipe, &sr);
1004a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
1005a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else
1006a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      /* hmm that should be illegal probably, or make it a no-op somewhere */
1007a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
1008a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
1009a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
1010a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0));
10115d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
1012a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
1013a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
1014a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   /* set a framebuffer state */
1015a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.width = dstsurf->width;
1016a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.height = dstsurf->height;
1017a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.nr_cbufs = 0;
1018a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.cbufs[0] = 0;
1019a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.zsbuf = dstsurf;
1020a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->set_framebuffer_state(pipe, &fb_state);
1021a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
10223bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height);
10239be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, depth,
10249be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                           UTIL_BLITTER_ATTRIB_NONE, NULL);
1025a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   blitter_restore_CSOs(ctx);
102655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
1027f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1028c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie/* draw a rectangle across a region using a custom dsa stage - for r600g */
1029c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlievoid util_blitter_custom_depth_stencil(struct blitter_context *blitter,
1030c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie				       struct pipe_surface *zsurf,
1031c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie				       struct pipe_surface *cbsurf,
1032c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie				       void *dsa_stage, float depth)
1033f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák{
1034f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
1035f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   struct pipe_context *pipe = ctx->base.pipe;
1036f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   struct pipe_framebuffer_state fb_state;
1037f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1038c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   assert(zsurf->texture);
1039c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   if (!zsurf->texture)
1040f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák      return;
1041f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1042f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   /* check the saved state */
1043f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   blitter_check_saved_CSOs(ctx);
1044f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   assert(blitter->saved_fb_state.nr_cbufs != ~0);
1045f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1046f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   /* bind CSOs */
1047c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   pipe->bind_blend_state(pipe, ctx->blend_write_color);
1048c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   pipe->bind_depth_stencil_alpha_state(pipe, dsa_stage);
1049f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1050f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
1051f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0));
10525d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
1053f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
1054f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1055f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   /* set a framebuffer state */
1056c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   fb_state.width = zsurf->width;
1057c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   fb_state.height = zsurf->height;
1058c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   fb_state.nr_cbufs = 1;
1059c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   if (cbsurf) {
1060c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie	   fb_state.cbufs[0] = cbsurf;
1061c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie	   fb_state.nr_cbufs = 1;
1062c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   } else {
1063c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie	   fb_state.cbufs[0] = NULL;
1064c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie	   fb_state.nr_cbufs = 0;
1065c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   }
1066c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   fb_state.zsbuf = zsurf;
1067f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   pipe->set_framebuffer_state(pipe, &fb_state);
1068f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1069c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   blitter_set_dst_dimensions(ctx, zsurf->width, zsurf->height);
1070c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   blitter->draw_rectangle(blitter, 0, 0, zsurf->width, zsurf->height, depth,
1071f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák                           UTIL_BLITTER_ATTRIB_NONE, NULL);
1072f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   blitter_restore_CSOs(ctx);
1073f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák}
1074