u_blitter.c revision 4c417697b6fa1503ac35b34e79f23716d813a208
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 29363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák * Blitter utility to facilitate acceleration of the clear, clear_render_target, 30363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák * clear_depth_stencil, and resource_copy_region functions. 3155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * 3255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * @author Marek Olšák 3355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák */ 3455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "pipe/p_context.h" 3655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "pipe/p_defines.h" 3728486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 3855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "pipe/p_shader_tokens.h" 3955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "pipe/p_state.h" 4055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 41f874da422b1811c4cb5f700f424180793ea66d6fCorbin Simpson#include "util/u_format.h" 4255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_memory.h" 4355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_math.h" 4455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_blitter.h" 4555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_draw_quad.h" 46f6106566081978f663cf08e54bb8908cb58a5316Michal Krol#include "util/u_sampler.h" 4755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_simple_shaders.h" 488b0c217f2bc123bffd25cc4977d6abb1b3fa8186Brian Paul#include "util/u_surface.h" 4955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_texture.h" 5055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 51a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák#define INVALID_PTR ((void*)~0) 52a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák 5355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context_priv 5455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 559b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct blitter_context base; 5655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 57287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *vbuf; /**< quad */ 5855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 5955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák float vertices[4][2][4]; /**< {pos, color} or {pos, texcoord} */ 6055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 6185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Templates for various state objects. */ 6285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák struct pipe_sampler_state template_sampler_state; 6385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 6455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Constant state objects. */ 6555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Vertex shaders. */ 665d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák void *vs; /**< Vertex shader which passes {pos, generic} to the output.*/ 6755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 6855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Fragment shaders. */ 69677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas /* The shader at index i outputs color to color buffers 0,1,...,i-1. */ 70677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas void *fs_col[PIPE_MAX_COLOR_BUFS+1]; 71ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 72ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák /* FS which outputs a color from a texture, 73ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák where the index is PIPE_TEXTURE_* to be sampled. */ 74ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák void *fs_texfetch_col[PIPE_MAX_TEXTURE_TYPES]; 75ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 76ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák /* FS which outputs a depth from a texture, 77ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák where the index is PIPE_TEXTURE_* to be sampled. */ 78ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák void *fs_texfetch_depth[PIPE_MAX_TEXTURE_TYPES]; 7955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 8055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Blend state. */ 8155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *blend_write_color; /**< blend state with writemask of RGBA */ 8255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *blend_keep_color; /**< blend state with writemask of 0 */ 8355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 8455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Depth stencil alpha state. */ 851a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger void *dsa_write_depth_stencil; 8655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *dsa_write_depth_keep_stencil; 8755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *dsa_keep_depth_stencil; 88a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger void *dsa_keep_depth_write_stencil; 8955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 90ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger void *velem_state; 91ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger 92ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák /* Sampler state for clamping to a miplevel. */ 93d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri void *sampler_state[PIPE_MAX_TEXTURE_LEVELS * 2]; 94ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 95ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák /* Rasterizer state. */ 96ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák void *rs_state; 97f6106566081978f663cf08e54bb8908cb58a5316Michal Krol 98932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* Viewport state. */ 99932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol struct pipe_viewport_state viewport; 100932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 101932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* Clip state. */ 102932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol struct pipe_clip_state clip; 1033bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák 1043bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák /* Destination surface dimensions. */ 1053bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák unsigned dst_width; 1063bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák unsigned dst_height; 1074c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák 1084c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák boolean has_geometry_shader; 10955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}; 11055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1119be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter, 1129be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned x, unsigned y, 1139be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned width, unsigned height, 1149be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák float depth, 1159be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák enum blitter_attrib_type type, 1166dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *attrib); 1179be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 1189be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 11955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context *util_blitter_create(struct pipe_context *pipe) 12055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 12155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx; 1220c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul struct pipe_blend_state blend; 1230c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul struct pipe_depth_stencil_alpha_state dsa; 1240c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul struct pipe_rasterizer_state rs_state; 12585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák struct pipe_sampler_state *sampler_state; 126ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger struct pipe_vertex_element velem[2]; 12785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák unsigned i; 12855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 12955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx = CALLOC_STRUCT(blitter_context_priv); 13055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák if (!ctx) 13155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák return NULL; 13255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1339b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.pipe = pipe; 1349be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák ctx->base.draw_rectangle = blitter_draw_rectangle; 13555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 13655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* init state objects for them to be considered invalid */ 1379b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_blend_state = INVALID_PTR; 1389b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_dsa_state = INVALID_PTR; 1399b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_rs_state = INVALID_PTR; 1409b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fs = INVALID_PTR; 1419b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_vs = INVALID_PTR; 1424c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák ctx->base.saved_gs = INVALID_PTR; 1439b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_velem_state = INVALID_PTR; 1449b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fb_state.nr_cbufs = ~0; 1459b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_views = ~0; 1469b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_states = ~0; 1479b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_vertex_buffers = ~0; 14855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1494c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák ctx->has_geometry_shader = 1504c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák pipe->screen->get_shader_param(pipe->screen, PIPE_SHADER_GEOMETRY, 1514c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0; 1524c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák 15355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* blend state objects */ 1540c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul memset(&blend, 0, sizeof(blend)); 15555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->blend_keep_color = pipe->create_blend_state(pipe, &blend); 15655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 157eba1e2a44718bea398e49d496a78ee002c9922b8Roland Scheidegger blend.rt[0].colormask = PIPE_MASK_RGBA; 15855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->blend_write_color = pipe->create_blend_state(pipe, &blend); 15955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 16055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* depth stencil alpha state objects */ 1610c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul memset(&dsa, 0, sizeof(dsa)); 16255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_keep_depth_stencil = 1631a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 16455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 165f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák dsa.depth.enabled = 1; 166f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák dsa.depth.writemask = 1; 167f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák dsa.depth.func = PIPE_FUNC_ALWAYS; 16855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil = 1691a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 1701a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger 1711a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].enabled = 1; 1721a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].func = PIPE_FUNC_ALWAYS; 1731a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE; 1741a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE; 1751a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE; 1761a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].valuemask = 0xff; 1771a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].writemask = 0xff; 1781a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger ctx->dsa_write_depth_stencil = 1791a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 180a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 181a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 182a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger dsa.depth.enabled = 0; 183a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger dsa.depth.writemask = 0; 184a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger ctx->dsa_keep_depth_write_stencil = 185a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 18655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 18755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* sampler state */ 18885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state = &ctx->template_sampler_state; 18985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 19085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 19185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 1922ee0d19ccf768c4c12c3c3476c1cd7eff508629aCorbin Simpson sampler_state->normalized_coords = TRUE; 19385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* The sampler state objects which sample from a specified mipmap level 19485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák * are created on-demand. */ 19555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 19655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* rasterizer state */ 19755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák memset(&rs_state, 0, sizeof(rs_state)); 1980bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell rs_state.cull_face = PIPE_FACE_NONE; 19955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák rs_state.gl_rasterization_rules = 1; 2001c75edf3e8ccc97f5f91f42f99c1f8db30b25fc4Corbin Simpson rs_state.flatshade = 1; 20155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->rs_state = pipe->create_rasterizer_state(pipe, &rs_state); 20255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 203ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger /* vertex elements state */ 204ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger memset(&velem[0], 0, sizeof(velem[0]) * 2); 205ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger for (i = 0; i < 2; i++) { 206ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].src_offset = i * 4 * sizeof(float); 207ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 208ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger } 209ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger ctx->velem_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]); 210ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger 21185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* fragment shaders are created on-demand */ 21285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 2135d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák /* vertex shader */ 21455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák { 21555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const uint semantic_names[] = { TGSI_SEMANTIC_POSITION, 21655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák TGSI_SEMANTIC_GENERIC }; 21755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const uint semantic_indices[] = { 0, 0 }; 2185d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák ctx->vs = 21955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák util_make_vertex_passthrough_shader(pipe, 2, semantic_names, 22055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák semantic_indices); 22155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 22255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 22355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set invariant vertex coordinates */ 22455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 22555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][0][3] = 1; /*v.w*/ 22655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 22755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* create the vertex buffer */ 2282a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák ctx->vbuf = pipe_user_buffer_create(ctx->base.pipe->screen, 2292a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák ctx->vertices, 2302a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák sizeof(ctx->vertices), 2312a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák PIPE_BIND_VERTEX_BUFFER); 23255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 2339b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák return &ctx->base; 23455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 23555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 23655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_destroy(struct blitter_context *blitter) 23755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 23855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 2399b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = blitter->pipe; 24055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 24155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 24255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_blend_state(pipe, ctx->blend_write_color); 24355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_blend_state(pipe, ctx->blend_keep_color); 24455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 24555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_depth_stencil_alpha_state(pipe, 24655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil); 2471a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 248a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 2496a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson 25055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_rasterizer_state(pipe, ctx->rs_state); 2515d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->delete_vs_state(pipe, ctx->vs); 252ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->delete_vertex_elements_state(pipe, ctx->velem_state); 25355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 254ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák for (i = 0; i < PIPE_MAX_TEXTURE_TYPES; i++) { 25585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_texfetch_col[i]) 25685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_texfetch_col[i]); 25785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_texfetch_depth[i]) 25885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_texfetch_depth[i]); 25955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 260ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 261b51f6e7c2350f637337fc3935436e2f99f669dfdJoakim Sindholt for (i = 0; i <= PIPE_MAX_COLOR_BUFS; i++) 26285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_col[i]) 26385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_col[i]); 26455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 265d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri for (i = 0; i < PIPE_MAX_TEXTURE_LEVELS * 2; i++) 26685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->sampler_state[i]) 26785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_sampler_state(pipe, ctx->sampler_state[i]); 268ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 269287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&ctx->vbuf, NULL); 27055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák FREE(ctx); 27155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 27255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 273c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_set_running_flag(struct blitter_context_priv *ctx) 27455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 275ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák if (ctx->base.running) { 276c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák _debug_printf("u_blitter:%i: Caught recursion. This is a driver bug.\n", 277c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák __LINE__); 2789a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák } 279ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák ctx->base.running = TRUE; 280c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 2819a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák 282c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_unset_running_flag(struct blitter_context_priv *ctx) 283c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 284c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák if (!ctx->base.running) { 285c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák _debug_printf("u_blitter:%i: Caught recursion. This is a driver bug.\n", 286c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák __LINE__); 287c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák } 288c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.running = FALSE; 289c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 290c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 291c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_check_saved_vertex_states(struct blitter_context_priv *ctx) 292c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 293c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák assert(ctx->base.saved_num_vertex_buffers != ~0 && 294c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_velem_state != INVALID_PTR && 2959b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_vs != INVALID_PTR && 2964c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák (!ctx->has_geometry_shader || ctx->base.saved_gs != INVALID_PTR) && 297c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_rs_state != INVALID_PTR); 29855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 29955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 300c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_restore_vertex_states(struct blitter_context_priv *ctx) 30155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 3029b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 3038f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák unsigned i; 30455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 305c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Vertex buffers. */ 306c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->set_vertex_buffers(pipe, 307c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_vertex_buffers, 308c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_vertex_buffers); 309c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 310c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák for (i = 0; i < ctx->base.saved_num_vertex_buffers; i++) { 311c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák if (ctx->base.saved_vertex_buffers[i].buffer) { 312c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe_resource_reference(&ctx->base.saved_vertex_buffers[i].buffer, 313c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák NULL); 314c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák } 315c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák } 316c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_vertex_buffers = ~0; 317c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 318c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Vertex elements. */ 3199b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_vertex_elements_state(pipe, ctx->base.saved_velem_state); 320c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_velem_state = INVALID_PTR; 32155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 322c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Vertex shader. */ 323c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->bind_vs_state(pipe, ctx->base.saved_vs); 3249b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_vs = INVALID_PTR; 32555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3264c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák /* Geometry shader. */ 3274c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák if (ctx->has_geometry_shader) { 3284c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák pipe->bind_gs_state(pipe, ctx->base.saved_gs); 3294c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák ctx->base.saved_gs = INVALID_PTR; 3304c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák } 331363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák 332c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Rasterizer. */ 333c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->bind_rasterizer_state(pipe, ctx->base.saved_rs_state); 334c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_rs_state = INVALID_PTR; 335c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 336c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 337c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_check_saved_fragment_states(struct blitter_context_priv *ctx) 338c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 339c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák assert(ctx->base.saved_fs != INVALID_PTR && 340c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_dsa_state != INVALID_PTR && 341c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_blend_state != INVALID_PTR); 342c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 343c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 344c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_restore_fragment_states(struct blitter_context_priv *ctx) 345c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 346c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 347c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 348c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Fragment shader. */ 349c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->bind_fs_state(pipe, ctx->base.saved_fs); 350c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_fs = INVALID_PTR; 351c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 352c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Depth, stencil, alpha. */ 353c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->base.saved_dsa_state); 354c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_dsa_state = INVALID_PTR; 355c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 356c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Blend state. */ 357c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->bind_blend_state(pipe, ctx->base.saved_blend_state); 358c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_blend_state = INVALID_PTR; 359c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 360c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Miscellaneous states. */ 361c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* XXX check whether these are saved and whether they need to be restored 362c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * (depending on the operation) */ 3639b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_stencil_ref(pipe, &ctx->base.saved_stencil_ref); 3649b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_viewport_state(pipe, &ctx->base.saved_viewport); 3659b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_clip_state(pipe, &ctx->base.saved_clip); 366c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 367932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 368c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_check_saved_fb_state(struct blitter_context_priv *ctx) 369c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 370c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák assert(ctx->base.saved_fb_state.nr_cbufs != ~0); 371c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 37255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 373c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_restore_fb_state(struct blitter_context_priv *ctx) 374c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 375c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 376c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 377c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->set_framebuffer_state(pipe, &ctx->base.saved_fb_state); 378c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák util_unreference_framebuffer_state(&ctx->base.saved_fb_state); 379c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 38055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 381c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_check_saved_textures(struct blitter_context_priv *ctx) 382c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 383c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák assert(ctx->base.saved_num_sampler_states != ~0 && 384c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_sampler_views != ~0); 385c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 3860b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák 387c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_restore_textures(struct blitter_context_priv *ctx) 388c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 389c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 390c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák unsigned i; 3910b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák 392c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Fragment sampler states. */ 393c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->bind_fragment_sampler_states(pipe, 394c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_sampler_states, 395c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_sampler_states); 396c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_sampler_states = ~0; 39764aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri 398c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Fragment sampler views. */ 399c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->set_fragment_sampler_views(pipe, 400c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_sampler_views, 401c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_sampler_views); 4028f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák 403c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák for (i = 0; i < ctx->base.saved_num_sampler_views; i++) 404c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe_sampler_view_reference(&ctx->base.saved_sampler_views[i], NULL); 4059a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák 406c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_sampler_views = ~0; 40755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 40855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 40955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_rectangle(struct blitter_context_priv *ctx, 41055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 41155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x2, unsigned y2, 41255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák float depth) 41355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 41455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 41555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 41655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set vertex positions */ 4173bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[0][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v0.x*/ 4183bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[0][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v0.y*/ 41955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 4203bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[1][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v1.x*/ 4213bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[1][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v1.y*/ 42255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 4233bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[2][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v2.x*/ 4243bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[2][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v2.y*/ 42555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 4263bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[3][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v3.x*/ 4273bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[3][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v3.y*/ 42855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 42955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 43055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][0][2] = depth; /*z*/ 431932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 432932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* viewport */ 4333bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.scale[0] = 0.5f * ctx->dst_width; 4343bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.scale[1] = 0.5f * ctx->dst_height; 435ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák ctx->viewport.scale[2] = 1.0f; 436932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->viewport.scale[3] = 1.0f; 4373bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.translate[0] = 0.5f * ctx->dst_width; 4383bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.translate[1] = 0.5f * ctx->dst_height; 439ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák ctx->viewport.translate[2] = 0.0f; 440932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->viewport.translate[3] = 0.0f; 4419b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.pipe->set_viewport_state(ctx->base.pipe, &ctx->viewport); 442932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 443932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* clip */ 4449b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.pipe->set_clip_state(ctx->base.pipe, &ctx->clip); 44555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 44655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 44755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_clear_color(struct blitter_context_priv *ctx, 4486dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color) 44955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 45055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 45155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 4526dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie if (color) { 45316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák for (i = 0; i < 4; i++) { 4546dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie ctx->vertices[i][1][0] = color->f[0]; 4556dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie ctx->vertices[i][1][1] = color->f[1]; 4566dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie ctx->vertices[i][1][2] = color->f[2]; 4576dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie ctx->vertices[i][1][3] = color->f[3]; 45816d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák } 459fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák } else { 46016d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák for (i = 0; i < 4; i++) { 46116d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][0] = 0; 46216d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][1] = 0; 46316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][2] = 0; 46416d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][3] = 0; 46516d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák } 46655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 46755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 46855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 469d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieristatic void get_texcoords(struct pipe_resource *src, 4704c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned level, 4714c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned x1, unsigned y1, 4724c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned x2, unsigned y2, 4734c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger boolean normalized, float out[4]) 474749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{ 475d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri if(normalized) 476d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri { 4774c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger out[0] = x1 / (float)u_minify(src->width0, level); 4784c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger out[1] = y1 / (float)u_minify(src->height0, level); 4794c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger out[2] = x2 / (float)u_minify(src->width0, level); 4804c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger out[3] = y2 / (float)u_minify(src->height0, level); 481d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri } 482d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri else 483d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri { 484d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[0] = x1; 485d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[1] = y1; 486d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[2] = x2; 487d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[3] = y2; 488d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri } 489749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák} 490749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák 491749e24521a31178d2b647aa2954c3eecd597b799Marek Olšákstatic void set_texcoords_in_vertices(const float coord[4], 492749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák float *out, unsigned stride) 493749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{ 494749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[0]; /*t0.s*/ 495749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[1]; /*t0.t*/ 496749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out += stride; 497749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[2]; /*t1.s*/ 498749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[1]; /*t1.t*/ 499749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out += stride; 500749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[2]; /*t2.s*/ 501749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[3]; /*t2.t*/ 502749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out += stride; 503749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[0]; /*t3.s*/ 504749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[3]; /*t3.t*/ 505749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák} 506749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák 50755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_2d(struct blitter_context_priv *ctx, 508876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *src, 5094c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned level, 51055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 51155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x2, unsigned y2) 51255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 513749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák unsigned i; 514749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák float coord[4]; 51555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 5164c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger get_texcoords(src, level, x1, y1, x2, y2, TRUE, coord); 517749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák set_texcoords_in_vertices(coord, &ctx->vertices[0][1][0], 8); 51855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 51955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) { 52055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][1][2] = 0; /*r*/ 52155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][1][3] = 1; /*q*/ 52255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 52355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 52455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 52555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_3d(struct blitter_context_priv *ctx, 526876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *src, 5274c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned level, 528876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned zslice, 52955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 530274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák unsigned x2, unsigned y2, 531274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák boolean normalized) 53255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 53355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 534274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák float r = normalized ? zslice / (float)u_minify(src->depth0, level) : zslice; 53555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 5364c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger blitter_set_texcoords_2d(ctx, src, level, x1, y1, x2, y2); 53755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 53855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 53955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][1][2] = r; /*r*/ 54055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 54155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 542274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšákstatic void blitter_set_texcoords_1d_array(struct blitter_context_priv *ctx, 543274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák struct pipe_resource *src, 544274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák unsigned level, 545274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák unsigned zslice, 546274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák unsigned x1, unsigned x2) 547274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák{ 548274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák int i; 549274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák float r = zslice; 550274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák 551274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák blitter_set_texcoords_2d(ctx, src, level, x1, 0, x2, 0); 552274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák 553274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák for (i = 0; i < 4; i++) 554274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák ctx->vertices[i][1][1] = r; /*r*/ 555274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák} 556274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák 55755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_cube(struct blitter_context_priv *ctx, 558876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *src, 5594c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned level, unsigned face, 56055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 56155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x2, unsigned y2) 56255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 56355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 564749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák float coord[4]; 565d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul float st[4][2]; 566d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul 5674c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger get_texcoords(src, level, x1, y1, x2, y2, TRUE, coord); 568749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák set_texcoords_in_vertices(coord, &st[0][0], 2); 56955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 5704c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger util_map_texcoords2d_onto_cubemap(face, 57155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* pointer, stride in floats */ 57255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák &st[0][0], 2, 57355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák &ctx->vertices[0][1][0], 8); 57455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 57555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 57655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][1][3] = 1; /*q*/ 57755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 57855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 5793bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákstatic void blitter_set_dst_dimensions(struct blitter_context_priv *ctx, 5803bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák unsigned width, unsigned height) 5813bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák{ 5823bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->dst_width = width; 5833bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->dst_height = height; 5843bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák} 5853bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák 58685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 58785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid **blitter_get_sampler_state(struct blitter_context_priv *ctx, 588d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri int miplevel, boolean normalized) 58985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 5909b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 59185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák struct pipe_sampler_state *sampler_state = &ctx->template_sampler_state; 59285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 59385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(miplevel < PIPE_MAX_TEXTURE_LEVELS); 59485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 59585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Create the sampler state on-demand. */ 596d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri if (!ctx->sampler_state[miplevel * 2 + normalized]) { 59785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->lod_bias = miplevel; 59885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->min_lod = miplevel; 59985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->max_lod = miplevel; 600d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri sampler_state->normalized_coords = normalized; 60185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 602d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri ctx->sampler_state[miplevel * 2 + normalized] = pipe->create_sampler_state(pipe, 60385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state); 60485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák } 60585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 60685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Return void** so that it can be passed to bind_fragment_sampler_states 60785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák * directly. */ 608d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri return &ctx->sampler_state[miplevel * 2 + normalized]; 60985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 61085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 61185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 61285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_col(struct blitter_context_priv *ctx, unsigned num_cbufs) 61385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 6149b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 61585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 61685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(num_cbufs <= PIPE_MAX_COLOR_BUFS); 61785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 618677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas if (!ctx->fs_col[num_cbufs]) 619677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas ctx->fs_col[num_cbufs] = 6205d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák util_make_fragment_cloneinput_shader(pipe, num_cbufs, 6215d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák TGSI_SEMANTIC_GENERIC, 6225d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák TGSI_INTERPOLATE_LINEAR); 62385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 624677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas return ctx->fs_col[num_cbufs]; 62585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 62685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 627d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul/** Convert PIPE_TEXTURE_x to TGSI_TEXTURE_x */ 628d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paulstatic unsigned 6293bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákpipe_tex_to_tgsi_tex(enum pipe_texture_target pipe_tex_target) 630d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul{ 631d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul switch (pipe_tex_target) { 632d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul case PIPE_TEXTURE_1D: 633d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_1D; 634d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul case PIPE_TEXTURE_2D: 635d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_2D; 636ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri case PIPE_TEXTURE_RECT: 637cbe367227959a32ff20e146106162a81d2be02c3Luca Barbieri return TGSI_TEXTURE_RECT; 638d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul case PIPE_TEXTURE_3D: 639d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_3D; 640d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul case PIPE_TEXTURE_CUBE: 641d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_CUBE; 642274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák case PIPE_TEXTURE_1D_ARRAY: 643274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák return TGSI_TEXTURE_1D_ARRAY; 644274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák case PIPE_TEXTURE_2D_ARRAY: 645274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák return TGSI_TEXTURE_2D_ARRAY; 646d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul default: 647d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul assert(0 && "unexpected texture target"); 648d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_UNKNOWN; 649d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul } 650d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul} 651d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 652d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 65385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 65485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_col(struct blitter_context_priv *ctx, 65585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák unsigned tex_target) 65685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 6579b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 65885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 65985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(tex_target < PIPE_MAX_TEXTURE_TYPES); 66085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 66185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Create the fragment shader on-demand. */ 66285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (!ctx->fs_texfetch_col[tex_target]) { 663d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target); 664d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 665d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul ctx->fs_texfetch_col[tex_target] = 666d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul util_make_fragment_tex_shader(pipe, tgsi_tex, TGSI_INTERPOLATE_LINEAR); 66785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák } 66885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 66985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák return ctx->fs_texfetch_col[tex_target]; 67085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 67185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 67285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 67385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_depth(struct blitter_context_priv *ctx, 67485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák unsigned tex_target) 67585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 6769b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 67785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 67885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(tex_target < PIPE_MAX_TEXTURE_TYPES); 67985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 68085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Create the fragment shader on-demand. */ 68185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (!ctx->fs_texfetch_depth[tex_target]) { 682d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target); 683d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 684d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul ctx->fs_texfetch_depth[tex_target] = 685d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul util_make_fragment_tex_shader_writedepth(pipe, tgsi_tex, 686d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul TGSI_INTERPOLATE_LINEAR); 68785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák } 68885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 68985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák return ctx->fs_texfetch_depth[tex_target]; 69085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 69185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 6929be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter, 6939be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned x1, unsigned y1, 6949be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned x2, unsigned y2, 6959be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák float depth, 6969be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák enum blitter_attrib_type type, 6976dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *attrib) 6989be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák{ 6999be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 7009be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 7019be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák switch (type) { 7029be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák case UTIL_BLITTER_ATTRIB_COLOR: 7039be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_clear_color(ctx, attrib); 7049be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák break; 7059be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 7069be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák case UTIL_BLITTER_ATTRIB_TEXCOORD: 7076dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie set_texcoords_in_vertices(attrib->f, &ctx->vertices[0][1][0], 8); 7089be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák break; 7099be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 7109be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák default:; 7119be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák } 7129be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 7139be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_rectangle(ctx, x1, y1, x2, y2, depth); 714588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák ctx->base.pipe->redefine_user_buffer(ctx->base.pipe, ctx->vbuf, 715588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák 0, ctx->vbuf->width0); 716d5062fb3a315c46d77d5c954a3e3c14be1907d33Marek Olšák util_draw_vertex_buffer(ctx->base.pipe, NULL, ctx->vbuf, 0, 7172a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák PIPE_PRIM_TRIANGLE_FAN, 4, 2); 7189be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák} 7199be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 720db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákstatic void util_blitter_clear_custom(struct blitter_context *blitter, 721db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned width, unsigned height, 722db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned num_cbufs, 723db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned clear_buffers, 7246dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color, 725db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák double depth, unsigned stencil, 726db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák void *custom_blend, void *custom_dsa) 72755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 72855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 7299b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 7306a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson struct pipe_stencil_ref sr = { { 0 } }; 73155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 732ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák assert(num_cbufs <= PIPE_MAX_COLOR_BUFS); 73355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 734c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_set_running_flag(ctx); 735c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_vertex_states(ctx); 736c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fragment_states(ctx); 73755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 738c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* bind states */ 739db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák if (custom_blend) { 740db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák pipe->bind_blend_state(pipe, custom_blend); 741db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if (clear_buffers & PIPE_CLEAR_COLOR) { 74255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 743db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else { 74455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_keep_color); 745db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } 74655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 747db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák if (custom_dsa) { 748db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, custom_dsa); 749db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if ((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) { 7501a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 751db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if (clear_buffers & PIPE_CLEAR_DEPTH) { 752a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil); 753db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if (clear_buffers & PIPE_CLEAR_STENCIL) { 754a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 755db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else { 75655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 757db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } 758db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 759db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák sr.ref_value[0] = stencil & 0xff; 760db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák pipe->set_stencil_ref(pipe, &sr); 76155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 76255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 763ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 76485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, num_cbufs)); 7655d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 7664c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák if (ctx->has_geometry_shader) 7674c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák pipe->bind_gs_state(pipe, NULL); 76855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 7693bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák blitter_set_dst_dimensions(ctx, width, height); 7709be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, 0, 0, width, height, depth, 7716dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie UTIL_BLITTER_ATTRIB_COLOR, color); 772c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 773c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_vertex_states(ctx); 774c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fragment_states(ctx); 775c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_unset_running_flag(ctx); 77655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 77755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 778db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid util_blitter_clear(struct blitter_context *blitter, 779db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned width, unsigned height, 780db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned num_cbufs, 781db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned clear_buffers, 7826dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color, 783db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák double depth, unsigned stencil) 784db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák{ 785db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák util_blitter_clear_custom(blitter, width, height, num_cbufs, 7866dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie clear_buffers, color, depth, stencil, 787db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák NULL, NULL); 788db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák} 789db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 790db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid util_blitter_clear_depth_custom(struct blitter_context *blitter, 791db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned width, unsigned height, 792db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák double depth, void *custom_dsa) 793db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák{ 7946dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie static const union pipe_color_union color; 795db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák util_blitter_clear_custom(blitter, width, height, 0, 7966dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie 0, &color, depth, 0, NULL, custom_dsa); 797db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák} 798db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 799876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákstatic 800876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákboolean is_overlap(unsigned sx1, unsigned sx2, unsigned sy1, unsigned sy2, 801876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned dx1, unsigned dx2, unsigned dy1, unsigned dy2) 802deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie{ 803876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return sx1 < dx2 && sx2 > dx1 && sy1 < dy2 && sy2 > dy1; 804deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie} 805deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie 806233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšákvoid util_blitter_copy_texture(struct blitter_context *blitter, 807233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák struct pipe_resource *dst, 808233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák unsigned dstlevel, 809233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák unsigned dstx, unsigned dsty, unsigned dstz, 810233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák struct pipe_resource *src, 811233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák unsigned srclevel, 812233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák const struct pipe_box *srcbox, 813233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák boolean ignore_stencil) 81455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 81555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 8169b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 817876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_screen *screen = pipe->screen; 8184c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger struct pipe_surface *dstsurf, surf_templ; 81955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct pipe_framebuffer_state fb_state; 820f6106566081978f663cf08e54bb8908cb58a5316Michal Krol struct pipe_sampler_view viewTempl, *view; 821876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned bind; 8224c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned width = srcbox->width; 8234c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned height = srcbox->height; 824876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák boolean is_stencil, is_depth; 825d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri boolean normalized; 826876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 827876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Give up if textures are not set. */ 828876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák assert(dst && src); 829876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák if (!dst || !src) 830876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return; 831876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 832876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Sanity checks. */ 833876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák if (dst == src) { 8344c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger assert(!is_overlap(srcbox->x, srcbox->x + width, srcbox->y, srcbox->y + height, 835876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák dstx, dstx + width, dsty, dsty + height)); 836876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák } 837876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák assert(src->target < PIPE_MAX_TEXTURE_TYPES); 8384c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger /* XXX should handle 3d regions */ 8394c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger assert(srcbox->depth == 1); 840876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 841876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Is this a ZS format? */ 842876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák is_depth = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 0) != 0; 843876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák is_stencil = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 1) != 0; 844876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 845876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák if (is_depth || is_stencil) 846876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák bind = PIPE_BIND_DEPTH_STENCIL; 847876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák else 848876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák bind = PIPE_BIND_RENDER_TARGET; 849876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 850876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Check if we can sample from and render to the surfaces. */ 851876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* (assuming copying a stencil buffer is not possible) */ 852cec2082ae515bc91e6b29084ba4b8deac28ef923Stéphane Marchesin if ((!ignore_stencil && is_stencil) || 853876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák !screen->is_format_supported(screen, dst->format, dst->target, 854e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák dst->nr_samples, bind) || 855876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák !screen->is_format_supported(screen, src->format, src->target, 856e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák src->nr_samples, PIPE_BIND_SAMPLER_VIEW)) { 857ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák ctx->base.running = TRUE; 8584c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger util_resource_copy_region(pipe, dst, dstlevel, dstx, dsty, dstz, 8594c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger src, srclevel, srcbox); 860ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák ctx->base.running = FALSE; 861876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return; 862876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák } 863876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 8644c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger /* Get surface. */ 8654c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger memset(&surf_templ, 0, sizeof(surf_templ)); 8664c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger u_surface_default_template(&surf_templ, dst, bind); 867ab21147c899ba1506df38438b6750d3dc5eaabdfHenri Verbeet surf_templ.format = util_format_linear(dst->format); 8684c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surf_templ.u.tex.level = dstlevel; 8694c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surf_templ.u.tex.first_layer = dstz; 8704c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surf_templ.u.tex.last_layer = dstz; 8714c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger dstsurf = pipe->create_surface(pipe, dst, &surf_templ); 87255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 873876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Check whether the states are properly saved. */ 874c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_set_running_flag(ctx); 875c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_vertex_states(ctx); 876c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fragment_states(ctx); 877c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_textures(ctx); 878c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fb_state(ctx); 87955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 880876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Initialize framebuffer state. */ 881876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák fb_state.width = dstsurf->width; 882876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák fb_state.height = dstsurf->height; 88355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 88455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák if (is_depth) { 88555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_keep_color); 88655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, 88755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil); 88885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, 889876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_get_fs_texfetch_depth(ctx, src->target)); 89055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 89155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 0; 892876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák fb_state.zsbuf = dstsurf; 89355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } else { 89455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 89555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 89685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, 897876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_get_fs_texfetch_col(ctx, src->target)); 89855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 89955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 1; 900876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák fb_state.cbufs[0] = dstsurf; 90155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.zsbuf = 0; 90255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 90385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 904d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri normalized = src->target != PIPE_TEXTURE_RECT; 905d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri 906876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Initialize sampler view. */ 907ab21147c899ba1506df38438b6750d3dc5eaabdfHenri Verbeet u_sampler_view_default_template(&viewTempl, src, util_format_linear(src->format)); 908876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák view = pipe->create_sampler_view(pipe, src, &viewTempl); 909f6106566081978f663cf08e54bb8908cb58a5316Michal Krol 910876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Set rasterizer state, shaders, and textures. */ 91155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 9125d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 9134c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák if (ctx->has_geometry_shader) 9144c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák pipe->bind_gs_state(pipe, NULL); 91585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fragment_sampler_states(pipe, 1, 9164c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger blitter_get_sampler_state(ctx, srclevel, normalized)); 917ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 918f6106566081978f663cf08e54bb8908cb58a5316Michal Krol pipe->set_fragment_sampler_views(pipe, 1, &view); 91955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 92055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 9219be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 9229be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 923876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák switch (src->target) { 9249be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw the quad with the draw_rectangle callback. */ 92555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák case PIPE_TEXTURE_1D: 92655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák case PIPE_TEXTURE_2D: 927ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri case PIPE_TEXTURE_RECT: 9289be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák { 9296dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie /* Set texture coordinates. - use a pipe color union 9306dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie * for interface purposes 9316dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie */ 9326dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie union pipe_color_union coord; 9334c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger get_texcoords(src, srclevel, srcbox->x, srcbox->y, 9346dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie srcbox->x+width, srcbox->y+height, normalized, coord.f); 9359be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 9369be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw. */ 9379be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0, 9386dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie UTIL_BLITTER_ATTRIB_TEXCOORD, &coord); 9399be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák } 94055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák break; 9419be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 9429be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw the quad with the generic codepath. */ 943274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák default: 9449be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Set texture coordinates. */ 945274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák switch (src->target) { 946274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák case PIPE_TEXTURE_1D_ARRAY: 947274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák blitter_set_texcoords_1d_array(ctx, src, srclevel, srcbox->y, 948274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák srcbox->x, srcbox->x + width); 949274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák break; 950274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák 951274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák case PIPE_TEXTURE_2D_ARRAY: 952274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák case PIPE_TEXTURE_3D: 9534c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger blitter_set_texcoords_3d(ctx, src, srclevel, srcbox->z, 9544c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger srcbox->x, srcbox->y, 955274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák srcbox->x + width, srcbox->y + height, 956274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák src->target == PIPE_TEXTURE_3D); 957274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák break; 958274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák 959274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák case PIPE_TEXTURE_CUBE: 9604c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger blitter_set_texcoords_cube(ctx, src, srclevel, srcbox->z, 9614c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger srcbox->x, srcbox->y, 9624c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger srcbox->x + width, srcbox->y + height); 963274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák break; 964274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák 965274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák default: 966274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák assert(0); 967274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák } 9689be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 9699be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw. */ 9709be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_rectangle(ctx, dstx, dsty, dstx+width, dsty+height, 0); 971588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák ctx->base.pipe->redefine_user_buffer(ctx->base.pipe, ctx->vbuf, 972588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák 0, ctx->vbuf->width0); 973d5062fb3a315c46d77d5c954a3e3c14be1907d33Marek Olšák util_draw_vertex_buffer(ctx->base.pipe, NULL, ctx->vbuf, 0, 9742a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák PIPE_PRIM_TRIANGLE_FAN, 4, 2); 97555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák break; 97655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 97755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 978c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_vertex_states(ctx); 979c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fragment_states(ctx); 980c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_textures(ctx); 981c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fb_state(ctx); 982c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_unset_running_flag(ctx); 983876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 984876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák pipe_surface_reference(&dstsurf, NULL); 98557c3f70018bc7cd44eafd55d8147691a3c109b91Marek Olšák pipe_sampler_view_reference(&view, NULL); 98655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 98755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 988a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a color surface to a constant value. */ 989a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_render_target(struct blitter_context *blitter, 990a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger struct pipe_surface *dstsurf, 9916dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color, 992a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned dstx, unsigned dsty, 993a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned width, unsigned height) 99455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 99555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 9969b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 99755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct pipe_framebuffer_state fb_state; 99855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 999a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger assert(dstsurf->texture); 1000a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if (!dstsurf->texture) 100155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák return; 100255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 100355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* check the saved state */ 1004c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_set_running_flag(ctx); 1005c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_vertex_states(ctx); 1006c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fragment_states(ctx); 1007c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fb_state(ctx); 100855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1009c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* bind states */ 101055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 101155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 101255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 101385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1)); 10145d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 10154c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák if (ctx->has_geometry_shader) 10164c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák pipe->bind_gs_state(pipe, NULL); 1017ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 101855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 101955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set a framebuffer state */ 102059e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.width = dstsurf->width; 102159e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.height = dstsurf->height; 102255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 1; 102359e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.cbufs[0] = dstsurf; 102455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.zsbuf = 0; 102555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 102655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 10273bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 10289be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0, 10296dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie UTIL_BLITTER_ATTRIB_COLOR, color); 1030c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 1031c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_vertex_states(ctx); 1032c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fragment_states(ctx); 1033c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fb_state(ctx); 1034c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_unset_running_flag(ctx); 1035a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger} 103659e51d9640c242a7c919472d935a91889c7840c9Marek Olšák 1037a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a depth stencil surface. */ 1038a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_depth_stencil(struct blitter_context *blitter, 1039a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger struct pipe_surface *dstsurf, 1040a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned clear_flags, 1041a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger double depth, 1042a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned stencil, 1043a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned dstx, unsigned dsty, 1044a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned width, unsigned height) 1045a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger{ 1046a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 10479b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 1048a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct pipe_framebuffer_state fb_state; 1049a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct pipe_stencil_ref sr = { { 0 } }; 1050a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 1051a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger assert(dstsurf->texture); 1052a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if (!dstsurf->texture) 1053a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger return; 1054a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 1055a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* check the saved state */ 1056c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_set_running_flag(ctx); 1057c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_vertex_states(ctx); 1058c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fragment_states(ctx); 1059c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fb_state(ctx); 1060a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 1061c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* bind states */ 1062a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_blend_state(pipe, ctx->blend_keep_color); 1063a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if ((clear_flags & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) { 1064a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger sr.ref_value[0] = stencil & 0xff; 1065a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 1066a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_stencil_ref(pipe, &sr); 1067a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 1068a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else if (clear_flags & PIPE_CLEAR_DEPTH) { 1069a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil); 1070a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 1071a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else if (clear_flags & PIPE_CLEAR_STENCIL) { 1072a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger sr.ref_value[0] = stencil & 0xff; 1073a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 1074a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_stencil_ref(pipe, &sr); 1075a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 1076a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else 1077a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* hmm that should be illegal probably, or make it a no-op somewhere */ 1078a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 1079a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 1080a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_rasterizer_state(pipe, ctx->rs_state); 1081a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0)); 10825d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 10834c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák if (ctx->has_geometry_shader) 10844c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák pipe->bind_gs_state(pipe, NULL); 1085a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 1086a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 1087a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* set a framebuffer state */ 1088a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.width = dstsurf->width; 1089a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.height = dstsurf->height; 1090a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.nr_cbufs = 0; 1091a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.cbufs[0] = 0; 1092a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.zsbuf = dstsurf; 1093a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_framebuffer_state(pipe, &fb_state); 1094a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 10953bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 10969be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, depth, 10979be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák UTIL_BLITTER_ATTRIB_NONE, NULL); 1098c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 1099c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_vertex_states(ctx); 1100c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fragment_states(ctx); 1101c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fb_state(ctx); 1102c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_unset_running_flag(ctx); 110355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 1104f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1105c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie/* draw a rectangle across a region using a custom dsa stage - for r600g */ 1106c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlievoid util_blitter_custom_depth_stencil(struct blitter_context *blitter, 1107c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie struct pipe_surface *zsurf, 1108c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie struct pipe_surface *cbsurf, 1109c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie void *dsa_stage, float depth) 1110f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák{ 1111f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 1112f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák struct pipe_context *pipe = ctx->base.pipe; 1113f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák struct pipe_framebuffer_state fb_state; 1114f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1115c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie assert(zsurf->texture); 1116c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie if (!zsurf->texture) 1117f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák return; 1118f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1119f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák /* check the saved state */ 1120c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_set_running_flag(ctx); 1121c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_vertex_states(ctx); 1122c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fragment_states(ctx); 1123c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fb_state(ctx); 1124f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1125c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* bind states */ 1126c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie pipe->bind_blend_state(pipe, ctx->blend_write_color); 1127c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie pipe->bind_depth_stencil_alpha_state(pipe, dsa_stage); 1128f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1129f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 1130f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0)); 11315d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 11324c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák if (ctx->has_geometry_shader) 11334c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák pipe->bind_gs_state(pipe, NULL); 1134f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 1135f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1136f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák /* set a framebuffer state */ 1137c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.width = zsurf->width; 1138c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.height = zsurf->height; 1139c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.nr_cbufs = 1; 1140c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie if (cbsurf) { 1141c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.cbufs[0] = cbsurf; 1142c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.nr_cbufs = 1; 1143c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie } else { 1144c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.cbufs[0] = NULL; 1145c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.nr_cbufs = 0; 1146c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie } 1147c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.zsbuf = zsurf; 1148f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 1149f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1150c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie blitter_set_dst_dimensions(ctx, zsurf->width, zsurf->height); 1151c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie blitter->draw_rectangle(blitter, 0, 0, zsurf->width, zsurf->height, depth, 1152f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák UTIL_BLITTER_ATTRIB_NONE, NULL); 1153c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 1154c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_vertex_states(ctx); 1155c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fragment_states(ctx); 1156c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fb_state(ctx); 1157c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_unset_running_flag(ctx); 1158f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák} 1159