u_blitter.c revision 8f17e011c341ff78ada9543545c1f41caf66b2e9
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{
5555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context blitter;
5655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
5755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_context *pipe; /**< pipe context */
58287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource *vbuf;  /**< quad */
5955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
6055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   float vertices[4][2][4];   /**< {pos, color} or {pos, texcoord} */
6155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
6285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Templates for various state objects. */
6385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_sampler_state template_sampler_state;
6485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
6555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* Constant state objects. */
6655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* Vertex shaders. */
6755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *vs_col; /**< Vertex shader which passes {pos, color} to the output */
681a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   void *vs_tex; /**< Vertex shader which passes {pos, texcoord} to the output.*/
6955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
7055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* Fragment shaders. */
71677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   /* The shader at index i outputs color to color buffers 0,1,...,i-1. */
72677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   void *fs_col[PIPE_MAX_COLOR_BUFS+1];
73ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
74ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   /* FS which outputs a color from a texture,
75ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák      where the index is PIPE_TEXTURE_* to be sampled. */
76ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   void *fs_texfetch_col[PIPE_MAX_TEXTURE_TYPES];
77ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
78ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   /* FS which outputs a depth from a texture,
79ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák      where the index is PIPE_TEXTURE_* to be sampled. */
80ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   void *fs_texfetch_depth[PIPE_MAX_TEXTURE_TYPES];
8155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
8255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* Blend state. */
8355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *blend_write_color;   /**< blend state with writemask of RGBA */
8455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *blend_keep_color;    /**< blend state with writemask of 0 */
8555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
8655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* Depth stencil alpha state. */
871a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   void *dsa_write_depth_stencil;
8855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *dsa_write_depth_keep_stencil;
8955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *dsa_keep_depth_stencil;
90a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   void *dsa_keep_depth_write_stencil;
9155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
92ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   void *velem_state;
93ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger
94ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   /* Sampler state for clamping to a miplevel. */
95ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   void *sampler_state[PIPE_MAX_TEXTURE_LEVELS];
96ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
97ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   /* Rasterizer state. */
98ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   void *rs_state;
99f6106566081978f663cf08e54bb8908cb58a5316Michal Krol
100f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   struct pipe_sampler_view *sampler_view;
1013ce4375912c8ea488460e593e07c5bb15b92dca9Michal Krol
102932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   /* Viewport state. */
103932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   struct pipe_viewport_state viewport;
104932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
105932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   /* Clip state. */
106932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   struct pipe_clip_state clip;
10755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák};
10855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
10955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context *util_blitter_create(struct pipe_context *pipe)
11055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
11155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx;
1120c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   struct pipe_blend_state blend;
1130c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   struct pipe_depth_stencil_alpha_state dsa;
1140c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   struct pipe_rasterizer_state rs_state;
11585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_sampler_state *sampler_state;
116ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   struct pipe_vertex_element velem[2];
11785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   unsigned i;
11855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
11955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx = CALLOC_STRUCT(blitter_context_priv);
12055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   if (!ctx)
12155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      return NULL;
12255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
12355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->pipe = pipe;
12455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
12555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* init state objects for them to be considered invalid */
126a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák   ctx->blitter.saved_blend_state = INVALID_PTR;
127a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák   ctx->blitter.saved_dsa_state = INVALID_PTR;
128a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák   ctx->blitter.saved_rs_state = INVALID_PTR;
129a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák   ctx->blitter.saved_fs = INVALID_PTR;
130a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák   ctx->blitter.saved_vs = INVALID_PTR;
131ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   ctx->blitter.saved_velem_state = INVALID_PTR;
13255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->blitter.saved_fb_state.nr_cbufs = ~0;
133f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   ctx->blitter.saved_num_sampler_views = ~0;
13455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->blitter.saved_num_sampler_states = ~0;
13564aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri   ctx->blitter.saved_num_vertex_buffers = ~0;
13655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
13755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* blend state objects */
1380c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   memset(&blend, 0, sizeof(blend));
13955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->blend_keep_color = pipe->create_blend_state(pipe, &blend);
14055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
141eba1e2a44718bea398e49d496a78ee002c9922b8Roland Scheidegger   blend.rt[0].colormask = PIPE_MASK_RGBA;
14255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->blend_write_color = pipe->create_blend_state(pipe, &blend);
14355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
14455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* depth stencil alpha state objects */
1450c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   memset(&dsa, 0, sizeof(dsa));
14655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->dsa_keep_depth_stencil =
1471a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
14855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
1491a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.depth.enabled = 1;
1501a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.depth.writemask = 1;
1511a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.depth.func = PIPE_FUNC_ALWAYS;
15255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->dsa_write_depth_keep_stencil =
1531a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
1541a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger
1551a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].enabled = 1;
1561a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].func = PIPE_FUNC_ALWAYS;
1571a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE;
1581a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE;
1591a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE;
1601a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].valuemask = 0xff;
1611a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].writemask = 0xff;
1621a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   ctx->dsa_write_depth_stencil =
1631a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
164a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
165a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
166a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   dsa.depth.enabled = 0;
167a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   dsa.depth.writemask = 0;
168a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   ctx->dsa_keep_depth_write_stencil =
169a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
17055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
17155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* sampler state */
17285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state = &ctx->template_sampler_state;
17385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state->wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
17485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state->wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
17585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state->wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
1762ee0d19ccf768c4c12c3c3476c1cd7eff508629aCorbin Simpson   sampler_state->normalized_coords = TRUE;
17785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* The sampler state objects which sample from a specified mipmap level
17885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák    * are created on-demand. */
17955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
18055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* rasterizer state */
18155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   memset(&rs_state, 0, sizeof(rs_state));
1820bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell   rs_state.cull_face = PIPE_FACE_NONE;
18355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   rs_state.gl_rasterization_rules = 1;
1841c75edf3e8ccc97f5f91f42f99c1f8db30b25fc4Corbin Simpson   rs_state.flatshade = 1;
18555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->rs_state = pipe->create_rasterizer_state(pipe, &rs_state);
18655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
187ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   /* vertex elements state */
188ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   memset(&velem[0], 0, sizeof(velem[0]) * 2);
189ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   for (i = 0; i < 2; i++) {
190ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].src_offset = i * 4 * sizeof(float);
191ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].instance_divisor = 0;
192ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].vertex_buffer_index = 0;
193ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
194ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   }
195ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   ctx->velem_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]);
196ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger
19785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* fragment shaders are created on-demand */
19885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
19955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* vertex shaders */
20055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   {
20155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      const uint semantic_names[] = { TGSI_SEMANTIC_POSITION,
20255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                      TGSI_SEMANTIC_COLOR };
20355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      const uint semantic_indices[] = { 0, 0 };
20455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vs_col =
20555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         util_make_vertex_passthrough_shader(pipe, 2, semantic_names,
20655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                             semantic_indices);
20755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
20855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   {
20955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      const uint semantic_names[] = { TGSI_SEMANTIC_POSITION,
21055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                      TGSI_SEMANTIC_GENERIC };
21155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      const uint semantic_indices[] = { 0, 0 };
21255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vs_tex =
21355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         util_make_vertex_passthrough_shader(pipe, 2, semantic_names,
21455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                             semantic_indices);
21555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
21655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
21755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* set invariant vertex coordinates */
21855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
21955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][0][3] = 1; /*v.w*/
22055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
22155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* create the vertex buffer */
22255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->vbuf = pipe_buffer_create(ctx->pipe->screen,
223287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                                  PIPE_BIND_VERTEX_BUFFER,
22455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  sizeof(ctx->vertices));
22555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
22655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   return &ctx->blitter;
22755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
22855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
22955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_destroy(struct blitter_context *blitter)
23055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
23155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
23255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_context *pipe = ctx->pipe;
23355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
23455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
23555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_blend_state(pipe, ctx->blend_write_color);
23655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_blend_state(pipe, ctx->blend_keep_color);
23755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
23855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_depth_stencil_alpha_state(pipe,
23955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                          ctx->dsa_write_depth_keep_stencil);
2401a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil);
241a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil);
2426a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson
24355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_rasterizer_state(pipe, ctx->rs_state);
24455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_vs_state(pipe, ctx->vs_col);
24555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_vs_state(pipe, ctx->vs_tex);
246ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->delete_vertex_elements_state(pipe, ctx->velem_state);
24755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
248ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   for (i = 0; i < PIPE_MAX_TEXTURE_TYPES; i++) {
24985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->fs_texfetch_col[i])
25085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_fs_state(pipe, ctx->fs_texfetch_col[i]);
25185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->fs_texfetch_depth[i])
25285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_fs_state(pipe, ctx->fs_texfetch_depth[i]);
25355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
254ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
255677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   for (i = 0; i <= PIPE_MAX_COLOR_BUFS && ctx->fs_col[i]; i++)
25685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->fs_col[i])
25785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_fs_state(pipe, ctx->fs_col[i]);
25855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
259ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   for (i = 0; i < PIPE_MAX_TEXTURE_LEVELS; i++)
26085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->sampler_state[i])
26185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_sampler_state(pipe, ctx->sampler_state[i]);
262ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
263f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   if (ctx->sampler_view) {
264f6106566081978f663cf08e54bb8908cb58a5316Michal Krol      pipe_sampler_view_reference(&ctx->sampler_view, NULL);
265f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   }
266f6106566081978f663cf08e54bb8908cb58a5316Michal Krol
267287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   pipe_resource_reference(&ctx->vbuf, NULL);
26855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   FREE(ctx);
26955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
27055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
27155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_check_saved_CSOs(struct blitter_context_priv *ctx)
27255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
27355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* make sure these CSOs have been saved */
274a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák   assert(ctx->blitter.saved_blend_state != INVALID_PTR &&
275a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák          ctx->blitter.saved_dsa_state != INVALID_PTR &&
276a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák          ctx->blitter.saved_rs_state != INVALID_PTR &&
277a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák          ctx->blitter.saved_fs != INVALID_PTR &&
278ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger          ctx->blitter.saved_vs != INVALID_PTR &&
279ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger          ctx->blitter.saved_velem_state != INVALID_PTR);
28055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
28155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
28255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_restore_CSOs(struct blitter_context_priv *ctx)
28355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
28455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_context *pipe = ctx->pipe;
2858f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák   unsigned i;
28655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
28755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* restore the state objects which are always required to be saved */
28855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_blend_state(pipe, ctx->blitter.saved_blend_state);
28955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_depth_stencil_alpha_state(pipe, ctx->blitter.saved_dsa_state);
29055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->blitter.saved_rs_state);
29155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_fs_state(pipe, ctx->blitter.saved_fs);
29255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_vs_state(pipe, ctx->blitter.saved_vs);
293ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->blitter.saved_velem_state);
29455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
295a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák   ctx->blitter.saved_blend_state = INVALID_PTR;
296a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák   ctx->blitter.saved_dsa_state = INVALID_PTR;
297a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák   ctx->blitter.saved_rs_state = INVALID_PTR;
298a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák   ctx->blitter.saved_fs = INVALID_PTR;
299a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák   ctx->blitter.saved_vs = INVALID_PTR;
300ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   ctx->blitter.saved_velem_state = INVALID_PTR;
30155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
302ed0f3b08b65679452132a9caeef1509a8dac23b9Roland Scheidegger   pipe->set_stencil_ref(pipe, &ctx->blitter.saved_stencil_ref);
303ed0f3b08b65679452132a9caeef1509a8dac23b9Roland Scheidegger
304932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   pipe->set_viewport_state(pipe, &ctx->blitter.saved_viewport);
305932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   pipe->set_clip_state(pipe, &ctx->blitter.saved_clip);
306932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
30755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* restore the state objects which are required to be saved before copy/fill
30855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák    */
30955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   if (ctx->blitter.saved_fb_state.nr_cbufs != ~0) {
31055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->set_framebuffer_state(pipe, &ctx->blitter.saved_fb_state);
31155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->blitter.saved_fb_state.nr_cbufs = ~0;
31255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
31355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
31455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   if (ctx->blitter.saved_num_sampler_states != ~0) {
31555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_fragment_sampler_states(pipe,
31655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                         ctx->blitter.saved_num_sampler_states,
31755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                         ctx->blitter.saved_sampler_states);
31855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->blitter.saved_num_sampler_states = ~0;
31955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
32055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
321f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   if (ctx->blitter.saved_num_sampler_views != ~0) {
322f6106566081978f663cf08e54bb8908cb58a5316Michal Krol      pipe->set_fragment_sampler_views(pipe,
323f6106566081978f663cf08e54bb8908cb58a5316Michal Krol                                       ctx->blitter.saved_num_sampler_views,
324f6106566081978f663cf08e54bb8908cb58a5316Michal Krol                                       ctx->blitter.saved_sampler_views);
325f6106566081978f663cf08e54bb8908cb58a5316Michal Krol      ctx->blitter.saved_num_sampler_views = ~0;
32655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
32764aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri
32864aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri   if (ctx->blitter.saved_num_vertex_buffers != ~0) {
32964aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri      pipe->set_vertex_buffers(pipe,
33016d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák                               ctx->blitter.saved_num_vertex_buffers,
33116d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák                               ctx->blitter.saved_vertex_buffers);
3328f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák
3338f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák      for (i = 0; i < ctx->blitter.saved_num_vertex_buffers; i++) {
3348f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák         if (ctx->blitter.saved_vertex_buffers[i].buffer) {
3358f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák            pipe_resource_reference(&ctx->blitter.saved_vertex_buffers[i].buffer,
3368f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák                                    NULL);
3378f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák         }
3388f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák      }
33964aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri      ctx->blitter.saved_num_vertex_buffers = ~0;
34064aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri   }
34155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
34255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
34355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_rectangle(struct blitter_context_priv *ctx,
34455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  unsigned x1, unsigned y1,
34555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  unsigned x2, unsigned y2,
346932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol                                  unsigned width, unsigned height,
34755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  float depth)
34855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
34955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
35055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
35155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* set vertex positions */
352932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->vertices[0][0][0] = (float)x1 / width * 2.0f - 1.0f; /*v0.x*/
353932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->vertices[0][0][1] = (float)y1 / height * 2.0f - 1.0f; /*v0.y*/
35455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
355932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->vertices[1][0][0] = (float)x2 / width * 2.0f - 1.0f; /*v1.x*/
356932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->vertices[1][0][1] = (float)y1 / height * 2.0f - 1.0f; /*v1.y*/
35755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
358932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->vertices[2][0][0] = (float)x2 / width * 2.0f - 1.0f; /*v2.x*/
359932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->vertices[2][0][1] = (float)y2 / height * 2.0f - 1.0f; /*v2.y*/
36055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
361932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->vertices[3][0][0] = (float)x1 / width * 2.0f - 1.0f; /*v3.x*/
362932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->vertices[3][0][1] = (float)y2 / height * 2.0f - 1.0f; /*v3.y*/
36355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
36455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
36555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][0][2] = depth; /*z*/
366932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
367932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   /* viewport */
368932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->viewport.scale[0] = 0.5f * width;
369932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->viewport.scale[1] = 0.5f * height;
370ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák   ctx->viewport.scale[2] = 1.0f;
371932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->viewport.scale[3] = 1.0f;
372932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->viewport.translate[0] = 0.5f * width;
373932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->viewport.translate[1] = 0.5f * height;
374ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák   ctx->viewport.translate[2] = 0.0f;
375932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->viewport.translate[3] = 0.0f;
376932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->pipe->set_viewport_state(ctx->pipe, &ctx->viewport);
377932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
378932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   /* clip */
379932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->pipe->set_clip_state(ctx->pipe, &ctx->clip);
38055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
38155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
38255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_clear_color(struct blitter_context_priv *ctx,
38355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                    const float *rgba)
38455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
38555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
38655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
387fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák   if (rgba) {
38816d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      for (i = 0; i < 4; i++) {
38916d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][0] = rgba[0];
39016d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][1] = rgba[1];
39116d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][2] = rgba[2];
39216d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][3] = rgba[3];
39316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      }
394fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák   } else {
39516d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      for (i = 0; i < 4; i++) {
39616d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][0] = 0;
39716d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][1] = 0;
39816d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][2] = 0;
39916d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][3] = 0;
40016d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      }
40155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
40255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
40355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
40455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_2d(struct blitter_context_priv *ctx,
405876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     struct pipe_resource *src,
406876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     struct pipe_subresource subsrc,
40755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x1, unsigned y1,
40855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x2, unsigned y2)
40955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
41055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
411876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   float s1 = x1 / (float)u_minify(src->width0,  subsrc.level);
412876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   float t1 = y1 / (float)u_minify(src->height0, subsrc.level);
413876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   float s2 = x2 / (float)u_minify(src->width0,  subsrc.level);
414876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   float t2 = y2 / (float)u_minify(src->height0, subsrc.level);
41555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
41655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->vertices[0][1][0] = s1; /*t0.s*/
41755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->vertices[0][1][1] = t1; /*t0.t*/
41855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
41955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->vertices[1][1][0] = s2; /*t1.s*/
42055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->vertices[1][1][1] = t1; /*t1.t*/
42155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
42255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->vertices[2][1][0] = s2; /*t2.s*/
42355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->vertices[2][1][1] = t2; /*t2.t*/
42455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
42555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->vertices[3][1][0] = s1; /*t3.s*/
42655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->vertices[3][1][1] = t2; /*t3.t*/
42755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
42855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++) {
42955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][2] = 0; /*r*/
43055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][3] = 1; /*q*/
43155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
43255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
43355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
43455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_3d(struct blitter_context_priv *ctx,
435876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     struct pipe_resource *src,
436876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     struct pipe_subresource subsrc,
437876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     unsigned zslice,
43855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x1, unsigned y1,
43955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x2, unsigned y2)
44055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
44155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
442876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   float r = zslice / (float)u_minify(src->depth0, subsrc.level);
44355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
444876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   blitter_set_texcoords_2d(ctx, src, subsrc, x1, y1, x2, y2);
44555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
44655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
44755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][2] = r; /*r*/
44855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
44955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
45055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_cube(struct blitter_context_priv *ctx,
451876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                       struct pipe_resource *src,
452876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                       struct pipe_subresource subsrc,
45355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                       unsigned x1, unsigned y1,
45455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                       unsigned x2, unsigned y2)
45555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
45655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
457876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   float s1 = x1 / (float)u_minify(src->width0,  subsrc.level);
458876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   float t1 = y1 / (float)u_minify(src->height0, subsrc.level);
459876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   float s2 = x2 / (float)u_minify(src->width0,  subsrc.level);
460876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   float t2 = y2 / (float)u_minify(src->height0, subsrc.level);
461d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul   float st[4][2];
462d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul
463d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul   st[0][0] = s1;
464d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul   st[0][1] = t1;
465d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul   st[1][0] = s2;
466d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul   st[1][1] = t1;
467d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul   st[2][0] = s2;
468d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul   st[2][1] = t2;
469d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul   st[3][0] = s1;
470d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul   st[3][1] = t2;
47155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
472876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   util_map_texcoords2d_onto_cubemap(subsrc.face,
47355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     /* pointer, stride in floats */
47455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     &st[0][0], 2,
47555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     &ctx->vertices[0][1][0], 8);
47655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
47755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
47855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][3] = 1; /*q*/
47955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
48055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
48155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_draw_quad(struct blitter_context_priv *ctx)
48255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
48355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_context *pipe = ctx->pipe;
48455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
48580e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák   /* write vertices and draw them */
486287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   pipe_buffer_write(pipe, ctx->vbuf,
48780e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák                     0, sizeof(ctx->vertices), ctx->vertices);
48855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
48980e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák   util_draw_vertex_buffer(pipe, ctx->vbuf, 0, PIPE_PRIM_TRIANGLE_FAN,
49080e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák                           4,  /* verts */
49180e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák                           2); /* attribs/vert */
49255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
49355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
49485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
49585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid **blitter_get_sampler_state(struct blitter_context_priv *ctx,
49685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                 int miplevel)
49785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
49885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_context *pipe = ctx->pipe;
49985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_sampler_state *sampler_state = &ctx->template_sampler_state;
50085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
50185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(miplevel < PIPE_MAX_TEXTURE_LEVELS);
50285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
50385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Create the sampler state on-demand. */
50485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   if (!ctx->sampler_state[miplevel]) {
50585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      sampler_state->lod_bias = miplevel;
50685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      sampler_state->min_lod = miplevel;
50785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      sampler_state->max_lod = miplevel;
50885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
50985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      ctx->sampler_state[miplevel] = pipe->create_sampler_state(pipe,
51085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                                                sampler_state);
51185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   }
51285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
51385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Return void** so that it can be passed to bind_fragment_sampler_states
51485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák    * directly. */
51585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   return &ctx->sampler_state[miplevel];
51685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
51785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
51885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
51985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_col(struct blitter_context_priv *ctx, unsigned num_cbufs)
52085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
52185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_context *pipe = ctx->pipe;
52285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
52385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(num_cbufs <= PIPE_MAX_COLOR_BUFS);
52485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
525677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   if (!ctx->fs_col[num_cbufs])
526677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas      ctx->fs_col[num_cbufs] =
52785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         util_make_fragment_clonecolor_shader(pipe, num_cbufs);
52885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
529677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   return ctx->fs_col[num_cbufs];
53085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
53185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
532d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul/** Convert PIPE_TEXTURE_x to TGSI_TEXTURE_x */
533d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paulstatic unsigned
534d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paulpipe_tex_to_tgsi_tex(unsigned pipe_tex_target)
535d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul{
536d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   switch (pipe_tex_target) {
537d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_1D:
538d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_1D;
539d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_2D:
540d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_2D;
541d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_3D:
542d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_3D;
543d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_CUBE:
544d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_CUBE;
545d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   default:
546d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      assert(0 && "unexpected texture target");
547d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_UNKNOWN;
548d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   }
549d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul}
550d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
551d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
55285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
55385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_col(struct blitter_context_priv *ctx,
55485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                  unsigned tex_target)
55585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
55685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_context *pipe = ctx->pipe;
55785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
55885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(tex_target < PIPE_MAX_TEXTURE_TYPES);
55985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
56085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Create the fragment shader on-demand. */
56185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   if (!ctx->fs_texfetch_col[tex_target]) {
562d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target);
563d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
564d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      ctx->fs_texfetch_col[tex_target] =
565d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul        util_make_fragment_tex_shader(pipe, tgsi_tex, TGSI_INTERPOLATE_LINEAR);
56685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   }
56785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
56885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   return ctx->fs_texfetch_col[tex_target];
56985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
57085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
57185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
57285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_depth(struct blitter_context_priv *ctx,
57385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                    unsigned tex_target)
57485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
57585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_context *pipe = ctx->pipe;
57685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
57785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(tex_target < PIPE_MAX_TEXTURE_TYPES);
57885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
57985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Create the fragment shader on-demand. */
58085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   if (!ctx->fs_texfetch_depth[tex_target]) {
581d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target);
582d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
583d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      ctx->fs_texfetch_depth[tex_target] =
584d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul         util_make_fragment_tex_shader_writedepth(pipe, tgsi_tex,
585d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul                                                  TGSI_INTERPOLATE_LINEAR);
58685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   }
58785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
58885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   return ctx->fs_texfetch_depth[tex_target];
58985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
59085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
59155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_clear(struct blitter_context *blitter,
59255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                        unsigned width, unsigned height,
59355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                        unsigned num_cbufs,
59455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                        unsigned clear_buffers,
59555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                        const float *rgba,
59655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                        double depth, unsigned stencil)
59755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
59855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
59955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_context *pipe = ctx->pipe;
6006a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson   struct pipe_stencil_ref sr = { { 0 } };
60155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
602ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   assert(num_cbufs <= PIPE_MAX_COLOR_BUFS);
60355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
60455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_check_saved_CSOs(ctx);
60555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
60655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* bind CSOs */
60755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   if (clear_buffers & PIPE_CLEAR_COLOR)
60855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_write_color);
60955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   else
61055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_keep_color);
61155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
612a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if ((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) {
6131a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      sr.ref_value[0] = stencil & 0xff;
6141a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil);
6151a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->set_stencil_ref(pipe, &sr);
6161a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   }
617a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else if (clear_buffers & PIPE_CLEAR_DEPTH) {
618a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil);
619a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
620a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else if (clear_buffers & PIPE_CLEAR_STENCIL) {
621a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      sr.ref_value[0] = stencil & 0xff;
622a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil);
623a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->set_stencil_ref(pipe, &sr);
624a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
62555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   else
62655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
62755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
62855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
629ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
63085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, num_cbufs));
63155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_vs_state(pipe, ctx->vs_col);
63255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
63355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_set_clear_color(ctx, rgba);
634932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   blitter_set_rectangle(ctx, 0, 0, width, height, width, height, depth);
63555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_draw_quad(ctx);
63655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_restore_CSOs(ctx);
63755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
63855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
639876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákstatic
640876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákboolean is_overlap(unsigned sx1, unsigned sx2, unsigned sy1, unsigned sy2,
641876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                   unsigned dx1, unsigned dx2, unsigned dy1, unsigned dy2)
642deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie{
643876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   return sx1 < dx2 && sx2 > dx1 && sy1 < dy2 && sy2 > dy1;
644deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie}
645deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie
646876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákvoid util_blitter_copy_region(struct blitter_context *blitter,
647876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              struct pipe_resource *dst,
648876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              struct pipe_subresource subdst,
649876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              unsigned dstx, unsigned dsty, unsigned dstz,
650876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              struct pipe_resource *src,
651876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              struct pipe_subresource subsrc,
652876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              unsigned srcx, unsigned srcy, unsigned srcz,
653876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              unsigned width, unsigned height,
654876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              boolean ignore_stencil)
65555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
65655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
65755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_context *pipe = ctx->pipe;
658876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   struct pipe_screen *screen = pipe->screen;
659876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   struct pipe_surface *dstsurf;
66055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_framebuffer_state fb_state;
661f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   struct pipe_sampler_view viewTempl, *view;
662876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   unsigned bind;
663876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   boolean is_stencil, is_depth;
664876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
665876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Give up if textures are not set. */
666876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   assert(dst && src);
667876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   if (!dst || !src)
668876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      return;
669876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
670876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Sanity checks. */
671876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   if (dst == src) {
672876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      assert(!is_overlap(srcx, srcx + width, srcy, srcy + height,
673876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                         dstx, dstx + width, dsty, dsty + height));
674876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   } else {
675876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      assert(dst->format == src->format);
676876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   }
677876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   assert(src->target < PIPE_MAX_TEXTURE_TYPES);
678876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
679876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Is this a ZS format? */
680876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   is_depth = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 0) != 0;
681876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   is_stencil = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 1) != 0;
682876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
683876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   if (is_depth || is_stencil)
684876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      bind = PIPE_BIND_DEPTH_STENCIL;
685876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   else
686876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      bind = PIPE_BIND_RENDER_TARGET;
687876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
688876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Check if we can sample from and render to the surfaces. */
689876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* (assuming copying a stencil buffer is not possible) */
690876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák    if ((!ignore_stencil && is_stencil) ||
691876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák       !screen->is_format_supported(screen, dst->format, dst->target,
692876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                    dst->nr_samples, bind, 0) ||
693876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák       !screen->is_format_supported(screen, src->format, src->target,
694876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                    src->nr_samples, PIPE_BIND_SAMPLER_VIEW, 0)) {
695876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      util_resource_copy_region(pipe, dst, subdst, dstx, dsty, dstz,
696876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                src, subsrc, srcx, srcy, srcz, width, height);
697876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      return;
698876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   }
699876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
700876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Get surfaces. */
701876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   dstsurf = screen->get_tex_surface(screen, dst,
702876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     subdst.face, subdst.level, dstz,
703876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     bind);
70455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
705876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Check whether the states are properly saved. */
706876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   blitter_check_saved_CSOs(ctx);
70755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   assert(blitter->saved_fb_state.nr_cbufs != ~0);
708f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   assert(blitter->saved_num_sampler_views != ~0);
70955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   assert(blitter->saved_num_sampler_states != ~0);
71055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
711876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Initialize framebuffer state. */
712876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   fb_state.width = dstsurf->width;
713876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   fb_state.height = dstsurf->height;
71455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
71555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   if (is_depth) {
71655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_keep_color);
71755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe,
71855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                           ctx->dsa_write_depth_keep_stencil);
71985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      pipe->bind_fs_state(pipe,
720876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                          blitter_get_fs_texfetch_depth(ctx, src->target));
72155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
72255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      fb_state.nr_cbufs = 0;
723876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      fb_state.zsbuf = dstsurf;
72455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   } else {
72555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_write_color);
72655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
72785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      pipe->bind_fs_state(pipe,
728876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                          blitter_get_fs_texfetch_col(ctx, src->target));
72955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
73055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      fb_state.nr_cbufs = 1;
731876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      fb_state.cbufs[0] = dstsurf;
73255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      fb_state.zsbuf = 0;
73355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
73485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
735876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Initialize sampler view. */
736876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   u_sampler_view_default_template(&viewTempl, src, src->format);
737876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   view = pipe->create_sampler_view(pipe, src, &viewTempl);
738f6106566081978f663cf08e54bb8908cb58a5316Michal Krol
739f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   if (ctx->sampler_view) {
740f6106566081978f663cf08e54bb8908cb58a5316Michal Krol      pipe_sampler_view_reference(&ctx->sampler_view, NULL);
741f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   }
742f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   ctx->sampler_view = view;
743f6106566081978f663cf08e54bb8908cb58a5316Michal Krol
744876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Set rasterizer state, shaders, and textures. */
74555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
74655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_vs_state(pipe, ctx->vs_tex);
74785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   pipe->bind_fragment_sampler_states(pipe, 1,
748876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                      blitter_get_sampler_state(ctx, subsrc.level));
749ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
750f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   pipe->set_fragment_sampler_views(pipe, 1, &view);
75155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->set_framebuffer_state(pipe, &fb_state);
75255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
753876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Set texture coordinates. */
754876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   switch (src->target) {
75555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_1D:
75655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_2D:
757876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák         blitter_set_texcoords_2d(ctx, src, subsrc,
758876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                  srcx, srcy, srcx+width, srcy+height);
75955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         break;
76055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_3D:
761876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák         blitter_set_texcoords_3d(ctx, src, subsrc, srcz,
762876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                  srcx, srcy, srcx+width, srcy+height);
76355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         break;
76455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_CUBE:
765876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák         blitter_set_texcoords_cube(ctx, src, subsrc,
766876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                    srcx, srcy, srcx+width, srcy+height);
76755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         break;
768ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák      default:
769ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák         assert(0);
770876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák         return;
77155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
77255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
773876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   blitter_set_rectangle(ctx, dstx, dsty, dstx+width, dsty+height,
774876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                         dstsurf->width, dstsurf->height, 0);
77555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_draw_quad(ctx);
77655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_restore_CSOs(ctx);
777876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
778876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   pipe_surface_reference(&dstsurf, NULL);
77955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
78055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
781a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a color surface to a constant value. */
782a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_render_target(struct blitter_context *blitter,
783a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      struct pipe_surface *dstsurf,
784a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      const float *rgba,
785a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned dstx, unsigned dsty,
786a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned width, unsigned height)
78755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
78855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
78955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_context *pipe = ctx->pipe;
79055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_framebuffer_state fb_state;
79155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
792a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   assert(dstsurf->texture);
793a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if (!dstsurf->texture)
79455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      return;
79555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
79655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* check the saved state */
79755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_check_saved_CSOs(ctx);
79855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   assert(blitter->saved_fb_state.nr_cbufs != ~0);
79955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
80055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* bind CSOs */
80155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_blend_state(pipe, ctx->blend_write_color);
80255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
80355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
80485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1));
80555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_vs_state(pipe, ctx->vs_col);
806ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
80755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
80855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* set a framebuffer state */
80959e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   fb_state.width = dstsurf->width;
81059e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   fb_state.height = dstsurf->height;
81155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   fb_state.nr_cbufs = 1;
81259e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   fb_state.cbufs[0] = dstsurf;
81355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   fb_state.zsbuf = 0;
81455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->set_framebuffer_state(pipe, &fb_state);
81555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
81655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_set_clear_color(ctx, rgba);
81759e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   blitter_set_rectangle(ctx, 0, 0, width, height, dstsurf->width, dstsurf->height, 0);
81855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_draw_quad(ctx);
81955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_restore_CSOs(ctx);
820a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger}
82159e51d9640c242a7c919472d935a91889c7840c9Marek Olšák
822a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a depth stencil surface. */
823a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_depth_stencil(struct blitter_context *blitter,
824a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      struct pipe_surface *dstsurf,
825a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned clear_flags,
826a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      double depth,
827a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned stencil,
828a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned dstx, unsigned dsty,
829a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned width, unsigned height)
830a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger{
831a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
832a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct pipe_context *pipe = ctx->pipe;
833a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct pipe_framebuffer_state fb_state;
834a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct pipe_stencil_ref sr = { { 0 } };
835a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
836a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   assert(dstsurf->texture);
837a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if (!dstsurf->texture)
838a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      return;
839a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
840a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   /* check the saved state */
841a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   blitter_check_saved_CSOs(ctx);
842a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   assert(blitter->saved_fb_state.nr_cbufs != ~0);
843a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
844a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   /* bind CSOs */
845a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_blend_state(pipe, ctx->blend_keep_color);
846a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if ((clear_flags & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) {
847a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      sr.ref_value[0] = stencil & 0xff;
848a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil);
849a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->set_stencil_ref(pipe, &sr);
850a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
851a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else if (clear_flags & PIPE_CLEAR_DEPTH) {
852a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil);
853a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
854a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else if (clear_flags & PIPE_CLEAR_STENCIL) {
855a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      sr.ref_value[0] = stencil & 0xff;
856a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil);
857a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->set_stencil_ref(pipe, &sr);
858a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
859a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else
860a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      /* hmm that should be illegal probably, or make it a no-op somewhere */
861a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
862a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
863a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
864a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0));
865a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_vs_state(pipe, ctx->vs_col);
866a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
867a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
868a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   /* set a framebuffer state */
869a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.width = dstsurf->width;
870a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.height = dstsurf->height;
871a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.nr_cbufs = 0;
872a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.cbufs[0] = 0;
873a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.zsbuf = dstsurf;
874a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->set_framebuffer_state(pipe, &fb_state);
875a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
876a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   blitter_set_rectangle(ctx, 0, 0, width, height, dstsurf->width, dstsurf->height, depth);
877a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   blitter_draw_quad(ctx);
878a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   blitter_restore_CSOs(ctx);
87955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
880