u_blitter.c revision db299a9f8244d53d9041fcdbd396a77ebe1f9e3e
155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák/************************************************************************** 255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * 355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * Copyright 2009 Marek Olšák <maraeo@gmail.com> 455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * 555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * Permission is hereby granted, free of charge, to any person obtaining a 655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * copy of this software and associated documentation files (the 755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * "Software"), to deal in the Software without restriction, including 855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * without limitation the rights to use, copy, modify, merge, publish, 955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * distribute, sub license, and/or sell copies of the Software, and to 1055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * permit persons to whom the Software is furnished to do so, subject to 1155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * the following conditions: 1255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * 1355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * The above copyright notice and this permission notice (including the 1455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * next paragraph) shall be included in all copies or substantial portions 1555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * of the Software. 1655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * 1755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 1955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 2155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * 2555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák **************************************************************************/ 2655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 2755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák/** 2855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * @file 29a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger * Blitter utility to facilitate acceleration of the clear, clear_render_target, clear_depth_stencil 30a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger * resource_copy_region functions. 3155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * 3255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * @author Marek Olšák 3355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák */ 3455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "pipe/p_context.h" 3655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "pipe/p_defines.h" 3728486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 3855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "pipe/p_shader_tokens.h" 3955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "pipe/p_state.h" 4055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 41f874da422b1811c4cb5f700f424180793ea66d6fCorbin Simpson#include "util/u_format.h" 4255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_memory.h" 4355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_math.h" 4455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_blitter.h" 4555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_draw_quad.h" 46f6106566081978f663cf08e54bb8908cb58a5316Michal Krol#include "util/u_sampler.h" 4755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_simple_shaders.h" 488b0c217f2bc123bffd25cc4977d6abb1b3fa8186Brian Paul#include "util/u_surface.h" 4955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_texture.h" 5055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 51a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák#define INVALID_PTR ((void*)~0) 52a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák 5355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context_priv 5455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 559b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct blitter_context base; 5655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 57287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *vbuf; /**< quad */ 5855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 5955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák float vertices[4][2][4]; /**< {pos, color} or {pos, texcoord} */ 6055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 6185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Templates for various state objects. */ 6285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák struct pipe_sampler_state template_sampler_state; 6385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 6455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Constant state objects. */ 6555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Vertex shaders. */ 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; 1079a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák 1089a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák boolean running; 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, 1169be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák const float attrib[4]); 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; 1429b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_velem_state = INVALID_PTR; 1439b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fb_state.nr_cbufs = ~0; 1449b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_views = ~0; 1459b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_states = ~0; 1469b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_vertex_buffers = ~0; 14755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 14855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* blend state objects */ 1490c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul memset(&blend, 0, sizeof(blend)); 15055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->blend_keep_color = pipe->create_blend_state(pipe, &blend); 15155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 152eba1e2a44718bea398e49d496a78ee002c9922b8Roland Scheidegger blend.rt[0].colormask = PIPE_MASK_RGBA; 15355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->blend_write_color = pipe->create_blend_state(pipe, &blend); 15455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 15555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* depth stencil alpha state objects */ 1560c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul memset(&dsa, 0, sizeof(dsa)); 15755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_keep_depth_stencil = 1581a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 15955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 160f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák dsa.depth.enabled = 1; 161f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák dsa.depth.writemask = 1; 162f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák dsa.depth.func = PIPE_FUNC_ALWAYS; 16355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil = 1641a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 1651a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger 1661a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].enabled = 1; 1671a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].func = PIPE_FUNC_ALWAYS; 1681a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE; 1691a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE; 1701a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE; 1711a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].valuemask = 0xff; 1721a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].writemask = 0xff; 1731a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger ctx->dsa_write_depth_stencil = 1741a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 175a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 176a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 177a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger dsa.depth.enabled = 0; 178a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger dsa.depth.writemask = 0; 179a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger ctx->dsa_keep_depth_write_stencil = 180a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 18155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 18255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* sampler state */ 18385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state = &ctx->template_sampler_state; 18485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 18585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 18685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 1872ee0d19ccf768c4c12c3c3476c1cd7eff508629aCorbin Simpson sampler_state->normalized_coords = TRUE; 18885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* The sampler state objects which sample from a specified mipmap level 18985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák * are created on-demand. */ 19055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 19155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* rasterizer state */ 19255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák memset(&rs_state, 0, sizeof(rs_state)); 1930bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell rs_state.cull_face = PIPE_FACE_NONE; 19455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák rs_state.gl_rasterization_rules = 1; 1951c75edf3e8ccc97f5f91f42f99c1f8db30b25fc4Corbin Simpson rs_state.flatshade = 1; 19655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->rs_state = pipe->create_rasterizer_state(pipe, &rs_state); 19755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 198ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger /* vertex elements state */ 199ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger memset(&velem[0], 0, sizeof(velem[0]) * 2); 200ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger for (i = 0; i < 2; i++) { 201ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].src_offset = i * 4 * sizeof(float); 202ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].instance_divisor = 0; 203ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].vertex_buffer_index = 0; 204ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 205ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger } 206ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger ctx->velem_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]); 207ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger 20885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* fragment shaders are created on-demand */ 20985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 2105d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák /* vertex shader */ 21155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák { 21255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const uint semantic_names[] = { TGSI_SEMANTIC_POSITION, 21355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák TGSI_SEMANTIC_GENERIC }; 21455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const uint semantic_indices[] = { 0, 0 }; 2155d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák ctx->vs = 21655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák util_make_vertex_passthrough_shader(pipe, 2, semantic_names, 21755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák semantic_indices); 21855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 21955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 22055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set invariant vertex coordinates */ 22155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 22255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][0][3] = 1; /*v.w*/ 22355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 22455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* create the vertex buffer */ 2259b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->vbuf = pipe_buffer_create(ctx->base.pipe->screen, 226287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_VERTEX_BUFFER, 22755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák sizeof(ctx->vertices)); 22855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 2299b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák return &ctx->base; 23055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 23155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 23255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_destroy(struct blitter_context *blitter) 23355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 23455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 2359b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = blitter->pipe; 23655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 23755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 23855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_blend_state(pipe, ctx->blend_write_color); 23955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_blend_state(pipe, ctx->blend_keep_color); 24055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 24155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_depth_stencil_alpha_state(pipe, 24255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil); 2431a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 244a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 2456a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson 24655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_rasterizer_state(pipe, ctx->rs_state); 2475d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->delete_vs_state(pipe, ctx->vs); 248ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->delete_vertex_elements_state(pipe, ctx->velem_state); 24955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 250ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák for (i = 0; i < PIPE_MAX_TEXTURE_TYPES; i++) { 25185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_texfetch_col[i]) 25285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_texfetch_col[i]); 25385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_texfetch_depth[i]) 25485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_texfetch_depth[i]); 25555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 256ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 257b51f6e7c2350f637337fc3935436e2f99f669dfdJoakim Sindholt for (i = 0; i <= PIPE_MAX_COLOR_BUFS; i++) 25885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_col[i]) 25985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_col[i]); 26055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 261d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri for (i = 0; i < PIPE_MAX_TEXTURE_LEVELS * 2; i++) 26285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->sampler_state[i]) 26385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_sampler_state(pipe, ctx->sampler_state[i]); 264ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 265287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&ctx->vbuf, NULL); 26655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák FREE(ctx); 26755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 26855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 26955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_check_saved_CSOs(struct blitter_context_priv *ctx) 27055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 2719a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák if (ctx->running) { 2729a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák _debug_printf("u_blitter: Caught recursion on save. " 2739a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák "This is a driver bug.\n"); 2749a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák } 2759a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák ctx->running = TRUE; 2769a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák 27755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* make sure these CSOs have been saved */ 2789b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák assert(ctx->base.saved_blend_state != INVALID_PTR && 2799b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_dsa_state != INVALID_PTR && 2809b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_rs_state != INVALID_PTR && 2819b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fs != INVALID_PTR && 2829b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_vs != INVALID_PTR && 2839b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_velem_state != INVALID_PTR); 28455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 28555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 28655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_restore_CSOs(struct blitter_context_priv *ctx) 28755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 2889b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 2898f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák unsigned i; 29055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 29155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* restore the state objects which are always required to be saved */ 2929b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_blend_state(pipe, ctx->base.saved_blend_state); 2939b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->base.saved_dsa_state); 2949b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_rasterizer_state(pipe, ctx->base.saved_rs_state); 2959b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_fs_state(pipe, ctx->base.saved_fs); 2969b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_vs_state(pipe, ctx->base.saved_vs); 2979b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_vertex_elements_state(pipe, ctx->base.saved_velem_state); 29855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 2999b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_blend_state = INVALID_PTR; 3009b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_dsa_state = INVALID_PTR; 3019b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_rs_state = INVALID_PTR; 3029b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fs = INVALID_PTR; 3039b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_vs = INVALID_PTR; 3049b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_velem_state = INVALID_PTR; 30555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3069b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_stencil_ref(pipe, &ctx->base.saved_stencil_ref); 3079b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_viewport_state(pipe, &ctx->base.saved_viewport); 3089b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_clip_state(pipe, &ctx->base.saved_clip); 309932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 31055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* restore the state objects which are required to be saved before copy/fill 31155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák */ 3129b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák if (ctx->base.saved_fb_state.nr_cbufs != ~0) { 3139b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_framebuffer_state(pipe, &ctx->base.saved_fb_state); 314a922725118333e016a357008f37105c23c6f54bcMarek Olšák util_unreference_framebuffer_state(&ctx->base.saved_fb_state); 3159b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fb_state.nr_cbufs = ~0; 31655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 31755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3189b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák if (ctx->base.saved_num_sampler_states != ~0) { 31955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_fragment_sampler_states(pipe, 3209b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_states, 3219b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_sampler_states); 3229b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_states = ~0; 32355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 32455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3259b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák if (ctx->base.saved_num_sampler_views != ~0) { 326f6106566081978f663cf08e54bb8908cb58a5316Michal Krol pipe->set_fragment_sampler_views(pipe, 3279b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_views, 3289b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_sampler_views); 3290b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák 3309b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák for (i = 0; i < ctx->base.saved_num_sampler_views; i++) 3319b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe_sampler_view_reference(&ctx->base.saved_sampler_views[i], 3320b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák NULL); 3330b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák 3349b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_views = ~0; 33555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 33664aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri 3379b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák if (ctx->base.saved_num_vertex_buffers != ~0) { 33864aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri pipe->set_vertex_buffers(pipe, 3399b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_vertex_buffers, 3409b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_vertex_buffers); 3418f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák 3429b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák for (i = 0; i < ctx->base.saved_num_vertex_buffers; i++) { 3439b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák if (ctx->base.saved_vertex_buffers[i].buffer) { 3449b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe_resource_reference(&ctx->base.saved_vertex_buffers[i].buffer, 3458f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák NULL); 3468f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák } 3478f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák } 3489b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_vertex_buffers = ~0; 34964aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri } 3509a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák 3519a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák if (!ctx->running) { 3529a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák _debug_printf("u_blitter: Caught recursion on restore. " 3539a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák "This is a driver bug.\n"); 3549a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák } 3559a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák ctx->running = FALSE; 35655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 35755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 35855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_rectangle(struct blitter_context_priv *ctx, 35955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 36055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x2, unsigned y2, 36155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák float depth) 36255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 36355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 36455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 36555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set vertex positions */ 3663bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[0][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v0.x*/ 3673bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[0][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v0.y*/ 36855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3693bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[1][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v1.x*/ 3703bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[1][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v1.y*/ 37155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3723bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[2][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v2.x*/ 3733bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[2][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v2.y*/ 37455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3753bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[3][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v3.x*/ 3763bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[3][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v3.y*/ 37755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 37855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 37955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][0][2] = depth; /*z*/ 380932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 381932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* viewport */ 3823bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.scale[0] = 0.5f * ctx->dst_width; 3833bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.scale[1] = 0.5f * ctx->dst_height; 384ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák ctx->viewport.scale[2] = 1.0f; 385932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->viewport.scale[3] = 1.0f; 3863bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.translate[0] = 0.5f * ctx->dst_width; 3873bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.translate[1] = 0.5f * ctx->dst_height; 388ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák ctx->viewport.translate[2] = 0.0f; 389932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->viewport.translate[3] = 0.0f; 3909b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.pipe->set_viewport_state(ctx->base.pipe, &ctx->viewport); 391932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 392932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* clip */ 3939b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.pipe->set_clip_state(ctx->base.pipe, &ctx->clip); 39455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 39555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 39655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_clear_color(struct blitter_context_priv *ctx, 39755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const float *rgba) 39855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 39955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 40055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 401fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák if (rgba) { 40216d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák for (i = 0; i < 4; i++) { 40316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][0] = rgba[0]; 40416d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][1] = rgba[1]; 40516d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][2] = rgba[2]; 40616d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][3] = rgba[3]; 40716d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák } 408fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák } else { 40916d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák for (i = 0; i < 4; i++) { 41016d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][0] = 0; 41116d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][1] = 0; 41216d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][2] = 0; 41316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][3] = 0; 41416d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák } 41555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 41655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 41755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 418d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieristatic void get_texcoords(struct pipe_resource *src, 4194c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned level, 4204c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned x1, unsigned y1, 4214c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned x2, unsigned y2, 4224c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger boolean normalized, float out[4]) 423749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{ 424d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri if(normalized) 425d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri { 4264c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger out[0] = x1 / (float)u_minify(src->width0, level); 4274c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger out[1] = y1 / (float)u_minify(src->height0, level); 4284c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger out[2] = x2 / (float)u_minify(src->width0, level); 4294c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger out[3] = y2 / (float)u_minify(src->height0, level); 430d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri } 431d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri else 432d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri { 433d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[0] = x1; 434d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[1] = y1; 435d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[2] = x2; 436d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[3] = y2; 437d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri } 438749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák} 439749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák 440749e24521a31178d2b647aa2954c3eecd597b799Marek Olšákstatic void set_texcoords_in_vertices(const float coord[4], 441749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák float *out, unsigned stride) 442749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{ 443749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[0]; /*t0.s*/ 444749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[1]; /*t0.t*/ 445749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out += stride; 446749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[2]; /*t1.s*/ 447749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[1]; /*t1.t*/ 448749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out += stride; 449749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[2]; /*t2.s*/ 450749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[3]; /*t2.t*/ 451749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out += stride; 452749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[0]; /*t3.s*/ 453749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[3]; /*t3.t*/ 454749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák} 455749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák 45655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_2d(struct blitter_context_priv *ctx, 457876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *src, 4584c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned level, 45955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 46055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x2, unsigned y2) 46155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 462749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák unsigned i; 463749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák float coord[4]; 46455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 4654c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger get_texcoords(src, level, x1, y1, x2, y2, TRUE, coord); 466749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák set_texcoords_in_vertices(coord, &ctx->vertices[0][1][0], 8); 46755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 46855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) { 46955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][1][2] = 0; /*r*/ 47055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][1][3] = 1; /*q*/ 47155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 47255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 47355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 47455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_3d(struct blitter_context_priv *ctx, 475876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *src, 4764c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned level, 477876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned zslice, 47855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 47955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x2, unsigned y2) 48055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 48155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 4824c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger float r = zslice / (float)u_minify(src->depth0, level); 48355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 4844c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger blitter_set_texcoords_2d(ctx, src, level, x1, y1, x2, y2); 48555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 48655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 48755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][1][2] = r; /*r*/ 48855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 48955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 49055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_cube(struct blitter_context_priv *ctx, 491876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *src, 4924c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned level, unsigned face, 49355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 49455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x2, unsigned y2) 49555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 49655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 497749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák float coord[4]; 498d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul float st[4][2]; 499d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul 5004c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger get_texcoords(src, level, x1, y1, x2, y2, TRUE, coord); 501749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák set_texcoords_in_vertices(coord, &st[0][0], 2); 50255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 5034c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger util_map_texcoords2d_onto_cubemap(face, 50455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* pointer, stride in floats */ 50555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák &st[0][0], 2, 50655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák &ctx->vertices[0][1][0], 8); 50755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 50855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 50955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][1][3] = 1; /*q*/ 51055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 51155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 5123bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákstatic void blitter_set_dst_dimensions(struct blitter_context_priv *ctx, 5133bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák unsigned width, unsigned height) 5143bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák{ 5153bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->dst_width = width; 5163bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->dst_height = height; 5173bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák} 5183bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák 51955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_draw_quad(struct blitter_context_priv *ctx) 52055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 5219b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 5222c1de07ddf9f4de6813f0ed46fc859b2f61db7b2Marek Olšák struct pipe_box box; 52355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 52480e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák /* write vertices and draw them */ 5252c1de07ddf9f4de6813f0ed46fc859b2f61db7b2Marek Olšák u_box_1d(0, sizeof(ctx->vertices), &box); 5264c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger pipe->transfer_inline_write(pipe, ctx->vbuf, 0, 5272c1de07ddf9f4de6813f0ed46fc859b2f61db7b2Marek Olšák PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD, 5282c1de07ddf9f4de6813f0ed46fc859b2f61db7b2Marek Olšák &box, ctx->vertices, sizeof(ctx->vertices), 0); 52955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 53080e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák util_draw_vertex_buffer(pipe, ctx->vbuf, 0, PIPE_PRIM_TRIANGLE_FAN, 53180e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák 4, /* verts */ 53280e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák 2); /* attribs/vert */ 53355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 53455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 53585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 53685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid **blitter_get_sampler_state(struct blitter_context_priv *ctx, 537d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri int miplevel, boolean normalized) 53885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 5399b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 54085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák struct pipe_sampler_state *sampler_state = &ctx->template_sampler_state; 54185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 54285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(miplevel < PIPE_MAX_TEXTURE_LEVELS); 54385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 54485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Create the sampler state on-demand. */ 545d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri if (!ctx->sampler_state[miplevel * 2 + normalized]) { 54685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->lod_bias = miplevel; 54785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->min_lod = miplevel; 54885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->max_lod = miplevel; 549d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri sampler_state->normalized_coords = normalized; 55085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 551d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri ctx->sampler_state[miplevel * 2 + normalized] = pipe->create_sampler_state(pipe, 55285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state); 55385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák } 55485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 55585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Return void** so that it can be passed to bind_fragment_sampler_states 55685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák * directly. */ 557d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri return &ctx->sampler_state[miplevel * 2 + normalized]; 55885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 55985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 56085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 56185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_col(struct blitter_context_priv *ctx, unsigned num_cbufs) 56285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 5639b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 56485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 56585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(num_cbufs <= PIPE_MAX_COLOR_BUFS); 56685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 567677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas if (!ctx->fs_col[num_cbufs]) 568677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas ctx->fs_col[num_cbufs] = 5695d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák util_make_fragment_cloneinput_shader(pipe, num_cbufs, 5705d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák TGSI_SEMANTIC_GENERIC, 5715d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák TGSI_INTERPOLATE_LINEAR); 57285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 573677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas return ctx->fs_col[num_cbufs]; 57485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 57585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 576d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul/** Convert PIPE_TEXTURE_x to TGSI_TEXTURE_x */ 577d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paulstatic unsigned 5783bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákpipe_tex_to_tgsi_tex(enum pipe_texture_target pipe_tex_target) 579d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul{ 580d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul switch (pipe_tex_target) { 581d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul case PIPE_TEXTURE_1D: 582d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_1D; 583d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul case PIPE_TEXTURE_2D: 584d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_2D; 585ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri case PIPE_TEXTURE_RECT: 586cbe367227959a32ff20e146106162a81d2be02c3Luca Barbieri return TGSI_TEXTURE_RECT; 587d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul case PIPE_TEXTURE_3D: 588d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_3D; 589d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul case PIPE_TEXTURE_CUBE: 590d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_CUBE; 591d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul default: 592d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul assert(0 && "unexpected texture target"); 593d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_UNKNOWN; 594d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul } 595d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul} 596d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 597d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 59885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 59985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_col(struct blitter_context_priv *ctx, 60085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák unsigned tex_target) 60185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 6029b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 60385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 60485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(tex_target < PIPE_MAX_TEXTURE_TYPES); 60585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 60685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Create the fragment shader on-demand. */ 60785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (!ctx->fs_texfetch_col[tex_target]) { 608d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target); 609d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 610d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul ctx->fs_texfetch_col[tex_target] = 611d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul util_make_fragment_tex_shader(pipe, tgsi_tex, TGSI_INTERPOLATE_LINEAR); 61285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák } 61385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 61485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák return ctx->fs_texfetch_col[tex_target]; 61585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 61685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 61785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 61885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_depth(struct blitter_context_priv *ctx, 61985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák unsigned tex_target) 62085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 6219b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 62285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 62385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(tex_target < PIPE_MAX_TEXTURE_TYPES); 62485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 62585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Create the fragment shader on-demand. */ 62685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (!ctx->fs_texfetch_depth[tex_target]) { 627d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target); 628d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 629d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul ctx->fs_texfetch_depth[tex_target] = 630d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul util_make_fragment_tex_shader_writedepth(pipe, tgsi_tex, 631d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul TGSI_INTERPOLATE_LINEAR); 63285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák } 63385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 63485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák return ctx->fs_texfetch_depth[tex_target]; 63585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 63685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 6379be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter, 6389be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned x1, unsigned y1, 6399be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned x2, unsigned y2, 6409be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák float depth, 6419be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák enum blitter_attrib_type type, 6429be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák const float attrib[4]) 6439be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák{ 6449be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 6459be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 6469be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák switch (type) { 6479be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák case UTIL_BLITTER_ATTRIB_COLOR: 6489be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_clear_color(ctx, attrib); 6499be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák break; 6509be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 6519be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák case UTIL_BLITTER_ATTRIB_TEXCOORD: 6529be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák set_texcoords_in_vertices(attrib, &ctx->vertices[0][1][0], 8); 6539be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák break; 6549be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 6559be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák default:; 6569be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák } 6579be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 6589be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_rectangle(ctx, x1, y1, x2, y2, depth); 6599be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_draw_quad(ctx); 6609be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák} 6619be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 662db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákstatic void util_blitter_clear_custom(struct blitter_context *blitter, 663db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned width, unsigned height, 664db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned num_cbufs, 665db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned clear_buffers, 666db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák const float *rgba, 667db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák double depth, unsigned stencil, 668db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák void *custom_blend, void *custom_dsa) 66955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 67055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 6719b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 6726a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson struct pipe_stencil_ref sr = { { 0 } }; 67355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 674ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák assert(num_cbufs <= PIPE_MAX_COLOR_BUFS); 67555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 67655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_check_saved_CSOs(ctx); 67755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 67855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* bind CSOs */ 679db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák if (custom_blend) { 680db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák pipe->bind_blend_state(pipe, custom_blend); 681db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if (clear_buffers & PIPE_CLEAR_COLOR) { 68255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 683db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else { 68455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_keep_color); 685db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } 68655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 687db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák if (custom_dsa) { 688db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, custom_dsa); 689db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if ((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) { 6901a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 691db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if (clear_buffers & PIPE_CLEAR_DEPTH) { 692a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil); 693db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if (clear_buffers & PIPE_CLEAR_STENCIL) { 694a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 695db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else { 69655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 697db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } 698db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 699db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák sr.ref_value[0] = stencil & 0xff; 700db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák pipe->set_stencil_ref(pipe, &sr); 70155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 70255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 703ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 70485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, num_cbufs)); 7055d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 70655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 7073bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák blitter_set_dst_dimensions(ctx, width, height); 7089be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, 0, 0, width, height, depth, 7099be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák UTIL_BLITTER_ATTRIB_COLOR, rgba); 71055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_restore_CSOs(ctx); 71155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 71255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 713db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid util_blitter_clear(struct blitter_context *blitter, 714db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned width, unsigned height, 715db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned num_cbufs, 716db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned clear_buffers, 717db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák const float *rgba, 718db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák double depth, unsigned stencil) 719db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák{ 720db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák util_blitter_clear_custom(blitter, width, height, num_cbufs, 721db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák clear_buffers, rgba, depth, stencil, 722db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák NULL, NULL); 723db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák} 724db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 725db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid util_blitter_clear_depth_custom(struct blitter_context *blitter, 726db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned width, unsigned height, 727db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák double depth, void *custom_dsa) 728db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák{ 729db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák const float rgba[4] = {0, 0, 0, 0}; 730db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák util_blitter_clear_custom(blitter, width, height, 0, 731db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 0, rgba, depth, 0, NULL, custom_dsa); 732db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák} 733db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 734876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákstatic 735876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákboolean is_overlap(unsigned sx1, unsigned sx2, unsigned sy1, unsigned sy2, 736876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned dx1, unsigned dx2, unsigned dy1, unsigned dy2) 737deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie{ 738876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return sx1 < dx2 && sx2 > dx1 && sy1 < dy2 && sy2 > dy1; 739deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie} 740deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie 741876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákvoid util_blitter_copy_region(struct blitter_context *blitter, 742876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *dst, 7434c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned dstlevel, 744876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned dstx, unsigned dsty, unsigned dstz, 745876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *src, 7464c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned srclevel, 7474c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger const struct pipe_box *srcbox, 748876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák boolean ignore_stencil) 74955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 75055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 7519b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 752876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_screen *screen = pipe->screen; 7534c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger struct pipe_surface *dstsurf, surf_templ; 75455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct pipe_framebuffer_state fb_state; 755f6106566081978f663cf08e54bb8908cb58a5316Michal Krol struct pipe_sampler_view viewTempl, *view; 756876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned bind; 7574c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned width = srcbox->width; 7584c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned height = srcbox->height; 759876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák boolean is_stencil, is_depth; 760d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri boolean normalized; 761876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 762876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Give up if textures are not set. */ 763876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák assert(dst && src); 764876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák if (!dst || !src) 765876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return; 766876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 767876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Sanity checks. */ 768876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák if (dst == src) { 7694c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger assert(!is_overlap(srcbox->x, srcbox->x + width, srcbox->y, srcbox->y + height, 770876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák dstx, dstx + width, dsty, dsty + height)); 771876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák } 772876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák assert(src->target < PIPE_MAX_TEXTURE_TYPES); 7734c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger /* XXX should handle 3d regions */ 7744c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger assert(srcbox->depth == 1); 775876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 776876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Is this a ZS format? */ 777876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák is_depth = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 0) != 0; 778876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák is_stencil = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 1) != 0; 779876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 780876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák if (is_depth || is_stencil) 781876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák bind = PIPE_BIND_DEPTH_STENCIL; 782876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák else 783876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák bind = PIPE_BIND_RENDER_TARGET; 784876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 785876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Check if we can sample from and render to the surfaces. */ 786876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* (assuming copying a stencil buffer is not possible) */ 787876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák if ((!ignore_stencil && is_stencil) || 788876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák !screen->is_format_supported(screen, dst->format, dst->target, 789876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák dst->nr_samples, bind, 0) || 790876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák !screen->is_format_supported(screen, src->format, src->target, 791876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák src->nr_samples, PIPE_BIND_SAMPLER_VIEW, 0)) { 7924c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger util_resource_copy_region(pipe, dst, dstlevel, dstx, dsty, dstz, 7934c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger src, srclevel, srcbox); 794876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return; 795876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák } 796876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 7974c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger /* Get surface. */ 7984c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger memset(&surf_templ, 0, sizeof(surf_templ)); 7994c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger u_surface_default_template(&surf_templ, dst, bind); 8004c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surf_templ.u.tex.level = dstlevel; 8014c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surf_templ.u.tex.first_layer = dstz; 8024c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surf_templ.u.tex.last_layer = dstz; 8034c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger dstsurf = pipe->create_surface(pipe, dst, &surf_templ); 80455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 805876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Check whether the states are properly saved. */ 806876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_check_saved_CSOs(ctx); 80755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák assert(blitter->saved_fb_state.nr_cbufs != ~0); 808f6106566081978f663cf08e54bb8908cb58a5316Michal Krol assert(blitter->saved_num_sampler_views != ~0); 80955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák assert(blitter->saved_num_sampler_states != ~0); 81055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 811876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Initialize framebuffer state. */ 812876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák fb_state.width = dstsurf->width; 813876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák fb_state.height = dstsurf->height; 81455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 81555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák if (is_depth) { 81655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_keep_color); 81755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, 81855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil); 81985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, 820876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_get_fs_texfetch_depth(ctx, src->target)); 82155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 82255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 0; 823876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák fb_state.zsbuf = dstsurf; 82455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } else { 82555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 82655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 82785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, 828876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_get_fs_texfetch_col(ctx, src->target)); 82955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 83055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 1; 831876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák fb_state.cbufs[0] = dstsurf; 83255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.zsbuf = 0; 83355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 83485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 835d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri normalized = src->target != PIPE_TEXTURE_RECT; 836d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri 837876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Initialize sampler view. */ 838876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák u_sampler_view_default_template(&viewTempl, src, src->format); 839876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák view = pipe->create_sampler_view(pipe, src, &viewTempl); 840f6106566081978f663cf08e54bb8908cb58a5316Michal Krol 841876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Set rasterizer state, shaders, and textures. */ 84255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 8435d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 84485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fragment_sampler_states(pipe, 1, 8454c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger blitter_get_sampler_state(ctx, srclevel, normalized)); 846ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 847f6106566081978f663cf08e54bb8908cb58a5316Michal Krol pipe->set_fragment_sampler_views(pipe, 1, &view); 84855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 84955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 8509be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 8519be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 852876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák switch (src->target) { 8539be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw the quad with the draw_rectangle callback. */ 85455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák case PIPE_TEXTURE_1D: 85555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák case PIPE_TEXTURE_2D: 856ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri case PIPE_TEXTURE_RECT: 8579be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák { 8589be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Set texture coordinates. */ 8599be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák float coord[4]; 8604c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger get_texcoords(src, srclevel, srcbox->x, srcbox->y, 8614c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger srcbox->x+width, srcbox->y+height, normalized, coord); 8629be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 8639be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw. */ 8649be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0, 8659be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák UTIL_BLITTER_ATTRIB_TEXCOORD, coord); 8669be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák } 86755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák break; 8689be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 8699be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw the quad with the generic codepath. */ 87055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák case PIPE_TEXTURE_3D: 87155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák case PIPE_TEXTURE_CUBE: 8729be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Set texture coordinates. */ 8739be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák if (src->target == PIPE_TEXTURE_3D) 8744c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger blitter_set_texcoords_3d(ctx, src, srclevel, srcbox->z, 8754c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger srcbox->x, srcbox->y, 8764c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger srcbox->x + width, srcbox->y + height); 8779be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák else 8784c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger blitter_set_texcoords_cube(ctx, src, srclevel, srcbox->z, 8794c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger srcbox->x, srcbox->y, 8804c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger srcbox->x + width, srcbox->y + height); 8819be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 8829be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw. */ 8839be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_rectangle(ctx, dstx, dsty, dstx+width, dsty+height, 0); 8849be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_draw_quad(ctx); 88555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák break; 8869be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 887ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák default: 888ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák assert(0); 889876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return; 89055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 89155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 89255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_restore_CSOs(ctx); 893876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 894876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák pipe_surface_reference(&dstsurf, NULL); 89557c3f70018bc7cd44eafd55d8147691a3c109b91Marek Olšák pipe_sampler_view_reference(&view, NULL); 89655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 89755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 898a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a color surface to a constant value. */ 899a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_render_target(struct blitter_context *blitter, 900a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger struct pipe_surface *dstsurf, 901a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger const float *rgba, 902a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned dstx, unsigned dsty, 903a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned width, unsigned height) 90455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 90555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 9069b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 90755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct pipe_framebuffer_state fb_state; 90855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 909a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger assert(dstsurf->texture); 910a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if (!dstsurf->texture) 91155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák return; 91255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 91355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* check the saved state */ 91455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_check_saved_CSOs(ctx); 91555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák assert(blitter->saved_fb_state.nr_cbufs != ~0); 91655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 91755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* bind CSOs */ 91855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 91955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 92055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 92185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1)); 9225d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 923ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 92455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 92555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set a framebuffer state */ 92659e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.width = dstsurf->width; 92759e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.height = dstsurf->height; 92855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 1; 92959e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.cbufs[0] = dstsurf; 93055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.zsbuf = 0; 93155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 93255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 9333bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 9349be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0, 9359be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák UTIL_BLITTER_ATTRIB_COLOR, rgba); 93655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_restore_CSOs(ctx); 937a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger} 93859e51d9640c242a7c919472d935a91889c7840c9Marek Olšák 939a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a depth stencil surface. */ 940a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_depth_stencil(struct blitter_context *blitter, 941a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger struct pipe_surface *dstsurf, 942a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned clear_flags, 943a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger double depth, 944a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned stencil, 945a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned dstx, unsigned dsty, 946a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned width, unsigned height) 947a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger{ 948a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 9499b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 950a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct pipe_framebuffer_state fb_state; 951a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct pipe_stencil_ref sr = { { 0 } }; 952a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 953a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger assert(dstsurf->texture); 954a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if (!dstsurf->texture) 955a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger return; 956a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 957a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* check the saved state */ 958a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger blitter_check_saved_CSOs(ctx); 959a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger assert(blitter->saved_fb_state.nr_cbufs != ~0); 960a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 961a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* bind CSOs */ 962a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_blend_state(pipe, ctx->blend_keep_color); 963a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if ((clear_flags & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) { 964a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger sr.ref_value[0] = stencil & 0xff; 965a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 966a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_stencil_ref(pipe, &sr); 967a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 968a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else if (clear_flags & PIPE_CLEAR_DEPTH) { 969a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil); 970a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 971a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else if (clear_flags & PIPE_CLEAR_STENCIL) { 972a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger sr.ref_value[0] = stencil & 0xff; 973a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 974a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_stencil_ref(pipe, &sr); 975a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 976a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else 977a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* hmm that should be illegal probably, or make it a no-op somewhere */ 978a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 979a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 980a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_rasterizer_state(pipe, ctx->rs_state); 981a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0)); 9825d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 983a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 984a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 985a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* set a framebuffer state */ 986a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.width = dstsurf->width; 987a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.height = dstsurf->height; 988a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.nr_cbufs = 0; 989a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.cbufs[0] = 0; 990a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.zsbuf = dstsurf; 991a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_framebuffer_state(pipe, &fb_state); 992a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 9933bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 9949be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, depth, 9959be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák UTIL_BLITTER_ATTRIB_NONE, NULL); 996a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger blitter_restore_CSOs(ctx); 99755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 998f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 999c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie/* draw a rectangle across a region using a custom dsa stage - for r600g */ 1000c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlievoid util_blitter_custom_depth_stencil(struct blitter_context *blitter, 1001c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie struct pipe_surface *zsurf, 1002c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie struct pipe_surface *cbsurf, 1003c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie void *dsa_stage, float depth) 1004f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák{ 1005f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 1006f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák struct pipe_context *pipe = ctx->base.pipe; 1007f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák struct pipe_framebuffer_state fb_state; 1008f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1009c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie assert(zsurf->texture); 1010c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie if (!zsurf->texture) 1011f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák return; 1012f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1013f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák /* check the saved state */ 1014f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák blitter_check_saved_CSOs(ctx); 1015f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák assert(blitter->saved_fb_state.nr_cbufs != ~0); 1016f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1017f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák /* bind CSOs */ 1018c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie pipe->bind_blend_state(pipe, ctx->blend_write_color); 1019c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie pipe->bind_depth_stencil_alpha_state(pipe, dsa_stage); 1020f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1021f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 1022f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0)); 10235d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 1024f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 1025f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1026f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák /* set a framebuffer state */ 1027c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.width = zsurf->width; 1028c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.height = zsurf->height; 1029c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.nr_cbufs = 1; 1030c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie if (cbsurf) { 1031c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.cbufs[0] = cbsurf; 1032c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.nr_cbufs = 1; 1033c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie } else { 1034c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.cbufs[0] = NULL; 1035c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.nr_cbufs = 0; 1036c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie } 1037c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.zsbuf = zsurf; 1038f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 1039f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1040c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie blitter_set_dst_dimensions(ctx, zsurf->width, zsurf->height); 1041c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie blitter->draw_rectangle(blitter, 0, 0, zsurf->width, zsurf->height, depth, 1042f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák UTIL_BLITTER_ATTRIB_NONE, NULL); 1043f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák blitter_restore_CSOs(ctx); 1044f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák} 1045