u_blitter.c revision a3d9d7ec79d6f7205fab2324e47d8ea185431de0
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" 50900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák#include "util/u_upload_mgr.h" 5155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 52a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák#define INVALID_PTR ((void*)~0) 53a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák 5455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context_priv 5555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 569b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct blitter_context base; 5755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 58900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák struct u_upload_mgr *upload; 5955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 6055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák float vertices[4][2][4]; /**< {pos, color} or {pos, texcoord} */ 6155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 6285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Templates for various state objects. */ 6385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 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.*/ 6736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák void *vs_pos_only; /**< Vertex shader which passes pos to the output.*/ 6855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 6955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Fragment shaders. */ 70677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas /* The shader at index i outputs color to color buffers 0,1,...,i-1. */ 71677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas void *fs_col[PIPE_MAX_COLOR_BUFS+1]; 724e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie void *fs_col_int[PIPE_MAX_COLOR_BUFS+1]; 73ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 74ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák /* FS which outputs a color from a texture, 75ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák where the index is PIPE_TEXTURE_* to be sampled. */ 76ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák void *fs_texfetch_col[PIPE_MAX_TEXTURE_TYPES]; 77ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 78ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák /* FS which outputs a depth from a texture, 79ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák where the index is PIPE_TEXTURE_* to be sampled. */ 80ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák void *fs_texfetch_depth[PIPE_MAX_TEXTURE_TYPES]; 8112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák void *fs_texfetch_depthstencil[PIPE_MAX_TEXTURE_TYPES]; 82bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák void *fs_texfetch_stencil[PIPE_MAX_TEXTURE_TYPES]; 8355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 84825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák /* FS which outputs one sample from a multisample texture. */ 85825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák void *fs_texfetch_col_msaa[PIPE_MAX_TEXTURE_TYPES]; 86825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák void *fs_texfetch_depth_msaa[PIPE_MAX_TEXTURE_TYPES]; 87825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák void *fs_texfetch_depthstencil_msaa[PIPE_MAX_TEXTURE_TYPES]; 88825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák void *fs_texfetch_stencil_msaa[PIPE_MAX_TEXTURE_TYPES]; 89825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 9055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Blend state. */ 9155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *blend_write_color; /**< blend state with writemask of RGBA */ 9255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *blend_keep_color; /**< blend state with writemask of 0 */ 9355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 9455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Depth stencil alpha state. */ 951a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger void *dsa_write_depth_stencil; 9655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *dsa_write_depth_keep_stencil; 9755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *dsa_keep_depth_stencil; 98a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger void *dsa_keep_depth_write_stencil; 9955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 10036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák /* Vertex elements states. */ 101ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger void *velem_state; 1024e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie void *velem_uint_state; 1034e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie void *velem_sint_state; 10436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák void *velem_state_readbuf; 105ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger 10637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák /* Sampler state. */ 10737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák void *sampler_state; 108ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 109ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák /* Rasterizer state. */ 110ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák void *rs_state; 11136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák void *rs_discard_state; 112f6106566081978f663cf08e54bb8908cb58a5316Michal Krol 113932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* Viewport state. */ 114932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol struct pipe_viewport_state viewport; 115932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 1163bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák /* Destination surface dimensions. */ 1173bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák unsigned dst_width; 1183bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák unsigned dst_height; 1194c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák 1204c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák boolean has_geometry_shader; 121dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie boolean vertex_has_integers; 122b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák boolean has_stream_out; 12312fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák boolean has_stencil_export; 12455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}; 12555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1269be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter, 1279be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned x, unsigned y, 1289be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned width, unsigned height, 1299be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák float depth, 1309be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák enum blitter_attrib_type type, 1316dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *attrib); 1329be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 1339be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 13455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context *util_blitter_create(struct pipe_context *pipe) 13555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 13655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx; 1370c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul struct pipe_blend_state blend; 1380c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul struct pipe_depth_stencil_alpha_state dsa; 1390c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul struct pipe_rasterizer_state rs_state; 14037b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák struct pipe_sampler_state sampler_state; 141ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger struct pipe_vertex_element velem[2]; 14285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák unsigned i; 14355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 14455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx = CALLOC_STRUCT(blitter_context_priv); 14555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák if (!ctx) 14655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák return NULL; 14755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1489b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.pipe = pipe; 1499be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák ctx->base.draw_rectangle = blitter_draw_rectangle; 15055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 15155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* init state objects for them to be considered invalid */ 1529b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_blend_state = INVALID_PTR; 1539b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_dsa_state = INVALID_PTR; 1549b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_rs_state = INVALID_PTR; 1559b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fs = INVALID_PTR; 1569b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_vs = INVALID_PTR; 1574c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák ctx->base.saved_gs = INVALID_PTR; 1589b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_velem_state = INVALID_PTR; 1599b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fb_state.nr_cbufs = ~0; 1609b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_views = ~0; 1619b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_states = ~0; 1629b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_vertex_buffers = ~0; 163b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák ctx->base.saved_num_so_targets = ~0; 16455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1654c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák ctx->has_geometry_shader = 1664c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák pipe->screen->get_shader_param(pipe->screen, PIPE_SHADER_GEOMETRY, 1674c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0; 168dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie ctx->vertex_has_integers = 1690f55f133f1e5b72e463441d2d388a1ec4deac1daMarek Olšák pipe->screen->get_shader_param(pipe->screen, PIPE_SHADER_VERTEX, 170dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie PIPE_SHADER_CAP_INTEGERS); 171b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák ctx->has_stream_out = 172b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák pipe->screen->get_param(pipe->screen, 173b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS) != 0; 1744c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák 17512fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák ctx->has_stencil_export = 17612fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák pipe->screen->get_param(pipe->screen, 17712fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák PIPE_CAP_SHADER_STENCIL_EXPORT); 17812fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 17955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* blend state objects */ 1800c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul memset(&blend, 0, sizeof(blend)); 18155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->blend_keep_color = pipe->create_blend_state(pipe, &blend); 18255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 183eba1e2a44718bea398e49d496a78ee002c9922b8Roland Scheidegger blend.rt[0].colormask = PIPE_MASK_RGBA; 18455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->blend_write_color = pipe->create_blend_state(pipe, &blend); 18555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 18655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* depth stencil alpha state objects */ 1870c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul memset(&dsa, 0, sizeof(dsa)); 18855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_keep_depth_stencil = 1891a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 19055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 191f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák dsa.depth.enabled = 1; 192f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák dsa.depth.writemask = 1; 193f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák dsa.depth.func = PIPE_FUNC_ALWAYS; 19455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil = 1951a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 1961a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger 1971a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].enabled = 1; 1981a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].func = PIPE_FUNC_ALWAYS; 1991a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE; 2001a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE; 2011a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE; 2021a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].valuemask = 0xff; 2031a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].writemask = 0xff; 2041a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger ctx->dsa_write_depth_stencil = 2051a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 206a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 207a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger dsa.depth.enabled = 0; 208a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger dsa.depth.writemask = 0; 209a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger ctx->dsa_keep_depth_write_stencil = 210a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 21155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 21255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* sampler state */ 21337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák memset(&sampler_state, 0, sizeof(sampler_state)); 21437b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák sampler_state.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 21537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák sampler_state.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 21637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák sampler_state.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 21737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák sampler_state.normalized_coords = 1; 21837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák ctx->sampler_state = pipe->create_sampler_state(pipe, &sampler_state); 21955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 22055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* rasterizer state */ 22155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák memset(&rs_state, 0, sizeof(rs_state)); 2220bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell rs_state.cull_face = PIPE_FACE_NONE; 22355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák rs_state.gl_rasterization_rules = 1; 2241c75edf3e8ccc97f5f91f42f99c1f8db30b25fc4Corbin Simpson rs_state.flatshade = 1; 225dc4c821f0817a3db716f965692fb701079f66340Marek Olšák rs_state.depth_clip = 1; 22655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->rs_state = pipe->create_rasterizer_state(pipe, &rs_state); 22755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 22836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák if (ctx->has_stream_out) { 22936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák rs_state.rasterizer_discard = 1; 23036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák ctx->rs_discard_state = pipe->create_rasterizer_state(pipe, &rs_state); 23136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák } 23236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 23336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák /* vertex elements states */ 234ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger memset(&velem[0], 0, sizeof(velem[0]) * 2); 235ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger for (i = 0; i < 2; i++) { 236ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].src_offset = i * 4 * sizeof(float); 237ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 238ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger } 239ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger ctx->velem_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]); 240ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger 241dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie if (ctx->vertex_has_integers) { 242dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie memset(&velem[0], 0, sizeof(velem[0]) * 2); 2439e66b25880febecb529582c6ead920637d73f51eDave Airlie velem[0].src_offset = 0; 2449e66b25880febecb529582c6ead920637d73f51eDave Airlie velem[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 2459e66b25880febecb529582c6ead920637d73f51eDave Airlie velem[1].src_offset = 4 * sizeof(float); 2469e66b25880febecb529582c6ead920637d73f51eDave Airlie velem[1].src_format = PIPE_FORMAT_R32G32B32A32_SINT; 247dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie ctx->velem_sint_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]); 248dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie 249dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie memset(&velem[0], 0, sizeof(velem[0]) * 2); 2509e66b25880febecb529582c6ead920637d73f51eDave Airlie velem[0].src_offset = 0; 2519e66b25880febecb529582c6ead920637d73f51eDave Airlie velem[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 2529e66b25880febecb529582c6ead920637d73f51eDave Airlie velem[1].src_offset = 4 * sizeof(float); 2539e66b25880febecb529582c6ead920637d73f51eDave Airlie velem[1].src_format = PIPE_FORMAT_R32G32B32A32_UINT; 254dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie ctx->velem_uint_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]); 2554e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie } 256dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie 25736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák if (ctx->has_stream_out) { 258a0a9e56cfed1ab81c1068cffbfd9299f77c7e187Marek Olšák velem[0].src_format = PIPE_FORMAT_R32_UINT; 25936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák ctx->velem_state_readbuf = pipe->create_vertex_elements_state(pipe, 1, &velem[0]); 26036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák } 26136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 26285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* fragment shaders are created on-demand */ 26385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 26436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák /* vertex shaders */ 26555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák { 26655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const uint semantic_names[] = { TGSI_SEMANTIC_POSITION, 26755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák TGSI_SEMANTIC_GENERIC }; 26855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const uint semantic_indices[] = { 0, 0 }; 2695d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák ctx->vs = 27055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák util_make_vertex_passthrough_shader(pipe, 2, semantic_names, 27155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák semantic_indices); 27255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 27336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák if (ctx->has_stream_out) { 27436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct pipe_stream_output_info so; 27536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák const uint semantic_names[] = { TGSI_SEMANTIC_POSITION }; 27636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák const uint semantic_indices[] = { 0 }; 27736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 27836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák memset(&so, 0, sizeof(so)); 27936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák so.num_outputs = 1; 280a0a9e56cfed1ab81c1068cffbfd9299f77c7e187Marek Olšák so.output[0].num_components = 1; 281a0a9e56cfed1ab81c1068cffbfd9299f77c7e187Marek Olšák so.stride[0] = 1; 28236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 28336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák ctx->vs_pos_only = 28436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák util_make_vertex_passthrough_shader_with_so(pipe, 1, semantic_names, 28536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák semantic_indices, &so); 28636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák } 28755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 28855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set invariant vertex coordinates */ 28955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 29055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][0][3] = 1; /*v.w*/ 29155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 2927864933acd81892be0692555ae6d37d4293adb2aMarek Olšák ctx->upload = u_upload_create(pipe, 65536, 4, PIPE_BIND_VERTEX_BUFFER); 29355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 2949b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák return &ctx->base; 29555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 29655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 29755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_destroy(struct blitter_context *blitter) 29855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 29955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 3009b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = blitter->pipe; 30155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 30255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 30355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_blend_state(pipe, ctx->blend_write_color); 30455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_blend_state(pipe, ctx->blend_keep_color); 30555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 30655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_depth_stencil_alpha_state(pipe, 30755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil); 3081a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 309a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 3106a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson 31155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_rasterizer_state(pipe, ctx->rs_state); 31236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák if (ctx->rs_discard_state) 31336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->delete_rasterizer_state(pipe, ctx->rs_discard_state); 3145d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->delete_vs_state(pipe, ctx->vs); 31536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák if (ctx->vs_pos_only) 31636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->delete_vs_state(pipe, ctx->vs_pos_only); 317ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->delete_vertex_elements_state(pipe, ctx->velem_state); 318dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie if (ctx->vertex_has_integers) { 319dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie pipe->delete_vertex_elements_state(pipe, ctx->velem_sint_state); 320dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie pipe->delete_vertex_elements_state(pipe, ctx->velem_uint_state); 321dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie } 32236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák if (ctx->velem_state_readbuf) 32336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->delete_vertex_elements_state(pipe, ctx->velem_state_readbuf); 32455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 325ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák for (i = 0; i < PIPE_MAX_TEXTURE_TYPES; i++) { 32685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_texfetch_col[i]) 32785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_texfetch_col[i]); 32885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_texfetch_depth[i]) 32985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_texfetch_depth[i]); 33012fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák if (ctx->fs_texfetch_depthstencil[i]) 33112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák pipe->delete_fs_state(pipe, ctx->fs_texfetch_depthstencil[i]); 332bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák if (ctx->fs_texfetch_stencil[i]) 333bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák pipe->delete_fs_state(pipe, ctx->fs_texfetch_stencil[i]); 33455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 335ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 3364e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie for (i = 0; i <= PIPE_MAX_COLOR_BUFS; i++) { 33785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_col[i]) 33885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_col[i]); 3394e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie if (ctx->fs_col_int[i]) 3404e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie pipe->delete_fs_state(pipe, ctx->fs_col_int[i]); 3414e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie } 34255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 34337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák pipe->delete_sampler_state(pipe, ctx->sampler_state); 344900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák u_upload_destroy(ctx->upload); 34555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák FREE(ctx); 34655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 34755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 348c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_set_running_flag(struct blitter_context_priv *ctx) 34955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 350ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák if (ctx->base.running) { 351c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák _debug_printf("u_blitter:%i: Caught recursion. This is a driver bug.\n", 352c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák __LINE__); 3539a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák } 354ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák ctx->base.running = TRUE; 355c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 3569a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák 357c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_unset_running_flag(struct blitter_context_priv *ctx) 358c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 359c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák if (!ctx->base.running) { 360c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák _debug_printf("u_blitter:%i: Caught recursion. This is a driver bug.\n", 361c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák __LINE__); 362c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák } 363c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.running = FALSE; 364c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 365c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 366c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_check_saved_vertex_states(struct blitter_context_priv *ctx) 367c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 3689e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_num_vertex_buffers != ~0); 3699e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_velem_state != INVALID_PTR); 3709e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_vs != INVALID_PTR); 3719e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(!ctx->has_geometry_shader || ctx->base.saved_gs != INVALID_PTR); 3729e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(!ctx->has_stream_out || ctx->base.saved_num_so_targets != ~0); 3739e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_rs_state != INVALID_PTR); 37455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 37555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 376c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_restore_vertex_states(struct blitter_context_priv *ctx) 37755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 3789b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 3798f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák unsigned i; 38055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 381c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Vertex buffers. */ 382c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->set_vertex_buffers(pipe, 383c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_vertex_buffers, 384c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_vertex_buffers); 385c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 386c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák for (i = 0; i < ctx->base.saved_num_vertex_buffers; i++) { 387c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák if (ctx->base.saved_vertex_buffers[i].buffer) { 388c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe_resource_reference(&ctx->base.saved_vertex_buffers[i].buffer, 389c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák NULL); 390c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák } 391c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák } 392c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_vertex_buffers = ~0; 393c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 394c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Vertex elements. */ 3959b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_vertex_elements_state(pipe, ctx->base.saved_velem_state); 396c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_velem_state = INVALID_PTR; 39755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 398c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Vertex shader. */ 399c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->bind_vs_state(pipe, ctx->base.saved_vs); 4009b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_vs = INVALID_PTR; 40155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 4024c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák /* Geometry shader. */ 4034c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák if (ctx->has_geometry_shader) { 4044c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák pipe->bind_gs_state(pipe, ctx->base.saved_gs); 4054c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák ctx->base.saved_gs = INVALID_PTR; 4064c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák } 407363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák 408b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák /* Stream outputs. */ 409b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák if (ctx->has_stream_out) { 410b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák pipe->set_stream_output_targets(pipe, 411b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák ctx->base.saved_num_so_targets, 412b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák ctx->base.saved_so_targets, ~0); 413b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák 414b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák for (i = 0; i < ctx->base.saved_num_so_targets; i++) 415b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák pipe_so_target_reference(&ctx->base.saved_so_targets[i], NULL); 416b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák 417b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák ctx->base.saved_num_so_targets = ~0; 418b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák } 419b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák 420c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Rasterizer. */ 421c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->bind_rasterizer_state(pipe, ctx->base.saved_rs_state); 422c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_rs_state = INVALID_PTR; 423c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 424c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 425c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_check_saved_fragment_states(struct blitter_context_priv *ctx) 426c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 4279e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_fs != INVALID_PTR); 4289e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_dsa_state != INVALID_PTR); 4299e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_blend_state != INVALID_PTR); 430c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 431c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 432c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_restore_fragment_states(struct blitter_context_priv *ctx) 433c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 434c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 435c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 436c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Fragment shader. */ 437c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->bind_fs_state(pipe, ctx->base.saved_fs); 438c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_fs = INVALID_PTR; 439c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 440c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Depth, stencil, alpha. */ 441c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->base.saved_dsa_state); 442c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_dsa_state = INVALID_PTR; 443c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 444c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Blend state. */ 445c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->bind_blend_state(pipe, ctx->base.saved_blend_state); 446c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_blend_state = INVALID_PTR; 447c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 4486c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák /* Sample mask. */ 4496c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák if (ctx->base.is_sample_mask_saved) { 4506c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák pipe->set_sample_mask(pipe, ctx->base.saved_sample_mask); 4516c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák ctx->base.is_sample_mask_saved = FALSE; 4526c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák } 4536c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák 454c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Miscellaneous states. */ 455c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* XXX check whether these are saved and whether they need to be restored 456c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * (depending on the operation) */ 4579b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_stencil_ref(pipe, &ctx->base.saved_stencil_ref); 4589b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_viewport_state(pipe, &ctx->base.saved_viewport); 459c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 460932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 461c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_check_saved_fb_state(struct blitter_context_priv *ctx) 462c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 463c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák assert(ctx->base.saved_fb_state.nr_cbufs != ~0); 464c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 46555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 466c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_restore_fb_state(struct blitter_context_priv *ctx) 467c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 468c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 469c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 470c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->set_framebuffer_state(pipe, &ctx->base.saved_fb_state); 471c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák util_unreference_framebuffer_state(&ctx->base.saved_fb_state); 472c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 47355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 474c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_check_saved_textures(struct blitter_context_priv *ctx) 475c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 4769e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_num_sampler_states != ~0); 4779e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_num_sampler_views != ~0); 478c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 4790b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák 480c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_restore_textures(struct blitter_context_priv *ctx) 481c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 482c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 483c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák unsigned i; 4840b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák 485c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Fragment sampler states. */ 486c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->bind_fragment_sampler_states(pipe, 487c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_sampler_states, 488c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_sampler_states); 489c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_sampler_states = ~0; 49064aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri 491c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Fragment sampler views. */ 492c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->set_fragment_sampler_views(pipe, 493c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_sampler_views, 494c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_sampler_views); 4958f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák 496c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák for (i = 0; i < ctx->base.saved_num_sampler_views; i++) 497c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe_sampler_view_reference(&ctx->base.saved_sampler_views[i], NULL); 4989a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák 499c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_sampler_views = ~0; 50055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 50155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 50255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_rectangle(struct blitter_context_priv *ctx, 50355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 50455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x2, unsigned y2, 50555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák float depth) 50655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 50755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 50855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 50955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set vertex positions */ 5103bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[0][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v0.x*/ 5113bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[0][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v0.y*/ 51255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 5133bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[1][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v1.x*/ 5143bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[1][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v1.y*/ 51555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 5163bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[2][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v2.x*/ 5173bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[2][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v2.y*/ 51855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 5193bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[3][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v3.x*/ 5203bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[3][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v3.y*/ 52155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 52255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 52355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][0][2] = depth; /*z*/ 524932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 525932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* viewport */ 5263bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.scale[0] = 0.5f * ctx->dst_width; 5273bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.scale[1] = 0.5f * ctx->dst_height; 528ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák ctx->viewport.scale[2] = 1.0f; 529932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->viewport.scale[3] = 1.0f; 5303bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.translate[0] = 0.5f * ctx->dst_width; 5313bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.translate[1] = 0.5f * ctx->dst_height; 532ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák ctx->viewport.translate[2] = 0.0f; 533932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->viewport.translate[3] = 0.0f; 5349b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.pipe->set_viewport_state(ctx->base.pipe, &ctx->viewport); 53555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 53655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 53755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_clear_color(struct blitter_context_priv *ctx, 5386dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color) 53955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 54055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 54155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 5426dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie if (color) { 54316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák for (i = 0; i < 4; i++) { 5444e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie uint32_t *uiverts = (uint32_t *)ctx->vertices[i][1]; 5454e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie uiverts[0] = color->ui[0]; 5464e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie uiverts[1] = color->ui[1]; 5474e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie uiverts[2] = color->ui[2]; 5484e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie uiverts[3] = color->ui[3]; 54916d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák } 550fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák } else { 55116d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák for (i = 0; i < 4; i++) { 55216d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][0] = 0; 55316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][1] = 0; 55416d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][2] = 0; 55516d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][3] = 0; 55616d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák } 55755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 55855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 55955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 56037b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšákstatic void get_texcoords(struct pipe_sampler_view *src, 56189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák unsigned src_width0, unsigned src_height0, 5624c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned x1, unsigned y1, 5634c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned x2, unsigned y2, 56437b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák float out[4]) 565749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{ 56637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák struct pipe_resource *tex = src->texture; 56737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák unsigned level = src->u.tex.first_level; 568825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák boolean normalized = tex->target != PIPE_TEXTURE_RECT && 569825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák tex->nr_samples <= 1; 57037b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák 57137b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák if (normalized) { 57289ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák out[0] = x1 / (float)u_minify(src_width0, level); 57389ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák out[1] = y1 / (float)u_minify(src_height0, level); 57489ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák out[2] = x2 / (float)u_minify(src_width0, level); 57589ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák out[3] = y2 / (float)u_minify(src_height0, level); 57637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák } else { 577d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[0] = x1; 578d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[1] = y1; 579d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[2] = x2; 580d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[3] = y2; 581d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri } 582749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák} 583749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák 584749e24521a31178d2b647aa2954c3eecd597b799Marek Olšákstatic void set_texcoords_in_vertices(const float coord[4], 585749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák float *out, unsigned stride) 586749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{ 587749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[0]; /*t0.s*/ 588749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[1]; /*t0.t*/ 589749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out += stride; 590749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[2]; /*t1.s*/ 591749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[1]; /*t1.t*/ 592749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out += stride; 593749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[2]; /*t2.s*/ 594749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[3]; /*t2.t*/ 595749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out += stride; 596749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[0]; /*t3.s*/ 597749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[3]; /*t3.t*/ 598749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák} 599749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák 60089ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšákstatic void blitter_set_texcoords(struct blitter_context_priv *ctx, 60189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák struct pipe_sampler_view *src, 60289ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák unsigned src_width0, unsigned src_height0, 603825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned layer, unsigned sample, 60489ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák unsigned x1, unsigned y1, 60589ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák unsigned x2, unsigned y2) 60655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 607749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák unsigned i; 608749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák float coord[4]; 60989ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák float face_coord[4][2]; 61055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 61189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák get_texcoords(src, src_width0, src_height0, x1, y1, x2, y2, coord); 61255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 61389ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák if (src->texture->target == PIPE_TEXTURE_CUBE) { 61489ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák set_texcoords_in_vertices(coord, &face_coord[0][0], 2); 61589ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák util_map_texcoords2d_onto_cubemap(layer, 61689ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák /* pointer, stride in floats */ 61789ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák &face_coord[0][0], 2, 61889ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák &ctx->vertices[0][1][0], 8); 61989ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák } else { 62089ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák set_texcoords_in_vertices(coord, &ctx->vertices[0][1][0], 8); 62155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 622274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák 62389ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák /* Set the layer. */ 62489ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák switch (src->texture->target) { 62589ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák case PIPE_TEXTURE_3D: 62689ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák { 62789ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák float r = layer / (float)u_minify(src->texture->depth0, 62889ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák src->u.tex.first_level); 62989ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák for (i = 0; i < 4; i++) 63089ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák ctx->vertices[i][1][2] = r; /*r*/ 63189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák } 63289ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák break; 633d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul 63489ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák case PIPE_TEXTURE_1D_ARRAY: 63589ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák for (i = 0; i < 4; i++) 63689ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák ctx->vertices[i][1][1] = layer; /*t*/ 63789ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák break; 63855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 63989ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák case PIPE_TEXTURE_2D_ARRAY: 640825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák for (i = 0; i < 4; i++) { 641825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák ctx->vertices[i][1][2] = layer; /*r*/ 642825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák ctx->vertices[i][1][3] = sample; /*q*/ 643825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 644825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák break; 645825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 646825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák case PIPE_TEXTURE_2D: 647825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák for (i = 0; i < 4; i++) { 648825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák ctx->vertices[i][1][2] = sample; /*r*/ 649825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 65089ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák break; 65155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 65289ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák default:; 65389ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák } 65455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 65555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 6563bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákstatic void blitter_set_dst_dimensions(struct blitter_context_priv *ctx, 6573bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák unsigned width, unsigned height) 6583bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák{ 6593bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->dst_width = width; 6603bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->dst_height = height; 6613bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák} 6623bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák 66385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 6644e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlievoid *blitter_get_fs_col(struct blitter_context_priv *ctx, unsigned num_cbufs, 6654e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie boolean int_format) 66685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 6679b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 66885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 66985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(num_cbufs <= PIPE_MAX_COLOR_BUFS); 67085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 6714e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie if (int_format) { 6724e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie if (!ctx->fs_col_int[num_cbufs]) 6734e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie ctx->fs_col_int[num_cbufs] = 6744e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie util_make_fragment_cloneinput_shader(pipe, num_cbufs, 6754e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie TGSI_SEMANTIC_GENERIC, 6764e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie TGSI_INTERPOLATE_CONSTANT); 6774e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie return ctx->fs_col_int[num_cbufs]; 6784e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie } else { 6794e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie if (!ctx->fs_col[num_cbufs]) 6804e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie ctx->fs_col[num_cbufs] = 6814e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie util_make_fragment_cloneinput_shader(pipe, num_cbufs, 6824e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie TGSI_SEMANTIC_GENERIC, 6834e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie TGSI_INTERPOLATE_LINEAR); 6844e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie return ctx->fs_col[num_cbufs]; 6854e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie } 68685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 68785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 68885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 68985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_col(struct blitter_context_priv *ctx, 690825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák struct pipe_resource *tex) 69185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 6929b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 69385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 694825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák assert(tex->target < PIPE_MAX_TEXTURE_TYPES); 69585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 696825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if (tex->nr_samples > 1) { 697825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák void **shader = &ctx->fs_texfetch_col_msaa[tex->target]; 698d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 699825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák /* Create the fragment shader on-demand. */ 700825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if (!*shader) { 701825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(tex->target, 702825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák tex->nr_samples); 703825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 704825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák *shader = util_make_fs_blit_msaa_color(pipe, tgsi_tex); 705825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 706825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 707825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák return *shader; 708825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } else { 709825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák void **shader = &ctx->fs_texfetch_col[tex->target]; 71085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 711825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák /* Create the fragment shader on-demand. */ 712825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if (!*shader) { 713825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(tex->target, 0); 714825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 715825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák *shader = 716825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák util_make_fragment_tex_shader(pipe, tgsi_tex, 717825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák TGSI_INTERPOLATE_LINEAR); 718825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 719825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 720825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák return *shader; 721825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 72285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 72385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 72485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 72585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_depth(struct blitter_context_priv *ctx, 726825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák struct pipe_resource *tex) 72785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 7289b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 72985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 730825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák assert(tex->target < PIPE_MAX_TEXTURE_TYPES); 73185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 732825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if (tex->nr_samples > 1) { 733825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák void **shader = &ctx->fs_texfetch_depth_msaa[tex->target]; 734d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 735825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák /* Create the fragment shader on-demand. */ 736825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if (!*shader) { 737825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(tex->target, 738825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák tex->nr_samples); 739825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 740825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák *shader = 741825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák util_make_fs_blit_msaa_depth(pipe, tgsi_tex); 742825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 74385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 744825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák return *shader; 745825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } else { 746825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák void **shader = &ctx->fs_texfetch_depth[tex->target]; 747825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 748825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák /* Create the fragment shader on-demand. */ 749825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if (!*shader) { 750825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(tex->target, 0); 751825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 752825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák *shader = 753825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák util_make_fragment_tex_shader_writedepth(pipe, tgsi_tex, 754825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák TGSI_INTERPOLATE_LINEAR); 755825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 756825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 757825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák return *shader; 758825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 75985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 76085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 76112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšákstatic INLINE 76212fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšákvoid *blitter_get_fs_texfetch_depthstencil(struct blitter_context_priv *ctx, 763825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák struct pipe_resource *tex) 76412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák{ 76512fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák struct pipe_context *pipe = ctx->base.pipe; 76612fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 767825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák assert(tex->target < PIPE_MAX_TEXTURE_TYPES); 76812fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 769825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if (tex->nr_samples > 1) { 770825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák void **shader = &ctx->fs_texfetch_depthstencil_msaa[tex->target]; 77112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 772825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák /* Create the fragment shader on-demand. */ 773825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if (!*shader) { 774825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(tex->target, 775825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák tex->nr_samples); 776825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 777825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák *shader = 778825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák util_make_fs_blit_msaa_depthstencil(pipe, tgsi_tex); 779825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 78012fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 781825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák return *shader; 782825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } else { 783825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák void **shader = &ctx->fs_texfetch_depthstencil[tex->target]; 784825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 785825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák /* Create the fragment shader on-demand. */ 786825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if (!*shader) { 787825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(tex->target, 0); 788825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 789825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák *shader = 790825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák util_make_fragment_tex_shader_writedepthstencil(pipe, tgsi_tex, 791825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák TGSI_INTERPOLATE_LINEAR); 792825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 793825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 794825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák return *shader; 795825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 79612fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák} 79712fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 798bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšákstatic INLINE 799bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšákvoid *blitter_get_fs_texfetch_stencil(struct blitter_context_priv *ctx, 800825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák struct pipe_resource *tex) 801bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák{ 802bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák struct pipe_context *pipe = ctx->base.pipe; 803bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák 804825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák assert(tex->target < PIPE_MAX_TEXTURE_TYPES); 805bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák 806825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if (tex->nr_samples > 1) { 807825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák void **shader = &ctx->fs_texfetch_stencil_msaa[tex->target]; 808bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák 809825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák /* Create the fragment shader on-demand. */ 810825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if (!*shader) { 811825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(tex->target, 812825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák tex->nr_samples); 813bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák 814825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák *shader = 815825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák util_make_fs_blit_msaa_stencil(pipe, tgsi_tex); 816825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 817825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 818825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák return *shader; 819825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } else { 820825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák void **shader = &ctx->fs_texfetch_stencil[tex->target]; 821825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 822825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák /* Create the fragment shader on-demand. */ 823825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if (!*shader) { 824825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(tex->target, 0); 825825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 826825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák *shader = 827825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák util_make_fragment_tex_shader_writestencil(pipe, tgsi_tex, 828825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák TGSI_INTERPOLATE_LINEAR); 829825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 830825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 831825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák return *shader; 832825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 833bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák} 834bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák 8351f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšákstatic void blitter_set_common_draw_rect_state(struct blitter_context_priv *ctx) 8361f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák{ 8371f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 8381f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák 8391f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 8401f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 8411f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák if (ctx->has_geometry_shader) 8421f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák pipe->bind_gs_state(pipe, NULL); 8431f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák if (ctx->has_stream_out) 8441f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák pipe->set_stream_output_targets(pipe, 0, NULL, 0); 8451f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák} 8461f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák 847900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšákstatic void blitter_draw(struct blitter_context_priv *ctx, 848900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák unsigned x1, unsigned y1, 849900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák unsigned x2, unsigned y2, 850900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák float depth) 851900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák{ 852900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák struct pipe_resource *buf = NULL; 853900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák unsigned offset = 0; 854900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák 855900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák blitter_set_rectangle(ctx, x1, y1, x2, y2, depth); 856900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák 857900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák u_upload_data(ctx->upload, 0, sizeof(ctx->vertices), ctx->vertices, 858900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák &offset, &buf); 859900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák u_upload_unmap(ctx->upload); 860900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák util_draw_vertex_buffer(ctx->base.pipe, NULL, buf, offset, 861900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák PIPE_PRIM_TRIANGLE_FAN, 4, 2); 8627622496d7b8fb4677a66d8843c078b3fa753f02fMarek Olšák pipe_resource_reference(&buf, NULL); 863900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák} 864900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák 8659be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter, 8669be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned x1, unsigned y1, 8679be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned x2, unsigned y2, 8689be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák float depth, 8699be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák enum blitter_attrib_type type, 8706dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *attrib) 8719be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák{ 8729be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 8739be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 8749be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák switch (type) { 8759be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák case UTIL_BLITTER_ATTRIB_COLOR: 8769be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_clear_color(ctx, attrib); 8779be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák break; 8789be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 8799be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák case UTIL_BLITTER_ATTRIB_TEXCOORD: 8806dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie set_texcoords_in_vertices(attrib->f, &ctx->vertices[0][1][0], 8); 8819be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák break; 8829be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 8839be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák default:; 8849be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák } 8859be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 886900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák blitter_draw(ctx, x1, y1, x2, y2, depth); 8879be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák} 8889be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 889db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákstatic void util_blitter_clear_custom(struct blitter_context *blitter, 890db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned width, unsigned height, 891db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned num_cbufs, 892db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned clear_buffers, 8934e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie enum pipe_format cbuf_format, 8946dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color, 895db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák double depth, unsigned stencil, 896db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák void *custom_blend, void *custom_dsa) 89755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 89855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 8999b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 9006a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson struct pipe_stencil_ref sr = { { 0 } }; 9014e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie boolean int_format = util_format_is_pure_integer(cbuf_format); 902ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák assert(num_cbufs <= PIPE_MAX_COLOR_BUFS); 90355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 904c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_set_running_flag(ctx); 905c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_vertex_states(ctx); 906c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fragment_states(ctx); 90755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 908c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* bind states */ 909db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák if (custom_blend) { 910db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák pipe->bind_blend_state(pipe, custom_blend); 911db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if (clear_buffers & PIPE_CLEAR_COLOR) { 91255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 913db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else { 91455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_keep_color); 915db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } 91655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 917db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák if (custom_dsa) { 918db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, custom_dsa); 919db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if ((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) { 9201a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 921db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if (clear_buffers & PIPE_CLEAR_DEPTH) { 922a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil); 923db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if (clear_buffers & PIPE_CLEAR_STENCIL) { 924a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 925db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else { 92655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 927db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } 928db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 929db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák sr.ref_value[0] = stencil & 0xff; 930db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák pipe->set_stencil_ref(pipe, &sr); 93155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 9324e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie if (util_format_is_pure_sint(cbuf_format)) { 9334e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie pipe->bind_vertex_elements_state(pipe, ctx->velem_sint_state); 9344e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie } else if (util_format_is_pure_uint(cbuf_format)) { 9354e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie pipe->bind_vertex_elements_state(pipe, ctx->velem_uint_state); 9364e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie } else { 9374e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 9384e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie } 9394e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, num_cbufs, int_format)); 9406c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák pipe->set_sample_mask(pipe, ~0); 94155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 9421f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák blitter_set_common_draw_rect_state(ctx); 9433bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák blitter_set_dst_dimensions(ctx, width, height); 9449be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, 0, 0, width, height, depth, 9456dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie UTIL_BLITTER_ATTRIB_COLOR, color); 946c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 947c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_vertex_states(ctx); 948c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fragment_states(ctx); 949c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_unset_running_flag(ctx); 95055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 95155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 952db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid util_blitter_clear(struct blitter_context *blitter, 953db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned width, unsigned height, 954db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned num_cbufs, 955db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned clear_buffers, 9564e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie enum pipe_format cbuf_format, 9576dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color, 958db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák double depth, unsigned stencil) 959db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák{ 960db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák util_blitter_clear_custom(blitter, width, height, num_cbufs, 9614e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie clear_buffers, cbuf_format, color, depth, stencil, 962db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák NULL, NULL); 963db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák} 964db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 965e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšákvoid util_blitter_custom_clear_depth(struct blitter_context *blitter, 966db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned width, unsigned height, 967db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák double depth, void *custom_dsa) 968db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák{ 9696dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie static const union pipe_color_union color; 970db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák util_blitter_clear_custom(blitter, width, height, 0, 9714e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie 0, PIPE_FORMAT_NONE, &color, depth, 0, NULL, custom_dsa); 972db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák} 973db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 974876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákstatic 975dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšákboolean is_overlap(unsigned dstx, unsigned dsty, unsigned dstz, 976dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák const struct pipe_box *srcbox) 977deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie{ 978dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák struct pipe_box src = *srcbox; 979dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák 980dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák if (src.width < 0) { 981dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák src.x += src.width; 982dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák src.width = -src.width; 983dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák } 984dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák if (src.height < 0) { 985dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák src.y += src.height; 986dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák src.height = -src.height; 987dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák } 988dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák if (src.depth < 0) { 989dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák src.z += src.depth; 990dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák src.depth = -src.depth; 991dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák } 992dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák return src.x < dstx+src.width && src.x+src.width > dstx && 993dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák src.y < dsty+src.height && src.y+src.height > dsty && 994dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák src.z < dstz+src.depth && src.z+src.depth > dstz; 995deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie} 996deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie 997ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšákvoid util_blitter_default_dst_texture(struct pipe_surface *dst_templ, 998ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák struct pipe_resource *dst, 999ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák unsigned dstlevel, 1000ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák unsigned dstz, 1001ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák const struct pipe_box *srcbox) 1002ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák{ 1003ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák memset(dst_templ, 0, sizeof(*dst_templ)); 1004ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák dst_templ->format = dst->format; 1005ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák if (util_format_is_depth_or_stencil(dst->format)) { 1006ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák dst_templ->usage = PIPE_BIND_DEPTH_STENCIL; 1007ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák } else { 1008ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák dst_templ->usage = PIPE_BIND_RENDER_TARGET; 1009ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák } 1010ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák dst_templ->format = util_format_linear(dst->format); 1011ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák dst_templ->u.tex.level = dstlevel; 1012ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák dst_templ->u.tex.first_layer = dstz; 1013ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák dst_templ->u.tex.last_layer = dstz + srcbox->depth - 1; 1014ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák} 1015ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák 1016ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšákvoid util_blitter_default_src_texture(struct pipe_sampler_view *src_templ, 1017ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák struct pipe_resource *src, 1018ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák unsigned srclevel) 1019ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák{ 1020ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák memset(src_templ, 0, sizeof(*src_templ)); 1021ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->format = util_format_linear(src->format); 1022ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->u.tex.first_level = srclevel; 1023ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->u.tex.last_level = srclevel; 1024ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->u.tex.first_layer = 0; 1025ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->u.tex.last_layer = 1026a730838a42c62b7729691b518a134017ff2d3b42Marek Olšák src->target == PIPE_TEXTURE_3D ? u_minify(src->depth0, srclevel) - 1 1027ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák : src->array_size - 1; 1028ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->swizzle_r = PIPE_SWIZZLE_RED; 1029ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->swizzle_g = PIPE_SWIZZLE_GREEN; 1030ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->swizzle_b = PIPE_SWIZZLE_BLUE; 1031ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->swizzle_a = PIPE_SWIZZLE_ALPHA; 1032ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák} 1033ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák 103484645fa61390475e6efb080685e0dec059622a39Marek Olšákboolean util_blitter_is_copy_supported(struct blitter_context *blitter, 103584645fa61390475e6efb080685e0dec059622a39Marek Olšák const struct pipe_resource *dst, 103684645fa61390475e6efb080685e0dec059622a39Marek Olšák const struct pipe_resource *src, 103784645fa61390475e6efb080685e0dec059622a39Marek Olšák unsigned mask) 103884645fa61390475e6efb080685e0dec059622a39Marek Olšák{ 103984645fa61390475e6efb080685e0dec059622a39Marek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 104084645fa61390475e6efb080685e0dec059622a39Marek Olšák struct pipe_screen *screen = ctx->base.pipe->screen; 104184645fa61390475e6efb080685e0dec059622a39Marek Olšák 104284645fa61390475e6efb080685e0dec059622a39Marek Olšák if (dst) { 104384645fa61390475e6efb080685e0dec059622a39Marek Olšák unsigned bind; 104484645fa61390475e6efb080685e0dec059622a39Marek Olšák boolean is_stencil; 104584645fa61390475e6efb080685e0dec059622a39Marek Olšák const struct util_format_description *desc = 104684645fa61390475e6efb080685e0dec059622a39Marek Olšák util_format_description(dst->format); 104784645fa61390475e6efb080685e0dec059622a39Marek Olšák 104884645fa61390475e6efb080685e0dec059622a39Marek Olšák is_stencil = util_format_has_stencil(desc); 104984645fa61390475e6efb080685e0dec059622a39Marek Olšák 105084645fa61390475e6efb080685e0dec059622a39Marek Olšák /* Stencil export must be supported for stencil copy. */ 105184645fa61390475e6efb080685e0dec059622a39Marek Olšák if ((mask & PIPE_MASK_S) && is_stencil && !ctx->has_stencil_export) { 105284645fa61390475e6efb080685e0dec059622a39Marek Olšák return FALSE; 105384645fa61390475e6efb080685e0dec059622a39Marek Olšák } 105484645fa61390475e6efb080685e0dec059622a39Marek Olšák 105584645fa61390475e6efb080685e0dec059622a39Marek Olšák if (is_stencil || util_format_has_depth(desc)) 105684645fa61390475e6efb080685e0dec059622a39Marek Olšák bind = PIPE_BIND_DEPTH_STENCIL; 105784645fa61390475e6efb080685e0dec059622a39Marek Olšák else 105884645fa61390475e6efb080685e0dec059622a39Marek Olšák bind = PIPE_BIND_RENDER_TARGET; 105984645fa61390475e6efb080685e0dec059622a39Marek Olšák 106084645fa61390475e6efb080685e0dec059622a39Marek Olšák if (!screen->is_format_supported(screen, dst->format, dst->target, 106184645fa61390475e6efb080685e0dec059622a39Marek Olšák dst->nr_samples, bind)) { 106284645fa61390475e6efb080685e0dec059622a39Marek Olšák return FALSE; 106384645fa61390475e6efb080685e0dec059622a39Marek Olšák } 106484645fa61390475e6efb080685e0dec059622a39Marek Olšák } 106584645fa61390475e6efb080685e0dec059622a39Marek Olšák 106684645fa61390475e6efb080685e0dec059622a39Marek Olšák if (src) { 106784645fa61390475e6efb080685e0dec059622a39Marek Olšák if (!screen->is_format_supported(screen, src->format, src->target, 106884645fa61390475e6efb080685e0dec059622a39Marek Olšák src->nr_samples, PIPE_BIND_SAMPLER_VIEW)) { 106984645fa61390475e6efb080685e0dec059622a39Marek Olšák return FALSE; 107084645fa61390475e6efb080685e0dec059622a39Marek Olšák } 107184645fa61390475e6efb080685e0dec059622a39Marek Olšák 107284645fa61390475e6efb080685e0dec059622a39Marek Olšák /* Check stencil sampler support for stencil copy. */ 107384645fa61390475e6efb080685e0dec059622a39Marek Olšák if (util_format_has_stencil(util_format_description(src->format))) { 107484645fa61390475e6efb080685e0dec059622a39Marek Olšák enum pipe_format stencil_format = 107584645fa61390475e6efb080685e0dec059622a39Marek Olšák util_format_stencil_only(src->format); 107684645fa61390475e6efb080685e0dec059622a39Marek Olšák assert(stencil_format != PIPE_FORMAT_NONE); 107784645fa61390475e6efb080685e0dec059622a39Marek Olšák 107884645fa61390475e6efb080685e0dec059622a39Marek Olšák if (stencil_format != src->format && 107984645fa61390475e6efb080685e0dec059622a39Marek Olšák !screen->is_format_supported(screen, stencil_format, src->target, 108084645fa61390475e6efb080685e0dec059622a39Marek Olšák src->nr_samples, PIPE_BIND_SAMPLER_VIEW)) { 108184645fa61390475e6efb080685e0dec059622a39Marek Olšák return FALSE; 108284645fa61390475e6efb080685e0dec059622a39Marek Olšák } 108384645fa61390475e6efb080685e0dec059622a39Marek Olšák } 108484645fa61390475e6efb080685e0dec059622a39Marek Olšák } 108584645fa61390475e6efb080685e0dec059622a39Marek Olšák 108684645fa61390475e6efb080685e0dec059622a39Marek Olšák return TRUE; 108784645fa61390475e6efb080685e0dec059622a39Marek Olšák} 108884645fa61390475e6efb080685e0dec059622a39Marek Olšák 1089233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšákvoid util_blitter_copy_texture(struct blitter_context *blitter, 1090233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák struct pipe_resource *dst, 1091825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned dst_level, unsigned dst_sample_mask, 1092233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák unsigned dstx, unsigned dsty, unsigned dstz, 1093233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák struct pipe_resource *src, 1094825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned src_level, unsigned src_sample, 1095c8ff737a18672c86f4ec01b25b4893550667b17cMarek Olšák const struct pipe_box *srcbox) 109655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 109755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 10989b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 1099ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák struct pipe_surface *dst_view, dst_templ; 1100ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák struct pipe_sampler_view src_templ, *src_view; 1101876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 1102876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák assert(dst && src); 1103876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák assert(src->target < PIPE_MAX_TEXTURE_TYPES); 1104876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 110537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák /* Initialize the surface. */ 11068aaf6972d128551dd720b3e3525806d39aad6f53Marek Olšák util_blitter_default_dst_texture(&dst_templ, dst, dst_level, dstz, srcbox); 1107ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák dst_view = pipe->create_surface(pipe, dst, &dst_templ); 110855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 110937b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák /* Initialize the sampler view. */ 11108aaf6972d128551dd720b3e3525806d39aad6f53Marek Olšák util_blitter_default_src_texture(&src_templ, src, src_level); 1111ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_view = pipe->create_sampler_view(pipe, src, &src_templ); 111237b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák 111337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák /* Copy. */ 1114825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák util_blitter_copy_texture_view(blitter, dst_view, dst_sample_mask, dstx, 1115825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák dsty, src_view, src_sample, srcbox, 1116825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák src->width0, src->height0, PIPE_MASK_RGBAZS); 111737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák 1118ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák pipe_surface_reference(&dst_view, NULL); 1119ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák pipe_sampler_view_reference(&src_view, NULL); 112037b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák} 112137b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák 112237b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšákvoid util_blitter_copy_texture_view(struct blitter_context *blitter, 112337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák struct pipe_surface *dst, 1124825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned dst_sample_mask, 112537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák unsigned dstx, unsigned dsty, 112637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák struct pipe_sampler_view *src, 1127825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned src_sample, 112889ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák const struct pipe_box *srcbox, 1129ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák unsigned src_width0, unsigned src_height0, 1130ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák unsigned mask) 113137b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák{ 113237b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 113337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 113437b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák struct pipe_framebuffer_state fb_state; 113537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák enum pipe_texture_target src_target = src->texture->target; 1136dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák int abs_width = abs(srcbox->width); 1137dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák int abs_height = abs(srcbox->height); 1138ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák boolean blit_stencil, blit_depth; 113912fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák const struct util_format_description *src_desc = 114012fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák util_format_description(src->format); 114112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 1142ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák blit_depth = util_format_has_depth(src_desc) && (mask & PIPE_MASK_Z); 1143ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák blit_stencil = util_format_has_stencil(src_desc) && (mask & PIPE_MASK_S); 114412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 114512fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák /* If you want a fallback for stencil copies, 114612fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák * use util_blitter_copy_texture. */ 1147ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák if (blit_stencil && !ctx->has_stencil_export) { 1148ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák blit_stencil = FALSE; 114912fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 1150ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák if (!blit_depth) 115112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák return; 115212fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák } 115337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák 115437b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák /* Sanity checks. */ 115537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák if (dst->texture == src->texture && 115637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák dst->u.tex.level == src->u.tex.first_level) { 1157dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák assert(!is_overlap(dstx, dsty, 0, srcbox)); 115837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák } 115937b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák /* XXX should handle 3d regions */ 116037b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák assert(srcbox->depth == 1); 116137b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák 1162876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Check whether the states are properly saved. */ 1163c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_set_running_flag(ctx); 1164c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_vertex_states(ctx); 1165c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fragment_states(ctx); 1166c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_textures(ctx); 1167c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fb_state(ctx); 116855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1169876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Initialize framebuffer state. */ 117037b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák fb_state.width = dst->width; 117137b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák fb_state.height = dst->height; 117255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1173ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák if (blit_depth || blit_stencil) { 117455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_keep_color); 117512fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 1176ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák if (blit_depth && blit_stencil) { 117712fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, 117812fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák ctx->dsa_write_depth_stencil); 117912fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák pipe->bind_fs_state(pipe, 1180825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák blitter_get_fs_texfetch_depthstencil(ctx, src->texture)); 1181ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák } else if (blit_depth) { 118212fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, 118312fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák ctx->dsa_write_depth_keep_stencil); 118412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák pipe->bind_fs_state(pipe, 1185825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák blitter_get_fs_texfetch_depth(ctx, src->texture)); 118612fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák } else { /* is_stencil */ 1187bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, 1188bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák ctx->dsa_keep_depth_write_stencil); 1189bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák pipe->bind_fs_state(pipe, 1190825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák blitter_get_fs_texfetch_stencil(ctx, src->texture)); 119112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák } 119255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 119355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 0; 119437b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák fb_state.zsbuf = dst; 119555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } else { 119655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 119755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 119885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, 1199825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák blitter_get_fs_texfetch_col(ctx, src->texture)); 120055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 120155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 1; 120237b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák fb_state.cbufs[0] = dst; 120355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.zsbuf = 0; 120455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 120585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 1206ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák if (blit_depth && blit_stencil) { 120712fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák /* Setup two samplers, one for depth and the other one for stencil. */ 120812fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák struct pipe_sampler_view templ; 120912fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák struct pipe_sampler_view *views[2]; 121012fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák void *samplers[2] = {ctx->sampler_state, ctx->sampler_state}; 121112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 121212fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák templ = *src; 121312fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák templ.format = util_format_stencil_only(templ.format); 121412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák assert(templ.format != PIPE_FORMAT_NONE); 121512fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 121612fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák views[0] = src; 121712fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák views[1] = pipe->create_sampler_view(pipe, src->texture, &templ); 121812fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 121912fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák pipe->set_fragment_sampler_views(pipe, 2, views); 122012fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák pipe->bind_fragment_sampler_states(pipe, 2, samplers); 122112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 122212fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák pipe_sampler_view_reference(&views[1], NULL); 122312fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák } else { 122412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák pipe->set_fragment_sampler_views(pipe, 1, &src); 122512fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák pipe->bind_fragment_sampler_states(pipe, 1, &ctx->sampler_state); 122612fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák } 122712fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 1228ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 122955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 1230825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák pipe->set_sample_mask(pipe, dst_sample_mask); 123155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 12321f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák blitter_set_common_draw_rect_state(ctx); 123337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák blitter_set_dst_dimensions(ctx, dst->width, dst->height); 12349be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 1235825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if ((src_target == PIPE_TEXTURE_1D || 1236825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák src_target == PIPE_TEXTURE_2D || 1237825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák src_target == PIPE_TEXTURE_RECT) && 1238825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák src->texture->nr_samples <= 1) { 12399be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw the quad with the draw_rectangle callback. */ 12409be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 1241825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák /* Set texture coordinates. - use a pipe color union 1242825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * for interface purposes. 1243825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * XXX pipe_color_union is a wrong name since we use that to set 1244825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * texture coordinates too. 1245825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák */ 1246825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák union pipe_color_union coord; 1247825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák get_texcoords(src, src_width0, src_height0, srcbox->x, srcbox->y, 1248dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák srcbox->x+srcbox->width, srcbox->y+srcbox->height, coord.f); 1249825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 1250825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák /* Draw. */ 1251dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák blitter->draw_rectangle(blitter, dstx, dsty, dstx+abs_width, dsty+abs_height, 0, 1252825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák UTIL_BLITTER_ATTRIB_TEXCOORD, &coord); 1253825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } else { 12549be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw the quad with the generic codepath. */ 1255825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák blitter_set_texcoords(ctx, src, src_width0, src_height0, srcbox->z, 1256825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák src_sample, 1257825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák srcbox->x, srcbox->y, 1258dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák srcbox->x + srcbox->width, srcbox->y + srcbox->height); 1259dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák blitter_draw(ctx, dstx, dsty, dstx+abs_width, dsty+abs_height, 0); 126055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 126155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1262c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_vertex_states(ctx); 1263c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fragment_states(ctx); 1264c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_textures(ctx); 1265c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fb_state(ctx); 1266c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_unset_running_flag(ctx); 126755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 126855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1269a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a color surface to a constant value. */ 1270a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_render_target(struct blitter_context *blitter, 1271a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger struct pipe_surface *dstsurf, 12726dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color, 1273a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned dstx, unsigned dsty, 1274a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned width, unsigned height) 127555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 127655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 12779b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 127855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct pipe_framebuffer_state fb_state; 127955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1280a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger assert(dstsurf->texture); 1281a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if (!dstsurf->texture) 128255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák return; 128355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 128455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* check the saved state */ 1285c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_set_running_flag(ctx); 1286c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_vertex_states(ctx); 1287c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fragment_states(ctx); 1288c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fb_state(ctx); 128955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1290c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* bind states */ 129155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 129255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 12934e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1, FALSE)); 1294ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 129555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 129655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set a framebuffer state */ 129759e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.width = dstsurf->width; 129859e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.height = dstsurf->height; 129955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 1; 130059e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.cbufs[0] = dstsurf; 130155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.zsbuf = 0; 130255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 13036c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák pipe->set_sample_mask(pipe, ~0); 130455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 13051f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák blitter_set_common_draw_rect_state(ctx); 13063bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 13079be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0, 13086dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie UTIL_BLITTER_ATTRIB_COLOR, color); 1309c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 1310c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_vertex_states(ctx); 1311c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fragment_states(ctx); 1312c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fb_state(ctx); 1313c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_unset_running_flag(ctx); 1314a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger} 131559e51d9640c242a7c919472d935a91889c7840c9Marek Olšák 1316a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a depth stencil surface. */ 1317a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_depth_stencil(struct blitter_context *blitter, 1318a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger struct pipe_surface *dstsurf, 1319a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned clear_flags, 1320a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger double depth, 1321a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned stencil, 1322a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned dstx, unsigned dsty, 1323a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned width, unsigned height) 1324a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger{ 1325a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 13269b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 1327a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct pipe_framebuffer_state fb_state; 1328a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct pipe_stencil_ref sr = { { 0 } }; 1329a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 1330a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger assert(dstsurf->texture); 1331a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if (!dstsurf->texture) 1332a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger return; 1333a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 1334a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* check the saved state */ 1335c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_set_running_flag(ctx); 1336c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_vertex_states(ctx); 1337c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fragment_states(ctx); 1338c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fb_state(ctx); 1339a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 1340c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* bind states */ 1341a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_blend_state(pipe, ctx->blend_keep_color); 1342a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if ((clear_flags & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) { 1343a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger sr.ref_value[0] = stencil & 0xff; 1344a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 1345a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_stencil_ref(pipe, &sr); 1346a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 1347a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else if (clear_flags & PIPE_CLEAR_DEPTH) { 1348a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil); 1349a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 1350a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else if (clear_flags & PIPE_CLEAR_STENCIL) { 1351a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger sr.ref_value[0] = stencil & 0xff; 1352a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 1353a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_stencil_ref(pipe, &sr); 1354a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 1355a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else 1356a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* hmm that should be illegal probably, or make it a no-op somewhere */ 1357a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 1358a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 13594e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0, FALSE)); 1360a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 1361a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 1362a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* set a framebuffer state */ 1363a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.width = dstsurf->width; 1364a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.height = dstsurf->height; 1365a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.nr_cbufs = 0; 1366a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.cbufs[0] = 0; 1367a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.zsbuf = dstsurf; 1368a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_framebuffer_state(pipe, &fb_state); 13696c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák pipe->set_sample_mask(pipe, ~0); 1370a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 13711f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák blitter_set_common_draw_rect_state(ctx); 13723bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 13739be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, depth, 13749be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák UTIL_BLITTER_ATTRIB_NONE, NULL); 1375c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 1376c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_vertex_states(ctx); 1377c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fragment_states(ctx); 1378c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fb_state(ctx); 1379c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_unset_running_flag(ctx); 138055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 1381f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1382c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie/* draw a rectangle across a region using a custom dsa stage - for r600g */ 1383c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlievoid util_blitter_custom_depth_stencil(struct blitter_context *blitter, 1384c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie struct pipe_surface *zsurf, 1385c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie struct pipe_surface *cbsurf, 138694b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák unsigned sample_mask, 1387c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie void *dsa_stage, float depth) 1388f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák{ 1389f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 1390f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák struct pipe_context *pipe = ctx->base.pipe; 1391f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák struct pipe_framebuffer_state fb_state; 1392f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1393c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie assert(zsurf->texture); 1394c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie if (!zsurf->texture) 1395f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák return; 1396f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1397f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák /* check the saved state */ 1398c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_set_running_flag(ctx); 1399c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_vertex_states(ctx); 1400c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fragment_states(ctx); 1401c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fb_state(ctx); 1402f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1403c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* bind states */ 1404c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie pipe->bind_blend_state(pipe, ctx->blend_write_color); 1405c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie pipe->bind_depth_stencil_alpha_state(pipe, dsa_stage); 14064e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0, FALSE)); 1407f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 1408f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1409f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák /* set a framebuffer state */ 1410c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.width = zsurf->width; 1411c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.height = zsurf->height; 1412c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.nr_cbufs = 1; 1413c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie if (cbsurf) { 1414c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.cbufs[0] = cbsurf; 1415c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.nr_cbufs = 1; 1416c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie } else { 1417c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.cbufs[0] = NULL; 1418c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.nr_cbufs = 0; 1419c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie } 1420c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.zsbuf = zsurf; 1421f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 142294b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák pipe->set_sample_mask(pipe, sample_mask); 1423f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 14241f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák blitter_set_common_draw_rect_state(ctx); 1425c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie blitter_set_dst_dimensions(ctx, zsurf->width, zsurf->height); 1426c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie blitter->draw_rectangle(blitter, 0, 0, zsurf->width, zsurf->height, depth, 1427f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák UTIL_BLITTER_ATTRIB_NONE, NULL); 1428c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 1429c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_vertex_states(ctx); 1430c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fragment_states(ctx); 1431c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fb_state(ctx); 1432c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_unset_running_flag(ctx); 1433f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák} 143436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 143536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšákvoid util_blitter_copy_buffer(struct blitter_context *blitter, 143636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct pipe_resource *dst, 143736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák unsigned dstx, 143836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct pipe_resource *src, 143936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák unsigned srcx, 144036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák unsigned size) 144136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák{ 144236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 144336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct pipe_context *pipe = ctx->base.pipe; 144436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct pipe_vertex_buffer vb; 144536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct pipe_stream_output_target *so_target; 144636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 144759fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák if (srcx >= src->width0 || 144859fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák dstx >= dst->width0) { 144959fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák return; 145059fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák } 145159fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák if (srcx + size > src->width0) { 145259fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák size = src->width0 - srcx; 145359fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák } 145459fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák if (dstx + size > dst->width0) { 145559fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák size = dst->width0 - dstx; 145659fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák } 145759fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák 145836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák /* Drivers not capable of Stream Out should not call this function 145936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák * in the first place. */ 146036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák assert(ctx->has_stream_out); 146136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 146236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák /* Some alignment is required. */ 1463a0a9e56cfed1ab81c1068cffbfd9299f77c7e187Marek Olšák if (srcx % 4 != 0 || dstx % 4 != 0 || size % 4 != 0 || 146436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák !ctx->has_stream_out) { 146536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct pipe_box box; 146636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák u_box_1d(srcx, size, &box); 146736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák util_resource_copy_region(pipe, dst, 0, dstx, 0, 0, src, 0, &box); 146836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák return; 146936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák } 147036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 147136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák blitter_set_running_flag(ctx); 147236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák blitter_check_saved_vertex_states(ctx); 147336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 147436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák vb.buffer = src; 147536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák vb.buffer_offset = srcx; 147636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák vb.stride = 4; 147736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 147836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->set_vertex_buffers(pipe, 1, &vb); 147936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->bind_vertex_elements_state(pipe, ctx->velem_state_readbuf); 148036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->bind_vs_state(pipe, ctx->vs_pos_only); 148136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák if (ctx->has_geometry_shader) 148236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->bind_gs_state(pipe, NULL); 148336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_discard_state); 148436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 148536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák so_target = pipe->create_stream_output_target(pipe, dst, dstx, size); 148636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->set_stream_output_targets(pipe, 1, &so_target, 0); 148736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 1488a0a9e56cfed1ab81c1068cffbfd9299f77c7e187Marek Olšák util_draw_arrays(pipe, PIPE_PRIM_POINTS, 0, size / 4); 148936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 149036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák blitter_restore_vertex_states(ctx); 149136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák blitter_unset_running_flag(ctx); 149236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe_so_target_reference(&so_target, NULL); 149336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák} 14940f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 14950f86915c5322b096b7154b6c84e21288074b775dMarek Olšák/* probably radeon specific */ 1496e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšákvoid util_blitter_custom_resolve_color(struct blitter_context *blitter, 14970f86915c5322b096b7154b6c84e21288074b775dMarek Olšák struct pipe_resource *dst, 14980f86915c5322b096b7154b6c84e21288074b775dMarek Olšák unsigned dst_level, 14990f86915c5322b096b7154b6c84e21288074b775dMarek Olšák unsigned dst_layer, 15000f86915c5322b096b7154b6c84e21288074b775dMarek Olšák struct pipe_resource *src, 15010f86915c5322b096b7154b6c84e21288074b775dMarek Olšák unsigned src_layer, 15020f86915c5322b096b7154b6c84e21288074b775dMarek Olšák void *custom_blend) 15030f86915c5322b096b7154b6c84e21288074b775dMarek Olšák{ 15040f86915c5322b096b7154b6c84e21288074b775dMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 15050f86915c5322b096b7154b6c84e21288074b775dMarek Olšák struct pipe_context *pipe = ctx->base.pipe; 15060f86915c5322b096b7154b6c84e21288074b775dMarek Olšák struct pipe_framebuffer_state fb_state; 15070f86915c5322b096b7154b6c84e21288074b775dMarek Olšák struct pipe_surface *srcsurf, *dstsurf, surf_tmpl; 15080f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 15090f86915c5322b096b7154b6c84e21288074b775dMarek Olšák blitter_set_running_flag(ctx); 15100f86915c5322b096b7154b6c84e21288074b775dMarek Olšák blitter_check_saved_vertex_states(ctx); 15110f86915c5322b096b7154b6c84e21288074b775dMarek Olšák blitter_check_saved_fragment_states(ctx); 15120f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 15130f86915c5322b096b7154b6c84e21288074b775dMarek Olšák /* bind states */ 15140f86915c5322b096b7154b6c84e21288074b775dMarek Olšák pipe->bind_blend_state(pipe, custom_blend); 15150f86915c5322b096b7154b6c84e21288074b775dMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 15160f86915c5322b096b7154b6c84e21288074b775dMarek Olšák pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 15170f86915c5322b096b7154b6c84e21288074b775dMarek Olšák pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1, FALSE)); 15181516a4f3538b3b1720d0f5c771fbdcd52b34b9f9Marek Olšák pipe->set_sample_mask(pipe, (1ull << MAX2(1, src->nr_samples)) - 1); 15190f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 15200f86915c5322b096b7154b6c84e21288074b775dMarek Olšák memset(&surf_tmpl, 0, sizeof(surf_tmpl)); 15210f86915c5322b096b7154b6c84e21288074b775dMarek Olšák surf_tmpl.format = dst->format; 15220f86915c5322b096b7154b6c84e21288074b775dMarek Olšák surf_tmpl.u.tex.level = dst_level; 15230f86915c5322b096b7154b6c84e21288074b775dMarek Olšák surf_tmpl.u.tex.first_layer = dst_layer; 15240f86915c5322b096b7154b6c84e21288074b775dMarek Olšák surf_tmpl.u.tex.last_layer = dst_layer; 15250f86915c5322b096b7154b6c84e21288074b775dMarek Olšák surf_tmpl.usage = PIPE_BIND_RENDER_TARGET; 15260f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 15270f86915c5322b096b7154b6c84e21288074b775dMarek Olšák dstsurf = pipe->create_surface(pipe, dst, &surf_tmpl); 15280f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 15290f86915c5322b096b7154b6c84e21288074b775dMarek Olšák surf_tmpl.u.tex.level = 0; 15300f86915c5322b096b7154b6c84e21288074b775dMarek Olšák surf_tmpl.u.tex.first_layer = src_layer; 15310f86915c5322b096b7154b6c84e21288074b775dMarek Olšák surf_tmpl.u.tex.last_layer = src_layer; 15320f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 15330f86915c5322b096b7154b6c84e21288074b775dMarek Olšák srcsurf = pipe->create_surface(pipe, src, &surf_tmpl); 15340f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 15350f86915c5322b096b7154b6c84e21288074b775dMarek Olšák /* set a framebuffer state */ 15360f86915c5322b096b7154b6c84e21288074b775dMarek Olšák fb_state.width = src->width0; 15370f86915c5322b096b7154b6c84e21288074b775dMarek Olšák fb_state.height = src->height0; 15380f86915c5322b096b7154b6c84e21288074b775dMarek Olšák fb_state.nr_cbufs = 2; 15390f86915c5322b096b7154b6c84e21288074b775dMarek Olšák fb_state.cbufs[0] = srcsurf; 15400f86915c5322b096b7154b6c84e21288074b775dMarek Olšák fb_state.cbufs[1] = dstsurf; 15410f86915c5322b096b7154b6c84e21288074b775dMarek Olšák fb_state.zsbuf = NULL; 15420f86915c5322b096b7154b6c84e21288074b775dMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 15430f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 15440f86915c5322b096b7154b6c84e21288074b775dMarek Olšák blitter_set_common_draw_rect_state(ctx); 15450f86915c5322b096b7154b6c84e21288074b775dMarek Olšák blitter_set_dst_dimensions(ctx, src->width0, src->height0); 15460f86915c5322b096b7154b6c84e21288074b775dMarek Olšák blitter->draw_rectangle(blitter, 0, 0, src->width0, src->height0, 15470f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 0, 0, NULL); 15480f86915c5322b096b7154b6c84e21288074b775dMarek Olšák blitter_restore_fb_state(ctx); 15490f86915c5322b096b7154b6c84e21288074b775dMarek Olšák blitter_restore_vertex_states(ctx); 15500f86915c5322b096b7154b6c84e21288074b775dMarek Olšák blitter_restore_fragment_states(ctx); 15510f86915c5322b096b7154b6c84e21288074b775dMarek Olšák blitter_unset_running_flag(ctx); 15520f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 15530f86915c5322b096b7154b6c84e21288074b775dMarek Olšák pipe_surface_reference(&srcsurf, NULL); 15540f86915c5322b096b7154b6c84e21288074b775dMarek Olšák pipe_surface_reference(&dstsurf, NULL); 15550f86915c5322b096b7154b6c84e21288074b775dMarek Olšák} 1556a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 1557a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšákvoid util_blitter_custom_color(struct blitter_context *blitter, 1558a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák struct pipe_surface *dstsurf, 1559a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák void *custom_blend) 1560a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák{ 1561a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 1562a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 1563a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák struct pipe_framebuffer_state fb_state; 1564a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 1565a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák assert(dstsurf->texture); 1566a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák if (!dstsurf->texture) 1567a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák return; 1568a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 1569a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák /* check the saved state */ 1570a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák blitter_set_running_flag(ctx); 1571a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák blitter_check_saved_vertex_states(ctx); 1572a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák blitter_check_saved_fragment_states(ctx); 1573a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák blitter_check_saved_fb_state(ctx); 1574a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 1575a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák /* bind states */ 1576a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák pipe->bind_blend_state(pipe, custom_blend); 1577a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 1578a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1, FALSE)); 1579a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 1580a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák pipe->set_sample_mask(pipe, (1ull << MAX2(1, dstsurf->texture->nr_samples)) - 1); 1581a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 1582a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák /* set a framebuffer state */ 1583a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák fb_state.width = dstsurf->width; 1584a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák fb_state.height = dstsurf->height; 1585a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák fb_state.nr_cbufs = 1; 1586a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák fb_state.cbufs[0] = dstsurf; 1587a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák fb_state.zsbuf = 0; 1588a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 1589a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák pipe->set_sample_mask(pipe, ~0); 1590a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 1591a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák blitter_set_common_draw_rect_state(ctx); 1592a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 1593a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák blitter->draw_rectangle(blitter, 0, 0, dstsurf->width, dstsurf->height, 1594a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 0, 0, NULL); 1595a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 1596a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák blitter_restore_vertex_states(ctx); 1597a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák blitter_restore_fragment_states(ctx); 1598a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák blitter_restore_fb_state(ctx); 1599a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák blitter_unset_running_flag(ctx); 1600a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák} 1601