u_blitter.c revision cec2082ae515bc91e6b29084ba4b8deac28ef923
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. */ 665d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák void *vs; /**< Vertex shader which passes {pos, generic} to the output.*/ 6755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 6855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Fragment shaders. */ 69677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas /* The shader at index i outputs color to color buffers 0,1,...,i-1. */ 70677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas void *fs_col[PIPE_MAX_COLOR_BUFS+1]; 71ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 72ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák /* FS which outputs a color from a texture, 73ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák where the index is PIPE_TEXTURE_* to be sampled. */ 74ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák void *fs_texfetch_col[PIPE_MAX_TEXTURE_TYPES]; 75ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 76ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák /* FS which outputs a depth from a texture, 77ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák where the index is PIPE_TEXTURE_* to be sampled. */ 78ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák void *fs_texfetch_depth[PIPE_MAX_TEXTURE_TYPES]; 7955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 8055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Blend state. */ 8155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *blend_write_color; /**< blend state with writemask of RGBA */ 8255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *blend_keep_color; /**< blend state with writemask of 0 */ 8355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 8455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Depth stencil alpha state. */ 851a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger void *dsa_write_depth_stencil; 8655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *dsa_write_depth_keep_stencil; 8755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *dsa_keep_depth_stencil; 88a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger void *dsa_keep_depth_write_stencil; 8955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 90ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger void *velem_state; 91ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger 92ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák /* Sampler state for clamping to a miplevel. */ 93d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri void *sampler_state[PIPE_MAX_TEXTURE_LEVELS * 2]; 94ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 95ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák /* Rasterizer state. */ 96ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák void *rs_state; 97f6106566081978f663cf08e54bb8908cb58a5316Michal Krol 98932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* Viewport state. */ 99932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol struct pipe_viewport_state viewport; 100932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 101932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* Clip state. */ 102932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol struct pipe_clip_state clip; 1033bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák 1043bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák /* Destination surface dimensions. */ 1053bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák unsigned dst_width; 1063bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák unsigned dst_height; 10755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}; 10855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1099be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter, 1109be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned x, unsigned y, 1119be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned width, unsigned height, 1129be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák float depth, 1139be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák enum blitter_attrib_type type, 1149be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák const float attrib[4]); 1159be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 1169be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 11755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context *util_blitter_create(struct pipe_context *pipe) 11855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 11955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx; 1200c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul struct pipe_blend_state blend; 1210c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul struct pipe_depth_stencil_alpha_state dsa; 1220c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul struct pipe_rasterizer_state rs_state; 12385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák struct pipe_sampler_state *sampler_state; 124ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger struct pipe_vertex_element velem[2]; 12585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák unsigned i; 12655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 12755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx = CALLOC_STRUCT(blitter_context_priv); 12855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák if (!ctx) 12955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák return NULL; 13055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1319b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.pipe = pipe; 1329be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák ctx->base.draw_rectangle = blitter_draw_rectangle; 13355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 13455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* init state objects for them to be considered invalid */ 1359b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_blend_state = INVALID_PTR; 1369b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_dsa_state = INVALID_PTR; 1379b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_rs_state = INVALID_PTR; 1389b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fs = INVALID_PTR; 1399b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_vs = INVALID_PTR; 1409b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_velem_state = INVALID_PTR; 1419b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fb_state.nr_cbufs = ~0; 1429b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_views = ~0; 1439b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_states = ~0; 1449b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_vertex_buffers = ~0; 14555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 14655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* blend state objects */ 1470c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul memset(&blend, 0, sizeof(blend)); 14855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->blend_keep_color = pipe->create_blend_state(pipe, &blend); 14955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 150eba1e2a44718bea398e49d496a78ee002c9922b8Roland Scheidegger blend.rt[0].colormask = PIPE_MASK_RGBA; 15155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->blend_write_color = pipe->create_blend_state(pipe, &blend); 15255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 15355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* depth stencil alpha state objects */ 1540c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul memset(&dsa, 0, sizeof(dsa)); 15555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_keep_depth_stencil = 1561a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 15755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 158f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák dsa.depth.enabled = 1; 159f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák dsa.depth.writemask = 1; 160f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák dsa.depth.func = PIPE_FUNC_ALWAYS; 16155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil = 1621a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 1631a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger 1641a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].enabled = 1; 1651a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].func = PIPE_FUNC_ALWAYS; 1661a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE; 1671a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE; 1681a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE; 1691a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].valuemask = 0xff; 1701a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].writemask = 0xff; 1711a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger ctx->dsa_write_depth_stencil = 1721a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 173a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 174a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 175a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger dsa.depth.enabled = 0; 176a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger dsa.depth.writemask = 0; 177a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger ctx->dsa_keep_depth_write_stencil = 178a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 17955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 18055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* sampler state */ 18185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state = &ctx->template_sampler_state; 18285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 18385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 18485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 1852ee0d19ccf768c4c12c3c3476c1cd7eff508629aCorbin Simpson sampler_state->normalized_coords = TRUE; 18685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* The sampler state objects which sample from a specified mipmap level 18785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák * are created on-demand. */ 18855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 18955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* rasterizer state */ 19055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák memset(&rs_state, 0, sizeof(rs_state)); 1910bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell rs_state.cull_face = PIPE_FACE_NONE; 19255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák rs_state.gl_rasterization_rules = 1; 1931c75edf3e8ccc97f5f91f42f99c1f8db30b25fc4Corbin Simpson rs_state.flatshade = 1; 19455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->rs_state = pipe->create_rasterizer_state(pipe, &rs_state); 19555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 196ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger /* vertex elements state */ 197ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger memset(&velem[0], 0, sizeof(velem[0]) * 2); 198ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger for (i = 0; i < 2; i++) { 199ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].src_offset = i * 4 * sizeof(float); 200ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].instance_divisor = 0; 201ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].vertex_buffer_index = 0; 202ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 203ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger } 204ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger ctx->velem_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]); 205ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger 20685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* fragment shaders are created on-demand */ 20785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 2085d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák /* vertex shader */ 20955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák { 21055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const uint semantic_names[] = { TGSI_SEMANTIC_POSITION, 21155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák TGSI_SEMANTIC_GENERIC }; 21255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const uint semantic_indices[] = { 0, 0 }; 2135d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák ctx->vs = 21455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák util_make_vertex_passthrough_shader(pipe, 2, semantic_names, 21555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák semantic_indices); 21655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 21755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 21855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set invariant vertex coordinates */ 21955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 22055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][0][3] = 1; /*v.w*/ 22155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 22255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* create the vertex buffer */ 2232a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák ctx->vbuf = pipe_user_buffer_create(ctx->base.pipe->screen, 2242a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák ctx->vertices, 2252a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák sizeof(ctx->vertices), 2262a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák PIPE_BIND_VERTEX_BUFFER); 22755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 2289b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák return &ctx->base; 22955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 23055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 23155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_destroy(struct blitter_context *blitter) 23255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 23355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 2349b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = blitter->pipe; 23555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 23655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 23755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_blend_state(pipe, ctx->blend_write_color); 23855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_blend_state(pipe, ctx->blend_keep_color); 23955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 24055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_depth_stencil_alpha_state(pipe, 24155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil); 2421a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 243a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 2446a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson 24555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_rasterizer_state(pipe, ctx->rs_state); 2465d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->delete_vs_state(pipe, ctx->vs); 247ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->delete_vertex_elements_state(pipe, ctx->velem_state); 24855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 249ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák for (i = 0; i < PIPE_MAX_TEXTURE_TYPES; i++) { 25085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_texfetch_col[i]) 25185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_texfetch_col[i]); 25285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_texfetch_depth[i]) 25385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_texfetch_depth[i]); 25455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 255ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 256b51f6e7c2350f637337fc3935436e2f99f669dfdJoakim Sindholt for (i = 0; i <= PIPE_MAX_COLOR_BUFS; i++) 25785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_col[i]) 25885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_col[i]); 25955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 260d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri for (i = 0; i < PIPE_MAX_TEXTURE_LEVELS * 2; i++) 26185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->sampler_state[i]) 26285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_sampler_state(pipe, ctx->sampler_state[i]); 263ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 264287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&ctx->vbuf, NULL); 26555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák FREE(ctx); 26655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 26755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 26855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_check_saved_CSOs(struct blitter_context_priv *ctx) 26955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 270ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák if (ctx->base.running) { 2719a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák _debug_printf("u_blitter: Caught recursion on save. " 2729a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák "This is a driver bug.\n"); 2739a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák } 274ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák ctx->base.running = TRUE; 2759a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák 27655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* make sure these CSOs have been saved */ 2779b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák assert(ctx->base.saved_blend_state != INVALID_PTR && 2789b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_dsa_state != INVALID_PTR && 2799b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_rs_state != INVALID_PTR && 2809b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fs != INVALID_PTR && 2819b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_vs != INVALID_PTR && 2829b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_velem_state != INVALID_PTR); 28355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 28455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 28555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_restore_CSOs(struct blitter_context_priv *ctx) 28655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 2879b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 2888f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák unsigned i; 28955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 29055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* restore the state objects which are always required to be saved */ 2919b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_blend_state(pipe, ctx->base.saved_blend_state); 2929b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->base.saved_dsa_state); 2939b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_rasterizer_state(pipe, ctx->base.saved_rs_state); 2949b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_fs_state(pipe, ctx->base.saved_fs); 2959b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_vs_state(pipe, ctx->base.saved_vs); 2969b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->bind_vertex_elements_state(pipe, ctx->base.saved_velem_state); 29755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 2989b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_blend_state = INVALID_PTR; 2999b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_dsa_state = INVALID_PTR; 3009b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_rs_state = INVALID_PTR; 3019b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fs = INVALID_PTR; 3029b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_vs = INVALID_PTR; 3039b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_velem_state = INVALID_PTR; 30455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3059b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_stencil_ref(pipe, &ctx->base.saved_stencil_ref); 3069b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_viewport_state(pipe, &ctx->base.saved_viewport); 3079b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_clip_state(pipe, &ctx->base.saved_clip); 308932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 30955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* restore the state objects which are required to be saved before copy/fill 31055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák */ 3119b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák if (ctx->base.saved_fb_state.nr_cbufs != ~0) { 3129b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe->set_framebuffer_state(pipe, &ctx->base.saved_fb_state); 313a922725118333e016a357008f37105c23c6f54bcMarek Olšák util_unreference_framebuffer_state(&ctx->base.saved_fb_state); 3149b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_fb_state.nr_cbufs = ~0; 31555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 31655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3179b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák if (ctx->base.saved_num_sampler_states != ~0) { 31855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_fragment_sampler_states(pipe, 3199b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_states, 3209b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_sampler_states); 3219b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_states = ~0; 32255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 32355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3249b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák if (ctx->base.saved_num_sampler_views != ~0) { 325f6106566081978f663cf08e54bb8908cb58a5316Michal Krol pipe->set_fragment_sampler_views(pipe, 3269b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_views, 3279b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_sampler_views); 3280b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák 3299b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák for (i = 0; i < ctx->base.saved_num_sampler_views; i++) 3309b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe_sampler_view_reference(&ctx->base.saved_sampler_views[i], 3310b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák NULL); 3320b50fcbd556ead8d35c2b543f13de433996a5822Marek Olšák 3339b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_sampler_views = ~0; 33455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 33564aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri 3369b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák if (ctx->base.saved_num_vertex_buffers != ~0) { 33764aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri pipe->set_vertex_buffers(pipe, 3389b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_vertex_buffers, 3399b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_vertex_buffers); 3408f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák 3419b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák for (i = 0; i < ctx->base.saved_num_vertex_buffers; i++) { 3429b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák if (ctx->base.saved_vertex_buffers[i].buffer) { 3439b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák pipe_resource_reference(&ctx->base.saved_vertex_buffers[i].buffer, 3448f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák NULL); 3458f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák } 3468f17e011c341ff78ada9543545c1f41caf66b2e9Marek Olšák } 3479b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.saved_num_vertex_buffers = ~0; 34864aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri } 3499a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák 350ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák if (!ctx->base.running) { 3519a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák _debug_printf("u_blitter: Caught recursion on restore. " 3529a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák "This is a driver bug.\n"); 3539a3523e38b8703211829a666661e8cbffdb0936fMarek Olšák } 354ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák ctx->base.running = FALSE; 35555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 35655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 35755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_rectangle(struct blitter_context_priv *ctx, 35855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 35955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x2, unsigned y2, 36055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák float depth) 36155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 36255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 36355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 36455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set vertex positions */ 3653bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[0][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v0.x*/ 3663bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[0][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v0.y*/ 36755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3683bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[1][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v1.x*/ 3693bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[1][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v1.y*/ 37055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3713bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[2][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v2.x*/ 3723bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[2][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v2.y*/ 37355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 3743bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[3][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v3.x*/ 3753bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->vertices[3][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v3.y*/ 37655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 37755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 37855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][0][2] = depth; /*z*/ 379932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 380932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* viewport */ 3813bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.scale[0] = 0.5f * ctx->dst_width; 3823bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.scale[1] = 0.5f * ctx->dst_height; 383ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák ctx->viewport.scale[2] = 1.0f; 384932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->viewport.scale[3] = 1.0f; 3853bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.translate[0] = 0.5f * ctx->dst_width; 3863bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->viewport.translate[1] = 0.5f * ctx->dst_height; 387ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák ctx->viewport.translate[2] = 0.0f; 388932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->viewport.translate[3] = 0.0f; 3899b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.pipe->set_viewport_state(ctx->base.pipe, &ctx->viewport); 390932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 391932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* clip */ 3929b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák ctx->base.pipe->set_clip_state(ctx->base.pipe, &ctx->clip); 39355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 39455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 39555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_clear_color(struct blitter_context_priv *ctx, 39655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const float *rgba) 39755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 39855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 39955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 400fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák if (rgba) { 40116d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák for (i = 0; i < 4; i++) { 40216d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][0] = rgba[0]; 40316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][1] = rgba[1]; 40416d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][2] = rgba[2]; 40516d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][3] = rgba[3]; 40616d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák } 407fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák } else { 40816d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák for (i = 0; i < 4; i++) { 40916d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][0] = 0; 41016d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][1] = 0; 41116d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][2] = 0; 41216d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][3] = 0; 41316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák } 41455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 41555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 41655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 417d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieristatic void get_texcoords(struct pipe_resource *src, 4184c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned level, 4194c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned x1, unsigned y1, 4204c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned x2, unsigned y2, 4214c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger boolean normalized, float out[4]) 422749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{ 423d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri if(normalized) 424d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri { 4254c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger out[0] = x1 / (float)u_minify(src->width0, level); 4264c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger out[1] = y1 / (float)u_minify(src->height0, level); 4274c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger out[2] = x2 / (float)u_minify(src->width0, level); 4284c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger out[3] = y2 / (float)u_minify(src->height0, level); 429d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri } 430d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri else 431d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri { 432d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[0] = x1; 433d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[1] = y1; 434d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[2] = x2; 435d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri out[3] = y2; 436d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri } 437749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák} 438749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák 439749e24521a31178d2b647aa2954c3eecd597b799Marek Olšákstatic void set_texcoords_in_vertices(const float coord[4], 440749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák float *out, unsigned stride) 441749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák{ 442749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[0]; /*t0.s*/ 443749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[1]; /*t0.t*/ 444749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out += stride; 445749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[2]; /*t1.s*/ 446749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[1]; /*t1.t*/ 447749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out += stride; 448749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[2]; /*t2.s*/ 449749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[3]; /*t2.t*/ 450749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out += stride; 451749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[0] = coord[0]; /*t3.s*/ 452749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák out[1] = coord[3]; /*t3.t*/ 453749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák} 454749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák 45555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_2d(struct blitter_context_priv *ctx, 456876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *src, 4574c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned level, 45855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 45955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x2, unsigned y2) 46055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 461749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák unsigned i; 462749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák float coord[4]; 46355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 4644c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger get_texcoords(src, level, x1, y1, x2, y2, TRUE, coord); 465749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák set_texcoords_in_vertices(coord, &ctx->vertices[0][1][0], 8); 46655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 46755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) { 46855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][1][2] = 0; /*r*/ 46955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][1][3] = 1; /*q*/ 47055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 47155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 47255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 47355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_3d(struct blitter_context_priv *ctx, 474876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *src, 4754c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned level, 476876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned zslice, 47755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 47855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x2, unsigned y2) 47955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 48055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 4814c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger float r = zslice / (float)u_minify(src->depth0, level); 48255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 4834c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger blitter_set_texcoords_2d(ctx, src, level, x1, y1, x2, y2); 48455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 48555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 48655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][1][2] = r; /*r*/ 48755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 48855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 48955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_cube(struct blitter_context_priv *ctx, 490876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *src, 4914c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned level, unsigned face, 49255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 49355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x2, unsigned y2) 49455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 49555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 496749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák float coord[4]; 497d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul float st[4][2]; 498d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul 4994c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger get_texcoords(src, level, x1, y1, x2, y2, TRUE, coord); 500749e24521a31178d2b647aa2954c3eecd597b799Marek Olšák set_texcoords_in_vertices(coord, &st[0][0], 2); 50155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 5024c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger util_map_texcoords2d_onto_cubemap(face, 50355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* pointer, stride in floats */ 50455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák &st[0][0], 2, 50555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák &ctx->vertices[0][1][0], 8); 50655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 50755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 50855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][1][3] = 1; /*q*/ 50955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 51055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 5113bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákstatic void blitter_set_dst_dimensions(struct blitter_context_priv *ctx, 5123bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák unsigned width, unsigned height) 5133bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák{ 5143bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->dst_width = width; 5153bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák ctx->dst_height = height; 5163bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák} 5173bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák 51885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 51985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid **blitter_get_sampler_state(struct blitter_context_priv *ctx, 520d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri int miplevel, boolean normalized) 52185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 5229b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 52385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák struct pipe_sampler_state *sampler_state = &ctx->template_sampler_state; 52485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 52585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(miplevel < PIPE_MAX_TEXTURE_LEVELS); 52685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 52785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Create the sampler state on-demand. */ 528d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri if (!ctx->sampler_state[miplevel * 2 + normalized]) { 52985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->lod_bias = miplevel; 53085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->min_lod = miplevel; 53185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->max_lod = miplevel; 532d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri sampler_state->normalized_coords = normalized; 53385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 534d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri ctx->sampler_state[miplevel * 2 + normalized] = 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. */ 540d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri return &ctx->sampler_state[miplevel * 2 + normalized]; 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] = 5525d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák util_make_fragment_cloneinput_shader(pipe, num_cbufs, 5535d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák TGSI_SEMANTIC_GENERIC, 5545d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák TGSI_INTERPOLATE_LINEAR); 55585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 556677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas return ctx->fs_col[num_cbufs]; 55785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 55885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 559d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul/** Convert PIPE_TEXTURE_x to TGSI_TEXTURE_x */ 560d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paulstatic unsigned 5613bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšákpipe_tex_to_tgsi_tex(enum pipe_texture_target pipe_tex_target) 562d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul{ 563d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul switch (pipe_tex_target) { 564d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul case PIPE_TEXTURE_1D: 565d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_1D; 566d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul case PIPE_TEXTURE_2D: 567d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_2D; 568ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri case PIPE_TEXTURE_RECT: 569cbe367227959a32ff20e146106162a81d2be02c3Luca Barbieri return TGSI_TEXTURE_RECT; 570d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul case PIPE_TEXTURE_3D: 571d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_3D; 572d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul case PIPE_TEXTURE_CUBE: 573d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_CUBE; 574d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul default: 575d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul assert(0 && "unexpected texture target"); 576d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul return TGSI_TEXTURE_UNKNOWN; 577d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul } 578d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul} 579d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 580d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 58185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 58285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_col(struct blitter_context_priv *ctx, 58385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák unsigned tex_target) 58485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 5859b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 58685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 58785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(tex_target < PIPE_MAX_TEXTURE_TYPES); 58885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 58985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Create the fragment shader on-demand. */ 59085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (!ctx->fs_texfetch_col[tex_target]) { 591d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target); 592d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 593d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul ctx->fs_texfetch_col[tex_target] = 594d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul util_make_fragment_tex_shader(pipe, tgsi_tex, TGSI_INTERPOLATE_LINEAR); 59585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák } 59685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 59785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák return ctx->fs_texfetch_col[tex_target]; 59885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 59985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 60085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 60185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_depth(struct blitter_context_priv *ctx, 60285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák unsigned tex_target) 60385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 6049b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 60585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 60685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(tex_target < PIPE_MAX_TEXTURE_TYPES); 60785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 60885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Create the fragment shader on-demand. */ 60985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (!ctx->fs_texfetch_depth[tex_target]) { 610d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul unsigned tgsi_tex = pipe_tex_to_tgsi_tex(tex_target); 611d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul 612d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul ctx->fs_texfetch_depth[tex_target] = 613d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul util_make_fragment_tex_shader_writedepth(pipe, tgsi_tex, 614d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul TGSI_INTERPOLATE_LINEAR); 61585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák } 61685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 61785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák return ctx->fs_texfetch_depth[tex_target]; 61885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 61985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 6209be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšákstatic void blitter_draw_rectangle(struct blitter_context *blitter, 6219be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned x1, unsigned y1, 6229be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák unsigned x2, unsigned y2, 6239be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák float depth, 6249be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák enum blitter_attrib_type type, 6259be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák const float attrib[4]) 6269be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák{ 6279be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 6289be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 6299be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák switch (type) { 6309be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák case UTIL_BLITTER_ATTRIB_COLOR: 6319be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_clear_color(ctx, attrib); 6329be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák break; 6339be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 6349be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák case UTIL_BLITTER_ATTRIB_TEXCOORD: 6359be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák set_texcoords_in_vertices(attrib, &ctx->vertices[0][1][0], 8); 6369be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák break; 6379be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 6389be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák default:; 6399be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák } 6409be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 6419be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_rectangle(ctx, x1, y1, x2, y2, depth); 642588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák ctx->base.pipe->redefine_user_buffer(ctx->base.pipe, ctx->vbuf, 643588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák 0, ctx->vbuf->width0); 644d5062fb3a315c46d77d5c954a3e3c14be1907d33Marek Olšák util_draw_vertex_buffer(ctx->base.pipe, NULL, ctx->vbuf, 0, 6452a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák PIPE_PRIM_TRIANGLE_FAN, 4, 2); 6469be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák} 6479be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 648db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákstatic void util_blitter_clear_custom(struct blitter_context *blitter, 649db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned width, unsigned height, 650db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned num_cbufs, 651db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned clear_buffers, 652db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák const float *rgba, 653db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák double depth, unsigned stencil, 654db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák void *custom_blend, void *custom_dsa) 65555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 65655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 6579b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 6586a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson struct pipe_stencil_ref sr = { { 0 } }; 65955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 660ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák assert(num_cbufs <= PIPE_MAX_COLOR_BUFS); 66155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 66255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_check_saved_CSOs(ctx); 66355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 66455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* bind CSOs */ 665db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák if (custom_blend) { 666db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák pipe->bind_blend_state(pipe, custom_blend); 667db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if (clear_buffers & PIPE_CLEAR_COLOR) { 66855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 669db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else { 67055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_keep_color); 671db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } 67255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 673db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák if (custom_dsa) { 674db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, custom_dsa); 675db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if ((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) { 6761a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 677db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if (clear_buffers & PIPE_CLEAR_DEPTH) { 678a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil); 679db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else if (clear_buffers & PIPE_CLEAR_STENCIL) { 680a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 681db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } else { 68255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 683db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } 684db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 685db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák sr.ref_value[0] = stencil & 0xff; 686db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák pipe->set_stencil_ref(pipe, &sr); 68755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 68855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 689ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 69085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, num_cbufs)); 6915d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 69255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 6933bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák blitter_set_dst_dimensions(ctx, width, height); 6949be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, 0, 0, width, height, depth, 6959be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák UTIL_BLITTER_ATTRIB_COLOR, rgba); 69655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_restore_CSOs(ctx); 69755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 69855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 699db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid util_blitter_clear(struct blitter_context *blitter, 700db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned width, unsigned height, 701db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned num_cbufs, 702db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned clear_buffers, 703db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák const float *rgba, 704db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák double depth, unsigned stencil) 705db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák{ 706db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák util_blitter_clear_custom(blitter, width, height, num_cbufs, 707db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák clear_buffers, rgba, depth, stencil, 708db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák NULL, NULL); 709db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák} 710db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 711db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid util_blitter_clear_depth_custom(struct blitter_context *blitter, 712db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák unsigned width, unsigned height, 713db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák double depth, void *custom_dsa) 714db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák{ 715db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák const float rgba[4] = {0, 0, 0, 0}; 716db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák util_blitter_clear_custom(blitter, width, height, 0, 717db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 0, rgba, depth, 0, NULL, custom_dsa); 718db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák} 719db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 720876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákstatic 721876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákboolean is_overlap(unsigned sx1, unsigned sx2, unsigned sy1, unsigned sy2, 722876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned dx1, unsigned dx2, unsigned dy1, unsigned dy2) 723deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie{ 724876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return sx1 < dx2 && sx2 > dx1 && sy1 < dy2 && sy2 > dy1; 725deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie} 726deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie 727876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákvoid util_blitter_copy_region(struct blitter_context *blitter, 728876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *dst, 7294c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned dstlevel, 730876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned dstx, unsigned dsty, unsigned dstz, 731876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *src, 7324c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned srclevel, 7334c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger const struct pipe_box *srcbox, 734876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák boolean ignore_stencil) 73555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 73655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 7379b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 738876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_screen *screen = pipe->screen; 7394c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger struct pipe_surface *dstsurf, surf_templ; 74055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct pipe_framebuffer_state fb_state; 741f6106566081978f663cf08e54bb8908cb58a5316Michal Krol struct pipe_sampler_view viewTempl, *view; 742876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned bind; 7434c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned width = srcbox->width; 7444c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned height = srcbox->height; 745876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák boolean is_stencil, is_depth; 746d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri boolean normalized; 747876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 748876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Give up if textures are not set. */ 749876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák assert(dst && src); 750876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák if (!dst || !src) 751876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return; 752876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 753876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Sanity checks. */ 754876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák if (dst == src) { 7554c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger assert(!is_overlap(srcbox->x, srcbox->x + width, srcbox->y, srcbox->y + height, 756876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák dstx, dstx + width, dsty, dsty + height)); 757876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák } 758876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák assert(src->target < PIPE_MAX_TEXTURE_TYPES); 7594c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger /* XXX should handle 3d regions */ 7604c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger assert(srcbox->depth == 1); 761876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 762876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Is this a ZS format? */ 763876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák is_depth = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 0) != 0; 764876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák is_stencil = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 1) != 0; 765876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 766876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák if (is_depth || is_stencil) 767876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák bind = PIPE_BIND_DEPTH_STENCIL; 768876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák else 769876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák bind = PIPE_BIND_RENDER_TARGET; 770876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 771876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Check if we can sample from and render to the surfaces. */ 772876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* (assuming copying a stencil buffer is not possible) */ 773cec2082ae515bc91e6b29084ba4b8deac28ef923Stéphane Marchesin if ((!ignore_stencil && is_stencil) || 774876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák !screen->is_format_supported(screen, dst->format, dst->target, 775e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák dst->nr_samples, bind) || 776876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák !screen->is_format_supported(screen, src->format, src->target, 777e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák src->nr_samples, PIPE_BIND_SAMPLER_VIEW)) { 778ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák ctx->base.running = TRUE; 7794c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger util_resource_copy_region(pipe, dst, dstlevel, dstx, dsty, dstz, 7804c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger src, srclevel, srcbox); 781ac366af9fdb6853ccb172a3dd52a88063e5136e7Marek Olšák ctx->base.running = FALSE; 782876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return; 783876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák } 784876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 7854c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger /* Get surface. */ 7864c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger memset(&surf_templ, 0, sizeof(surf_templ)); 7874c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger u_surface_default_template(&surf_templ, dst, bind); 788ab21147c899ba1506df38438b6750d3dc5eaabdfHenri Verbeet surf_templ.format = util_format_linear(dst->format); 7894c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surf_templ.u.tex.level = dstlevel; 7904c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surf_templ.u.tex.first_layer = dstz; 7914c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surf_templ.u.tex.last_layer = dstz; 7924c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger dstsurf = pipe->create_surface(pipe, dst, &surf_templ); 79355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 794876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Check whether the states are properly saved. */ 795876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_check_saved_CSOs(ctx); 79655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák assert(blitter->saved_fb_state.nr_cbufs != ~0); 797f6106566081978f663cf08e54bb8908cb58a5316Michal Krol assert(blitter->saved_num_sampler_views != ~0); 79855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák assert(blitter->saved_num_sampler_states != ~0); 79955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 800876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Initialize framebuffer state. */ 801876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák fb_state.width = dstsurf->width; 802876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák fb_state.height = dstsurf->height; 80355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 80455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák if (is_depth) { 80555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_keep_color); 80655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, 80755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil); 80885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, 809876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_get_fs_texfetch_depth(ctx, src->target)); 81055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 81155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 0; 812876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák fb_state.zsbuf = dstsurf; 81355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } else { 81455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 81555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 81685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, 817876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_get_fs_texfetch_col(ctx, src->target)); 81855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 81955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 1; 820876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák fb_state.cbufs[0] = dstsurf; 82155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.zsbuf = 0; 82255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 82385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 824d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri normalized = src->target != PIPE_TEXTURE_RECT; 825d4ec85e62423336d3cddc45f26bef6764f435a18Luca Barbieri 826876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Initialize sampler view. */ 827ab21147c899ba1506df38438b6750d3dc5eaabdfHenri Verbeet u_sampler_view_default_template(&viewTempl, src, util_format_linear(src->format)); 828876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák view = pipe->create_sampler_view(pipe, src, &viewTempl); 829f6106566081978f663cf08e54bb8908cb58a5316Michal Krol 830876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Set rasterizer state, shaders, and textures. */ 83155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 8325d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 83385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fragment_sampler_states(pipe, 1, 8344c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger blitter_get_sampler_state(ctx, srclevel, normalized)); 835ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 836f6106566081978f663cf08e54bb8908cb58a5316Michal Krol pipe->set_fragment_sampler_views(pipe, 1, &view); 83755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 83855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 8399be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 8409be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 841876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák switch (src->target) { 8429be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw the quad with the draw_rectangle callback. */ 84355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák case PIPE_TEXTURE_1D: 84455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák case PIPE_TEXTURE_2D: 845ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri case PIPE_TEXTURE_RECT: 8469be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák { 8479be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Set texture coordinates. */ 8489be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák float coord[4]; 8494c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger get_texcoords(src, srclevel, srcbox->x, srcbox->y, 8504c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger srcbox->x+width, srcbox->y+height, normalized, coord); 8519be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 8529be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw. */ 8539be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0, 8549be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák UTIL_BLITTER_ATTRIB_TEXCOORD, coord); 8559be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák } 85655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák break; 8579be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 8589be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw the quad with the generic codepath. */ 85955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák case PIPE_TEXTURE_3D: 86055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák case PIPE_TEXTURE_CUBE: 8619be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Set texture coordinates. */ 8629be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák if (src->target == PIPE_TEXTURE_3D) 8634c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger blitter_set_texcoords_3d(ctx, src, srclevel, srcbox->z, 8644c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger srcbox->x, srcbox->y, 8654c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger srcbox->x + width, srcbox->y + height); 8669be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák else 8674c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger blitter_set_texcoords_cube(ctx, src, srclevel, srcbox->z, 8684c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger srcbox->x, srcbox->y, 8694c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger srcbox->x + width, srcbox->y + height); 8709be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 8719be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák /* Draw. */ 8729be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter_set_rectangle(ctx, dstx, dsty, dstx+width, dsty+height, 0); 873588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák ctx->base.pipe->redefine_user_buffer(ctx->base.pipe, ctx->vbuf, 874588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák 0, ctx->vbuf->width0); 875d5062fb3a315c46d77d5c954a3e3c14be1907d33Marek Olšák util_draw_vertex_buffer(ctx->base.pipe, NULL, ctx->vbuf, 0, 8762a456dc123e8263de8e4666890a34f403faa9a39Marek Olšák PIPE_PRIM_TRIANGLE_FAN, 4, 2); 87755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák break; 8789be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák 879ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák default: 880ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák assert(0); 881876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return; 88255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 88355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 88455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_restore_CSOs(ctx); 885876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 886876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák pipe_surface_reference(&dstsurf, NULL); 88757c3f70018bc7cd44eafd55d8147691a3c109b91Marek Olšák pipe_sampler_view_reference(&view, NULL); 88855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 88955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 890a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a color surface to a constant value. */ 891a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_render_target(struct blitter_context *blitter, 892a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger struct pipe_surface *dstsurf, 893a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger const float *rgba, 894a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned dstx, unsigned dsty, 895a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned width, unsigned height) 89655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 89755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 8989b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 89955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct pipe_framebuffer_state fb_state; 90055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 901a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger assert(dstsurf->texture); 902a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if (!dstsurf->texture) 90355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák return; 90455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 90555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* check the saved state */ 90655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_check_saved_CSOs(ctx); 90755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák assert(blitter->saved_fb_state.nr_cbufs != ~0); 90855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 90955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* bind CSOs */ 91055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 91155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 91255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 91385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1)); 9145d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 915ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 91655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 91755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set a framebuffer state */ 91859e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.width = dstsurf->width; 91959e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.height = dstsurf->height; 92055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 1; 92159e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.cbufs[0] = dstsurf; 92255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.zsbuf = 0; 92355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 92455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 9253bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 9269be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0, 9279be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák UTIL_BLITTER_ATTRIB_COLOR, rgba); 92855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_restore_CSOs(ctx); 929a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger} 93059e51d9640c242a7c919472d935a91889c7840c9Marek Olšák 931a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a depth stencil surface. */ 932a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_depth_stencil(struct blitter_context *blitter, 933a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger struct pipe_surface *dstsurf, 934a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned clear_flags, 935a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger double depth, 936a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned stencil, 937a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned dstx, unsigned dsty, 938a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned width, unsigned height) 939a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger{ 940a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 9419b03da9bddc9a39adde746fe377bbc66d7eac418Marek Olšák struct pipe_context *pipe = ctx->base.pipe; 942a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct pipe_framebuffer_state fb_state; 943a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct pipe_stencil_ref sr = { { 0 } }; 944a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 945a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger assert(dstsurf->texture); 946a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if (!dstsurf->texture) 947a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger return; 948a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 949a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* check the saved state */ 950a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger blitter_check_saved_CSOs(ctx); 951a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger assert(blitter->saved_fb_state.nr_cbufs != ~0); 952a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 953a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* bind CSOs */ 954a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_blend_state(pipe, ctx->blend_keep_color); 955a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if ((clear_flags & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) { 956a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger sr.ref_value[0] = stencil & 0xff; 957a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 958a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_stencil_ref(pipe, &sr); 959a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 960a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else if (clear_flags & PIPE_CLEAR_DEPTH) { 961a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil); 962a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 963a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else if (clear_flags & PIPE_CLEAR_STENCIL) { 964a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger sr.ref_value[0] = stencil & 0xff; 965a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 966a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_stencil_ref(pipe, &sr); 967a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 968a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else 969a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* hmm that should be illegal probably, or make it a no-op somewhere */ 970a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 971a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 972a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_rasterizer_state(pipe, ctx->rs_state); 973a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0)); 9745d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 975a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 976a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 977a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* set a framebuffer state */ 978a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.width = dstsurf->width; 979a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.height = dstsurf->height; 980a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.nr_cbufs = 0; 981a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.cbufs[0] = 0; 982a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.zsbuf = dstsurf; 983a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_framebuffer_state(pipe, &fb_state); 984a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 9853bd15a9e4336233b82b063ea7257eeeee7e03b07Marek Olšák blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 9869be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, depth, 9879be8f7d2267bffd607a759abe5a27099659d34b1Marek Olšák UTIL_BLITTER_ATTRIB_NONE, NULL); 988a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger blitter_restore_CSOs(ctx); 98955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 990f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 991c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie/* draw a rectangle across a region using a custom dsa stage - for r600g */ 992c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlievoid util_blitter_custom_depth_stencil(struct blitter_context *blitter, 993c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie struct pipe_surface *zsurf, 994c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie struct pipe_surface *cbsurf, 995c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie void *dsa_stage, float depth) 996f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák{ 997f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 998f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák struct pipe_context *pipe = ctx->base.pipe; 999f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák struct pipe_framebuffer_state fb_state; 1000f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1001c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie assert(zsurf->texture); 1002c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie if (!zsurf->texture) 1003f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák return; 1004f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1005f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák /* check the saved state */ 1006f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák blitter_check_saved_CSOs(ctx); 1007f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák assert(blitter->saved_fb_state.nr_cbufs != ~0); 1008f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1009f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák /* bind CSOs */ 1010c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie pipe->bind_blend_state(pipe, ctx->blend_write_color); 1011c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie pipe->bind_depth_stencil_alpha_state(pipe, dsa_stage); 1012f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1013f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 1014f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0)); 10155d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák pipe->bind_vs_state(pipe, ctx->vs); 1016f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 1017f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1018f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák /* set a framebuffer state */ 1019c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.width = zsurf->width; 1020c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.height = zsurf->height; 1021c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.nr_cbufs = 1; 1022c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie if (cbsurf) { 1023c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.cbufs[0] = cbsurf; 1024c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.nr_cbufs = 1; 1025c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie } else { 1026c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.cbufs[0] = NULL; 1027c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.nr_cbufs = 0; 1028c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie } 1029c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie fb_state.zsbuf = zsurf; 1030f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 1031f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák 1032c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie blitter_set_dst_dimensions(ctx, zsurf->width, zsurf->height); 1033c262c4a2ff1a19d0136771767ba63f04cf3b83e3Dave Airlie blitter->draw_rectangle(blitter, 0, 0, zsurf->width, zsurf->height, depth, 1034f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák UTIL_BLITTER_ATTRIB_NONE, NULL); 1035f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák blitter_restore_CSOs(ctx); 1036f668ea11bd0b1f662e0be523a4bc46835e011ffaMarek Olšák} 1037