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