u_blitter.c revision 6dd284f7c8fac22f64c13fdf9909094f5ec59086
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; 10755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}; 10855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1099be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter, 1109be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned x, unsigned y, 1119be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned width, unsigned height, 1129be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák float depth, 1139be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák enum blitter_attrib_type type, 1146dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *attrib); 1159be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 1169be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 11755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context *util_blitter_create(struct pipe_context *pipe) 11855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 11955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx; 1200c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul struct pipe_blend_state blend; 1210c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul struct pipe_depth_stencil_alpha_state dsa; 1220c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul struct pipe_rasterizer_state rs_state; 12385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák struct pipe_sampler_state *sampler_state; 124ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger struct pipe_vertex_element velem[2]; 12585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák unsigned i; 12655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 12755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx = CALLOC_STRUCT(blitter_context_priv); 12855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák if (!ctx) 12955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák return NULL; 13055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1319b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.pipe = pipe; 1329be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák ctx->base.draw_rectangle = blitter_draw_rectangle; 13355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 13455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* init state objects for them to be considered invalid */ 1359b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_blend_state = INVALID_PTR; 1369b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_dsa_state = INVALID_PTR; 1379b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_rs_state = INVALID_PTR; 1389b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fs = INVALID_PTR; 1399b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_vs = INVALID_PTR; 1409b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_velem_state = INVALID_PTR; 1419b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fb_state.nr_cbufs = ~0; 1429b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_views = ~0; 1439b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_states = ~0; 1449b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_vertex_buffers = ~0; 14555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 14655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* blend state objects */ 1470c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul memset(&blend, 0, sizeof(blend)); 14855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->blend_keep_color = pipe->create_blend_state(pipe, &blend); 14955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 150eba1e2a44718bea398e49d496a78ee002c9922b8Roland Scheidegger blend.rt[0].colormask = PIPE_MASK_RGBA; 15155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->blend_write_color = pipe->create_blend_state(pipe, &blend); 15255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 15355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* depth stencil alpha state objects */ 1540c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul memset(&dsa, 0, sizeof(dsa)); 15555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_keep_depth_stencil = 1561a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 15755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 158f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák dsa.depth.enabled = 1; 159f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák dsa.depth.writemask = 1; 160f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák dsa.depth.func = PIPE_FUNC_ALWAYS; 16155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil = 1621a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 1631a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger 1641a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].enabled = 1; 1651a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].func = PIPE_FUNC_ALWAYS; 1661a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE; 1671a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE; 1681a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE; 1691a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].valuemask = 0xff; 1701a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].writemask = 0xff; 1711a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger ctx->dsa_write_depth_stencil = 1721a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 173a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 174a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 175a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger dsa.depth.enabled = 0; 176a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger dsa.depth.writemask = 0; 177a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger ctx->dsa_keep_depth_write_stencil = 178a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 17955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 18055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* sampler state */ 18185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state = &ctx->template_sampler_state; 18285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 18385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 18485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 1852ee0d19ccf768c4c12c3c3476c1cd7eff508629aCorbin Simpson sampler_state->normalized_coords = TRUE; 18685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* The sampler state objects which sample from a specified mipmap level 18785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák * are created on-demand. */ 18855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 18955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* rasterizer state */ 19055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák memset(&rs_state, 0, sizeof(rs_state)); 1910bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell rs_state.cull_face = PIPE_FACE_NONE; 19255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák rs_state.gl_rasterization_rules = 1; 1931c75edf3e8ccc97f5f91f42f99c1f8db30b25fc4Corbin Simpson rs_state.flatshade = 1; 19455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->rs_state = pipe->create_rasterizer_state(pipe, &rs_state); 19555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 196ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger /* vertex elements state */ 197ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger memset(&velem[0], 0, sizeof(velem[0]) * 2); 198ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger for (i = 0; i < 2; i++) { 199ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].src_offset = i * 4 * sizeof(float); 200ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 201ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger } 202ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger ctx->velem_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]); 203ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger 20485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* fragment shaders are created on-demand */ 20585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 2065d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák /* vertex shader */ 20755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák { 20855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const uint semantic_names[] = { TGSI_SEMANTIC_POSITION, 20955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák TGSI_SEMANTIC_GENERIC }; 21055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const uint semantic_indices[] = { 0, 0 }; 2115d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák ctx->vs = 21255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák util_make_vertex_passthrough_shader(pipe, 2, semantic_names, 21355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák semantic_indices); 21455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 21555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 21655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set invariant vertex coordinates */ 21755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 21855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][0][3] = 1; /*v.w*/ 21955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 22055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* create the vertex buffer */ 2212a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák ctx->vbuf = pipe_user_buffer_create(ctx->base.pipe->screen, 2222a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák ctx->vertices, 2232a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák sizeof(ctx->vertices), 2242a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák PIPE_BIND_VERTEX_BUFFER); 22555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 2269b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák return &ctx->base; 22755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 22855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 22955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_destroy(struct blitter_context *blitter) 23055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 23155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 2329b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = blitter->pipe; 23355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 23455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 23555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_blend_state(pipe, ctx->blend_write_color); 23655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_blend_state(pipe, ctx->blend_keep_color); 23755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 23855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_depth_stencil_alpha_state(pipe, 23955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil); 2401a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 241a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 2426a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson 24355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_rasterizer_state(pipe, ctx->rs_state); 2445d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->delete_vs_state(pipe, ctx->vs); 245ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->delete_vertex_elements_state(pipe, ctx->velem_state); 24655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 247ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák for (i = 0; i < PIPE_MAX_TEXTURE_TYPES; i++) { 24885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_texfetch_col[i]) 24985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_texfetch_col[i]); 25085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_texfetch_depth[i]) 25185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_texfetch_depth[i]); 25255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 253ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 254b51f6e7c2350f637337fc3935436e2f99f669dfdJoakim Sindholt for (i = 0; i <= PIPE_MAX_COLOR_BUFS; i++) 25585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_col[i]) 25685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_col[i]); 25755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 258d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri for (i = 0; i < PIPE_MAX_TEXTURE_LEVELS * 2; i++) 25985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->sampler_state[i]) 26085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_sampler_state(pipe, ctx->sampler_state[i]); 261ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 262287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&ctx->vbuf, NULL); 26355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák FREE(ctx); 26455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 26555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 26655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_check_saved_CSOs(struct blitter_context_priv *ctx) 26755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 268ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák if (ctx->base.running) { 2699a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák _debug_printf("u_blitter: Caught recursion on save. " 2709a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák "This is a driver bug.\n"); 2719a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák } 272ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák ctx->base.running = TRUE; 2739a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák 27455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* make sure these CSOs have been saved */ 2759b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák assert(ctx->base.saved_blend_state != INVALID_PTR && 2769b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_dsa_state != INVALID_PTR && 2779b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_rs_state != INVALID_PTR && 2789b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fs != INVALID_PTR && 2799b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_vs != INVALID_PTR && 2809b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_velem_state != INVALID_PTR); 28155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 28255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 28355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_restore_CSOs(struct blitter_context_priv *ctx) 28455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 2859b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 2868f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák unsigned i; 28755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 28855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* restore the state objects which are always required to be saved */ 2899b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_rasterizer_state(pipe, ctx->base.saved_rs_state); 2909b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_vs_state(pipe, ctx->base.saved_vs); 2919b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_vertex_elements_state(pipe, ctx->base.saved_velem_state); 29255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 2939b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_rs_state = INVALID_PTR; 2949b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_vs = INVALID_PTR; 2959b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_velem_state = INVALID_PTR; 29655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 297363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák /* restore the state objects which are required to be saved for clear/copy 298363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák */ 299363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák if (ctx->base.saved_blend_state != INVALID_PTR) { 300363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák pipe->bind_blend_state(pipe, ctx->base.saved_blend_state); 301363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák ctx->base.saved_blend_state = INVALID_PTR; 302363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák } 303363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák if (ctx->base.saved_dsa_state != INVALID_PTR) { 304363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->base.saved_dsa_state); 305363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák ctx->base.saved_dsa_state = INVALID_PTR; 306363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák } 307363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák if (ctx->base.saved_fs != INVALID_PTR) { 308363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák pipe->bind_fs_state(pipe, ctx->base.saved_fs); 309363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák ctx->base.saved_fs = INVALID_PTR; 310363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák } 311363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák 3129b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_stencil_ref(pipe, &ctx->base.saved_stencil_ref); 3139b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_viewport_state(pipe, &ctx->base.saved_viewport); 3149b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_clip_state(pipe, &ctx->base.saved_clip); 315932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 3169b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák if (ctx->base.saved_fb_state.nr_cbufs != ~0) { 3179b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_framebuffer_state(pipe, &ctx->base.saved_fb_state); 318a922725118333e016a357008f37105c23c6f54bcMarek Olšák util_unreference_framebuffer_state(&ctx->base.saved_fb_state); 3199b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fb_state.nr_cbufs = ~0; 32055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 32155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3229b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák if (ctx->base.saved_num_sampler_states != ~0) { 32355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_fragment_sampler_states(pipe, 3249b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_states, 3259b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_sampler_states); 3269b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_states = ~0; 32755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 32855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3299b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák if (ctx->base.saved_num_sampler_views != ~0) { 330f6106566081978f663cf08e54bb8908cb58a5316Michal Krol pipe->set_fragment_sampler_views(pipe, 3319b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_views, 3329b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_sampler_views); 3330b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák 3349b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák for (i = 0; i < ctx->base.saved_num_sampler_views; i++) 3359b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe_sampler_view_reference(&ctx->base.saved_sampler_views[i], 3360b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák NULL); 3370b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák 3389b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_views = ~0; 33955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 34064aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri 3419b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák if (ctx->base.saved_num_vertex_buffers != ~0) { 34264aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri pipe->set_vertex_buffers(pipe, 3439b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_vertex_buffers, 3449b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_vertex_buffers); 3458f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák 3469b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák for (i = 0; i < ctx->base.saved_num_vertex_buffers; i++) { 3479b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák if (ctx->base.saved_vertex_buffers[i].buffer) { 3489b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe_resource_reference(&ctx->base.saved_vertex_buffers[i].buffer, 3498f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák NULL); 3508f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák } 3518f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák } 3529b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_vertex_buffers = ~0; 35364aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri } 3549a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák 355ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák if (!ctx->base.running) { 3569a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák _debug_printf("u_blitter: Caught recursion on restore. " 3579a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák "This is a driver bug.\n"); 3589a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák } 359ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák ctx->base.running = FALSE; 36055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 36155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 36255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_rectangle(struct blitter_context_priv *ctx, 36355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 36455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x2, unsigned y2, 36555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák float depth) 36655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 36755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 36855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 36955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set vertex positions */ 3703bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[0][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v0.x*/ 3713bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[0][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v0.y*/ 37255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3733bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[1][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v1.x*/ 3743bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[1][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v1.y*/ 37555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3763bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[2][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v2.x*/ 3773bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[2][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v2.y*/ 37855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3793bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[3][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v3.x*/ 3803bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[3][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v3.y*/ 38155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 38255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 38355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][0][2] = depth; /*z*/ 384932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 385932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* viewport */ 3863bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.scale[0] = 0.5f * ctx->dst_width; 3873bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.scale[1] = 0.5f * ctx->dst_height; 388ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák ctx->viewport.scale[2] = 1.0f; 389932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->viewport.scale[3] = 1.0f; 3903bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.translate[0] = 0.5f * ctx->dst_width; 3913bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.translate[1] = 0.5f * ctx->dst_height; 392ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák ctx->viewport.translate[2] = 0.0f; 393932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->viewport.translate[3] = 0.0f; 3949b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.pipe->set_viewport_state(ctx->base.pipe, &ctx->viewport); 395932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 396932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* clip */ 3979b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.pipe->set_clip_state(ctx->base.pipe, &ctx->clip); 39855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 39955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 40055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_clear_color(struct blitter_context_priv *ctx, 4016dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color) 40255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 40355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 40455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 4056dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie if (color) { 40616d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák for (i = 0; i < 4; i++) { 4076dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie ctx->vertices[i][1][0] = color->f[0]; 4086dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie ctx->vertices[i][1][1] = color->f[1]; 4096dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie ctx->vertices[i][1][2] = color->f[2]; 4106dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie ctx->vertices[i][1][3] = color->f[3]; 41116d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák } 412fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák } else { 41316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák for (i = 0; i < 4; i++) { 41416d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][0] = 0; 41516d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][1] = 0; 41616d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][2] = 0; 41716d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][3] = 0; 41816d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák } 41955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 42055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 42155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 422d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieristatic void get_texcoords(struct pipe_resource *src, 4234c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned level, 4244c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned x1, unsigned y1, 4254c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned x2, unsigned y2, 4264c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger boolean normalized, float out[4]) 427749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{ 428d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri if(normalized) 429d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri { 4304c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger out[0] = x1 / (float)u_minify(src->width0, level); 4314c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger out[1] = y1 / (float)u_minify(src->height0, level); 4324c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger out[2] = x2 / (float)u_minify(src->width0, level); 4334c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger out[3] = y2 / (float)u_minify(src->height0, level); 434d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri } 435d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri else 436d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri { 437d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[0] = x1; 438d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[1] = y1; 439d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[2] = x2; 440d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[3] = y2; 441d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri } 442749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák} 443749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák 444749e24521a31178d2b647aa2954c3eecd597b799Marek Olšákstatic void set_texcoords_in_vertices(const float coord[4], 445749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák float *out, unsigned stride) 446749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{ 447749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[0]; /*t0.s*/ 448749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[1]; /*t0.t*/ 449749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out += stride; 450749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[2]; /*t1.s*/ 451749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[1]; /*t1.t*/ 452749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out += stride; 453749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[2]; /*t2.s*/ 454749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[3]; /*t2.t*/ 455749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out += stride; 456749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[0]; /*t3.s*/ 457749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[3]; /*t3.t*/ 458749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák} 459749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák 46055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_2d(struct blitter_context_priv *ctx, 461876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *src, 4624c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned level, 46355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 46455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x2, unsigned y2) 46555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 466749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák unsigned i; 467749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák float coord[4]; 46855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 4694c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger get_texcoords(src, level, x1, y1, x2, y2, TRUE, coord); 470749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák set_texcoords_in_vertices(coord, &ctx->vertices[0][1][0], 8); 47155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 47255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) { 47355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][1][2] = 0; /*r*/ 47455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][1][3] = 1; /*q*/ 47555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 47655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 47755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 47855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_3d(struct blitter_context_priv *ctx, 479876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *src, 4804c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned level, 481876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned zslice, 48255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 483274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák unsigned x2, unsigned y2, 484274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák boolean normalized) 48555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 48655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 487274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák float r = normalized ? zslice / (float)u_minify(src->depth0, level) : zslice; 48855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 4894c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger blitter_set_texcoords_2d(ctx, src, level, x1, y1, x2, y2); 49055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 49155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 49255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][1][2] = r; /*r*/ 49355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 49455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 495274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšákstatic void blitter_set_texcoords_1d_array(struct blitter_context_priv *ctx, 496274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák struct pipe_resource *src, 497274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák unsigned level, 498274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák unsigned zslice, 499274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák unsigned x1, unsigned x2) 500274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák{ 501274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák int i; 502274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák float r = zslice; 503274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák 504274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák blitter_set_texcoords_2d(ctx, src, level, x1, 0, x2, 0); 505274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák 506274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák for (i = 0; i < 4; i++) 507274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák ctx->vertices[i][1][1] = r; /*r*/ 508274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák} 509274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák 51055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_cube(struct blitter_context_priv *ctx, 511876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *src, 5124c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned level, unsigned face, 51355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 51455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x2, unsigned y2) 51555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 51655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 517749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák float coord[4]; 518d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul float st[4][2]; 519d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul 5204c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger get_texcoords(src, level, x1, y1, x2, y2, TRUE, coord); 521749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák set_texcoords_in_vertices(coord, &st[0][0], 2); 52255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 5234c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger util_map_texcoords2d_onto_cubemap(face, 52455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* pointer, stride in floats */ 52555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák &st[0][0], 2, 52655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák &ctx->vertices[0][1][0], 8); 52755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 52855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 52955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][1][3] = 1; /*q*/ 53055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 53155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 5323bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákstatic void blitter_set_dst_dimensions(struct blitter_context_priv *ctx, 5333bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák unsigned width, unsigned height) 5343bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák{ 5353bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->dst_width = width; 5363bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->dst_height = height; 5373bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák} 5383bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák 53985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 54085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid **blitter_get_sampler_state(struct blitter_context_priv *ctx, 541d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri int miplevel, boolean normalized) 54285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 5439b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 54485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák struct pipe_sampler_state *sampler_state = &ctx->template_sampler_state; 54585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 54685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(miplevel < PIPE_MAX_TEXTURE_LEVELS); 54785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 54885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Create the sampler state on-demand. */ 549d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri if (!ctx->sampler_state[miplevel * 2 + normalized]) { 55085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->lod_bias = miplevel; 55185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->min_lod = miplevel; 55285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->max_lod = miplevel; 553d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri sampler_state->normalized_coords = normalized; 55485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 555d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri ctx->sampler_state[miplevel * 2 + normalized] = pipe->create_sampler_state(pipe, 55685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state); 55785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák } 55885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 55985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Return void** so that it can be passed to bind_fragment_sampler_states 56085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák * directly. */ 561d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri return &ctx->sampler_state[miplevel * 2 + normalized]; 56285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 56385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 56485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 56585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_col(struct blitter_context_priv *ctx, unsigned num_cbufs) 56685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 5679b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 56885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 56985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(num_cbufs <= PIPE_MAX_COLOR_BUFS); 57085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 571677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas if (!ctx->fs_col[num_cbufs]) 572677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas ctx->fs_col[num_cbufs] = 5735d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák util_make_fragment_cloneinput_shader(pipe, num_cbufs, 5745d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák TGSI_SEMANTIC_GENERIC, 5755d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák TGSI_INTERPOLATE_LINEAR); 57685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 577677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas return ctx->fs_col[num_cbufs]; 57885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 57985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 580d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul/** Convert PIPE_TEXTURE_x to TGSI_TEXTURE_x */ 581d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paulstatic unsigned 5823bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákpipe_tex_to_tgsi_tex(enum pipe_texture_target pipe_tex_target) 583d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul{ 584d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul switch (pipe_tex_target) { 585d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul case PIPE_TEXTURE_1D: 586d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_1D; 587d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul case PIPE_TEXTURE_2D: 588d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_2D; 589ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri case PIPE_TEXTURE_RECT: 590cbe367227959a32ff20e146106162a81d2be02c3Luca Barbieri return TGSI_TEXTURE_RECT; 591d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul case PIPE_TEXTURE_3D: 592d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_3D; 593d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul case PIPE_TEXTURE_CUBE: 594d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_CUBE; 595274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák case PIPE_TEXTURE_1D_ARRAY: 596274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák return TGSI_TEXTURE_1D_ARRAY; 597274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák case PIPE_TEXTURE_2D_ARRAY: 598274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák return TGSI_TEXTURE_2D_ARRAY; 599d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul default: 600d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul assert(0 && "unexpected texture target"); 601d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_UNKNOWN; 602d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul } 603d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul} 604d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 605d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 60685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 60785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_col(struct blitter_context_priv *ctx, 60885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák unsigned tex_target) 60985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 6109b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 61185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 61285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(tex_target < PIPE_MAX_TEXTURE_TYPES); 61385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 61485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Create the fragment shader on-demand. */ 61585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (!ctx->fs_texfetch_col[tex_target]) { 616d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target); 617d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 618d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul ctx->fs_texfetch_col[tex_target] = 619d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul util_make_fragment_tex_shader(pipe, tgsi_tex, TGSI_INTERPOLATE_LINEAR); 62085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák } 62185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 62285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák return ctx->fs_texfetch_col[tex_target]; 62385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 62485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 62585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 62685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_depth(struct blitter_context_priv *ctx, 62785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák unsigned tex_target) 62885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 6299b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 63085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 63185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(tex_target < PIPE_MAX_TEXTURE_TYPES); 63285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 63385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Create the fragment shader on-demand. */ 63485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (!ctx->fs_texfetch_depth[tex_target]) { 635d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target); 636d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 637d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul ctx->fs_texfetch_depth[tex_target] = 638d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul util_make_fragment_tex_shader_writedepth(pipe, tgsi_tex, 639d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul TGSI_INTERPOLATE_LINEAR); 64085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák } 64185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 64285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák return ctx->fs_texfetch_depth[tex_target]; 64385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 64485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 6459be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter, 6469be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned x1, unsigned y1, 6479be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned x2, unsigned y2, 6489be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák float depth, 6499be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák enum blitter_attrib_type type, 6506dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *attrib) 6519be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák{ 6529be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 6539be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 6549be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák switch (type) { 6559be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák case UTIL_BLITTER_ATTRIB_COLOR: 6569be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_clear_color(ctx, attrib); 6579be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák break; 6589be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 6599be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák case UTIL_BLITTER_ATTRIB_TEXCOORD: 6606dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie set_texcoords_in_vertices(attrib->f, &ctx->vertices[0][1][0], 8); 6619be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák break; 6629be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 6639be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák default:; 6649be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák } 6659be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 6669be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_rectangle(ctx, x1, y1, x2, y2, depth); 667588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák ctx->base.pipe->redefine_user_buffer(ctx->base.pipe, ctx->vbuf, 668588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák 0, ctx->vbuf->width0); 669d5062fb3a315c46d77d5c954a3e3c14be1907d33Marek Olšák util_draw_vertex_buffer(ctx->base.pipe, NULL, ctx->vbuf, 0, 6702a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák PIPE_PRIM_TRIANGLE_FAN, 4, 2); 6719be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák} 6729be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 673db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákstatic void util_blitter_clear_custom(struct blitter_context *blitter, 674db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned width, unsigned height, 675db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned num_cbufs, 676db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned clear_buffers, 6776dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color, 678db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák double depth, unsigned stencil, 679db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák void *custom_blend, void *custom_dsa) 68055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 68155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 6829b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 6836a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson struct pipe_stencil_ref sr = { { 0 } }; 68455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 685ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák assert(num_cbufs <= PIPE_MAX_COLOR_BUFS); 68655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 68755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_check_saved_CSOs(ctx); 68855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 68955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* bind CSOs */ 690db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák if (custom_blend) { 691db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák pipe->bind_blend_state(pipe, custom_blend); 692db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if (clear_buffers & PIPE_CLEAR_COLOR) { 69355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 694db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else { 69555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_keep_color); 696db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } 69755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 698db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák if (custom_dsa) { 699db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, custom_dsa); 700db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if ((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) { 7011a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 702db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if (clear_buffers & PIPE_CLEAR_DEPTH) { 703a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil); 704db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if (clear_buffers & PIPE_CLEAR_STENCIL) { 705a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 706db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else { 70755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 708db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } 709db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 710db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák sr.ref_value[0] = stencil & 0xff; 711db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák pipe->set_stencil_ref(pipe, &sr); 71255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 71355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 714ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 71585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, num_cbufs)); 7165d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 71755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 7183bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák blitter_set_dst_dimensions(ctx, width, height); 7199be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, 0, 0, width, height, depth, 7206dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie UTIL_BLITTER_ATTRIB_COLOR, color); 72155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_restore_CSOs(ctx); 72255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 72355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 724db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid util_blitter_clear(struct blitter_context *blitter, 725db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned width, unsigned height, 726db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned num_cbufs, 727db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned clear_buffers, 7286dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color, 729db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák double depth, unsigned stencil) 730db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák{ 731db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák util_blitter_clear_custom(blitter, width, height, num_cbufs, 7326dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie clear_buffers, color, depth, stencil, 733db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák NULL, NULL); 734db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák} 735db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 736db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid util_blitter_clear_depth_custom(struct blitter_context *blitter, 737db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned width, unsigned height, 738db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák double depth, void *custom_dsa) 739db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák{ 7406dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie static const union pipe_color_union color; 741db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák util_blitter_clear_custom(blitter, width, height, 0, 7426dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie 0, &color, depth, 0, NULL, custom_dsa); 743db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák} 744db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 745876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákstatic 746876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákboolean is_overlap(unsigned sx1, unsigned sx2, unsigned sy1, unsigned sy2, 747876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned dx1, unsigned dx2, unsigned dy1, unsigned dy2) 748deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie{ 749876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return sx1 < dx2 && sx2 > dx1 && sy1 < dy2 && sy2 > dy1; 750deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie} 751deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie 752233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšákvoid util_blitter_copy_texture(struct blitter_context *blitter, 753233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák struct pipe_resource *dst, 754233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák unsigned dstlevel, 755233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák unsigned dstx, unsigned dsty, unsigned dstz, 756233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák struct pipe_resource *src, 757233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák unsigned srclevel, 758233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák const struct pipe_box *srcbox, 759233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák boolean ignore_stencil) 76055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 76155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 7629b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 763876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_screen *screen = pipe->screen; 7644c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger struct pipe_surface *dstsurf, surf_templ; 76555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct pipe_framebuffer_state fb_state; 766f6106566081978f663cf08e54bb8908cb58a5316Michal Krol struct pipe_sampler_view viewTempl, *view; 767876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned bind; 7684c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned width = srcbox->width; 7694c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned height = srcbox->height; 770876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák boolean is_stencil, is_depth; 771d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri boolean normalized; 772876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 773876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Give up if textures are not set. */ 774876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák assert(dst && src); 775876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák if (!dst || !src) 776876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return; 777876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 778876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Sanity checks. */ 779876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák if (dst == src) { 7804c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger assert(!is_overlap(srcbox->x, srcbox->x + width, srcbox->y, srcbox->y + height, 781876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák dstx, dstx + width, dsty, dsty + height)); 782876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák } 783876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák assert(src->target < PIPE_MAX_TEXTURE_TYPES); 7844c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger /* XXX should handle 3d regions */ 7854c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger assert(srcbox->depth == 1); 786876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 787876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Is this a ZS format? */ 788876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák is_depth = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 0) != 0; 789876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák is_stencil = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 1) != 0; 790876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 791876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák if (is_depth || is_stencil) 792876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák bind = PIPE_BIND_DEPTH_STENCIL; 793876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák else 794876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák bind = PIPE_BIND_RENDER_TARGET; 795876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 796876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Check if we can sample from and render to the surfaces. */ 797876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* (assuming copying a stencil buffer is not possible) */ 798cec2082ae515bc91e6b29084ba4b8deac28ef923Stéphane Marchesin if ((!ignore_stencil && is_stencil) || 799876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák !screen->is_format_supported(screen, dst->format, dst->target, 800e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák dst->nr_samples, bind) || 801876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák !screen->is_format_supported(screen, src->format, src->target, 802e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák src->nr_samples, PIPE_BIND_SAMPLER_VIEW)) { 803ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák ctx->base.running = TRUE; 8044c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger util_resource_copy_region(pipe, dst, dstlevel, dstx, dsty, dstz, 8054c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger src, srclevel, srcbox); 806ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák ctx->base.running = FALSE; 807876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return; 808876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák } 809876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 8104c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger /* Get surface. */ 8114c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger memset(&surf_templ, 0, sizeof(surf_templ)); 8124c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger u_surface_default_template(&surf_templ, dst, bind); 813ab21147c899ba1506df38438b6750d3dc5eaabdfHenri Verbeet surf_templ.format = util_format_linear(dst->format); 8144c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surf_templ.u.tex.level = dstlevel; 8154c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surf_templ.u.tex.first_layer = dstz; 8164c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surf_templ.u.tex.last_layer = dstz; 8174c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger dstsurf = pipe->create_surface(pipe, dst, &surf_templ); 81855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 819876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Check whether the states are properly saved. */ 820876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_check_saved_CSOs(ctx); 82155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák assert(blitter->saved_fb_state.nr_cbufs != ~0); 822f6106566081978f663cf08e54bb8908cb58a5316Michal Krol assert(blitter->saved_num_sampler_views != ~0); 82355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák assert(blitter->saved_num_sampler_states != ~0); 82455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 825876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Initialize framebuffer state. */ 826876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák fb_state.width = dstsurf->width; 827876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák fb_state.height = dstsurf->height; 82855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 82955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák if (is_depth) { 83055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_keep_color); 83155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, 83255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil); 83385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, 834876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_get_fs_texfetch_depth(ctx, src->target)); 83555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 83655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 0; 837876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák fb_state.zsbuf = dstsurf; 83855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } else { 83955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 84055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 84185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, 842876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_get_fs_texfetch_col(ctx, src->target)); 84355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 84455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 1; 845876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák fb_state.cbufs[0] = dstsurf; 84655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.zsbuf = 0; 84755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 84885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 849d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri normalized = src->target != PIPE_TEXTURE_RECT; 850d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri 851876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Initialize sampler view. */ 852ab21147c899ba1506df38438b6750d3dc5eaabdfHenri Verbeet u_sampler_view_default_template(&viewTempl, src, util_format_linear(src->format)); 853876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák view = pipe->create_sampler_view(pipe, src, &viewTempl); 854f6106566081978f663cf08e54bb8908cb58a5316Michal Krol 855876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Set rasterizer state, shaders, and textures. */ 85655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 8575d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 85885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fragment_sampler_states(pipe, 1, 8594c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger blitter_get_sampler_state(ctx, srclevel, normalized)); 860ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 861f6106566081978f663cf08e54bb8908cb58a5316Michal Krol pipe->set_fragment_sampler_views(pipe, 1, &view); 86255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 86355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 8649be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 8659be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 866876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák switch (src->target) { 8679be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw the quad with the draw_rectangle callback. */ 86855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák case PIPE_TEXTURE_1D: 86955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák case PIPE_TEXTURE_2D: 870ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri case PIPE_TEXTURE_RECT: 8719be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák { 8726dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie /* Set texture coordinates. - use a pipe color union 8736dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie * for interface purposes 8746dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie */ 8756dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie union pipe_color_union coord; 8764c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger get_texcoords(src, srclevel, srcbox->x, srcbox->y, 8776dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie srcbox->x+width, srcbox->y+height, normalized, coord.f); 8789be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 8799be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw. */ 8809be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0, 8816dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie UTIL_BLITTER_ATTRIB_TEXCOORD, &coord); 8829be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák } 88355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák break; 8849be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 8859be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw the quad with the generic codepath. */ 886274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák default: 8879be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Set texture coordinates. */ 888274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák switch (src->target) { 889274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák case PIPE_TEXTURE_1D_ARRAY: 890274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák blitter_set_texcoords_1d_array(ctx, src, srclevel, srcbox->y, 891274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák srcbox->x, srcbox->x + width); 892274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák break; 893274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák 894274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák case PIPE_TEXTURE_2D_ARRAY: 895274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák case PIPE_TEXTURE_3D: 8964c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger blitter_set_texcoords_3d(ctx, src, srclevel, srcbox->z, 8974c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger srcbox->x, srcbox->y, 898274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák srcbox->x + width, srcbox->y + height, 899274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák src->target == PIPE_TEXTURE_3D); 900274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák break; 901274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák 902274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák case PIPE_TEXTURE_CUBE: 9034c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger blitter_set_texcoords_cube(ctx, src, srclevel, srcbox->z, 9044c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger srcbox->x, srcbox->y, 9054c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger srcbox->x + width, srcbox->y + height); 906274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák break; 907274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák 908274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák default: 909274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák assert(0); 910274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák } 9119be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 9129be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw. */ 9139be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_rectangle(ctx, dstx, dsty, dstx+width, dsty+height, 0); 914588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák ctx->base.pipe->redefine_user_buffer(ctx->base.pipe, ctx->vbuf, 915588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák 0, ctx->vbuf->width0); 916d5062fb3a315c46d77d5c954a3e3c14be1907d33Marek Olšák util_draw_vertex_buffer(ctx->base.pipe, NULL, ctx->vbuf, 0, 9172a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák PIPE_PRIM_TRIANGLE_FAN, 4, 2); 91855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák break; 91955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 92055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 92155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_restore_CSOs(ctx); 922876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 923876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák pipe_surface_reference(&dstsurf, NULL); 92457c3f70018bc7cd44eafd55d8147691a3c109b91Marek Olšák pipe_sampler_view_reference(&view, NULL); 92555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 92655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 927a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a color surface to a constant value. */ 928a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_render_target(struct blitter_context *blitter, 929a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger struct pipe_surface *dstsurf, 9306dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color, 931a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned dstx, unsigned dsty, 932a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned width, unsigned height) 93355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 93455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 9359b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 93655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct pipe_framebuffer_state fb_state; 93755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 938a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger assert(dstsurf->texture); 939a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if (!dstsurf->texture) 94055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák return; 94155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 94255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* check the saved state */ 94355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_check_saved_CSOs(ctx); 94455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák assert(blitter->saved_fb_state.nr_cbufs != ~0); 94555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 94655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* bind CSOs */ 94755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 94855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 94955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 95085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1)); 9515d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 952ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 95355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 95455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set a framebuffer state */ 95559e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.width = dstsurf->width; 95659e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.height = dstsurf->height; 95755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 1; 95859e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.cbufs[0] = dstsurf; 95955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.zsbuf = 0; 96055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 96155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 9623bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 9639be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0, 9646dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie UTIL_BLITTER_ATTRIB_COLOR, color); 96555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_restore_CSOs(ctx); 966a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger} 96759e51d9640c242a7c919472d935a91889c7840c9Marek Olšák 968a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a depth stencil surface. */ 969a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_depth_stencil(struct blitter_context *blitter, 970a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger struct pipe_surface *dstsurf, 971a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned clear_flags, 972a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger double depth, 973a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned stencil, 974a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned dstx, unsigned dsty, 975a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned width, unsigned height) 976a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger{ 977a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 9789b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 979a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct pipe_framebuffer_state fb_state; 980a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct pipe_stencil_ref sr = { { 0 } }; 981a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 982a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger assert(dstsurf->texture); 983a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if (!dstsurf->texture) 984a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger return; 985a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 986a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* check the saved state */ 987a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger blitter_check_saved_CSOs(ctx); 988a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger assert(blitter->saved_fb_state.nr_cbufs != ~0); 989a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 990a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* bind CSOs */ 991a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_blend_state(pipe, ctx->blend_keep_color); 992a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if ((clear_flags & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) { 993a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger sr.ref_value[0] = stencil & 0xff; 994a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 995a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_stencil_ref(pipe, &sr); 996a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 997a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else if (clear_flags & PIPE_CLEAR_DEPTH) { 998a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil); 999a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 1000a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else if (clear_flags & PIPE_CLEAR_STENCIL) { 1001a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger sr.ref_value[0] = stencil & 0xff; 1002a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 1003a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_stencil_ref(pipe, &sr); 1004a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 1005a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else 1006a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* hmm that should be illegal probably, or make it a no-op somewhere */ 1007a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 1008a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 1009a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_rasterizer_state(pipe, ctx->rs_state); 1010a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0)); 10115d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 1012a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 1013a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 1014a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* set a framebuffer state */ 1015a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.width = dstsurf->width; 1016a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.height = dstsurf->height; 1017a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.nr_cbufs = 0; 1018a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.cbufs[0] = 0; 1019a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.zsbuf = dstsurf; 1020a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_framebuffer_state(pipe, &fb_state); 1021a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 10223bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 10239be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, depth, 10249be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák UTIL_BLITTER_ATTRIB_NONE, NULL); 1025a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger blitter_restore_CSOs(ctx); 102655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 1027f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1028c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie/* draw a rectangle across a region using a custom dsa stage - for r600g */ 1029c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlievoid util_blitter_custom_depth_stencil(struct blitter_context *blitter, 1030c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie struct pipe_surface *zsurf, 1031c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie struct pipe_surface *cbsurf, 1032c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie void *dsa_stage, float depth) 1033f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák{ 1034f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 1035f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák struct pipe_context *pipe = ctx->base.pipe; 1036f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák struct pipe_framebuffer_state fb_state; 1037f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1038c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie assert(zsurf->texture); 1039c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie if (!zsurf->texture) 1040f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák return; 1041f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1042f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák /* check the saved state */ 1043f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák blitter_check_saved_CSOs(ctx); 1044f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák assert(blitter->saved_fb_state.nr_cbufs != ~0); 1045f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1046f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák /* bind CSOs */ 1047c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie pipe->bind_blend_state(pipe, ctx->blend_write_color); 1048c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie pipe->bind_depth_stencil_alpha_state(pipe, dsa_stage); 1049f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1050f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 1051f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0)); 10525d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 1053f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 1054f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1055f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák /* set a framebuffer state */ 1056c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.width = zsurf->width; 1057c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.height = zsurf->height; 1058c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.nr_cbufs = 1; 1059c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie if (cbsurf) { 1060c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.cbufs[0] = cbsurf; 1061c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.nr_cbufs = 1; 1062c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie } else { 1063c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.cbufs[0] = NULL; 1064c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.nr_cbufs = 0; 1065c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie } 1066c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.zsbuf = zsurf; 1067f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 1068f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1069c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie blitter_set_dst_dimensions(ctx, zsurf->width, zsurf->height); 1070c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie blitter->draw_rectangle(blitter, 0, 0, zsurf->width, zsurf->height, depth, 1071f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák UTIL_BLITTER_ATTRIB_NONE, NULL); 1072f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák blitter_restore_CSOs(ctx); 1073f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák} 1074