u_blitter.c revision db299a9f8244d53d9041fcdbd396a77ebe1f9e3e
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
29a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger * Blitter utility to facilitate acceleration of the clear, clear_render_target, clear_depth_stencil
30a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger * 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;
1079a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák
1089a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák   boolean running;
10955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák};
11055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
1119be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter,
1129be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   unsigned x, unsigned y,
1139be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   unsigned width, unsigned height,
1149be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   float depth,
1159be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   enum blitter_attrib_type type,
1169be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   const float attrib[4]);
1179be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
1189be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
11955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context *util_blitter_create(struct pipe_context *pipe)
12055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
12155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx;
1220c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   struct pipe_blend_state blend;
1230c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   struct pipe_depth_stencil_alpha_state dsa;
1240c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   struct pipe_rasterizer_state rs_state;
12585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_sampler_state *sampler_state;
126ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   struct pipe_vertex_element velem[2];
12785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   unsigned i;
12855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
12955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx = CALLOC_STRUCT(blitter_context_priv);
13055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   if (!ctx)
13155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      return NULL;
13255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
1339b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.pipe = pipe;
1349be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   ctx->base.draw_rectangle = blitter_draw_rectangle;
13555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
13655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* init state objects for them to be considered invalid */
1379b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_blend_state = INVALID_PTR;
1389b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_dsa_state = INVALID_PTR;
1399b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_rs_state = INVALID_PTR;
1409b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_fs = INVALID_PTR;
1419b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_vs = INVALID_PTR;
1429b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_velem_state = INVALID_PTR;
1439b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_fb_state.nr_cbufs = ~0;
1449b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_num_sampler_views = ~0;
1459b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_num_sampler_states = ~0;
1469b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_num_vertex_buffers = ~0;
14755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
14855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* blend state objects */
1490c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   memset(&blend, 0, sizeof(blend));
15055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->blend_keep_color = pipe->create_blend_state(pipe, &blend);
15155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
152eba1e2a44718bea398e49d496a78ee002c9922b8Roland Scheidegger   blend.rt[0].colormask = PIPE_MASK_RGBA;
15355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->blend_write_color = pipe->create_blend_state(pipe, &blend);
15455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
15555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* depth stencil alpha state objects */
1560c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   memset(&dsa, 0, sizeof(dsa));
15755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->dsa_keep_depth_stencil =
1581a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
15955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
160f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   dsa.depth.enabled = 1;
161f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   dsa.depth.writemask = 1;
162f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   dsa.depth.func = PIPE_FUNC_ALWAYS;
16355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->dsa_write_depth_keep_stencil =
1641a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
1651a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger
1661a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].enabled = 1;
1671a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].func = PIPE_FUNC_ALWAYS;
1681a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE;
1691a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE;
1701a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE;
1711a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].valuemask = 0xff;
1721a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].writemask = 0xff;
1731a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   ctx->dsa_write_depth_stencil =
1741a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
175a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
176a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
177a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   dsa.depth.enabled = 0;
178a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   dsa.depth.writemask = 0;
179a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   ctx->dsa_keep_depth_write_stencil =
180a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
18155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
18255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* sampler state */
18385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state = &ctx->template_sampler_state;
18485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state->wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
18585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state->wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
18685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state->wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
1872ee0d19ccf768c4c12c3c3476c1cd7eff508629aCorbin Simpson   sampler_state->normalized_coords = TRUE;
18885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* The sampler state objects which sample from a specified mipmap level
18985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák    * are created on-demand. */
19055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
19155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* rasterizer state */
19255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   memset(&rs_state, 0, sizeof(rs_state));
1930bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell   rs_state.cull_face = PIPE_FACE_NONE;
19455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   rs_state.gl_rasterization_rules = 1;
1951c75edf3e8ccc97f5f91f42f99c1f8db30b25fc4Corbin Simpson   rs_state.flatshade = 1;
19655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->rs_state = pipe->create_rasterizer_state(pipe, &rs_state);
19755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
198ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   /* vertex elements state */
199ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   memset(&velem[0], 0, sizeof(velem[0]) * 2);
200ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   for (i = 0; i < 2; i++) {
201ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].src_offset = i * 4 * sizeof(float);
202ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].instance_divisor = 0;
203ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].vertex_buffer_index = 0;
204ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
205ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   }
206ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   ctx->velem_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]);
207ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger
20885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* fragment shaders are created on-demand */
20985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
2105d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   /* vertex shader */
21155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   {
21255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      const uint semantic_names[] = { TGSI_SEMANTIC_POSITION,
21355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                      TGSI_SEMANTIC_GENERIC };
21455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      const uint semantic_indices[] = { 0, 0 };
2155d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák      ctx->vs =
21655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         util_make_vertex_passthrough_shader(pipe, 2, semantic_names,
21755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                             semantic_indices);
21855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
21955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
22055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* set invariant vertex coordinates */
22155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
22255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][0][3] = 1; /*v.w*/
22355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
22455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* create the vertex buffer */
2259b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->vbuf = pipe_buffer_create(ctx->base.pipe->screen,
226287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                                  PIPE_BIND_VERTEX_BUFFER,
22755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  sizeof(ctx->vertices));
22855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
2299b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   return &ctx->base;
23055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
23155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
23255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_destroy(struct blitter_context *blitter)
23355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
23455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
2359b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = blitter->pipe;
23655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
23755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
23855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_blend_state(pipe, ctx->blend_write_color);
23955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_blend_state(pipe, ctx->blend_keep_color);
24055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
24155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_depth_stencil_alpha_state(pipe,
24255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                          ctx->dsa_write_depth_keep_stencil);
2431a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil);
244a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil);
2456a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson
24655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_rasterizer_state(pipe, ctx->rs_state);
2475d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->delete_vs_state(pipe, ctx->vs);
248ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->delete_vertex_elements_state(pipe, ctx->velem_state);
24955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
250ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   for (i = 0; i < PIPE_MAX_TEXTURE_TYPES; i++) {
25185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->fs_texfetch_col[i])
25285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_fs_state(pipe, ctx->fs_texfetch_col[i]);
25385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->fs_texfetch_depth[i])
25485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_fs_state(pipe, ctx->fs_texfetch_depth[i]);
25555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
256ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
257b51f6e7c2350f637337fc3935436e2f99f669dfdJoakim Sindholt   for (i = 0; i <= PIPE_MAX_COLOR_BUFS; i++)
25885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->fs_col[i])
25985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_fs_state(pipe, ctx->fs_col[i]);
26055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
261d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   for (i = 0; i < PIPE_MAX_TEXTURE_LEVELS * 2; i++)
26285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->sampler_state[i])
26385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_sampler_state(pipe, ctx->sampler_state[i]);
264ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
265287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   pipe_resource_reference(&ctx->vbuf, NULL);
26655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   FREE(ctx);
26755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
26855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
26955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_check_saved_CSOs(struct blitter_context_priv *ctx)
27055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
2719a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák   if (ctx->running) {
2729a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák      _debug_printf("u_blitter: Caught recursion on save. "
2739a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák                    "This is a driver bug.\n");
2749a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák   }
2759a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák   ctx->running = TRUE;
2769a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák
27755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* make sure these CSOs have been saved */
2789b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   assert(ctx->base.saved_blend_state != INVALID_PTR &&
2799b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák          ctx->base.saved_dsa_state != INVALID_PTR &&
2809b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák          ctx->base.saved_rs_state != INVALID_PTR &&
2819b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák          ctx->base.saved_fs != INVALID_PTR &&
2829b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák          ctx->base.saved_vs != INVALID_PTR &&
2839b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák          ctx->base.saved_velem_state != INVALID_PTR);
28455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
28555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
28655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_restore_CSOs(struct blitter_context_priv *ctx)
28755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
2889b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
2898f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák   unsigned i;
29055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
29155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* restore the state objects which are always required to be saved */
2929b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->bind_blend_state(pipe, ctx->base.saved_blend_state);
2939b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->bind_depth_stencil_alpha_state(pipe, ctx->base.saved_dsa_state);
2949b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->bind_rasterizer_state(pipe, ctx->base.saved_rs_state);
2959b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->bind_fs_state(pipe, ctx->base.saved_fs);
2969b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->bind_vs_state(pipe, ctx->base.saved_vs);
2979b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->bind_vertex_elements_state(pipe, ctx->base.saved_velem_state);
29855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
2999b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_blend_state = INVALID_PTR;
3009b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_dsa_state = INVALID_PTR;
3019b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_rs_state = INVALID_PTR;
3029b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_fs = INVALID_PTR;
3039b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_vs = INVALID_PTR;
3049b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_velem_state = INVALID_PTR;
30555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3069b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->set_stencil_ref(pipe, &ctx->base.saved_stencil_ref);
3079b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->set_viewport_state(pipe, &ctx->base.saved_viewport);
3089b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->set_clip_state(pipe, &ctx->base.saved_clip);
309932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
31055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* restore the state objects which are required to be saved before copy/fill
31155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák    */
3129b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   if (ctx->base.saved_fb_state.nr_cbufs != ~0) {
3139b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      pipe->set_framebuffer_state(pipe, &ctx->base.saved_fb_state);
314a922725118333e016a357008f37105c23c6f54bcMarek Olšák      util_unreference_framebuffer_state(&ctx->base.saved_fb_state);
3159b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      ctx->base.saved_fb_state.nr_cbufs = ~0;
31655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
31755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3189b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   if (ctx->base.saved_num_sampler_states != ~0) {
31955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_fragment_sampler_states(pipe,
3209b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák                                         ctx->base.saved_num_sampler_states,
3219b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák                                         ctx->base.saved_sampler_states);
3229b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      ctx->base.saved_num_sampler_states = ~0;
32355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
32455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3259b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   if (ctx->base.saved_num_sampler_views != ~0) {
326f6106566081978f663cf08e54bb8908cb58a5316Michal Krol      pipe->set_fragment_sampler_views(pipe,
3279b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák                                       ctx->base.saved_num_sampler_views,
3289b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák                                       ctx->base.saved_sampler_views);
3290b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák
3309b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      for (i = 0; i < ctx->base.saved_num_sampler_views; i++)
3319b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák         pipe_sampler_view_reference(&ctx->base.saved_sampler_views[i],
3320b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák                                     NULL);
3330b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák
3349b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      ctx->base.saved_num_sampler_views = ~0;
33555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
33664aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri
3379b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   if (ctx->base.saved_num_vertex_buffers != ~0) {
33864aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri      pipe->set_vertex_buffers(pipe,
3399b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák                               ctx->base.saved_num_vertex_buffers,
3409b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák                               ctx->base.saved_vertex_buffers);
3418f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák
3429b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      for (i = 0; i < ctx->base.saved_num_vertex_buffers; i++) {
3439b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák         if (ctx->base.saved_vertex_buffers[i].buffer) {
3449b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák            pipe_resource_reference(&ctx->base.saved_vertex_buffers[i].buffer,
3458f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák                                    NULL);
3468f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák         }
3478f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák      }
3489b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      ctx->base.saved_num_vertex_buffers = ~0;
34964aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri   }
3509a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák
3519a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák   if (!ctx->running) {
3529a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák      _debug_printf("u_blitter: Caught recursion on restore. "
3539a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák                    "This is a driver bug.\n");
3549a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák   }
3559a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák   ctx->running = FALSE;
35655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
35755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
35855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_rectangle(struct blitter_context_priv *ctx,
35955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  unsigned x1, unsigned y1,
36055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  unsigned x2, unsigned y2,
36155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  float depth)
36255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
36355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
36455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
36555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* set vertex positions */
3663bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[0][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v0.x*/
3673bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[0][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v0.y*/
36855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3693bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[1][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v1.x*/
3703bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[1][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v1.y*/
37155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3723bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[2][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v2.x*/
3733bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[2][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v2.y*/
37455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3753bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[3][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v3.x*/
3763bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[3][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v3.y*/
37755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
37855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
37955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][0][2] = depth; /*z*/
380932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
381932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   /* viewport */
3823bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->viewport.scale[0] = 0.5f * ctx->dst_width;
3833bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->viewport.scale[1] = 0.5f * ctx->dst_height;
384ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák   ctx->viewport.scale[2] = 1.0f;
385932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->viewport.scale[3] = 1.0f;
3863bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->viewport.translate[0] = 0.5f * ctx->dst_width;
3873bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->viewport.translate[1] = 0.5f * ctx->dst_height;
388ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák   ctx->viewport.translate[2] = 0.0f;
389932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->viewport.translate[3] = 0.0f;
3909b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.pipe->set_viewport_state(ctx->base.pipe, &ctx->viewport);
391932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
392932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   /* clip */
3939b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.pipe->set_clip_state(ctx->base.pipe, &ctx->clip);
39455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
39555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
39655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_clear_color(struct blitter_context_priv *ctx,
39755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                    const float *rgba)
39855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
39955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
40055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
401fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák   if (rgba) {
40216d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      for (i = 0; i < 4; i++) {
40316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][0] = rgba[0];
40416d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][1] = rgba[1];
40516d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][2] = rgba[2];
40616d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][3] = rgba[3];
40716d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      }
408fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák   } else {
40916d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      for (i = 0; i < 4; i++) {
41016d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][0] = 0;
41116d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][1] = 0;
41216d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][2] = 0;
41316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][3] = 0;
41416d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      }
41555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
41655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
41755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
418d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieristatic void get_texcoords(struct pipe_resource *src,
4194c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          unsigned level,
4204c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          unsigned x1, unsigned y1,
4214c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          unsigned x2, unsigned y2,
4224c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          boolean normalized, float out[4])
423749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{
424d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   if(normalized)
425d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   {
4264c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      out[0] = x1 / (float)u_minify(src->width0,  level);
4274c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      out[1] = y1 / (float)u_minify(src->height0, level);
4284c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      out[2] = x2 / (float)u_minify(src->width0,  level);
4294c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      out[3] = y2 / (float)u_minify(src->height0, level);
430d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   }
431d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   else
432d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   {
433d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      out[0] = x1;
434d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      out[1] = y1;
435d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      out[2] = x2;
436d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      out[3] = y2;
437d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   }
438749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák}
439749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák
440749e24521a31178d2b647aa2954c3eecd597b799Marek Olšákstatic void set_texcoords_in_vertices(const float coord[4],
441749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák                                      float *out, unsigned stride)
442749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{
443749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = coord[0]; /*t0.s*/
444749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = coord[1]; /*t0.t*/
445749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out += stride;
446749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = coord[2]; /*t1.s*/
447749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = coord[1]; /*t1.t*/
448749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out += stride;
449749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = coord[2]; /*t2.s*/
450749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = coord[3]; /*t2.t*/
451749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out += stride;
452749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = coord[0]; /*t3.s*/
453749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = coord[3]; /*t3.t*/
454749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák}
455749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák
45655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_2d(struct blitter_context_priv *ctx,
457876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     struct pipe_resource *src,
4584c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                     unsigned level,
45955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x1, unsigned y1,
46055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x2, unsigned y2)
46155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
462749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   unsigned i;
463749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   float coord[4];
46455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
4654c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   get_texcoords(src, level, x1, y1, x2, y2, TRUE, coord);
466749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   set_texcoords_in_vertices(coord, &ctx->vertices[0][1][0], 8);
46755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
46855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++) {
46955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][2] = 0; /*r*/
47055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][3] = 1; /*q*/
47155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
47255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
47355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
47455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_3d(struct blitter_context_priv *ctx,
475876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     struct pipe_resource *src,
4764c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                     unsigned level,
477876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     unsigned zslice,
47855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x1, unsigned y1,
47955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x2, unsigned y2)
48055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
48155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
4824c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   float r = zslice / (float)u_minify(src->depth0, level);
48355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
4844c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   blitter_set_texcoords_2d(ctx, src, level, x1, y1, x2, y2);
48555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
48655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
48755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][2] = r; /*r*/
48855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
48955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
49055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_cube(struct blitter_context_priv *ctx,
491876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                       struct pipe_resource *src,
4924c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                       unsigned level, unsigned face,
49355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                       unsigned x1, unsigned y1,
49455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                       unsigned x2, unsigned y2)
49555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
49655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
497749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   float coord[4];
498d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul   float st[4][2];
499d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul
5004c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   get_texcoords(src, level, x1, y1, x2, y2, TRUE, coord);
501749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   set_texcoords_in_vertices(coord, &st[0][0], 2);
50255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
5034c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   util_map_texcoords2d_onto_cubemap(face,
50455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     /* pointer, stride in floats */
50555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     &st[0][0], 2,
50655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     &ctx->vertices[0][1][0], 8);
50755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
50855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
50955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][3] = 1; /*q*/
51055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
51155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
5123bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákstatic void blitter_set_dst_dimensions(struct blitter_context_priv *ctx,
5133bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák                                       unsigned width, unsigned height)
5143bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák{
5153bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->dst_width = width;
5163bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->dst_height = height;
5173bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák}
5183bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák
51955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_draw_quad(struct blitter_context_priv *ctx)
52055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
5219b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
5222c1de07ddf9f4de6813f0ed46fc859b2f61db7b2Marek Olšák   struct pipe_box box;
52355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
52480e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák   /* write vertices and draw them */
5252c1de07ddf9f4de6813f0ed46fc859b2f61db7b2Marek Olšák   u_box_1d(0, sizeof(ctx->vertices), &box);
5264c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   pipe->transfer_inline_write(pipe, ctx->vbuf, 0,
5272c1de07ddf9f4de6813f0ed46fc859b2f61db7b2Marek Olšák                               PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD,
5282c1de07ddf9f4de6813f0ed46fc859b2f61db7b2Marek Olšák                               &box, ctx->vertices, sizeof(ctx->vertices), 0);
52955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
53080e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák   util_draw_vertex_buffer(pipe, ctx->vbuf, 0, PIPE_PRIM_TRIANGLE_FAN,
53180e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák                           4,  /* verts */
53280e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák                           2); /* attribs/vert */
53355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
53455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
53585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
53685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid **blitter_get_sampler_state(struct blitter_context_priv *ctx,
537d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri                                 int miplevel, boolean normalized)
53885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
5399b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
54085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_sampler_state *sampler_state = &ctx->template_sampler_state;
54185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
54285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(miplevel < PIPE_MAX_TEXTURE_LEVELS);
54385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
54485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Create the sampler state on-demand. */
545d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   if (!ctx->sampler_state[miplevel * 2 + normalized]) {
54685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      sampler_state->lod_bias = miplevel;
54785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      sampler_state->min_lod = miplevel;
54885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      sampler_state->max_lod = miplevel;
549d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      sampler_state->normalized_coords = normalized;
55085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
551d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      ctx->sampler_state[miplevel * 2 + normalized] = pipe->create_sampler_state(pipe,
55285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                                                sampler_state);
55385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   }
55485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
55585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Return void** so that it can be passed to bind_fragment_sampler_states
55685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák    * directly. */
557d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   return &ctx->sampler_state[miplevel * 2 + normalized];
55885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
55985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
56085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
56185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_col(struct blitter_context_priv *ctx, unsigned num_cbufs)
56285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
5639b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
56485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
56585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(num_cbufs <= PIPE_MAX_COLOR_BUFS);
56685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
567677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   if (!ctx->fs_col[num_cbufs])
568677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas      ctx->fs_col[num_cbufs] =
5695d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák         util_make_fragment_cloneinput_shader(pipe, num_cbufs,
5705d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák                                              TGSI_SEMANTIC_GENERIC,
5715d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák                                              TGSI_INTERPOLATE_LINEAR);
57285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
573677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   return ctx->fs_col[num_cbufs];
57485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
57585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
576d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul/** Convert PIPE_TEXTURE_x to TGSI_TEXTURE_x */
577d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paulstatic unsigned
5783bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákpipe_tex_to_tgsi_tex(enum pipe_texture_target pipe_tex_target)
579d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul{
580d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   switch (pipe_tex_target) {
581d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_1D:
582d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_1D;
583d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_2D:
584d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_2D;
585ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri   case PIPE_TEXTURE_RECT:
586cbe367227959a32ff20e146106162a81d2be02c3Luca Barbieri      return TGSI_TEXTURE_RECT;
587d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_3D:
588d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_3D;
589d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_CUBE:
590d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_CUBE;
591d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   default:
592d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      assert(0 && "unexpected texture target");
593d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_UNKNOWN;
594d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   }
595d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul}
596d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
597d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
59885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
59985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_col(struct blitter_context_priv *ctx,
60085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                  unsigned tex_target)
60185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
6029b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
60385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
60485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(tex_target < PIPE_MAX_TEXTURE_TYPES);
60585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
60685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Create the fragment shader on-demand. */
60785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   if (!ctx->fs_texfetch_col[tex_target]) {
608d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target);
609d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
610d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      ctx->fs_texfetch_col[tex_target] =
611d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul        util_make_fragment_tex_shader(pipe, tgsi_tex, TGSI_INTERPOLATE_LINEAR);
61285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   }
61385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
61485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   return ctx->fs_texfetch_col[tex_target];
61585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
61685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
61785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
61885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_depth(struct blitter_context_priv *ctx,
61985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                    unsigned tex_target)
62085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
6219b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
62285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
62385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(tex_target < PIPE_MAX_TEXTURE_TYPES);
62485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
62585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Create the fragment shader on-demand. */
62685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   if (!ctx->fs_texfetch_depth[tex_target]) {
627d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target);
628d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
629d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      ctx->fs_texfetch_depth[tex_target] =
630d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul         util_make_fragment_tex_shader_writedepth(pipe, tgsi_tex,
631d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul                                                  TGSI_INTERPOLATE_LINEAR);
63285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   }
63385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
63485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   return ctx->fs_texfetch_depth[tex_target];
63585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
63685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
6379be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter,
6389be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   unsigned x1, unsigned y1,
6399be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   unsigned x2, unsigned y2,
6409be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   float depth,
6419be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   enum blitter_attrib_type type,
6429be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   const float attrib[4])
6439be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák{
6449be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
6459be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
6469be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   switch (type) {
6479be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      case UTIL_BLITTER_ATTRIB_COLOR:
6489be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         blitter_set_clear_color(ctx, attrib);
6499be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         break;
6509be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
6519be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      case UTIL_BLITTER_ATTRIB_TEXCOORD:
6529be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         set_texcoords_in_vertices(attrib, &ctx->vertices[0][1][0], 8);
6539be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         break;
6549be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
6559be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      default:;
6569be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   }
6579be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
6589be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter_set_rectangle(ctx, x1, y1, x2, y2, depth);
6599be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter_draw_quad(ctx);
6609be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák}
6619be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
662db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákstatic void util_blitter_clear_custom(struct blitter_context *blitter,
663db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      unsigned width, unsigned height,
664db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      unsigned num_cbufs,
665db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      unsigned clear_buffers,
666db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      const float *rgba,
667db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      double depth, unsigned stencil,
668db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      void *custom_blend, void *custom_dsa)
66955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
67055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
6719b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
6726a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson   struct pipe_stencil_ref sr = { { 0 } };
67355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
674ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   assert(num_cbufs <= PIPE_MAX_COLOR_BUFS);
67555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
67655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_check_saved_CSOs(ctx);
67755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
67855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* bind CSOs */
679db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   if (custom_blend) {
680db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák      pipe->bind_blend_state(pipe, custom_blend);
681db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else if (clear_buffers & PIPE_CLEAR_COLOR) {
68255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_write_color);
683db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else {
68455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_keep_color);
685db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   }
68655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
687db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   if (custom_dsa) {
688db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe, custom_dsa);
689db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else if ((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) {
6901a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil);
691db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else if (clear_buffers & PIPE_CLEAR_DEPTH) {
692a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil);
693db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else if (clear_buffers & PIPE_CLEAR_STENCIL) {
694a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil);
695db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else {
69655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
697db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   }
698db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák
699db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   sr.ref_value[0] = stencil & 0xff;
700db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   pipe->set_stencil_ref(pipe, &sr);
70155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
70255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
703ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
70485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, num_cbufs));
7055d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
70655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
7073bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   blitter_set_dst_dimensions(ctx, width, height);
7089be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter->draw_rectangle(blitter, 0, 0, width, height, depth,
7099be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                           UTIL_BLITTER_ATTRIB_COLOR, rgba);
71055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_restore_CSOs(ctx);
71155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
71255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
713db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid util_blitter_clear(struct blitter_context *blitter,
714db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                        unsigned width, unsigned height,
715db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                        unsigned num_cbufs,
716db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                        unsigned clear_buffers,
717db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                        const float *rgba,
718db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                        double depth, unsigned stencil)
719db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák{
720db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   util_blitter_clear_custom(blitter, width, height, num_cbufs,
721db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                             clear_buffers, rgba, depth, stencil,
722db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                             NULL, NULL);
723db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák}
724db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák
725db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid util_blitter_clear_depth_custom(struct blitter_context *blitter,
726db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                     unsigned width, unsigned height,
727db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                     double depth, void *custom_dsa)
728db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák{
729db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák    const float rgba[4] = {0, 0, 0, 0};
730db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák    util_blitter_clear_custom(blitter, width, height, 0,
731db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                              0, rgba, depth, 0, NULL, custom_dsa);
732db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák}
733db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák
734876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákstatic
735876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákboolean is_overlap(unsigned sx1, unsigned sx2, unsigned sy1, unsigned sy2,
736876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                   unsigned dx1, unsigned dx2, unsigned dy1, unsigned dy2)
737deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie{
738876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   return sx1 < dx2 && sx2 > dx1 && sy1 < dy2 && sy2 > dy1;
739deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie}
740deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie
741876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákvoid util_blitter_copy_region(struct blitter_context *blitter,
742876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              struct pipe_resource *dst,
7434c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                              unsigned dstlevel,
744876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              unsigned dstx, unsigned dsty, unsigned dstz,
745876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              struct pipe_resource *src,
7464c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                              unsigned srclevel,
7474c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                              const struct pipe_box *srcbox,
748876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              boolean ignore_stencil)
74955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
75055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
7519b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
752876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   struct pipe_screen *screen = pipe->screen;
7534c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   struct pipe_surface *dstsurf, surf_templ;
75455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_framebuffer_state fb_state;
755f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   struct pipe_sampler_view viewTempl, *view;
756876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   unsigned bind;
7574c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   unsigned width = srcbox->width;
7584c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   unsigned height = srcbox->height;
759876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   boolean is_stencil, is_depth;
760d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   boolean normalized;
761876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
762876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Give up if textures are not set. */
763876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   assert(dst && src);
764876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   if (!dst || !src)
765876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      return;
766876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
767876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Sanity checks. */
768876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   if (dst == src) {
7694c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      assert(!is_overlap(srcbox->x, srcbox->x + width, srcbox->y, srcbox->y + height,
770876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                         dstx, dstx + width, dsty, dsty + height));
771876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   }
772876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   assert(src->target < PIPE_MAX_TEXTURE_TYPES);
7734c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   /* XXX should handle 3d regions */
7744c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   assert(srcbox->depth == 1);
775876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
776876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Is this a ZS format? */
777876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   is_depth = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 0) != 0;
778876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   is_stencil = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 1) != 0;
779876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
780876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   if (is_depth || is_stencil)
781876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      bind = PIPE_BIND_DEPTH_STENCIL;
782876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   else
783876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      bind = PIPE_BIND_RENDER_TARGET;
784876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
785876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Check if we can sample from and render to the surfaces. */
786876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* (assuming copying a stencil buffer is not possible) */
787876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák    if ((!ignore_stencil && is_stencil) ||
788876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák       !screen->is_format_supported(screen, dst->format, dst->target,
789876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                    dst->nr_samples, bind, 0) ||
790876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák       !screen->is_format_supported(screen, src->format, src->target,
791876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                    src->nr_samples, PIPE_BIND_SAMPLER_VIEW, 0)) {
7924c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      util_resource_copy_region(pipe, dst, dstlevel, dstx, dsty, dstz,
7934c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                src, srclevel, srcbox);
794876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      return;
795876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   }
796876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
7974c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   /* Get surface. */
7984c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   memset(&surf_templ, 0, sizeof(surf_templ));
7994c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   u_surface_default_template(&surf_templ, dst, bind);
8004c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   surf_templ.u.tex.level = dstlevel;
8014c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   surf_templ.u.tex.first_layer = dstz;
8024c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   surf_templ.u.tex.last_layer = dstz;
8034c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   dstsurf = pipe->create_surface(pipe, dst, &surf_templ);
80455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
805876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Check whether the states are properly saved. */
806876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   blitter_check_saved_CSOs(ctx);
80755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   assert(blitter->saved_fb_state.nr_cbufs != ~0);
808f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   assert(blitter->saved_num_sampler_views != ~0);
80955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   assert(blitter->saved_num_sampler_states != ~0);
81055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
811876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Initialize framebuffer state. */
812876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   fb_state.width = dstsurf->width;
813876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   fb_state.height = dstsurf->height;
81455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
81555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   if (is_depth) {
81655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_keep_color);
81755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe,
81855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                           ctx->dsa_write_depth_keep_stencil);
81985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      pipe->bind_fs_state(pipe,
820876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                          blitter_get_fs_texfetch_depth(ctx, src->target));
82155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
82255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      fb_state.nr_cbufs = 0;
823876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      fb_state.zsbuf = dstsurf;
82455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   } else {
82555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_write_color);
82655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
82785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      pipe->bind_fs_state(pipe,
828876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                          blitter_get_fs_texfetch_col(ctx, src->target));
82955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
83055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      fb_state.nr_cbufs = 1;
831876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      fb_state.cbufs[0] = dstsurf;
83255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      fb_state.zsbuf = 0;
83355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
83485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
835d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   normalized = src->target != PIPE_TEXTURE_RECT;
836d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri
837876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Initialize sampler view. */
838876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   u_sampler_view_default_template(&viewTempl, src, src->format);
839876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   view = pipe->create_sampler_view(pipe, src, &viewTempl);
840f6106566081978f663cf08e54bb8908cb58a5316Michal Krol
841876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Set rasterizer state, shaders, and textures. */
84255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
8435d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
84485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   pipe->bind_fragment_sampler_states(pipe, 1,
8454c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                      blitter_get_sampler_state(ctx, srclevel, normalized));
846ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
847f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   pipe->set_fragment_sampler_views(pipe, 1, &view);
84855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->set_framebuffer_state(pipe, &fb_state);
84955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
8509be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height);
8519be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
852876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   switch (src->target) {
8539be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      /* Draw the quad with the draw_rectangle callback. */
85455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_1D:
85555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_2D:
856ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri      case PIPE_TEXTURE_RECT:
8579be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         {
8589be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák            /* Set texture coordinates. */
8599be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák            float coord[4];
8604c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            get_texcoords(src, srclevel, srcbox->x, srcbox->y,
8614c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          srcbox->x+width, srcbox->y+height, normalized, coord);
8629be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
8639be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák            /* Draw. */
8649be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák            blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0,
8659be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                    UTIL_BLITTER_ATTRIB_TEXCOORD, coord);
8669be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         }
86755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         break;
8689be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
8699be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      /* Draw the quad with the generic codepath. */
87055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_3D:
87155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_CUBE:
8729be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         /* Set texture coordinates. */
8739be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         if (src->target == PIPE_TEXTURE_3D)
8744c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            blitter_set_texcoords_3d(ctx, src, srclevel, srcbox->z,
8754c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                     srcbox->x, srcbox->y,
8764c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                     srcbox->x + width, srcbox->y + height);
8779be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         else
8784c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            blitter_set_texcoords_cube(ctx, src, srclevel, srcbox->z,
8794c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                       srcbox->x, srcbox->y,
8804c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                       srcbox->x + width, srcbox->y + height);
8819be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
8829be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         /* Draw. */
8839be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         blitter_set_rectangle(ctx, dstx, dsty, dstx+width, dsty+height, 0);
8849be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         blitter_draw_quad(ctx);
88555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         break;
8869be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
887ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák      default:
888ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák         assert(0);
889876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák         return;
89055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
89155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
89255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_restore_CSOs(ctx);
893876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
894876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   pipe_surface_reference(&dstsurf, NULL);
89557c3f70018bc7cd44eafd55d8147691a3c109b91Marek Olšák   pipe_sampler_view_reference(&view, NULL);
89655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
89755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
898a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a color surface to a constant value. */
899a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_render_target(struct blitter_context *blitter,
900a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      struct pipe_surface *dstsurf,
901a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      const float *rgba,
902a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned dstx, unsigned dsty,
903a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned width, unsigned height)
90455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
90555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
9069b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
90755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_framebuffer_state fb_state;
90855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
909a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   assert(dstsurf->texture);
910a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if (!dstsurf->texture)
91155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      return;
91255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
91355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* check the saved state */
91455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_check_saved_CSOs(ctx);
91555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   assert(blitter->saved_fb_state.nr_cbufs != ~0);
91655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
91755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* bind CSOs */
91855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_blend_state(pipe, ctx->blend_write_color);
91955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
92055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
92185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1));
9225d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
923ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
92455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
92555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* set a framebuffer state */
92659e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   fb_state.width = dstsurf->width;
92759e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   fb_state.height = dstsurf->height;
92855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   fb_state.nr_cbufs = 1;
92959e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   fb_state.cbufs[0] = dstsurf;
93055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   fb_state.zsbuf = 0;
93155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->set_framebuffer_state(pipe, &fb_state);
93255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
9333bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height);
9349be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0,
9359be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                           UTIL_BLITTER_ATTRIB_COLOR, rgba);
93655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_restore_CSOs(ctx);
937a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger}
93859e51d9640c242a7c919472d935a91889c7840c9Marek Olšák
939a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a depth stencil surface. */
940a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_depth_stencil(struct blitter_context *blitter,
941a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      struct pipe_surface *dstsurf,
942a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned clear_flags,
943a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      double depth,
944a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned stencil,
945a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned dstx, unsigned dsty,
946a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned width, unsigned height)
947a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger{
948a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
9499b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
950a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct pipe_framebuffer_state fb_state;
951a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct pipe_stencil_ref sr = { { 0 } };
952a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
953a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   assert(dstsurf->texture);
954a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if (!dstsurf->texture)
955a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      return;
956a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
957a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   /* check the saved state */
958a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   blitter_check_saved_CSOs(ctx);
959a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   assert(blitter->saved_fb_state.nr_cbufs != ~0);
960a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
961a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   /* bind CSOs */
962a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_blend_state(pipe, ctx->blend_keep_color);
963a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if ((clear_flags & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) {
964a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      sr.ref_value[0] = stencil & 0xff;
965a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil);
966a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->set_stencil_ref(pipe, &sr);
967a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
968a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else if (clear_flags & PIPE_CLEAR_DEPTH) {
969a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil);
970a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
971a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else if (clear_flags & PIPE_CLEAR_STENCIL) {
972a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      sr.ref_value[0] = stencil & 0xff;
973a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil);
974a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->set_stencil_ref(pipe, &sr);
975a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
976a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else
977a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      /* hmm that should be illegal probably, or make it a no-op somewhere */
978a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
979a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
980a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
981a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0));
9825d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
983a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
984a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
985a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   /* set a framebuffer state */
986a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.width = dstsurf->width;
987a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.height = dstsurf->height;
988a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.nr_cbufs = 0;
989a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.cbufs[0] = 0;
990a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.zsbuf = dstsurf;
991a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->set_framebuffer_state(pipe, &fb_state);
992a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
9933bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height);
9949be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, depth,
9959be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                           UTIL_BLITTER_ATTRIB_NONE, NULL);
996a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   blitter_restore_CSOs(ctx);
99755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
998f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
999c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie/* draw a rectangle across a region using a custom dsa stage - for r600g */
1000c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlievoid util_blitter_custom_depth_stencil(struct blitter_context *blitter,
1001c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie				       struct pipe_surface *zsurf,
1002c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie				       struct pipe_surface *cbsurf,
1003c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie				       void *dsa_stage, float depth)
1004f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák{
1005f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
1006f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   struct pipe_context *pipe = ctx->base.pipe;
1007f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   struct pipe_framebuffer_state fb_state;
1008f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1009c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   assert(zsurf->texture);
1010c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   if (!zsurf->texture)
1011f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák      return;
1012f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1013f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   /* check the saved state */
1014f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   blitter_check_saved_CSOs(ctx);
1015f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   assert(blitter->saved_fb_state.nr_cbufs != ~0);
1016f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1017f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   /* bind CSOs */
1018c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   pipe->bind_blend_state(pipe, ctx->blend_write_color);
1019c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   pipe->bind_depth_stencil_alpha_state(pipe, dsa_stage);
1020f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1021f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
1022f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0));
10235d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
1024f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
1025f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1026f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   /* set a framebuffer state */
1027c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   fb_state.width = zsurf->width;
1028c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   fb_state.height = zsurf->height;
1029c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   fb_state.nr_cbufs = 1;
1030c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   if (cbsurf) {
1031c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie	   fb_state.cbufs[0] = cbsurf;
1032c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie	   fb_state.nr_cbufs = 1;
1033c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   } else {
1034c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie	   fb_state.cbufs[0] = NULL;
1035c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie	   fb_state.nr_cbufs = 0;
1036c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   }
1037c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   fb_state.zsbuf = zsurf;
1038f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   pipe->set_framebuffer_state(pipe, &fb_state);
1039f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1040c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   blitter_set_dst_dimensions(ctx, zsurf->width, zsurf->height);
1041c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   blitter->draw_rectangle(blitter, 0, 0, zsurf->width, zsurf->height, depth,
1042f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák                           UTIL_BLITTER_ATTRIB_NONE, NULL);
1043f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   blitter_restore_CSOs(ctx);
1044f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák}
1045