u_blitter.c revision 7864933acd81892be0692555ae6d37d4293adb2a
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]; 8155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 8255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Blend state. */ 8355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *blend_write_color; /**< blend state with writemask of RGBA */ 8455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *blend_keep_color; /**< blend state with writemask of 0 */ 8555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 8655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Depth stencil alpha state. */ 871a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger void *dsa_write_depth_stencil; 8855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *dsa_write_depth_keep_stencil; 8955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *dsa_keep_depth_stencil; 90a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger void *dsa_keep_depth_write_stencil; 9155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 9236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák /* Vertex elements states. */ 93ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger void *velem_state; 944e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie void *velem_uint_state; 954e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie void *velem_sint_state; 9636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák void *velem_state_readbuf; 97ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger 9837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák /* Sampler state. */ 9937b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák void *sampler_state; 100ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 101ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák /* Rasterizer state. */ 102ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák void *rs_state; 10336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák void *rs_discard_state; 104f6106566081978f663cf08e54bb8908cb58a5316Michal Krol 105932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* Viewport state. */ 106932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol struct pipe_viewport_state viewport; 107932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 1083bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák /* Destination surface dimensions. */ 1093bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák unsigned dst_width; 1103bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák unsigned dst_height; 1114c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák 1124c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák boolean has_geometry_shader; 113dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie boolean vertex_has_integers; 114b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák boolean has_stream_out; 11555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}; 11655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1179be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter, 1189be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned x, unsigned y, 1199be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned width, unsigned height, 1209be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák float depth, 1219be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák enum blitter_attrib_type type, 1226dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *attrib); 1239be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 1249be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 12555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context *util_blitter_create(struct pipe_context *pipe) 12655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 12755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx; 1280c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul struct pipe_blend_state blend; 1290c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul struct pipe_depth_stencil_alpha_state dsa; 1300c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul struct pipe_rasterizer_state rs_state; 13137b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák struct pipe_sampler_state sampler_state; 132ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger struct pipe_vertex_element velem[2]; 13385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák unsigned i; 13455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 13555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx = CALLOC_STRUCT(blitter_context_priv); 13655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák if (!ctx) 13755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák return NULL; 13855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1399b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.pipe = pipe; 1409be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák ctx->base.draw_rectangle = blitter_draw_rectangle; 14155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 14255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* init state objects for them to be considered invalid */ 1439b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_blend_state = INVALID_PTR; 1449b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_dsa_state = INVALID_PTR; 1459b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_rs_state = INVALID_PTR; 1469b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fs = INVALID_PTR; 1479b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_vs = INVALID_PTR; 1484c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák ctx->base.saved_gs = INVALID_PTR; 1499b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_velem_state = INVALID_PTR; 1509b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fb_state.nr_cbufs = ~0; 1519b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_views = ~0; 1529b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_states = ~0; 1539b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_vertex_buffers = ~0; 154b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák ctx->base.saved_num_so_targets = ~0; 15555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1564c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák ctx->has_geometry_shader = 1574c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák pipe->screen->get_shader_param(pipe->screen, PIPE_SHADER_GEOMETRY, 1584c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0; 159dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie ctx->vertex_has_integers = 1600f55f133f1e5b72e463441d2d388a1ec4deac1daMarek Olšák pipe->screen->get_shader_param(pipe->screen, PIPE_SHADER_VERTEX, 161dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie PIPE_SHADER_CAP_INTEGERS); 162b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák ctx->has_stream_out = 163b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák pipe->screen->get_param(pipe->screen, 164b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS) != 0; 1654c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák 16655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* blend state objects */ 1670c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul memset(&blend, 0, sizeof(blend)); 16855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->blend_keep_color = pipe->create_blend_state(pipe, &blend); 16955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 170eba1e2a44718bea398e49d496a78ee002c9922b8Roland Scheidegger blend.rt[0].colormask = PIPE_MASK_RGBA; 17155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->blend_write_color = pipe->create_blend_state(pipe, &blend); 17255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 17355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* depth stencil alpha state objects */ 1740c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul memset(&dsa, 0, sizeof(dsa)); 17555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_keep_depth_stencil = 1761a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 17755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 178f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák dsa.depth.enabled = 1; 179f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák dsa.depth.writemask = 1; 180f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák dsa.depth.func = PIPE_FUNC_ALWAYS; 18155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil = 1821a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 1831a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger 1841a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].enabled = 1; 1851a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].func = PIPE_FUNC_ALWAYS; 1861a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE; 1871a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE; 1881a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE; 1891a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].valuemask = 0xff; 1901a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].writemask = 0xff; 1911a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger ctx->dsa_write_depth_stencil = 1921a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 193a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 194a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger dsa.depth.enabled = 0; 195a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger dsa.depth.writemask = 0; 196a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger ctx->dsa_keep_depth_write_stencil = 197a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 19855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 19955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* sampler state */ 20037b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák memset(&sampler_state, 0, sizeof(sampler_state)); 20137b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák sampler_state.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 20237b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák sampler_state.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 20337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák sampler_state.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 20437b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák sampler_state.normalized_coords = 1; 20537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák ctx->sampler_state = pipe->create_sampler_state(pipe, &sampler_state); 20655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 20755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* rasterizer state */ 20855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák memset(&rs_state, 0, sizeof(rs_state)); 2090bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell rs_state.cull_face = PIPE_FACE_NONE; 21055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák rs_state.gl_rasterization_rules = 1; 2111c75edf3e8ccc97f5f91f42f99c1f8db30b25fc4Corbin Simpson rs_state.flatshade = 1; 212dc4c821f0817a3db716f965692fb701079f66340Marek Olšák rs_state.depth_clip = 1; 21355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->rs_state = pipe->create_rasterizer_state(pipe, &rs_state); 21455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 21536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák if (ctx->has_stream_out) { 21636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák rs_state.rasterizer_discard = 1; 21736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák ctx->rs_discard_state = pipe->create_rasterizer_state(pipe, &rs_state); 21836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák } 21936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 22036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák /* vertex elements states */ 221ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger memset(&velem[0], 0, sizeof(velem[0]) * 2); 222ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger for (i = 0; i < 2; i++) { 223ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].src_offset = i * 4 * sizeof(float); 224ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 225ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger } 226ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger ctx->velem_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]); 227ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger 228dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie if (ctx->vertex_has_integers) { 229dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie memset(&velem[0], 0, sizeof(velem[0]) * 2); 2309e66b25880febecb529582c6ead920637d73f51eDave Airlie velem[0].src_offset = 0; 2319e66b25880febecb529582c6ead920637d73f51eDave Airlie velem[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 2329e66b25880febecb529582c6ead920637d73f51eDave Airlie velem[1].src_offset = 4 * sizeof(float); 2339e66b25880febecb529582c6ead920637d73f51eDave Airlie velem[1].src_format = PIPE_FORMAT_R32G32B32A32_SINT; 234dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie ctx->velem_sint_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]); 235dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie 236dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie memset(&velem[0], 0, sizeof(velem[0]) * 2); 2379e66b25880febecb529582c6ead920637d73f51eDave Airlie velem[0].src_offset = 0; 2389e66b25880febecb529582c6ead920637d73f51eDave Airlie velem[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 2399e66b25880febecb529582c6ead920637d73f51eDave Airlie velem[1].src_offset = 4 * sizeof(float); 2409e66b25880febecb529582c6ead920637d73f51eDave Airlie velem[1].src_format = PIPE_FORMAT_R32G32B32A32_UINT; 241dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie ctx->velem_uint_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]); 2424e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie } 243dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie 24436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák if (ctx->has_stream_out) { 245a0a9e56cfed1ab81c1068cffbfd9299f77c7e187Marek Olšák velem[0].src_format = PIPE_FORMAT_R32_UINT; 24636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák ctx->velem_state_readbuf = pipe->create_vertex_elements_state(pipe, 1, &velem[0]); 24736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák } 24836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 24985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* fragment shaders are created on-demand */ 25085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 25136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák /* vertex shaders */ 25255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák { 25355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const uint semantic_names[] = { TGSI_SEMANTIC_POSITION, 25455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák TGSI_SEMANTIC_GENERIC }; 25555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const uint semantic_indices[] = { 0, 0 }; 2565d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák ctx->vs = 25755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák util_make_vertex_passthrough_shader(pipe, 2, semantic_names, 25855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák semantic_indices); 25955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 26036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák if (ctx->has_stream_out) { 26136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct pipe_stream_output_info so; 26236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák const uint semantic_names[] = { TGSI_SEMANTIC_POSITION }; 26336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák const uint semantic_indices[] = { 0 }; 26436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 26536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák memset(&so, 0, sizeof(so)); 26636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák so.num_outputs = 1; 267a0a9e56cfed1ab81c1068cffbfd9299f77c7e187Marek Olšák so.output[0].num_components = 1; 268a0a9e56cfed1ab81c1068cffbfd9299f77c7e187Marek Olšák so.stride[0] = 1; 26936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 27036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák ctx->vs_pos_only = 27136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák util_make_vertex_passthrough_shader_with_so(pipe, 1, semantic_names, 27236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák semantic_indices, &so); 27336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák } 27455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 27555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set invariant vertex coordinates */ 27655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 27755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][0][3] = 1; /*v.w*/ 27855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 2797864933acd81892be0692555ae6d37d4293adb2aMarek Olšák ctx->upload = u_upload_create(pipe, 65536, 4, PIPE_BIND_VERTEX_BUFFER); 28055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 2819b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák return &ctx->base; 28255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 28355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 28455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_destroy(struct blitter_context *blitter) 28555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 28655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 2879b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = blitter->pipe; 28855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 28955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 29055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_blend_state(pipe, ctx->blend_write_color); 29155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_blend_state(pipe, ctx->blend_keep_color); 29255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 29355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_depth_stencil_alpha_state(pipe, 29455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil); 2951a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 296a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 2976a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson 29855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_rasterizer_state(pipe, ctx->rs_state); 29936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák if (ctx->rs_discard_state) 30036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->delete_rasterizer_state(pipe, ctx->rs_discard_state); 3015d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->delete_vs_state(pipe, ctx->vs); 30236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák if (ctx->vs_pos_only) 30336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->delete_vs_state(pipe, ctx->vs_pos_only); 304ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->delete_vertex_elements_state(pipe, ctx->velem_state); 305dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie if (ctx->vertex_has_integers) { 306dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie pipe->delete_vertex_elements_state(pipe, ctx->velem_sint_state); 307dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie pipe->delete_vertex_elements_state(pipe, ctx->velem_uint_state); 308dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie } 30936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák if (ctx->velem_state_readbuf) 31036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->delete_vertex_elements_state(pipe, ctx->velem_state_readbuf); 31155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 312ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák for (i = 0; i < PIPE_MAX_TEXTURE_TYPES; i++) { 31385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_texfetch_col[i]) 31485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_texfetch_col[i]); 31585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_texfetch_depth[i]) 31685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_texfetch_depth[i]); 31755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 318ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 3194e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie for (i = 0; i <= PIPE_MAX_COLOR_BUFS; i++) { 32085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_col[i]) 32185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_col[i]); 3224e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie if (ctx->fs_col_int[i]) 3234e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie pipe->delete_fs_state(pipe, ctx->fs_col_int[i]); 3244e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie } 32555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 32637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák pipe->delete_sampler_state(pipe, ctx->sampler_state); 327900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák u_upload_destroy(ctx->upload); 32855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák FREE(ctx); 32955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 33055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 331c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_set_running_flag(struct blitter_context_priv *ctx) 33255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 333ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák if (ctx->base.running) { 334c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák _debug_printf("u_blitter:%i: Caught recursion. This is a driver bug.\n", 335c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák __LINE__); 3369a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák } 337ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák ctx->base.running = TRUE; 338c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 3399a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák 340c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_unset_running_flag(struct blitter_context_priv *ctx) 341c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 342c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák if (!ctx->base.running) { 343c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák _debug_printf("u_blitter:%i: Caught recursion. This is a driver bug.\n", 344c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák __LINE__); 345c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák } 346c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.running = FALSE; 347c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 348c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 349c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_check_saved_vertex_states(struct blitter_context_priv *ctx) 350c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 3519e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_num_vertex_buffers != ~0); 3529e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_velem_state != INVALID_PTR); 3539e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_vs != INVALID_PTR); 3549e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(!ctx->has_geometry_shader || ctx->base.saved_gs != INVALID_PTR); 3559e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(!ctx->has_stream_out || ctx->base.saved_num_so_targets != ~0); 3569e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_rs_state != INVALID_PTR); 35755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 35855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 359c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_restore_vertex_states(struct blitter_context_priv *ctx) 36055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 3619b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 3628f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák unsigned i; 36355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 364c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Vertex buffers. */ 365c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->set_vertex_buffers(pipe, 366c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_vertex_buffers, 367c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_vertex_buffers); 368c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 369c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák for (i = 0; i < ctx->base.saved_num_vertex_buffers; i++) { 370c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák if (ctx->base.saved_vertex_buffers[i].buffer) { 371c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe_resource_reference(&ctx->base.saved_vertex_buffers[i].buffer, 372c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák NULL); 373c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák } 374c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák } 375c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_vertex_buffers = ~0; 376c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 377c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Vertex elements. */ 3789b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_vertex_elements_state(pipe, ctx->base.saved_velem_state); 379c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_velem_state = INVALID_PTR; 38055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 381c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Vertex shader. */ 382c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->bind_vs_state(pipe, ctx->base.saved_vs); 3839b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_vs = INVALID_PTR; 38455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3854c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák /* Geometry shader. */ 3864c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák if (ctx->has_geometry_shader) { 3874c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák pipe->bind_gs_state(pipe, ctx->base.saved_gs); 3884c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák ctx->base.saved_gs = INVALID_PTR; 3894c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák } 390363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák 391b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák /* Stream outputs. */ 392b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák if (ctx->has_stream_out) { 393b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák pipe->set_stream_output_targets(pipe, 394b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák ctx->base.saved_num_so_targets, 395b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák ctx->base.saved_so_targets, ~0); 396b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák 397b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák for (i = 0; i < ctx->base.saved_num_so_targets; i++) 398b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák pipe_so_target_reference(&ctx->base.saved_so_targets[i], NULL); 399b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák 400b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák ctx->base.saved_num_so_targets = ~0; 401b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák } 402b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák 403c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Rasterizer. */ 404c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->bind_rasterizer_state(pipe, ctx->base.saved_rs_state); 405c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_rs_state = INVALID_PTR; 406c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 407c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 408c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_check_saved_fragment_states(struct blitter_context_priv *ctx) 409c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 4109e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_fs != INVALID_PTR); 4119e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_dsa_state != INVALID_PTR); 4129e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_blend_state != INVALID_PTR); 413c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 414c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 415c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_restore_fragment_states(struct blitter_context_priv *ctx) 416c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 417c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 418c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 419c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Fragment shader. */ 420c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->bind_fs_state(pipe, ctx->base.saved_fs); 421c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_fs = INVALID_PTR; 422c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 423c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Depth, stencil, alpha. */ 424c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->base.saved_dsa_state); 425c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_dsa_state = INVALID_PTR; 426c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 427c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Blend state. */ 428c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->bind_blend_state(pipe, ctx->base.saved_blend_state); 429c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_blend_state = INVALID_PTR; 430c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 431c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Miscellaneous states. */ 432c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* XXX check whether these are saved and whether they need to be restored 433c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * (depending on the operation) */ 4349b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_stencil_ref(pipe, &ctx->base.saved_stencil_ref); 4359b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_viewport_state(pipe, &ctx->base.saved_viewport); 436c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 437932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 438c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_check_saved_fb_state(struct blitter_context_priv *ctx) 439c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 440c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák assert(ctx->base.saved_fb_state.nr_cbufs != ~0); 441c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 44255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 443c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_restore_fb_state(struct blitter_context_priv *ctx) 444c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 445c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 446c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 447c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->set_framebuffer_state(pipe, &ctx->base.saved_fb_state); 448c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák util_unreference_framebuffer_state(&ctx->base.saved_fb_state); 449c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 45055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 451c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_check_saved_textures(struct blitter_context_priv *ctx) 452c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 4539e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_num_sampler_states != ~0); 4549e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_num_sampler_views != ~0); 455c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 4560b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák 457c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_restore_textures(struct blitter_context_priv *ctx) 458c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 459c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 460c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák unsigned i; 4610b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák 462c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Fragment sampler states. */ 463c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->bind_fragment_sampler_states(pipe, 464c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_sampler_states, 465c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_sampler_states); 466c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_sampler_states = ~0; 46764aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri 468c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Fragment sampler views. */ 469c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->set_fragment_sampler_views(pipe, 470c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_sampler_views, 471c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_sampler_views); 4728f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák 473c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák for (i = 0; i < ctx->base.saved_num_sampler_views; i++) 474c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe_sampler_view_reference(&ctx->base.saved_sampler_views[i], NULL); 4759a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák 476c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_sampler_views = ~0; 47755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 47855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 47955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_rectangle(struct blitter_context_priv *ctx, 48055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 48155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x2, unsigned y2, 48255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák float depth) 48355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 48455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 48555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 48655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set vertex positions */ 4873bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[0][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v0.x*/ 4883bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[0][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v0.y*/ 48955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 4903bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[1][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v1.x*/ 4913bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[1][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v1.y*/ 49255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 4933bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[2][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v2.x*/ 4943bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[2][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v2.y*/ 49555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 4963bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[3][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v3.x*/ 4973bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[3][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v3.y*/ 49855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 49955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 50055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][0][2] = depth; /*z*/ 501932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 502932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* viewport */ 5033bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.scale[0] = 0.5f * ctx->dst_width; 5043bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.scale[1] = 0.5f * ctx->dst_height; 505ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák ctx->viewport.scale[2] = 1.0f; 506932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->viewport.scale[3] = 1.0f; 5073bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.translate[0] = 0.5f * ctx->dst_width; 5083bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.translate[1] = 0.5f * ctx->dst_height; 509ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák ctx->viewport.translate[2] = 0.0f; 510932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->viewport.translate[3] = 0.0f; 5119b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.pipe->set_viewport_state(ctx->base.pipe, &ctx->viewport); 51255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 51355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 51455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_clear_color(struct blitter_context_priv *ctx, 5156dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color) 51655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 51755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 51855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 5196dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie if (color) { 52016d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák for (i = 0; i < 4; i++) { 5214e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie uint32_t *uiverts = (uint32_t *)ctx->vertices[i][1]; 5224e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie uiverts[0] = color->ui[0]; 5234e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie uiverts[1] = color->ui[1]; 5244e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie uiverts[2] = color->ui[2]; 5254e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie uiverts[3] = color->ui[3]; 52616d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák } 527fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák } else { 52816d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák for (i = 0; i < 4; i++) { 52916d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][0] = 0; 53016d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][1] = 0; 53116d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][2] = 0; 53216d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][3] = 0; 53316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák } 53455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 53555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 53655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 53737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšákstatic void get_texcoords(struct pipe_sampler_view *src, 53889ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák unsigned src_width0, unsigned src_height0, 5394c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned x1, unsigned y1, 5404c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned x2, unsigned y2, 54137b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák float out[4]) 542749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{ 54337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák struct pipe_resource *tex = src->texture; 54437b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák unsigned level = src->u.tex.first_level; 54537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák boolean normalized = tex->target != PIPE_TEXTURE_RECT; 54637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák 54737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák if (normalized) { 54889ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák out[0] = x1 / (float)u_minify(src_width0, level); 54989ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák out[1] = y1 / (float)u_minify(src_height0, level); 55089ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák out[2] = x2 / (float)u_minify(src_width0, level); 55189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák out[3] = y2 / (float)u_minify(src_height0, level); 55237b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák } else { 553d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[0] = x1; 554d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[1] = y1; 555d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[2] = x2; 556d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[3] = y2; 557d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri } 558749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák} 559749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák 560749e24521a31178d2b647aa2954c3eecd597b799Marek Olšákstatic void set_texcoords_in_vertices(const float coord[4], 561749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák float *out, unsigned stride) 562749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{ 563749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[0]; /*t0.s*/ 564749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[1]; /*t0.t*/ 565749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out += stride; 566749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[2]; /*t1.s*/ 567749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[1]; /*t1.t*/ 568749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out += stride; 569749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[2]; /*t2.s*/ 570749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[3]; /*t2.t*/ 571749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out += stride; 572749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[0]; /*t3.s*/ 573749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[3]; /*t3.t*/ 574749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák} 575749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák 57689ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšákstatic void blitter_set_texcoords(struct blitter_context_priv *ctx, 57789ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák struct pipe_sampler_view *src, 57889ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák unsigned src_width0, unsigned src_height0, 57989ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák unsigned layer, 58089ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák unsigned x1, unsigned y1, 58189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák unsigned x2, unsigned y2) 58255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 583749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák unsigned i; 584749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák float coord[4]; 58589ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák float face_coord[4][2]; 58655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 58789ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák get_texcoords(src, src_width0, src_height0, x1, y1, x2, y2, coord); 58855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 58989ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák if (src->texture->target == PIPE_TEXTURE_CUBE) { 59089ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák set_texcoords_in_vertices(coord, &face_coord[0][0], 2); 59189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák util_map_texcoords2d_onto_cubemap(layer, 59289ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák /* pointer, stride in floats */ 59389ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák &face_coord[0][0], 2, 59489ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák &ctx->vertices[0][1][0], 8); 59589ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák } else { 59689ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák set_texcoords_in_vertices(coord, &ctx->vertices[0][1][0], 8); 59755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 598274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák 59989ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák /* Set the layer. */ 60089ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák switch (src->texture->target) { 60189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák case PIPE_TEXTURE_3D: 60289ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák { 60389ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák float r = layer / (float)u_minify(src->texture->depth0, 60489ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák src->u.tex.first_level); 60589ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák for (i = 0; i < 4; i++) 60689ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák ctx->vertices[i][1][2] = r; /*r*/ 60789ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák } 60889ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák break; 609d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul 61089ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák case PIPE_TEXTURE_1D_ARRAY: 61189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák for (i = 0; i < 4; i++) 61289ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák ctx->vertices[i][1][1] = layer; /*t*/ 61389ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák break; 61455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 61589ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák case PIPE_TEXTURE_2D_ARRAY: 61689ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák for (i = 0; i < 4; i++) 61789ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák ctx->vertices[i][1][2] = layer; /*r*/ 61889ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák break; 61955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 62089ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák default:; 62189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák } 62255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 62355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 6243bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákstatic void blitter_set_dst_dimensions(struct blitter_context_priv *ctx, 6253bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák unsigned width, unsigned height) 6263bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák{ 6273bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->dst_width = width; 6283bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->dst_height = height; 6293bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák} 6303bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák 63185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 6324e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlievoid *blitter_get_fs_col(struct blitter_context_priv *ctx, unsigned num_cbufs, 6334e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie boolean int_format) 63485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 6359b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 63685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 63785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(num_cbufs <= PIPE_MAX_COLOR_BUFS); 63885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 6394e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie if (int_format) { 6404e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie if (!ctx->fs_col_int[num_cbufs]) 6414e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie ctx->fs_col_int[num_cbufs] = 6424e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie util_make_fragment_cloneinput_shader(pipe, num_cbufs, 6434e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie TGSI_SEMANTIC_GENERIC, 6444e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie TGSI_INTERPOLATE_CONSTANT); 6454e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie return ctx->fs_col_int[num_cbufs]; 6464e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie } else { 6474e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie if (!ctx->fs_col[num_cbufs]) 6484e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie ctx->fs_col[num_cbufs] = 6494e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie util_make_fragment_cloneinput_shader(pipe, num_cbufs, 6504e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie TGSI_SEMANTIC_GENERIC, 6514e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie TGSI_INTERPOLATE_LINEAR); 6524e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie return ctx->fs_col[num_cbufs]; 6534e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie } 65485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 65585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 656d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul/** Convert PIPE_TEXTURE_x to TGSI_TEXTURE_x */ 657d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paulstatic unsigned 6583bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákpipe_tex_to_tgsi_tex(enum pipe_texture_target pipe_tex_target) 659d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul{ 660d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul switch (pipe_tex_target) { 661d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul case PIPE_TEXTURE_1D: 662d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_1D; 663d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul case PIPE_TEXTURE_2D: 664d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_2D; 665ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri case PIPE_TEXTURE_RECT: 666cbe367227959a32ff20e146106162a81d2be02c3Luca Barbieri return TGSI_TEXTURE_RECT; 667d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul case PIPE_TEXTURE_3D: 668d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_3D; 669d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul case PIPE_TEXTURE_CUBE: 670d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_CUBE; 671274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák case PIPE_TEXTURE_1D_ARRAY: 672274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák return TGSI_TEXTURE_1D_ARRAY; 673274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák case PIPE_TEXTURE_2D_ARRAY: 674274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák return TGSI_TEXTURE_2D_ARRAY; 675d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul default: 676d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul assert(0 && "unexpected texture target"); 677d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_UNKNOWN; 678d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul } 679d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul} 680d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 681d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 68285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 68385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_col(struct blitter_context_priv *ctx, 68485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák unsigned tex_target) 68585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 6869b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 68785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 68885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(tex_target < PIPE_MAX_TEXTURE_TYPES); 68985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 69085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Create the fragment shader on-demand. */ 69185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (!ctx->fs_texfetch_col[tex_target]) { 692d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target); 693d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 694d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul ctx->fs_texfetch_col[tex_target] = 695d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul util_make_fragment_tex_shader(pipe, tgsi_tex, TGSI_INTERPOLATE_LINEAR); 69685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák } 69785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 69885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák return ctx->fs_texfetch_col[tex_target]; 69985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 70085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 70185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 70285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_depth(struct blitter_context_priv *ctx, 70385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák unsigned tex_target) 70485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 7059b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 70685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 70785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(tex_target < PIPE_MAX_TEXTURE_TYPES); 70885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 70985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Create the fragment shader on-demand. */ 71085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (!ctx->fs_texfetch_depth[tex_target]) { 711d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target); 712d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 713d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul ctx->fs_texfetch_depth[tex_target] = 714d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul util_make_fragment_tex_shader_writedepth(pipe, tgsi_tex, 715d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul TGSI_INTERPOLATE_LINEAR); 71685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák } 71785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 71885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák return ctx->fs_texfetch_depth[tex_target]; 71985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 72085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 721900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšákstatic void blitter_draw(struct blitter_context_priv *ctx, 722900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák unsigned x1, unsigned y1, 723900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák unsigned x2, unsigned y2, 724900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák float depth) 725900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák{ 726900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák struct pipe_resource *buf = NULL; 727900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák unsigned offset = 0; 728900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák 729900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák blitter_set_rectangle(ctx, x1, y1, x2, y2, depth); 730900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák 731900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák u_upload_data(ctx->upload, 0, sizeof(ctx->vertices), ctx->vertices, 732900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák &offset, &buf); 733900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák u_upload_unmap(ctx->upload); 734900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák util_draw_vertex_buffer(ctx->base.pipe, NULL, buf, offset, 735900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák PIPE_PRIM_TRIANGLE_FAN, 4, 2); 736900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák} 737900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák 7389be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter, 7399be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned x1, unsigned y1, 7409be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned x2, unsigned y2, 7419be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák float depth, 7429be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák enum blitter_attrib_type type, 7436dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *attrib) 7449be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák{ 7459be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 7469be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 7479be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák switch (type) { 7489be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák case UTIL_BLITTER_ATTRIB_COLOR: 7499be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_clear_color(ctx, attrib); 7509be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák break; 7519be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 7529be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák case UTIL_BLITTER_ATTRIB_TEXCOORD: 7536dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie set_texcoords_in_vertices(attrib->f, &ctx->vertices[0][1][0], 8); 7549be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák break; 7559be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 7569be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák default:; 7579be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák } 7589be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 759900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák blitter_draw(ctx, x1, y1, x2, y2, depth); 7609be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák} 7619be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 762db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákstatic void util_blitter_clear_custom(struct blitter_context *blitter, 763db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned width, unsigned height, 764db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned num_cbufs, 765db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned clear_buffers, 7664e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie enum pipe_format cbuf_format, 7676dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color, 768db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák double depth, unsigned stencil, 769db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák void *custom_blend, void *custom_dsa) 77055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 77155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 7729b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 7736a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson struct pipe_stencil_ref sr = { { 0 } }; 7744e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie boolean int_format = util_format_is_pure_integer(cbuf_format); 775ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák assert(num_cbufs <= PIPE_MAX_COLOR_BUFS); 77655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 777c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_set_running_flag(ctx); 778c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_vertex_states(ctx); 779c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fragment_states(ctx); 78055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 781c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* bind states */ 782db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák if (custom_blend) { 783db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák pipe->bind_blend_state(pipe, custom_blend); 784db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if (clear_buffers & PIPE_CLEAR_COLOR) { 78555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 786db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else { 78755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_keep_color); 788db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } 78955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 790db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák if (custom_dsa) { 791db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, custom_dsa); 792db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if ((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) { 7931a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 794db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if (clear_buffers & PIPE_CLEAR_DEPTH) { 795a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil); 796db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if (clear_buffers & PIPE_CLEAR_STENCIL) { 797a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 798db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else { 79955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 800db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } 801db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 802db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák sr.ref_value[0] = stencil & 0xff; 803db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák pipe->set_stencil_ref(pipe, &sr); 80455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 80555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 8064e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie if (util_format_is_pure_sint(cbuf_format)) { 8074e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie pipe->bind_vertex_elements_state(pipe, ctx->velem_sint_state); 8084e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie } else if (util_format_is_pure_uint(cbuf_format)) { 8094e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie pipe->bind_vertex_elements_state(pipe, ctx->velem_uint_state); 8104e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie } else { 8114e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 8124e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie } 8134e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, num_cbufs, int_format)); 8145d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 8154c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák if (ctx->has_geometry_shader) 8164c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák pipe->bind_gs_state(pipe, NULL); 81755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 8183bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák blitter_set_dst_dimensions(ctx, width, height); 8199be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, 0, 0, width, height, depth, 8206dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie UTIL_BLITTER_ATTRIB_COLOR, color); 821c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 822c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_vertex_states(ctx); 823c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fragment_states(ctx); 824c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_unset_running_flag(ctx); 82555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 82655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 827db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid util_blitter_clear(struct blitter_context *blitter, 828db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned width, unsigned height, 829db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned num_cbufs, 830db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned clear_buffers, 8314e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie enum pipe_format cbuf_format, 8326dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color, 833db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák double depth, unsigned stencil) 834db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák{ 835db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák util_blitter_clear_custom(blitter, width, height, num_cbufs, 8364e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie clear_buffers, cbuf_format, color, depth, stencil, 837db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák NULL, NULL); 838db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák} 839db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 840db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid util_blitter_clear_depth_custom(struct blitter_context *blitter, 841db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned width, unsigned height, 842db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák double depth, void *custom_dsa) 843db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák{ 8446dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie static const union pipe_color_union color; 845db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák util_blitter_clear_custom(blitter, width, height, 0, 8464e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie 0, PIPE_FORMAT_NONE, &color, depth, 0, NULL, custom_dsa); 847db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák} 848db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 849876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákstatic 850876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákboolean is_overlap(unsigned sx1, unsigned sx2, unsigned sy1, unsigned sy2, 851876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned dx1, unsigned dx2, unsigned dy1, unsigned dy2) 852deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie{ 853876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return sx1 < dx2 && sx2 > dx1 && sy1 < dy2 && sy2 > dy1; 854deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie} 855deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie 856ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšákvoid util_blitter_default_dst_texture(struct pipe_surface *dst_templ, 857ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák struct pipe_resource *dst, 858ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák unsigned dstlevel, 859ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák unsigned dstz, 860ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák const struct pipe_box *srcbox) 861ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák{ 862ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák memset(dst_templ, 0, sizeof(*dst_templ)); 863ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák dst_templ->format = dst->format; 864ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák if (util_format_is_depth_or_stencil(dst->format)) { 865ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák dst_templ->usage = PIPE_BIND_DEPTH_STENCIL; 866ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák } else { 867ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák dst_templ->usage = PIPE_BIND_RENDER_TARGET; 868ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák } 869ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák dst_templ->format = util_format_linear(dst->format); 870ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák dst_templ->u.tex.level = dstlevel; 871ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák dst_templ->u.tex.first_layer = dstz; 872ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák dst_templ->u.tex.last_layer = dstz + srcbox->depth - 1; 873ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák} 874ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák 875ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšákvoid util_blitter_default_src_texture(struct pipe_sampler_view *src_templ, 876ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák struct pipe_resource *src, 877ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák unsigned srclevel) 878ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák{ 879ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák memset(src_templ, 0, sizeof(*src_templ)); 880ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->format = util_format_linear(src->format); 881ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->u.tex.first_level = srclevel; 882ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->u.tex.last_level = srclevel; 883ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->u.tex.first_layer = 0; 884ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->u.tex.last_layer = 885ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src->target == PIPE_TEXTURE_3D ? src->depth0 - 1 886ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák : src->array_size - 1; 887ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->swizzle_r = PIPE_SWIZZLE_RED; 888ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->swizzle_g = PIPE_SWIZZLE_GREEN; 889ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->swizzle_b = PIPE_SWIZZLE_BLUE; 890ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->swizzle_a = PIPE_SWIZZLE_ALPHA; 891ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák} 892ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák 893233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšákvoid util_blitter_copy_texture(struct blitter_context *blitter, 894233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák struct pipe_resource *dst, 895233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák unsigned dstlevel, 896233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák unsigned dstx, unsigned dsty, unsigned dstz, 897233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák struct pipe_resource *src, 898233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák unsigned srclevel, 899233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák const struct pipe_box *srcbox, 900233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák boolean ignore_stencil) 90155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 90255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 9039b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 904876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_screen *screen = pipe->screen; 905ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák struct pipe_surface *dst_view, dst_templ; 906ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák struct pipe_sampler_view src_templ, *src_view; 907876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned bind; 908876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák boolean is_stencil, is_depth; 909876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 910876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Give up if textures are not set. */ 911876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák assert(dst && src); 912876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák if (!dst || !src) 913876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return; 914876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 915876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák assert(src->target < PIPE_MAX_TEXTURE_TYPES); 916876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 917876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Is this a ZS format? */ 918876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák is_depth = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 0) != 0; 919876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák is_stencil = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 1) != 0; 920876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 921876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák if (is_depth || is_stencil) 922876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák bind = PIPE_BIND_DEPTH_STENCIL; 923876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák else 924876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák bind = PIPE_BIND_RENDER_TARGET; 925876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 926876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Check if we can sample from and render to the surfaces. */ 927876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* (assuming copying a stencil buffer is not possible) */ 928cec2082ae515bc91e6b29084ba4b8deac28ef923Stéphane Marchesin if ((!ignore_stencil && is_stencil) || 929876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák !screen->is_format_supported(screen, dst->format, dst->target, 930e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák dst->nr_samples, bind) || 931876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák !screen->is_format_supported(screen, src->format, src->target, 932e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák src->nr_samples, PIPE_BIND_SAMPLER_VIEW)) { 93337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák blitter_set_running_flag(ctx); 9344c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger util_resource_copy_region(pipe, dst, dstlevel, dstx, dsty, dstz, 9354c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger src, srclevel, srcbox); 93637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák blitter_unset_running_flag(ctx); 937876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return; 938876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák } 939876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 94037b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák /* Initialize the surface. */ 941ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák util_blitter_default_dst_texture(&dst_templ, dst, dstlevel, dstz, srcbox); 942ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák dst_view = pipe->create_surface(pipe, dst, &dst_templ); 94355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 94437b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák /* Initialize the sampler view. */ 945ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák util_blitter_default_src_texture(&src_templ, src, srclevel); 946ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_view = pipe->create_sampler_view(pipe, src, &src_templ); 94737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák 94837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák /* Copy. */ 949ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák util_blitter_copy_texture_view(blitter, dst_view, dstx, dsty, src_view, 950ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák srcbox, src->width0, src->height0); 95137b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák 952ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák pipe_surface_reference(&dst_view, NULL); 953ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák pipe_sampler_view_reference(&src_view, NULL); 95437b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák} 95537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák 95637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšákvoid util_blitter_copy_texture_view(struct blitter_context *blitter, 95737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák struct pipe_surface *dst, 95837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák unsigned dstx, unsigned dsty, 95937b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák struct pipe_sampler_view *src, 96089ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák const struct pipe_box *srcbox, 96189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák unsigned src_width0, unsigned src_height0) 96237b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák{ 96337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 96437b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 96537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák struct pipe_framebuffer_state fb_state; 96637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák enum pipe_texture_target src_target = src->texture->target; 96737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák unsigned width = srcbox->width; 96837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák unsigned height = srcbox->height; 96937b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák 97037b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák /* Sanity checks. */ 97137b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák if (dst->texture == src->texture && 97237b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák dst->u.tex.level == src->u.tex.first_level) { 97337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák assert(!is_overlap(srcbox->x, srcbox->x + width, srcbox->y, srcbox->y + height, 97437b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák dstx, dstx + width, dsty, dsty + height)); 97537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák } 97637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák /* XXX should handle 3d regions */ 97737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák assert(srcbox->depth == 1); 97837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák 979876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Check whether the states are properly saved. */ 980c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_set_running_flag(ctx); 981c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_vertex_states(ctx); 982c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fragment_states(ctx); 983c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_textures(ctx); 984c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fb_state(ctx); 98555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 986876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Initialize framebuffer state. */ 98737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák fb_state.width = dst->width; 98837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák fb_state.height = dst->height; 98955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 99037b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák if (util_format_is_depth_or_stencil(dst->format)) { 99155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_keep_color); 99255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, 99355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil); 99485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, 99537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák blitter_get_fs_texfetch_depth(ctx, src_target)); 99655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 99755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 0; 99837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák fb_state.zsbuf = dst; 99955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } else { 100055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 100155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 100285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, 100337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák blitter_get_fs_texfetch_col(ctx, src_target)); 100455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 100555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 1; 100637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák fb_state.cbufs[0] = dst; 100755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.zsbuf = 0; 100855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 100985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 1010876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Set rasterizer state, shaders, and textures. */ 101155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 10125d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 10134c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák if (ctx->has_geometry_shader) 10144c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák pipe->bind_gs_state(pipe, NULL); 101537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák pipe->bind_fragment_sampler_states(pipe, 1, &ctx->sampler_state); 1016ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 101737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák pipe->set_fragment_sampler_views(pipe, 1, &src); 101855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 101955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 102037b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák blitter_set_dst_dimensions(ctx, dst->width, dst->height); 10219be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 102237b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák switch (src_target) { 10239be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw the quad with the draw_rectangle callback. */ 102455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák case PIPE_TEXTURE_1D: 102555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák case PIPE_TEXTURE_2D: 1026ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri case PIPE_TEXTURE_RECT: 10279be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák { 10286dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie /* Set texture coordinates. - use a pipe color union 102937b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák * for interface purposes. 103037b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák * XXX pipe_color_union is a wrong name since we use that to set 103137b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák * texture coordinates too. 10326dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie */ 10336dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie union pipe_color_union coord; 103489ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák get_texcoords(src, src_width0, src_height0, srcbox->x, srcbox->y, 103537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák srcbox->x+width, srcbox->y+height, coord.f); 10369be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 10379be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw. */ 10389be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0, 10396dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie UTIL_BLITTER_ATTRIB_TEXCOORD, &coord); 10409be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák } 104155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák break; 10429be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 10439be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw the quad with the generic codepath. */ 1044274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák default: 10459be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Set texture coordinates. */ 104637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák switch (src_target) { 1047274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák case PIPE_TEXTURE_1D_ARRAY: 1048274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák case PIPE_TEXTURE_2D_ARRAY: 1049274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák case PIPE_TEXTURE_3D: 1050274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák case PIPE_TEXTURE_CUBE: 105189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák blitter_set_texcoords(ctx, src, src_width0, src_height0, srcbox->z, 105289ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák srcbox->y, srcbox->x, 105389ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák srcbox->x + width, srcbox->y + height); 1054274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák break; 1055274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák 1056274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák default: 1057274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák assert(0); 1058274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák } 10599be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 1060900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák blitter_draw(ctx, dstx, dsty, dstx+width, dsty+height, 0); 106155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák break; 106255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 106355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1064c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_vertex_states(ctx); 1065c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fragment_states(ctx); 1066c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_textures(ctx); 1067c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fb_state(ctx); 1068c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_unset_running_flag(ctx); 106955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 107055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1071a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a color surface to a constant value. */ 1072a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_render_target(struct blitter_context *blitter, 1073a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger struct pipe_surface *dstsurf, 10746dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color, 1075a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned dstx, unsigned dsty, 1076a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned width, unsigned height) 107755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 107855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 10799b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 108055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct pipe_framebuffer_state fb_state; 108155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1082a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger assert(dstsurf->texture); 1083a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if (!dstsurf->texture) 108455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák return; 108555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 108655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* check the saved state */ 1087c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_set_running_flag(ctx); 1088c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_vertex_states(ctx); 1089c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fragment_states(ctx); 1090c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fb_state(ctx); 109155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1092c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* bind states */ 109355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 109455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 109555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 10964e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1, FALSE)); 10975d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 10984c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák if (ctx->has_geometry_shader) 10994c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák pipe->bind_gs_state(pipe, NULL); 1100ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 110155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 110255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set a framebuffer state */ 110359e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.width = dstsurf->width; 110459e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.height = dstsurf->height; 110555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 1; 110659e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.cbufs[0] = dstsurf; 110755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.zsbuf = 0; 110855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 110955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 11103bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 11119be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0, 11126dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie UTIL_BLITTER_ATTRIB_COLOR, color); 1113c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 1114c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_vertex_states(ctx); 1115c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fragment_states(ctx); 1116c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fb_state(ctx); 1117c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_unset_running_flag(ctx); 1118a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger} 111959e51d9640c242a7c919472d935a91889c7840c9Marek Olšák 1120a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a depth stencil surface. */ 1121a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_depth_stencil(struct blitter_context *blitter, 1122a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger struct pipe_surface *dstsurf, 1123a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned clear_flags, 1124a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger double depth, 1125a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned stencil, 1126a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned dstx, unsigned dsty, 1127a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned width, unsigned height) 1128a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger{ 1129a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 11309b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 1131a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct pipe_framebuffer_state fb_state; 1132a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct pipe_stencil_ref sr = { { 0 } }; 1133a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 1134a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger assert(dstsurf->texture); 1135a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if (!dstsurf->texture) 1136a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger return; 1137a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 1138a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* check the saved state */ 1139c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_set_running_flag(ctx); 1140c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_vertex_states(ctx); 1141c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fragment_states(ctx); 1142c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fb_state(ctx); 1143a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 1144c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* bind states */ 1145a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_blend_state(pipe, ctx->blend_keep_color); 1146a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if ((clear_flags & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) { 1147a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger sr.ref_value[0] = stencil & 0xff; 1148a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 1149a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_stencil_ref(pipe, &sr); 1150a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 1151a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else if (clear_flags & PIPE_CLEAR_DEPTH) { 1152a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil); 1153a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 1154a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else if (clear_flags & PIPE_CLEAR_STENCIL) { 1155a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger sr.ref_value[0] = stencil & 0xff; 1156a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 1157a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_stencil_ref(pipe, &sr); 1158a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 1159a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else 1160a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* hmm that should be illegal probably, or make it a no-op somewhere */ 1161a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 1162a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 1163a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_rasterizer_state(pipe, ctx->rs_state); 11644e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0, FALSE)); 11655d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 11664c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák if (ctx->has_geometry_shader) 11674c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák pipe->bind_gs_state(pipe, NULL); 1168a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 1169a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 1170a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* set a framebuffer state */ 1171a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.width = dstsurf->width; 1172a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.height = dstsurf->height; 1173a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.nr_cbufs = 0; 1174a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.cbufs[0] = 0; 1175a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.zsbuf = dstsurf; 1176a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_framebuffer_state(pipe, &fb_state); 1177a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 11783bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 11799be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, depth, 11809be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák UTIL_BLITTER_ATTRIB_NONE, NULL); 1181c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 1182c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_vertex_states(ctx); 1183c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fragment_states(ctx); 1184c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fb_state(ctx); 1185c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_unset_running_flag(ctx); 118655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 1187f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1188c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie/* draw a rectangle across a region using a custom dsa stage - for r600g */ 1189c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlievoid util_blitter_custom_depth_stencil(struct blitter_context *blitter, 1190c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie struct pipe_surface *zsurf, 1191c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie struct pipe_surface *cbsurf, 1192c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie void *dsa_stage, float depth) 1193f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák{ 1194f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 1195f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák struct pipe_context *pipe = ctx->base.pipe; 1196f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák struct pipe_framebuffer_state fb_state; 1197f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1198c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie assert(zsurf->texture); 1199c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie if (!zsurf->texture) 1200f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák return; 1201f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1202f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák /* check the saved state */ 1203c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_set_running_flag(ctx); 1204c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_vertex_states(ctx); 1205c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fragment_states(ctx); 1206c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fb_state(ctx); 1207f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1208c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* bind states */ 1209c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie pipe->bind_blend_state(pipe, ctx->blend_write_color); 1210c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie pipe->bind_depth_stencil_alpha_state(pipe, dsa_stage); 1211f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1212f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 12134e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0, FALSE)); 12145d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 12154c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák if (ctx->has_geometry_shader) 12164c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák pipe->bind_gs_state(pipe, NULL); 1217f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 1218f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1219f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák /* set a framebuffer state */ 1220c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.width = zsurf->width; 1221c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.height = zsurf->height; 1222c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.nr_cbufs = 1; 1223c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie if (cbsurf) { 1224c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.cbufs[0] = cbsurf; 1225c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.nr_cbufs = 1; 1226c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie } else { 1227c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.cbufs[0] = NULL; 1228c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.nr_cbufs = 0; 1229c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie } 1230c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.zsbuf = zsurf; 1231f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 1232f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1233c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie blitter_set_dst_dimensions(ctx, zsurf->width, zsurf->height); 1234c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie blitter->draw_rectangle(blitter, 0, 0, zsurf->width, zsurf->height, depth, 1235f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák UTIL_BLITTER_ATTRIB_NONE, NULL); 1236c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 1237c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_vertex_states(ctx); 1238c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fragment_states(ctx); 1239c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fb_state(ctx); 1240c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_unset_running_flag(ctx); 1241f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák} 124236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 124336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšákvoid util_blitter_copy_buffer(struct blitter_context *blitter, 124436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct pipe_resource *dst, 124536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák unsigned dstx, 124636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct pipe_resource *src, 124736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák unsigned srcx, 124836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák unsigned size) 124936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák{ 125036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 125136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct pipe_context *pipe = ctx->base.pipe; 125236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct pipe_vertex_buffer vb; 125336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct pipe_stream_output_target *so_target; 125436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 125559fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák if (srcx >= src->width0 || 125659fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák dstx >= dst->width0) { 125759fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák return; 125859fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák } 125959fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák if (srcx + size > src->width0) { 126059fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák size = src->width0 - srcx; 126159fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák } 126259fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák if (dstx + size > dst->width0) { 126359fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák size = dst->width0 - dstx; 126459fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák } 126559fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák 126636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák /* Drivers not capable of Stream Out should not call this function 126736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák * in the first place. */ 126836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák assert(ctx->has_stream_out); 126936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 127036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák /* Some alignment is required. */ 1271a0a9e56cfed1ab81c1068cffbfd9299f77c7e187Marek Olšák if (srcx % 4 != 0 || dstx % 4 != 0 || size % 4 != 0 || 127236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák !ctx->has_stream_out) { 127336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct pipe_box box; 127436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák u_box_1d(srcx, size, &box); 127536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák util_resource_copy_region(pipe, dst, 0, dstx, 0, 0, src, 0, &box); 127636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák return; 127736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák } 127836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 127936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák blitter_set_running_flag(ctx); 128036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák blitter_check_saved_vertex_states(ctx); 128136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 128236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák vb.buffer = src; 128336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák vb.buffer_offset = srcx; 128436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák vb.stride = 4; 128536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 128636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->set_vertex_buffers(pipe, 1, &vb); 128736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->bind_vertex_elements_state(pipe, ctx->velem_state_readbuf); 128836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->bind_vs_state(pipe, ctx->vs_pos_only); 128936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák if (ctx->has_geometry_shader) 129036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->bind_gs_state(pipe, NULL); 129136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_discard_state); 129236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 129336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák so_target = pipe->create_stream_output_target(pipe, dst, dstx, size); 129436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->set_stream_output_targets(pipe, 1, &so_target, 0); 129536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 1296a0a9e56cfed1ab81c1068cffbfd9299f77c7e187Marek Olšák util_draw_arrays(pipe, PIPE_PRIM_POINTS, 0, size / 4); 129736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 129836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák blitter_restore_vertex_states(ctx); 129936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák blitter_unset_running_flag(ctx); 130036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe_so_target_reference(&so_target, NULL); 130136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák} 1302