u_blitter.c revision 9be8f7d2267bffd607a759abe5a27099659d34b1
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. */
6655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *vs_col; /**< Vertex shader which passes {pos, color} to the output */
671a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   void *vs_tex; /**< Vertex shader which passes {pos, texcoord} to the output.*/
6855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
6955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* Fragment shaders. */
70677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   /* The shader at index i outputs color to color buffers 0,1,...,i-1. */
71677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   void *fs_col[PIPE_MAX_COLOR_BUFS+1];
72ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
73ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   /* FS which outputs a color from a texture,
74ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák      where the index is PIPE_TEXTURE_* to be sampled. */
75ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   void *fs_texfetch_col[PIPE_MAX_TEXTURE_TYPES];
76ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
77ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   /* FS which outputs a depth from a texture,
78ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák      where the index is PIPE_TEXTURE_* to be sampled. */
79ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   void *fs_texfetch_depth[PIPE_MAX_TEXTURE_TYPES];
8055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
8155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* Blend state. */
8255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *blend_write_color;   /**< blend state with writemask of RGBA */
8355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *blend_keep_color;    /**< blend state with writemask of 0 */
8455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
8555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* Depth stencil alpha state. */
861a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   void *dsa_write_depth_stencil;
8755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *dsa_write_depth_keep_stencil;
8855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *dsa_keep_depth_stencil;
89a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   void *dsa_keep_depth_write_stencil;
9055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
91ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   void *velem_state;
92ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger
93ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   /* Sampler state for clamping to a miplevel. */
94ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   void *sampler_state[PIPE_MAX_TEXTURE_LEVELS];
95ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
96ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   /* Rasterizer state. */
97ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   void *rs_state;
98f6106566081978f663cf08e54bb8908cb58a5316Michal Krol
99932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   /* Viewport state. */
100932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   struct pipe_viewport_state viewport;
101932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
102932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   /* Clip state. */
103932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   struct pipe_clip_state clip;
1043bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák
1053bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   /* Destination surface dimensions. */
1063bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   unsigned dst_width;
1073bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   unsigned dst_height;
10855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák};
10955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
1109be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter,
1119be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   unsigned x, unsigned y,
1129be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   unsigned width, unsigned height,
1139be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   float depth,
1149be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   enum blitter_attrib_type type,
1159be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   const float attrib[4]);
1169be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
1179be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
11855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context *util_blitter_create(struct pipe_context *pipe)
11955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
12055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx;
1210c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   struct pipe_blend_state blend;
1220c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   struct pipe_depth_stencil_alpha_state dsa;
1230c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   struct pipe_rasterizer_state rs_state;
12485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_sampler_state *sampler_state;
125ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   struct pipe_vertex_element velem[2];
12685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   unsigned i;
12755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
12855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx = CALLOC_STRUCT(blitter_context_priv);
12955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   if (!ctx)
13055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      return NULL;
13155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
1329b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.pipe = pipe;
1339be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   ctx->base.draw_rectangle = blitter_draw_rectangle;
13455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
13555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* init state objects for them to be considered invalid */
1369b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_blend_state = INVALID_PTR;
1379b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_dsa_state = INVALID_PTR;
1389b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_rs_state = INVALID_PTR;
1399b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_fs = INVALID_PTR;
1409b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_vs = INVALID_PTR;
1419b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_velem_state = INVALID_PTR;
1429b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_fb_state.nr_cbufs = ~0;
1439b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_num_sampler_views = ~0;
1449b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_num_sampler_states = ~0;
1459b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_num_vertex_buffers = ~0;
14655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
14755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* blend state objects */
1480c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   memset(&blend, 0, sizeof(blend));
14955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->blend_keep_color = pipe->create_blend_state(pipe, &blend);
15055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
151eba1e2a44718bea398e49d496a78ee002c9922b8Roland Scheidegger   blend.rt[0].colormask = PIPE_MASK_RGBA;
15255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->blend_write_color = pipe->create_blend_state(pipe, &blend);
15355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
15455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* depth stencil alpha state objects */
1550c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   memset(&dsa, 0, sizeof(dsa));
15655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->dsa_keep_depth_stencil =
1571a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
15855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
1591a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.depth.enabled = 1;
1601a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.depth.writemask = 1;
1611a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.depth.func = PIPE_FUNC_ALWAYS;
16255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->dsa_write_depth_keep_stencil =
1631a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
1641a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger
1651a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].enabled = 1;
1661a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].func = PIPE_FUNC_ALWAYS;
1671a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE;
1681a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE;
1691a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE;
1701a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].valuemask = 0xff;
1711a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].writemask = 0xff;
1721a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   ctx->dsa_write_depth_stencil =
1731a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
174a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
175a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
176a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   dsa.depth.enabled = 0;
177a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   dsa.depth.writemask = 0;
178a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   ctx->dsa_keep_depth_write_stencil =
179a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
18055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
18155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* sampler state */
18285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state = &ctx->template_sampler_state;
18385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state->wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
18485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state->wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
18585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state->wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
1862ee0d19ccf768c4c12c3c3476c1cd7eff508629aCorbin Simpson   sampler_state->normalized_coords = TRUE;
18785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* The sampler state objects which sample from a specified mipmap level
18885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák    * are created on-demand. */
18955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
19055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* rasterizer state */
19155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   memset(&rs_state, 0, sizeof(rs_state));
1920bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell   rs_state.cull_face = PIPE_FACE_NONE;
19355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   rs_state.gl_rasterization_rules = 1;
1941c75edf3e8ccc97f5f91f42f99c1f8db30b25fc4Corbin Simpson   rs_state.flatshade = 1;
19555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->rs_state = pipe->create_rasterizer_state(pipe, &rs_state);
19655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
197ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   /* vertex elements state */
198ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   memset(&velem[0], 0, sizeof(velem[0]) * 2);
199ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   for (i = 0; i < 2; i++) {
200ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].src_offset = i * 4 * sizeof(float);
201ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].instance_divisor = 0;
202ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].vertex_buffer_index = 0;
203ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
204ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   }
205ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   ctx->velem_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]);
206ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger
20785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* fragment shaders are created on-demand */
20885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
20955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* vertex shaders */
21055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   {
21155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      const uint semantic_names[] = { TGSI_SEMANTIC_POSITION,
21255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                      TGSI_SEMANTIC_COLOR };
21355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      const uint semantic_indices[] = { 0, 0 };
21455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vs_col =
21555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         util_make_vertex_passthrough_shader(pipe, 2, semantic_names,
21655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                             semantic_indices);
21755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
21855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   {
21955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      const uint semantic_names[] = { TGSI_SEMANTIC_POSITION,
22055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                      TGSI_SEMANTIC_GENERIC };
22155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      const uint semantic_indices[] = { 0, 0 };
22255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vs_tex =
22355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         util_make_vertex_passthrough_shader(pipe, 2, semantic_names,
22455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                             semantic_indices);
22555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
22655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
22755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* set invariant vertex coordinates */
22855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
22955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][0][3] = 1; /*v.w*/
23055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
23155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* create the vertex buffer */
2329b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->vbuf = pipe_buffer_create(ctx->base.pipe->screen,
233287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                                  PIPE_BIND_VERTEX_BUFFER,
23455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  sizeof(ctx->vertices));
23555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
2369b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   return &ctx->base;
23755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
23855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
23955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_destroy(struct blitter_context *blitter)
24055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
24155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
2429b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = blitter->pipe;
24355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
24455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
24555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_blend_state(pipe, ctx->blend_write_color);
24655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_blend_state(pipe, ctx->blend_keep_color);
24755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
24855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_depth_stencil_alpha_state(pipe,
24955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                          ctx->dsa_write_depth_keep_stencil);
2501a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil);
251a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil);
2526a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson
25355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_rasterizer_state(pipe, ctx->rs_state);
25455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_vs_state(pipe, ctx->vs_col);
25555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_vs_state(pipe, ctx->vs_tex);
256ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->delete_vertex_elements_state(pipe, ctx->velem_state);
25755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
258ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   for (i = 0; i < PIPE_MAX_TEXTURE_TYPES; i++) {
25985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->fs_texfetch_col[i])
26085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_fs_state(pipe, ctx->fs_texfetch_col[i]);
26185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->fs_texfetch_depth[i])
26285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_fs_state(pipe, ctx->fs_texfetch_depth[i]);
26355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
264ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
265677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   for (i = 0; i <= PIPE_MAX_COLOR_BUFS && ctx->fs_col[i]; i++)
26685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->fs_col[i])
26785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_fs_state(pipe, ctx->fs_col[i]);
26855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
269ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   for (i = 0; i < PIPE_MAX_TEXTURE_LEVELS; i++)
27085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->sampler_state[i])
27185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_sampler_state(pipe, ctx->sampler_state[i]);
272ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
273287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   pipe_resource_reference(&ctx->vbuf, NULL);
27455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   FREE(ctx);
27555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
27655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
27755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_check_saved_CSOs(struct blitter_context_priv *ctx)
27855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
27955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* make sure these CSOs have been saved */
2809b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   assert(ctx->base.saved_blend_state != INVALID_PTR &&
2819b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák          ctx->base.saved_dsa_state != INVALID_PTR &&
2829b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák          ctx->base.saved_rs_state != INVALID_PTR &&
2839b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák          ctx->base.saved_fs != INVALID_PTR &&
2849b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák          ctx->base.saved_vs != INVALID_PTR &&
2859b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák          ctx->base.saved_velem_state != INVALID_PTR);
28655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
28755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
28855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_restore_CSOs(struct blitter_context_priv *ctx)
28955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
2909b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
2918f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák   unsigned i;
29255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
29355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* restore the state objects which are always required to be saved */
2949b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->bind_blend_state(pipe, ctx->base.saved_blend_state);
2959b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->bind_depth_stencil_alpha_state(pipe, ctx->base.saved_dsa_state);
2969b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->bind_rasterizer_state(pipe, ctx->base.saved_rs_state);
2979b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->bind_fs_state(pipe, ctx->base.saved_fs);
2989b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->bind_vs_state(pipe, ctx->base.saved_vs);
2999b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->bind_vertex_elements_state(pipe, ctx->base.saved_velem_state);
30055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3019b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_blend_state = INVALID_PTR;
3029b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_dsa_state = INVALID_PTR;
3039b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_rs_state = INVALID_PTR;
3049b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_fs = INVALID_PTR;
3059b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_vs = INVALID_PTR;
3069b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.saved_velem_state = INVALID_PTR;
30755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3089b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->set_stencil_ref(pipe, &ctx->base.saved_stencil_ref);
309ed0f3b08b65679452132a9caeef1509a8dac23b9Roland Scheidegger
3109b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->set_viewport_state(pipe, &ctx->base.saved_viewport);
3119b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   pipe->set_clip_state(pipe, &ctx->base.saved_clip);
312932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
31355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* restore the state objects which are required to be saved before copy/fill
31455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák    */
3159b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   if (ctx->base.saved_fb_state.nr_cbufs != ~0) {
3169b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      pipe->set_framebuffer_state(pipe, &ctx->base.saved_fb_state);
3179b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      util_assign_framebuffer_state(&ctx->base.saved_fb_state, NULL);
3189b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      ctx->base.saved_fb_state.nr_cbufs = ~0;
31955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
32055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3219b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   if (ctx->base.saved_num_sampler_states != ~0) {
32255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_fragment_sampler_states(pipe,
3239b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák                                         ctx->base.saved_num_sampler_states,
3249b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák                                         ctx->base.saved_sampler_states);
3259b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      ctx->base.saved_num_sampler_states = ~0;
32655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
32755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3289b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   if (ctx->base.saved_num_sampler_views != ~0) {
329f6106566081978f663cf08e54bb8908cb58a5316Michal Krol      pipe->set_fragment_sampler_views(pipe,
3309b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák                                       ctx->base.saved_num_sampler_views,
3319b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák                                       ctx->base.saved_sampler_views);
3320b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák
3339b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      for (i = 0; i < ctx->base.saved_num_sampler_views; i++)
3349b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák         pipe_sampler_view_reference(&ctx->base.saved_sampler_views[i],
3350b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák                                     NULL);
3360b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák
3379b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      ctx->base.saved_num_sampler_views = ~0;
33855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
33964aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri
3409b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   if (ctx->base.saved_num_vertex_buffers != ~0) {
34164aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri      pipe->set_vertex_buffers(pipe,
3429b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák                               ctx->base.saved_num_vertex_buffers,
3439b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák                               ctx->base.saved_vertex_buffers);
3448f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák
3459b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      for (i = 0; i < ctx->base.saved_num_vertex_buffers; i++) {
3469b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák         if (ctx->base.saved_vertex_buffers[i].buffer) {
3479b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák            pipe_resource_reference(&ctx->base.saved_vertex_buffers[i].buffer,
3488f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák                                    NULL);
3498f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák         }
3508f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák      }
3519b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák      ctx->base.saved_num_vertex_buffers = ~0;
35264aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri   }
35355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
35455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
35555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_rectangle(struct blitter_context_priv *ctx,
35655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  unsigned x1, unsigned y1,
35755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  unsigned x2, unsigned y2,
35855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  float depth)
35955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
36055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
36155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
36255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* set vertex positions */
3633bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[0][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v0.x*/
3643bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[0][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v0.y*/
36555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3663bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[1][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v1.x*/
3673bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[1][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v1.y*/
36855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3693bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[2][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v2.x*/
3703bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[2][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v2.y*/
37155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
3723bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[3][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v3.x*/
3733bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->vertices[3][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v3.y*/
37455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
37555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
37655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][0][2] = depth; /*z*/
377932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
378932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   /* viewport */
3793bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->viewport.scale[0] = 0.5f * ctx->dst_width;
3803bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->viewport.scale[1] = 0.5f * ctx->dst_height;
381ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák   ctx->viewport.scale[2] = 1.0f;
382932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->viewport.scale[3] = 1.0f;
3833bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->viewport.translate[0] = 0.5f * ctx->dst_width;
3843bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->viewport.translate[1] = 0.5f * ctx->dst_height;
385ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák   ctx->viewport.translate[2] = 0.0f;
386932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->viewport.translate[3] = 0.0f;
3879b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.pipe->set_viewport_state(ctx->base.pipe, &ctx->viewport);
388932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
389932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   /* clip */
3909b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   ctx->base.pipe->set_clip_state(ctx->base.pipe, &ctx->clip);
39155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
39255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
39355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_clear_color(struct blitter_context_priv *ctx,
39455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                    const float *rgba)
39555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
39655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
39755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
398fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák   if (rgba) {
39916d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      for (i = 0; i < 4; i++) {
40016d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][0] = rgba[0];
40116d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][1] = rgba[1];
40216d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][2] = rgba[2];
40316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][3] = rgba[3];
40416d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      }
405fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák   } else {
40616d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      for (i = 0; i < 4; i++) {
40716d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][0] = 0;
40816d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][1] = 0;
40916d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][2] = 0;
41016d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][3] = 0;
41116d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      }
41255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
41355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
41455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
415749e24521a31178d2b647aa2954c3eecd597b799Marek Olšákstatic void get_normalized_texcoords(struct pipe_resource *src,
416749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák                                     struct pipe_subresource subsrc,
417749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák                                     unsigned x1, unsigned y1,
418749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák                                     unsigned x2, unsigned y2,
419749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák                                     float out[4])
420749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{
421749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = x1 / (float)u_minify(src->width0,  subsrc.level);
422749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = y1 / (float)u_minify(src->height0, subsrc.level);
423749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[2] = x2 / (float)u_minify(src->width0,  subsrc.level);
424749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[3] = y2 / (float)u_minify(src->height0, subsrc.level);
425749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák}
426749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák
427749e24521a31178d2b647aa2954c3eecd597b799Marek Olšákstatic void set_texcoords_in_vertices(const float coord[4],
428749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák                                      float *out, unsigned stride)
429749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{
430749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = coord[0]; /*t0.s*/
431749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = coord[1]; /*t0.t*/
432749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out += stride;
433749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = coord[2]; /*t1.s*/
434749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = coord[1]; /*t1.t*/
435749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out += stride;
436749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = coord[2]; /*t2.s*/
437749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = coord[3]; /*t2.t*/
438749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out += stride;
439749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[0] = coord[0]; /*t3.s*/
440749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   out[1] = coord[3]; /*t3.t*/
441749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák}
442749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák
44355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_2d(struct blitter_context_priv *ctx,
444876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     struct pipe_resource *src,
445876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     struct pipe_subresource subsrc,
44655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x1, unsigned y1,
44755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x2, unsigned y2)
44855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
449749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   unsigned i;
450749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   float coord[4];
45155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
452749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   get_normalized_texcoords(src, subsrc, x1, y1, x2, y2, coord);
453749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   set_texcoords_in_vertices(coord, &ctx->vertices[0][1][0], 8);
45455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
45555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++) {
45655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][2] = 0; /*r*/
45755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][3] = 1; /*q*/
45855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
45955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
46055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
46155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_3d(struct blitter_context_priv *ctx,
462876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     struct pipe_resource *src,
463876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     struct pipe_subresource subsrc,
464876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     unsigned zslice,
46555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x1, unsigned y1,
46655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x2, unsigned y2)
46755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
46855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
469876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   float r = zslice / (float)u_minify(src->depth0, subsrc.level);
47055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
471876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   blitter_set_texcoords_2d(ctx, src, subsrc, x1, y1, x2, y2);
47255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
47355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
47455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][2] = r; /*r*/
47555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
47655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
47755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_cube(struct blitter_context_priv *ctx,
478876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                       struct pipe_resource *src,
479876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                       struct pipe_subresource subsrc,
48055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                       unsigned x1, unsigned y1,
48155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                       unsigned x2, unsigned y2)
48255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
48355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
484749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   float coord[4];
485d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul   float st[4][2];
486d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul
487749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   get_normalized_texcoords(src, subsrc, x1, y1, x2, y2, coord);
488749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák   set_texcoords_in_vertices(coord, &st[0][0], 2);
48955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
490876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   util_map_texcoords2d_onto_cubemap(subsrc.face,
49155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     /* pointer, stride in floats */
49255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     &st[0][0], 2,
49355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     &ctx->vertices[0][1][0], 8);
49455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
49555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
49655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][3] = 1; /*q*/
49755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
49855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
4993bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákstatic void blitter_set_dst_dimensions(struct blitter_context_priv *ctx,
5003bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák                                       unsigned width, unsigned height)
5013bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák{
5023bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->dst_width = width;
5033bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   ctx->dst_height = height;
5043bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák}
5053bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák
50655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_draw_quad(struct blitter_context_priv *ctx)
50755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
5089b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
50955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
51080e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák   /* write vertices and draw them */
511287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   pipe_buffer_write(pipe, ctx->vbuf,
51280e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák                     0, sizeof(ctx->vertices), ctx->vertices);
51355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
51480e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák   util_draw_vertex_buffer(pipe, ctx->vbuf, 0, PIPE_PRIM_TRIANGLE_FAN,
51580e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák                           4,  /* verts */
51680e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák                           2); /* attribs/vert */
51755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
51855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
51985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
52085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid **blitter_get_sampler_state(struct blitter_context_priv *ctx,
52185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                 int miplevel)
52285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
5239b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
52485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_sampler_state *sampler_state = &ctx->template_sampler_state;
52585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
52685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(miplevel < PIPE_MAX_TEXTURE_LEVELS);
52785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
52885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Create the sampler state on-demand. */
52985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   if (!ctx->sampler_state[miplevel]) {
53085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      sampler_state->lod_bias = miplevel;
53185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      sampler_state->min_lod = miplevel;
53285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      sampler_state->max_lod = miplevel;
53385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
53485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      ctx->sampler_state[miplevel] = 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. */
54085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   return &ctx->sampler_state[miplevel];
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] =
55285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         util_make_fragment_clonecolor_shader(pipe, num_cbufs);
55385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
554677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   return ctx->fs_col[num_cbufs];
55585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
55685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
557d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul/** Convert PIPE_TEXTURE_x to TGSI_TEXTURE_x */
558d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paulstatic unsigned
5593bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákpipe_tex_to_tgsi_tex(enum pipe_texture_target pipe_tex_target)
560d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul{
561d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   switch (pipe_tex_target) {
562d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_1D:
563d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_1D;
564d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_2D:
565d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_2D;
566d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_3D:
567d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_3D;
568d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   case PIPE_TEXTURE_CUBE:
569d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_CUBE;
570d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   default:
571d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      assert(0 && "unexpected texture target");
572d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      return TGSI_TEXTURE_UNKNOWN;
573d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   }
574d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul}
575d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
576d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
57785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
57885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_col(struct blitter_context_priv *ctx,
57985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                  unsigned tex_target)
58085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
5819b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
58285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
58385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(tex_target < PIPE_MAX_TEXTURE_TYPES);
58485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
58585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Create the fragment shader on-demand. */
58685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   if (!ctx->fs_texfetch_col[tex_target]) {
587d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target);
588d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
589d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      ctx->fs_texfetch_col[tex_target] =
590d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul        util_make_fragment_tex_shader(pipe, tgsi_tex, TGSI_INTERPOLATE_LINEAR);
59185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   }
59285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
59385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   return ctx->fs_texfetch_col[tex_target];
59485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
59585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
59685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
59785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_depth(struct blitter_context_priv *ctx,
59885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                    unsigned tex_target)
59985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
6009b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
60185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
60285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(tex_target < PIPE_MAX_TEXTURE_TYPES);
60385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
60485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Create the fragment shader on-demand. */
60585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   if (!ctx->fs_texfetch_depth[tex_target]) {
606d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target);
607d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
608d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul      ctx->fs_texfetch_depth[tex_target] =
609d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul         util_make_fragment_tex_shader_writedepth(pipe, tgsi_tex,
610d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul                                                  TGSI_INTERPOLATE_LINEAR);
61185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   }
61285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
61385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   return ctx->fs_texfetch_depth[tex_target];
61485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
61585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
6169be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter,
6179be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   unsigned x1, unsigned y1,
6189be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   unsigned x2, unsigned y2,
6199be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   float depth,
6209be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   enum blitter_attrib_type type,
6219be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                   const float attrib[4])
6229be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák{
6239be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
6249be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
6259be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   switch (type) {
6269be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      case UTIL_BLITTER_ATTRIB_COLOR:
6279be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         blitter_set_clear_color(ctx, attrib);
6289be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         break;
6299be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
6309be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      case UTIL_BLITTER_ATTRIB_TEXCOORD:
6319be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         set_texcoords_in_vertices(attrib, &ctx->vertices[0][1][0], 8);
6329be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         break;
6339be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
6349be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      default:;
6359be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   }
6369be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
6379be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter_set_rectangle(ctx, x1, y1, x2, y2, depth);
6389be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter_draw_quad(ctx);
6399be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák}
6409be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
64155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_clear(struct blitter_context *blitter,
64255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                        unsigned width, unsigned height,
64355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                        unsigned num_cbufs,
64455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                        unsigned clear_buffers,
64555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                        const float *rgba,
64655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                        double depth, unsigned stencil)
64755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
64855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
6499b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
6506a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson   struct pipe_stencil_ref sr = { { 0 } };
65155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
652ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   assert(num_cbufs <= PIPE_MAX_COLOR_BUFS);
65355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
65455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_check_saved_CSOs(ctx);
65555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
65655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* bind CSOs */
65755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   if (clear_buffers & PIPE_CLEAR_COLOR)
65855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_write_color);
65955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   else
66055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_keep_color);
66155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
662a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if ((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) {
6631a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      sr.ref_value[0] = stencil & 0xff;
6641a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil);
6651a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->set_stencil_ref(pipe, &sr);
6661a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   }
667a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else if (clear_buffers & PIPE_CLEAR_DEPTH) {
668a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil);
669a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
670a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else if (clear_buffers & PIPE_CLEAR_STENCIL) {
671a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      sr.ref_value[0] = stencil & 0xff;
672a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil);
673a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->set_stencil_ref(pipe, &sr);
674a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
67555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   else
67655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
67755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
67855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
679ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
68085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, num_cbufs));
68155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_vs_state(pipe, ctx->vs_col);
68255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
6833bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   blitter_set_dst_dimensions(ctx, width, height);
6849be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter->draw_rectangle(blitter, 0, 0, width, height, depth,
6859be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                           UTIL_BLITTER_ATTRIB_COLOR, rgba);
68655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_restore_CSOs(ctx);
68755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
68855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
689876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákstatic
690876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákboolean is_overlap(unsigned sx1, unsigned sx2, unsigned sy1, unsigned sy2,
691876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                   unsigned dx1, unsigned dx2, unsigned dy1, unsigned dy2)
692deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie{
693876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   return sx1 < dx2 && sx2 > dx1 && sy1 < dy2 && sy2 > dy1;
694deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie}
695deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie
696876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákvoid util_blitter_copy_region(struct blitter_context *blitter,
697876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              struct pipe_resource *dst,
698876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              struct pipe_subresource subdst,
699876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              unsigned dstx, unsigned dsty, unsigned dstz,
700876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              struct pipe_resource *src,
701876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              struct pipe_subresource subsrc,
702876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              unsigned srcx, unsigned srcy, unsigned srcz,
703876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              unsigned width, unsigned height,
704876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              boolean ignore_stencil)
70555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
70655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
7079b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
708876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   struct pipe_screen *screen = pipe->screen;
709876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   struct pipe_surface *dstsurf;
71055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_framebuffer_state fb_state;
711f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   struct pipe_sampler_view viewTempl, *view;
712876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   unsigned bind;
713876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   boolean is_stencil, is_depth;
714876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
715876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Give up if textures are not set. */
716876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   assert(dst && src);
717876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   if (!dst || !src)
718876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      return;
719876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
720876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Sanity checks. */
721876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   if (dst == src) {
722876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      assert(!is_overlap(srcx, srcx + width, srcy, srcy + height,
723876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                         dstx, dstx + width, dsty, dsty + height));
724876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   } else {
725876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      assert(dst->format == src->format);
726876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   }
727876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   assert(src->target < PIPE_MAX_TEXTURE_TYPES);
728876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
729876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Is this a ZS format? */
730876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   is_depth = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 0) != 0;
731876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   is_stencil = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 1) != 0;
732876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
733876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   if (is_depth || is_stencil)
734876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      bind = PIPE_BIND_DEPTH_STENCIL;
735876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   else
736876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      bind = PIPE_BIND_RENDER_TARGET;
737876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
738876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Check if we can sample from and render to the surfaces. */
739876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* (assuming copying a stencil buffer is not possible) */
740876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák    if ((!ignore_stencil && is_stencil) ||
741876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák       !screen->is_format_supported(screen, dst->format, dst->target,
742876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                    dst->nr_samples, bind, 0) ||
743876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák       !screen->is_format_supported(screen, src->format, src->target,
744876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                    src->nr_samples, PIPE_BIND_SAMPLER_VIEW, 0)) {
745876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      util_resource_copy_region(pipe, dst, subdst, dstx, dsty, dstz,
746876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                src, subsrc, srcx, srcy, srcz, width, height);
747876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      return;
748876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   }
749876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
750876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Get surfaces. */
751876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   dstsurf = screen->get_tex_surface(screen, dst,
752876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     subdst.face, subdst.level, dstz,
753876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     bind);
75455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
755876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Check whether the states are properly saved. */
756876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   blitter_check_saved_CSOs(ctx);
75755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   assert(blitter->saved_fb_state.nr_cbufs != ~0);
758f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   assert(blitter->saved_num_sampler_views != ~0);
75955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   assert(blitter->saved_num_sampler_states != ~0);
76055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
761876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Initialize framebuffer state. */
762876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   fb_state.width = dstsurf->width;
763876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   fb_state.height = dstsurf->height;
76455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
76555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   if (is_depth) {
76655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_keep_color);
76755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe,
76855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                           ctx->dsa_write_depth_keep_stencil);
76985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      pipe->bind_fs_state(pipe,
770876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                          blitter_get_fs_texfetch_depth(ctx, src->target));
77155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
77255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      fb_state.nr_cbufs = 0;
773876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      fb_state.zsbuf = dstsurf;
77455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   } else {
77555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_write_color);
77655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
77785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      pipe->bind_fs_state(pipe,
778876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                          blitter_get_fs_texfetch_col(ctx, src->target));
77955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
78055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      fb_state.nr_cbufs = 1;
781876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      fb_state.cbufs[0] = dstsurf;
78255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      fb_state.zsbuf = 0;
78355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
78485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
785876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Initialize sampler view. */
786876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   u_sampler_view_default_template(&viewTempl, src, src->format);
787876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   view = pipe->create_sampler_view(pipe, src, &viewTempl);
788f6106566081978f663cf08e54bb8908cb58a5316Michal Krol
789876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Set rasterizer state, shaders, and textures. */
79055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
79155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_vs_state(pipe, ctx->vs_tex);
79285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   pipe->bind_fragment_sampler_states(pipe, 1,
793876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                      blitter_get_sampler_state(ctx, subsrc.level));
794ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
795f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   pipe->set_fragment_sampler_views(pipe, 1, &view);
79655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->set_framebuffer_state(pipe, &fb_state);
79755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
7989be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height);
7999be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
800876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   switch (src->target) {
8019be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      /* Draw the quad with the draw_rectangle callback. */
80255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_1D:
80355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_2D:
8049be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         {
8059be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák            /* Set texture coordinates. */
8069be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák            float coord[4];
8079be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák            get_normalized_texcoords(src, subsrc, srcx, srcy,
8089be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                     srcx+width, srcy+height, coord);
8099be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
8109be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák            /* Draw. */
8119be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák            blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0,
8129be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                    UTIL_BLITTER_ATTRIB_TEXCOORD, coord);
8139be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         }
81455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         break;
8159be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
8169be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák      /* Draw the quad with the generic codepath. */
81755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_3D:
81855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_CUBE:
8199be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         /* Set texture coordinates. */
8209be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         if (src->target == PIPE_TEXTURE_3D)
8219be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák            blitter_set_texcoords_3d(ctx, src, subsrc, srcz,
8229be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                     srcx, srcy, srcx+width, srcy+height);
8239be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         else
8249be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák            blitter_set_texcoords_cube(ctx, src, subsrc,
8259be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                                       srcx, srcy, srcx+width, srcy+height);
8269be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
8279be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         /* Draw. */
8289be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         blitter_set_rectangle(ctx, dstx, dsty, dstx+width, dsty+height, 0);
8299be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák         blitter_draw_quad(ctx);
83055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         break;
8319be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák
832ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák      default:
833ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák         assert(0);
834876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák         return;
83555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
83655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
83755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_restore_CSOs(ctx);
838876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
839876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   pipe_surface_reference(&dstsurf, NULL);
84057c3f70018bc7cd44eafd55d8147691a3c109b91Marek Olšák   pipe_sampler_view_reference(&view, NULL);
84155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
84255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
843a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a color surface to a constant value. */
844a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_render_target(struct blitter_context *blitter,
845a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      struct pipe_surface *dstsurf,
846a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      const float *rgba,
847a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned dstx, unsigned dsty,
848a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned width, unsigned height)
84955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
85055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
8519b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
85255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_framebuffer_state fb_state;
85355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
854a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   assert(dstsurf->texture);
855a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if (!dstsurf->texture)
85655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      return;
85755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
85855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* check the saved state */
85955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_check_saved_CSOs(ctx);
86055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   assert(blitter->saved_fb_state.nr_cbufs != ~0);
86155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
86255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* bind CSOs */
86355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_blend_state(pipe, ctx->blend_write_color);
86455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
86555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
86685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1));
86755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_vs_state(pipe, ctx->vs_col);
868ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
86955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
87055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* set a framebuffer state */
87159e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   fb_state.width = dstsurf->width;
87259e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   fb_state.height = dstsurf->height;
87355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   fb_state.nr_cbufs = 1;
87459e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   fb_state.cbufs[0] = dstsurf;
87555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   fb_state.zsbuf = 0;
87655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->set_framebuffer_state(pipe, &fb_state);
87755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
8783bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height);
8799be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0,
8809be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                           UTIL_BLITTER_ATTRIB_COLOR, rgba);
88155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_restore_CSOs(ctx);
882a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger}
88359e51d9640c242a7c919472d935a91889c7840c9Marek Olšák
884a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a depth stencil surface. */
885a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_depth_stencil(struct blitter_context *blitter,
886a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      struct pipe_surface *dstsurf,
887a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned clear_flags,
888a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      double depth,
889a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned stencil,
890a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned dstx, unsigned dsty,
891a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned width, unsigned height)
892a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger{
893a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
8949b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák   struct pipe_context *pipe = ctx->base.pipe;
895a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct pipe_framebuffer_state fb_state;
896a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct pipe_stencil_ref sr = { { 0 } };
897a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
898a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   assert(dstsurf->texture);
899a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if (!dstsurf->texture)
900a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      return;
901a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
902a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   /* check the saved state */
903a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   blitter_check_saved_CSOs(ctx);
904a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   assert(blitter->saved_fb_state.nr_cbufs != ~0);
905a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
906a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   /* bind CSOs */
907a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_blend_state(pipe, ctx->blend_keep_color);
908a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if ((clear_flags & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) {
909a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      sr.ref_value[0] = stencil & 0xff;
910a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil);
911a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->set_stencil_ref(pipe, &sr);
912a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
913a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else if (clear_flags & PIPE_CLEAR_DEPTH) {
914a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil);
915a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
916a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else if (clear_flags & PIPE_CLEAR_STENCIL) {
917a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      sr.ref_value[0] = stencil & 0xff;
918a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil);
919a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->set_stencil_ref(pipe, &sr);
920a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
921a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else
922a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      /* hmm that should be illegal probably, or make it a no-op somewhere */
923a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
924a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
925a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
926a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0));
927a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_vs_state(pipe, ctx->vs_col);
928a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
929a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
930a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   /* set a framebuffer state */
931a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.width = dstsurf->width;
932a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.height = dstsurf->height;
933a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.nr_cbufs = 0;
934a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.cbufs[0] = 0;
935a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.zsbuf = dstsurf;
936a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->set_framebuffer_state(pipe, &fb_state);
937a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
9383bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák   blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height);
9399be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák   blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, depth,
9409be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák                           UTIL_BLITTER_ATTRIB_NONE, NULL);
941a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   blitter_restore_CSOs(ctx);
94255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
943