u_blitter.c revision a6e5c6c000df8655de3b41d5809547bb41c88c23
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" 4655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_pack_color.h" 47f6106566081978f663cf08e54bb8908cb58a5316Michal Krol#include "util/u_sampler.h" 4855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_simple_shaders.h" 498b0c217f2bc123bffd25cc4977d6abb1b3fa8186Brian Paul#include "util/u_surface.h" 5055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák#include "util/u_texture.h" 5155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 52a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák#define INVALID_PTR ((void*)~0) 53a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák 5455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context_priv 5555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 5655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context blitter; 5755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 5855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct pipe_context *pipe; /**< pipe context */ 59287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *vbuf; /**< quad */ 6055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 6155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák float vertices[4][2][4]; /**< {pos, color} or {pos, texcoord} */ 6255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 6385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Templates for various state objects. */ 6485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák struct pipe_sampler_state template_sampler_state; 6585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 6655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Constant state objects. */ 6755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Vertex shaders. */ 6855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *vs_col; /**< Vertex shader which passes {pos, color} to the output */ 691a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger void *vs_tex; /**< Vertex shader which passes {pos, texcoord} to the output.*/ 7055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 7155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Fragment shaders. */ 72677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas /* The shader at index i outputs color to color buffers 0,1,...,i-1. */ 73677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas void *fs_col[PIPE_MAX_COLOR_BUFS+1]; 74ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 75ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák /* FS which outputs a color from a texture, 76ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák where the index is PIPE_TEXTURE_* to be sampled. */ 77ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák void *fs_texfetch_col[PIPE_MAX_TEXTURE_TYPES]; 78ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 79ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák /* FS which outputs a depth from a texture, 80ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák where the index is PIPE_TEXTURE_* to be sampled. */ 81ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák void *fs_texfetch_depth[PIPE_MAX_TEXTURE_TYPES]; 8255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 8355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Blend state. */ 8455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *blend_write_color; /**< blend state with writemask of RGBA */ 8555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *blend_keep_color; /**< blend state with writemask of 0 */ 8655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 8755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* Depth stencil alpha state. */ 881a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger void *dsa_write_depth_stencil; 8955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *dsa_write_depth_keep_stencil; 9055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák void *dsa_keep_depth_stencil; 91a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger void *dsa_keep_depth_write_stencil; 9255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 93ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger void *velem_state; 94ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger 95ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák /* Sampler state for clamping to a miplevel. */ 96ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák void *sampler_state[PIPE_MAX_TEXTURE_LEVELS]; 97ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 98ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák /* Rasterizer state. */ 99ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák void *rs_state; 100f6106566081978f663cf08e54bb8908cb58a5316Michal Krol 101f6106566081978f663cf08e54bb8908cb58a5316Michal Krol struct pipe_sampler_view *sampler_view; 1023ce4375912c8ea488460e593e07c5bb15b92dca9Michal Krol 103932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* Viewport state. */ 104932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol struct pipe_viewport_state viewport; 105932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 106932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* Clip state. */ 107932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol struct pipe_clip_state clip; 10855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák}; 10955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 11055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstruct blitter_context *util_blitter_create(struct pipe_context *pipe) 11155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 11255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx; 1130c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul struct pipe_blend_state blend; 1140c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul struct pipe_depth_stencil_alpha_state dsa; 1150c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul struct pipe_rasterizer_state rs_state; 11685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák struct pipe_sampler_state *sampler_state; 117ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger struct pipe_vertex_element velem[2]; 11885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák unsigned i; 11955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 12055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx = CALLOC_STRUCT(blitter_context_priv); 12155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák if (!ctx) 12255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák return NULL; 12355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 12455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->pipe = pipe; 12555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 12655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* init state objects for them to be considered invalid */ 127a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák ctx->blitter.saved_blend_state = INVALID_PTR; 128a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák ctx->blitter.saved_dsa_state = INVALID_PTR; 129a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák ctx->blitter.saved_rs_state = INVALID_PTR; 130a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák ctx->blitter.saved_fs = INVALID_PTR; 131a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák ctx->blitter.saved_vs = INVALID_PTR; 132ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger ctx->blitter.saved_velem_state = INVALID_PTR; 13355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->blitter.saved_fb_state.nr_cbufs = ~0; 134f6106566081978f663cf08e54bb8908cb58a5316Michal Krol ctx->blitter.saved_num_sampler_views = ~0; 13555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->blitter.saved_num_sampler_states = ~0; 13664aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri ctx->blitter.saved_num_vertex_buffers = ~0; 13755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 13855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* blend state objects */ 1390c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul memset(&blend, 0, sizeof(blend)); 14055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->blend_keep_color = pipe->create_blend_state(pipe, &blend); 14155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 142eba1e2a44718bea398e49d496a78ee002c9922b8Roland Scheidegger blend.rt[0].colormask = PIPE_MASK_RGBA; 14355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->blend_write_color = pipe->create_blend_state(pipe, &blend); 14455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 14555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* depth stencil alpha state objects */ 1460c92dfe7f37059d9dfc523c6bf660c15c9f079f5Brian Paul memset(&dsa, 0, sizeof(dsa)); 14755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_keep_depth_stencil = 1481a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 14955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 1501a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.depth.enabled = 1; 1511a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.depth.writemask = 1; 1521a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.depth.func = PIPE_FUNC_ALWAYS; 15355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil = 1541a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 1551a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger 1561a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].enabled = 1; 1571a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].func = PIPE_FUNC_ALWAYS; 1581a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE; 1591a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE; 1601a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE; 1611a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].valuemask = 0xff; 1621a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger dsa.stencil[0].writemask = 0xff; 1631a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger ctx->dsa_write_depth_stencil = 1641a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 165a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 166a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 167a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger dsa.depth.enabled = 0; 168a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger dsa.depth.writemask = 0; 169a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger ctx->dsa_keep_depth_write_stencil = 170a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->create_depth_stencil_alpha_state(pipe, &dsa); 17155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 17255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* sampler state */ 17385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state = &ctx->template_sampler_state; 17485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 17585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 17685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 1772ee0d19ccf768c4c12c3c3476c1cd7eff508629aCorbin Simpson sampler_state->normalized_coords = TRUE; 17885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* The sampler state objects which sample from a specified mipmap level 17985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák * are created on-demand. */ 18055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 18155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* rasterizer state */ 18255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák memset(&rs_state, 0, sizeof(rs_state)); 1830bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell rs_state.cull_face = PIPE_FACE_NONE; 18455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák rs_state.gl_rasterization_rules = 1; 1851c75edf3e8ccc97f5f91f42f99c1f8db30b25fc4Corbin Simpson rs_state.flatshade = 1; 18655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->rs_state = pipe->create_rasterizer_state(pipe, &rs_state); 18755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 188ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger /* vertex elements state */ 189ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger memset(&velem[0], 0, sizeof(velem[0]) * 2); 190ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger for (i = 0; i < 2; i++) { 191ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].src_offset = i * 4 * sizeof(float); 192ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].instance_divisor = 0; 193ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].vertex_buffer_index = 0; 194ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 195ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger } 196ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger ctx->velem_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]); 197ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger 19885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* fragment shaders are created on-demand */ 19985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 20055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* vertex shaders */ 20155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák { 20255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const uint semantic_names[] = { TGSI_SEMANTIC_POSITION, 20355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák TGSI_SEMANTIC_COLOR }; 20455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const uint semantic_indices[] = { 0, 0 }; 20555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vs_col = 20655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák util_make_vertex_passthrough_shader(pipe, 2, semantic_names, 20755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák semantic_indices); 20855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 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 }; 21355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vs_tex = 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 */ 22355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vbuf = pipe_buffer_create(ctx->pipe->screen, 224287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_VERTEX_BUFFER, 22555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák sizeof(ctx->vertices)); 22655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 22755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák return &ctx->blitter; 22855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 22955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 23055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_destroy(struct blitter_context *blitter) 23155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 23255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 23355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct pipe_context *pipe = ctx->pipe; 23455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 23555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 23655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_blend_state(pipe, ctx->blend_write_color); 23755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_blend_state(pipe, ctx->blend_keep_color); 23855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 23955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_depth_stencil_alpha_state(pipe, 24055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil); 2411a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 242a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 2436a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson 24455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_rasterizer_state(pipe, ctx->rs_state); 24555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_vs_state(pipe, ctx->vs_col); 24655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->delete_vs_state(pipe, ctx->vs_tex); 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 256677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas for (i = 0; i <= PIPE_MAX_COLOR_BUFS && ctx->fs_col[i]; i++) 25785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->fs_col[i]) 25885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_fs_state(pipe, ctx->fs_col[i]); 25955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 260ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák for (i = 0; i < PIPE_MAX_TEXTURE_LEVELS; i++) 26185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (ctx->sampler_state[i]) 26285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->delete_sampler_state(pipe, ctx->sampler_state[i]); 263ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák 264f6106566081978f663cf08e54bb8908cb58a5316Michal Krol if (ctx->sampler_view) { 265f6106566081978f663cf08e54bb8908cb58a5316Michal Krol pipe_sampler_view_reference(&ctx->sampler_view, NULL); 266f6106566081978f663cf08e54bb8908cb58a5316Michal Krol } 267f6106566081978f663cf08e54bb8908cb58a5316Michal Krol 268287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&ctx->vbuf, NULL); 26955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák FREE(ctx); 27055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 27155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 27255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_check_saved_CSOs(struct blitter_context_priv *ctx) 27355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 27455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* make sure these CSOs have been saved */ 275a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák assert(ctx->blitter.saved_blend_state != INVALID_PTR && 276a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák ctx->blitter.saved_dsa_state != INVALID_PTR && 277a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák ctx->blitter.saved_rs_state != INVALID_PTR && 278a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák ctx->blitter.saved_fs != INVALID_PTR && 279ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger ctx->blitter.saved_vs != INVALID_PTR && 280ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger ctx->blitter.saved_velem_state != INVALID_PTR); 28155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 28255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 28355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_restore_CSOs(struct blitter_context_priv *ctx) 28455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 28555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct pipe_context *pipe = ctx->pipe; 28655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 28755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* restore the state objects which are always required to be saved */ 28855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blitter.saved_blend_state); 28955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->blitter.saved_dsa_state); 29055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->blitter.saved_rs_state); 29155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_fs_state(pipe, ctx->blitter.saved_fs); 29255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_vs_state(pipe, ctx->blitter.saved_vs); 293ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->blitter.saved_velem_state); 29455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 295a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák ctx->blitter.saved_blend_state = INVALID_PTR; 296a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák ctx->blitter.saved_dsa_state = INVALID_PTR; 297a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák ctx->blitter.saved_rs_state = INVALID_PTR; 298a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák ctx->blitter.saved_fs = INVALID_PTR; 299a6d91a141f9bb80444d11922998c348fb3cc7d98Marek Olšák ctx->blitter.saved_vs = INVALID_PTR; 300ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger ctx->blitter.saved_velem_state = INVALID_PTR; 30155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 302ed0f3b08b65679452132a9caeef1509a8dac23b9Roland Scheidegger pipe->set_stencil_ref(pipe, &ctx->blitter.saved_stencil_ref); 303ed0f3b08b65679452132a9caeef1509a8dac23b9Roland Scheidegger 304932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol pipe->set_viewport_state(pipe, &ctx->blitter.saved_viewport); 305932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol pipe->set_clip_state(pipe, &ctx->blitter.saved_clip); 306932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 30755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* restore the state objects which are required to be saved before copy/fill 30855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák */ 30955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák if (ctx->blitter.saved_fb_state.nr_cbufs != ~0) { 31055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->set_framebuffer_state(pipe, &ctx->blitter.saved_fb_state); 31155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->blitter.saved_fb_state.nr_cbufs = ~0; 31255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 31355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 31455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák if (ctx->blitter.saved_num_sampler_states != ~0) { 31555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_fragment_sampler_states(pipe, 31655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->blitter.saved_num_sampler_states, 31755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->blitter.saved_sampler_states); 31855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->blitter.saved_num_sampler_states = ~0; 31955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 32055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 321f6106566081978f663cf08e54bb8908cb58a5316Michal Krol if (ctx->blitter.saved_num_sampler_views != ~0) { 322f6106566081978f663cf08e54bb8908cb58a5316Michal Krol pipe->set_fragment_sampler_views(pipe, 323f6106566081978f663cf08e54bb8908cb58a5316Michal Krol ctx->blitter.saved_num_sampler_views, 324f6106566081978f663cf08e54bb8908cb58a5316Michal Krol ctx->blitter.saved_sampler_views); 325f6106566081978f663cf08e54bb8908cb58a5316Michal Krol ctx->blitter.saved_num_sampler_views = ~0; 32655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 32764aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri 32864aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri if (ctx->blitter.saved_num_vertex_buffers != ~0) { 32964aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri pipe->set_vertex_buffers(pipe, 33016d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->blitter.saved_num_vertex_buffers, 33116d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->blitter.saved_vertex_buffers); 33264aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri ctx->blitter.saved_num_vertex_buffers = ~0; 33364aa67a360ab09db1691b37b86178e008c4e3711Luca Barbieri } 33455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 33555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 33655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_rectangle(struct blitter_context_priv *ctx, 33755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 33855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x2, unsigned y2, 339932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol unsigned width, unsigned height, 34055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák float depth) 34155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 34255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 34355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 34455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set vertex positions */ 345932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->vertices[0][0][0] = (float)x1 / width * 2.0f - 1.0f; /*v0.x*/ 346932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->vertices[0][0][1] = (float)y1 / height * 2.0f - 1.0f; /*v0.y*/ 34755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 348932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->vertices[1][0][0] = (float)x2 / width * 2.0f - 1.0f; /*v1.x*/ 349932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->vertices[1][0][1] = (float)y1 / height * 2.0f - 1.0f; /*v1.y*/ 35055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 351932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->vertices[2][0][0] = (float)x2 / width * 2.0f - 1.0f; /*v2.x*/ 352932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->vertices[2][0][1] = (float)y2 / height * 2.0f - 1.0f; /*v2.y*/ 35355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 354932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->vertices[3][0][0] = (float)x1 / width * 2.0f - 1.0f; /*v3.x*/ 355932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->vertices[3][0][1] = (float)y2 / height * 2.0f - 1.0f; /*v3.y*/ 35655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 35755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 35855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][0][2] = depth; /*z*/ 359932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 360932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* viewport */ 361932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->viewport.scale[0] = 0.5f * width; 362932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->viewport.scale[1] = 0.5f * height; 363ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák ctx->viewport.scale[2] = 1.0f; 364932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->viewport.scale[3] = 1.0f; 365932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->viewport.translate[0] = 0.5f * width; 366932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->viewport.translate[1] = 0.5f * height; 367ff9ddf4d39be9e36d3e1dd9e10e889efa40dfb1eMarek Olšák ctx->viewport.translate[2] = 0.0f; 368932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->viewport.translate[3] = 0.0f; 369932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->pipe->set_viewport_state(ctx->pipe, &ctx->viewport); 370932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol 371932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol /* clip */ 372932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol ctx->pipe->set_clip_state(ctx->pipe, &ctx->clip); 37355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 37455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 37555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_clear_color(struct blitter_context_priv *ctx, 37655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const float *rgba) 37755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 37855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 37955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 380fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák if (rgba) { 38116d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák for (i = 0; i < 4; i++) { 38216d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][0] = rgba[0]; 38316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][1] = rgba[1]; 38416d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][2] = rgba[2]; 38516d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][3] = rgba[3]; 38616d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák } 387fa552261ea1795503d051864af6cdf05cb7197aeMarek Olšák } else { 38816d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák for (i = 0; i < 4; i++) { 38916d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][0] = 0; 39016d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][1] = 0; 39116d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][2] = 0; 39216d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák ctx->vertices[i][1][3] = 0; 39316d1fb30a91bde0f283a60ce07bf3b3477f1e5feMarek Olšák } 39455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 39555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 39655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 39755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_2d(struct blitter_context_priv *ctx, 398876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *src, 399876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_subresource subsrc, 40055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 40155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x2, unsigned y2) 40255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 40355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 404876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák float s1 = x1 / (float)u_minify(src->width0, subsrc.level); 405876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák float t1 = y1 / (float)u_minify(src->height0, subsrc.level); 406876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák float s2 = x2 / (float)u_minify(src->width0, subsrc.level); 407876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák float t2 = y2 / (float)u_minify(src->height0, subsrc.level); 40855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 40955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[0][1][0] = s1; /*t0.s*/ 41055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[0][1][1] = t1; /*t0.t*/ 41155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 41255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[1][1][0] = s2; /*t1.s*/ 41355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[1][1][1] = t1; /*t1.t*/ 41455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 41555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[2][1][0] = s2; /*t2.s*/ 41655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[2][1][1] = t2; /*t2.t*/ 41755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 41855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[3][1][0] = s1; /*t3.s*/ 41955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[3][1][1] = t2; /*t3.t*/ 42055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 42155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) { 42255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][1][2] = 0; /*r*/ 42355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][1][3] = 1; /*q*/ 42455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 42555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 42655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 42755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_3d(struct blitter_context_priv *ctx, 428876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *src, 429876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_subresource subsrc, 430876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned zslice, 43155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x1, unsigned y1, 43255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned x2, unsigned y2) 43355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 43455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 435876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák float r = zslice / (float)u_minify(src->depth0, subsrc.level); 43655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 437876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_set_texcoords_2d(ctx, src, subsrc, x1, y1, x2, y2); 43855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 43955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 44055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][1][2] = r; /*r*/ 44155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 44255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 44355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_set_texcoords_cube(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{ 44955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák int i; 450876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák float s1 = x1 / (float)u_minify(src->width0, subsrc.level); 451876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák float t1 = y1 / (float)u_minify(src->height0, subsrc.level); 452876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák float s2 = x2 / (float)u_minify(src->width0, subsrc.level); 453876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák float t2 = y2 / (float)u_minify(src->height0, subsrc.level); 454d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul float st[4][2]; 455d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul 456d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul st[0][0] = s1; 457d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul st[0][1] = t1; 458d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul st[1][0] = s2; 459d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul st[1][1] = t1; 460d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul st[2][0] = s2; 461d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul st[2][1] = t2; 462d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul st[3][0] = s1; 463d6b4655e13a5f3507180d5f7674c870faff2d24dBrian Paul st[3][1] = t2; 46455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 465876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák util_map_texcoords2d_onto_cubemap(subsrc.face, 46655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* pointer, stride in floats */ 46755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák &st[0][0], 2, 46855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák &ctx->vertices[0][1][0], 8); 46955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 47055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák for (i = 0; i < 4; i++) 47155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->vertices[i][1][3] = 1; /*q*/ 47255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 47355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 47455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákstatic void blitter_draw_quad(struct blitter_context_priv *ctx) 47555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 47655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct pipe_context *pipe = ctx->pipe; 47755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 47880e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák /* write vertices and draw them */ 479287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_buffer_write(pipe, ctx->vbuf, 48080e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák 0, sizeof(ctx->vertices), ctx->vertices); 48155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 48280e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák util_draw_vertex_buffer(pipe, ctx->vbuf, 0, PIPE_PRIM_TRIANGLE_FAN, 48380e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák 4, /* verts */ 48480e815639459367313cb0c2e5e32d978ed9fcd08Marek Olšák 2); /* attribs/vert */ 48555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 48655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 48785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 48885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid **blitter_get_sampler_state(struct blitter_context_priv *ctx, 48985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák int miplevel) 49085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 49185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák struct pipe_context *pipe = ctx->pipe; 49285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák struct pipe_sampler_state *sampler_state = &ctx->template_sampler_state; 49385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 49485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(miplevel < PIPE_MAX_TEXTURE_LEVELS); 49585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 49685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Create the sampler state on-demand. */ 49785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (!ctx->sampler_state[miplevel]) { 49885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->lod_bias = miplevel; 49985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->min_lod = miplevel; 50085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state->max_lod = miplevel; 50185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 50285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák ctx->sampler_state[miplevel] = pipe->create_sampler_state(pipe, 50385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák sampler_state); 50485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák } 50585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 50685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Return void** so that it can be passed to bind_fragment_sampler_states 50785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák * directly. */ 50885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák return &ctx->sampler_state[miplevel]; 50985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 51085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 51185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 51285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_col(struct blitter_context_priv *ctx, unsigned num_cbufs) 51385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 51485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák struct pipe_context *pipe = ctx->pipe; 51585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 51685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(num_cbufs <= PIPE_MAX_COLOR_BUFS); 51785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 518677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas if (!ctx->fs_col[num_cbufs]) 519677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas ctx->fs_col[num_cbufs] = 52085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák util_make_fragment_clonecolor_shader(pipe, num_cbufs); 52185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 522677a60455673bd9aff4bebae8416a54cd326ca37Wiktor Janas return ctx->fs_col[num_cbufs]; 52385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 52485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 52585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 52685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_col(struct blitter_context_priv *ctx, 52785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák unsigned tex_target) 52885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 52985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák struct pipe_context *pipe = ctx->pipe; 53085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 53185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(tex_target < PIPE_MAX_TEXTURE_TYPES); 53285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 53385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Create the fragment shader on-demand. */ 53485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (!ctx->fs_texfetch_col[tex_target]) { 53585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák switch (tex_target) { 53685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák case PIPE_TEXTURE_2D: 53785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák ctx->fs_texfetch_col[PIPE_TEXTURE_2D] = 53885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák util_make_fragment_tex_shader(pipe, TGSI_TEXTURE_2D); 53985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák break; 54085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák case PIPE_TEXTURE_3D: 54185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák ctx->fs_texfetch_col[PIPE_TEXTURE_3D] = 54285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák util_make_fragment_tex_shader(pipe, TGSI_TEXTURE_3D); 54385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák break; 54485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák case PIPE_TEXTURE_CUBE: 54585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák ctx->fs_texfetch_col[PIPE_TEXTURE_CUBE] = 54685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák util_make_fragment_tex_shader(pipe, TGSI_TEXTURE_CUBE); 54785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák break; 548876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák case PIPE_TEXTURE_1D: 549876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák default: 550876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák ctx->fs_texfetch_col[PIPE_TEXTURE_1D] = 551876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák util_make_fragment_tex_shader(pipe, TGSI_TEXTURE_1D); 552876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák tex_target = PIPE_TEXTURE_1D; /* for the default case */ 55385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák } 55485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák } 55585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 55685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák return ctx->fs_texfetch_col[tex_target]; 55785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 55885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 55985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákstatic INLINE 56085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšákvoid *blitter_get_fs_texfetch_depth(struct blitter_context_priv *ctx, 56185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák unsigned tex_target) 56285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák{ 56385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák struct pipe_context *pipe = ctx->pipe; 56485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 56585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák assert(tex_target < PIPE_MAX_TEXTURE_TYPES); 56685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 56785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák /* Create the fragment shader on-demand. */ 56885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák if (!ctx->fs_texfetch_depth[tex_target]) { 56985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák switch (tex_target) { 57085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák case PIPE_TEXTURE_2D: 57185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák ctx->fs_texfetch_depth[PIPE_TEXTURE_2D] = 57285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák util_make_fragment_tex_shader_writedepth(pipe, TGSI_TEXTURE_2D); 57385bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák break; 57485bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák case PIPE_TEXTURE_3D: 57585bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák ctx->fs_texfetch_depth[PIPE_TEXTURE_3D] = 57685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák util_make_fragment_tex_shader_writedepth(pipe, TGSI_TEXTURE_3D); 57785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák break; 57885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák case PIPE_TEXTURE_CUBE: 57985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák ctx->fs_texfetch_depth[PIPE_TEXTURE_CUBE] = 58085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák util_make_fragment_tex_shader_writedepth(pipe,TGSI_TEXTURE_CUBE); 58185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák break; 582876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák case PIPE_TEXTURE_1D: 583876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák default: 584876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák ctx->fs_texfetch_depth[PIPE_TEXTURE_1D] = 585876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák util_make_fragment_tex_shader_writedepth(pipe, TGSI_TEXTURE_1D); 586876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák tex_target = PIPE_TEXTURE_1D; /* for the default case */ 58785bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák } 58885bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák } 58985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 59085bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák return ctx->fs_texfetch_depth[tex_target]; 59185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák} 59285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 59355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšákvoid util_blitter_clear(struct blitter_context *blitter, 59455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned width, unsigned height, 59555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned num_cbufs, 59655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák unsigned clear_buffers, 59755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák const float *rgba, 59855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák double depth, unsigned stencil) 59955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 60055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 60155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct pipe_context *pipe = ctx->pipe; 6026a07a1738ce84a747ce1f51cf68d583d0ccb3bd5Corbin Simpson struct pipe_stencil_ref sr = { { 0 } }; 60355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 604ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák assert(num_cbufs <= PIPE_MAX_COLOR_BUFS); 60555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 60655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_check_saved_CSOs(ctx); 60755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 60855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* bind CSOs */ 60955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák if (clear_buffers & PIPE_CLEAR_COLOR) 61055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 61155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák else 61255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_keep_color); 61355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 614a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if ((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) { 6151a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger sr.ref_value[0] = stencil & 0xff; 6161a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 6171a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger pipe->set_stencil_ref(pipe, &sr); 6181a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger } 619a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else if (clear_buffers & PIPE_CLEAR_DEPTH) { 620a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil); 621a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 622a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else if (clear_buffers & PIPE_CLEAR_STENCIL) { 623a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger sr.ref_value[0] = stencil & 0xff; 624a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 625a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_stencil_ref(pipe, &sr); 626a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 62755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák else 62855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 62955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 63055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 631ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 63285bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, num_cbufs)); 63355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_vs_state(pipe, ctx->vs_col); 63455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 63555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_set_clear_color(ctx, rgba); 636932e6f8d527d2147ecc4e75ce9ae2f71e23e61afMichal Krol blitter_set_rectangle(ctx, 0, 0, width, height, width, height, depth); 63755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_draw_quad(ctx); 63855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_restore_CSOs(ctx); 63955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 64055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 641876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákstatic 642876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákboolean is_overlap(unsigned sx1, unsigned sx2, unsigned sy1, unsigned sy2, 643876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned dx1, unsigned dx2, unsigned dy1, unsigned dy2) 644deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie{ 645876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return sx1 < dx2 && sx2 > dx1 && sy1 < dy2 && sy2 > dy1; 646deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie} 647deaa634e023cc3f62dfc3365b4f1894a200535ddDave Airlie 648876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšákvoid util_blitter_copy_region(struct blitter_context *blitter, 649876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *dst, 650876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_subresource subdst, 651876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned dstx, unsigned dsty, unsigned dstz, 652876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_resource *src, 653876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_subresource subsrc, 654876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned srcx, unsigned srcy, unsigned srcz, 655876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned width, unsigned height, 656876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák boolean ignore_stencil) 65755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 65855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 65955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct pipe_context *pipe = ctx->pipe; 660876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_screen *screen = pipe->screen; 661876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák struct pipe_surface *dstsurf; 66255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct pipe_framebuffer_state fb_state; 663f6106566081978f663cf08e54bb8908cb58a5316Michal Krol struct pipe_sampler_view viewTempl, *view; 664876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák unsigned bind; 665876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák boolean is_stencil, is_depth; 666876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 667876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Give up if textures are not set. */ 668876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák assert(dst && src); 669876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák if (!dst || !src) 670876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return; 671876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 672876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Sanity checks. */ 673876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák if (dst == src) { 674876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák assert(!is_overlap(srcx, srcx + width, srcy, srcy + height, 675876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák dstx, dstx + width, dsty, dsty + height)); 676876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák } else { 677876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák assert(dst->format == src->format); 678876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák } 679876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák assert(src->target < PIPE_MAX_TEXTURE_TYPES); 680876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 681876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Is this a ZS format? */ 682876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák is_depth = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 0) != 0; 683876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák is_stencil = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 1) != 0; 684876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 685876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák if (is_depth || is_stencil) 686876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák bind = PIPE_BIND_DEPTH_STENCIL; 687876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák else 688876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák bind = PIPE_BIND_RENDER_TARGET; 689876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 690876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Check if we can sample from and render to the surfaces. */ 691876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* (assuming copying a stencil buffer is not possible) */ 692876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák if ((!ignore_stencil && is_stencil) || 693876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák !screen->is_format_supported(screen, dst->format, dst->target, 694876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák dst->nr_samples, bind, 0) || 695876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák !screen->is_format_supported(screen, src->format, src->target, 696876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák src->nr_samples, PIPE_BIND_SAMPLER_VIEW, 0)) { 697876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák util_resource_copy_region(pipe, dst, subdst, dstx, dsty, dstz, 698876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák src, subsrc, srcx, srcy, srcz, width, height); 699876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return; 700876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák } 701876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 702876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Get surfaces. */ 703876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák dstsurf = screen->get_tex_surface(screen, dst, 704876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák subdst.face, subdst.level, dstz, 705876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák bind); 70655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 707876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Check whether the states are properly saved. */ 708876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_check_saved_CSOs(ctx); 70955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák assert(blitter->saved_fb_state.nr_cbufs != ~0); 710f6106566081978f663cf08e54bb8908cb58a5316Michal Krol assert(blitter->saved_num_sampler_views != ~0); 71155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák assert(blitter->saved_num_sampler_states != ~0); 71255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 713876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Initialize framebuffer state. */ 714876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák fb_state.width = dstsurf->width; 715876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák fb_state.height = dstsurf->height; 71655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 71755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák if (is_depth) { 71855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_keep_color); 71955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, 72055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák ctx->dsa_write_depth_keep_stencil); 72185bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, 722876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_get_fs_texfetch_depth(ctx, src->target)); 72355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 72455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 0; 725876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák fb_state.zsbuf = dstsurf; 72655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } else { 72755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 72855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 72985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, 730876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_get_fs_texfetch_col(ctx, src->target)); 73155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 73255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 1; 733876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák fb_state.cbufs[0] = dstsurf; 73455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.zsbuf = 0; 73555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 73685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák 737876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Initialize sampler view. */ 738876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák u_sampler_view_default_template(&viewTempl, src, src->format); 739876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák view = pipe->create_sampler_view(pipe, src, &viewTempl); 740f6106566081978f663cf08e54bb8908cb58a5316Michal Krol 741f6106566081978f663cf08e54bb8908cb58a5316Michal Krol if (ctx->sampler_view) { 742f6106566081978f663cf08e54bb8908cb58a5316Michal Krol pipe_sampler_view_reference(&ctx->sampler_view, NULL); 743f6106566081978f663cf08e54bb8908cb58a5316Michal Krol } 744f6106566081978f663cf08e54bb8908cb58a5316Michal Krol ctx->sampler_view = view; 745f6106566081978f663cf08e54bb8908cb58a5316Michal Krol 746876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Set rasterizer state, shaders, and textures. */ 74755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 74855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_vs_state(pipe, ctx->vs_tex); 74985bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fragment_sampler_states(pipe, 1, 750876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_get_sampler_state(ctx, subsrc.level)); 751ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 752f6106566081978f663cf08e54bb8908cb58a5316Michal Krol pipe->set_fragment_sampler_views(pipe, 1, &view); 75355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 75455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 755876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák /* Set texture coordinates. */ 756876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák switch (src->target) { 75755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák case PIPE_TEXTURE_1D: 75855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák case PIPE_TEXTURE_2D: 759876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_set_texcoords_2d(ctx, src, subsrc, 760876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák srcx, srcy, srcx+width, srcy+height); 76155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák break; 76255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák case PIPE_TEXTURE_3D: 763876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_set_texcoords_3d(ctx, src, subsrc, srcz, 764876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák srcx, srcy, srcx+width, srcy+height); 76555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák break; 76655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák case PIPE_TEXTURE_CUBE: 767876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_set_texcoords_cube(ctx, src, subsrc, 768876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák srcx, srcy, srcx+width, srcy+height); 76955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák break; 770ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák default: 771ab85ba30e2ed3c5e8bd289eab2f66b997e3489a9Marek Olšák assert(0); 772876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák return; 77355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák } 77455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 775876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák blitter_set_rectangle(ctx, dstx, dsty, dstx+width, dsty+height, 776876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák dstsurf->width, dstsurf->height, 0); 77755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_draw_quad(ctx); 77855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_restore_CSOs(ctx); 779876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák 780876de34c91f02edb3260ac34b43e96dfb5c5b9c4Marek Olšák pipe_surface_reference(&dstsurf, NULL); 78155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 78255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 783a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a color surface to a constant value. */ 784a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_render_target(struct blitter_context *blitter, 785a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger struct pipe_surface *dstsurf, 786a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger const float *rgba, 787a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned dstx, unsigned dsty, 788a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned width, unsigned height) 78955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák{ 79055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 79155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct pipe_context *pipe = ctx->pipe; 79255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák struct pipe_framebuffer_state fb_state; 79355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 794a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger assert(dstsurf->texture); 795a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if (!dstsurf->texture) 79655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák return; 79755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 79855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* check the saved state */ 79955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_check_saved_CSOs(ctx); 80055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák assert(blitter->saved_fb_state.nr_cbufs != ~0); 80155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 80255753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* bind CSOs */ 80355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_blend_state(pipe, ctx->blend_write_color); 80455753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 80555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_rasterizer_state(pipe, ctx->rs_state); 80685bf420a78483cf62ebab59af13a7c5a320a4703Marek Olšák pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1)); 80755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->bind_vs_state(pipe, ctx->vs_col); 808ac4abaecd5f52e416c89bfe19b34ed7f4e014b21Roland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 80955753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 81055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák /* set a framebuffer state */ 81159e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.width = dstsurf->width; 81259e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.height = dstsurf->height; 81355753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.nr_cbufs = 1; 81459e51d9640c242a7c919472d935a91889c7840c9Marek Olšák fb_state.cbufs[0] = dstsurf; 81555753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák fb_state.zsbuf = 0; 81655753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák pipe->set_framebuffer_state(pipe, &fb_state); 81755753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák 81855753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_set_clear_color(ctx, rgba); 81959e51d9640c242a7c919472d935a91889c7840c9Marek Olšák blitter_set_rectangle(ctx, 0, 0, width, height, dstsurf->width, dstsurf->height, 0); 82055753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_draw_quad(ctx); 82155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák blitter_restore_CSOs(ctx); 822a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger} 82359e51d9640c242a7c919472d935a91889c7840c9Marek Olšák 824a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger/* Clear a region of a depth stencil surface. */ 825a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggervoid util_blitter_clear_depth_stencil(struct blitter_context *blitter, 826a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger struct pipe_surface *dstsurf, 827a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned clear_flags, 828a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger double depth, 829a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned stencil, 830a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned dstx, unsigned dsty, 831a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger unsigned width, unsigned height) 832a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger{ 833a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 834a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct pipe_context *pipe = ctx->pipe; 835a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct pipe_framebuffer_state fb_state; 836a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger struct pipe_stencil_ref sr = { { 0 } }; 837a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 838a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger assert(dstsurf->texture); 839a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if (!dstsurf->texture) 840a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger return; 841a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 842a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* check the saved state */ 843a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger blitter_check_saved_CSOs(ctx); 844a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger assert(blitter->saved_fb_state.nr_cbufs != ~0); 845a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 846a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* bind CSOs */ 847a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_blend_state(pipe, ctx->blend_keep_color); 848a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger if ((clear_flags & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) { 849a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger sr.ref_value[0] = stencil & 0xff; 850a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 851a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_stencil_ref(pipe, &sr); 852a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 853a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else if (clear_flags & PIPE_CLEAR_DEPTH) { 854a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil); 855a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 856a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else if (clear_flags & PIPE_CLEAR_STENCIL) { 857a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger sr.ref_value[0] = stencil & 0xff; 858a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 859a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_stencil_ref(pipe, &sr); 860a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger } 861a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger else 862a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* hmm that should be illegal probably, or make it a no-op somewhere */ 863a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 864a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 865a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_rasterizer_state(pipe, ctx->rs_state); 866a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0)); 867a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_vs_state(pipe, ctx->vs_col); 868a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 869a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 870a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger /* set a framebuffer state */ 871a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.width = dstsurf->width; 872a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.height = dstsurf->height; 873a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.nr_cbufs = 0; 874a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.cbufs[0] = 0; 875a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger fb_state.zsbuf = dstsurf; 876a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger pipe->set_framebuffer_state(pipe, &fb_state); 877a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger 878a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger blitter_set_rectangle(ctx, 0, 0, width, height, dstsurf->width, dstsurf->height, depth); 879a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger blitter_draw_quad(ctx); 880a1d5131d2eaa5f5ccc8b38f9379f9c6bc989bc1aRoland Scheidegger blitter_restore_CSOs(ctx); 88155753f59ae1754738bed4b0cb6546db65891f53fMarek Olšák} 882