u_blitter.c revision 9be8f7d2267bffd607a759abe5a27099659d34b1
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 29a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger * Blitter utility to facilitate acceleration of the clear, clear_render_target, clear_depth_stencil 30a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger * resource_copy_region functions. 3155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * 3255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák * @author Marek Olšák 3355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák */ 3455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "pipe/p_context.h" 3655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "pipe/p_defines.h" 3728486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 3855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "pipe/p_shader_tokens.h" 3955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "pipe/p_state.h" 4055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 41f874da422b1811c4cb5f700f424180793ea66d6fCorbin Simpson#include "util/u_format.h" 4255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_memory.h" 4355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_math.h" 4455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_blitter.h" 4555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_draw_quad.h" 46f6106566081978f663cf08e54bb8908cb58a5316Michal Krol#include "util/u_sampler.h" 4755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_simple_shaders.h" 488b0c217f2bc123bffd25cc4977d6abb1b3fa8186Brian Paul#include "util/u_surface.h" 4955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_texture.h" 5055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 51a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák#define INVALID_PTR ((void*)~0) 52a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák 5355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context_priv 5455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 559b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct blitter_context base; 5655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 57287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *vbuf; /**< quad */ 5855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 5955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák float vertices[4][2][4]; /**< {pos, color} or {pos, texcoord} */ 6055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 6185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Templates for various state objects. */ 6285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák struct pipe_sampler_state template_sampler_state; 6385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 6455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Constant state objects. */ 6555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Vertex shaders. */ 6655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *vs_col; /**< Vertex shader which passes {pos, color} to the output */ 671a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger void *vs_tex; /**< Vertex shader which passes {pos, texcoord} 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]; 72ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 73ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák /* FS which outputs a color from a texture, 74ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák where the index is PIPE_TEXTURE_* to be sampled. */ 75ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák void *fs_texfetch_col[PIPE_MAX_TEXTURE_TYPES]; 76ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 77ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák /* FS which outputs a depth from a texture, 78ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák where the index is PIPE_TEXTURE_* to be sampled. */ 79ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák void *fs_texfetch_depth[PIPE_MAX_TEXTURE_TYPES]; 8055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 8155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Blend state. */ 8255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *blend_write_color; /**< blend state with writemask of RGBA */ 8355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *blend_keep_color; /**< blend state with writemask of 0 */ 8455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 8555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Depth stencil alpha state. */ 861a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger void *dsa_write_depth_stencil; 8755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *dsa_write_depth_keep_stencil; 8855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *dsa_keep_depth_stencil; 89a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger void *dsa_keep_depth_write_stencil; 9055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 91ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger void *velem_state; 92ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger 93ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák /* Sampler state for clamping to a miplevel. */ 94ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák void *sampler_state[PIPE_MAX_TEXTURE_LEVELS]; 95ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 96ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák /* Rasterizer state. */ 97ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák void *rs_state; 98f6106566081978f663cf08e54bb8908cb58a5316Michal Krol 99932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* Viewport state. */ 100932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol struct pipe_viewport_state viewport; 101932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 102932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* Clip state. */ 103932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol struct pipe_clip_state clip; 1043bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák 1053bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák /* Destination surface dimensions. */ 1063bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák unsigned dst_width; 1073bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák unsigned dst_height; 10855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}; 10955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1109be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter, 1119be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned x, unsigned y, 1129be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned width, unsigned height, 1139be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák float depth, 1149be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák enum blitter_attrib_type type, 1159be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák const float attrib[4]); 1169be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 1179be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 11855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context *util_blitter_create(struct pipe_context *pipe) 11955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 12055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx; 1210c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul struct pipe_blend_state blend; 1220c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul struct pipe_depth_stencil_alpha_state dsa; 1230c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul struct pipe_rasterizer_state rs_state; 12485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák struct pipe_sampler_state *sampler_state; 125ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger struct pipe_vertex_element velem[2]; 12685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák unsigned i; 12755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 12855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx = CALLOC_STRUCT(blitter_context_priv); 12955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák if (!ctx) 13055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák return NULL; 13155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1329b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.pipe = pipe; 1339be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák ctx->base.draw_rectangle = blitter_draw_rectangle; 13455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 13555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* init state objects for them to be considered invalid */ 1369b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_blend_state = INVALID_PTR; 1379b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_dsa_state = INVALID_PTR; 1389b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_rs_state = INVALID_PTR; 1399b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fs = INVALID_PTR; 1409b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_vs = INVALID_PTR; 1419b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_velem_state = INVALID_PTR; 1429b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fb_state.nr_cbufs = ~0; 1439b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_views = ~0; 1449b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_states = ~0; 1459b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_vertex_buffers = ~0; 14655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 14755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* blend state objects */ 1480c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul memset(&blend, 0, sizeof(blend)); 14955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->blend_keep_color = pipe->create_blend_state(pipe, &blend); 15055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 151eba1e2a44718bea398e49d496a78ee002c9922b8Roland Scheidegger blend.rt[0].colormask = PIPE_MASK_RGBA; 15255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->blend_write_color = pipe->create_blend_state(pipe, &blend); 15355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 15455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* depth stencil alpha state objects */ 1550c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul memset(&dsa, 0, sizeof(dsa)); 15655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_keep_depth_stencil = 1571a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 15855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1591a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.depth.enabled = 1; 1601a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.depth.writemask = 1; 1611a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.depth.func = PIPE_FUNC_ALWAYS; 16255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil = 1631a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 1641a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger 1651a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].enabled = 1; 1661a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].func = PIPE_FUNC_ALWAYS; 1671a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE; 1681a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE; 1691a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE; 1701a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].valuemask = 0xff; 1711a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].writemask = 0xff; 1721a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger ctx->dsa_write_depth_stencil = 1731a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 174a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 175a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 176a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger dsa.depth.enabled = 0; 177a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger dsa.depth.writemask = 0; 178a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger ctx->dsa_keep_depth_write_stencil = 179a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 18055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 18155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* sampler state */ 18285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state = &ctx->template_sampler_state; 18385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 18485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 18585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 1862ee0d19ccf768c4c12c3c3476c1cd7eff508629aCorbin Simpson sampler_state->normalized_coords = TRUE; 18785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* The sampler state objects which sample from a specified mipmap level 18885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák * are created on-demand. */ 18955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 19055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* rasterizer state */ 19155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák memset(&rs_state, 0, sizeof(rs_state)); 1920bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell rs_state.cull_face = PIPE_FACE_NONE; 19355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák rs_state.gl_rasterization_rules = 1; 1941c75edf3e8ccc97f5f91f42f99c1f8db30b25fc4Corbin Simpson rs_state.flatshade = 1; 19555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->rs_state = pipe->create_rasterizer_state(pipe, &rs_state); 19655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 197ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger /* vertex elements state */ 198ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger memset(&velem[0], 0, sizeof(velem[0]) * 2); 199ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger for (i = 0; i < 2; i++) { 200ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].src_offset = i * 4 * sizeof(float); 201ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].instance_divisor = 0; 202ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].vertex_buffer_index = 0; 203ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 204ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger } 205ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger ctx->velem_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]); 206ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger 20785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* fragment shaders are created on-demand */ 20885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 20955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* vertex shaders */ 21055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák { 21155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const uint semantic_names[] = { TGSI_SEMANTIC_POSITION, 21255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák TGSI_SEMANTIC_COLOR }; 21355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const uint semantic_indices[] = { 0, 0 }; 21455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vs_col = 21555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák util_make_vertex_passthrough_shader(pipe, 2, semantic_names, 21655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák semantic_indices); 21755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 21855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák { 21955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const uint semantic_names[] = { TGSI_SEMANTIC_POSITION, 22055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák TGSI_SEMANTIC_GENERIC }; 22155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const uint semantic_indices[] = { 0, 0 }; 22255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vs_tex = 22355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák util_make_vertex_passthrough_shader(pipe, 2, semantic_names, 22455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák semantic_indices); 22555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 22655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 22755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set invariant vertex coordinates */ 22855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 22955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][0][3] = 1; /*v.w*/ 23055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 23155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* create the vertex buffer */ 2329b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->vbuf = pipe_buffer_create(ctx->base.pipe->screen, 233287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_VERTEX_BUFFER, 23455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák sizeof(ctx->vertices)); 23555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 2369b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák return &ctx->base; 23755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 23855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 23955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_destroy(struct blitter_context *blitter) 24055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 24155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 2429b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = blitter->pipe; 24355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 24455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 24555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_blend_state(pipe, ctx->blend_write_color); 24655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_blend_state(pipe, ctx->blend_keep_color); 24755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 24855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_depth_stencil_alpha_state(pipe, 24955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil); 2501a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 251a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 2526a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson 25355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_rasterizer_state(pipe, ctx->rs_state); 25455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_vs_state(pipe, ctx->vs_col); 25555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_vs_state(pipe, ctx->vs_tex); 256ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->delete_vertex_elements_state(pipe, ctx->velem_state); 25755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 258ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák for (i = 0; i < PIPE_MAX_TEXTURE_TYPES; i++) { 25985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_texfetch_col[i]) 26085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_texfetch_col[i]); 26185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_texfetch_depth[i]) 26285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_texfetch_depth[i]); 26355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 264ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 265677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas for (i = 0; i <= PIPE_MAX_COLOR_BUFS && ctx->fs_col[i]; i++) 26685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_col[i]) 26785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_col[i]); 26855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 269ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák for (i = 0; i < PIPE_MAX_TEXTURE_LEVELS; i++) 27085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->sampler_state[i]) 27185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_sampler_state(pipe, ctx->sampler_state[i]); 272ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 273287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&ctx->vbuf, NULL); 27455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák FREE(ctx); 27555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 27655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 27755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_check_saved_CSOs(struct blitter_context_priv *ctx) 27855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 27955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* make sure these CSOs have been saved */ 2809b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák assert(ctx->base.saved_blend_state != INVALID_PTR && 2819b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_dsa_state != INVALID_PTR && 2829b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_rs_state != INVALID_PTR && 2839b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fs != INVALID_PTR && 2849b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_vs != INVALID_PTR && 2859b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_velem_state != INVALID_PTR); 28655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 28755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 28855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_restore_CSOs(struct blitter_context_priv *ctx) 28955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 2909b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 2918f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák unsigned i; 29255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 29355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* restore the state objects which are always required to be saved */ 2949b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_blend_state(pipe, ctx->base.saved_blend_state); 2959b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->base.saved_dsa_state); 2969b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_rasterizer_state(pipe, ctx->base.saved_rs_state); 2979b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_fs_state(pipe, ctx->base.saved_fs); 2989b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_vs_state(pipe, ctx->base.saved_vs); 2999b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_vertex_elements_state(pipe, ctx->base.saved_velem_state); 30055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3019b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_blend_state = INVALID_PTR; 3029b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_dsa_state = INVALID_PTR; 3039b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_rs_state = INVALID_PTR; 3049b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fs = INVALID_PTR; 3059b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_vs = INVALID_PTR; 3069b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_velem_state = INVALID_PTR; 30755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3089b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_stencil_ref(pipe, &ctx->base.saved_stencil_ref); 309ed0f3b08b65679452132a9caeef1509a8dac23b9Roland Scheidegger 3109b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_viewport_state(pipe, &ctx->base.saved_viewport); 3119b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_clip_state(pipe, &ctx->base.saved_clip); 312932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 31355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* restore the state objects which are required to be saved before copy/fill 31455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák */ 3159b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák if (ctx->base.saved_fb_state.nr_cbufs != ~0) { 3169b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_framebuffer_state(pipe, &ctx->base.saved_fb_state); 3179b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák util_assign_framebuffer_state(&ctx->base.saved_fb_state, NULL); 3189b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fb_state.nr_cbufs = ~0; 31955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 32055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3219b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák if (ctx->base.saved_num_sampler_states != ~0) { 32255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_fragment_sampler_states(pipe, 3239b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_states, 3249b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_sampler_states); 3259b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_states = ~0; 32655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 32755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3289b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák if (ctx->base.saved_num_sampler_views != ~0) { 329f6106566081978f663cf08e54bb8908cb58a5316Michal Krol pipe->set_fragment_sampler_views(pipe, 3309b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_views, 3319b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_sampler_views); 3320b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák 3339b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák for (i = 0; i < ctx->base.saved_num_sampler_views; i++) 3349b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe_sampler_view_reference(&ctx->base.saved_sampler_views[i], 3350b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák NULL); 3360b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák 3379b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_views = ~0; 33855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 33964aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri 3409b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák if (ctx->base.saved_num_vertex_buffers != ~0) { 34164aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri pipe->set_vertex_buffers(pipe, 3429b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_vertex_buffers, 3439b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_vertex_buffers); 3448f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák 3459b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák for (i = 0; i < ctx->base.saved_num_vertex_buffers; i++) { 3469b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák if (ctx->base.saved_vertex_buffers[i].buffer) { 3479b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe_resource_reference(&ctx->base.saved_vertex_buffers[i].buffer, 3488f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák NULL); 3498f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák } 3508f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák } 3519b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_vertex_buffers = ~0; 35264aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri } 35355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 35455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 35555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_rectangle(struct blitter_context_priv *ctx, 35655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 35755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x2, unsigned y2, 35855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák float depth) 35955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 36055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 36155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 36255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set vertex positions */ 3633bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[0][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v0.x*/ 3643bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[0][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v0.y*/ 36555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3663bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[1][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v1.x*/ 3673bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[1][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v1.y*/ 36855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3693bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[2][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v2.x*/ 3703bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[2][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v2.y*/ 37155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3723bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[3][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v3.x*/ 3733bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[3][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v3.y*/ 37455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 37555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 37655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][0][2] = depth; /*z*/ 377932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 378932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* viewport */ 3793bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.scale[0] = 0.5f * ctx->dst_width; 3803bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.scale[1] = 0.5f * ctx->dst_height; 381ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák ctx->viewport.scale[2] = 1.0f; 382932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->viewport.scale[3] = 1.0f; 3833bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.translate[0] = 0.5f * ctx->dst_width; 3843bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.translate[1] = 0.5f * ctx->dst_height; 385ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák ctx->viewport.translate[2] = 0.0f; 386932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->viewport.translate[3] = 0.0f; 3879b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.pipe->set_viewport_state(ctx->base.pipe, &ctx->viewport); 388932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 389932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* clip */ 3909b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.pipe->set_clip_state(ctx->base.pipe, &ctx->clip); 39155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 39255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 39355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_clear_color(struct blitter_context_priv *ctx, 39455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const float *rgba) 39555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 39655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 39755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 398fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák if (rgba) { 39916d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák for (i = 0; i < 4; i++) { 40016d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][0] = rgba[0]; 40116d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][1] = rgba[1]; 40216d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][2] = rgba[2]; 40316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][3] = rgba[3]; 40416d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák } 405fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák } else { 40616d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák for (i = 0; i < 4; i++) { 40716d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][0] = 0; 40816d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][1] = 0; 40916d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][2] = 0; 41016d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][3] = 0; 41116d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák } 41255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 41355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 41455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 415749e24521a31178d2b647aa2954c3eecd597b799Marek Olšákstatic void get_normalized_texcoords(struct pipe_resource *src, 416749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák struct pipe_subresource subsrc, 417749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák unsigned x1, unsigned y1, 418749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák unsigned x2, unsigned y2, 419749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák float out[4]) 420749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{ 421749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = x1 / (float)u_minify(src->width0, subsrc.level); 422749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = y1 / (float)u_minify(src->height0, subsrc.level); 423749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[2] = x2 / (float)u_minify(src->width0, subsrc.level); 424749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[3] = y2 / (float)u_minify(src->height0, subsrc.level); 425749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák} 426749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák 427749e24521a31178d2b647aa2954c3eecd597b799Marek Olšákstatic void set_texcoords_in_vertices(const float coord[4], 428749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák float *out, unsigned stride) 429749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{ 430749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[0]; /*t0.s*/ 431749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[1]; /*t0.t*/ 432749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out += stride; 433749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[2]; /*t1.s*/ 434749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[1]; /*t1.t*/ 435749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out += stride; 436749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[2]; /*t2.s*/ 437749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[3]; /*t2.t*/ 438749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out += stride; 439749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[0]; /*t3.s*/ 440749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[3]; /*t3.t*/ 441749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák} 442749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák 44355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_2d(struct blitter_context_priv *ctx, 444876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *src, 445876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_subresource subsrc, 44655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 44755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x2, unsigned y2) 44855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 449749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák unsigned i; 450749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák float coord[4]; 45155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 452749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák get_normalized_texcoords(src, subsrc, x1, y1, x2, y2, coord); 453749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák set_texcoords_in_vertices(coord, &ctx->vertices[0][1][0], 8); 45455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 45555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) { 45655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][1][2] = 0; /*r*/ 45755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][1][3] = 1; /*q*/ 45855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 45955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 46055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 46155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_3d(struct blitter_context_priv *ctx, 462876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *src, 463876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_subresource subsrc, 464876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned zslice, 46555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 46655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x2, unsigned y2) 46755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 46855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 469876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák float r = zslice / (float)u_minify(src->depth0, subsrc.level); 47055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 471876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_set_texcoords_2d(ctx, src, subsrc, x1, y1, x2, y2); 47255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 47355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 47455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][1][2] = r; /*r*/ 47555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 47655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 47755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_cube(struct blitter_context_priv *ctx, 478876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *src, 479876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_subresource subsrc, 48055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 48155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x2, unsigned y2) 48255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 48355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 484749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák float coord[4]; 485d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul float st[4][2]; 486d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul 487749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák get_normalized_texcoords(src, subsrc, x1, y1, x2, y2, coord); 488749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák set_texcoords_in_vertices(coord, &st[0][0], 2); 48955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 490876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák util_map_texcoords2d_onto_cubemap(subsrc.face, 49155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* pointer, stride in floats */ 49255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák &st[0][0], 2, 49355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák &ctx->vertices[0][1][0], 8); 49455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 49555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 49655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][1][3] = 1; /*q*/ 49755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 49855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 4993bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákstatic void blitter_set_dst_dimensions(struct blitter_context_priv *ctx, 5003bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák unsigned width, unsigned height) 5013bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák{ 5023bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->dst_width = width; 5033bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->dst_height = height; 5043bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák} 5053bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák 50655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_draw_quad(struct blitter_context_priv *ctx) 50755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 5089b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 50955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 51080e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák /* write vertices and draw them */ 511287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_buffer_write(pipe, ctx->vbuf, 51280e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák 0, sizeof(ctx->vertices), ctx->vertices); 51355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 51480e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák util_draw_vertex_buffer(pipe, ctx->vbuf, 0, PIPE_PRIM_TRIANGLE_FAN, 51580e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák 4, /* verts */ 51680e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák 2); /* attribs/vert */ 51755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 51855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 51985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 52085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid **blitter_get_sampler_state(struct blitter_context_priv *ctx, 52185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák int miplevel) 52285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 5239b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 52485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák struct pipe_sampler_state *sampler_state = &ctx->template_sampler_state; 52585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 52685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(miplevel < PIPE_MAX_TEXTURE_LEVELS); 52785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 52885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Create the sampler state on-demand. */ 52985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (!ctx->sampler_state[miplevel]) { 53085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->lod_bias = miplevel; 53185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->min_lod = miplevel; 53285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->max_lod = miplevel; 53385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 53485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák ctx->sampler_state[miplevel] = pipe->create_sampler_state(pipe, 53585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state); 53685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák } 53785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 53885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Return void** so that it can be passed to bind_fragment_sampler_states 53985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák * directly. */ 54085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák return &ctx->sampler_state[miplevel]; 54185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 54285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 54385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 54485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_col(struct blitter_context_priv *ctx, unsigned num_cbufs) 54585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 5469b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 54785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 54885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(num_cbufs <= PIPE_MAX_COLOR_BUFS); 54985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 550677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas if (!ctx->fs_col[num_cbufs]) 551677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas ctx->fs_col[num_cbufs] = 55285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák util_make_fragment_clonecolor_shader(pipe, num_cbufs); 55385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 554677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas return ctx->fs_col[num_cbufs]; 55585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 55685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 557d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul/** Convert PIPE_TEXTURE_x to TGSI_TEXTURE_x */ 558d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paulstatic unsigned 5593bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákpipe_tex_to_tgsi_tex(enum pipe_texture_target pipe_tex_target) 560d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul{ 561d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul switch (pipe_tex_target) { 562d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul case PIPE_TEXTURE_1D: 563d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_1D; 564d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul case PIPE_TEXTURE_2D: 565d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_2D; 566d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul case PIPE_TEXTURE_3D: 567d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_3D; 568d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul case PIPE_TEXTURE_CUBE: 569d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_CUBE; 570d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul default: 571d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul assert(0 && "unexpected texture target"); 572d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_UNKNOWN; 573d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul } 574d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul} 575d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 576d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 57785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 57885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_col(struct blitter_context_priv *ctx, 57985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák unsigned tex_target) 58085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 5819b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 58285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 58385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(tex_target < PIPE_MAX_TEXTURE_TYPES); 58485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 58585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Create the fragment shader on-demand. */ 58685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (!ctx->fs_texfetch_col[tex_target]) { 587d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target); 588d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 589d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul ctx->fs_texfetch_col[tex_target] = 590d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul util_make_fragment_tex_shader(pipe, tgsi_tex, TGSI_INTERPOLATE_LINEAR); 59185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák } 59285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 59385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák return ctx->fs_texfetch_col[tex_target]; 59485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 59585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 59685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 59785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_depth(struct blitter_context_priv *ctx, 59885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák unsigned tex_target) 59985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 6009b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 60185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 60285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(tex_target < PIPE_MAX_TEXTURE_TYPES); 60385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 60485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Create the fragment shader on-demand. */ 60585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (!ctx->fs_texfetch_depth[tex_target]) { 606d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target); 607d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 608d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul ctx->fs_texfetch_depth[tex_target] = 609d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul util_make_fragment_tex_shader_writedepth(pipe, tgsi_tex, 610d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul TGSI_INTERPOLATE_LINEAR); 61185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák } 61285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 61385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák return ctx->fs_texfetch_depth[tex_target]; 61485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 61585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 6169be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter, 6179be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned x1, unsigned y1, 6189be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned x2, unsigned y2, 6199be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák float depth, 6209be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák enum blitter_attrib_type type, 6219be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák const float attrib[4]) 6229be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák{ 6239be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 6249be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 6259be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák switch (type) { 6269be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák case UTIL_BLITTER_ATTRIB_COLOR: 6279be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_clear_color(ctx, attrib); 6289be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák break; 6299be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 6309be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák case UTIL_BLITTER_ATTRIB_TEXCOORD: 6319be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák set_texcoords_in_vertices(attrib, &ctx->vertices[0][1][0], 8); 6329be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák break; 6339be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 6349be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák default:; 6359be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák } 6369be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 6379be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_rectangle(ctx, x1, y1, x2, y2, depth); 6389be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_draw_quad(ctx); 6399be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák} 6409be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 64155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_clear(struct blitter_context *blitter, 64255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned width, unsigned height, 64355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned num_cbufs, 64455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned clear_buffers, 64555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const float *rgba, 64655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák double depth, unsigned stencil) 64755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 64855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 6499b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 6506a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson struct pipe_stencil_ref sr = { { 0 } }; 65155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 652ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák assert(num_cbufs <= PIPE_MAX_COLOR_BUFS); 65355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 65455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_check_saved_CSOs(ctx); 65555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 65655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* bind CSOs */ 65755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák if (clear_buffers & PIPE_CLEAR_COLOR) 65855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 65955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák else 66055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_keep_color); 66155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 662a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if ((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) { 6631a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger sr.ref_value[0] = stencil & 0xff; 6641a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 6651a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->set_stencil_ref(pipe, &sr); 6661a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger } 667a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else if (clear_buffers & PIPE_CLEAR_DEPTH) { 668a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil); 669a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 670a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else if (clear_buffers & PIPE_CLEAR_STENCIL) { 671a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger sr.ref_value[0] = stencil & 0xff; 672a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 673a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_stencil_ref(pipe, &sr); 674a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 67555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák else 67655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 67755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 67855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 679ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 68085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, num_cbufs)); 68155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_vs_state(pipe, ctx->vs_col); 68255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 6833bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák blitter_set_dst_dimensions(ctx, width, height); 6849be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, 0, 0, width, height, depth, 6859be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák UTIL_BLITTER_ATTRIB_COLOR, rgba); 68655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_restore_CSOs(ctx); 68755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 68855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 689876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákstatic 690876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákboolean is_overlap(unsigned sx1, unsigned sx2, unsigned sy1, unsigned sy2, 691876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned dx1, unsigned dx2, unsigned dy1, unsigned dy2) 692deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie{ 693876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return sx1 < dx2 && sx2 > dx1 && sy1 < dy2 && sy2 > dy1; 694deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie} 695deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie 696876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákvoid util_blitter_copy_region(struct blitter_context *blitter, 697876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *dst, 698876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_subresource subdst, 699876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned dstx, unsigned dsty, unsigned dstz, 700876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *src, 701876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_subresource subsrc, 702876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned srcx, unsigned srcy, unsigned srcz, 703876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned width, unsigned height, 704876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák boolean ignore_stencil) 70555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 70655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 7079b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 708876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_screen *screen = pipe->screen; 709876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_surface *dstsurf; 71055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct pipe_framebuffer_state fb_state; 711f6106566081978f663cf08e54bb8908cb58a5316Michal Krol struct pipe_sampler_view viewTempl, *view; 712876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned bind; 713876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák boolean is_stencil, is_depth; 714876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 715876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Give up if textures are not set. */ 716876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák assert(dst && src); 717876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák if (!dst || !src) 718876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return; 719876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 720876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Sanity checks. */ 721876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák if (dst == src) { 722876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák assert(!is_overlap(srcx, srcx + width, srcy, srcy + height, 723876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák dstx, dstx + width, dsty, dsty + height)); 724876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák } else { 725876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák assert(dst->format == src->format); 726876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák } 727876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák assert(src->target < PIPE_MAX_TEXTURE_TYPES); 728876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 729876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Is this a ZS format? */ 730876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák is_depth = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 0) != 0; 731876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák is_stencil = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 1) != 0; 732876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 733876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák if (is_depth || is_stencil) 734876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák bind = PIPE_BIND_DEPTH_STENCIL; 735876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák else 736876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák bind = PIPE_BIND_RENDER_TARGET; 737876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 738876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Check if we can sample from and render to the surfaces. */ 739876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* (assuming copying a stencil buffer is not possible) */ 740876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák if ((!ignore_stencil && is_stencil) || 741876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák !screen->is_format_supported(screen, dst->format, dst->target, 742876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák dst->nr_samples, bind, 0) || 743876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák !screen->is_format_supported(screen, src->format, src->target, 744876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák src->nr_samples, PIPE_BIND_SAMPLER_VIEW, 0)) { 745876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák util_resource_copy_region(pipe, dst, subdst, dstx, dsty, dstz, 746876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák src, subsrc, srcx, srcy, srcz, width, height); 747876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return; 748876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák } 749876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 750876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Get surfaces. */ 751876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák dstsurf = screen->get_tex_surface(screen, dst, 752876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák subdst.face, subdst.level, dstz, 753876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák bind); 75455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 755876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Check whether the states are properly saved. */ 756876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_check_saved_CSOs(ctx); 75755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák assert(blitter->saved_fb_state.nr_cbufs != ~0); 758f6106566081978f663cf08e54bb8908cb58a5316Michal Krol assert(blitter->saved_num_sampler_views != ~0); 75955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák assert(blitter->saved_num_sampler_states != ~0); 76055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 761876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Initialize framebuffer state. */ 762876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák fb_state.width = dstsurf->width; 763876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák fb_state.height = dstsurf->height; 76455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 76555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák if (is_depth) { 76655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_keep_color); 76755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, 76855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil); 76985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, 770876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_get_fs_texfetch_depth(ctx, src->target)); 77155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 77255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 0; 773876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák fb_state.zsbuf = dstsurf; 77455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } else { 77555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 77655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 77785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, 778876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_get_fs_texfetch_col(ctx, src->target)); 77955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 78055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 1; 781876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák fb_state.cbufs[0] = dstsurf; 78255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.zsbuf = 0; 78355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 78485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 785876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Initialize sampler view. */ 786876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák u_sampler_view_default_template(&viewTempl, src, src->format); 787876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák view = pipe->create_sampler_view(pipe, src, &viewTempl); 788f6106566081978f663cf08e54bb8908cb58a5316Michal Krol 789876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Set rasterizer state, shaders, and textures. */ 79055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 79155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_vs_state(pipe, ctx->vs_tex); 79285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fragment_sampler_states(pipe, 1, 793876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_get_sampler_state(ctx, subsrc.level)); 794ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 795f6106566081978f663cf08e54bb8908cb58a5316Michal Krol pipe->set_fragment_sampler_views(pipe, 1, &view); 79655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 79755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 7989be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 7999be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 800876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák switch (src->target) { 8019be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw the quad with the draw_rectangle callback. */ 80255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák case PIPE_TEXTURE_1D: 80355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák case PIPE_TEXTURE_2D: 8049be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák { 8059be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Set texture coordinates. */ 8069be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák float coord[4]; 8079be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák get_normalized_texcoords(src, subsrc, srcx, srcy, 8089be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák srcx+width, srcy+height, coord); 8099be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 8109be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw. */ 8119be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0, 8129be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák UTIL_BLITTER_ATTRIB_TEXCOORD, coord); 8139be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák } 81455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák break; 8159be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 8169be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw the quad with the generic codepath. */ 81755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák case PIPE_TEXTURE_3D: 81855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák case PIPE_TEXTURE_CUBE: 8199be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Set texture coordinates. */ 8209be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák if (src->target == PIPE_TEXTURE_3D) 8219be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_texcoords_3d(ctx, src, subsrc, srcz, 8229be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák srcx, srcy, srcx+width, srcy+height); 8239be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák else 8249be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_texcoords_cube(ctx, src, subsrc, 8259be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák srcx, srcy, srcx+width, srcy+height); 8269be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 8279be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw. */ 8289be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_rectangle(ctx, dstx, dsty, dstx+width, dsty+height, 0); 8299be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_draw_quad(ctx); 83055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák break; 8319be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 832ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák default: 833ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák assert(0); 834876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return; 83555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 83655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 83755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_restore_CSOs(ctx); 838876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 839876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák pipe_surface_reference(&dstsurf, NULL); 84057c3f70018bc7cd44eafd55d8147691a3c109b91Marek Olšák pipe_sampler_view_reference(&view, NULL); 84155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 84255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 843a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a color surface to a constant value. */ 844a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_render_target(struct blitter_context *blitter, 845a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger struct pipe_surface *dstsurf, 846a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger const float *rgba, 847a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned dstx, unsigned dsty, 848a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned width, unsigned height) 84955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 85055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 8519b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 85255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct pipe_framebuffer_state fb_state; 85355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 854a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger assert(dstsurf->texture); 855a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if (!dstsurf->texture) 85655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák return; 85755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 85855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* check the saved state */ 85955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_check_saved_CSOs(ctx); 86055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák assert(blitter->saved_fb_state.nr_cbufs != ~0); 86155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 86255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* bind CSOs */ 86355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 86455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 86555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 86685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1)); 86755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_vs_state(pipe, ctx->vs_col); 868ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 86955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 87055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set a framebuffer state */ 87159e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.width = dstsurf->width; 87259e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.height = dstsurf->height; 87355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 1; 87459e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.cbufs[0] = dstsurf; 87555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.zsbuf = 0; 87655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 87755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 8783bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 8799be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0, 8809be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák UTIL_BLITTER_ATTRIB_COLOR, rgba); 88155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_restore_CSOs(ctx); 882a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger} 88359e51d9640c242a7c919472d935a91889c7840c9Marek Olšák 884a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a depth stencil surface. */ 885a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_depth_stencil(struct blitter_context *blitter, 886a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger struct pipe_surface *dstsurf, 887a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned clear_flags, 888a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger double depth, 889a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned stencil, 890a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned dstx, unsigned dsty, 891a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned width, unsigned height) 892a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger{ 893a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 8949b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 895a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct pipe_framebuffer_state fb_state; 896a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct pipe_stencil_ref sr = { { 0 } }; 897a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 898a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger assert(dstsurf->texture); 899a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if (!dstsurf->texture) 900a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger return; 901a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 902a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* check the saved state */ 903a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger blitter_check_saved_CSOs(ctx); 904a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger assert(blitter->saved_fb_state.nr_cbufs != ~0); 905a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 906a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* bind CSOs */ 907a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_blend_state(pipe, ctx->blend_keep_color); 908a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if ((clear_flags & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) { 909a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger sr.ref_value[0] = stencil & 0xff; 910a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 911a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_stencil_ref(pipe, &sr); 912a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 913a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else if (clear_flags & PIPE_CLEAR_DEPTH) { 914a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil); 915a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 916a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else if (clear_flags & PIPE_CLEAR_STENCIL) { 917a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger sr.ref_value[0] = stencil & 0xff; 918a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 919a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_stencil_ref(pipe, &sr); 920a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 921a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else 922a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* hmm that should be illegal probably, or make it a no-op somewhere */ 923a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 924a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 925a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_rasterizer_state(pipe, ctx->rs_state); 926a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0)); 927a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_vs_state(pipe, ctx->vs_col); 928a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 929a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 930a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* set a framebuffer state */ 931a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.width = dstsurf->width; 932a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.height = dstsurf->height; 933a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.nr_cbufs = 0; 934a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.cbufs[0] = 0; 935a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.zsbuf = dstsurf; 936a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_framebuffer_state(pipe, &fb_state); 937a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 9383bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 9399be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, depth, 9409be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák UTIL_BLITTER_ATTRIB_NONE, NULL); 941a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger blitter_restore_CSOs(ctx); 94255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 943