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#ifndef U_BLITTER_H 2855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#define U_BLITTER_H 2955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 30a922725118333e016a357008f37105c23c6f54bcMarek Olšák#include "util/u_framebuffer.h" 318f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák#include "util/u_inlines.h" 3255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_memory.h" 3355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "pipe/p_state.h" 3555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#ifdef __cplusplus 3855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákextern "C" { 3955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#endif 4055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 4155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct pipe_context; 4255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 439be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákenum blitter_attrib_type { 449be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák UTIL_BLITTER_ATTRIB_NONE, 459be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák UTIL_BLITTER_ATTRIB_COLOR, 469be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák UTIL_BLITTER_ATTRIB_TEXCOORD 479be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák}; 489be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 4955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context 5055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 519be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /** 529be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák * Draw a rectangle. 539be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák * 549be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák * \param x1 An X coordinate of the top-left corner. 559be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák * \param y1 A Y coordinate of the top-left corner. 569be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák * \param x2 An X coordinate of the bottom-right corner. 579be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák * \param y2 A Y coordinate of the bottom-right corner. 58db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák * \param depth A depth which the rectangle is rendered at. 599be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák * 609be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák * \param type Semantics of the attributes "attrib". 619be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák * If type is UTIL_BLITTER_ATTRIB_NONE, ignore them. 629be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák * If type is UTIL_BLITTER_ATTRIB_COLOR, the attributes 63db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák * make up a constant RGBA color, and should go 64db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák * to the GENERIC0 varying slot of a fragment shader. 659be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák * If type is UTIL_BLITTER_ATTRIB_TEXCOORD, {a1, a2} and 669be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák * {a3, a4} specify top-left and bottom-right texture 679be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák * coordinates of the rectangle, respectively, and should go 689be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák * to the GENERIC0 varying slot of a fragment shader. 699be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák * 709be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák * \param attrib See type. 719be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák * 729be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák * \note A driver may optionally override this callback to implement 739be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák * a specialized hardware path for drawing a rectangle, e.g. using 749be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák * a rectangular point sprite. 759be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák */ 769be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák void (*draw_rectangle)(struct blitter_context *blitter, 779be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned x1, unsigned y1, unsigned x2, unsigned y2, 789be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák float depth, 799be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák enum blitter_attrib_type type, 806dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color); 819be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 82ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák /* Whether the blitter is running. */ 83ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák boolean running; 84ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák 8555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Private members, really. */ 869b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe; /**< pipe context */ 879b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák 8855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *saved_blend_state; /**< blend state */ 8955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *saved_dsa_state; /**< depth stencil alpha state */ 90ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger void *saved_velem_state; /**< vertex elements state */ 9155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *saved_rs_state; /**< rasterizer state */ 924c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák void *saved_fs, *saved_vs, *saved_gs; /**< shaders */ 9355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 9455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct pipe_framebuffer_state saved_fb_state; /**< framebuffer state */ 95ed0f3b08b65679452132a9caeef1509a8dac23b9Roland Scheidegger struct pipe_stencil_ref saved_stencil_ref; /**< stencil ref */ 96932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol struct pipe_viewport_state saved_viewport; 976c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák boolean is_sample_mask_saved; 986c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák unsigned saved_sample_mask; 9955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 10055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int saved_num_sampler_states; 101f6106566081978f663cf08e54bb8908cb58a5316Michal Krol void *saved_sampler_states[PIPE_MAX_SAMPLERS]; 10255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 103f6106566081978f663cf08e54bb8908cb58a5316Michal Krol int saved_num_sampler_views; 104f6106566081978f663cf08e54bb8908cb58a5316Michal Krol struct pipe_sampler_view *saved_sampler_views[PIPE_MAX_SAMPLERS]; 10564aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri 10664aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri int saved_num_vertex_buffers; 10764aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri struct pipe_vertex_buffer saved_vertex_buffers[PIPE_MAX_ATTRIBS]; 108b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák 109b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák int saved_num_so_targets; 110b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák struct pipe_stream_output_target *saved_so_targets[PIPE_MAX_SO_BUFFERS]; 11155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}; 11255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 11355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák/** 11455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * Create a blitter context. 11555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák */ 11655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context *util_blitter_create(struct pipe_context *pipe); 11755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 11855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák/** 11955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * Destroy a blitter context. 12055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák */ 12155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_destroy(struct blitter_context *blitter); 12255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1239b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák/** 1249b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák * Return the pipe context associated with a blitter context. 1259b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák */ 1269b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšákstatic INLINE 1279b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšákstruct pipe_context *util_blitter_get_pipe(struct blitter_context *blitter) 1289b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák{ 1299b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák return blitter->pipe; 1309b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák} 1319b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák 132187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák/* The default function to draw a rectangle. This can only be used 133187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák * inside of the draw_rectangle callback if the driver overrides it. */ 134187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšákvoid util_blitter_draw_rectangle(struct blitter_context *blitter, 135187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák unsigned x1, unsigned y1, 136187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák unsigned x2, unsigned y2, 137187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák float depth, 138187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák enum blitter_attrib_type type, 139187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák const union pipe_color_union *attrib); 140187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák 14155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák/* 142c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * These states must be saved before any of the following functions are called: 143233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák * - vertex buffers 144233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák * - vertex elements 145c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - vertex shader 1464c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák * - geometry shader (if supported) 147b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák * - stream output targets (if supported) 148c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - rasterizer state 14955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák */ 15055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 15155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák/** 15255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * Clear a specified set of currently bound buffers to specified values. 153c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * 154c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * These states must be saved in the blitter in addition to the state objects 155c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * already required to be saved: 156c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - fragment shader 157c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - depth stencil alpha state 158c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - blend state 15955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák */ 16055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_clear(struct blitter_context *blitter, 16155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned width, unsigned height, 16255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned num_cbufs, 16355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned clear_buffers, 1644e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie enum pipe_format cbuf_format, 1656dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color, 16655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák double depth, unsigned stencil); 16755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 16855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák/** 16984645fa61390475e6efb080685e0dec059622a39Marek Olšák * Check if the blitter (with the help of the driver) can blit between 17084645fa61390475e6efb080685e0dec059622a39Marek Olšák * the two resources. 17184645fa61390475e6efb080685e0dec059622a39Marek Olšák * The mask is a combination of the PIPE_MASK_* flags. 17284645fa61390475e6efb080685e0dec059622a39Marek Olšák * Set to PIPE_MASK_RGBAZS if unsure. 17384645fa61390475e6efb080685e0dec059622a39Marek Olšák */ 17484645fa61390475e6efb080685e0dec059622a39Marek Olšákboolean util_blitter_is_copy_supported(struct blitter_context *blitter, 17584645fa61390475e6efb080685e0dec059622a39Marek Olšák const struct pipe_resource *dst, 17684645fa61390475e6efb080685e0dec059622a39Marek Olšák const struct pipe_resource *src, 17784645fa61390475e6efb080685e0dec059622a39Marek Olšák unsigned mask); 17884645fa61390475e6efb080685e0dec059622a39Marek Olšák/** 17955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * Copy a block of pixels from one surface to another. 18055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * 18155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * You can copy from any color format to any other color format provided 182c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * the former can be sampled from and the latter can be rendered to. Otherwise, 18355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * a software fallback path is taken and both surfaces must be of the same 18455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * format. 18555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * 186825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * Only one sample of a multisample texture can be copied and is specified by 187825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * src_sample. If the destination is a multisample resource, dst_sample_mask 188825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * specifies the sample mask. For single-sample resources, set dst_sample_mask 189825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * to ~0. 19055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * 19155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * These states must be saved in the blitter in addition to the state objects 19255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * already required to be saved: 193c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - fragment shader 194c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - depth stencil alpha state 195c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - blend state 19655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * - fragment sampler states 19755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * - fragment sampler textures 198c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - framebuffer state 19955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák */ 200233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšákvoid util_blitter_copy_texture(struct blitter_context *blitter, 201233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák struct pipe_resource *dst, 202825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned dst_level, unsigned dst_sample_mask, 203233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák unsigned dstx, unsigned dsty, unsigned dstz, 204233dd4953e3e6cf39f3c7a7cd898339a89d2ff86Marek Olšák struct pipe_resource *src, 205825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned src_level, unsigned src_sample, 206c8ff737a18672c86f4ec01b25b4893550667b17cMarek Olšák const struct pipe_box *srcbox); 20755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 20855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák/** 20937b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák * Same as util_blitter_copy_texture, but dst and src are pipe_surface and 21037b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák * pipe_sampler_view, respectively. The mipmap level and dstz are part of 21137b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák * the views. 21237b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák * 21337b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák * Drivers can use this to change resource properties (like format, width, 21489ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák * height) by changing how the views interpret them, instead of changing 21537b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák * pipe_resource directly. This is usually needed to accelerate copying of 21637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák * compressed formats. 21737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák * 21889ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák * src_width0 and src_height0 are sampler_view-private properties that 21989ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák * override pipe_resource. The blitter uses them for computation of texture 22089ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák * coordinates. The dst dimensions are supplied through pipe_surface::width 22189ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák * and height. 22289ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák * 22384645fa61390475e6efb080685e0dec059622a39Marek Olšák * The mask is a combination of the PIPE_MASK_* flags. 22484645fa61390475e6efb080685e0dec059622a39Marek Olšák * Set to PIPE_MASK_RGBAZS if unsure. 22584645fa61390475e6efb080685e0dec059622a39Marek Olšák * 22637b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák * NOTE: There are no checks whether the blit is actually supported. 22737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák */ 22837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšákvoid util_blitter_copy_texture_view(struct blitter_context *blitter, 22937b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák struct pipe_surface *dst, 230825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned dst_sample_mask, 23137b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák unsigned dstx, unsigned dsty, 23237b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák struct pipe_sampler_view *src, 233825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák unsigned src_sample, 23489ce12a2d20b6662abb7240c1becba11d53b215aMarek Olšák const struct pipe_box *srcbox, 235ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák unsigned src_width0, unsigned src_height0, 236ef1bf6d69e99d9a12557a09eccaf4f2b6c628997Marek Olšák unsigned mask); 23737b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák 23837b62cc35435a704d33c1814fbdbd0e807699e21Marek Olšák/** 239ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák * Helper function to initialize a view for copy_texture_view. 240ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák * The parameters must match copy_texture_view. 241ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák */ 242ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšákvoid util_blitter_default_dst_texture(struct pipe_surface *dst_templ, 243ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák struct pipe_resource *dst, 244ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák unsigned dstlevel, 245ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák unsigned dstz, 246ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák const struct pipe_box *srcbox); 247ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák 248ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák/** 249ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák * Helper function to initialize a view for copy_texture_view. 250ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák * The parameters must match copy_texture_view. 251ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák */ 252ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšákvoid util_blitter_default_src_texture(struct pipe_sampler_view *src_templ, 253ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák struct pipe_resource *src, 254ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák unsigned srclevel); 255ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák 256ce31970af16558ebd60cfae33c000252bc3e1cbfMarek Olšák/** 25736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák * Copy data from one buffer to another using the Stream Output functionality. 25836d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák * Some alignment is required, otherwise software fallback is used. 25936d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák */ 26036d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšákvoid util_blitter_copy_buffer(struct blitter_context *blitter, 26136d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct pipe_resource *dst, 26236d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák unsigned dstx, 26336d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák struct pipe_resource *src, 26436d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák unsigned srcx, 26536d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák unsigned size); 26636d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák 26736d66f8d4ad1e2b18bb28d0b08e98f968ad6137eMarek Olšák/** 268a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger * Clear a region of a (color) surface to a constant value. 26955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * 27055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * These states must be saved in the blitter in addition to the state objects 27155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * already required to be saved: 272c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - fragment shader 273c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - depth stencil alpha state 274c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - blend state 27555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * - framebuffer state 27655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák */ 277a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_render_target(struct blitter_context *blitter, 278a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger struct pipe_surface *dst, 2796dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color, 280a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned dstx, unsigned dsty, 281a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned width, unsigned height); 28255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 283a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/** 284a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger * Clear a region of a depth-stencil surface, both stencil and depth 285a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger * or only one of them if this is a combined depth-stencil surface. 286a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger * 287a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger * These states must be saved in the blitter in addition to the state objects 288a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger * already required to be saved: 289c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - fragment shader 290c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - depth stencil alpha state 291c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * - blend state 292a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger * - framebuffer state 293a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger */ 294a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_depth_stencil(struct blitter_context *blitter, 295a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger struct pipe_surface *dst, 296a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned clear_flags, 297a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger double depth, 298a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned stencil, 299a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned dstx, unsigned dsty, 300a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned width, unsigned height); 30155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 302e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák/* The following functions are customized variants of the clear functions. 303e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák * Some drivers use them internally to do things like MSAA resolve 304e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák * and resource decompression. It usually consists of rendering a full-screen 305e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák * quad with a special blend or DSA state. 306e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák */ 307e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák 308e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák/* Used by r300g for depth decompression. */ 309e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšákvoid util_blitter_custom_clear_depth(struct blitter_context *blitter, 310e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák unsigned width, unsigned height, 311e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák double depth, void *custom_dsa); 312e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák 313e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák/* Used by r600g for depth decompression. */ 314c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlievoid util_blitter_custom_depth_stencil(struct blitter_context *blitter, 315c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie struct pipe_surface *zsurf, 316c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie struct pipe_surface *cbsurf, 31794b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák unsigned sample_mask, 318c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie void *dsa_stage, float depth); 319c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie 320a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák/* Used by r600g for color decompression. */ 321a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšákvoid util_blitter_custom_color(struct blitter_context *blitter, 322a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák struct pipe_surface *dstsurf, 323a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák void *custom_blend); 324a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 325e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák/* Used by r600g for MSAA color resolve. */ 326e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšákvoid util_blitter_custom_resolve_color(struct blitter_context *blitter, 3270f86915c5322b096b7154b6c84e21288074b775dMarek Olšák struct pipe_resource *dst, 3280f86915c5322b096b7154b6c84e21288074b775dMarek Olšák unsigned dst_level, 3290f86915c5322b096b7154b6c84e21288074b775dMarek Olšák unsigned dst_layer, 3300f86915c5322b096b7154b6c84e21288074b775dMarek Olšák struct pipe_resource *src, 3310f86915c5322b096b7154b6c84e21288074b775dMarek Olšák unsigned src_layer, 33264db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák unsigned sampled_mask, 3330f86915c5322b096b7154b6c84e21288074b775dMarek Olšák void *custom_blend); 3340f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 33555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák/* The functions below should be used to save currently bound constant state 33655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * objects inside a driver. The objects are automatically restored at the end 3374d70a25964a7f815f15217985f0aa670157d31e8Marek Olšák * of the util_blitter_{clear, copy_region, fill_region} functions and then 33855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * forgotten. 33955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * 340c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák * States not listed here are not affected by util_blitter. */ 34155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 34255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic INLINE 34355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_save_blend(struct blitter_context *blitter, 34455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *state) 34555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 34655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter->saved_blend_state = state; 34755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 34855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 34955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic INLINE 35055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_save_depth_stencil_alpha(struct blitter_context *blitter, 35155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *state) 35255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 35355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter->saved_dsa_state = state; 35455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 35555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 35655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic INLINE 357ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheideggervoid util_blitter_save_vertex_elements(struct blitter_context *blitter, 358ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger void *state) 359ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger{ 360ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger blitter->saved_velem_state = state; 361ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger} 362ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger 363ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheideggerstatic INLINE 364ed0f3b08b65679452132a9caeef1509a8dac23b9Roland Scheideggervoid util_blitter_save_stencil_ref(struct blitter_context *blitter, 365ed0f3b08b65679452132a9caeef1509a8dac23b9Roland Scheidegger const struct pipe_stencil_ref *state) 366ed0f3b08b65679452132a9caeef1509a8dac23b9Roland Scheidegger{ 367ed0f3b08b65679452132a9caeef1509a8dac23b9Roland Scheidegger blitter->saved_stencil_ref = *state; 368ed0f3b08b65679452132a9caeef1509a8dac23b9Roland Scheidegger} 369ed0f3b08b65679452132a9caeef1509a8dac23b9Roland Scheidegger 370ed0f3b08b65679452132a9caeef1509a8dac23b9Roland Scheideggerstatic INLINE 37155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_save_rasterizer(struct blitter_context *blitter, 37255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *state) 37355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 37455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter->saved_rs_state = state; 37555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 37655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 37755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic INLINE 37855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_save_fragment_shader(struct blitter_context *blitter, 37955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *fs) 38055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 38155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter->saved_fs = fs; 38255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 38355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 38455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic INLINE 38555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_save_vertex_shader(struct blitter_context *blitter, 38655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *vs) 38755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 38855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter->saved_vs = vs; 38955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 39055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 39155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic INLINE 3924c417697b6fa1503ac35b34e79f23716d813a208Marek Olšákvoid util_blitter_save_geometry_shader(struct blitter_context *blitter, 3934c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák void *gs) 3944c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák{ 3954c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák blitter->saved_gs = gs; 3964c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák} 3974c417697b6fa1503ac35b34e79f23716d813a208Marek Olšák 3984c417697b6fa1503ac35b34e79f23716d813a208Marek Olšákstatic INLINE 39955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_save_framebuffer(struct blitter_context *blitter, 4000b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák const struct pipe_framebuffer_state *state) 40155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 4020b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák blitter->saved_fb_state.nr_cbufs = 0; /* It's ~0 now, meaning it's unsaved. */ 403a922725118333e016a357008f37105c23c6f54bcMarek Olšák util_copy_framebuffer_state(&blitter->saved_fb_state, state); 40455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 40555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 40655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic INLINE 407932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krolvoid util_blitter_save_viewport(struct blitter_context *blitter, 408932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol struct pipe_viewport_state *state) 409932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol{ 410932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol blitter->saved_viewport = *state; 411932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol} 412932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 413932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krolstatic INLINE 41455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_save_fragment_sampler_states( 41555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context *blitter, 41655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int num_sampler_states, 41755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void **sampler_states) 41855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 41955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák assert(num_sampler_states <= Elements(blitter->saved_sampler_states)); 42055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 42155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter->saved_num_sampler_states = num_sampler_states; 42255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák memcpy(blitter->saved_sampler_states, sampler_states, 42355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák num_sampler_states * sizeof(void *)); 42455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 42555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 426f6106566081978f663cf08e54bb8908cb58a5316Michal Krolstatic INLINE void 427f6106566081978f663cf08e54bb8908cb58a5316Michal Krolutil_blitter_save_fragment_sampler_views(struct blitter_context *blitter, 428f6106566081978f663cf08e54bb8908cb58a5316Michal Krol int num_views, 429f6106566081978f663cf08e54bb8908cb58a5316Michal Krol struct pipe_sampler_view **views) 43055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 4310b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák unsigned i; 432f6106566081978f663cf08e54bb8908cb58a5316Michal Krol assert(num_views <= Elements(blitter->saved_sampler_views)); 43355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 434f6106566081978f663cf08e54bb8908cb58a5316Michal Krol blitter->saved_num_sampler_views = num_views; 4350b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák for (i = 0; i < num_views; i++) 4360b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák pipe_sampler_view_reference(&blitter->saved_sampler_views[i], 4370b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák views[i]); 43855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 43955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 44064aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieristatic INLINE void 44164aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieriutil_blitter_save_vertex_buffers(struct blitter_context *blitter, 442c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák int num_vertex_buffers, 443c12c05c198f1cfd63eb52eeeb3c6e22dcb169b32Marek Olšák struct pipe_vertex_buffer *vertex_buffers) 44464aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri{ 44564aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri assert(num_vertex_buffers <= Elements(blitter->saved_vertex_buffers)); 44664aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri 4473c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák blitter->saved_num_vertex_buffers = 0; 4483c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák util_copy_vertex_buffers(blitter->saved_vertex_buffers, 4493c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák (unsigned*)&blitter->saved_num_vertex_buffers, 4503c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák vertex_buffers, 4513c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák num_vertex_buffers); 45264aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri} 45364aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri 454b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšákstatic INLINE void 455b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšákutil_blitter_save_so_targets(struct blitter_context *blitter, 456b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák int num_targets, 457b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák struct pipe_stream_output_target **targets) 458b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák{ 459b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák unsigned i; 460b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák assert(num_targets <= Elements(blitter->saved_so_targets)); 461b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák 462b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák blitter->saved_num_so_targets = num_targets; 463b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák for (i = 0; i < num_targets; i++) 464b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák pipe_so_target_reference(&blitter->saved_so_targets[i], 465b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák targets[i]); 466b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák} 467b177e2c54c7dbec58c2547524abe89e52d458252Marek Olšák 4686c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšákstatic INLINE void 4696c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšákutil_blitter_save_sample_mask(struct blitter_context *blitter, 4706c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák unsigned sample_mask) 4716c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák{ 4726c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák blitter->is_sample_mask_saved = TRUE; 4736c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák blitter->saved_sample_mask = sample_mask; 4746c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák} 4756c420b166814fccb160e39cc9ea8cbdaf4e7c830Marek Olšák 47655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#ifdef __cplusplus 47755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 47855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#endif 47955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 48055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#endif 481