u_blitter.c revision a6e5c6c000df8655de3b41d5809547bb41c88c23
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"
4655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_pack_color.h"
47f6106566081978f663cf08e54bb8908cb58a5316Michal Krol#include "util/u_sampler.h"
4855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_simple_shaders.h"
498b0c217f2bc123bffd25cc4977d6abb1b3fa8186Brian Paul#include "util/u_surface.h"
5055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_texture.h"
5155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
52a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák#define INVALID_PTR ((void*)~0)
53a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák
5455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context_priv
5555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
5655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context blitter;
5755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
5855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_context *pipe; /**< pipe context */
59287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource *vbuf;  /**< quad */
6055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
6155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   float vertices[4][2][4];   /**< {pos, color} or {pos, texcoord} */
6255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
6385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Templates for various state objects. */
6485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_sampler_state template_sampler_state;
6585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
6655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* Constant state objects. */
6755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* Vertex shaders. */
6855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *vs_col; /**< Vertex shader which passes {pos, color} to the output */
691a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   void *vs_tex; /**< Vertex shader which passes {pos, texcoord} to the output.*/
7055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
7155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* Fragment shaders. */
72677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   /* The shader at index i outputs color to color buffers 0,1,...,i-1. */
73677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   void *fs_col[PIPE_MAX_COLOR_BUFS+1];
74ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
75ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   /* FS which outputs a color from a texture,
76ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák      where the index is PIPE_TEXTURE_* to be sampled. */
77ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   void *fs_texfetch_col[PIPE_MAX_TEXTURE_TYPES];
78ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
79ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   /* FS which outputs a depth from a texture,
80ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák      where the index is PIPE_TEXTURE_* to be sampled. */
81ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   void *fs_texfetch_depth[PIPE_MAX_TEXTURE_TYPES];
8255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
8355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* Blend state. */
8455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *blend_write_color;   /**< blend state with writemask of RGBA */
8555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *blend_keep_color;    /**< blend state with writemask of 0 */
8655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
8755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* Depth stencil alpha state. */
881a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   void *dsa_write_depth_stencil;
8955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *dsa_write_depth_keep_stencil;
9055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   void *dsa_keep_depth_stencil;
91a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   void *dsa_keep_depth_write_stencil;
9255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
93ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   void *velem_state;
94ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger
95ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   /* Sampler state for clamping to a miplevel. */
96ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   void *sampler_state[PIPE_MAX_TEXTURE_LEVELS];
97ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
98ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   /* Rasterizer state. */
99ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   void *rs_state;
100f6106566081978f663cf08e54bb8908cb58a5316Michal Krol
101f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   struct pipe_sampler_view *sampler_view;
1023ce4375912c8ea488460e593e07c5bb15b92dca9Michal Krol
103932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   /* Viewport state. */
104932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   struct pipe_viewport_state viewport;
105932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
106932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   /* Clip state. */
107932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   struct pipe_clip_state clip;
10855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák};
10955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
11055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context *util_blitter_create(struct pipe_context *pipe)
11155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
11255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx;
1130c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   struct pipe_blend_state blend;
1140c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   struct pipe_depth_stencil_alpha_state dsa;
1150c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   struct pipe_rasterizer_state rs_state;
11685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_sampler_state *sampler_state;
117ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   struct pipe_vertex_element velem[2];
11885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   unsigned i;
11955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
12055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx = CALLOC_STRUCT(blitter_context_priv);
12155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   if (!ctx)
12255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      return NULL;
12355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
12455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->pipe = pipe;
12555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
12655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* init state objects for them to be considered invalid */
127a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák   ctx->blitter.saved_blend_state = INVALID_PTR;
128a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák   ctx->blitter.saved_dsa_state = INVALID_PTR;
129a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák   ctx->blitter.saved_rs_state = INVALID_PTR;
130a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák   ctx->blitter.saved_fs = INVALID_PTR;
131a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák   ctx->blitter.saved_vs = INVALID_PTR;
132ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   ctx->blitter.saved_velem_state = INVALID_PTR;
13355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->blitter.saved_fb_state.nr_cbufs = ~0;
134f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   ctx->blitter.saved_num_sampler_views = ~0;
13555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->blitter.saved_num_sampler_states = ~0;
13664aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri   ctx->blitter.saved_num_vertex_buffers = ~0;
13755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
13855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* blend state objects */
1390c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   memset(&blend, 0, sizeof(blend));
14055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->blend_keep_color = pipe->create_blend_state(pipe, &blend);
14155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
142eba1e2a44718bea398e49d496a78ee002c9922b8Roland Scheidegger   blend.rt[0].colormask = PIPE_MASK_RGBA;
14355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->blend_write_color = pipe->create_blend_state(pipe, &blend);
14455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
14555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* depth stencil alpha state objects */
1460c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul   memset(&dsa, 0, sizeof(dsa));
14755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->dsa_keep_depth_stencil =
1481a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
14955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
1501a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.depth.enabled = 1;
1511a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.depth.writemask = 1;
1521a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.depth.func = PIPE_FUNC_ALWAYS;
15355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->dsa_write_depth_keep_stencil =
1541a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
1551a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger
1561a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].enabled = 1;
1571a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].func = PIPE_FUNC_ALWAYS;
1581a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE;
1591a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE;
1601a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE;
1611a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].valuemask = 0xff;
1621a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   dsa.stencil[0].writemask = 0xff;
1631a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   ctx->dsa_write_depth_stencil =
1641a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
165a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
166a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
167a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   dsa.depth.enabled = 0;
168a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   dsa.depth.writemask = 0;
169a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   ctx->dsa_keep_depth_write_stencil =
170a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->create_depth_stencil_alpha_state(pipe, &dsa);
17155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
17255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* sampler state */
17385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state = &ctx->template_sampler_state;
17485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state->wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
17585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state->wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
17685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   sampler_state->wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
1772ee0d19ccf768c4c12c3c3476c1cd7eff508629aCorbin Simpson   sampler_state->normalized_coords = TRUE;
17885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* The sampler state objects which sample from a specified mipmap level
17985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák    * are created on-demand. */
18055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
18155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* rasterizer state */
18255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   memset(&rs_state, 0, sizeof(rs_state));
1830bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell   rs_state.cull_face = PIPE_FACE_NONE;
18455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   rs_state.gl_rasterization_rules = 1;
1851c75edf3e8ccc97f5f91f42f99c1f8db30b25fc4Corbin Simpson   rs_state.flatshade = 1;
18655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->rs_state = pipe->create_rasterizer_state(pipe, &rs_state);
18755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
188ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   /* vertex elements state */
189ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   memset(&velem[0], 0, sizeof(velem[0]) * 2);
190ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   for (i = 0; i < 2; i++) {
191ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].src_offset = i * 4 * sizeof(float);
192ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].instance_divisor = 0;
193ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].vertex_buffer_index = 0;
194ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger      velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
195ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   }
196ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   ctx->velem_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]);
197ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger
19885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* fragment shaders are created on-demand */
19985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
20055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* vertex shaders */
20155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   {
20255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      const uint semantic_names[] = { TGSI_SEMANTIC_POSITION,
20355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                      TGSI_SEMANTIC_COLOR };
20455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      const uint semantic_indices[] = { 0, 0 };
20555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vs_col =
20655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         util_make_vertex_passthrough_shader(pipe, 2, semantic_names,
20755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                             semantic_indices);
20855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
20955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   {
21055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      const uint semantic_names[] = { TGSI_SEMANTIC_POSITION,
21155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                      TGSI_SEMANTIC_GENERIC };
21255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      const uint semantic_indices[] = { 0, 0 };
21355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vs_tex =
21455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         util_make_vertex_passthrough_shader(pipe, 2, semantic_names,
21555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                             semantic_indices);
21655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
21755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
21855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* set invariant vertex coordinates */
21955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
22055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][0][3] = 1; /*v.w*/
22155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
22255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* create the vertex buffer */
22355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->vbuf = pipe_buffer_create(ctx->pipe->screen,
224287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                                  PIPE_BIND_VERTEX_BUFFER,
22555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  sizeof(ctx->vertices));
22655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
22755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   return &ctx->blitter;
22855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
22955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
23055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_destroy(struct blitter_context *blitter)
23155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
23255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
23355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_context *pipe = ctx->pipe;
23455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
23555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
23655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_blend_state(pipe, ctx->blend_write_color);
23755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_blend_state(pipe, ctx->blend_keep_color);
23855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
23955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_depth_stencil_alpha_state(pipe,
24055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                          ctx->dsa_write_depth_keep_stencil);
2411a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil);
242a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil);
2436a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson
24455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_rasterizer_state(pipe, ctx->rs_state);
24555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_vs_state(pipe, ctx->vs_col);
24655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->delete_vs_state(pipe, ctx->vs_tex);
247ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->delete_vertex_elements_state(pipe, ctx->velem_state);
24855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
249ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   for (i = 0; i < PIPE_MAX_TEXTURE_TYPES; i++) {
25085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->fs_texfetch_col[i])
25185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_fs_state(pipe, ctx->fs_texfetch_col[i]);
25285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->fs_texfetch_depth[i])
25385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_fs_state(pipe, ctx->fs_texfetch_depth[i]);
25455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
255ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
256677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   for (i = 0; i <= PIPE_MAX_COLOR_BUFS && ctx->fs_col[i]; i++)
25785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->fs_col[i])
25885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_fs_state(pipe, ctx->fs_col[i]);
25955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
260ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   for (i = 0; i < PIPE_MAX_TEXTURE_LEVELS; i++)
26185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      if (ctx->sampler_state[i])
26285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         pipe->delete_sampler_state(pipe, ctx->sampler_state[i]);
263ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák
264f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   if (ctx->sampler_view) {
265f6106566081978f663cf08e54bb8908cb58a5316Michal Krol      pipe_sampler_view_reference(&ctx->sampler_view, NULL);
266f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   }
267f6106566081978f663cf08e54bb8908cb58a5316Michal Krol
268287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   pipe_resource_reference(&ctx->vbuf, NULL);
26955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   FREE(ctx);
27055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
27155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
27255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_check_saved_CSOs(struct blitter_context_priv *ctx)
27355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
27455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* make sure these CSOs have been saved */
275a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák   assert(ctx->blitter.saved_blend_state != INVALID_PTR &&
276a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák          ctx->blitter.saved_dsa_state != INVALID_PTR &&
277a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák          ctx->blitter.saved_rs_state != INVALID_PTR &&
278a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák          ctx->blitter.saved_fs != INVALID_PTR &&
279ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger          ctx->blitter.saved_vs != INVALID_PTR &&
280ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger          ctx->blitter.saved_velem_state != INVALID_PTR);
28155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
28255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
28355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_restore_CSOs(struct blitter_context_priv *ctx)
28455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
28555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_context *pipe = ctx->pipe;
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);
33264aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri      ctx->blitter.saved_num_vertex_buffers = ~0;
33364aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri   }
33455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
33555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
33655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_rectangle(struct blitter_context_priv *ctx,
33755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  unsigned x1, unsigned y1,
33855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  unsigned x2, unsigned y2,
339932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol                                  unsigned width, unsigned height,
34055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                  float depth)
34155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
34255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
34355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
34455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* set vertex positions */
345932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->vertices[0][0][0] = (float)x1 / width * 2.0f - 1.0f; /*v0.x*/
346932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->vertices[0][0][1] = (float)y1 / height * 2.0f - 1.0f; /*v0.y*/
34755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
348932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->vertices[1][0][0] = (float)x2 / width * 2.0f - 1.0f; /*v1.x*/
349932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->vertices[1][0][1] = (float)y1 / height * 2.0f - 1.0f; /*v1.y*/
35055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
351932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->vertices[2][0][0] = (float)x2 / width * 2.0f - 1.0f; /*v2.x*/
352932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->vertices[2][0][1] = (float)y2 / height * 2.0f - 1.0f; /*v2.y*/
35355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
354932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->vertices[3][0][0] = (float)x1 / width * 2.0f - 1.0f; /*v3.x*/
355932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->vertices[3][0][1] = (float)y2 / height * 2.0f - 1.0f; /*v3.y*/
35655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
35755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
35855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][0][2] = depth; /*z*/
359932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
360932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   /* viewport */
361932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->viewport.scale[0] = 0.5f * width;
362932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->viewport.scale[1] = 0.5f * height;
363ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák   ctx->viewport.scale[2] = 1.0f;
364932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->viewport.scale[3] = 1.0f;
365932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->viewport.translate[0] = 0.5f * width;
366932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->viewport.translate[1] = 0.5f * height;
367ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák   ctx->viewport.translate[2] = 0.0f;
368932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->viewport.translate[3] = 0.0f;
369932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->pipe->set_viewport_state(ctx->pipe, &ctx->viewport);
370932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol
371932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   /* clip */
372932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   ctx->pipe->set_clip_state(ctx->pipe, &ctx->clip);
37355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
37455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
37555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_clear_color(struct blitter_context_priv *ctx,
37655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                    const float *rgba)
37755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
37855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
37955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
380fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák   if (rgba) {
38116d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      for (i = 0; i < 4; i++) {
38216d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][0] = rgba[0];
38316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][1] = rgba[1];
38416d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][2] = rgba[2];
38516d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][3] = rgba[3];
38616d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      }
387fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák   } else {
38816d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      for (i = 0; i < 4; i++) {
38916d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][0] = 0;
39016d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][1] = 0;
39116d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][2] = 0;
39216d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák         ctx->vertices[i][1][3] = 0;
39316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák      }
39455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
39555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
39655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
39755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_2d(struct blitter_context_priv *ctx,
398876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     struct pipe_resource *src,
399876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     struct pipe_subresource subsrc,
40055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x1, unsigned y1,
40155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x2, unsigned y2)
40255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
40355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
404876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   float s1 = x1 / (float)u_minify(src->width0,  subsrc.level);
405876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   float t1 = y1 / (float)u_minify(src->height0, subsrc.level);
406876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   float s2 = x2 / (float)u_minify(src->width0,  subsrc.level);
407876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   float t2 = y2 / (float)u_minify(src->height0, subsrc.level);
40855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
40955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->vertices[0][1][0] = s1; /*t0.s*/
41055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->vertices[0][1][1] = t1; /*t0.t*/
41155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
41255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->vertices[1][1][0] = s2; /*t1.s*/
41355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->vertices[1][1][1] = t1; /*t1.t*/
41455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
41555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->vertices[2][1][0] = s2; /*t2.s*/
41655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->vertices[2][1][1] = t2; /*t2.t*/
41755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
41855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->vertices[3][1][0] = s1; /*t3.s*/
41955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   ctx->vertices[3][1][1] = t2; /*t3.t*/
42055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
42155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++) {
42255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][2] = 0; /*r*/
42355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][3] = 1; /*q*/
42455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
42555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
42655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
42755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_3d(struct blitter_context_priv *ctx,
428876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     struct pipe_resource *src,
429876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     struct pipe_subresource subsrc,
430876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     unsigned zslice,
43155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x1, unsigned y1,
43255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     unsigned x2, unsigned y2)
43355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
43455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
435876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   float r = zslice / (float)u_minify(src->depth0, subsrc.level);
43655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
437876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   blitter_set_texcoords_2d(ctx, src, subsrc, x1, y1, x2, y2);
43855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
43955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
44055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][2] = r; /*r*/
44155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
44255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
44355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_cube(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{
44955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   int i;
450876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   float s1 = x1 / (float)u_minify(src->width0,  subsrc.level);
451876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   float t1 = y1 / (float)u_minify(src->height0, subsrc.level);
452876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   float s2 = x2 / (float)u_minify(src->width0,  subsrc.level);
453876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   float t2 = y2 / (float)u_minify(src->height0, subsrc.level);
454d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul   float st[4][2];
455d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul
456d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul   st[0][0] = s1;
457d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul   st[0][1] = t1;
458d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul   st[1][0] = s2;
459d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul   st[1][1] = t1;
460d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul   st[2][0] = s2;
461d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul   st[2][1] = t2;
462d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul   st[3][0] = s1;
463d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul   st[3][1] = t2;
46455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
465876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   util_map_texcoords2d_onto_cubemap(subsrc.face,
46655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     /* pointer, stride in floats */
46755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     &st[0][0], 2,
46855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                     &ctx->vertices[0][1][0], 8);
46955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
47055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   for (i = 0; i < 4; i++)
47155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      ctx->vertices[i][1][3] = 1; /*q*/
47255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
47355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
47455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_draw_quad(struct blitter_context_priv *ctx)
47555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
47655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_context *pipe = ctx->pipe;
47755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
47880e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák   /* write vertices and draw them */
479287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   pipe_buffer_write(pipe, ctx->vbuf,
48080e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák                     0, sizeof(ctx->vertices), ctx->vertices);
48155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
48280e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák   util_draw_vertex_buffer(pipe, ctx->vbuf, 0, PIPE_PRIM_TRIANGLE_FAN,
48380e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák                           4,  /* verts */
48480e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák                           2); /* attribs/vert */
48555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
48655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
48785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
48885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid **blitter_get_sampler_state(struct blitter_context_priv *ctx,
48985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                 int miplevel)
49085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
49185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_context *pipe = ctx->pipe;
49285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_sampler_state *sampler_state = &ctx->template_sampler_state;
49385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
49485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(miplevel < PIPE_MAX_TEXTURE_LEVELS);
49585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
49685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Create the sampler state on-demand. */
49785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   if (!ctx->sampler_state[miplevel]) {
49885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      sampler_state->lod_bias = miplevel;
49985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      sampler_state->min_lod = miplevel;
50085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      sampler_state->max_lod = miplevel;
50185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
50285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      ctx->sampler_state[miplevel] = pipe->create_sampler_state(pipe,
50385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                                                sampler_state);
50485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   }
50585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
50685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Return void** so that it can be passed to bind_fragment_sampler_states
50785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák    * directly. */
50885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   return &ctx->sampler_state[miplevel];
50985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
51085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
51185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
51285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_col(struct blitter_context_priv *ctx, unsigned num_cbufs)
51385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
51485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_context *pipe = ctx->pipe;
51585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
51685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(num_cbufs <= PIPE_MAX_COLOR_BUFS);
51785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
518677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   if (!ctx->fs_col[num_cbufs])
519677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas      ctx->fs_col[num_cbufs] =
52085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         util_make_fragment_clonecolor_shader(pipe, num_cbufs);
52185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
522677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas   return ctx->fs_col[num_cbufs];
52385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
52485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
52585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
52685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_col(struct blitter_context_priv *ctx,
52785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                  unsigned tex_target)
52885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
52985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_context *pipe = ctx->pipe;
53085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
53185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(tex_target < PIPE_MAX_TEXTURE_TYPES);
53285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
53385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Create the fragment shader on-demand. */
53485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   if (!ctx->fs_texfetch_col[tex_target]) {
53585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      switch (tex_target) {
53685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         case PIPE_TEXTURE_2D:
53785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák            ctx->fs_texfetch_col[PIPE_TEXTURE_2D] =
53885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák               util_make_fragment_tex_shader(pipe, TGSI_TEXTURE_2D);
53985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák            break;
54085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         case PIPE_TEXTURE_3D:
54185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák            ctx->fs_texfetch_col[PIPE_TEXTURE_3D] =
54285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák               util_make_fragment_tex_shader(pipe, TGSI_TEXTURE_3D);
54385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák            break;
54485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         case PIPE_TEXTURE_CUBE:
54585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák            ctx->fs_texfetch_col[PIPE_TEXTURE_CUBE] =
54685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák               util_make_fragment_tex_shader(pipe, TGSI_TEXTURE_CUBE);
54785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák            break;
548876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák         case PIPE_TEXTURE_1D:
549876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák         default:
550876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák            ctx->fs_texfetch_col[PIPE_TEXTURE_1D] =
551876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák               util_make_fragment_tex_shader(pipe, TGSI_TEXTURE_1D);
552876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák            tex_target = PIPE_TEXTURE_1D; /* for the default case */
55385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      }
55485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   }
55585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
55685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   return ctx->fs_texfetch_col[tex_target];
55785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
55885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
55985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE
56085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_depth(struct blitter_context_priv *ctx,
56185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák                                    unsigned tex_target)
56285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{
56385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   struct pipe_context *pipe = ctx->pipe;
56485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
56585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   assert(tex_target < PIPE_MAX_TEXTURE_TYPES);
56685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
56785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   /* Create the fragment shader on-demand. */
56885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   if (!ctx->fs_texfetch_depth[tex_target]) {
56985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      switch (tex_target) {
57085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         case PIPE_TEXTURE_2D:
57185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák            ctx->fs_texfetch_depth[PIPE_TEXTURE_2D] =
57285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák               util_make_fragment_tex_shader_writedepth(pipe, TGSI_TEXTURE_2D);
57385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák            break;
57485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         case PIPE_TEXTURE_3D:
57585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák            ctx->fs_texfetch_depth[PIPE_TEXTURE_3D] =
57685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák               util_make_fragment_tex_shader_writedepth(pipe, TGSI_TEXTURE_3D);
57785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák            break;
57885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák         case PIPE_TEXTURE_CUBE:
57985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák            ctx->fs_texfetch_depth[PIPE_TEXTURE_CUBE] =
58085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák               util_make_fragment_tex_shader_writedepth(pipe,TGSI_TEXTURE_CUBE);
58185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák            break;
582876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák         case PIPE_TEXTURE_1D:
583876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák         default:
584876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák            ctx->fs_texfetch_depth[PIPE_TEXTURE_1D] =
585876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák               util_make_fragment_tex_shader_writedepth(pipe, TGSI_TEXTURE_1D);
586876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák            tex_target = PIPE_TEXTURE_1D; /* for the default case */
58785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      }
58885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   }
58985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
59085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   return ctx->fs_texfetch_depth[tex_target];
59185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák}
59285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
59355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_clear(struct blitter_context *blitter,
59455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                        unsigned width, unsigned height,
59555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                        unsigned num_cbufs,
59655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                        unsigned clear_buffers,
59755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                        const float *rgba,
59855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                        double depth, unsigned stencil)
59955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
60055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
60155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_context *pipe = ctx->pipe;
6026a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson   struct pipe_stencil_ref sr = { { 0 } };
60355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
604ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák   assert(num_cbufs <= PIPE_MAX_COLOR_BUFS);
60555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
60655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_check_saved_CSOs(ctx);
60755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
60855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* bind CSOs */
60955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   if (clear_buffers & PIPE_CLEAR_COLOR)
61055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_write_color);
61155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   else
61255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_keep_color);
61355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
614a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if ((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) {
6151a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      sr.ref_value[0] = stencil & 0xff;
6161a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil);
6171a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger      pipe->set_stencil_ref(pipe, &sr);
6181a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   }
619a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else if (clear_buffers & PIPE_CLEAR_DEPTH) {
620a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil);
621a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
622a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else if (clear_buffers & PIPE_CLEAR_STENCIL) {
623a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      sr.ref_value[0] = stencil & 0xff;
624a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil);
625a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->set_stencil_ref(pipe, &sr);
626a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
62755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   else
62855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
62955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
63055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
631ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
63285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, num_cbufs));
63355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_vs_state(pipe, ctx->vs_col);
63455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
63555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_set_clear_color(ctx, rgba);
636932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol   blitter_set_rectangle(ctx, 0, 0, width, height, width, height, depth);
63755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_draw_quad(ctx);
63855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_restore_CSOs(ctx);
63955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
64055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
641876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákstatic
642876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákboolean is_overlap(unsigned sx1, unsigned sx2, unsigned sy1, unsigned sy2,
643876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                   unsigned dx1, unsigned dx2, unsigned dy1, unsigned dy2)
644deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie{
645876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   return sx1 < dx2 && sx2 > dx1 && sy1 < dy2 && sy2 > dy1;
646deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie}
647deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie
648876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákvoid util_blitter_copy_region(struct blitter_context *blitter,
649876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              struct pipe_resource *dst,
650876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              struct pipe_subresource subdst,
651876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              unsigned dstx, unsigned dsty, unsigned dstz,
652876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              struct pipe_resource *src,
653876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              struct pipe_subresource subsrc,
654876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              unsigned srcx, unsigned srcy, unsigned srcz,
655876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              unsigned width, unsigned height,
656876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                              boolean ignore_stencil)
65755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
65855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
65955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_context *pipe = ctx->pipe;
660876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   struct pipe_screen *screen = pipe->screen;
661876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   struct pipe_surface *dstsurf;
66255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_framebuffer_state fb_state;
663f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   struct pipe_sampler_view viewTempl, *view;
664876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   unsigned bind;
665876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   boolean is_stencil, is_depth;
666876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
667876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Give up if textures are not set. */
668876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   assert(dst && src);
669876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   if (!dst || !src)
670876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      return;
671876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
672876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Sanity checks. */
673876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   if (dst == src) {
674876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      assert(!is_overlap(srcx, srcx + width, srcy, srcy + height,
675876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                         dstx, dstx + width, dsty, dsty + height));
676876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   } else {
677876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      assert(dst->format == src->format);
678876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   }
679876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   assert(src->target < PIPE_MAX_TEXTURE_TYPES);
680876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
681876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Is this a ZS format? */
682876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   is_depth = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 0) != 0;
683876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   is_stencil = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 1) != 0;
684876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
685876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   if (is_depth || is_stencil)
686876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      bind = PIPE_BIND_DEPTH_STENCIL;
687876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   else
688876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      bind = PIPE_BIND_RENDER_TARGET;
689876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
690876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Check if we can sample from and render to the surfaces. */
691876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* (assuming copying a stencil buffer is not possible) */
692876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák    if ((!ignore_stencil && is_stencil) ||
693876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák       !screen->is_format_supported(screen, dst->format, dst->target,
694876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                    dst->nr_samples, bind, 0) ||
695876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák       !screen->is_format_supported(screen, src->format, src->target,
696876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                    src->nr_samples, PIPE_BIND_SAMPLER_VIEW, 0)) {
697876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      util_resource_copy_region(pipe, dst, subdst, dstx, dsty, dstz,
698876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                src, subsrc, srcx, srcy, srcz, width, height);
699876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      return;
700876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   }
701876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
702876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Get surfaces. */
703876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   dstsurf = screen->get_tex_surface(screen, dst,
704876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     subdst.face, subdst.level, dstz,
705876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                     bind);
70655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
707876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Check whether the states are properly saved. */
708876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   blitter_check_saved_CSOs(ctx);
70955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   assert(blitter->saved_fb_state.nr_cbufs != ~0);
710f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   assert(blitter->saved_num_sampler_views != ~0);
71155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   assert(blitter->saved_num_sampler_states != ~0);
71255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
713876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Initialize framebuffer state. */
714876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   fb_state.width = dstsurf->width;
715876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   fb_state.height = dstsurf->height;
71655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
71755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   if (is_depth) {
71855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_keep_color);
71955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe,
72055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák                                           ctx->dsa_write_depth_keep_stencil);
72185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      pipe->bind_fs_state(pipe,
722876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                          blitter_get_fs_texfetch_depth(ctx, src->target));
72355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
72455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      fb_state.nr_cbufs = 0;
725876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      fb_state.zsbuf = dstsurf;
72655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   } else {
72755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_blend_state(pipe, ctx->blend_write_color);
72855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
72985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák      pipe->bind_fs_state(pipe,
730876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                          blitter_get_fs_texfetch_col(ctx, src->target));
73155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
73255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      fb_state.nr_cbufs = 1;
733876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák      fb_state.cbufs[0] = dstsurf;
73455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      fb_state.zsbuf = 0;
73555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
73685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák
737876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Initialize sampler view. */
738876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   u_sampler_view_default_template(&viewTempl, src, src->format);
739876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   view = pipe->create_sampler_view(pipe, src, &viewTempl);
740f6106566081978f663cf08e54bb8908cb58a5316Michal Krol
741f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   if (ctx->sampler_view) {
742f6106566081978f663cf08e54bb8908cb58a5316Michal Krol      pipe_sampler_view_reference(&ctx->sampler_view, NULL);
743f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   }
744f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   ctx->sampler_view = view;
745f6106566081978f663cf08e54bb8908cb58a5316Michal Krol
746876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Set rasterizer state, shaders, and textures. */
74755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
74855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_vs_state(pipe, ctx->vs_tex);
74985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   pipe->bind_fragment_sampler_states(pipe, 1,
750876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                      blitter_get_sampler_state(ctx, subsrc.level));
751ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
752f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   pipe->set_fragment_sampler_views(pipe, 1, &view);
75355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->set_framebuffer_state(pipe, &fb_state);
75455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
755876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   /* Set texture coordinates. */
756876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   switch (src->target) {
75755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_1D:
75855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_2D:
759876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák         blitter_set_texcoords_2d(ctx, src, subsrc,
760876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                  srcx, srcy, srcx+width, srcy+height);
76155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         break;
76255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_3D:
763876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák         blitter_set_texcoords_3d(ctx, src, subsrc, srcz,
764876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                  srcx, srcy, srcx+width, srcy+height);
76555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         break;
76655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      case PIPE_TEXTURE_CUBE:
767876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák         blitter_set_texcoords_cube(ctx, src, subsrc,
768876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                                    srcx, srcy, srcx+width, srcy+height);
76955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák         break;
770ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák      default:
771ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák         assert(0);
772876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák         return;
77355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   }
77455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
775876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   blitter_set_rectangle(ctx, dstx, dsty, dstx+width, dsty+height,
776876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák                         dstsurf->width, dstsurf->height, 0);
77755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_draw_quad(ctx);
77855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_restore_CSOs(ctx);
779876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák
780876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák   pipe_surface_reference(&dstsurf, NULL);
78155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
78255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
783a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a color surface to a constant value. */
784a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_render_target(struct blitter_context *blitter,
785a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      struct pipe_surface *dstsurf,
786a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      const float *rgba,
787a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned dstx, unsigned dsty,
788a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned width, unsigned height)
78955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{
79055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
79155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_context *pipe = ctx->pipe;
79255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   struct pipe_framebuffer_state fb_state;
79355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
794a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   assert(dstsurf->texture);
795a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if (!dstsurf->texture)
79655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák      return;
79755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
79855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* check the saved state */
79955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_check_saved_CSOs(ctx);
80055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   assert(blitter->saved_fb_state.nr_cbufs != ~0);
80155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
80255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* bind CSOs */
80355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_blend_state(pipe, ctx->blend_write_color);
80455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
80555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
80685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1));
80755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->bind_vs_state(pipe, ctx->vs_col);
808ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
80955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
81055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   /* set a framebuffer state */
81159e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   fb_state.width = dstsurf->width;
81259e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   fb_state.height = dstsurf->height;
81355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   fb_state.nr_cbufs = 1;
81459e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   fb_state.cbufs[0] = dstsurf;
81555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   fb_state.zsbuf = 0;
81655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   pipe->set_framebuffer_state(pipe, &fb_state);
81755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák
81855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_set_clear_color(ctx, rgba);
81959e51d9640c242a7c919472d935a91889c7840c9Marek Olšák   blitter_set_rectangle(ctx, 0, 0, width, height, dstsurf->width, dstsurf->height, 0);
82055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_draw_quad(ctx);
82155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák   blitter_restore_CSOs(ctx);
822a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger}
82359e51d9640c242a7c919472d935a91889c7840c9Marek Olšák
824a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a depth stencil surface. */
825a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_depth_stencil(struct blitter_context *blitter,
826a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      struct pipe_surface *dstsurf,
827a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned clear_flags,
828a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      double depth,
829a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned stencil,
830a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned dstx, unsigned dsty,
831a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                                      unsigned width, unsigned height)
832a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger{
833a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
834a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct pipe_context *pipe = ctx->pipe;
835a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct pipe_framebuffer_state fb_state;
836a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   struct pipe_stencil_ref sr = { { 0 } };
837a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
838a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   assert(dstsurf->texture);
839a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if (!dstsurf->texture)
840a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      return;
841a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
842a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   /* check the saved state */
843a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   blitter_check_saved_CSOs(ctx);
844a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   assert(blitter->saved_fb_state.nr_cbufs != ~0);
845a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
846a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   /* bind CSOs */
847a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_blend_state(pipe, ctx->blend_keep_color);
848a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   if ((clear_flags & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) {
849a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      sr.ref_value[0] = stencil & 0xff;
850a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil);
851a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->set_stencil_ref(pipe, &sr);
852a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
853a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else if (clear_flags & PIPE_CLEAR_DEPTH) {
854a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil);
855a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
856a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else if (clear_flags & PIPE_CLEAR_STENCIL) {
857a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      sr.ref_value[0] = stencil & 0xff;
858a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil);
859a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->set_stencil_ref(pipe, &sr);
860a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   }
861a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   else
862a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      /* hmm that should be illegal probably, or make it a no-op somewhere */
863a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger      pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
864a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
865a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
866a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0));
867a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_vs_state(pipe, ctx->vs_col);
868a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
869a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
870a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   /* set a framebuffer state */
871a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.width = dstsurf->width;
872a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.height = dstsurf->height;
873a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.nr_cbufs = 0;
874a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.cbufs[0] = 0;
875a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   fb_state.zsbuf = dstsurf;
876a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   pipe->set_framebuffer_state(pipe, &fb_state);
877a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger
878a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   blitter_set_rectangle(ctx, 0, 0, width, height, dstsurf->width, dstsurf->height, depth);
879a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   blitter_draw_quad(ctx);
880a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger   blitter_restore_CSOs(ctx);
88155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}
882