155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák/************************************************************************** 255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * 355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * Copyright 2009 Marek Olšák <maraeo@gmail.com> 455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * 555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * Permission is hereby granted, free of charge, to any person obtaining a 655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * copy of this software and associated documentation files (the 755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * "Software"), to deal in the Software without restriction, including 855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * without limitation the rights to use, copy, modify, merge, publish, 955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * distribute, sub license, and/or sell copies of the Software, and to 1055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * permit persons to whom the Software is furnished to do so, subject to 1155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * the following conditions: 1255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * 1355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * The above copyright notice and this permission notice (including the 1455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * next paragraph) shall be included in all copies or substantial portions 1555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * of the Software. 1655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * 1755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 1955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 2155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * 2555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák **************************************************************************/ 2655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 2755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák/** 2855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * @file 29363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák * Blitter utility to facilitate acceleration of the clear, clear_render_target, 30363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák * clear_depth_stencil, and resource_copy_region functions. 3155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * 3255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * @author Marek Olšák 3355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák */ 3455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "pipe/p_context.h" 3655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "pipe/p_defines.h" 3728486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 3855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "pipe/p_shader_tokens.h" 3955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "pipe/p_state.h" 4055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 41f874da422b1811c4cb5f700f424180793ea66d6fCorbin Simpson#include "util/u_format.h" 4255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_memory.h" 4355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_math.h" 4455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_blitter.h" 4555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_draw_quad.h" 46f6106566081978f663cf08e54bb8908cb58a5316Michal Krol#include "util/u_sampler.h" 4755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_simple_shaders.h" 488b0c217f2bc123bffd25cc4977d6abb1b3fa8186Brian Paul#include "util/u_surface.h" 4955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_texture.h" 50900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák#include "util/u_upload_mgr.h" 5155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 52a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák#define INVALID_PTR ((void*)~0) 53a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák 5455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context_priv 5555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 569b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct blitter_context base; 5755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 58900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák struct u_upload_mgr *upload; 5955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 6055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák float vertices[4][2][4]; /**< {pos, color} or {pos, texcoord} */ 6155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 6285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Templates for various state objects. */ 6385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 6455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Constant state objects. */ 6555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Vertex shaders. */ 665d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák void *vs; /**< Vertex shader which passes {pos, generic} to the output.*/ 6736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák void *vs_pos_only; /**< Vertex shader which passes pos to the output.*/ 6855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 6955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Fragment shaders. */ 70677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas /* The shader at index i outputs color to color buffers 0,1,...,i-1. */ 71677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas void *fs_col[PIPE_MAX_COLOR_BUFS+1]; 724e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie void *fs_col_int[PIPE_MAX_COLOR_BUFS+1]; 73ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 74ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák /* FS which outputs a color from a texture, 75ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák where the index is PIPE_TEXTURE_* to be sampled. */ 76ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák void *fs_texfetch_col[PIPE_MAX_TEXTURE_TYPES]; 77ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 78ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák /* FS which outputs a depth from a texture, 79ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák where the index is PIPE_TEXTURE_* to be sampled. */ 80ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák void *fs_texfetch_depth[PIPE_MAX_TEXTURE_TYPES]; 8112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák void *fs_texfetch_depthstencil[PIPE_MAX_TEXTURE_TYPES]; 82bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák void *fs_texfetch_stencil[PIPE_MAX_TEXTURE_TYPES]; 8355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 84825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák /* FS which outputs one sample from a multisample texture. */ 85825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák void *fs_texfetch_col_msaa[PIPE_MAX_TEXTURE_TYPES]; 86825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák void *fs_texfetch_depth_msaa[PIPE_MAX_TEXTURE_TYPES]; 87825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák void *fs_texfetch_depthstencil_msaa[PIPE_MAX_TEXTURE_TYPES]; 88825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák void *fs_texfetch_stencil_msaa[PIPE_MAX_TEXTURE_TYPES]; 89825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 9055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Blend state. */ 9155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *blend_write_color; /**< blend state with writemask of RGBA */ 9255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *blend_keep_color; /**< blend state with writemask of 0 */ 9355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 9455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Depth stencil alpha state. */ 951a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger void *dsa_write_depth_stencil; 9655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *dsa_write_depth_keep_stencil; 9755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *dsa_keep_depth_stencil; 98a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger void *dsa_keep_depth_write_stencil; 9955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 10036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák /* Vertex elements states. */ 101ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger void *velem_state; 1024e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie void *velem_uint_state; 1034e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie void *velem_sint_state; 10436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák void *velem_state_readbuf; 105ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger 10637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák /* Sampler state. */ 10737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák void *sampler_state; 108ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 109ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák /* Rasterizer state. */ 110ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák void *rs_state; 11136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák void *rs_discard_state; 112f6106566081978f663cf08e54bb8908cb58a5316Michal Krol 113932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* Viewport state. */ 114932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol struct pipe_viewport_state viewport; 115932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 1163bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák /* Destination surface dimensions. */ 1173bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák unsigned dst_width; 1183bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák unsigned dst_height; 1194c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák 1204c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák boolean has_geometry_shader; 121dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie boolean vertex_has_integers; 122b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák boolean has_stream_out; 12312fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák boolean has_stencil_export; 12455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}; 12555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1269be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 12755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context *util_blitter_create(struct pipe_context *pipe) 12855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 12955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx; 1300c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul struct pipe_blend_state blend; 1310c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul struct pipe_depth_stencil_alpha_state dsa; 1320c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul struct pipe_rasterizer_state rs_state; 13337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák struct pipe_sampler_state sampler_state; 134ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger struct pipe_vertex_element velem[2]; 13585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák unsigned i; 13655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 13755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx = CALLOC_STRUCT(blitter_context_priv); 13855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák if (!ctx) 13955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák return NULL; 14055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1419b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.pipe = pipe; 142187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák ctx->base.draw_rectangle = util_blitter_draw_rectangle; 14355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 14455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* init state objects for them to be considered invalid */ 1459b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_blend_state = INVALID_PTR; 1469b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_dsa_state = INVALID_PTR; 1479b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_rs_state = INVALID_PTR; 1489b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fs = INVALID_PTR; 1499b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_vs = INVALID_PTR; 1504c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák ctx->base.saved_gs = INVALID_PTR; 1519b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_velem_state = INVALID_PTR; 1529b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fb_state.nr_cbufs = ~0; 1539b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_views = ~0; 1549b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_states = ~0; 1559b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_vertex_buffers = ~0; 156b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák ctx->base.saved_num_so_targets = ~0; 15755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1584c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák ctx->has_geometry_shader = 1594c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák pipe->screen->get_shader_param(pipe->screen, PIPE_SHADER_GEOMETRY, 1604c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0; 161dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie ctx->vertex_has_integers = 1620f55f133f1e5b72e463441d2d388a1ec4deac1daMarek Olšák pipe->screen->get_shader_param(pipe->screen, PIPE_SHADER_VERTEX, 163dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie PIPE_SHADER_CAP_INTEGERS); 164b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák ctx->has_stream_out = 165b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák pipe->screen->get_param(pipe->screen, 166b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS) != 0; 1674c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák 16812fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák ctx->has_stencil_export = 16912fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák pipe->screen->get_param(pipe->screen, 17012fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák PIPE_CAP_SHADER_STENCIL_EXPORT); 17112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 17255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* blend state objects */ 1730c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul memset(&blend, 0, sizeof(blend)); 17455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->blend_keep_color = pipe->create_blend_state(pipe, &blend); 17555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 176eba1e2a44718bea398e49d496a78ee002c9922b8Roland Scheidegger blend.rt[0].colormask = PIPE_MASK_RGBA; 17755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->blend_write_color = pipe->create_blend_state(pipe, &blend); 17855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 17955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* depth stencil alpha state objects */ 1800c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul memset(&dsa, 0, sizeof(dsa)); 18155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_keep_depth_stencil = 1821a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 18355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 184f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák dsa.depth.enabled = 1; 185f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák dsa.depth.writemask = 1; 186f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák dsa.depth.func = PIPE_FUNC_ALWAYS; 18755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil = 1881a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 1891a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger 1901a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].enabled = 1; 1911a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].func = PIPE_FUNC_ALWAYS; 1921a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE; 1931a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE; 1941a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE; 1951a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].valuemask = 0xff; 1961a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].writemask = 0xff; 1971a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger ctx->dsa_write_depth_stencil = 1981a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 199a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 200a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger dsa.depth.enabled = 0; 201a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger dsa.depth.writemask = 0; 202a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger ctx->dsa_keep_depth_write_stencil = 203a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 20455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 20555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* sampler state */ 20637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák memset(&sampler_state, 0, sizeof(sampler_state)); 20737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák sampler_state.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 20837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák sampler_state.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 20937b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák sampler_state.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 21037b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák sampler_state.normalized_coords = 1; 21137b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák ctx->sampler_state = pipe->create_sampler_state(pipe, &sampler_state); 21255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 21355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* rasterizer state */ 21455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák memset(&rs_state, 0, sizeof(rs_state)); 2150bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell rs_state.cull_face = PIPE_FACE_NONE; 21655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák rs_state.gl_rasterization_rules = 1; 2171c75edf3e8ccc97f5f91f42f99c1f8db30b25fc4Corbin Simpson rs_state.flatshade = 1; 218dc4c821f0817a3db716f965692fb701079f66340Marek Olšák rs_state.depth_clip = 1; 21955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->rs_state = pipe->create_rasterizer_state(pipe, &rs_state); 22055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 22136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák if (ctx->has_stream_out) { 22236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák rs_state.rasterizer_discard = 1; 22336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák ctx->rs_discard_state = pipe->create_rasterizer_state(pipe, &rs_state); 22436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák } 22536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 22636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák /* vertex elements states */ 227ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger memset(&velem[0], 0, sizeof(velem[0]) * 2); 228ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger for (i = 0; i < 2; i++) { 229ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].src_offset = i * 4 * sizeof(float); 230ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 231ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger } 232ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger ctx->velem_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]); 233ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger 234dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie if (ctx->vertex_has_integers) { 235dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie memset(&velem[0], 0, sizeof(velem[0]) * 2); 2369e66b25880febecb529582c6ead920637d73f51eDave Airlie velem[0].src_offset = 0; 2379e66b25880febecb529582c6ead920637d73f51eDave Airlie velem[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 2389e66b25880febecb529582c6ead920637d73f51eDave Airlie velem[1].src_offset = 4 * sizeof(float); 2399e66b25880febecb529582c6ead920637d73f51eDave Airlie velem[1].src_format = PIPE_FORMAT_R32G32B32A32_SINT; 240dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie ctx->velem_sint_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]); 241dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie 242dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie memset(&velem[0], 0, sizeof(velem[0]) * 2); 2439e66b25880febecb529582c6ead920637d73f51eDave Airlie velem[0].src_offset = 0; 2449e66b25880febecb529582c6ead920637d73f51eDave Airlie velem[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 2459e66b25880febecb529582c6ead920637d73f51eDave Airlie velem[1].src_offset = 4 * sizeof(float); 2469e66b25880febecb529582c6ead920637d73f51eDave Airlie velem[1].src_format = PIPE_FORMAT_R32G32B32A32_UINT; 247dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie ctx->velem_uint_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]); 2484e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie } 249dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie 25036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák if (ctx->has_stream_out) { 251a0a9e56cfed1ab81c1068cffbfd9299f77c7e187Marek Olšák velem[0].src_format = PIPE_FORMAT_R32_UINT; 25236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák ctx->velem_state_readbuf = pipe->create_vertex_elements_state(pipe, 1, &velem[0]); 25336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák } 25436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 25585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* fragment shaders are created on-demand */ 25685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 25736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák /* vertex shaders */ 25855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák { 25955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const uint semantic_names[] = { TGSI_SEMANTIC_POSITION, 26055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák TGSI_SEMANTIC_GENERIC }; 26155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const uint semantic_indices[] = { 0, 0 }; 2625d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák ctx->vs = 26355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák util_make_vertex_passthrough_shader(pipe, 2, semantic_names, 26455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák semantic_indices); 26555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 26636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák if (ctx->has_stream_out) { 26736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct pipe_stream_output_info so; 26836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák const uint semantic_names[] = { TGSI_SEMANTIC_POSITION }; 26936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák const uint semantic_indices[] = { 0 }; 27036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 27136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák memset(&so, 0, sizeof(so)); 27236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák so.num_outputs = 1; 273a0a9e56cfed1ab81c1068cffbfd9299f77c7e187Marek Olšák so.output[0].num_components = 1; 274a0a9e56cfed1ab81c1068cffbfd9299f77c7e187Marek Olšák so.stride[0] = 1; 27536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 27636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák ctx->vs_pos_only = 27736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák util_make_vertex_passthrough_shader_with_so(pipe, 1, semantic_names, 27836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák semantic_indices, &so); 27936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák } 28055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 28155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set invariant vertex coordinates */ 28255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 28355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][0][3] = 1; /*v.w*/ 28455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 2857864933acd81892be0692555ae6d37d4293adb2aMarek Olšák ctx->upload = u_upload_create(pipe, 65536, 4, PIPE_BIND_VERTEX_BUFFER); 28655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 2879b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák return &ctx->base; 28855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 28955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 29055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_destroy(struct blitter_context *blitter) 29155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 29255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 2939b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = blitter->pipe; 29455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 29555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 29655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_blend_state(pipe, ctx->blend_write_color); 29755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_blend_state(pipe, ctx->blend_keep_color); 29855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 29955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_depth_stencil_alpha_state(pipe, 30055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil); 3011a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 302a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 3036a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson 30455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_rasterizer_state(pipe, ctx->rs_state); 30536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák if (ctx->rs_discard_state) 30636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->delete_rasterizer_state(pipe, ctx->rs_discard_state); 3075d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->delete_vs_state(pipe, ctx->vs); 30836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák if (ctx->vs_pos_only) 30936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->delete_vs_state(pipe, ctx->vs_pos_only); 310ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->delete_vertex_elements_state(pipe, ctx->velem_state); 311dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie if (ctx->vertex_has_integers) { 312dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie pipe->delete_vertex_elements_state(pipe, ctx->velem_sint_state); 313dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie pipe->delete_vertex_elements_state(pipe, ctx->velem_uint_state); 314dd20256a1c1566f11e1fa970028f3bb4f05445b7Dave Airlie } 31536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák if (ctx->velem_state_readbuf) 31636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->delete_vertex_elements_state(pipe, ctx->velem_state_readbuf); 31755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 318ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák for (i = 0; i < PIPE_MAX_TEXTURE_TYPES; i++) { 31985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_texfetch_col[i]) 32085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_texfetch_col[i]); 32185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_texfetch_depth[i]) 32285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_texfetch_depth[i]); 32312fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák if (ctx->fs_texfetch_depthstencil[i]) 32412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák pipe->delete_fs_state(pipe, ctx->fs_texfetch_depthstencil[i]); 325bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák if (ctx->fs_texfetch_stencil[i]) 326bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák pipe->delete_fs_state(pipe, ctx->fs_texfetch_stencil[i]); 32755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 328ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 3294e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie for (i = 0; i <= PIPE_MAX_COLOR_BUFS; i++) { 33085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_col[i]) 33185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_col[i]); 3324e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie if (ctx->fs_col_int[i]) 3334e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie pipe->delete_fs_state(pipe, ctx->fs_col_int[i]); 3344e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie } 33555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 33637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák pipe->delete_sampler_state(pipe, ctx->sampler_state); 337900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák u_upload_destroy(ctx->upload); 33855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák FREE(ctx); 33955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 34055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 341c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_set_running_flag(struct blitter_context_priv *ctx) 34255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 343ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák if (ctx->base.running) { 344c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák _debug_printf("u_blitter:%i: Caught recursion. This is a driver bug.\n", 345c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák __LINE__); 3469a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák } 347ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák ctx->base.running = TRUE; 348c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 3499a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák 350c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_unset_running_flag(struct blitter_context_priv *ctx) 351c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 352c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák if (!ctx->base.running) { 353c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák _debug_printf("u_blitter:%i: Caught recursion. This is a driver bug.\n", 354c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák __LINE__); 355c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák } 356c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.running = FALSE; 357c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 358c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 359c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_check_saved_vertex_states(struct blitter_context_priv *ctx) 360c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 3619e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_num_vertex_buffers != ~0); 3629e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_velem_state != INVALID_PTR); 3639e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_vs != INVALID_PTR); 3649e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(!ctx->has_geometry_shader || ctx->base.saved_gs != INVALID_PTR); 3659e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(!ctx->has_stream_out || ctx->base.saved_num_so_targets != ~0); 3669e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_rs_state != INVALID_PTR); 36755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 36855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 369c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_restore_vertex_states(struct blitter_context_priv *ctx) 37055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 3719b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 3728f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák unsigned i; 37355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 374c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Vertex buffers. */ 375c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->set_vertex_buffers(pipe, 376c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_vertex_buffers, 377c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_vertex_buffers); 378c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 379c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák for (i = 0; i < ctx->base.saved_num_vertex_buffers; i++) { 380c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák if (ctx->base.saved_vertex_buffers[i].buffer) { 381c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe_resource_reference(&ctx->base.saved_vertex_buffers[i].buffer, 382c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák NULL); 383c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák } 384c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák } 385c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_vertex_buffers = ~0; 386c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 387c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Vertex elements. */ 3889b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_vertex_elements_state(pipe, ctx->base.saved_velem_state); 389c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_velem_state = INVALID_PTR; 39055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 391c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Vertex shader. */ 392c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->bind_vs_state(pipe, ctx->base.saved_vs); 3939b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_vs = INVALID_PTR; 39455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3954c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák /* Geometry shader. */ 3964c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák if (ctx->has_geometry_shader) { 3974c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák pipe->bind_gs_state(pipe, ctx->base.saved_gs); 3984c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák ctx->base.saved_gs = INVALID_PTR; 3994c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák } 400363295d7209636c56ee0cb1246915b03b7f73524Marek Olšák 401b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák /* Stream outputs. */ 402b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák if (ctx->has_stream_out) { 403b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák pipe->set_stream_output_targets(pipe, 404b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák ctx->base.saved_num_so_targets, 405b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák ctx->base.saved_so_targets, ~0); 406b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák 407b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák for (i = 0; i < ctx->base.saved_num_so_targets; i++) 408b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák pipe_so_target_reference(&ctx->base.saved_so_targets[i], NULL); 409b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák 410b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák ctx->base.saved_num_so_targets = ~0; 411b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák } 412b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák 413c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Rasterizer. */ 414c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->bind_rasterizer_state(pipe, ctx->base.saved_rs_state); 415c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_rs_state = INVALID_PTR; 416c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 417c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 418c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_check_saved_fragment_states(struct blitter_context_priv *ctx) 419c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 4209e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_fs != INVALID_PTR); 4219e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_dsa_state != INVALID_PTR); 4229e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_blend_state != INVALID_PTR); 423c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 424c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 425c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_restore_fragment_states(struct blitter_context_priv *ctx) 426c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 427c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 428c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 429c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Fragment shader. */ 430c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->bind_fs_state(pipe, ctx->base.saved_fs); 431c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_fs = INVALID_PTR; 432c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 433c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Depth, stencil, alpha. */ 434c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->base.saved_dsa_state); 435c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_dsa_state = INVALID_PTR; 436c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 437c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Blend state. */ 438c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->bind_blend_state(pipe, ctx->base.saved_blend_state); 439c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_blend_state = INVALID_PTR; 440c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 4416c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák /* Sample mask. */ 4426c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák if (ctx->base.is_sample_mask_saved) { 4436c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák pipe->set_sample_mask(pipe, ctx->base.saved_sample_mask); 4446c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák ctx->base.is_sample_mask_saved = FALSE; 4456c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák } 4466c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák 447c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Miscellaneous states. */ 448c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* XXX check whether these are saved and whether they need to be restored 449c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * (depending on the operation) */ 4509b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_stencil_ref(pipe, &ctx->base.saved_stencil_ref); 4519b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_viewport_state(pipe, &ctx->base.saved_viewport); 452c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 453932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 454c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_check_saved_fb_state(struct blitter_context_priv *ctx) 455c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 456c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák assert(ctx->base.saved_fb_state.nr_cbufs != ~0); 457c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 45855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 459c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_restore_fb_state(struct blitter_context_priv *ctx) 460c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 461c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 462c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 463c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->set_framebuffer_state(pipe, &ctx->base.saved_fb_state); 464c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák util_unreference_framebuffer_state(&ctx->base.saved_fb_state); 465c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 46655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 467c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_check_saved_textures(struct blitter_context_priv *ctx) 468c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 4699e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_num_sampler_states != ~0); 4709e68a8fa728c5d737a8b0c66aba066afddd67e9aBrian Paul assert(ctx->base.saved_num_sampler_views != ~0); 471c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák} 4720b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák 473c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšákstatic void blitter_restore_textures(struct blitter_context_priv *ctx) 474c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák{ 475c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 476c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák unsigned i; 4770b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák 478c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Fragment sampler states. */ 479c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->bind_fragment_sampler_states(pipe, 480c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_sampler_states, 481c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_sampler_states); 482c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_sampler_states = ~0; 48364aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri 484c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* Fragment sampler views. */ 485c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe->set_fragment_sampler_views(pipe, 486c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_sampler_views, 487c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_sampler_views); 4888f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák 489c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák for (i = 0; i < ctx->base.saved_num_sampler_views; i++) 490c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák pipe_sampler_view_reference(&ctx->base.saved_sampler_views[i], NULL); 4919a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák 492c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák ctx->base.saved_num_sampler_views = ~0; 49355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 49455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 49555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_rectangle(struct blitter_context_priv *ctx, 49655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 49755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x2, unsigned y2, 49855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák float depth) 49955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 50055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 50155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 50255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set vertex positions */ 5033bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[0][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v0.x*/ 5043bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[0][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v0.y*/ 50555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 5063bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[1][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v1.x*/ 5073bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[1][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v1.y*/ 50855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 5093bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[2][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v2.x*/ 5103bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[2][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v2.y*/ 51155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 5123bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[3][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v3.x*/ 5133bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[3][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v3.y*/ 51455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 51555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 51655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][0][2] = depth; /*z*/ 517932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 518932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* viewport */ 5193bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.scale[0] = 0.5f * ctx->dst_width; 5203bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.scale[1] = 0.5f * ctx->dst_height; 521ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák ctx->viewport.scale[2] = 1.0f; 522932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->viewport.scale[3] = 1.0f; 5233bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.translate[0] = 0.5f * ctx->dst_width; 5243bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.translate[1] = 0.5f * ctx->dst_height; 525ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák ctx->viewport.translate[2] = 0.0f; 526932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->viewport.translate[3] = 0.0f; 5279b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.pipe->set_viewport_state(ctx->base.pipe, &ctx->viewport); 52855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 52955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 53055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_clear_color(struct blitter_context_priv *ctx, 5316dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color) 53255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 53355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 53455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 5356dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie if (color) { 53616d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák for (i = 0; i < 4; i++) { 5374e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie uint32_t *uiverts = (uint32_t *)ctx->vertices[i][1]; 5384e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie uiverts[0] = color->ui[0]; 5394e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie uiverts[1] = color->ui[1]; 5404e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie uiverts[2] = color->ui[2]; 5414e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie uiverts[3] = color->ui[3]; 54216d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák } 543fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák } else { 54416d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák for (i = 0; i < 4; i++) { 54516d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][0] = 0; 54616d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][1] = 0; 54716d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][2] = 0; 54816d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][3] = 0; 54916d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák } 55055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 55155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 55255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 55337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšákstatic void get_texcoords(struct pipe_sampler_view *src, 55489ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák unsigned src_width0, unsigned src_height0, 5554c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned x1, unsigned y1, 5564c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned x2, unsigned y2, 55737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák float out[4]) 558749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{ 55937b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák struct pipe_resource *tex = src->texture; 56037b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák unsigned level = src->u.tex.first_level; 561825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák boolean normalized = tex->target != PIPE_TEXTURE_RECT && 562825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák tex->nr_samples <= 1; 56337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák 56437b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák if (normalized) { 56589ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák out[0] = x1 / (float)u_minify(src_width0, level); 56689ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák out[1] = y1 / (float)u_minify(src_height0, level); 56789ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák out[2] = x2 / (float)u_minify(src_width0, level); 56889ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák out[3] = y2 / (float)u_minify(src_height0, level); 56937b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák } else { 570d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[0] = x1; 571d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[1] = y1; 572d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[2] = x2; 573d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[3] = y2; 574d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri } 575749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák} 576749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák 577749e24521a31178d2b647aa2954c3eecd597b799Marek Olšákstatic void set_texcoords_in_vertices(const float coord[4], 578749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák float *out, unsigned stride) 579749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{ 580749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[0]; /*t0.s*/ 581749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[1]; /*t0.t*/ 582749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out += stride; 583749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[2]; /*t1.s*/ 584749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[1]; /*t1.t*/ 585749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out += stride; 586749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[2]; /*t2.s*/ 587749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[3]; /*t2.t*/ 588749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out += stride; 589749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[0]; /*t3.s*/ 590749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[3]; /*t3.t*/ 591749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák} 592749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák 59389ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšákstatic void blitter_set_texcoords(struct blitter_context_priv *ctx, 59489ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák struct pipe_sampler_view *src, 59589ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák unsigned src_width0, unsigned src_height0, 596825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned layer, unsigned sample, 59789ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák unsigned x1, unsigned y1, 59889ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák unsigned x2, unsigned y2) 59955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 600749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák unsigned i; 601749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák float coord[4]; 60289ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák float face_coord[4][2]; 60355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 60489ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák get_texcoords(src, src_width0, src_height0, x1, y1, x2, y2, coord); 60555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 60689ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák if (src->texture->target == PIPE_TEXTURE_CUBE) { 60789ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák set_texcoords_in_vertices(coord, &face_coord[0][0], 2); 60889ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák util_map_texcoords2d_onto_cubemap(layer, 60989ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák /* pointer, stride in floats */ 61089ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák &face_coord[0][0], 2, 61189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák &ctx->vertices[0][1][0], 8); 61289ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák } else { 61389ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák set_texcoords_in_vertices(coord, &ctx->vertices[0][1][0], 8); 61455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 615274768856dc2b6d3dea254383199366bb4cd3cbcMarek Olšák 61689ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák /* Set the layer. */ 61789ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák switch (src->texture->target) { 61889ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák case PIPE_TEXTURE_3D: 61989ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák { 62089ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák float r = layer / (float)u_minify(src->texture->depth0, 62189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák src->u.tex.first_level); 62289ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák for (i = 0; i < 4; i++) 62389ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák ctx->vertices[i][1][2] = r; /*r*/ 62489ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák } 62589ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák break; 626d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul 62789ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák case PIPE_TEXTURE_1D_ARRAY: 62889ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák for (i = 0; i < 4; i++) 62989ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák ctx->vertices[i][1][1] = layer; /*t*/ 63089ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák break; 63155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 63289ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák case PIPE_TEXTURE_2D_ARRAY: 633825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák for (i = 0; i < 4; i++) { 634825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák ctx->vertices[i][1][2] = layer; /*r*/ 635825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák ctx->vertices[i][1][3] = sample; /*q*/ 636825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 637825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák break; 638825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 639825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák case PIPE_TEXTURE_2D: 640825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák for (i = 0; i < 4; i++) { 641825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák ctx->vertices[i][1][2] = sample; /*r*/ 642825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 64389ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák break; 64455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 64589ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák default:; 64689ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák } 64755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 64855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 6493bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákstatic void blitter_set_dst_dimensions(struct blitter_context_priv *ctx, 6503bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák unsigned width, unsigned height) 6513bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák{ 6523bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->dst_width = width; 6533bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->dst_height = height; 6543bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák} 6553bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák 65685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 6574e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlievoid *blitter_get_fs_col(struct blitter_context_priv *ctx, unsigned num_cbufs, 6584e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie boolean int_format) 65985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 6609b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 66185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 66285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(num_cbufs <= PIPE_MAX_COLOR_BUFS); 66385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 6644e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie if (int_format) { 6654e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie if (!ctx->fs_col_int[num_cbufs]) 6664e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie ctx->fs_col_int[num_cbufs] = 6674e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie util_make_fragment_cloneinput_shader(pipe, num_cbufs, 6684e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie TGSI_SEMANTIC_GENERIC, 6694e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie TGSI_INTERPOLATE_CONSTANT); 6704e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie return ctx->fs_col_int[num_cbufs]; 6714e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie } else { 6724e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie if (!ctx->fs_col[num_cbufs]) 6734e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie ctx->fs_col[num_cbufs] = 6744e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie util_make_fragment_cloneinput_shader(pipe, num_cbufs, 6754e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie TGSI_SEMANTIC_GENERIC, 6764e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie TGSI_INTERPOLATE_LINEAR); 6774e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie return ctx->fs_col[num_cbufs]; 6784e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie } 67985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 68085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 68185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 68285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_col(struct blitter_context_priv *ctx, 683825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák struct pipe_resource *tex) 68485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 6859b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 68685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 687825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák assert(tex->target < PIPE_MAX_TEXTURE_TYPES); 68885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 689825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if (tex->nr_samples > 1) { 690825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák void **shader = &ctx->fs_texfetch_col_msaa[tex->target]; 691d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 692825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák /* Create the fragment shader on-demand. */ 693825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if (!*shader) { 694825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(tex->target, 695825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák tex->nr_samples); 696825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 697825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák *shader = util_make_fs_blit_msaa_color(pipe, tgsi_tex); 698825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 699825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 700825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák return *shader; 701825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } else { 702825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák void **shader = &ctx->fs_texfetch_col[tex->target]; 70385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 704825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák /* Create the fragment shader on-demand. */ 705825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if (!*shader) { 706825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(tex->target, 0); 707825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 708825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák *shader = 709825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák util_make_fragment_tex_shader(pipe, tgsi_tex, 710825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák TGSI_INTERPOLATE_LINEAR); 711825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 712825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 713825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák return *shader; 714825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 71585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 71685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 71785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 71885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_depth(struct blitter_context_priv *ctx, 719825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák struct pipe_resource *tex) 72085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 7219b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 72285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 723825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák assert(tex->target < PIPE_MAX_TEXTURE_TYPES); 72485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 725825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if (tex->nr_samples > 1) { 726825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák void **shader = &ctx->fs_texfetch_depth_msaa[tex->target]; 727d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 728825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák /* Create the fragment shader on-demand. */ 729825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if (!*shader) { 730825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(tex->target, 731825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák tex->nr_samples); 732825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 733825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák *shader = 734825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák util_make_fs_blit_msaa_depth(pipe, tgsi_tex); 735825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 73685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 737825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák return *shader; 738825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } else { 739825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák void **shader = &ctx->fs_texfetch_depth[tex->target]; 740825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 741825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák /* Create the fragment shader on-demand. */ 742825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if (!*shader) { 743825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(tex->target, 0); 744825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 745825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák *shader = 746825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák util_make_fragment_tex_shader_writedepth(pipe, tgsi_tex, 747825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák TGSI_INTERPOLATE_LINEAR); 748825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 749825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 750825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák return *shader; 751825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 75285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 75385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 75412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšákstatic INLINE 75512fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšákvoid *blitter_get_fs_texfetch_depthstencil(struct blitter_context_priv *ctx, 756825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák struct pipe_resource *tex) 75712fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák{ 75812fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák struct pipe_context *pipe = ctx->base.pipe; 75912fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 760825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák assert(tex->target < PIPE_MAX_TEXTURE_TYPES); 76112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 762825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if (tex->nr_samples > 1) { 763825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák void **shader = &ctx->fs_texfetch_depthstencil_msaa[tex->target]; 76412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 765825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák /* Create the fragment shader on-demand. */ 766825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if (!*shader) { 767825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(tex->target, 768825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák tex->nr_samples); 769825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 770825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák *shader = 771825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák util_make_fs_blit_msaa_depthstencil(pipe, tgsi_tex); 772825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 77312fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 774825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák return *shader; 775825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } else { 776825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák void **shader = &ctx->fs_texfetch_depthstencil[tex->target]; 777825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 778825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák /* Create the fragment shader on-demand. */ 779825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if (!*shader) { 780825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(tex->target, 0); 781825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 782825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák *shader = 783825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák util_make_fragment_tex_shader_writedepthstencil(pipe, tgsi_tex, 784825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák TGSI_INTERPOLATE_LINEAR); 785825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 786825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 787825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák return *shader; 788825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 78912fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák} 79012fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 791bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšákstatic INLINE 792bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšákvoid *blitter_get_fs_texfetch_stencil(struct blitter_context_priv *ctx, 793825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák struct pipe_resource *tex) 794bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák{ 795bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák struct pipe_context *pipe = ctx->base.pipe; 796bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák 797825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák assert(tex->target < PIPE_MAX_TEXTURE_TYPES); 798bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák 799825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if (tex->nr_samples > 1) { 800825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák void **shader = &ctx->fs_texfetch_stencil_msaa[tex->target]; 801bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák 802825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák /* Create the fragment shader on-demand. */ 803825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if (!*shader) { 804825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(tex->target, 805825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák tex->nr_samples); 806bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák 807825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák *shader = 808825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák util_make_fs_blit_msaa_stencil(pipe, tgsi_tex); 809825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 810825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 811825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák return *shader; 812825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } else { 813825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák void **shader = &ctx->fs_texfetch_stencil[tex->target]; 814825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 815825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák /* Create the fragment shader on-demand. */ 816825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if (!*shader) { 817825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(tex->target, 0); 818825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 819825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák *shader = 820825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák util_make_fragment_tex_shader_writestencil(pipe, tgsi_tex, 821825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák TGSI_INTERPOLATE_LINEAR); 822825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 823825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 824825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák return *shader; 825825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } 826bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák} 827bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák 8281f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšákstatic void blitter_set_common_draw_rect_state(struct blitter_context_priv *ctx) 8291f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák{ 8301f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 8311f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák 8321f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 8331f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 8341f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák if (ctx->has_geometry_shader) 8351f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák pipe->bind_gs_state(pipe, NULL); 8361f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák if (ctx->has_stream_out) 8371f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák pipe->set_stream_output_targets(pipe, 0, NULL, 0); 8381f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák} 8391f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák 840900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšákstatic void blitter_draw(struct blitter_context_priv *ctx, 841900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák unsigned x1, unsigned y1, 842900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák unsigned x2, unsigned y2, 843900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák float depth) 844900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák{ 845900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák struct pipe_resource *buf = NULL; 846900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák unsigned offset = 0; 847900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák 848900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák blitter_set_rectangle(ctx, x1, y1, x2, y2, depth); 849900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák 850900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák u_upload_data(ctx->upload, 0, sizeof(ctx->vertices), ctx->vertices, 851900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák &offset, &buf); 852900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák u_upload_unmap(ctx->upload); 853900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák util_draw_vertex_buffer(ctx->base.pipe, NULL, buf, offset, 854900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák PIPE_PRIM_TRIANGLE_FAN, 4, 2); 8557622496d7b8fb4677a66d8843c078b3fa753f02fMarek Olšák pipe_resource_reference(&buf, NULL); 856900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák} 857900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák 858187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšákvoid util_blitter_draw_rectangle(struct blitter_context *blitter, 859187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák unsigned x1, unsigned y1, 860187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák unsigned x2, unsigned y2, 861187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák float depth, 862187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák enum blitter_attrib_type type, 863187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák const union pipe_color_union *attrib) 8649be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák{ 8659be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 8669be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 8679be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák switch (type) { 8689be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák case UTIL_BLITTER_ATTRIB_COLOR: 8699be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_clear_color(ctx, attrib); 8709be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák break; 8719be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 8729be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák case UTIL_BLITTER_ATTRIB_TEXCOORD: 8736dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie set_texcoords_in_vertices(attrib->f, &ctx->vertices[0][1][0], 8); 8749be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák break; 8759be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 8769be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák default:; 8779be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák } 8789be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 879900be21e0943d417a5d149e5b3c2635cb7cc90f9Marek Olšák blitter_draw(ctx, x1, y1, x2, y2, depth); 8809be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák} 8819be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 882db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákstatic void util_blitter_clear_custom(struct blitter_context *blitter, 883db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned width, unsigned height, 884db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned num_cbufs, 885db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned clear_buffers, 8864e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie enum pipe_format cbuf_format, 8876dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color, 888db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák double depth, unsigned stencil, 889db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák void *custom_blend, void *custom_dsa) 89055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 89155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 8929b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 8936a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson struct pipe_stencil_ref sr = { { 0 } }; 8944e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie boolean int_format = util_format_is_pure_integer(cbuf_format); 895ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák assert(num_cbufs <= PIPE_MAX_COLOR_BUFS); 89655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 897c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_set_running_flag(ctx); 898c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_vertex_states(ctx); 899c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fragment_states(ctx); 90055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 901c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* bind states */ 902db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák if (custom_blend) { 903db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák pipe->bind_blend_state(pipe, custom_blend); 904db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if (clear_buffers & PIPE_CLEAR_COLOR) { 90555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 906db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else { 90755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_keep_color); 908db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } 90955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 910db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák if (custom_dsa) { 911db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, custom_dsa); 912db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if ((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) { 9131a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 914db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if (clear_buffers & PIPE_CLEAR_DEPTH) { 915a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil); 916db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if (clear_buffers & PIPE_CLEAR_STENCIL) { 917a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 918db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else { 91955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 920db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } 921db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 922db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák sr.ref_value[0] = stencil & 0xff; 923db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák pipe->set_stencil_ref(pipe, &sr); 92455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 9254e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie if (util_format_is_pure_sint(cbuf_format)) { 9264e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie pipe->bind_vertex_elements_state(pipe, ctx->velem_sint_state); 9274e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie } else if (util_format_is_pure_uint(cbuf_format)) { 9284e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie pipe->bind_vertex_elements_state(pipe, ctx->velem_uint_state); 9294e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie } else { 9304e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 9314e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie } 9324e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, num_cbufs, int_format)); 9336c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák pipe->set_sample_mask(pipe, ~0); 93455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 9351f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák blitter_set_common_draw_rect_state(ctx); 9363bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák blitter_set_dst_dimensions(ctx, width, height); 9379be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, 0, 0, width, height, depth, 9386dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie UTIL_BLITTER_ATTRIB_COLOR, color); 939c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 940c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_vertex_states(ctx); 941c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fragment_states(ctx); 942c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_unset_running_flag(ctx); 94355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 94455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 945db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid util_blitter_clear(struct blitter_context *blitter, 946db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned width, unsigned height, 947db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned num_cbufs, 948db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned clear_buffers, 9494e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie enum pipe_format cbuf_format, 9506dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color, 951db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák double depth, unsigned stencil) 952db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák{ 953db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák util_blitter_clear_custom(blitter, width, height, num_cbufs, 9544e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie clear_buffers, cbuf_format, color, depth, stencil, 955db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák NULL, NULL); 956db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák} 957db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 958e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšákvoid util_blitter_custom_clear_depth(struct blitter_context *blitter, 959db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned width, unsigned height, 960db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák double depth, void *custom_dsa) 961db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák{ 9626dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie static const union pipe_color_union color; 963db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák util_blitter_clear_custom(blitter, width, height, 0, 9644e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie 0, PIPE_FORMAT_NONE, &color, depth, 0, NULL, custom_dsa); 965db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák} 966db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 967876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákstatic 968dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšákboolean is_overlap(unsigned dstx, unsigned dsty, unsigned dstz, 969dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák const struct pipe_box *srcbox) 970deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie{ 971dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák struct pipe_box src = *srcbox; 972dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák 973dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák if (src.width < 0) { 974dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák src.x += src.width; 975dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák src.width = -src.width; 976dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák } 977dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák if (src.height < 0) { 978dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák src.y += src.height; 979dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák src.height = -src.height; 980dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák } 981dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák if (src.depth < 0) { 982dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák src.z += src.depth; 983dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák src.depth = -src.depth; 984dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák } 985dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák return src.x < dstx+src.width && src.x+src.width > dstx && 986dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák src.y < dsty+src.height && src.y+src.height > dsty && 987dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák src.z < dstz+src.depth && src.z+src.depth > dstz; 988deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie} 989deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie 990ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšákvoid util_blitter_default_dst_texture(struct pipe_surface *dst_templ, 991ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák struct pipe_resource *dst, 992ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák unsigned dstlevel, 993ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák unsigned dstz, 994ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák const struct pipe_box *srcbox) 995ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák{ 996ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák memset(dst_templ, 0, sizeof(*dst_templ)); 997ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák dst_templ->format = dst->format; 998ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák if (util_format_is_depth_or_stencil(dst->format)) { 999ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák dst_templ->usage = PIPE_BIND_DEPTH_STENCIL; 1000ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák } else { 1001ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák dst_templ->usage = PIPE_BIND_RENDER_TARGET; 1002ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák } 1003ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák dst_templ->format = util_format_linear(dst->format); 1004ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák dst_templ->u.tex.level = dstlevel; 1005ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák dst_templ->u.tex.first_layer = dstz; 1006ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák dst_templ->u.tex.last_layer = dstz + srcbox->depth - 1; 1007ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák} 1008ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák 1009ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšákvoid util_blitter_default_src_texture(struct pipe_sampler_view *src_templ, 1010ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák struct pipe_resource *src, 1011ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák unsigned srclevel) 1012ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák{ 1013ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák memset(src_templ, 0, sizeof(*src_templ)); 1014ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->format = util_format_linear(src->format); 1015ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->u.tex.first_level = srclevel; 1016ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->u.tex.last_level = srclevel; 1017ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->u.tex.first_layer = 0; 1018ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->u.tex.last_layer = 1019a730838a42c62b7729691b518a134017ff2d3b42Marek Olšák src->target == PIPE_TEXTURE_3D ? u_minify(src->depth0, srclevel) - 1 1020ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák : src->array_size - 1; 1021ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->swizzle_r = PIPE_SWIZZLE_RED; 1022ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->swizzle_g = PIPE_SWIZZLE_GREEN; 1023ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->swizzle_b = PIPE_SWIZZLE_BLUE; 1024ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_templ->swizzle_a = PIPE_SWIZZLE_ALPHA; 1025ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák} 1026ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák 102784645fa61390475e6efb080685e0dec059622a39Marek Olšákboolean util_blitter_is_copy_supported(struct blitter_context *blitter, 102884645fa61390475e6efb080685e0dec059622a39Marek Olšák const struct pipe_resource *dst, 102984645fa61390475e6efb080685e0dec059622a39Marek Olšák const struct pipe_resource *src, 103084645fa61390475e6efb080685e0dec059622a39Marek Olšák unsigned mask) 103184645fa61390475e6efb080685e0dec059622a39Marek Olšák{ 103284645fa61390475e6efb080685e0dec059622a39Marek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 103384645fa61390475e6efb080685e0dec059622a39Marek Olšák struct pipe_screen *screen = ctx->base.pipe->screen; 103484645fa61390475e6efb080685e0dec059622a39Marek Olšák 103584645fa61390475e6efb080685e0dec059622a39Marek Olšák if (dst) { 103684645fa61390475e6efb080685e0dec059622a39Marek Olšák unsigned bind; 103784645fa61390475e6efb080685e0dec059622a39Marek Olšák boolean is_stencil; 103884645fa61390475e6efb080685e0dec059622a39Marek Olšák const struct util_format_description *desc = 103984645fa61390475e6efb080685e0dec059622a39Marek Olšák util_format_description(dst->format); 104084645fa61390475e6efb080685e0dec059622a39Marek Olšák 104184645fa61390475e6efb080685e0dec059622a39Marek Olšák is_stencil = util_format_has_stencil(desc); 104284645fa61390475e6efb080685e0dec059622a39Marek Olšák 104384645fa61390475e6efb080685e0dec059622a39Marek Olšák /* Stencil export must be supported for stencil copy. */ 104484645fa61390475e6efb080685e0dec059622a39Marek Olšák if ((mask & PIPE_MASK_S) && is_stencil && !ctx->has_stencil_export) { 104584645fa61390475e6efb080685e0dec059622a39Marek Olšák return FALSE; 104684645fa61390475e6efb080685e0dec059622a39Marek Olšák } 104784645fa61390475e6efb080685e0dec059622a39Marek Olšák 104884645fa61390475e6efb080685e0dec059622a39Marek Olšák if (is_stencil || util_format_has_depth(desc)) 104984645fa61390475e6efb080685e0dec059622a39Marek Olšák bind = PIPE_BIND_DEPTH_STENCIL; 105084645fa61390475e6efb080685e0dec059622a39Marek Olšák else 105184645fa61390475e6efb080685e0dec059622a39Marek Olšák bind = PIPE_BIND_RENDER_TARGET; 105284645fa61390475e6efb080685e0dec059622a39Marek Olšák 105384645fa61390475e6efb080685e0dec059622a39Marek Olšák if (!screen->is_format_supported(screen, dst->format, dst->target, 105484645fa61390475e6efb080685e0dec059622a39Marek Olšák dst->nr_samples, bind)) { 105584645fa61390475e6efb080685e0dec059622a39Marek Olšák return FALSE; 105684645fa61390475e6efb080685e0dec059622a39Marek Olšák } 105784645fa61390475e6efb080685e0dec059622a39Marek Olšák } 105884645fa61390475e6efb080685e0dec059622a39Marek Olšák 105984645fa61390475e6efb080685e0dec059622a39Marek Olšák if (src) { 106084645fa61390475e6efb080685e0dec059622a39Marek Olšák if (!screen->is_format_supported(screen, src->format, src->target, 106184645fa61390475e6efb080685e0dec059622a39Marek Olšák src->nr_samples, PIPE_BIND_SAMPLER_VIEW)) { 106284645fa61390475e6efb080685e0dec059622a39Marek Olšák return FALSE; 106384645fa61390475e6efb080685e0dec059622a39Marek Olšák } 106484645fa61390475e6efb080685e0dec059622a39Marek Olšák 106584645fa61390475e6efb080685e0dec059622a39Marek Olšák /* Check stencil sampler support for stencil copy. */ 106684645fa61390475e6efb080685e0dec059622a39Marek Olšák if (util_format_has_stencil(util_format_description(src->format))) { 106784645fa61390475e6efb080685e0dec059622a39Marek Olšák enum pipe_format stencil_format = 106884645fa61390475e6efb080685e0dec059622a39Marek Olšák util_format_stencil_only(src->format); 106984645fa61390475e6efb080685e0dec059622a39Marek Olšák assert(stencil_format != PIPE_FORMAT_NONE); 107084645fa61390475e6efb080685e0dec059622a39Marek Olšák 107184645fa61390475e6efb080685e0dec059622a39Marek Olšák if (stencil_format != src->format && 107284645fa61390475e6efb080685e0dec059622a39Marek Olšák !screen->is_format_supported(screen, stencil_format, src->target, 107384645fa61390475e6efb080685e0dec059622a39Marek Olšák src->nr_samples, PIPE_BIND_SAMPLER_VIEW)) { 107484645fa61390475e6efb080685e0dec059622a39Marek Olšák return FALSE; 107584645fa61390475e6efb080685e0dec059622a39Marek Olšák } 107684645fa61390475e6efb080685e0dec059622a39Marek Olšák } 107784645fa61390475e6efb080685e0dec059622a39Marek Olšák } 107884645fa61390475e6efb080685e0dec059622a39Marek Olšák 107984645fa61390475e6efb080685e0dec059622a39Marek Olšák return TRUE; 108084645fa61390475e6efb080685e0dec059622a39Marek Olšák} 108184645fa61390475e6efb080685e0dec059622a39Marek Olšák 1082233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšákvoid util_blitter_copy_texture(struct blitter_context *blitter, 1083233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák struct pipe_resource *dst, 1084825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned dst_level, unsigned dst_sample_mask, 1085233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák unsigned dstx, unsigned dsty, unsigned dstz, 1086233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák struct pipe_resource *src, 1087825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned src_level, unsigned src_sample, 1088c8ff737a18672c86f4ec01b25b4893550667b17cMarek Olšák const struct pipe_box *srcbox) 108955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 109055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 10919b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 1092ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák struct pipe_surface *dst_view, dst_templ; 1093ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák struct pipe_sampler_view src_templ, *src_view; 1094876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 1095876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák assert(dst && src); 1096876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák assert(src->target < PIPE_MAX_TEXTURE_TYPES); 1097876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 109837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák /* Initialize the surface. */ 10998aaf6972d128551dd720b3e3525806d39aad6f53Marek Olšák util_blitter_default_dst_texture(&dst_templ, dst, dst_level, dstz, srcbox); 1100ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák dst_view = pipe->create_surface(pipe, dst, &dst_templ); 110155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 110237b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák /* Initialize the sampler view. */ 11038aaf6972d128551dd720b3e3525806d39aad6f53Marek Olšák util_blitter_default_src_texture(&src_templ, src, src_level); 1104ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák src_view = pipe->create_sampler_view(pipe, src, &src_templ); 110537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák 110637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák /* Copy. */ 1107825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák util_blitter_copy_texture_view(blitter, dst_view, dst_sample_mask, dstx, 1108825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák dsty, src_view, src_sample, srcbox, 1109825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák src->width0, src->height0, PIPE_MASK_RGBAZS); 111037b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák 1111ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák pipe_surface_reference(&dst_view, NULL); 1112ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák pipe_sampler_view_reference(&src_view, NULL); 111337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák} 111437b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák 111537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšákvoid util_blitter_copy_texture_view(struct blitter_context *blitter, 111637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák struct pipe_surface *dst, 1117825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned dst_sample_mask, 111837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák unsigned dstx, unsigned dsty, 111937b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák struct pipe_sampler_view *src, 1120825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned src_sample, 112189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák const struct pipe_box *srcbox, 1122ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák unsigned src_width0, unsigned src_height0, 1123ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák unsigned mask) 112437b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák{ 112537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 112637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 112737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák struct pipe_framebuffer_state fb_state; 112837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák enum pipe_texture_target src_target = src->texture->target; 1129dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák int abs_width = abs(srcbox->width); 1130dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák int abs_height = abs(srcbox->height); 1131ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák boolean blit_stencil, blit_depth; 113212fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák const struct util_format_description *src_desc = 113312fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák util_format_description(src->format); 113412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 1135ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák blit_depth = util_format_has_depth(src_desc) && (mask & PIPE_MASK_Z); 1136ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák blit_stencil = util_format_has_stencil(src_desc) && (mask & PIPE_MASK_S); 113712fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 113812fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák /* If you want a fallback for stencil copies, 113912fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák * use util_blitter_copy_texture. */ 1140ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák if (blit_stencil && !ctx->has_stencil_export) { 1141ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák blit_stencil = FALSE; 114212fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 1143ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák if (!blit_depth) 114412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák return; 114512fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák } 114637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák 114737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák /* Sanity checks. */ 114837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák if (dst->texture == src->texture && 114937b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák dst->u.tex.level == src->u.tex.first_level) { 1150dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák assert(!is_overlap(dstx, dsty, 0, srcbox)); 115137b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák } 115237b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák /* XXX should handle 3d regions */ 115337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák assert(srcbox->depth == 1); 115437b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák 1155876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Check whether the states are properly saved. */ 1156c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_set_running_flag(ctx); 1157c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_vertex_states(ctx); 1158c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fragment_states(ctx); 1159c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_textures(ctx); 1160c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fb_state(ctx); 116155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1162876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Initialize framebuffer state. */ 116337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák fb_state.width = dst->width; 116437b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák fb_state.height = dst->height; 116555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1166ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák if (blit_depth || blit_stencil) { 116755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_keep_color); 116812fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 1169ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák if (blit_depth && blit_stencil) { 117012fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, 117112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák ctx->dsa_write_depth_stencil); 117212fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák pipe->bind_fs_state(pipe, 1173825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák blitter_get_fs_texfetch_depthstencil(ctx, src->texture)); 1174ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák } else if (blit_depth) { 117512fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, 117612fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák ctx->dsa_write_depth_keep_stencil); 117712fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák pipe->bind_fs_state(pipe, 1178825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák blitter_get_fs_texfetch_depth(ctx, src->texture)); 117912fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák } else { /* is_stencil */ 1180bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, 1181bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák ctx->dsa_keep_depth_write_stencil); 1182bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák pipe->bind_fs_state(pipe, 1183825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák blitter_get_fs_texfetch_stencil(ctx, src->texture)); 118412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák } 118555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 118655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 0; 118737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák fb_state.zsbuf = dst; 118855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } else { 118955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 119055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 119185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, 1192825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák blitter_get_fs_texfetch_col(ctx, src->texture)); 119355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 119455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 1; 119537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák fb_state.cbufs[0] = dst; 119655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.zsbuf = 0; 119755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 119885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 1199ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák if (blit_depth && blit_stencil) { 120012fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák /* Setup two samplers, one for depth and the other one for stencil. */ 120112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák struct pipe_sampler_view templ; 120212fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák struct pipe_sampler_view *views[2]; 120312fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák void *samplers[2] = {ctx->sampler_state, ctx->sampler_state}; 120412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 120512fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák templ = *src; 120612fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák templ.format = util_format_stencil_only(templ.format); 120712fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák assert(templ.format != PIPE_FORMAT_NONE); 120812fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 120912fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák views[0] = src; 121012fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák views[1] = pipe->create_sampler_view(pipe, src->texture, &templ); 121112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 121212fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák pipe->set_fragment_sampler_views(pipe, 2, views); 121312fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák pipe->bind_fragment_sampler_states(pipe, 2, samplers); 121412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 121512fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák pipe_sampler_view_reference(&views[1], NULL); 121627e056ff15ff365e0e00209738ff97ca64f02f2aMarek Olšák } else if (blit_stencil) { 121727e056ff15ff365e0e00209738ff97ca64f02f2aMarek Olšák /* Set a stencil-only sampler view for it not to sample depth instead. */ 121827e056ff15ff365e0e00209738ff97ca64f02f2aMarek Olšák struct pipe_sampler_view templ; 121927e056ff15ff365e0e00209738ff97ca64f02f2aMarek Olšák struct pipe_sampler_view *view; 122027e056ff15ff365e0e00209738ff97ca64f02f2aMarek Olšák 122127e056ff15ff365e0e00209738ff97ca64f02f2aMarek Olšák templ = *src; 122227e056ff15ff365e0e00209738ff97ca64f02f2aMarek Olšák templ.format = util_format_stencil_only(templ.format); 122327e056ff15ff365e0e00209738ff97ca64f02f2aMarek Olšák assert(templ.format != PIPE_FORMAT_NONE); 122427e056ff15ff365e0e00209738ff97ca64f02f2aMarek Olšák 122527e056ff15ff365e0e00209738ff97ca64f02f2aMarek Olšák view = pipe->create_sampler_view(pipe, src->texture, &templ); 122627e056ff15ff365e0e00209738ff97ca64f02f2aMarek Olšák 122727e056ff15ff365e0e00209738ff97ca64f02f2aMarek Olšák pipe->set_fragment_sampler_views(pipe, 1, &view); 122827e056ff15ff365e0e00209738ff97ca64f02f2aMarek Olšák pipe->bind_fragment_sampler_states(pipe, 1, &ctx->sampler_state); 122927e056ff15ff365e0e00209738ff97ca64f02f2aMarek Olšák 123027e056ff15ff365e0e00209738ff97ca64f02f2aMarek Olšák pipe_sampler_view_reference(&view, NULL); 123112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák } else { 123212fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák pipe->set_fragment_sampler_views(pipe, 1, &src); 123312fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák pipe->bind_fragment_sampler_states(pipe, 1, &ctx->sampler_state); 123412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák } 123512fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák 1236ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 123755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 1238825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák pipe->set_sample_mask(pipe, dst_sample_mask); 123955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 12401f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák blitter_set_common_draw_rect_state(ctx); 124137b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák blitter_set_dst_dimensions(ctx, dst->width, dst->height); 12429be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 1243825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák if ((src_target == PIPE_TEXTURE_1D || 1244825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák src_target == PIPE_TEXTURE_2D || 1245825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák src_target == PIPE_TEXTURE_RECT) && 1246825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák src->texture->nr_samples <= 1) { 12479be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw the quad with the draw_rectangle callback. */ 12489be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 1249825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák /* Set texture coordinates. - use a pipe color union 1250825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * for interface purposes. 1251825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * XXX pipe_color_union is a wrong name since we use that to set 1252825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * texture coordinates too. 1253825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák */ 1254825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák union pipe_color_union coord; 1255825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák get_texcoords(src, src_width0, src_height0, srcbox->x, srcbox->y, 1256dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák srcbox->x+srcbox->width, srcbox->y+srcbox->height, coord.f); 1257825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák 1258825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák /* Draw. */ 1259dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák blitter->draw_rectangle(blitter, dstx, dsty, dstx+abs_width, dsty+abs_height, 0, 1260825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák UTIL_BLITTER_ATTRIB_TEXCOORD, &coord); 1261825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák } else { 12629be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw the quad with the generic codepath. */ 1263825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák blitter_set_texcoords(ctx, src, src_width0, src_height0, srcbox->z, 1264825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák src_sample, 1265825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák srcbox->x, srcbox->y, 1266dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák srcbox->x + srcbox->width, srcbox->y + srcbox->height); 1267dc5e61d8842501e0b67907e360392eb355c8b73dMarek Olšák blitter_draw(ctx, dstx, dsty, dstx+abs_width, dsty+abs_height, 0); 126855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 126955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1270c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_vertex_states(ctx); 1271c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fragment_states(ctx); 1272c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_textures(ctx); 1273c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fb_state(ctx); 1274c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_unset_running_flag(ctx); 127555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 127655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1277a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a color surface to a constant value. */ 1278a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_render_target(struct blitter_context *blitter, 1279a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger struct pipe_surface *dstsurf, 12806dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color, 1281a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned dstx, unsigned dsty, 1282a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned width, unsigned height) 128355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 128455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 12859b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 128655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct pipe_framebuffer_state fb_state; 128755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1288a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger assert(dstsurf->texture); 1289a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if (!dstsurf->texture) 129055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák return; 129155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 129255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* check the saved state */ 1293c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_set_running_flag(ctx); 1294c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_vertex_states(ctx); 1295c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fragment_states(ctx); 1296c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fb_state(ctx); 129755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1298c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* bind states */ 129955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 130055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 13014e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1, FALSE)); 1302ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 130355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 130455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set a framebuffer state */ 130559e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.width = dstsurf->width; 130659e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.height = dstsurf->height; 130755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 1; 130859e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.cbufs[0] = dstsurf; 130955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.zsbuf = 0; 131055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 13116c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák pipe->set_sample_mask(pipe, ~0); 131255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 13131f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák blitter_set_common_draw_rect_state(ctx); 13143bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 13159be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0, 13166dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie UTIL_BLITTER_ATTRIB_COLOR, color); 1317c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 1318c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_vertex_states(ctx); 1319c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fragment_states(ctx); 1320c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fb_state(ctx); 1321c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_unset_running_flag(ctx); 1322a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger} 132359e51d9640c242a7c919472d935a91889c7840c9Marek Olšák 1324a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a depth stencil surface. */ 1325a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_depth_stencil(struct blitter_context *blitter, 1326a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger struct pipe_surface *dstsurf, 1327a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned clear_flags, 1328a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger double depth, 1329a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned stencil, 1330a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned dstx, unsigned dsty, 1331a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned width, unsigned height) 1332a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger{ 1333a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 13349b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 1335a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct pipe_framebuffer_state fb_state; 1336a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct pipe_stencil_ref sr = { { 0 } }; 1337a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 1338a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger assert(dstsurf->texture); 1339a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if (!dstsurf->texture) 1340a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger return; 1341a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 1342a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* check the saved state */ 1343c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_set_running_flag(ctx); 1344c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_vertex_states(ctx); 1345c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fragment_states(ctx); 1346c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fb_state(ctx); 1347a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 1348c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* bind states */ 1349a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_blend_state(pipe, ctx->blend_keep_color); 1350a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if ((clear_flags & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) { 1351a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger sr.ref_value[0] = stencil & 0xff; 1352a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 1353a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_stencil_ref(pipe, &sr); 1354a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 1355a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else if (clear_flags & PIPE_CLEAR_DEPTH) { 1356a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil); 1357a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 1358a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else if (clear_flags & PIPE_CLEAR_STENCIL) { 1359a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger sr.ref_value[0] = stencil & 0xff; 1360a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 1361a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_stencil_ref(pipe, &sr); 1362a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 1363a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else 1364a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* hmm that should be illegal probably, or make it a no-op somewhere */ 1365a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 1366a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 13674e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0, FALSE)); 1368a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 1369a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 1370a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* set a framebuffer state */ 1371a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.width = dstsurf->width; 1372a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.height = dstsurf->height; 1373a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.nr_cbufs = 0; 1374a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.cbufs[0] = 0; 1375a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.zsbuf = dstsurf; 1376a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_framebuffer_state(pipe, &fb_state); 13776c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák pipe->set_sample_mask(pipe, ~0); 1378a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 13791f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák blitter_set_common_draw_rect_state(ctx); 13803bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 13819be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, depth, 13829be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák UTIL_BLITTER_ATTRIB_NONE, NULL); 1383c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 1384c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_vertex_states(ctx); 1385c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fragment_states(ctx); 1386c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fb_state(ctx); 1387c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_unset_running_flag(ctx); 138855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 1389f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1390c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie/* draw a rectangle across a region using a custom dsa stage - for r600g */ 1391c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlievoid util_blitter_custom_depth_stencil(struct blitter_context *blitter, 1392c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie struct pipe_surface *zsurf, 1393c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie struct pipe_surface *cbsurf, 139494b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák unsigned sample_mask, 1395c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie void *dsa_stage, float depth) 1396f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák{ 1397f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 1398f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák struct pipe_context *pipe = ctx->base.pipe; 1399f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák struct pipe_framebuffer_state fb_state; 1400f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1401c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie assert(zsurf->texture); 1402c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie if (!zsurf->texture) 1403f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák return; 1404f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1405f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák /* check the saved state */ 1406c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_set_running_flag(ctx); 1407c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_vertex_states(ctx); 1408c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fragment_states(ctx); 1409c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_check_saved_fb_state(ctx); 1410f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1411c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák /* bind states */ 1412c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie pipe->bind_blend_state(pipe, ctx->blend_write_color); 1413c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie pipe->bind_depth_stencil_alpha_state(pipe, dsa_stage); 14144e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0, FALSE)); 1415f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 1416f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1417f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák /* set a framebuffer state */ 1418c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.width = zsurf->width; 1419c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.height = zsurf->height; 1420c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.nr_cbufs = 1; 1421c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie if (cbsurf) { 1422c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.cbufs[0] = cbsurf; 1423c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.nr_cbufs = 1; 1424c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie } else { 1425c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.cbufs[0] = NULL; 1426c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.nr_cbufs = 0; 1427c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie } 1428c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.zsbuf = zsurf; 1429f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 143094b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák pipe->set_sample_mask(pipe, sample_mask); 1431f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 14321f50f463ebcce377fdd6d8ff6a705c36200c6eb3Marek Olšák blitter_set_common_draw_rect_state(ctx); 1433c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie blitter_set_dst_dimensions(ctx, zsurf->width, zsurf->height); 1434c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie blitter->draw_rectangle(blitter, 0, 0, zsurf->width, zsurf->height, depth, 1435f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák UTIL_BLITTER_ATTRIB_NONE, NULL); 1436c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák 1437c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_vertex_states(ctx); 1438c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fragment_states(ctx); 1439c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_restore_fb_state(ctx); 1440c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák blitter_unset_running_flag(ctx); 1441f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák} 144236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 144336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšákvoid util_blitter_copy_buffer(struct blitter_context *blitter, 144436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct pipe_resource *dst, 144536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák unsigned dstx, 144636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct pipe_resource *src, 144736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák unsigned srcx, 144836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák unsigned size) 144936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák{ 145036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 145136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct pipe_context *pipe = ctx->base.pipe; 145236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct pipe_vertex_buffer vb; 145336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct pipe_stream_output_target *so_target; 145436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 145559fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák if (srcx >= src->width0 || 145659fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák dstx >= dst->width0) { 145759fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák return; 145859fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák } 145959fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák if (srcx + size > src->width0) { 146059fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák size = src->width0 - srcx; 146159fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák } 146259fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák if (dstx + size > dst->width0) { 146359fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák size = dst->width0 - dstx; 146459fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák } 146559fbd8c6bea1a6420b6fe3bb75d1ea64c054a8b3Marek Olšák 146636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák /* Drivers not capable of Stream Out should not call this function 146736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák * in the first place. */ 146836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák assert(ctx->has_stream_out); 146936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 147036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák /* Some alignment is required. */ 1471a0a9e56cfed1ab81c1068cffbfd9299f77c7e187Marek Olšák if (srcx % 4 != 0 || dstx % 4 != 0 || size % 4 != 0 || 147236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák !ctx->has_stream_out) { 147336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct pipe_box box; 147436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák u_box_1d(srcx, size, &box); 147536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák util_resource_copy_region(pipe, dst, 0, dstx, 0, 0, src, 0, &box); 147636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák return; 147736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák } 147836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 147936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák blitter_set_running_flag(ctx); 148036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák blitter_check_saved_vertex_states(ctx); 148136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 148236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák vb.buffer = src; 148336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák vb.buffer_offset = srcx; 148436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák vb.stride = 4; 148536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 148636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->set_vertex_buffers(pipe, 1, &vb); 148736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->bind_vertex_elements_state(pipe, ctx->velem_state_readbuf); 148836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->bind_vs_state(pipe, ctx->vs_pos_only); 148936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák if (ctx->has_geometry_shader) 149036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->bind_gs_state(pipe, NULL); 149136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_discard_state); 149236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 149336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák so_target = pipe->create_stream_output_target(pipe, dst, dstx, size); 149436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe->set_stream_output_targets(pipe, 1, &so_target, 0); 149536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 1496a0a9e56cfed1ab81c1068cffbfd9299f77c7e187Marek Olšák util_draw_arrays(pipe, PIPE_PRIM_POINTS, 0, size / 4); 149736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 149836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák blitter_restore_vertex_states(ctx); 149936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák blitter_unset_running_flag(ctx); 150036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák pipe_so_target_reference(&so_target, NULL); 150136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák} 15020f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 15030f86915c5322b096b7154b6c84e21288074b775dMarek Olšák/* probably radeon specific */ 1504e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšákvoid util_blitter_custom_resolve_color(struct blitter_context *blitter, 15050f86915c5322b096b7154b6c84e21288074b775dMarek Olšák struct pipe_resource *dst, 15060f86915c5322b096b7154b6c84e21288074b775dMarek Olšák unsigned dst_level, 15070f86915c5322b096b7154b6c84e21288074b775dMarek Olšák unsigned dst_layer, 15080f86915c5322b096b7154b6c84e21288074b775dMarek Olšák struct pipe_resource *src, 15090f86915c5322b096b7154b6c84e21288074b775dMarek Olšák unsigned src_layer, 151064db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák unsigned sample_mask, 15110f86915c5322b096b7154b6c84e21288074b775dMarek Olšák void *custom_blend) 15120f86915c5322b096b7154b6c84e21288074b775dMarek Olšák{ 15130f86915c5322b096b7154b6c84e21288074b775dMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 15140f86915c5322b096b7154b6c84e21288074b775dMarek Olšák struct pipe_context *pipe = ctx->base.pipe; 15150f86915c5322b096b7154b6c84e21288074b775dMarek Olšák struct pipe_framebuffer_state fb_state; 15160f86915c5322b096b7154b6c84e21288074b775dMarek Olšák struct pipe_surface *srcsurf, *dstsurf, surf_tmpl; 15170f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 15180f86915c5322b096b7154b6c84e21288074b775dMarek Olšák blitter_set_running_flag(ctx); 15190f86915c5322b096b7154b6c84e21288074b775dMarek Olšák blitter_check_saved_vertex_states(ctx); 15200f86915c5322b096b7154b6c84e21288074b775dMarek Olšák blitter_check_saved_fragment_states(ctx); 15210f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 15220f86915c5322b096b7154b6c84e21288074b775dMarek Olšák /* bind states */ 15230f86915c5322b096b7154b6c84e21288074b775dMarek Olšák pipe->bind_blend_state(pipe, custom_blend); 15240f86915c5322b096b7154b6c84e21288074b775dMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 15250f86915c5322b096b7154b6c84e21288074b775dMarek Olšák pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 15260f86915c5322b096b7154b6c84e21288074b775dMarek Olšák pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1, FALSE)); 152764db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák pipe->set_sample_mask(pipe, sample_mask); 15280f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 15290f86915c5322b096b7154b6c84e21288074b775dMarek Olšák memset(&surf_tmpl, 0, sizeof(surf_tmpl)); 15300f86915c5322b096b7154b6c84e21288074b775dMarek Olšák surf_tmpl.format = dst->format; 15310f86915c5322b096b7154b6c84e21288074b775dMarek Olšák surf_tmpl.u.tex.level = dst_level; 15320f86915c5322b096b7154b6c84e21288074b775dMarek Olšák surf_tmpl.u.tex.first_layer = dst_layer; 15330f86915c5322b096b7154b6c84e21288074b775dMarek Olšák surf_tmpl.u.tex.last_layer = dst_layer; 15340f86915c5322b096b7154b6c84e21288074b775dMarek Olšák surf_tmpl.usage = PIPE_BIND_RENDER_TARGET; 15350f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 15360f86915c5322b096b7154b6c84e21288074b775dMarek Olšák dstsurf = pipe->create_surface(pipe, dst, &surf_tmpl); 15370f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 15380f86915c5322b096b7154b6c84e21288074b775dMarek Olšák surf_tmpl.u.tex.level = 0; 15390f86915c5322b096b7154b6c84e21288074b775dMarek Olšák surf_tmpl.u.tex.first_layer = src_layer; 15400f86915c5322b096b7154b6c84e21288074b775dMarek Olšák surf_tmpl.u.tex.last_layer = src_layer; 15410f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 15420f86915c5322b096b7154b6c84e21288074b775dMarek Olšák srcsurf = pipe->create_surface(pipe, src, &surf_tmpl); 15430f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 15440f86915c5322b096b7154b6c84e21288074b775dMarek Olšák /* set a framebuffer state */ 15450f86915c5322b096b7154b6c84e21288074b775dMarek Olšák fb_state.width = src->width0; 15460f86915c5322b096b7154b6c84e21288074b775dMarek Olšák fb_state.height = src->height0; 15470f86915c5322b096b7154b6c84e21288074b775dMarek Olšák fb_state.nr_cbufs = 2; 15480f86915c5322b096b7154b6c84e21288074b775dMarek Olšák fb_state.cbufs[0] = srcsurf; 15490f86915c5322b096b7154b6c84e21288074b775dMarek Olšák fb_state.cbufs[1] = dstsurf; 15500f86915c5322b096b7154b6c84e21288074b775dMarek Olšák fb_state.zsbuf = NULL; 15510f86915c5322b096b7154b6c84e21288074b775dMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 15520f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 15530f86915c5322b096b7154b6c84e21288074b775dMarek Olšák blitter_set_common_draw_rect_state(ctx); 15540f86915c5322b096b7154b6c84e21288074b775dMarek Olšák blitter_set_dst_dimensions(ctx, src->width0, src->height0); 15550f86915c5322b096b7154b6c84e21288074b775dMarek Olšák blitter->draw_rectangle(blitter, 0, 0, src->width0, src->height0, 15560f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 0, 0, NULL); 15570f86915c5322b096b7154b6c84e21288074b775dMarek Olšák blitter_restore_fb_state(ctx); 15580f86915c5322b096b7154b6c84e21288074b775dMarek Olšák blitter_restore_vertex_states(ctx); 15590f86915c5322b096b7154b6c84e21288074b775dMarek Olšák blitter_restore_fragment_states(ctx); 15600f86915c5322b096b7154b6c84e21288074b775dMarek Olšák blitter_unset_running_flag(ctx); 15610f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 15620f86915c5322b096b7154b6c84e21288074b775dMarek Olšák pipe_surface_reference(&srcsurf, NULL); 15630f86915c5322b096b7154b6c84e21288074b775dMarek Olšák pipe_surface_reference(&dstsurf, NULL); 15640f86915c5322b096b7154b6c84e21288074b775dMarek Olšák} 1565a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 1566a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšákvoid util_blitter_custom_color(struct blitter_context *blitter, 1567a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák struct pipe_surface *dstsurf, 1568a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák void *custom_blend) 1569a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák{ 1570a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 1571a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 1572a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák struct pipe_framebuffer_state fb_state; 1573a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 1574a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák assert(dstsurf->texture); 1575a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák if (!dstsurf->texture) 1576a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák return; 1577a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 1578a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák /* check the saved state */ 1579a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák blitter_set_running_flag(ctx); 1580a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák blitter_check_saved_vertex_states(ctx); 1581a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák blitter_check_saved_fragment_states(ctx); 1582a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák blitter_check_saved_fb_state(ctx); 1583a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 1584a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák /* bind states */ 1585a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák pipe->bind_blend_state(pipe, custom_blend); 1586a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 1587a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1, FALSE)); 1588a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 1589a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák pipe->set_sample_mask(pipe, (1ull << MAX2(1, dstsurf->texture->nr_samples)) - 1); 1590a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 1591a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák /* set a framebuffer state */ 1592a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák fb_state.width = dstsurf->width; 1593a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák fb_state.height = dstsurf->height; 1594a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák fb_state.nr_cbufs = 1; 1595a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák fb_state.cbufs[0] = dstsurf; 1596a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák fb_state.zsbuf = 0; 1597a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 1598a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák pipe->set_sample_mask(pipe, ~0); 1599a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 1600a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák blitter_set_common_draw_rect_state(ctx); 1601a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 1602a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák blitter->draw_rectangle(blitter, 0, 0, dstsurf->width, dstsurf->height, 1603a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 0, 0, NULL); 1604a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 1605a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák blitter_restore_vertex_states(ctx); 1606a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák blitter_restore_fragment_states(ctx); 1607a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák blitter_restore_fb_state(ctx); 1608a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák blitter_unset_running_flag(ctx); 1609a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák} 1610