u_blitter.c revision cec2082ae515bc91e6b29084ba4b8deac28ef923
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;
10755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák};
10855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
1099be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter,
1109be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   unsigned x, unsigned y,
1119be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   unsigned width, unsigned height,
1129be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   float depth,
1139be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   enum blitter_attrib_type type,
1149be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   const float attrib[4]);
1159be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
1169be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
11755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context *util_blitter_create(struct pipe_context *pipe)
11855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
11955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx;
1200c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   struct pipe_blend_state blend;
1210c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   struct pipe_depth_stencil_alpha_state dsa;
1220c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   struct pipe_rasterizer_state rs_state;
12385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_sampler_state *sampler_state;
124ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   struct pipe_vertex_element velem[2];
12585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   unsigned i;
12655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
12755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx = CALLOC_STRUCT(blitter_context_priv);
12855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   if (!ctx)
12955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      return NULL;
13055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
1319b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.pipe = pipe;
1329be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   ctx->base.draw_rectangle = blitter_draw_rectangle;
13355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
13455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* init state objects for them to be considered invalid */
1359b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_blend_state = INVALID_PTR;
1369b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_dsa_state = INVALID_PTR;
1379b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_rs_state = INVALID_PTR;
1389b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_fs = INVALID_PTR;
1399b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_vs = INVALID_PTR;
1409b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_velem_state = INVALID_PTR;
1419b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_fb_state.nr_cbufs = ~0;
1429b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_num_sampler_views = ~0;
1439b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_num_sampler_states = ~0;
1449b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_num_vertex_buffers = ~0;
14555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
14655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* blend state objects */
1470c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   memset(&blend, 0, sizeof(blend));
14855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->blend_keep_color = pipe->create_blend_state(pipe, &blend);
14955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
150eba1e2a44718bea398e49d496a78ee002c9922b8Roland Scheidegger   blend.rt[0].colormask = PIPE_MASK_RGBA;
15155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->blend_write_color = pipe->create_blend_state(pipe, &blend);
15255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
15355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* depth stencil alpha state objects */
1540c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   memset(&dsa, 0, sizeof(dsa));
15555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->dsa_keep_depth_stencil =
1561a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
15755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
158f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   dsa.depth.enabled = 1;
159f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   dsa.depth.writemask = 1;
160f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   dsa.depth.func = PIPE_FUNC_ALWAYS;
16155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->dsa_write_depth_keep_stencil =
1621a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
1631a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger
1641a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].enabled = 1;
1651a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].func = PIPE_FUNC_ALWAYS;
1661a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE;
1671a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE;
1681a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE;
1691a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].valuemask = 0xff;
1701a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].writemask = 0xff;
1711a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   ctx->dsa_write_depth_stencil =
1721a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
173a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
174a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
175a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   dsa.depth.enabled = 0;
176a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   dsa.depth.writemask = 0;
177a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   ctx->dsa_keep_depth_write_stencil =
178a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
17955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
18055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* sampler state */
18185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state = &ctx->template_sampler_state;
18285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state->wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
18385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state->wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
18485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state->wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
1852ee0d19ccf768c4c12c3c3476c1cd7eff508629aCorbin Simpson   sampler_state->normalized_coords = TRUE;
18685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* The sampler state objects which sample from a specified mipmap level
18785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák    * are created on-demand. */
18855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
18955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* rasterizer state */
19055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   memset(&rs_state, 0, sizeof(rs_state));
1910bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell   rs_state.cull_face = PIPE_FACE_NONE;
19255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   rs_state.gl_rasterization_rules = 1;
1931c75edf3e8ccc97f5f91f42f99c1f8db30b25fc4Corbin Simpson   rs_state.flatshade = 1;
19455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->rs_state = pipe->create_rasterizer_state(pipe, &rs_state);
19555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
196ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   /* vertex elements state */
197ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   memset(&velem[0], 0, sizeof(velem[0]) * 2);
198ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   for (i = 0; i < 2; i++) {
199ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].src_offset = i * 4 * sizeof(float);
200ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].instance_divisor = 0;
201ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].vertex_buffer_index = 0;
202ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
203ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   }
204ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   ctx->velem_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]);
205ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger
20685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* fragment shaders are created on-demand */
20785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
2085d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   /* vertex shader */
20955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   {
21055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      const uint semantic_names[] = { TGSI_SEMANTIC_POSITION,
21155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                      TGSI_SEMANTIC_GENERIC };
21255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      const uint semantic_indices[] = { 0, 0 };
2135d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák      ctx->vs =
21455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         util_make_vertex_passthrough_shader(pipe, 2, semantic_names,
21555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                             semantic_indices);
21655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
21755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
21855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* set invariant vertex coordinates */
21955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
22055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][0][3] = 1; /*v.w*/
22155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
22255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* create the vertex buffer */
2232a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák   ctx->vbuf = pipe_user_buffer_create(ctx->base.pipe->screen,
2242a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák                                       ctx->vertices,
2252a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák                                       sizeof(ctx->vertices),
2262a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák                                       PIPE_BIND_VERTEX_BUFFER);
22755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
2289b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   return &ctx->base;
22955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
23055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
23155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_destroy(struct blitter_context *blitter)
23255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
23355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
2349b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = blitter->pipe;
23555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
23655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
23755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_blend_state(pipe, ctx->blend_write_color);
23855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_blend_state(pipe, ctx->blend_keep_color);
23955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
24055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_depth_stencil_alpha_state(pipe,
24155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                          ctx->dsa_write_depth_keep_stencil);
2421a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil);
243a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil);
2446a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson
24555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_rasterizer_state(pipe, ctx->rs_state);
2465d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->delete_vs_state(pipe, ctx->vs);
247ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->delete_vertex_elements_state(pipe, ctx->velem_state);
24855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
249ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   for (i = 0; i < PIPE_MAX_TEXTURE_TYPES; i++) {
25085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->fs_texfetch_col[i])
25185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_fs_state(pipe, ctx->fs_texfetch_col[i]);
25285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->fs_texfetch_depth[i])
25385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_fs_state(pipe, ctx->fs_texfetch_depth[i]);
25455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
255ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
256b51f6e7c2350f637337fc3935436e2f99f669dfdJoakim Sindholt   for (i = 0; i <= PIPE_MAX_COLOR_BUFS; i++)
25785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->fs_col[i])
25885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_fs_state(pipe, ctx->fs_col[i]);
25955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
260d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   for (i = 0; i < PIPE_MAX_TEXTURE_LEVELS * 2; i++)
26185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->sampler_state[i])
26285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_sampler_state(pipe, ctx->sampler_state[i]);
263ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
264287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   pipe_resource_reference(&ctx->vbuf, NULL);
26555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   FREE(ctx);
26655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
26755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
26855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_check_saved_CSOs(struct blitter_context_priv *ctx)
26955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
270ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák   if (ctx->base.running) {
2719a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák      _debug_printf("u_blitter: Caught recursion on save. "
2729a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák                    "This is a driver bug.\n");
2739a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák   }
274ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák   ctx->base.running = TRUE;
2759a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák
27655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* make sure these CSOs have been saved */
2779b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   assert(ctx->base.saved_blend_state != INVALID_PTR &&
2789b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák          ctx->base.saved_dsa_state != INVALID_PTR &&
2799b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák          ctx->base.saved_rs_state != INVALID_PTR &&
2809b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák          ctx->base.saved_fs != INVALID_PTR &&
2819b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák          ctx->base.saved_vs != INVALID_PTR &&
2829b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák          ctx->base.saved_velem_state != INVALID_PTR);
28355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
28455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
28555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_restore_CSOs(struct blitter_context_priv *ctx)
28655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
2879b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
2888f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák   unsigned i;
28955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
29055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* restore the state objects which are always required to be saved */
2919b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->bind_blend_state(pipe, ctx->base.saved_blend_state);
2929b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->bind_depth_stencil_alpha_state(pipe, ctx->base.saved_dsa_state);
2939b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->bind_rasterizer_state(pipe, ctx->base.saved_rs_state);
2949b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->bind_fs_state(pipe, ctx->base.saved_fs);
2959b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->bind_vs_state(pipe, ctx->base.saved_vs);
2969b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->bind_vertex_elements_state(pipe, ctx->base.saved_velem_state);
29755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
2989b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_blend_state = INVALID_PTR;
2999b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_dsa_state = INVALID_PTR;
3009b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_rs_state = INVALID_PTR;
3019b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_fs = INVALID_PTR;
3029b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_vs = INVALID_PTR;
3039b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_velem_state = INVALID_PTR;
30455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3059b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->set_stencil_ref(pipe, &ctx->base.saved_stencil_ref);
3069b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->set_viewport_state(pipe, &ctx->base.saved_viewport);
3079b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->set_clip_state(pipe, &ctx->base.saved_clip);
308932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
30955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* restore the state objects which are required to be saved before copy/fill
31055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák    */
3119b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   if (ctx->base.saved_fb_state.nr_cbufs != ~0) {
3129b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      pipe->set_framebuffer_state(pipe, &ctx->base.saved_fb_state);
313a922725118333e016a357008f37105c23c6f54bcMarek Olšák      util_unreference_framebuffer_state(&ctx->base.saved_fb_state);
3149b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      ctx->base.saved_fb_state.nr_cbufs = ~0;
31555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
31655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3179b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   if (ctx->base.saved_num_sampler_states != ~0) {
31855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_fragment_sampler_states(pipe,
3199b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák                                         ctx->base.saved_num_sampler_states,
3209b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák                                         ctx->base.saved_sampler_states);
3219b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      ctx->base.saved_num_sampler_states = ~0;
32255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
32355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3249b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   if (ctx->base.saved_num_sampler_views != ~0) {
325f6106566081978f663cf08e54bb8908cb58a5316Michal Krol      pipe->set_fragment_sampler_views(pipe,
3269b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák                                       ctx->base.saved_num_sampler_views,
3279b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák                                       ctx->base.saved_sampler_views);
3280b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák
3299b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      for (i = 0; i < ctx->base.saved_num_sampler_views; i++)
3309b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák         pipe_sampler_view_reference(&ctx->base.saved_sampler_views[i],
3310b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák                                     NULL);
3320b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák
3339b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      ctx->base.saved_num_sampler_views = ~0;
33455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
33564aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri
3369b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   if (ctx->base.saved_num_vertex_buffers != ~0) {
33764aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri      pipe->set_vertex_buffers(pipe,
3389b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák                               ctx->base.saved_num_vertex_buffers,
3399b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák                               ctx->base.saved_vertex_buffers);
3408f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák
3419b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      for (i = 0; i < ctx->base.saved_num_vertex_buffers; i++) {
3429b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák         if (ctx->base.saved_vertex_buffers[i].buffer) {
3439b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák            pipe_resource_reference(&ctx->base.saved_vertex_buffers[i].buffer,
3448f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák                                    NULL);
3458f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák         }
3468f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák      }
3479b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      ctx->base.saved_num_vertex_buffers = ~0;
34864aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri   }
3499a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák
350ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák   if (!ctx->base.running) {
3519a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák      _debug_printf("u_blitter: Caught recursion on restore. "
3529a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák                    "This is a driver bug.\n");
3539a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák   }
354ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák   ctx->base.running = FALSE;
35555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
35655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
35755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_rectangle(struct blitter_context_priv *ctx,
35855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  unsigned x1, unsigned y1,
35955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  unsigned x2, unsigned y2,
36055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  float depth)
36155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
36255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
36355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
36455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* set vertex positions */
3653bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[0][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v0.x*/
3663bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[0][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v0.y*/
36755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3683bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[1][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v1.x*/
3693bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[1][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v1.y*/
37055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3713bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[2][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v2.x*/
3723bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[2][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v2.y*/
37355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3743bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[3][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v3.x*/
3753bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[3][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v3.y*/
37655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
37755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
37855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][0][2] = depth; /*z*/
379932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
380932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   /* viewport */
3813bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->viewport.scale[0] = 0.5f * ctx->dst_width;
3823bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->viewport.scale[1] = 0.5f * ctx->dst_height;
383ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák   ctx->viewport.scale[2] = 1.0f;
384932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->viewport.scale[3] = 1.0f;
3853bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->viewport.translate[0] = 0.5f * ctx->dst_width;
3863bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->viewport.translate[1] = 0.5f * ctx->dst_height;
387ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák   ctx->viewport.translate[2] = 0.0f;
388932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->viewport.translate[3] = 0.0f;
3899b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.pipe->set_viewport_state(ctx->base.pipe, &ctx->viewport);
390932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
391932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   /* clip */
3929b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.pipe->set_clip_state(ctx->base.pipe, &ctx->clip);
39355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
39455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
39555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_clear_color(struct blitter_context_priv *ctx,
39655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                    const float *rgba)
39755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
39855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
39955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
400fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák   if (rgba) {
40116d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      for (i = 0; i < 4; i++) {
40216d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][0] = rgba[0];
40316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][1] = rgba[1];
40416d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][2] = rgba[2];
40516d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][3] = rgba[3];
40616d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      }
407fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák   } else {
40816d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      for (i = 0; i < 4; i++) {
40916d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][0] = 0;
41016d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][1] = 0;
41116d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][2] = 0;
41216d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][3] = 0;
41316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      }
41455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
41555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
41655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
417d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieristatic void get_texcoords(struct pipe_resource *src,
4184c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          unsigned level,
4194c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          unsigned x1, unsigned y1,
4204c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          unsigned x2, unsigned y2,
4214c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          boolean normalized, float out[4])
422749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{
423d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   if(normalized)
424d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   {
4254c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      out[0] = x1 / (float)u_minify(src->width0,  level);
4264c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      out[1] = y1 / (float)u_minify(src->height0, level);
4274c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      out[2] = x2 / (float)u_minify(src->width0,  level);
4284c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      out[3] = y2 / (float)u_minify(src->height0, level);
429d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   }
430d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   else
431d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   {
432d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      out[0] = x1;
433d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      out[1] = y1;
434d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      out[2] = x2;
435d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      out[3] = y2;
436d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   }
437749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák}
438749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák
439749e24521a31178d2b647aa2954c3eecd597b799Marek Olšákstatic void set_texcoords_in_vertices(const float coord[4],
440749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák                                      float *out, unsigned stride)
441749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{
442749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = coord[0]; /*t0.s*/
443749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = coord[1]; /*t0.t*/
444749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out += stride;
445749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = coord[2]; /*t1.s*/
446749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = coord[1]; /*t1.t*/
447749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out += stride;
448749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = coord[2]; /*t2.s*/
449749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = coord[3]; /*t2.t*/
450749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out += stride;
451749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = coord[0]; /*t3.s*/
452749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = coord[3]; /*t3.t*/
453749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák}
454749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák
45555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_2d(struct blitter_context_priv *ctx,
456876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     struct pipe_resource *src,
4574c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                     unsigned level,
45855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x1, unsigned y1,
45955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x2, unsigned y2)
46055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
461749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   unsigned i;
462749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   float coord[4];
46355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
4644c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   get_texcoords(src, level, x1, y1, x2, y2, TRUE, coord);
465749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   set_texcoords_in_vertices(coord, &ctx->vertices[0][1][0], 8);
46655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
46755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++) {
46855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][2] = 0; /*r*/
46955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][3] = 1; /*q*/
47055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
47155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
47255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
47355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_3d(struct blitter_context_priv *ctx,
474876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     struct pipe_resource *src,
4754c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                     unsigned level,
476876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     unsigned zslice,
47755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x1, unsigned y1,
47855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x2, unsigned y2)
47955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
48055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
4814c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   float r = zslice / (float)u_minify(src->depth0, level);
48255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
4834c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   blitter_set_texcoords_2d(ctx, src, level, x1, y1, x2, y2);
48455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
48555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
48655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][2] = r; /*r*/
48755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
48855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
48955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_cube(struct blitter_context_priv *ctx,
490876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                       struct pipe_resource *src,
4914c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                       unsigned level, unsigned face,
49255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                       unsigned x1, unsigned y1,
49355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                       unsigned x2, unsigned y2)
49455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
49555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
496749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   float coord[4];
497d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul   float st[4][2];
498d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul
4994c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   get_texcoords(src, level, x1, y1, x2, y2, TRUE, coord);
500749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   set_texcoords_in_vertices(coord, &st[0][0], 2);
50155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
5024c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   util_map_texcoords2d_onto_cubemap(face,
50355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     /* pointer, stride in floats */
50455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     &st[0][0], 2,
50555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     &ctx->vertices[0][1][0], 8);
50655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
50755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
50855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][3] = 1; /*q*/
50955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
51055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
5113bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákstatic void blitter_set_dst_dimensions(struct blitter_context_priv *ctx,
5123bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák                                       unsigned width, unsigned height)
5133bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák{
5143bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->dst_width = width;
5153bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->dst_height = height;
5163bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák}
5173bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák
51885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
51985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid **blitter_get_sampler_state(struct blitter_context_priv *ctx,
520d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri                                 int miplevel, boolean normalized)
52185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
5229b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
52385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_sampler_state *sampler_state = &ctx->template_sampler_state;
52485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
52585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(miplevel < PIPE_MAX_TEXTURE_LEVELS);
52685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
52785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Create the sampler state on-demand. */
528d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   if (!ctx->sampler_state[miplevel * 2 + normalized]) {
52985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      sampler_state->lod_bias = miplevel;
53085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      sampler_state->min_lod = miplevel;
53185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      sampler_state->max_lod = miplevel;
532d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      sampler_state->normalized_coords = normalized;
53385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
534d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri      ctx->sampler_state[miplevel * 2 + normalized] = pipe->create_sampler_state(pipe,
53585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                                                sampler_state);
53685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   }
53785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
53885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Return void** so that it can be passed to bind_fragment_sampler_states
53985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák    * directly. */
540d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   return &ctx->sampler_state[miplevel * 2 + normalized];
54185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
54285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
54385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
54485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_col(struct blitter_context_priv *ctx, unsigned num_cbufs)
54585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
5469b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
54785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
54885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(num_cbufs <= PIPE_MAX_COLOR_BUFS);
54985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
550677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   if (!ctx->fs_col[num_cbufs])
551677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas      ctx->fs_col[num_cbufs] =
5525d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák         util_make_fragment_cloneinput_shader(pipe, num_cbufs,
5535d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák                                              TGSI_SEMANTIC_GENERIC,
5545d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák                                              TGSI_INTERPOLATE_LINEAR);
55585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
556677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   return ctx->fs_col[num_cbufs];
55785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
55885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
559d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul/** Convert PIPE_TEXTURE_x to TGSI_TEXTURE_x */
560d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paulstatic unsigned
5613bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákpipe_tex_to_tgsi_tex(enum pipe_texture_target pipe_tex_target)
562d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul{
563d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   switch (pipe_tex_target) {
564d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_1D:
565d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_1D;
566d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_2D:
567d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_2D;
568ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri   case PIPE_TEXTURE_RECT:
569cbe367227959a32ff20e146106162a81d2be02c3Luca Barbieri      return TGSI_TEXTURE_RECT;
570d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_3D:
571d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_3D;
572d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_CUBE:
573d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_CUBE;
574d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   default:
575d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      assert(0 && "unexpected texture target");
576d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_UNKNOWN;
577d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   }
578d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul}
579d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
580d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
58185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
58285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_col(struct blitter_context_priv *ctx,
58385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                  unsigned tex_target)
58485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
5859b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
58685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
58785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(tex_target < PIPE_MAX_TEXTURE_TYPES);
58885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
58985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Create the fragment shader on-demand. */
59085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   if (!ctx->fs_texfetch_col[tex_target]) {
591d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target);
592d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
593d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      ctx->fs_texfetch_col[tex_target] =
594d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul        util_make_fragment_tex_shader(pipe, tgsi_tex, TGSI_INTERPOLATE_LINEAR);
59585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   }
59685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
59785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   return ctx->fs_texfetch_col[tex_target];
59885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
59985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
60085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
60185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_depth(struct blitter_context_priv *ctx,
60285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                    unsigned tex_target)
60385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
6049b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
60585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
60685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(tex_target < PIPE_MAX_TEXTURE_TYPES);
60785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
60885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Create the fragment shader on-demand. */
60985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   if (!ctx->fs_texfetch_depth[tex_target]) {
610d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target);
611d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
612d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      ctx->fs_texfetch_depth[tex_target] =
613d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul         util_make_fragment_tex_shader_writedepth(pipe, tgsi_tex,
614d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul                                                  TGSI_INTERPOLATE_LINEAR);
61585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   }
61685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
61785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   return ctx->fs_texfetch_depth[tex_target];
61885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
61985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
6209be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter,
6219be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   unsigned x1, unsigned y1,
6229be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   unsigned x2, unsigned y2,
6239be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   float depth,
6249be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   enum blitter_attrib_type type,
6259be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   const float attrib[4])
6269be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák{
6279be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
6289be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
6299be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   switch (type) {
6309be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      case UTIL_BLITTER_ATTRIB_COLOR:
6319be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         blitter_set_clear_color(ctx, attrib);
6329be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         break;
6339be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
6349be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      case UTIL_BLITTER_ATTRIB_TEXCOORD:
6359be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         set_texcoords_in_vertices(attrib, &ctx->vertices[0][1][0], 8);
6369be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         break;
6379be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
6389be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      default:;
6399be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   }
6409be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
6419be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter_set_rectangle(ctx, x1, y1, x2, y2, depth);
642588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák   ctx->base.pipe->redefine_user_buffer(ctx->base.pipe, ctx->vbuf,
643588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák                                        0, ctx->vbuf->width0);
644d5062fb3a315c46d77d5c954a3e3c14be1907d33Marek Olšák   util_draw_vertex_buffer(ctx->base.pipe, NULL, ctx->vbuf, 0,
6452a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák                           PIPE_PRIM_TRIANGLE_FAN, 4, 2);
6469be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák}
6479be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
648db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákstatic void util_blitter_clear_custom(struct blitter_context *blitter,
649db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      unsigned width, unsigned height,
650db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      unsigned num_cbufs,
651db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      unsigned clear_buffers,
652db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      const float *rgba,
653db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      double depth, unsigned stencil,
654db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                      void *custom_blend, void *custom_dsa)
65555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
65655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
6579b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
6586a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson   struct pipe_stencil_ref sr = { { 0 } };
65955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
660ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   assert(num_cbufs <= PIPE_MAX_COLOR_BUFS);
66155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
66255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_check_saved_CSOs(ctx);
66355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
66455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* bind CSOs */
665db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   if (custom_blend) {
666db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák      pipe->bind_blend_state(pipe, custom_blend);
667db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else if (clear_buffers & PIPE_CLEAR_COLOR) {
66855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_write_color);
669db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else {
67055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_keep_color);
671db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   }
67255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
673db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   if (custom_dsa) {
674db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe, custom_dsa);
675db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else if ((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) {
6761a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil);
677db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else if (clear_buffers & PIPE_CLEAR_DEPTH) {
678a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil);
679db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else if (clear_buffers & PIPE_CLEAR_STENCIL) {
680a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil);
681db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   } else {
68255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
683db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   }
684db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák
685db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   sr.ref_value[0] = stencil & 0xff;
686db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   pipe->set_stencil_ref(pipe, &sr);
68755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
68855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
689ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
69085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, num_cbufs));
6915d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
69255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
6933bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   blitter_set_dst_dimensions(ctx, width, height);
6949be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter->draw_rectangle(blitter, 0, 0, width, height, depth,
6959be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                           UTIL_BLITTER_ATTRIB_COLOR, rgba);
69655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_restore_CSOs(ctx);
69755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
69855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
699db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid util_blitter_clear(struct blitter_context *blitter,
700db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                        unsigned width, unsigned height,
701db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                        unsigned num_cbufs,
702db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                        unsigned clear_buffers,
703db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                        const float *rgba,
704db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                        double depth, unsigned stencil)
705db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák{
706db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák   util_blitter_clear_custom(blitter, width, height, num_cbufs,
707db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                             clear_buffers, rgba, depth, stencil,
708db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                             NULL, NULL);
709db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák}
710db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák
711db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid util_blitter_clear_depth_custom(struct blitter_context *blitter,
712db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                     unsigned width, unsigned height,
713db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                                     double depth, void *custom_dsa)
714db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák{
715db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák    const float rgba[4] = {0, 0, 0, 0};
716db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák    util_blitter_clear_custom(blitter, width, height, 0,
717db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák                              0, rgba, depth, 0, NULL, custom_dsa);
718db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák}
719db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák
720876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákstatic
721876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákboolean is_overlap(unsigned sx1, unsigned sx2, unsigned sy1, unsigned sy2,
722876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                   unsigned dx1, unsigned dx2, unsigned dy1, unsigned dy2)
723deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie{
724876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   return sx1 < dx2 && sx2 > dx1 && sy1 < dy2 && sy2 > dy1;
725deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie}
726deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie
727876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákvoid util_blitter_copy_region(struct blitter_context *blitter,
728876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              struct pipe_resource *dst,
7294c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                              unsigned dstlevel,
730876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              unsigned dstx, unsigned dsty, unsigned dstz,
731876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              struct pipe_resource *src,
7324c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                              unsigned srclevel,
7334c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                              const struct pipe_box *srcbox,
734876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              boolean ignore_stencil)
73555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
73655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
7379b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
738876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   struct pipe_screen *screen = pipe->screen;
7394c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   struct pipe_surface *dstsurf, surf_templ;
74055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_framebuffer_state fb_state;
741f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   struct pipe_sampler_view viewTempl, *view;
742876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   unsigned bind;
7434c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   unsigned width = srcbox->width;
7444c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   unsigned height = srcbox->height;
745876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   boolean is_stencil, is_depth;
746d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   boolean normalized;
747876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
748876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Give up if textures are not set. */
749876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   assert(dst && src);
750876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   if (!dst || !src)
751876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      return;
752876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
753876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Sanity checks. */
754876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   if (dst == src) {
7554c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      assert(!is_overlap(srcbox->x, srcbox->x + width, srcbox->y, srcbox->y + height,
756876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                         dstx, dstx + width, dsty, dsty + height));
757876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   }
758876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   assert(src->target < PIPE_MAX_TEXTURE_TYPES);
7594c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   /* XXX should handle 3d regions */
7604c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   assert(srcbox->depth == 1);
761876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
762876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Is this a ZS format? */
763876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   is_depth = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 0) != 0;
764876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   is_stencil = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 1) != 0;
765876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
766876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   if (is_depth || is_stencil)
767876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      bind = PIPE_BIND_DEPTH_STENCIL;
768876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   else
769876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      bind = PIPE_BIND_RENDER_TARGET;
770876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
771876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Check if we can sample from and render to the surfaces. */
772876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* (assuming copying a stencil buffer is not possible) */
773cec2082ae515bc91e6b29084ba4b8deac28ef923Stéphane Marchesin   if ((!ignore_stencil && is_stencil) ||
774876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák       !screen->is_format_supported(screen, dst->format, dst->target,
775e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák                                    dst->nr_samples, bind) ||
776876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák       !screen->is_format_supported(screen, src->format, src->target,
777e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák                                    src->nr_samples, PIPE_BIND_SAMPLER_VIEW)) {
778ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák      ctx->base.running = TRUE;
7794c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      util_resource_copy_region(pipe, dst, dstlevel, dstx, dsty, dstz,
7804c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                src, srclevel, srcbox);
781ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák      ctx->base.running = FALSE;
782876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      return;
783876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   }
784876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
7854c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   /* Get surface. */
7864c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   memset(&surf_templ, 0, sizeof(surf_templ));
7874c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   u_surface_default_template(&surf_templ, dst, bind);
788ab21147c899ba1506df38438b6750d3dc5eaabdfHenri Verbeet   surf_templ.format = util_format_linear(dst->format);
7894c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   surf_templ.u.tex.level = dstlevel;
7904c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   surf_templ.u.tex.first_layer = dstz;
7914c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   surf_templ.u.tex.last_layer = dstz;
7924c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   dstsurf = pipe->create_surface(pipe, dst, &surf_templ);
79355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
794876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Check whether the states are properly saved. */
795876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   blitter_check_saved_CSOs(ctx);
79655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   assert(blitter->saved_fb_state.nr_cbufs != ~0);
797f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   assert(blitter->saved_num_sampler_views != ~0);
79855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   assert(blitter->saved_num_sampler_states != ~0);
79955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
800876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Initialize framebuffer state. */
801876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   fb_state.width = dstsurf->width;
802876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   fb_state.height = dstsurf->height;
80355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
80455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   if (is_depth) {
80555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_keep_color);
80655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe,
80755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                           ctx->dsa_write_depth_keep_stencil);
80885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      pipe->bind_fs_state(pipe,
809876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                          blitter_get_fs_texfetch_depth(ctx, src->target));
81055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
81155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      fb_state.nr_cbufs = 0;
812876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      fb_state.zsbuf = dstsurf;
81355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   } else {
81455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_write_color);
81555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
81685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      pipe->bind_fs_state(pipe,
817876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                          blitter_get_fs_texfetch_col(ctx, src->target));
81855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
81955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      fb_state.nr_cbufs = 1;
820876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      fb_state.cbufs[0] = dstsurf;
82155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      fb_state.zsbuf = 0;
82255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
82385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
824d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri   normalized = src->target != PIPE_TEXTURE_RECT;
825d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri
826876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Initialize sampler view. */
827ab21147c899ba1506df38438b6750d3dc5eaabdfHenri Verbeet   u_sampler_view_default_template(&viewTempl, src, util_format_linear(src->format));
828876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   view = pipe->create_sampler_view(pipe, src, &viewTempl);
829f6106566081978f663cf08e54bb8908cb58a5316Michal Krol
830876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Set rasterizer state, shaders, and textures. */
83155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
8325d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
83385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   pipe->bind_fragment_sampler_states(pipe, 1,
8344c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                      blitter_get_sampler_state(ctx, srclevel, normalized));
835ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
836f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   pipe->set_fragment_sampler_views(pipe, 1, &view);
83755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->set_framebuffer_state(pipe, &fb_state);
83855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
8399be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height);
8409be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
841876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   switch (src->target) {
8429be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      /* Draw the quad with the draw_rectangle callback. */
84355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_1D:
84455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_2D:
845ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri      case PIPE_TEXTURE_RECT:
8469be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         {
8479be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák            /* Set texture coordinates. */
8489be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák            float coord[4];
8494c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            get_texcoords(src, srclevel, srcbox->x, srcbox->y,
8504c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          srcbox->x+width, srcbox->y+height, normalized, coord);
8519be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
8529be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák            /* Draw. */
8539be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák            blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0,
8549be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                    UTIL_BLITTER_ATTRIB_TEXCOORD, coord);
8559be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         }
85655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         break;
8579be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
8589be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      /* Draw the quad with the generic codepath. */
85955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_3D:
86055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_CUBE:
8619be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         /* Set texture coordinates. */
8629be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         if (src->target == PIPE_TEXTURE_3D)
8634c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            blitter_set_texcoords_3d(ctx, src, srclevel, srcbox->z,
8644c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                     srcbox->x, srcbox->y,
8654c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                     srcbox->x + width, srcbox->y + height);
8669be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         else
8674c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            blitter_set_texcoords_cube(ctx, src, srclevel, srcbox->z,
8684c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                       srcbox->x, srcbox->y,
8694c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                       srcbox->x + width, srcbox->y + height);
8709be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
8719be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         /* Draw. */
8729be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         blitter_set_rectangle(ctx, dstx, dsty, dstx+width, dsty+height, 0);
873588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák         ctx->base.pipe->redefine_user_buffer(ctx->base.pipe, ctx->vbuf,
874588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák                                              0, ctx->vbuf->width0);
875d5062fb3a315c46d77d5c954a3e3c14be1907d33Marek Olšák         util_draw_vertex_buffer(ctx->base.pipe, NULL, ctx->vbuf, 0,
8762a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák                                 PIPE_PRIM_TRIANGLE_FAN, 4, 2);
87755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         break;
8789be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
879ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák      default:
880ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák         assert(0);
881876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák         return;
88255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
88355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
88455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_restore_CSOs(ctx);
885876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
886876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   pipe_surface_reference(&dstsurf, NULL);
88757c3f70018bc7cd44eafd55d8147691a3c109b91Marek Olšák   pipe_sampler_view_reference(&view, NULL);
88855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
88955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
890a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a color surface to a constant value. */
891a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_render_target(struct blitter_context *blitter,
892a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      struct pipe_surface *dstsurf,
893a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      const float *rgba,
894a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned dstx, unsigned dsty,
895a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned width, unsigned height)
89655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
89755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
8989b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
89955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_framebuffer_state fb_state;
90055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
901a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   assert(dstsurf->texture);
902a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if (!dstsurf->texture)
90355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      return;
90455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
90555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* check the saved state */
90655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_check_saved_CSOs(ctx);
90755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   assert(blitter->saved_fb_state.nr_cbufs != ~0);
90855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
90955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* bind CSOs */
91055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_blend_state(pipe, ctx->blend_write_color);
91155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
91255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
91385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1));
9145d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
915ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
91655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
91755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* set a framebuffer state */
91859e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   fb_state.width = dstsurf->width;
91959e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   fb_state.height = dstsurf->height;
92055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   fb_state.nr_cbufs = 1;
92159e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   fb_state.cbufs[0] = dstsurf;
92255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   fb_state.zsbuf = 0;
92355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->set_framebuffer_state(pipe, &fb_state);
92455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
9253bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height);
9269be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0,
9279be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                           UTIL_BLITTER_ATTRIB_COLOR, rgba);
92855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_restore_CSOs(ctx);
929a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger}
93059e51d9640c242a7c919472d935a91889c7840c9Marek Olšák
931a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a depth stencil surface. */
932a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_depth_stencil(struct blitter_context *blitter,
933a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      struct pipe_surface *dstsurf,
934a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned clear_flags,
935a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      double depth,
936a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned stencil,
937a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned dstx, unsigned dsty,
938a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned width, unsigned height)
939a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger{
940a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
9419b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
942a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct pipe_framebuffer_state fb_state;
943a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct pipe_stencil_ref sr = { { 0 } };
944a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
945a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   assert(dstsurf->texture);
946a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if (!dstsurf->texture)
947a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      return;
948a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
949a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   /* check the saved state */
950a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   blitter_check_saved_CSOs(ctx);
951a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   assert(blitter->saved_fb_state.nr_cbufs != ~0);
952a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
953a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   /* bind CSOs */
954a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_blend_state(pipe, ctx->blend_keep_color);
955a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if ((clear_flags & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) {
956a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      sr.ref_value[0] = stencil & 0xff;
957a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil);
958a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->set_stencil_ref(pipe, &sr);
959a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
960a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else if (clear_flags & PIPE_CLEAR_DEPTH) {
961a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil);
962a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
963a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else if (clear_flags & PIPE_CLEAR_STENCIL) {
964a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      sr.ref_value[0] = stencil & 0xff;
965a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil);
966a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->set_stencil_ref(pipe, &sr);
967a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
968a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else
969a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      /* hmm that should be illegal probably, or make it a no-op somewhere */
970a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
971a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
972a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
973a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0));
9745d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
975a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
976a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
977a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   /* set a framebuffer state */
978a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.width = dstsurf->width;
979a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.height = dstsurf->height;
980a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.nr_cbufs = 0;
981a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.cbufs[0] = 0;
982a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.zsbuf = dstsurf;
983a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->set_framebuffer_state(pipe, &fb_state);
984a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
9853bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height);
9869be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, depth,
9879be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                           UTIL_BLITTER_ATTRIB_NONE, NULL);
988a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   blitter_restore_CSOs(ctx);
98955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
990f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
991c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie/* draw a rectangle across a region using a custom dsa stage - for r600g */
992c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlievoid util_blitter_custom_depth_stencil(struct blitter_context *blitter,
993c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie				       struct pipe_surface *zsurf,
994c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie				       struct pipe_surface *cbsurf,
995c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie				       void *dsa_stage, float depth)
996f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák{
997f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
998f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   struct pipe_context *pipe = ctx->base.pipe;
999f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   struct pipe_framebuffer_state fb_state;
1000f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1001c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   assert(zsurf->texture);
1002c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   if (!zsurf->texture)
1003f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák      return;
1004f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1005f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   /* check the saved state */
1006f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   blitter_check_saved_CSOs(ctx);
1007f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   assert(blitter->saved_fb_state.nr_cbufs != ~0);
1008f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1009f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   /* bind CSOs */
1010c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   pipe->bind_blend_state(pipe, ctx->blend_write_color);
1011c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   pipe->bind_depth_stencil_alpha_state(pipe, dsa_stage);
1012f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1013f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
1014f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0));
10155d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   pipe->bind_vs_state(pipe, ctx->vs);
1016f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
1017f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1018f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   /* set a framebuffer state */
1019c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   fb_state.width = zsurf->width;
1020c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   fb_state.height = zsurf->height;
1021c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   fb_state.nr_cbufs = 1;
1022c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   if (cbsurf) {
1023c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie	   fb_state.cbufs[0] = cbsurf;
1024c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie	   fb_state.nr_cbufs = 1;
1025c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   } else {
1026c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie	   fb_state.cbufs[0] = NULL;
1027c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie	   fb_state.nr_cbufs = 0;
1028c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   }
1029c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   fb_state.zsbuf = zsurf;
1030f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   pipe->set_framebuffer_state(pipe, &fb_state);
1031f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák
1032c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   blitter_set_dst_dimensions(ctx, zsurf->width, zsurf->height);
1033c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie   blitter->draw_rectangle(blitter, 0, 0, zsurf->width, zsurf->height, depth,
1034f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák                           UTIL_BLITTER_ATTRIB_NONE, NULL);
1035f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák   blitter_restore_CSOs(ctx);
1036f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák}
1037